python时间序列预测报错_python如何做时间序列
python做時間序列的方法:首先導(dǎo)入需要的工具包,輸入“data.plot()”,“plt().show()”命令繪制時序圖;然后由acf,pacf判斷模型參數(shù)即可。
采用python進(jìn)行簡易的時間序列預(yù)測流程
時間序列可視化——>序列平穩(wěn)——>acf,pacf尋找最優(yōu)參——>建立模型——>模型檢驗(yàn)——>模型預(yù)測
涉及到的工具包如下:#?-*-?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ù)
時間序列是與時間相關(guān)的一組數(shù)據(jù),這里的數(shù)據(jù)主要是生成的模擬數(shù)據(jù),僅是為了練習(xí)一下處理【時間序列】的流程。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
# 繪制時序圖data.plot()
plt.show()
# 繪制自相關(guān)圖
plot_acf(data).show()
從時序圖中可以看出這組序列存在明顯的增長趨勢。不是平穩(wěn)序列
acf圖呈現(xiàn)出三角對稱趨勢,進(jìn)一步說明這組時間序列是一組單調(diào)趨勢的非平穩(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,說明該模型適合樣本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é)果來看,如果取顯著性水平為0.05,那么相關(guān)系數(shù)與零沒有顯著差異,即為白噪聲序列。
模型預(yù)測
# 模型預(yù)測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')
您可能感興趣的文章:
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的python时间序列预测报错_python如何做时间序列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python响铃符不响_python语法
- 下一篇: keepalived 多个应用_Keep