微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用DataFramesMeta包中的@linq在Julia中整理数据

如何解决使用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.Datedf."Date"(第二种样式是在名称包含例如空格的情况下)

已弃用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。