首页 > 解决方案 > 确定点是否在移动(熊猫窗口函数)

问题描述

我有多个人的数据集(熊猫数据框),这些人拥有 gps 设备并随着时间的推移跟踪他们的位置。这个数据集看起来像这样:

person_id | timestamp               | latitude | longitude
1         | 2019-05-15 10:01:53.231 | 10.00110 | 5.64321
1         | 2019-05-15 10:02:54.131 | 10.00310 | 5.64322
1         | 2019-05-15 10:03:55.331 | 10.00210 | 5.64325
1         | 2019-05-15 10:05:00.731 | 10.00410 | 5.64421
1         | 2019-05-15 10:06:48.434 | 10.00510 | 5.64121
1         | 2019-05-15 10:07:24.189 | 10.01110 | 5.63321
1         | 2019-05-15 10:08:53.231 | 10.02110 | 5.62821
2         | 2019-05-15 10:02:41.111 | 10.01131 | 5.64320
2         | 2019-05-15 10:03:47.221 | 10.01132 | 5.64322
2         | 2019-05-15 10:05:53.121 | 10.01130 | 5.64321
2         | 2019-05-15 10:07:24.564 | 10.01401 | 5.64331
etc.

因此,GPS 设备会频繁测量其位置。有时我们会遗漏一些点,但总的来说数据集非常好。然而,由于设备/GPS 的准确性,即使您没有移动,GPS 坐标也会跳动一点。

我想要做的是添加一列,指示一个人是否在移动。为此,我想到了一个滚动窗口,计算该窗口中的平均位置,然后计算到该位置的距离(geopy.distance.distance())以及窗口中任何点的距离是否大于一个给定的阈值(比如 15m)比这些点被认为是“移动的”。

我在互联网上环顾四周,但无法真正找到如何做到这一点(不使用低效的 for 循环)。我会研究这样的事情:

df['moving'] = df.groupby(['mmsi']).rolling(
    window=10).apply(
        ... some function here, like:
        np.any([distance(
            lat_mean,
            lon_mean,
            row_lat,
            row_lon
        ) for row in window] > threshold))

理想情况下,我们希望拥有基于时间和最少数据点的窗口,但这可能会使它变得更加困难......有什么建议/想法吗?

标签: pythonpandascoordinatesrolling-computation

解决方案


推荐阅读