您好,登錄后才能下訂單哦!
小編給大家分享一下python做時間序列的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
python做時間序列的方法:首先導入需要的工具包,輸入“data.plot()”,“plt().show()”命令繪制時序圖;然后由acf,pacf判斷模型參數即可。
采用python進行簡易的時間序列預測流程
時間序列可視化——>序列平穩——>acf,pacf尋找最優參——>建立模型——>模型檢驗——>模型預測
涉及到的工具包如下:
# -*- coding:utf-8 -*- import pandas as pd import numpy as np import matplotlib.pyplot as plt from random import randrange from statsmodels.graphics.tsaplots import plot_acf, plot_pacf from statsmodels.tsa.arima_model import ARIMA from statsmodels.api import tsa原始數據
時間序列是與時間相關的一組數據,這里的數據主要是生成的模擬數據,僅是為了練習一下處理【時間序列】的流程。
def generate_data(start_date, end_date): df = pd.DataFrame([300 + i * 30 + randrange(50) for i in range(31)], columns=['income'], index=pd.date_range(start_date, end_date, freq='D')) return df data = generate_data('20170601', '20170701') # 這里要將數據類型轉換為‘float64’ data['income'] = data['income'].astype('float64')
數據可視化
這里主要是觀察數據是否是平穩序列,如果不是則要進行處理轉換為平穩序列1
# 繪制時序圖
data.plot() plt.show()
# 繪制自相關圖
plot_acf(data).show()
從時序圖中可以看出這組序列存在明顯的增長趨勢。不是平穩序列
acf圖呈現出三角對稱趨勢,進一步說明這組時間序列是一組單調趨勢的非平穩序列。
差分–轉換為平穩序列
# 差分運算
# 默認1階差分
data_diff = data.diff()
# 差分后需要排空,
data_diff = data_diff.dropna() data_diff.plot() plt.show()
可以看到在1階差分后序列已經轉換為平穩序列。
由acf,pacf判斷模型參數
plot_acf(data_diff).show() plot_pacf(data_diff).show()
這里選用ARIMA模型,參數為(1, 1, 1)
模型訓練
arima = ARIMA(data, order=(1, 1, 1)) result = arima.fit(disp=False) print(result.aic, result.bic, result.hqic) plt.plot(data_diff) plt.plot(result.fittedvalues, color='red') plt.title('ARIMA RSS: %.4f' % sum(result.fittedvalues - data_diff['income']) ** 2) plt.show()
模型檢驗
這里選擇了 ‘Ljung-Box檢驗’,
# ARIMA Ljung-Box檢驗 -----模型顯著性檢驗,Prod> 0.05,說明該模型適合樣本
resid = result.resid r, q, p = tsa.acf(resid.values.squeeze(), qstat=True) print(len(r), len(q), len(p)) test_data = np.c_[range(1, 30), r[1:], q, p] table = pd.DataFrame(test_data, columns=['lag', 'AC', 'Q', 'Prob(>Q)']) print(table.set_index('lag'))
檢驗的結果就是看最后一列前十二行的檢驗概率(一般觀察滯后1~12階),如果檢驗概率小于給定的顯著性水平,比如0.05、0.10等就拒絕原假設,其原假設是相關系數為零。就結果來看,如果取顯著性水平為0.05,那么相關系數與零沒有顯著差異,即為白噪聲序列。
模型預測
# 模型預測
pred = result.predict('20170701', '20170710', typ='levels') print(pred) x = pd.date_range('20170601', '20170705') plt.plot(x[:31], data['income']) # lenth = len() plt.plot(pred) plt.show() print('end')
看完了這篇文章,相信你對python做時間序列的方法有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。