其他分享
首页 > 其他分享> > 时间序列ARIMA模型及预测

时间序列ARIMA模型及预测

作者:互联网

import pandas as pd
import datetime
import matplotlib.pylab as plt
import seaborn as sns
from matplotlib.pylab import style
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf
style.use('ggplot')
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
infoFile='data.csv'
#读取文件
info=pd.read_csv(infoFile,index_col=0,parse_dates=[0])
#将空值填充,可以通过线性literpolate('lin'),补齐数据,将空的值,改为0 
newinfo=info.truncate(before='2018-01-01').resample('D').asfreq().fillna(0)
#newinfoinfo=newinfo["number"][newinfo.number>3000]=3000
newinfo.plot(figsize=(16,16))
plt.legend(bbox_to_anchor=(1.25,0.5))
plt.title('box info')
sns.despine()

##进行一阶差分,基本能够存
newinfo_diff = newinfo.diff()
plt.figure()
plt.plot(newinfo_diff)
plt.title('一阶差分')
plt.show()
 

#校验
acf = plot_acf(newinfo_diff,lags=1000)
plt.title("ACF")
acf.show()

#校验
acf = plot_pacf(newinfo_diff,lags=1000)
plt.title("pacf")
acf.show()

#预测
model = ARIMA(newinfo,order=(1,2,0),freq=None)
result=model.fit()
pred=result.predict('2020','2021-12-30',dynamic=True,typ='levels')
print(pred)

#看一下效果
plt.figure(figsize=(6,6))
plt.xticks(rotation=45)
plt.plot(pred)
plt.plot(newinfo)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
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
#D-W检验,一阶自相关检验
import statsmodels.api as sm
#画QQ图,验验一组数据是否服务正态分布
from statsmodels.graphics.api import qqplot
from statsmodels.tsa.arima_model import ARIMA
infoFile='data.csv'
#读取文件
info=pd.read_csv(infoFile,index_col=0,parse_dates=[0])
#将空值填充,可以通过线性literpolate('lin'),补齐数据,将空的值,改为0
newinfo=info.truncate(before='2018-01-01').resample('D').asfreq().fillna(0)
newinfo.head()
newinfo.info()
plt.figure(figsize=(10,5))
newinfo.plot()
plt.show()
##没有单调递减速或递增,则是平稳序列
#自相关图
#自相关图
#自相关系数长期大于0,没有趋向于零,说明序列间具有很强的长期相关性
plot_acf(newinfo,lags=50 )
#平稳性检验,p值大于显著性水平,>0.05),接受原假设(非平稳序列),说明原始序列是非平稳序列,第一个是adf检验的结果,第二个是统计量的p值 ,
#第三个是计算过程用到的延迟阶数,第四个是adf回归和计算的观测值的个数,第五个是配合第一个一起看的,是在99%,95%,90%置信区间下的临界的ADF
#检验的值 ,原始数据非平稳的
print('原始序列的ADF检验结果为:',ADF(newinfo.number))

newinfoinfo=newinfo.diff(periods=7,axis=0).dropna()

#时序图
plt.figure(figsize=(10,5))
newinfoinfo.plot()
plt.show()
#自相关图
#自相关图
#自相关系数长期大于0,没有趋向于零,说明序列间具有很强的长期相关性
#原始序列的ADF检验结果为: (-7.74955487514647, 1.0105501238604145e-11, 21, 1070, {'1%': -3.4364762217105844, '5%': -2.8642449457774135, '10%': -2.5682102104987337}, 15410.639212536755)
plot_acf(newinfoinfo,lags=50 )
print('原始序列的ADF检验结果为:',ADF(newinfoinfo.number))


#解读:p值小于0.05,拒绝原假设(纯随机序),说明一阶差分序列是非白噪声
print('一阶差分序的白噪场检验结果为:',acorr_ljungbox(newinfoinfo,lags=1))

#定阶
newinfoinfo=newinfo.diff(periods=7,axis=0).dropna()
#自相关图
plot_acf(newinfoinfo,lags=34).show()
#偏相关图
plot_pacf(newinfoinfo,lags=34).show()
pmax=int(len(newinfoinfo)/10)
qmax=int(len(newinfoinfo)/10)
"""
bic_mtrix = []
for p in range(pmax+1):
    tmp = []
    for q in range(qmax+1):
        try:
            tmp.append(ARIMA(newinfo,(p,1,q)).fit().bic)
        except:
            tmp.append(None)
    bic_mtrix.append(tmp)
bic_mtrix=pd.DataFrame(bic_mtrix)
print(bic_mtrix)
print(bic_mtrix.stack())
p,q = bic_mtrix.stack().idxmin()
print(bic_mtrix.stack().idxmin())
"""

result=ARIMA(newinfo,(0,1,1)).fit()

pred=result.predict('2020','2021-12-30',dynamic=True,typ='levels')
plt.figure(figsize=(6,6))
plt.xticks(rotation=45)
plt.plot(pred)
plt.plot(newinfo)
plt.show()

 

标签:plot,plt,acf,模型,ARIMA,newinfo,newinfoinfo,序列,import
来源: https://blog.51cto.com/u_13887992/2733377