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

如何高效计算固定间隔的Rolling mean(滚动均值)

固定间隔滞后滚动均值实现方案

你需要计算的是固定步长滞后项的均值,而非常规连续窗口的滚动平均,可参考以下两种实现方式,首先定义通用参数:

import numpy as np
import pandas as pd

# 示例原始数据
n=50
s = pd.Series(
    data = np.random.randint(0,10,n), 
    index = pd.date_range(pd.to_datetime('today').floor('D'), freq='D', periods = n)
)

step = 4 # 间隔天数
k = 3 # 参与计算的元素数量

方法1:Pandas原生实现(易读性优先)

直接构造所有需要的滞后项,按行求均值即可,代码逻辑清晰,适合中小数据量场景:

res = pd.concat([s.shift(step * i) for i in range(1, k+1)], axis=1).mean(axis=1)

返回结果与原序列索引完全对齐,前step*k个位置因缺乏足够历史数据为NaN,符合计算规则。

方法2:Numpy向量化实现(高性能优先)

针对百万级以上大数据量场景,使用numpy stride构造矩阵实现零拷贝计算,运算效率远高于循环/concat方案:

arr = s.values
# 构造固定步长的滞后矩阵(零拷贝,内存效率极高)
lag_matrix = np.lib.stride_tricks.as_strided(
    arr,
    shape=(len(arr) - step*k + 1, k),
    strides=(arr.strides[0], step * arr.strides[0])
)
# 计算均值并对齐原序列索引
res = pd.Series(np.nan, index=s.index)
res.iloc[step*k - 1:] = lag_matrix.mean(axis=1)

结果验证

可通过以下逻辑校验计算正确性:取原序列第i个位置(索引从0开始),当i >= step*k -1时,结果满足:
res.iloc[i] = (s.iloc[i-step] + s.iloc[i-2*step] + s.iloc[i-3*step]) / k

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:54:00