使用DataFramesMeta包中的@linq整理Julia中的数据
我想使用使用DataFramesMeta包中的@linq整理Julia中的数据,dataframe,linq,julia,dataframesmeta.jl,Dataframe,Linq,Julia,Dataframesmeta.jl,我想使用DataFramesMeta包中的@linq宏整理数据 结果应与以下代码给出的结果相同: using CSV, DataFrames, Dates url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv" do
DataFramesMeta
包中的@linq
宏整理数据
结果应与以下代码给出的结果相同:
using CSV, DataFrames, Dates
url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"
download(url, joinpath(pwd(), "confirmed.csv"))
df = CSV.read(joinpath(pwd(), "confirmed.csv"))
rename!(df, 1 => :Province, 2 => :Country)
select!(df, Not([:Province, :Lat, :Long]))
df = combine(groupby(df, :Country), names(df)[2:end] .=> sum .=> names(df)[2:end])
df = stack(df, Not(:Country), :Country, variable_name=:Date, value_name=:Confirmed)
df[:Date] = parse.(Dates.Date, String.(df[:Date]), Dates.DateFormat("m/d/Y")) .+ Dates.Year(2000)
println(last(df, 10))
结果:
10×3 DataFrame
│ Row │ Country │ Date │ Confirmed │
│ │ String │ Date │ Int64 │
├─────┼────────────────────┼────────────┼───────────┤
│ 1 │ United Kingdom │ 2020-10-29 │ 968456 │
│ 2 │ Uruguay │ 2020-10-29 │ 3044 │
│ 3 │ Uzbekistan │ 2020-10-29 │ 66392 │
│ 4 │ Venezuela │ 2020-10-29 │ 91280 │
│ 5 │ Vietnam │ 2020-10-29 │ 1177 │
│ 6 │ West Bank and Gaza │ 2020-10-29 │ 52571 │
│ 7 │ Western Sahara │ 2020-10-29 │ 10 │
│ 8 │ Yemen │ 2020-10-29 │ 2062 │
│ 9 │ Zambia │ 2020-10-29 │ 16325 │
│ 10 │ Zimbabwe │ 2020-10-29 │ 8349 │
到目前为止,我使用@linq
的代码是:
using DataFramesMeta
df = @linq CSV.read(joinpath(pwd(), "data", "time_series_covid19_confirmed_global.csv")) |>
rename(1 => :Province, 2 => :Country) |>
select(vcat(names(df)[2], names(df)[5:end]))
然而,我仍停留在对数据进行分组和总结的阶段。
关于如何完成这个
linq
查询,有什么建议吗?DataFramesMeta.jl现在正在进行重大的重构。也许@pdeffebach可以建议使用master上的功能惯用it
下面是我将如何使用raw DataFrames.jl和Pipe.jl重写您的代码:
df = CSV.read(joinpath(pwd(), "confirmed.csv"), DataFrame)
@pipe df |>
rename(_, 1 => :Province, 2 => :Country) |> # avoid ! to make sure we do not mutate the source
select!(_, Not([:Province, :Lat, :Long])) |>
groupby(_, :Country) |>
combine(_, valuecols(_) .=> sum .=> valuecols(_)) |>
stack(_, Not(:Country), :Country, variable_name=:Date, value_name=:Confirmed) |>
transform!(_, :Date => ByRow(x -> parse(Date, string(x), DateFormat("m/d/Y")) + Year(2000)) => :Date) |>
last(_, 10)
请注意,在代码中:
(添加CSV.read(joinpath(pwd(),“confirated.CSV”)
作为第二个参数,如我的代码中所示)DataFrame
应该是df[:Date]
或df.Date
(第二种样式是在名称包含空格的情况下)df.Date”
已弃用。仅在此基础上,DataFramesMeta还不能轻松处理以编程方式定义的列集合,即通过
not
或valuecols
。对于这种操作,最好坚持使用普通数据帧,而不要使用@linq
@这里的烟斗够好的了。如果您不喜欢使用。
也可以尝试Hose.jl,它允许您选择省略第一个参数。谢谢您的回答。折旧项目的正确代码是什么?我想选择!和转变!应该没有爆炸,对吗?select代码>和转换代码>应与一起使用代码>因为它们在处理管道中,所以最好执行就地操作,因为这样速度更快。我在anwer的poper代码中发表了评论。