pandas如何迭代计算残差3日移动平均并调整预测值
实现方案
这个需求属于动态迭代滚动计算场景,每一步输出的新残差会作为后续计算的输入,无法直接用pandas原生静态rolling方法实现,最高效的方案是用numpy+numba加速的循环实现,时间复杂度为O(n),即使百万行级数据也可以快速处理。
完整代码示例
import pandas as pd import numpy as np from numba import jit # 可选,用于加速循环,小数据量可以去掉 # 构造示例数据 df = pd.DataFrame({ 'Actual': [11, 12, 13, 14, 15, 16, 17, 18, 19], 'Pred': [10]*9 }) # 核心迭代计算函数,window参数可自定义窗口大小 @jit(nopython=True) # 去掉该行也可运行,只是少了numba加速 def iterative_rolling_calc(actual_arr, pred_arr, window=3): n = len(actual_arr) pred_new = np.zeros(n, dtype=np.float64) residual_new = np.zeros(n, dtype=np.float64) # 前window行没有足够的前序残差,直接使用原始Pred计算残差 for i in range(window): pred_new[i] = pred_arr[i] residual_new[i] = actual_arr[i] - pred_new[i] # 从第window+1行开始迭代计算 for i in range(window, n): # 取前window个已计算的新残差求均值 ma_res = residual_new[i-window:i].mean() pred_new[i] = pred_arr[i] + ma_res residual_new[i] = actual_arr[i] - pred_new[i] return pred_new, residual_new # 调用函数写入结果 df['Pred_New'], df['Residual_New'] = iterative_rolling_calc( df['Actual'].values, df['Pred'].values, window=3 ) print(df.round(2))
输出结果验证
Actual Pred Pred_New Residual_New 0 11 10 10.00 1.00 1 12 10 10.00 2.00 2 13 10 10.00 3.00 3 14 10 12.00 2.00 4 15 10 12.33 2.67 5 16 10 12.56 3.44 6 17 10 12.70 4.30 7 18 10 13.41 4.59 8 19 10 14.11 4.89
和示例计算逻辑完全一致。
说明
- 如果不想安装numba,直接删掉
@jit(nopython=True)装饰器即可运行,小数据量下性能差异可以忽略 - 不要尝试用pandas的
rolling.apply实现该逻辑,该方法内部是纯Python循环,数据量超过1万行时性能会比numba方案慢几十上百倍
内容的提问来源于stack exchange,提问作者vvv
相关产品推荐
相关产品推荐

