Julia中按年份和行业计算ROA百分比变化率的问题
解决按行业逐年计算ROA百分比变化率的问题
问题根源
你之前的代码把分组键设成了[:year, :sector],这会让每个分组只包含单条数据(每个年份对应每个行业只有一行),所以pct_change函数每次处理的都是长度为1的向量,自然输出全是missing。
正确解法
应该按**行业(sector)**单独分组,在每个行业组内按年份排序后,计算ROA的逐年变化率,用transform函数可以保留原DataFrame的所有列并新增结果列:
using DataFrames # 定义百分比变化函数 function pct_change(input::AbstractVector{<:Number}) [i == 1 ? missing : (input[i]-input[i-1])/input[i-1] for i in eachindex(input)] end # 先按行业分组,组内按年份排序,然后计算变化率 df_result = transform( groupby(sort(df_roa_kvkt, [:sector, :year]), :sector), :roa => pct_change => :proportion ) # 按年份、行业排序,方便查看 sort!(df_result, [:year, :sector])
结果示例
运行后得到的df_result包含year、sector、roa、proportion四列,部分结果如下:
15×4 DataFrame Row │ year sector roa proportion │ Int64 String Float64 Float64? ─────┼────────────────────────────────────────── 1 │ 2017 Agriculture -1.82 missing 2 │ 2017 Construction -1.15 missing 3 │ 2017 Services -1.78 missing 4 │ 2018 Agriculture -1.55 0.148352 5 │ 2018 Construction -1.05 0.0869565 6 │ 2018 Services -1.56 0.123596 ... # 后续行省略
补充说明
- 每个行业的第一年因为没有前一年数据,所以
proportion为missing,符合预期 - 如果需要将变化率转为百分比格式,可以在函数里乘以100,或者后续处理:
df_result.proportion = df_result.proportion .* 100
内容的提问来源于stack exchange,提问作者Tann
相关产品推荐
相关产品推荐

