怎样通过ARIMA模型去预测的实例
Admin 2023-01-06 群英技术资讯 1950 次浏览
这篇文章给大家分享的是“怎样通过ARIMA模型去预测的实例”,对大家学习和理解有一定的参考价值和帮助,有这方面学习需要的朋友,接下来就跟随小编一起学习一下吧。import numpy as np import pandas as pd import matplotlib.pyplot as plt
from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = "all"
from matplotlib.pylab import style # 自定义图表风格
style.use('ggplot')
# 解决中文的显示问题 plt.rcParams["font.sans-serif"] = ["SimHei"] plt.rcParams["axes.unicode_minus"] = False
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf # 自相关图、偏自相关图 from statsmodels.tsa.stattools import adfuller as ADF # 平稳性检验 from statsmodels.stats.diagnostic import acorr_ljungbox # 白噪声检验 import statsmodels.api as sm # D-W检验,一阶自相关检验 from statsmodels.graphics.api import qqplot # 画QQ图,检验一组数据是否服从正态分布 from statsmodels.tsa.arima_model import ARIMA
sale = pd.read_excel('./arima_data.xls', index_col='日期')
sale.head()

sale.info()
print('-----')
sale.销量 = sale.销量.astype('float')
sale.info()

· 时序图
plt.figure(figsize=(10,5)) sale.plot() plt.show() #解读:具有单调递增趋势,则是非平稳序列。

· 自相关图
plot_acf(sale, lags=35).show() #解读:自相关系数长期大于零,没有趋向于零,说明序列间具有很强的长期相关性。

· 平稳性检验
#方法:单位根检验
print('原始序列的ADF检验结果为:',ADF(sale.销量))
#解读:P值大于显著性水平α(0.05),接受原假设(非平稳序列),说明原始序列是非平稳序列。

第一个是adf检验的结果。 第二个是统计量的P值。 第三个是计算过程中用到的延迟阶数。 第四个是用于ADF回归和计算的观测值的个数。 第五个是配合第一个一起看的,是在99%,95%,90%置信区间下的临界的ADF检验的值。
原文链接:adfuller函数返回值的参数说明与记录
d1_sale = sale.diff(periods=1, axis=0).dropna()
#时序图
plt.figure(figsize=(10,5))
d1_sale.plot()
plt.show()
#解读:在均值附件比较平稳波动
#自相关图
plot_acf(d1_sale, lags=34).show()
#解读:有短期相关性,但趋向于零。
#平稳性检验
print('原始序列的ADF检验结果为:',ADF(d1_sale.销量))
#解读:P值小于显著性水平α(0.05),拒绝原假设(非平稳序列),说明一阶差分序列是平稳序列。



· 白噪声检验
print('一阶差分序列的白噪声检验结果为:',acorr_ljungbox(d1_sale, lags=1))#返回统计量、P值
#解读:p值小于0.05,拒绝原假设(纯随机序列),说明一阶差分序列是非白噪声序列。

· 参数调优:人工判别
d1_sale = sale.diff(periods=1, axis=0).dropna() #自相关图 plot_acf(d1_sale, lags=34).show() #解读:有短期相关性,但趋向于零。 #偏自相关图 plot_pacf(d1_sale, lags=10).show() #偏自相关图 plot_pacf(d1_sale, lags=17).show() #解读:自相关图,1阶截尾;偏自相关图,拖尾。则ARIMA(p,d,q)=ARIMA(0,1,1)



· 参数调优:BIC
pmax = int(len(d1_sale) / 10) #一般阶数不超过length/10 qmax = int(len(d1_sale) / 10) #一般阶数不超过length/10 pmax qmax

bic_matrix = []
for p in range(pmax + 1):
tmp = []
for q in range(qmax + 1):
try:
tmp.append(ARIMA(tuple(sale), (p, 1, q)).fit().bic)
except:
tmp.append(None)
bic_matrix.append(tmp)
bic_matrix = pd.DataFrame(bic_matrix) bic_matrix

bic_matrix.stack()

p,q=bic_matrix.stack().idxmin() #最小值的索引
print('用BIC方法得到最优的p值是%d,q值是%d'%(p,q))

· 参数调优:AIC
pmax = int(len(d1_sale )/ 10) #一般阶数不超过length/10
qmax = int(len(d1_sale) / 10) #一般阶数不超过length/10
aic_matrix = []
for p in range(pmax + 1):
tmp = []
for q in range(qmax + 1):
try:
tmp.append(ARIMA(tuple(sale), (p, 1, q)).fit().aic)
except:
tmp.append(None)
aic_matrix.append(tmp)
aic_matrix = pd.DataFrame(aic_matrix)
p,q = aic_matrix.stack().idxmin() #最小值的索引
print('用AIC方法得到最优的p值是%d,q值是%d'%(p,q))

· 建模
#创建模型 model = ARIMA(tuple(sale), (0, 1, 1)).fit() #查看模型报告 model.summary2()

· 残差检验
resid = model.resid #自相关图 plot_acf(resid, lags=35).show() #解读:有短期相关性,但趋向于零。 #偏自相关图 plot_pacf(resid, lags=10).show() #偏自相关图 plot_pacf(resid, lags=17).show()



· QQ图
qqplot(resid, line='q', fit=True).show() #解读:残差服从正态分布,均值为零,方差为常数

· D-W检验
德宾-沃森检验,简称D-W检验,是目前检验自相关性最常用的方法,但它只适用于检验一阶自相关性。 因为自相关系数ρ的值介于-1和1之间,所以 0≤DW≤4。
因此,当DW值显著的接近于O或4时,则存在自相关性,而接近于2时,则不存在(一阶)自相关性。
print('D-W检验的结果为:',sm.stats.durbin_watson(resid.values))
#解读:不存在一阶自相关

· Ljung-Box检验
Ljung-Box test是对randomness的检验,或者说是对时间序列是否存在滞后相关的一种统计检验。对于滞后相关的检验,我们常常采用的方法还包括计算ACF和PCAF并观察其图像,但是无论是ACF还是PACF都仅仅考虑是否存在某一特定滞后阶数的相关。LB检验则是基于一系列滞后阶数,判断序列总体的相关性或者说随机性是否存在。
时间序列中一个最基本的模型就是高斯白噪声序列。而对于ARIMA模型,其残差被假定为高斯白噪声序列,所以当我们用ARIMA模型去拟合数据时,拟合后我们要对残差的估计序列进行LB检验,判断其是否是高斯白噪声,如果不是,那么就说明ARIMA模型也许并不是一个适合样本的模型。
检验的结果就是看最后一列前十二行的检验概率(一般观察滞后1~12阶),如果检验概率小于给定的显著性水平,比如0.05、0.10等就拒绝原假设,其原假设是相关系数为零。
# 方法一
print('残差序列的白噪声检验结果为:',acorr_ljungbox(resid,lags=1))#返回统计量、P值
#解读:残差是白噪声

# 方法二
confint,qstat,pvalues = sm.tsa.acf(resid.values, qstat=True) #qstat is Ljung-Box Q-Statistic. confint is Confidence intervals for the ACF
data = np.c_[range(1,36), confint[1:], qstat, pvalues]
table = pd.DataFrame(data, columns=['lag', "confint", "qstat", "pvalues(>Q)"])
print(table.set_index('lag'))

· 预测
#预测
print('未来7天的销量预测:')
model.forecast(7) #预测、标准差、置信区间

forecast = pd.Series(model.forecast(7)[0], index=pd.date_range('2015-2-7', periods=7, freq='D'))
forecast

data = pd.concat((sale, forecast), axis=0) data.columns = ['销量', '未来7天销量'] plt.figure(figsize = (10,5)) data.plot() plt.show()

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
有时通过selenium打开网站时,发现有些网站需要扫码登录,就很头疼,导致爬虫进展不下去,下面这篇文章主要给大家介绍了关于使用Selenium控制当前已经打开的chrome浏览器窗口的相关资料,需要的朋友可以参考下
我们知道,在计算机中,各种数据,各种程序通常是以文件的形式有组织地存放在磁盘、磁带等存储介质上的。文件是我们使用计算机必须使用的工具。在python中文件也很多,想要得到一个程序,就要向文件输入内容。write中文翻译为书写,在python中,就是用write函数写入文件。本文将向大家介绍python中是如何用wreite函数写入文件和设置文件字体大小的。
使用Pandas的pivot方法可以将DF进行旋转变换,本文将会详细讲解pivot的秘密,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章主要介绍了Python基础之文本常量与字符串模板,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
这篇文章主要介绍了python性能检测工具函数运行内存及运行时间,python虽然是一门慢语言,但是也有着比较多的性能检测工具来帮助我们优化程序的运行效率,下文小编给大家分享五个性能检测工具,需要的朋友可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008