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

ARIMA模型预测全为NaN问题求助——沃尔玛周销量预测场景

问题原因分析

你的预测结果全为NaN且索引异常,核心原因是预测时的索引不匹配,以及可能的dynamic参数使用不当:

  1. ARIMA.predict()的start/end参数若传入整数,默认对应训练数据的内部位置索引,而非原数据集rmdetdiff的全局索引。直接将预测结果赋值给rmdetdiff['arima_pred']时,两者索引无法对齐,导致大量NaN。
  2. dynamic=True在平稳ARMA模型(你的ARIMA(1,0,2)本质是ARMA(1,2))中,可能因依赖预测值递推,若模型拟合存在收敛问题,会直接输出NaN。
解决方案

1. 先验证模型拟合状态

检查模型是否成功收敛、参数是否有效:

print(model1_fit.summary())
# 查看收敛状态
print(model1_fit.mle_retvals['converged'])

如果converged为False,说明模型拟合失败,需要重新检查数据平稳性或调整模型阶数。

2. 修正预测索引匹配问题

有两种方式确保索引对齐:

方式一:使用原数据集的索引作为预测起止点

直接用test的索引指定预测范围,避免位置索引混乱:

# 用test的首尾索引作为预测起止
start = test.index[0]
end = test.index[-1]

# 先关闭dynamic=True,改用默认的依赖真实值的预测模式
rmdetdiff['arima_pred'] = model1_fit.predict(start=start, end=end)

方式二:手动对齐预测结果的索引

若必须使用位置索引,需将预测结果的索引替换为test的索引后再赋值:

# 生成预测结果
preds = model1_fit.predict(start=len(train), end=len(train)+len(test)-1)
# 替换索引为test的索引
preds.index = test.index
# 赋值到原数据集对应位置
rmdetdiff.loc[test.index, 'arima_pred'] = preds

3. 调整dynamic参数的使用

如果确实需要动态预测(仅用训练数据,后续预测依赖之前的预测值),确保训练数据长度足够且模型参数稳定:

rmdetdiff['arima_pred_dynamic'] = model1_fit.predict(start=start, end=end, dynamic=True)

若仍出现NaN,建议先关闭dynamic参数,确认基础预测正常后再尝试。

4. 检查数据索引类型

确认rmdetdiff的索引是否为连续的时间序列或整数索引:

print(rmdetdiff.index)

如果是时间索引,确保训练集和测试集的时间序列连续无断点;如果是整数索引,确保索引从0开始或连续,避免位置与索引值不一致。

验证修改效果

运行修改后的代码后,查看预测结果:

print(rmdetdiff['arima_pred'].dropna())
rmdetdiff[['arima_pred','weekly_sales']].plot(legend=True)

此时应该能看到测试集范围内的有效预测值,不再出现全NaN或索引异常的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 21:31:07