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

SARIMAX时序预测start/end参数设置错误致未来预测异常

问题原因

你的预测结果错位核心是三个代码逻辑错误:

  • 未来日期生成步长错误:原始数据是日频(90条样本覆盖2020.7.20-2020.10.18共91天,间隔1天),你用DateOffset(months=x)生成月间隔的未来时间点,和原数据频率完全不匹配,拼接后会出现时间断层。
  • 预测索引传参错误:模型训练时内部记录的样本位置对应0-89共90个训练样本,你拼接新数据后直接传整数start=90, end=120,本质是按模型内部的位置计数,和你拼接后DataFrame的行位置、日期索引没有绑定,很容易把预测值挂到错误的时间点上。
  • 预测步长不符合需求:你要预测2个月的日度值,大概需要60个左右的预测点,但用月偏移生成的23个未来点跨度接近2年,完全不符合预测长度要求。
修复方案

按以下步骤调整代码即可得到连续的预测曲线:

  1. 先确保原数据的索引是标准datetime类型,且时间连续无缺失,这是时序预测的基础。
  2. 用日频规则生成对应时间范围的未来日期索引,不要用月偏移。
  3. 调用predict()时传入具体的日期作为起止参数,不要传整数位置,从根源避免索引错位。
  4. (可选)调整季节性周期参数:你当前设置的季节周期为12,对应12天一个季节循环,不符合日度数据的常规规律,如果数据存在周度周期性建议设为7,存在月度周期性建议设为30,可根据业务场景调整。

修复后的完整代码:

import pandas as pd
import statsmodels.api as sm

# 预处理:确保索引为datetime类型,补全缺失的日度时间点
df.index = pd.to_datetime(df.index)
df = df.resample('D').asfreq()  # 保证时间索引连续无断层

# 拟合SARIMAX模型
model = sm.tsa.statespace.SARIMAX(
    df['CH4'],
    order=(1, 1, 1),
    seasonal_order=(1, 1, 1, 12) # 最后一位参数为季节周期,可根据实际规律调整
)
results = model.fit()

# 生成2020.10.19到2020.12.20的日度未来索引
last_hist_date = df.index[-1]
future_dates = pd.date_range(
    start=last_hist_date + pd.Timedelta(days=1),
    end='2020-12-20',
    freq='D'
)
future_part = pd.DataFrame(index=future_dates, columns=df.columns)

# 拼接历史数据和未来空框架
full_df = pd.concat([df, future_part])

# 生成从测试集起点到未来终点的连续预测值
# 直接传日期作为预测范围,避免整数位置错位
pred_start = pd.to_datetime('2020-10-01') # 原测试集起点
pred_end = future_dates[-1]
full_df['forecast'] = results.predict(start=pred_start, end=pred_end, dynamic=True)

# 可视化
full_df[['CH4', 'forecast']].plot(figsize=(12, 8))

注意:如果你后续要用到SARIMAX的外生变量功能,做样本外预测时必须给predict()传入和未来时间点长度一致、顺序对齐的外生变量矩阵,否则会触发报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:12:35