python交通流预测代码_使用ARIMA模型进行的短时交通流预测和结果分析
首先要講的是,在短時交通流預測領域,ARIMA模型是一種相當粗糙的基于時間序列的預測方法,相應地,這種預測方法的準確性也不高。同時,ARIMA方法也不在我的研究范圍內,所以本次實驗就直接使用網絡上現成的python第三方庫進行實現,不再重新造輪子。
ARIMA模型表達為ARIMA(p,d,q),是在ARMA模型的基礎上新引入了'I'也就是差分的思想。ARIMA模型由三個部分組成,分別是AR(p)模型、I(d)差分方法、MA(q)模型。
AR(p)模型(AutoRegressive):p即為時間序列的長度,AR(p)模型的預測值是將過去p長度的時間序列的各真實值進行加權平均得到的。
I(d)差分:d為差分的階數。差分的目的是將原本不平穩的時間序列經過差分,轉化為更加平穩的序列。d的取值取決于原序列經過幾次差分后可以轉化為平穩或者弱平穩的序列。
MA(q)模型(MovingAverage):MA 模型適用于平穩的序列上,q也表示了過去的供預測的時間序列的長度,而通過MA模型進行的預測是將過去q個時間段的誤差值取不同權重進行累加,再同平穩序列的均值加和得到的。
基于上述的思想,ARIMA(p,d,q)模型先經過d階差分將原序列轉化為較為平穩的時間序列,再通過計算確定效果最好的p、q的值,最后通過p、d、q的取值建立一個ARIMA模型。
實現代碼如下:
import pandas as pd
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller
##通過數據的前288行計算p、d、q取值
filename = r'train13720.csv'
data = pd.read_csv(filename, index_col = 'timestamp').iloc[:288,:]
#畫出折線圖
#data.plot()
#plt.show()
#畫出自相關性圖
#plot_acf(data)
#plt.show()
#原始序列的平穩性檢測
print('原始序列的檢驗結果為:',adfuller(data['hourly_traffic_count']))
#返回值依次為:adf, pvalue p值, usedlag, nobs, critical values臨界值 , icbest, regresults, resstore
#單位檢測統計量對應的p 值顯著大于 0.05 , 說明序列可以判定為 非平穩序列
#對數據進行差分后得到 自相關圖和 偏相關圖
D_data = data.diff().dropna()
D_data.columns = [u'流量差分']
#畫出差分后的時序圖
#D_data.plot()
#plt.show()
#畫出自相關圖
#plot_acf(D_data)
#plt.show()
#畫出偏相關圖
#plot_pacf(D_data)
#plt.show()
print(u'差分序列的ADF 檢驗結果為: ', adfuller(D_data[u'流量差分'])) #平穩性檢驗
#一階差分后的序列的時序圖在均值附近比較平穩的波動, 自相關性有很強的短期相關性, 單位根檢驗 p值小于 0.05 ,所以說一階差分后的序列是平穩序列#
print(u'差分序列的白噪聲檢驗結果:',acorr_ljungbox(D_data, lags= 1)) #返回統計量和 p 值
#對模型進行定階
print(D_data)
#一般階數不超過 length /10,但由于計算性能限制,故暫取leneth/30
pmax = int(len(D_data) / 30)
qmax = int(len(D_data) / 30)
bic_matrix = []
#計算不同p、q值對應的準確性收益
#print(bic_matrix)
for i in range(pmax+1):
temp=[]
for j in range(qmax+1):
try:
a=ARIMA(data,(i,1,j)).fit().bic
temp.append(a)
except:
temp.append(None)
finally:
bic_matrix.append(temp)
print(bic_matrix)
bic_matrix = pd.DataFrame(bic_matrix) #將其轉換成Dataframe 數據結構
p,q = bic_matrix.stack().idxmin() #使用 idxmin 找出最小值的位置
print(u'BIC 最小的p值 和 q 值:%s,%s' %(p,q)) # BIC 最小的p值 和 q 值:0,1
#建立ARIMA 模型,ARIMA(0,1,1)
model = ARIMA(data, (p,1,q)).fit()
# model.summary2() #生成一份模型報告
# model.forecast(1) #進行1個時間單位的預測, 返回預測結果, 標準誤差, 和置信區間
print('predict data:')
print((model.forecast(1)[0][0]))
通過上述的代碼,我們就建立了一個關于該樣本的ARIMA模型,其模型的p、d、q參數分別為0、1、1。通過下述的代碼,使用該模型進行100步的預測:
p=0
d=1
q=1
result1=[]
for i in range(100):
temp=[]
data = pd.read_csv(filename, index_col = 'timestamp').iloc[i:288+i,:]
model = ARIMA(data, (p,d,q)).fit()
a = pd.read_csv(filename, index_col = 'timestamp').iloc[288+i:289+i,:].values[-1][0]
b = model.forecast(1)[0][0]
temp.append(a)
temp.append(b)
result1.append(temp)
result1=pd.DataFrame(result1)
print(result1)
得到實際觀察值和預測值如下,左側為觀察值,右側為預測值:
0 1
0 9 8.923906
1 12 8.957891
2 9 9.509028
3 6 9.455487
4 7 8.869332
.. .. ...
95 10 8.668516
96 5 8.893771
97 10 8.183186
98 15 8.506519
99 9 9.691928
[100 rows x 2 columns]
在論文《基于 ARIMA 模型的短時交通流實時自適應預測》(韓超,宋蘇 ,王成紅)中,作者根據他們的數據集求得了ARIMA(2,1,2)的模型,將其簡單挪用過來如下:
p=2
d=1
q=2
result2=[]
for i in range(100):
temp=[]
data = pd.read_csv(filename, index_col = 'timestamp').iloc[i:288+i,:]
model = ARIMA(data, (p,d,q)).fit()
a = pd.read_csv(filename, index_col = 'timestamp').iloc[288+i:289+i,:].values[-1][0]
b = model.forecast(1)[0][0]
temp.append(a)
temp.append(b)
result2.append(temp)
result2=pd.DataFrame(result2)
print(result2)
得到實際觀察值和預測值如下,左側為觀察值,右側為預測值:
0 1
0 9 8.787160
1 12 8.915429
2 9 9.263472
3 6 9.627119
4 7 9.185042
.. .. ...
95 10 9.379399
96 5 9.061870
97 10 8.501785
98 15 8.161913
99 9 9.204021
[100 rows x 2 columns]
還可以使用剛才提到的文章定義的評價指標進行結果分析,代碼如下:
def RE(r,p):
if r>p:
return (r-p)/r
else:
return (p-r)/r
rt1=[]
for i in result1.values:
temp=[]
for j in i:
temp.append(j)
temp.append(RE(i[0],i[1]))
rt1.append(temp)
c=0
sum=0
for i in rt1:
if i[-1]!=float('inf'):
s=float(i[-1])
sum+=s
c+=1
print(c)
print(sum/c)
rt1=pd.DataFrame(rt1)
print(rt1)
rt2=[]
for i in result2.values:
temp=[]
for j in i:
temp.append(j)
temp.append(RE(i[0],i[1]))
rt2.append(temp)
c=0
sum=0
for i in rt2:
if i[-1]!=float('inf'):
s=float(i[-1])
sum+=s
c+=1
print(c)
print(sum/c)
rt2=pd.DataFrame(rt1)
print(rt2)
得到兩個模型的預測評價如下:
95
0.48252386991776014
0 1 2
0 9.0 8.923906 0.008455
1 12.0 8.957891 0.253509
2 9.0 9.509028 0.056559
3 6.0 9.455487 0.575914
4 7.0 8.869332 0.267047
.. ... ... ...
95 10.0 8.668516 0.133148
96 5.0 8.893771 0.778754
97 10.0 8.183186 0.181681
98 15.0 8.506519 0.432899
99 9.0 9.691928 0.076881
[100 rows x 3 columns]
95
0.46626540909769215
0 1 2
0 9.0 8.923906 0.008455
1 12.0 8.957891 0.253509
2 9.0 9.509028 0.056559
3 6.0 9.455487 0.575914
4 7.0 8.869332 0.267047
.. ... ... ...
95 10.0 8.668516 0.133148
96 5.0 8.893771 0.778754
97 10.0 8.183186 0.181681
98 15.0 8.506519 0.432899
99 9.0 9.691928 0.076881
[100 rows x 3 columns]
可以看到,即便是針對另外一個數據集,上述文獻構建的預測模型取得了約0.47的MAPE值,而自行計算得到的模型取得了約0.48的MAPE值,這說明文獻中構建的模型的預測結果總體上還是右于本次自行構建的模型的。
總結
以上是生活随笔為你收集整理的python交通流预测代码_使用ARIMA模型进行的短时交通流预测和结果分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wamp 配置 mysql_PHPWAM
- 下一篇: PhpStorm 配置debug断点调试