利用卡口数据绘制路段基本图(出入量法)——Python交通数据分析

一、卡口数据简介

数据名称含义
DEVICEID设备ID
TRAVELID车辆ID,可分辨车辆
hpzl车辆类型,1表示大型车,2表示小汽车
SJ时间
LANEID车道编号,较长编号表示该位置处于上下游车道过渡区域,无划线;-1表示由于技术原因导致的无效计数,可忽略该检测值
LANNUM车道数
SPEED瞬时车速
TURN车道方向信息,LSR分别表示左直右及其组合,LU和RU分别表示左掉头和右掉头,LC表示上下游车道连接过渡段,表明此断面包含车道变化区域
FTNODE起始节点
卡口布设简图

在这里插入图片描述

二、路段基本图

绘出东进口道(下游检测器编号504,上游检测器编号508)的路段基本图,与断面基本图对比。

交通流特性(流速密)在断面、路段上的区别
利用卡口数据绘制断面基本图——Python交通数据分析

import numpy as np
import pandas as pd
from pandas import DataFrame
from numpy import *
import scipy
from scipy import stats
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
import matplotlib.dates as mdate
import time

kk_data = pd.read_csv('data/kk_data/kk.csv')
kk_data['SJ'] = pd.to_datetime(kk_data['SJ'])
kk_data['TRAVELID'] = kk_data['TRAVELID'].astype(str)  # 转化为字符串

kk_data_504 = kk_data[kk_data['DEVICEID'] == 504].copy()
kk_data_504 = kk_data_504.sort_values(by = 'SJ')
kk_data_504.rename(columns={'SJ':'OUT_SJ'},inplace=True)  # 重命名

kk_data_508 = kk_data[kk_data['DEVICEID']==508].copy()
kk_data_508 = kk_data_508.sort_values(by = 'SJ')
kk_data_508.rename(columns={'SJ':'IN_SJ'},inplace=True)

data_merge = pd.merge(kk_data_508,kk_data_504,on='TRAVELID',how='inner')
data_merge['time'] = data_merge['OUT_SJ'] - data_merge['IN_SJ']

#清洗数据,有的时间过短,有的时间过长,还有的进口道时间晚于出口道时间
wrong_data = data_merge[(data_merge['time'] < pd.Timedelta(seconds=5)) | (data_merge['time'] >= pd.Timedelta(minutes=3))]
wrong_data_TRAVELID = wrong_data['TRAVELID'].tolist()
for i in wrong_data_TRAVELID:
    kk_data_508 = kk_data_508[kk_data_508['TRAVELID']!=i]
    kk_data_504 = kk_data_504[kk_data_504['TRAVELID']!=i]
data_merge = data_merge[(data_merge['time'] > pd.Timedelta(seconds=5)) & (data_merge['time'] <= pd.Timedelta(minutes=3))]

kk_data_508 = kk_data_508.reset_index()  # 清洗了时间异常的数据之后,索引会出现问题,需要重新设定索引
kk_data_504 = kk_data_504.reset_index()
data_merge = data_merge.reset_index()

# 进口道下游数据远多于进口道上游数据,不合理,需要对上下游的数据进行再次清洗
data_merge_TRAVELID = data_merge['TRAVELID'].tolist()

labels_list = []
# 避免清洗在路段上的原始车辆,从第六辆车开始遍历
for i in range(5,len(kk_data_504)):
    ID = kk_data_504['TRAVELID'].iloc[i]
    if ID not in data_merge_TRAVELID:
        labels_list.append(i)
kk_data_504.drop(labels=labels_list,axis=0,inplace=True)
kk_data_504 = kk_data_504.reset_index()

# 避免删除在最后时刻进入路段的车辆,最后十辆车不遍历
labels_list = []
for i in range(0, (len(kk_data_508) - 10)):
    ID = kk_data_508['TRAVELID'].iloc[i]
    if ID not in data_merge_TRAVELID:
        labels_list.append(i)
kk_data_508.drop(labels=labels_list,axis=0,inplace=True)
kk_data_508 = kk_data_508.reset_index()

# 计算每辆车的速度
time = data_merge['time']
sec = []
V = []
for i in range(0,len(time),1):
    sec.append(time[i].seconds)
    V.append((300/time[i].seconds)*3.6)
data_merge['sec'] = sec
data_merge['V'] = V

# 路段基本图
# 出入量法,统计每一分钟路段上的车辆数
# 结合处理过后的数据与原始进出口数据,原始车辆数E=2
E = 2
K = []
Q = []
time = pd.datetime(2019,7,9,6,0)
while(time < pd.datetime(2019,7,9,10,0)):
    data_IN = kk_data_508[(kk_data_508['IN_SJ']>=time) & (kk_data_508['IN_SJ']<(time+pd.Timedelta(minutes=1)))].copy()
    data_OUT = kk_data_504[(kk_data_504['OUT_SJ']>=time) & (kk_data_504['OUT_SJ']<(time+pd.Timedelta(minutes=1)))].copy()
    data_V = data_merge[(data_merge['OUT_SJ']>(time+pd.Timedelta(minutes=1))) & (data_merge['IN_SJ']<=(time+pd.Timedelta(minutes=1)))].copy()
    count = len(data_IN) - len(data_OUT)
    E = E + count
    V_mean = data_V['V'].mean()
    K.append(E / (2 * 0.3))  # 辆/(千米*车道)
    Q.append(V_mean * (E / (2 * 0.3)))  # Q=K*V
    time = time + pd.Timedelta(minutes=1)

# 断面基本图
def kk(kk_data):
    kk_data['1/SPEED'] = 1 / kk_data['SPEED']
    kk_data_group = kk_data.groupby(['DEVICEID',pd.Grouper(key='IN_SJ',freq='5min')])
    kk_data_flow = kk_data_group['DEVICEID'].count()
    kk_data_flow = kk_data_flow * 12  # 在交通测量平台的显示中,东进口上游的车道数为1,但在数据中,车道数为2,此处设定为1
    kk_data_speed = 1 / (kk_data_group['1/SPEED'].mean())
    return kk_data_flow,kk_data_speed
kk_flow,kk_speed = kk(kk_data_508)
kk_density = kk_flow / kk_speed


plt.xlabel('K: veh/km/lane')
plt.ylabel('Q: veh/h/lane', rotation=360, horizontalalignment='right', verticalalignment='center')
plt.scatter(K,Q)
plt.scatter(kk_density,kk_flow)
plt.legend(['Road','Section'])  # Road路段,Section断面
plt.show()

在这里插入图片描述
注意,东进口道可能并不是一条封闭的路段,才需要清洗这么多数据
水平有限,仅供参考,有错误请指出

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
Python是一种强大的编程语言,可以用来处理各种类型的数据,包括交通卡口数据。 首先,我们可以使用Python中的文件操作功能,读取交通卡口数据文件。可以使用内置的open函数打开文件,并使用read方法读取文件内容。如果数据文件是以逗号分隔的CSV文件,我们可以使用Python的csv模块来解析数据。 一旦我们成功读取了交通卡口数据,我们可以使用Python中的数据分析库,如Pandas和NumPy,来处理数据。这些库提供了丰富的函数和方法,可以对数据进行清洗、筛选、分组、聚合等操作。我们可以使用这些库来计算每个卡口的平均通行时间、最大通行速度等统计信息。我们还可以使用这些库来绘制数据表,如折线、柱状等,以便更直观地理解数据。 此外,Python还有一些专门用于地理数据处理的库,如Geopandas和Folium。这些库提供了地理数据的可视化和分析能力。我们可以使用这些库来绘制交通卡口的地理位置,分析不同地区的交通状况等。 最后,对于更复杂的交通卡口数据处理需求,可以使用Python中的机器学习和人工智能库,如Scikit-learn和TensorFlow。这些库提供了各种机器学习算法和深度学习模型,可以用于交通数据的预测、异常检测、模式识别等任务。 总之,Python是一种功能强大的编程语言,可以用来处理各种类型的数据,包括交通卡口数据。通过使用Python中的文件操作、数据分析、地理数据处理和机器学习库,我们可以对交通卡口数据进行清洗、分析、可视化和预测等多种处理操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弈-剑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值