You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的结果:

groupvaluerolling_mean
A11.0
A21.5
A32.0
B44.0
B54.5
B65.0
C77.0
C87.5
C98.0

补充说明

  • 若坚持使用RollingFunctions,可以结合fill和切片逻辑,但自定义函数更灵活,无需依赖库的默认行为
  • 对于数据量小于窗口的分组,自定义函数会自动取所有已有数据计算均值,不会返回missing

内容的提问来源于stack exchange,提问作者gruzy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:04:52