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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:06:05