首先要讲的是,在短时交通流预测领域,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模型进行的短时交通流预测和结果分析相关推荐

  1. python 人民币兑美元汇率代码_人民币对美元汇率的大数据分析与预测【完整代码】...

    ## 导入所需的包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import tensorflow a ...

  2. 数据分享|SAS与eviews用ARIMA模型对我国大豆产量时间序列预测、稳定性、白噪声检验可视化...

    全文链接:http://tecdat.cn/?p=31480 我国以前一直以来都是世界上大豆生产的第一大国.但由于各国的日益强大,导致我国豆种植面积和产量持续缩减.因此,预测我国的大豆产量对中国未来的 ...

  3. python数据预测代码_手把手教你用Python玩转时序数据,从采样、预测到聚类丨代码...

    原标题:手把手教你用Python玩转时序数据,从采样.预测到聚类丨代码 原作 Arnaud Zinflou 郭一璞 编译 时序数据,也就是时间序列的数据. 像股票价格.每日天气.体重变化这一类,都是时 ...

  4. python分析每月销售数据_时间序列ARIMA模型详解:python实现店铺一周销售量预测...

    顾名思义,时间序列是时间间隔不变的情况下收集的时间点集合.这些集合被分析用来了解长期发展趋势,为了预测未来或者表现分析的其他形式.但是是什么令时间序列与常见的回归问题的不同? 有两个原因: 1.时间序 ...

  5. python皮卡丘编程代码_再接再厉,用python编程13行代码解方程组(纯字符)

    因为是示例为主,我们将方程组限制在二元一次方程组:x,y两个变量,两个方程.类似这样: 每个方程有两个变量,x和y,形式为:ax+by+c=d 由于这次有了两个方程,我们提取参数的代码就适合提炼为一个 ...

  6. python怎么测试c代码_如何正确测试python中的C-API,C-API返回错误代码

    我的设置 我正在使用Python中的pytest和ctypes测试C库中的函数.C库中的每个函数调用一个嵌入式linux PCI板上的函数,然后C库函数返回一个整数,该整数映射到一组返回代码.如果函数 ...

  7. python爬取交通违法记录查询_如何查询已交罚款的交通违法记录

    展开全部 1.到当地的交管所进行查询 2.使用微信进行查询,微信钱包里的微信城市服e69da5e887aa62616964757a686964616f31333365646234务里有机动车查询,可以 ...

  8. Pyhon中利用GM(1,1)和ARIMA模型对卫星DCB值进行预测

    卫星DCB值预测 预测分析 预测效果 预测结论 GM(1,1)源码 ARIMA源码 预测分析 DCB产品的稳定性会受到多个因素的影响,如地磁或太阳活动.卫星零均值基准变化等,这些影响会导致DCB的部分 ...

  9. arima 公式_时间序列 ARIMA 模型 (三)

    先看下图: 这是1986年到2006年的原油月度价格.可见在2001年之后,原油价格有一个显著的攀爬,这时再去假定均值是一个定值(常数)就不太合理了,也就是说,第二讲的平稳模型在这种情况下就太适用了. ...

最新文章

  1. Linux运行项目部分空指针,技术文章—Linux编程时遇到Oops提示该如何排查?
  2. php use as是什么意思,use关键字在PHP中的几种用法
  3. 阿里云峰会 | AI搜题加速在线教育行业场景创新
  4. 调查一下 大家用vs时做网页时,都用的什么标准?
  5. 华硕ROG游戏手机2跑分曝光:骁龙855 Plus加持 性能难逢对手
  6. Python文件操作与matplotlib数据可视化案例一则
  7. vSphere 故障排除之工具篇
  8. 【报告分享】清华大学-2019人工智能发展报告.pdf(附394页报告下载链接)
  9. Flutter进阶—解析动画
  10. 很喜欢的一首歌曲《Take me to your heart》
  11. [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能
  12. 流程机器人 RPA:AI落地的接盘侠 | 甲子光年
  13. java高级工程师个人简历模板
  14. win10各个版本激活码到期了
  15. 实名寻人搜索引擎app_谷歌搜索引擎寻人
  16. struts2与jasperreport整合其余问题
  17. 质因数分解,(结果简化版)
  18. 2022西式面点师(高级)操作证考试题模拟考试平台操作
  19. sailfish:不需要比对的转录本定量软件
  20. Conda更新速度慢、更换源

热门文章

  1. ruby 的while
  2. 《计算机科学与工程导论:基于IoT和机器人的可视化编程实践方法第2版》一1.1 计算机科学和工程的课程体系及职业发展...
  3. Canvas 画占比图 解决canvas锯齿 bug
  4. mongodb自动关闭:页面文件太小,无法完成操作
  5. SQL Sever中SQL语句语法,适合初学者使用
  6. 大数据平台不是救世主!做好数字化转型,得先解决这一问题
  7. 斯坦福大学机器学习公开课视频及课件
  8. C++女程序员一个人留在北京
  9. 飞鸽传书发现这个讲稿对现场
  10. 更改Web.config中对上传文件大小限制