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

如何用7日移动平均实现未来7天预测?rolling函数无法生成预测值

7日移动平均法计算及未来7天预测实现

问题说明

已通过df['7Day_Rolling_avg']=df['actual price'].rolling(window=7).mean()计算出历史7日滚动平均值,但无法生成未来7天的预测值,尝试rolling()和expanding()函数未成功。

核心逻辑

7日移动平均预测的关键是:每生成一个未来日期的预测值,就将其纳入后续预测的输入数据集,循环计算得到未来7天的结果。具体来说:

  • 第1个未来日期的预测值 = 最后7个实际价格的平均值
  • 第2个未来日期的预测值 = 最后6个实际价格 + 第1个预测值 的平均值
  • 以此类推,直到生成7个预测值

代码实现

假设使用Pandas处理数据,步骤如下:

  1. 构造/导入历史数据
import pandas as pd

# 示例历史数据(与你提供的样本一致)
history_data = {
    'Dates': ['1 October', '2 October', '3 October', '4 October', '5 October', '6 October', '7 October',
              '8 October', '9 October', '10 October', '11 October', '12 October', '13 October'],
    'actual prices': [5400, 5375, 5350, 5325, 5300, 5275, 5250, 5250, 5200, 5175, 5150, 5125, 5100]
}
df = pd.DataFrame(history_data)
  1. 计算历史滚动平均值
# 计算历史7日滚动平均,结果从第7个数据点后开始生成
df['7Day_Rolling_avg'] = df['actual prices'].rolling(window=7).mean()
  1. 生成未来7天日期并合并数据
# 生成未来7天的日期(可根据实际需求调整格式)
future_dates = [f"{day} October" for day in range(14, 21)]
future_df = pd.DataFrame({'Dates': future_dates})

# 将未来日期合并到原数据框
df = pd.concat([df, future_df], ignore_index=True)
  1. 循环计算未来7天预测值
# 获取最后一个有实际价格的行索引
last_actual_idx = df['actual prices'].last_valid_index()

# 循环生成7个预测值
for i in range(7):
    # 当前预测的行索引
    current_idx = last_actual_idx + 1 + i
    # 获取最近7个有效价格(包含历史实际值和已生成的预测值)
    recent_7_prices = df['actual prices'].dropna().tail(7)
    # 计算平均值作为当日预测值
    forecast_value = recent_7_prices.mean()
    # 将预测值填入Forecast列
    df.loc[current_idx, 'Forecast'] = forecast_value
    # 将预测值加入到价格序列,用于下一次预测计算
    df.loc[current_idx, 'actual prices'] = forecast_value

结果验证

运行代码后,df['Forecast']列的最后7行即为未来7天的预测值,逻辑与你提供的样本预测值一致:

  • 第1个预测值(对应14 October):(5375+5350+5325+5300+5275+5250+5250)/7 ≈ 5303.57
  • 后续预测值依次基于最新的7个数据点计算,逐步得到剩余6天的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:35:34