参考《Python数据分析与数据化运营》这本书籍的“案例-基于自动PDQ值的ARIMA时间序列预测应用”,使用自己的数据。
运行时,使用statsmodels.tsa.arima_model import ARMA进行时间序列分析,完成建模和预测之后,打算把数据画在一个图形中,x轴为日期。但报错了。
其中,预测部分定义了一个函数:
# 预测未来指定时间项的数据
def predict_data(model_arma, ts, log_n, start, end, rule1=True, rule2=True):
'''
:param model_arma: 最优ARMA模型对象
:param ts: 时间序列数据,Series类型
:param log_n: 平稳性处理的log的次数,int型
:param start: 要预测数据的开始时间索引
:param end: 要预测数据的结束时间索引
:param rule1: rule1规则布尔值,布尔型
:param rule2: rule2规则布尔值,布尔型
:return: 无
'''
predict_ts = model_arma.predict(start=start, end=end) # 预测未来指定时间项的数据
print ('-----------predict data----------') # 打印标题
if not (rule1 and rule2): # 如果两个条件有任意一个不满足
predict_ts = recover_log(predict_ts, log_n) # 还原数据
print (predict_ts) # 展示预测数据
# 展示预测趋势
plt.figure() # 创建画布
ts.plot(label='raw time series') # 设置推向标签
predict_ts.plot(label='predicted data', style='--') # 以虚线展示预测数据
plt.legend(loc='best') # 设置图例位置
plt.title('predicted time series') # 设置标题
plt.show() # 展示图像
程序运行到该函数时报错了,如下:
报错信息:
ValueError: view limit minimum -36866.1 is less than 1 and is an invalid Matplotlib date value. This often happens if you pass a non-datetime value to an axis that has datetime units
Error in callback <function install_repl_displayhook.<locals>.post_execute at 0x0000000008D29840> (for post_execute):
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
经分析,问题出在画图部分:当ts.plot()画完原始时间序列ts后,再用predict_ts.plot()画图时,系统就报错了。
这里ts、predict_ts的时间轴均为date日期格式数据,predict_ts源自:
predict_ts = model_arma.predict(start=start, end=end)
print (predict_ts)
2019-09-16 9.720805
2019-09-17 9.761446
2019-09-18 9.793089
2019-09-19 9.817726
2019-09-20 9.836908
ts的时间终点为2019-09-15,按照书上说明,这里是可以直接接在后边继续画出预测数据的。但自己在运行时不行,请教。