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() 函数对我不起作用。
我们显然需要 DataFrames.jl。由于我们正在处理数据中的日期,并稍后绘制图表,因此我们还将包含Dates和Plots。
正如CSV.jl 文档中的示例所示,gzip 压缩数据不需要额外的包。CSV.jl可以自动解压。using因此,您可以从列表中删除其他语句。
julia> using CSV, DataFrames, Dates, Plots\nRun Code Online (Sandbox Code Playgroud)\n您可以使用CSV.read将数据加载到数据框中,如问题中所示。在这里,我将使用一些示例(简化的)数据进行说明,其中只有 4 列:
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\nRun Code Online (Sandbox Code Playgroud)\n为了从我们拥有的字符串列中提取线程日期,我们将使用Dates标准库。
根据日期的具体格式,您可能需要添加一个datefmt参数以转换为Dates数据类型(请参阅Julia 手册中的构造函数部分)。Dates在示例数据中,日期采用 ISO 标准格式,因此我们不需要显式指定日期格式。
在 Julia 中,我们可以直接获取日期,而无需中间转换为日期时间类型,但由于无论如何让列采用正确的类型是个好主意,因此我们首先将现有列从字符串转换为DateTime:
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\nRun Code Online (Sandbox Code Playgroud)\n尽管看起来很相似,但此数据框不使用Strings 作为日期时间列,而是具有正确的DateTime类型值。\n(有关其工作原理的说明transform!,请参阅DataFrames 手册:选择和转换列。)
编辑:根据现在添加到问题中的屏幕截图,在您的情况下,您将使用transform!(df, [:thread_created_utc, :comment_created_utc] .=> ByRow(s -> DateTime(s, dateformat"yyyy-mm-dd HH:MM:SS.s")), renamecols = false).
现在,创建日期列非常简单:
\njulia> 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\nRun 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,熟悉它会很有用。
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\nRun Code Online (Sandbox Code Playgroud)\n请注意df.groupby(\'threadcreateddate\'),groupby(df, :threadcreateddate)has 是 Python 到 Julia 转换中的常见模式。Julia 不使用.基于面向对象的语法,而是将数据框作为函数的参数之一。
length \xe2\x88\x98 unique使用函数复合运算符,结果是应用和 then 的\xe2\x88\x98函数。在这里,我们获取每个组中列的值,应用于它们(因此,相当于),并将结果存储在名为 的新列中。uniquelengthuniquethread_idlengthnuniquenumber_of_threadsGroupedDataFramegdf
julia> plot(gdf.threadcreateddate, gdf.number_of_threads)\nRun Code Online (Sandbox Code Playgroud)\n由于我们的分组数据框方便地包含日期和线程数,因此我们可以根据日期绘制 number_of_threads ,从而实现良好且信息丰富的可视化。
\n