Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用DataFramesMeta包中的@linq整理Julia中的数据_Dataframe_Linq_Julia_Dataframesmeta.jl - Fatal编程技术网

使用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代码中发表了评论。