import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#ADF單位根檢驗
from statsmodels.tsa.stattools import adfuller
#序列分解(季節+趨勢+殘差)
from statsmodels.tsa.seasonal import seasonal_decompose
#ACF/PACF
from statsmodels.tsa.stattools import acf, pacf
#繪製ACF,PACF圖
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
#建立ARIMA(p,d,q)
from statsmodels.tsa.arima_model import ARIMA
#讀取數據(將時間列設置爲索引)
ts = pd.read_csv('D:/passenger.csv',encoding='utf-8',index_col='time')
ts.index = pd.to_datetime(ts.index)
'''
輸入ts['1960'] --- 會輸出1960年的數據記錄(1月到12月)
輸入ts['1960-8'] --- 會輸出1960年8月份的數據記錄
'''
#繪製時序圖(含有上升趨勢,則序列非平穩)
plt.plot(ts,color='red')
plt.show()
#ADF檢驗(P-value>0.05,則序列非平穩)
dftest = adfuller(ts['num'],1,autolag='AIC')
dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
for key,value in dftest[4].items():
dfoutput['Critical Value (%s)'%key] = value
print(dfoutput)
#自相關圖ACF和偏相關圖PACF
fig,ax = plt.subplots(2,1,figsize=(6,12))
plot_acf(ts,lags=20,ax=ax[0])
plot_pacf(ts,lags=20,ax=ax[1])
#序列分解
decomposition = seasonal_decompose(ts)
trend = decomposition.trend
season = decomposition.seasonal
residual = decomposition.resid
fig,ax = plt.subplots(4,1,figsize=(10,16))
ax[0].plot(ts)
ax[0].legend(['origin'])
ax[1].plot(trend)
ax[1].legend(['trend'])
ax[2].plot(season)
ax[2].legend(['seasonal'])
ax[3].plot(residual)
ax[3].legend(['residuals'])
注:前期時序分析沒有問題,但是ARIMA建模時報錯,該問題尚未解決