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()