1.差分自迴歸模型的基本思想:將預測對象隨時間推移而形成的數據序列視爲一個隨機序列,用一定的數學模型來近似描述這個序列。這個模型一旦被識別後就可以從時間序列的過去值以及現在值來預測未來值。不能對時間序列直接採取線性迴歸算法是因爲時間序列所對應的值並不是獨立的。
2.要對非平穩的序列進行平穩處理,因爲非平穩的序列不能進行預測。
3.代碼:
#!/usr/bin/python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima_model import ARIMA
def date_parse(date):
return pd.datetime.strptime(date, '%Y-%m')
if __name__ == '__main__':
data = pd.read_csv('AirPassengers.csv', header = 0, parse_dates = ['Month'], date_parser = date_parse, index_col = ['Month'])
p,d,q = 2, 1, 2
data.rename(columns = {'#Passengers':'Passengers'}, inplace = True)
passengersNums = data['Passengers'].astype(np.float)
logNums = np.log(passengersNums)
subtractionNums = logNums - logNums.shift(periods = d)
rollMeanNums = logNums.rolling(window = q).mean()
logMRoll = logNums - rollMeanNums
plt.plot(logNums, 'g-', lw = 2, label = u'log of original')
plt.plot(subtractionNums, 'y-', lw = 2, label = u'subtractionNums')
plt.plot(logMRoll, 'r-', lw = 2, label = u'log of original - log of rollingMean')
plt.legend(loc = 'best')
plt.show()
arima = ARIMA(endog = logNums, order = (p,d,q))
proArima = arima.fit(disp = -1)
fittedArima = proArima.fittedvalues.cumsum() + logNums[0]
fittedNums = np.exp(fittedArima)
plt.plot(passengersNums, 'g-', lw = 2, label = u'orignal')
plt.plot(fittedNums, 'r-', lw = 2, label = u'fitted')
plt.legend(loc = 'best')
plt.show()
解釋:
(1)首先對原始時間序列數據進行對數處理,差分處理,滑動平均處理。其中差分處理與滑動平均處理是對非平穩序列進行平穩處理,結果如圖:
很明顯觀察到用差分與原始數據減去滑動平均的結果可以對非平穩序列進行平穩處理。
(2)然後用差分自迴歸模型擬合原始數據。其中參數p爲自回顧函數的參數,d爲差分的參數,q爲滑動平均的參數。結果如圖: