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

SARIMAX模型预测未来值衰减至零且无日期问题求助

SARIMAX日销售额预测问题排查与解决

问题1:预测结果无对应日期列

原因

使用整数位置(start=len(DF_train)、end=len(DF_store))调用predict时,statsmodels返回的预测结果默认使用整数索引,而非原数据的日期索引。

解决方法

有两种方式可以给预测结果绑定日期:

  • 直接使用日期作为预测边界:将start和end参数替换为测试集/未来日期的具体时间戳,比如预测测试集时用start=DF_test.index[0]、end=DF_test.index[-1]。
  • 手动替换索引:先生成目标日期序列,再将预测结果的索引替换为该序列(适用于预测未来无现成日期的场景)。

问题2:未来预测值逐渐衰减至零

核心原因

  1. 未使用auto_arima的最优阶数:手动指定的order=(3,0,0)和seas_order=(2,0,1,30)与ARIMA_model输出的最优参数不符,模型阶数无法匹配数据特征。
  2. 季节性周期设置错误:日销售额的核心季节性是周度周期(m=7),而非30天的月度周期,错误的周期参数导致模型无法捕捉真实的季节性规律。
  3. 未考虑数据趋势:order=(3,0,0)中的d=0假设数据完全平稳,但如果实际销售额存在长期趋势(如逐年增长),d=0的模型无法捕捉趋势,会导致预测值回归到均值,若均值接近0则出现衰减。
  4. 缺少趋势项:SARIMAX默认不添加趋势项,若数据有线性趋势,需要显式指定trend参数。

解决步骤

  1. 复用auto_arima的最优参数:直接调用ARIMA_model.order和ARIMA_model.seasonal_order作为SARIMAX的阶数参数,避免手动硬编码。
  2. 修正季节性周期:将auto_arima的m参数改为7(周度),若需考虑年度季节性可尝试m=365,但会增加模型复杂度。
  3. 确认数据平稳性:查看ARIMA_model.summary()中的差分阶数d,若数据有明显趋势,d应≥1。
  4. 添加趋势项:在SARIMAX初始化时指定trend='t'(线性趋势)或trend='c'(常数项),根据数据实际趋势选择。
  5. 验证模型拟合效果:通过result.summary()查看系数显著性,若季节性系数不显著,说明季节性阶数仍需调整。

修正后的核心代码示例

import pandas as pd
import numpy as np
from statsmodels.tsa.statespace.sarimax import SARIMAX
import pmdarima as pmd

# 读取并规整数据索引
DF_store = pd.read_csv('Per_store_DF', index_col="date", parse_dates=True)
DF_store = DF_store.asfreq('D')  # 确保索引为日频率的DatetimeIndex

# 拆分训练集与测试集
N = round(0.8 * len(DF_store))
DF_train = DF_store.iloc[:N]
DF_test = DF_store.iloc[N:]

# 用auto_arima获取最优模型(修正季节性周期为周度)
def arima_generator(ts):
    auto_model = pmd.auto_arima(
        ts, 
        start_p=1, start_q=1, 
        max_p=3, max_q=3, 
        m=7,  # 日数据周度季节性更符合业务逻辑
        test="adf", 
        trace=True,
        seasonal=True
    )
    return auto_model

ARIMA_model = arima_generator(DF_train)
print("最优ARIMA阶数:", ARIMA_model.order)
print("最优季节性阶数:", ARIMA_model.seasonal_order)

# 使用最优参数构建SARIMAX模型,添加线性趋势项
model = SARIMAX(
    DF_train, 
    order=ARIMA_model.order, 
    seasonal_order=ARIMA_model.seasonal_order,
    trend='t'
)
result = model.fit(disp=False)

# 预测测试集(绑定日期索引)
predict_test = result.predict(start=DF_test.index[0], end=DF_test.index[-1], dynamic=False)

# 预测未来30天并绑定日期
future_dates = pd.date_range(start=DF_store.index[-1] + pd.Timedelta(days=1), periods=30, freq='D')
predict_future = result.predict(start=len(DF_store), end=len(DF_store)+29, dynamic=False)
predict_future.index = future_dates

# 合并结果查看
predict_combined = pd.concat([predict_test, predict_future])
print(predict_combined.head())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:45:31