python时间序列预测报错_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')
您可能感興趣的文章:
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的python时间序列预测报错_python如何做时间序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python响铃符不响_python语法
- 下一篇: python设计问答器_Python文件