如何解决使用DataFramesMeta包中的@linq在Julia中整理数据
我想使用@linq
软件包中的DataFramesMeta
宏来整理数据。
结果应与以下代码具有相同的结果:
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上的功能来建议惯用。
这是我如何使用原始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(),"confirmed.csv"))
(像我的代码一样添加DataFrame
作为第二个参数) -
df[:Date]
应该为df.Date
或df."Date"
(第二种样式是在名称包含例如空格的情况下)
已弃用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。