在 Julia 中从 .csv 文件中提取数据

Rob*_*bin 4 dataframe pandas julia dataframes.jl

我对 Julia 很陌生,我有一个 .csv 文件,该文件存储在 gzip 中,我想从中提取一些信息以用于教育目的并更好地了解该语言。

在Python中,Panda有许多有用的函数可以帮助解决这个问题,但我似乎无法直接解决问题......

这是我的代码(我知道,非常弱!!!):

{
import Pkg 
#Pkg.add("CSV")
#Pkg.add("DataFrames")
#Pkg.add("CSVFiles")
#Pkg.add("CodecZlib")
#Pkg.add("GZip")
using CSVFiles
using Pkg
using CSV
using DataFrames
using CodecZlib
using GZip


df = CSV.read("Path//to//file//file.csv.gzip", DataFrame)

print(df)
}
Run Code Online (Sandbox Code Playgroud)

我添加了一个屏幕来显示 .csv 文件内的列的外观。 在此输入图像描述 我想提取日期并制作评论最多的前 10 位用户、线程最多的前 10 天等。

我想指出的是,这不是给我的练习,而是我想自己进行的训练。 4.

我知道熊猫版本是这样的:

df['threadcreateddate'] = pd.to_datetine(df['thread_created_utc']).dt.date
Run Code Online (Sandbox Code Playgroud)

或者

df['commentcreateddate'] = pd.to_datetime(df['comment_created_utc']).dt.date
Run Code Online (Sandbox Code Playgroud)

并对其进行排序:

pf_number_of_threads = df.groupby('threadcreateddate')["thread_id'].nunique()
Run Code Online (Sandbox Code Playgroud)

如果我要绘制它:

df_number_of_threads.plot(kind='line')
plt.show()
Run Code Online (Sandbox Code Playgroud)

打印:

head = df.head()
print(df_number_of_threads.sort_values(ascending=False).head(10))
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?df.select() 函数对我不起作用。

sun*_*ica 5

1. 套餐

\n

我们显然需要 DataFrames.jl。由于我们正在处理数据中的日期,并稍后绘制图表,因此我们还将包含DatesPlots

\n

正如CSV.jl 文档中的示例所示,gzip 压缩数据不需要额外的包。CSV.jl可以自动解压。using因此,您可以从列表中删除其他语句。

\n
julia> using CSV, DataFrames, Dates, Plots\n
Run Code Online (Sandbox Code Playgroud)\n

2. 准备数据框

\n

您可以使用CSV.read将数据加载到数据框中,如问题中所示。在这里,我将使用一些示例(简化的)数据进行说明,其中只有 4 列:

\n
julia> df\n6\xc3\x974 DataFrame\n Row \xe2\x94\x82 thread_id  thread_created_utc   comment_id  comment_created_utc \n     \xe2\x94\x82 Int64      String               Int64       String              \n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82         1  2022-08-13T12:00:00           1  2022-08-13T12:00:00\n   2 \xe2\x94\x82         1  2022-08-13T12:00:00           2  2022-08-14T12:00:00\n   3 \xe2\x94\x82         1  2022-08-13T12:00:00           3  2022-08-15T12:00:00\n   4 \xe2\x94\x82         2  2022-08-16T12:00:00           4  2022-08-16T12:00:00\n   5 \xe2\x94\x82         2  2022-08-16T12:00:00           5  2022-08-17T12:00:00\n   6 \xe2\x94\x82         2  2022-08-16T12:00:00           6  2022-08-18T12:00:00\n
Run Code Online (Sandbox Code Playgroud)\n

3.从字符串转换为日期时间

\n

为了从我们拥有的字符串列中提取线程日期,我们将使用Dates标准库。

\n

根据日期的具体格式,您可能需要添加一个datefmt参数以转换为Dates数据类型(请参阅Julia 手册中的构造函数部分)。Dates在示例数据中,日期采用 ISO 标准格式,因此我们不需要显式指定日期格式。

\n

在 Julia 中,我们可以直接获取日期,而无需中间转换为日期时间类型,但由于无论如何让列采用正确的类型是个好主意,因此我们首先将现有列从字符串转换为DateTime

\n
julia> transform!(df, [:thread_created_utc, :comment_created_utc] .=> ByRow(DateTime), renamecols = false)\n6\xc3\x974 DataFrame\n Row \xe2\x94\x82 thread_id  thread_created_utc   comment_id  comment_created_utc \n     \xe2\x94\x82 Int64      DateTime             Int64       DateTime            \n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82         1  2022-08-13T12:00:00           1  2022-08-13T12:00:00\n   2 \xe2\x94\x82         1  2022-08-13T12:00:00           2  2022-08-14T12:00:00\n   3 \xe2\x94\x82         1  2022-08-13T12:00:00           3  2022-08-15T12:00:00\n   4 \xe2\x94\x82         2  2022-08-16T12:00:00           4  2022-08-16T12:00:00\n   5 \xe2\x94\x82         2  2022-08-16T12:00:00           5  2022-08-17T12:00:00\n   6 \xe2\x94\x82         2  2022-08-16T12:00:00           6  2022-08-18T12:00:00\n
Run Code Online (Sandbox Code Playgroud)\n

尽管看起来很相似,但此数据框不使用Strings 作为日期时间列,而是具有正确的DateTime类型值。\n(有关其工作原理的说明transform!,请参阅DataFrames 手册:选择和转换列。)

\n

编辑:根据现在添加到问题中的屏幕截图,在您的情况下,您将使用transform!(df, [:thread_created_utc, :comment_created_utc] .=> ByRow(s -> DateTime(s, dateformat"yyyy-mm-dd HH:MM:SS.s")), renamecols = false).

\n

4. 创建日期列

\n

现在,创建日期列非常简单:

\n
julia> df.threadcreateddate = Date.(df.thread_created_utc);\n\njulia> df.commentcreateddate = Date.(df.comment_created_utc);\n\njulia> df\n6\xc3\x976 DataFrame\n Row \xe2\x94\x82 thread_id  thread_created_utc   comment_id  comment_created_utc  commentcreateddate  threadcreatedate \n     \xe2\x94\x82 Int64      DateTime             Int64       DateTime             Date                Date             \n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82         1  2022-08-13T12:00:00           1  2022-08-13T12:00:00  2022-08-13          2022-08-13\n   2 \xe2\x94\x82         1  2022-08-13T12:00:00           2  2022-08-14T12:00:00  2022-08-14          2022-08-13\n   3 \xe2\x94\x82         1  2022-08-13T12:00:00           3  2022-08-15T12:00:00  2022-08-15          2022-08-13\n   4 \xe2\x94\x82         2  2022-08-16T12:00:00           4  2022-08-16T12:00:00  2022-08-16          2022-08-16\n   5 \xe2\x94\x82         2  2022-08-16T12:00:00           5  2022-08-17T12:00:00  2022-08-17          2022-08-16\n   6 \xe2\x94\x82         2  2022-08-16T12:00:00           6  2022-08-18T12:00:00  2022-08-18          2022-08-16\n
Run Code Online (Sandbox Code Playgroud)\n

这些也可以写为调用transform!,实际上transform!前面代码段中的调用可以替换为df.thread_created_utc = DateTime.(df.thread_created_utc)and df.comment_created_utc = DateTime.(df.comment_created_utc)。但是,transform它提供了非常强大且灵活的语法,可以做更多事情,因此如果您要使用 DataFrame,熟悉它会很有用。

\n

5. 获取每天的线程数

\n
julia> gdf = combine(groupby(df, :threadcreateddate), :thread_id => length \xe2\x88\x98 unique => :number_of_threads)\n2\xc3\x972 DataFrame\n Row \xe2\x94\x82 threadcreateddate  number_of_threads \n     \xe2\x94\x82 Date               Int64             \n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 2022-08-13                         1\n   2 \xe2\x94\x82 2022-08-16                         1\n
Run Code Online (Sandbox Code Playgroud)\n

请注意df.groupby(\'threadcreateddate\')groupby(df, :threadcreateddate)has 是 Python 到 Julia 转换中的常见模式。Julia 不使用.基于面向对象的语法,而是将数据框作为函数的参数之一。

\n

length \xe2\x88\x98 unique使用函数复合运算符,结果是应用和 then 的\xe2\x88\x98函数。在这里,我们获取每个组中列的值,应用于它们(因此,相当于),并将结果存储在名为 的新列中。uniquelengthuniquethread_idlengthnuniquenumber_of_threadsGroupedDataFramegdf

\n

6. 绘图

\n
julia> plot(gdf.threadcreateddate, gdf.number_of_threads)\n
Run Code Online (Sandbox Code Playgroud)\n

由于我们的分组数据框方便地包含日期和线程数,因此我们可以根据日期绘制 number_of_threads ,从而实现良好且信息丰富的可视化。

\n