如何用statsmodels ARIMA预测第151个值?解决索引匹配KeyError问题
解决ARIMA预测时的KeyError问题
你的问题核心在于预测时传入的start参数不在训练数据的索引范围内:训练模型用的是前150行数据(对应索引是2018-01-02到2018-08-06左右的工作日),而close.index[150]是第151行的日期(2018-08-07),这个日期并没有包含在训练数据的索引里,所以模型无法匹配到对应的位置,直接抛出了KeyError。
下面给你两种可行的解决方法:
方法1:用位置索引指定预测点
这是最直接的处理方式,直接通过序列的位置来定义预测的起点和终点。训练数据有150行,我们要预测的是紧接着的下一个点(对应原数据的第151行),代码如下:
from statsmodels.tsa.arima_model import ARIMA # 用前150行训练ARIMA模型 model = ARIMA(close[:150], order=(1,1,1)) model_fit = model.fit(disp=0) # 预测训练数据之后的第1个点:start=150对应训练集的下一个位置 pred = model_fit.predict(start=150, end=150, dynamic=False, typ='levels') # 手动给预测结果设置目标日期的索引 pred.index = [close.index[150]] print(pred)
运行后就能得到对应2018-08-07的预测值,方便和真实值做对比。
方法2:指定时间序列的明确频率(推荐)
因为你的数据是工作日序列,先把索引转为带明确频率的DatetimeIndex,让statsmodels能直接识别后续的工作日日期,不用手动处理位置:
import pandas as pd from statsmodels.tsa.arima_model import ARIMA # 将索引转为DatetimeIndex,并指定频率为工作日('B'代表Business Day) close.index = pd.DatetimeIndex(close.index, freq='B') # 训练模型 model = ARIMA(close[:150], order=(1,1,1)) model_fit = model.fit(disp=0) # 直接传入目标日期作为start参数 pred = model_fit.predict(start=close.index[150], end=close.index[150], dynamic=False, typ='levels') print(pred)
设置freq='B'后,模型能理解时间序列的规律(自动跳过周末),所以可以直接用目标日期作为预测起点,不会再出现索引匹配错误。
结果验证
两种方法都能输出第151行的预测值,你可以通过pred[0]提取具体数值,和close[150]的真实值做对比,评估模型的预测效果。
内容的提问来源于stack exchange,提问作者Katie Dobbs
相关产品推荐
相关产品推荐

