使用Statsmodels SARIMAX时get_prediction()报ValueError问题求助
解决SARIMAX预测时的ValueError: Got a string for start and dates is None问题
Hey,我来帮你分析下这个报错的根源和解决办法:
问题背景
你从大的数据框中提取了一段时间序列,代码和样本数据如下:
df_test = df.loc[(df['time'] >= '2015-05-01') & (df['time'] <= '2015-05-09')] df_test.set_index('time')
样本数据:
time total_consumption 122400 2015-05-01 00:01:00 106.391 122401 2015-05-01 00:11:00 120.371 122402 2015-05-01 00:21:00 109.292 122403 2015-05-01 00:31:00 99.838 122404 2015-05-01 00:41:00 97.387
之后你用SARIMAX构建模型并尝试预测:
mod = sm.tsa.statespace.SARIMAX(np.asarray(df_test['total_consumption']), order=(1,1,1), seasonal_order=(0,1,1,12), enforce_stationarity=False, enforce_invertibility=False) results_final = mod.fit() start = pd.to_datetime('2015-05-08 00:01:00') pred = results_final.get_prediction(start, dynamic=False) pred_ci = pred.conf_int()
结果触发了报错:ValueError: Got a string for start and dates is None
报错原因
这个错误其实是两个小问题叠加导致的:
- 时间索引设置未生效:你执行了
df_test.set_index('time'),但Pandas的set_index默认是返回新的数据框,不会修改原数据框。你既没有把结果赋值给df_test,也没加inplace=True参数,所以df_test的索引还是原来的数字序列(122400、122401这些),根本没变成时间索引。 - 模型丢失了时间上下文:你把
total_consumption转成了numpy数组传入SARIMAX,这会彻底丢掉数据的时间索引关联。模型只看到了一串数值,完全不知道每个数值对应的时间点,所以当你传入日期格式的start参数时,模型根本无法匹配对应的位置,自然就报错了。
解决步骤
按照下面的方式修改代码就能搞定:
- 正确设置时间索引:二选一即可:
# 方式1:将新数据框赋值给原变量 df_test = df_test.set_index('time') # 方式2:直接修改原数据框 df_test.set_index('time', inplace=True) - 保留时间信息传入模型:直接传入带时间索引的Series,不要转成numpy数组,这样模型会自动识别时间维度:
mod = sm.tsa.statespace.SARIMAX(df_test['total_consumption'], order=(1,1,1), seasonal_order=(0,1,1,12), enforce_stationarity=False, enforce_invertibility=False) results_final = mod.fit() - 执行预测:这时候再用日期作为
start参数,模型就能正确匹配时间点了:start = pd.to_datetime('2015-05-08 00:01:00') pred = results_final.get_prediction(start, dynamic=False) pred_ci = pred.conf_int()
这样调整后,模型就能正常识别时间索引,不会再触发那个ValueError了。
内容的提问来源于stack exchange,提问作者Quentin_P
相关产品推荐
相关产品推荐

