NGSIM数据集Python处理(车辆变道时本车道和目标车道前后车数据提取)

        在进行车辆直行变道的决策研究时,本车道前车和目标车道前后车的数据及其重要,这些数据直接影响到车辆变道动作执行的可能性,在一般的研究中,大多驾驶车辆采集车辆变道时相关的数据,但是由此得到的数据很少,且很难获得,也有一些研究通过手动筛选的方式,从已有数据集中获取部分研究数据,但手动筛选数据,务必导致效率低下且可能因为筛选的数据囊括的情况较少,直接影响到研究的真实、可靠性。NGSIM数据集具有量大质优的特点,但其原始数据中并未直接体现出上述的数据,本文使用Python代码的编写,实现上述数据的的提取。文章中仅概述代码大致逻辑和部分重点代码。

  • 变道车辆的判别

        首先通过Global_Time(或Frame_ID)的间断点,对同一Vehicle_ID的数据进行切割,以解决原始数据中ID复用的情况,而后通过车道差值列表,判断车道是否变道,此外若同一车辆进行多次变道,则将多次变道都视为单次变道进行提取,在这种情况下,若变道间隔时间太短,显然不具有研究意义,因此,在这里加入变量anser用于约束连续变道的最小间隔帧数,若变道间隔时间不满足要求,则将变道进行剔除。重点代码如下:

'''处理同一ID对应不同车辆问题'''
    lst_Global_Time = list(new_data.loc[:, 'Global_Time'])
    for i_0 in range(len(new_data) - 1):
        if lst_Global_Time[i_0 + 1] - lst_Global_Time[i_0] != 100:
            lst_c.append(i_0 + 1)

'''非回归连续变道视为多次单次变道'''
        for i in new_diff_lst_Lane_ID:  # i=(索引,属性值)
            if i[1] != 0:
                lst_index.append(i[0])
        b = list(np.diff(lst_index))
        for j in list(enumerate(b)):
            if j[1] <= answer:
                del lst_index[b.index(j[1]):b.index(j[1]) + 1]
  • 获取变道前后主车数据

        通过上述代码生成的lst_index获取变道前、后车道ID,获取主车在本车道、目标车道的数据,包括:临界时间,y坐标。速度以及变道时刻。以变道前主车信息获取为例,主体代码如下:

'''变道前主车信息获取'''
list_Changing_Lanes_Preceding_Global_Time = list(data_Changing_Lanes_Preceding['Global_Time'])
list_Changing_Lanes_Preceding_Y = list(data_Changing_Lanes_Preceding['Local_Y'])
list_Changing_Lanes_Preceding_v_Vel = list(data_Changing_Lanes_Preceding['v_Vel'])
time_0=list_Changing_Lanes_Preceding_Global_Time[-1]                 #获取变道时刻

        此外,需获取本车道前车ID和目标车道前后车ID数据。

list_Changing_Lanes_before_Preceding_ID = list(
data_Changing_Lanes_Preceding['Preceding'])  # 获取变道前前车ID列表
list_Changing_Lanes_after_Preceding_ID = list(
data_Changing_Lanes_Following['Preceding'])  # 获取变道后前车ID列表
list_Changing_Lanes_after_Following_ID = list(
data_Changing_Lanes_Following['Following'])  # 获取变道后后车ID列表
  • 获取目标数据

        获取变道时刻索引,结合上述代码获得的本车道前车,目标车道前、后车数据,获取最终数据,为确保最后数据可用,剔除有缺失车辆的数据。

index=list_Changing_Lanes_Preceding_Global_Time.index(time_0)              #获取变道时刻索引
data_before_P=data_time_1[data_time_1.Vehicle_ID==time_1_origin_Preceding_ID]      #获取变道时刻当前车道前车数据
data_after_P=data_time_1[data_time_1.Vehicle_ID==list_Changing_Lanes_after_Preceding_ID[0]]      #获取变道时刻目标车道前车数据
data_after_F=data_time_1[data_time_1. Vehicle_ID==list_Changing_Lanes_after_Following_ID[0]]     #获取变道时刻目标车道后车数据
  • 数据写入csv文件

        结果数据中,V_O表示变道时本车数据,V_before_P表示本车道前车速度,V_after_P表示目标车道前车速度,V_after_F表示目标车道后车数据,distance_before_O_P表示变道时本车和本车道前车距离,distance_after_O_P表示变道时目标车道前车和本车距离,distance_after_O_F表示变道时目标车道后车和本车距离。

代码如下:

finally_data_t.loc[0,'V_O']=time_1_origin_v_Vel
finally_data_t.loc[0, 'V_before_P'] = list(data_before_P['v_Vel'])[0]
finally_data_t.loc[0, 'V_after_P'] = list(data_after_P['v_Vel'])[0]
finally_data_t.loc[0, 'V_after_F'] = list(data_after_F['v_Vel'])[0]
finally_data_t.loc[0, 'distance_before_O_P'] = abs(time_1_origin_Y-list(data_before_P['Local_Y'])[0])
finally_data_t.loc[0, 'distance_after_O_P'] = abs(time_1_origin_Y - list(data_after_P['Local_Y'])[0])
finally_data_t.loc[0, 'distance_after_O_F'] = abs(time_1_origin_Y - list(data_after_F['Local_Y'])[0])

        最终数据输入为csv格式,数据结果示意如下:

 若有疑问,需完整代码或有交通数据处理需求欢迎VX探讨:A2528945820

评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

惜君如常

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

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

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

打赏作者

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

抵扣说明:

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

余额充值