如何高效计算固定间隔的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
相关产品推荐
相关产品推荐

