2022/4/22 15:52:16 阅读:324 发布者:chichi77
以下文章来源于立方数据学社 ,作者小黄鸭
本篇我们带来出租车GPS数据清洗和分析的技术要点!首先我们先来看看出租车GPS数据的清洗!
出租车GPS数据的清洗
在时空大数据中,可以说基本上不存在完美的数据。数据集的各类错误异常情况普遍存在,而且很可能在意想不到的地方出现。因此,针对异常数据的清洗是在数据的正式处理分析之前必须做的重要步骤。缺少这一步骤,在后续的处理中很可能产生错误的分析结果。在出租车GPS数据中也不可避免地存在一定的数据异常。这里我们以数据中存在的异常载客状态为例,介绍数据异常的情况以及数据清洗的思路。
01
出租车数据载客字段异常情况
先来回顾一下出租车GPS数据的核心字段:
车辆ID(VehicleNum)
经度(Lat)
纬度(Lng)
时间(Stime)
载客状态(OpenStatus)
数据中的载客状态(OpenStatus)字段表征了出租车载客状态。当值为1时,出租车有乘客,为载客状态;反之则为空载状态。如果我们将所有的车辆数据读取在一个表中,将数据按车牌号和时间排序。那么在理想状态下,一辆出租车正常的OpenStatus序列应该如图1所示,连续0序列和连续1序列依次出现。
图1 正常情况下一辆出租车的载客状态
当OpenStatus的值由A时刻的0变为B时刻的1时,代表乘客在A时刻与B时刻中间的某一时刻上车,运营开始。同样,当OpenStatus的值由C时刻的1变为D时刻的0时,代表乘客在C时刻与D时刻中间的某一时刻下车,运营结束。由于出租车的采样频率约为15s一次,我们可以近似地认为相邻采样点在时间和空间上十分相近,A、B两个时刻都可以看成是乘客的上车点;同样地,C时刻和D时刻都可以看成是下车点。为了数据处理的方便,我们统一把A时刻看成是乘客的上车点,C时刻看成是乘客的下车点。
但是,OpenStatus字段中可能会出现异常情况(如图2所示):
图2 载客状态的异常情况
情况一,在连续0的序列中,突然出现一个1。如果用我们刚才判断乘客上下车处理逻辑,异常数据会导致乘客上下车点连续的两条记录,如果我们没有剔除,后续的出行OD分析中则会表现为在同一地点上下车。
情况二,在连续1的序列中,突然出现一个0。我们不排除某些出租车司机生意火爆,上一个订单结束后来不及休息就可以马不停蹄地开始下一单。但考虑到GPS数据15s的采样间隔,要在15-30s的时间内实现一个乘客付钱、下车、另一个乘客上车、关上车门、开始打表的一系列过程,对两个乘客来说可能是难度系数较高的操作,可以认为这是一种小概率事件。
这种两种情况的产生都极有可能是采集设备的突发异常造成的,在数据清洗中,应将这两种情况都予以剔除。
02
出租车载客字段异常清洗思路
如何剔除上面提到的两种数据异常呢?我们可以很容易地说出这两种异常都具有的共同特征:
异常数据的载客状态与前一条数据和后一条数据的值均不同。
这三条数据必须是同一辆出租车的连续数据。
也就是,程序只需要找到符合上述特征的数据,并将其剔除即可。如果将上面的条件总结成为程序中判断条件则为:
异常数据的OpenStatus与前一条数据不等;
异常数据的OpenStatus与后一条数据不等;
异常数据的VehicleNum与前一条数据的VehicleNum相等;
异常数据的VehicleNum与后一条数据的VehicleNum相等;
将上面的这四个条件用和(&)连接起来,所判断的即为异常数据,而将异常数据剔除,就完成了清洗。
出租车GPS数据的分析
数据清洗好后,就可以来做分析了,我们总结了基于出租车GPS数据常做的三个分析内容,分别为:
提取出租车订单的OD,来分析乘客的打车需求
提取出租车的行动轨迹,来分析载客里程、车速、油耗、排放等
将出租车的行动轨迹与地图匹配,来分析道路流量、道路车速等
我们依次来看一下!
01
提取出租车订单的OD
OD(Origin-destination)信息是时空大数据中的重要信息,其中O代表出行的出发点,D代表出行的目的地。OD提取的目的就是识别乘客出行的起讫点,能直观反映出乘客的上车、下车需求,常作为道路交通规划和城市布局等领域的研究手段。要怎样从大量的GPS信息中提取出每个出租车订单的起点和终点呢?
由于我们拿到的是一大堆出租车GPS的散点时空数据,散点时间间隔大概在15s(取决于GPS的采样频率),因此要提取出乘客出行的OD信息,首先要定义乘客的上车时点、下车时点选取标准,然后基于标准将上、下车时点数据筛选出来,最后整理成最终的OD数据。
1. 上、下车时点选取标准定义
如果把出租车GPS数据按照载客状态(OpenStatus)区分颜色后在空间中画出来,得到的就是如图3所示的出租车轨迹点数据:蓝色是空载,红色是载客,把数据点连接起来想象成一段段由两个点形成的轨迹段。
图3 出租车GPS数据表和对应轨迹图
我们定义上车时点其特征是这一时刻载客状态(OpenStatus)是0(蓝色),下一个时刻为1(红色),下车时点其特征是这一时刻载客状态(OpenStatus)是1(红色),下一个时刻为0(蓝色)。
2. 上、下车时点数据提取
有了上下车时点的标准后,就要提取出符合标准特征的时点数据。由于其特征需要这一时刻和下一时刻的载客状态(OpenStatus)数据,所以可以考虑这样实现(以python实现为例说明思路):
清洗后的数据按车辆ID(VehicleNum)、时间(Stime)进行排序;
用python的shift方法,把数据表整体往上移一行;
将原表与上移后的表拼接起来,在一行中得到了同一车辆当前时刻和下一时刻的GPS信息,如图4所示样例;
按以下条件提取出乘客上车、下车的时点数据:
同一辆车限制条件 – VehicleNum和VehicleNum1相等;
乘客上车时点限制条件 - OpenStatus(当前时刻载客状态)为0,OpenStatus(下一时刻载客状态)为1;
乘客下车时点限制条件 - OpenStatus(当前时刻载客状态)为1,OpenStatus(下一时刻载客状态)为0。
图4 出租车GPS数据表Shift拼接后样例
3. 整理OD数据
上一步中我们提取出了同一车辆前后时刻发生载客状态变化的数据,得到了每辆出租车的乘客上车时点、下车时点GPS数据,相当于车辆的订单数据,一个车有多个订单,很多的上车信息、下车信息,但同一个订单的上车、下车信息不在同一行上,因此我们还需要整理一下,把同一订单的上、下车时点信息处理到同一行上。
我们用上一步中类似的思路,借助python的shift方法,把提取出来的订单数据整体往上移一行,和移动前的订单数据拼在一起后,得到了如图5所示数据,按以下条件进行筛选就能得到在一行上的订单数据:
同一辆车限制条件 – VehicleNum和VehicleNum1相等;
载客起始状态限制条件 - OpenStatus(当前时刻载客状态)为0。
图5 出租车GPS上、下车时点数据表Shift拼接后样例
最后筛选保留车辆ID(VehicleNum)、上下车的时间(Stime、Stime1)和位置(Lng、Lat、Lng1、Lat1)字段,整理得到最终的OD信息。
02
提取出租车的行动轨迹
在OD提取中,我们只分析了出租车订单的起点和终点信息,并没有刻画车的行程轨迹。要想刻画出租车的行程轨迹,就得把每一个有效的采样位置数据都用上,理论上采样频率越高,就越逼近车辆的真实行驶路径。
同OD提取类似,我们拿到的是一大堆的GPS点数据,假设蓝色圆圈是空载状态,红色是载客状态,就可以做出轨迹点的分布,然后将GPS点数据处理成轨迹段数据,也就是将两个时间临近的有效采样点连接起来行成有向轨迹段,如图7所示。基于轨迹段数据,可以进一步结合载客状态(OpenStatus)提取出载客的轨迹段,从而扩展计算每个载客轨迹段的载客里程、车速,有了里程和速度后,还能分析油耗、排放等情况。
图6 出租车GPS轨迹点、轨迹段示例图
那么,如何把GPS点数据处理成轨迹段数据呢?提取思路整体来看与OD提取类似。
我们的目标是把GPS点转成段,每一段以相邻时间的两个GPS点作为信息。我们一起来看一下初始数据结构和目标数据结构的样式:
初始数据结构:轨迹点数据(图7)
目标数据结构:轨迹段数据(图8)
要将点数据转换成段数据,就需要把当前时点的GPS数据和下一时点的数据放到同一行上来,这样每一行数据表示的是一个轨迹段。
图7 出租车GPS轨迹点数据结构示例图
图8 出租车GPS轨迹段数据结构示例图
处理思路和OD提取一样:
清洗后的数据按车辆ID(VehicleNum)、时间(Stime)进行排序;
用python的shift方法,把数据表整体往上移一行;
将原表与上移后的表拼接起来,得到轨迹段数据;
基于轨迹段数据可以扩展计算其他指标,如距离、车速、排放等;
加字段区分轨迹段的载客状态,如第一次空载、第一次载客、第二次空载……
03
将出租车的行动轨迹与地图匹配
最后来介绍一下地图匹配,地图匹配指的是将GPS轨迹数据与实际的道路地图进行匹配,实现车辆空间属性与GIS信息的对应,可以得到车辆各时间点经过的道路信息,进而分析道路流量、道路车速计算等,为研究道路交通状态提供支撑。
图9 地图匹配示例图
地图匹配通常来说有两种思路:
不考虑连续路径近邻匹配
考虑连续路径的匹配
1. 不考虑完整路径近邻匹配
第一种思路比较简单,就是把GPS点匹配到最近的线上,也就是点与线之间的近邻匹配,比如出租车GPS点在某些道路线的两边,那我们要把这个点匹配到最近的道路线上去。这种思路可以用KDTree近邻匹配来实现,它是一个常用的点匹配线的快速算法,这里推荐一个python上非常好用的时空大数据处理的第三方包——transbigdata包(介绍文档:https://transbigdata.readthedocs.io/zh_CN/latest/),下面以用这个工具为例介绍一下数据处理的思路:
清洗得到出租车GPS数据表(点数据,gdfA);
获取对应区域的道路数据表(线数据,gdfB);
Python调用transbigdata包中的ckdnearest_line函数,transbigdata.ckdnearest_line(gdfA,gdfB),将点数据和先数据作为参数输入后,就能直接得到匹配的结果表。
这种方法优点是计算效率高,因为KDTree是考虑了计算效率后的点线近邻匹配优化算法,它会以最快的效率去应对点线匹配问题。
缺点就是没法考虑完整的路径。真实世界的出租车辆走的是连续的道路,点线近邻匹配算法只基于单个点来考虑最近的道路,没有考虑车前后道路的关系,有可能在实际道路中前面的路没法转到后面的路上来。
2. 考虑完整路径的匹配
如果要考虑车辆完整出行路径,就得用第二种思路:路网匹配,比如python包中的LeuvenMapMatching算法,这个算法会考虑整条行车轨迹在路网上是否符合逻辑,前后路段必须是接得上的才能匹配出来。
优点是得到的结果是可推测的完整路径;缺点是这个包的算法参数很多,调参复杂,匹配成功率较低,特别是当数据点太过稀疏的时候很可能匹配不上,计算时间会非常长。
如有侵权,请联系本站删除!