statsmodels ARIMA预测传测试日期报DatetimeProperties无法转Timestamp报错
ARIMA预测触发Datetime类型转换错误的修复方案
触发报错的根本原因
- 构造原始数据集时,日期值没有加引号,Python会自动把
2020-01-01识别为减法运算(最终计算结果为2018),生成的列根本不是合法的日期类型 - 初始化ARIMA模型时,直接传入了带
date、items_sold两列的DataFrame,不符合接口要求的“单变量时序序列(带DatetimeIndex)”的入参格式 - 旧版
statsmodels.tsa.arima_model.ARIMA的predict方法不支持外部传入测试集的日期序列作为入参,该接口的预测逻辑是基于训练集拟合的时间轴自动推算,入参仅接收预测区间的起止位置/时间戳 - 传入的
X_test.dt是pandas的DatetimeProperties访问器对象,不是可被转换为Timestamp的合法日期值,直接触发类型校验报错
修正后可直接运行的代码
import pandas as pd from statsmodels.tsa.arima_model import ARIMA # 构造合法训练集:日期值加引号,转换为datetime类型并设置为时序索引 train_data = { 'date': ['2020-01-01', '2020-01-02'], 'items_sold': [30, 40] } train = pd.DataFrame(train_data) train['date'] = pd.to_datetime(train['date']) # ARIMA要求输入为带固定频率的时序序列,直接传入带日期列的DataFrame会触发参数校验错误 train_series = train.set_index('date')['items_sold'].asfreq('d') # 拟合模型 arima_model = ARIMA(train_series, order=(1,1,1), freq='d') fit_result = arima_model.fit() # 构造测试集 test_data = {'date': ['2020-01-03'], 'items_sold': [25]} test = pd.DataFrame(test_data) test['date'] = pd.to_datetime(test['date']) # 设置预测区间:从测试集第一个日期到最后一个日期生成预测值 pred_range_start = test['date'].iloc[0] pred_range_end = test['date'].iloc[-1] test['forecasted'] = fit_result.predict(start=pred_range_start, end=pred_range_end)
操作注意事项
- 调用
predict时不要传入.dt访问器对象,需要传入日期值时直接使用已完成类型转换的datetime列本身即可 - 旧版ARIMA接口已被statsmodels标记为弃用,长期使用建议迁移到新版
SARIMAX接口,时序兼容性更稳定 - 训练集输入必须转为带固定频率的DatetimeIndex结构,不能直接把带日期列的普通DataFrame传给ARIMA类构造函数
内容的提问来源于stack exchange,提问作者user15426718
相关产品推荐
相关产品推荐

