如何使用Python构建统计车辆通行数量的起讫点(OD)矩阵
基于过站数据构建OD矩阵实现方法
原有代码问题说明
原有代码直接将全量传感器列按行拆分两两组合,既未区分不同车辆的过站记录,也没有按照时间顺序匹配同一辆车的先后过站顺序,统计逻辑完全不符合OD矩阵的定义要求。
正确实现逻辑
OD矩阵统计的是同一辆车从起点O到终点D的通行次数,需要遵循以下逻辑实现:
- 转换时间字段为可排序的datetime格式,按车辆编号分组后,组内按时间升序排列,得到每辆车的过站顺序
- 对每辆车的过站传感器序列,将相邻两个站点组合为OD对,前一个为O、后一个为D
- 统计所有OD对的出现次数,转换为行列对应所有站点的矩阵格式
完整实现代码
import pandas as pd # 1. 预处理:转换时间格式,按车辆+时间排序保证过站顺序正确 df['time'] = pd.to_datetime(df['time']) df = df.sort_values(by=['vehicles', 'time']).reset_index(drop=True) # 2. 按车辆分组生成所有有效OD对 od_pairs = [] for vehicle, group in df.groupby('vehicles'): sensor_list = group['sensors'].tolist() # 只有1条过站记录的车辆无法形成OD对,直接跳过 if len(sensor_list) < 2: continue # 遍历生成相邻站点的OD对 for i in range(len(sensor_list)-1): o = sensor_list[i] d = sensor_list[i+1] od_pairs.append((o, d)) # 3. 统计次数生成OD矩阵 od_df = pd.DataFrame(od_pairs, columns=['O', 'D']) all_places = sorted(df['sensors'].unique()) od_matrix = pd.pivot_table( od_df, index='O', columns='D', aggfunc='size' ).reindex(index=all_places, columns=all_places, fill_value=0) print(od_matrix)
样例数据输出结果
对问题中给出的样本数据运行上述代码,输出结果如下:
D s1 s2 s3 s4 O s1 0 1 1 0 s2 0 0 0 1 s3 0 1 0 0 s4 0 0 0 0
内容的提问来源于stack exchange,提问作者Debiprasad Mishra
相关产品推荐
相关产品推荐

