确定点是否在移动(熊猫窗口功能)

时间:2019-05-16 08:49:00

标签: python pandas coordinates rolling-computation

我有一个拥有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),则认为这些点在“移动”。

我已经在Internet上四处张望,但无法真正找到执行该操作的方法(不使用低效的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))

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

0 个答案:

没有答案