【问题标题】:Julia - looping through a dataframe and performing conditional operationJulia - 遍历数据框并执行条件操作
【发布时间】:2021-09-03 00:17:04
【问题描述】:

找不到任何类似的东西,对 Julia 来说是新的。

尝试看看这是否可以在单个进程中完成,或者应该拆分,或者其他我没有想到的东西。 基本上如下面的 df 所示 - 试图看看我如何向这个 df 添加一个条件逻辑列,锚定在 Year 列上(为 int64 道歉 - 实际数据实际上是 Date df 格式)。

具体来说,为样本添加尾随 2 年列的最佳方法是什么(在显示整体增长正在进行的列旁边 - 在示例 df 中,它是 ProValue 列),类似于:
“ProValue2YrTrailing = cumprod(:Growth .+1) 当年数为每组指定 2 时”

无法弄清楚如何在这里使用@linq 和 Dataframes 通过转换创建条件列。

using DataFramesMeta
df = DataFrame(region  = ["US","US","US","US","US","EU","EU","EU","EU","EU"],
             product =          
   ["apple","apple","apple","banana","banana","apple","apple","banana","banana","banana"],
             year    = [2009,2010,2011,2010,2011,2010,2011,2009,2010,2011],
             Growth   = [0.13,0.23,0.05,0.22,0.28,0.24,0.23,0.03,0.17,0.18])
df = @linq df |>
groupby([:region,:product]) |>
transform(ProValue = cumprod(:Growth .+1))

谢谢!

编辑: 我能想到的一种方法是通过下面,但似乎不是很优雅,尤其是当周期帧从 2 增长到 30 时:

df = @linq df |>
groupby([:region,:product]) |>
transform(ProValueTrailing2 = ["missing"; rolling(prod, :Growth .+1, 2)]) 

【问题讨论】:

    标签: dataframe julia julia-dataframe


    【解决方案1】:

    这是您想要的吗(我不完全确定 - 我的 :ProValue 变量显示了相对于每组第一年开始的值,这就是为什么第一年它是 1.0)?

    julia> transform(groupby(df, [:region, :product]),
                     :Growth => (x -> [1.0; cumprod(x .+ 1)[1:end-1]]) => :ProValue)       
    10×5 DataFrame
     Row │ region  product  year   Growth   ProValue 
         │ String  String   Int64  Float64  Float64  
    ─────┼───────────────────────────────────────────
       1 │ US      apple     2009     0.13    1.0
       2 │ US      apple     2010     0.23    1.13
       3 │ US      apple     2011     0.05    1.3899
       4 │ US      banana    2010     0.22    1.0
       5 │ US      banana    2011     0.28    1.22
       6 │ EU      apple     2010     0.24    1.0
       7 │ EU      apple     2011     0.23    1.24
       8 │ EU      banana    2009     0.03    1.0
       9 │ EU      banana    2010     0.17    1.03
      10 │ EU      banana    2011     0.18    1.2051
    

    【讨论】:

    • 是的,这也可以,但需要进行一些更改 - +1 是为了在 2 个周期的尾随基础上实现增长复合。
      昨晚找到了RollingFunctions.jl包,也解决了这个问题。它具有运行功能,您可以使用与滚动相同的方式,但不会出现丢失物品的问题。所以像这样:transform(Growth = running(prod, :Provalue .+1, 2))
    猜你喜欢
    • 2014-04-21
    • 1970-01-01
    • 2017-10-27
    • 2019-09-07
    • 2021-03-31
    • 1970-01-01
    • 2021-06-12
    • 2019-10-01
    • 1970-01-01
    相关资源
    最近更新 更多