ni1o1 / transbigdata

A Python package develop for transportation spatio-temporal big data processing, analysis and visualization.
https://transbigdata.readthedocs.io/en/latest/
BSD 3-Clause "New" or "Revised" License
455 stars 115 forks source link

`traj_clean_drift`函数的筛选条件似乎不对 #73

Closed InEase closed 1 year ago

InEase commented 1 year ago

作者您好,非常感谢您的开源工作以及各个平台上的详实教程,实在是让我受益良多,最近在使用您的库做实验的时候,发现排除异常点的算法似乎不对,还望您不吝赐教。

Describe the bug

具体位置在:

https://github.com/ni1o1/transbigdata/blob/21a4da0db9e2c38d0376786d954febb570f57ddc/src/transbigdata/traj.py#L344-L349

这个部分是根据速度限制对数据进行清理,超过speedlimit的部分将会被去掉,但是源代码中的语义似乎是当前,后的速度都超过阈值,且忽略中间点的前后速度小于阈值才把这一行去掉,但是这个是几乎不可能实现的条件呀,正确的语义我猜应该是:任意一个速度值超过阈值就把这一行去掉。所以这里应该改成:

            data1 = data1[
                -((data1[VehicleNum+'_pre'] == data1[VehicleNum]) &
                  (data1[VehicleNum+'_next'] == data1[VehicleNum]) &
                    ((data1['speed_pre'] > speedlimit) |
                    (data1['speed_next'] > speedlimit) |
                    (data1['speed_prenext'] < speedlimit)))]

此外,为了加快代码效率,我觉得后面的这个判断条件应该放在前面,大部分条件下不满足速度超过阈值的条件,就可以直接短路了。这是进一步格式化之后的代码:

            data1 = data1[
                -(
                        (
                                (data1['speed_pre'] > speedlimit) |
                                (data1['speed_next'] > speedlimit) |
                                (data1['speed_prenext'] > speedlimit)
                        ) &
                        (
                                (data1[VehicleNum + '_pre'] == data1[VehicleNum]) &
                                (data1[VehicleNum + '_next'] == data1[VehicleNum])
                        )
                )]

同理,后面的距离限制和角度限制也需要作此修改。

ni1o1 commented 1 year ago

在轨迹数据处理中,假设我们有前一条轨迹A,当前轨迹B,以及后一条轨迹C。我们采用以下思路来判断是否存在漂移现象需要进行删除操作:

如果A与B之间的速度差过大,并且B与C之间的速度差也过大,但是A与C之间的速度差并不大,那么我们认为轨迹B是处于漂移状态的。因为在轨迹数据中,有可能出现某一点的信号误差导致其与实际情况的距离相差较大,此时轨迹B是异常的,而A与C的轨迹是正常的,因此需要将轨迹B删除。

WechatIMG560

这种判断思路是"双向"的,正因为其条件几乎不可能实现,所以如果发现这种情况就需要进行删除操作。

相比之下,你提出的判断思路是"单向"的,只考虑了连续两条轨迹的情况。例如,如果发现A与B之间的速度差过大,那么删除轨迹B。然而,由于车辆在某一时刻可能会有瞬时速度较大的情况,因此这样的判断可能并不准确。

在TransBigData0.5.1版本中,我们的traj_clean_drift方法提供了一个名为method的参数,可选值为'twoside'和'oneside',分别考虑了上述的两种情况。默认情况下,我们使用'twoside'方法进行判断。

此外,无论条件判断是放在前面还是后面,都不会影响计算效率。在DataFrame进行条件筛选时,条件是通过列运算先计算出来,然后再进行索引操作。

InEase commented 1 year ago

受教了,感谢!我再琢磨琢磨!!

InEase commented 1 year ago

您好,再次感谢您的答复!我想再打扰一下(* ̄3 ̄)╭ 查了更多资料之后原来的算法确实没有任何问题。我想再确认一下我的理解是不是正确的(;´д`)ゞ。

就是method=twoside是不是只能解决在一个连续的轨迹序列上突然出现的一个漂移点,如果这个轨迹长的比较奇怪,比如有两个或者以上的连续漂移点,那好像就不行了。比如下图所示的这个轨迹:

image

这种情况下是不是就只能使用oneside的单边过滤来把它去掉了QAQ

再次感谢您的答复!附上轨迹数据:22250.csv 以及traj_clean_drift方法的中间变量data1中对应的这一段:data1.csv

异常点出现在: image

ni1o1 commented 1 year ago

是的,如果出现了这种情况,确实是以目前的漂移筛选方法无法进行剔除。但可以用clean_outofboundsclean_outofshape将研究范围以外的数据剔除