小編給大家分享一下python做時(shí)間序列的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)主營(yíng)界首網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都app開(kāi)發(fā),界首h5微信小程序開(kāi)發(fā)搭建,界首網(wǎng)站營(yíng)銷推廣歡迎界首等地區(qū)企業(yè)咨詢
python做時(shí)間序列的方法:首先導(dǎo)入需要的工具包,輸入“data.plot()”,“plt().show()”命令繪制時(shí)序圖;然后由acf,pacf判斷模型參數(shù)即可。
采用python進(jìn)行簡(jiǎn)易的時(shí)間序列預(yù)測(cè)流程
時(shí)間序列可視化——>序列平穩(wěn)——>acf,pacf尋找最優(yōu)參——>建立模型——>模型檢驗(yàn)——>模型預(yù)測(cè)
涉及到的工具包如下:
# -*- 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原始數(shù)據(jù)
時(shí)間序列是與時(shí)間相關(guān)的一組數(shù)據(jù),這里的數(shù)據(jù)主要是生成的模擬數(shù)據(jù),僅是為了練習(xí)一下處理【時(shí)間序列】的流程。
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') # 這里要將數(shù)據(jù)類型轉(zhuǎn)換為‘float64’ data['income'] = data['income'].astype('float64')
數(shù)據(jù)可視化
這里主要是觀察數(shù)據(jù)是否是平穩(wěn)序列,如果不是則要進(jìn)行處理轉(zhuǎn)換為平穩(wěn)序列1
# 繪制時(shí)序圖
data.plot() plt.show()
# 繪制自相關(guān)圖
plot_acf(data).show()
從時(shí)序圖中可以看出這組序列存在明顯的增長(zhǎng)趨勢(shì)。不是平穩(wěn)序列
acf圖呈現(xiàn)出三角對(duì)稱趨勢(shì),進(jìn)一步說(shuō)明這組時(shí)間序列是一組單調(diào)趨勢(shì)的非平穩(wěn)序列。
差分–轉(zhuǎn)換為平穩(wěn)序列
# 差分運(yùn)算
# 默認(rèn)1階差分
data_diff = data.diff()
# 差分后需要排空,
data_diff = data_diff.dropna() data_diff.plot() plt.show()
可以看到在1階差分后序列已經(jīng)轉(zhuǎn)換為平穩(wěn)序列。
由acf,pacf判斷模型參數(shù)
plot_acf(data_diff).show() plot_pacf(data_diff).show()
這里選用ARIMA模型,參數(shù)為(1, 1, 1)
模型訓(xùn)練
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()
模型檢驗(yàn)
這里選擇了 ‘Ljung-Box檢驗(yàn)’,
# ARIMA Ljung-Box檢驗(yàn) -----模型顯著性檢驗(yàn),Prod> 0.05,說(shuō)明該模型適合樣本
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'))
檢驗(yàn)的結(jié)果就是看最后一列前十二行的檢驗(yàn)概率(一般觀察滯后1~12階),如果檢驗(yàn)概率小于給定的顯著性水平,比如0.05、0.10等就拒絕原假設(shè),其原假設(shè)是相關(guān)系數(shù)為零。就結(jié)果來(lái)看,如果取顯著性水平為0.05,那么相關(guān)系數(shù)與零沒(méi)有顯著差異,即為白噪聲序列。
模型預(yù)測(cè)
# 模型預(yù)測(cè)
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')
看完了這篇文章,相信你對(duì)python做時(shí)間序列的方法有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!