Julia DataFrame分组滚动均值:错误排查与前N行均值需求
Julia 分组滚动均值:修复BoundsError并实现自适应窗口均值
1. 修复BoundsError
报错根源是部分分组数据为空,或分组数据量小于滚动工具的初始处理阈值——比如用RollingFunctions.rolling时,空分组会触发访问空数组索引的错误。解决核心是在分组处理前过滤空分组,或添加数据长度判断逻辑。
修复前后代码对比
触发错误的写法
using DataFrames, RollingFunctions df = DataFrame( group = ["A", "A", "B", "B", "", ""], # 含空分组 value = [1,2,3,4,5,6] ) # 直接对所有分组应用rolling,空分组会触发BoundsError transform!(df, :group => groupby => (g -> rolling(mean, g.value, 3)) => :rolling_mean)
修复后的代码
using DataFrames, RollingFunctions df = DataFrame( group = repeat(["A", "B", "C"], inner = 3), value = [1,2,3,4,5,6,7,8,9] ) # 自定义分组处理逻辑,规避空分组和小分组问题 function adaptive_rolling_mean(v::Vector, window::Int) isempty(v) && return Union{Missing, Float64}[] # 空分组返回空数组 n = length(v) res = Vector{Union{Missing, Float64}}(undef, n) for i in 1:n # 取当前行及之前的所有数据(最多window条)计算均值 res[i] = mean(v[1:min(i, window)]) end return res end # 应用到分组 transform!(df, :group => groupby => (g -> adaptive_rolling_mean(g.value, 3)) => :rolling_mean)
2. 实现自适应窗口均值(替换missing为当前可用数据均值)
上面的adaptive_rolling_mean函数直接实现了需求:窗口设为3时,第1行取自身值,第2行取前两行均值,第3行及以后取前3行均值,完全替代默认的missing填充。
示例输出
运行后df的结果:
| group | value | rolling_mean |
|---|---|---|
| A | 1 | 1.0 |
| A | 2 | 1.5 |
| A | 3 | 2.0 |
| B | 4 | 4.0 |
| B | 5 | 4.5 |
| B | 6 | 5.0 |
| C | 7 | 7.0 |
| C | 8 | 7.5 |
| C | 9 | 8.0 |
补充说明
- 若坚持使用
RollingFunctions,可以结合fill和切片逻辑,但自定义函数更灵活,无需依赖库的默认行为 - 对于数据量小于窗口的分组,自定义函数会自动取所有已有数据计算均值,不会返回
missing
内容的提问来源于stack exchange,提问作者gruzy
相关产品推荐
相关产品推荐

