我有一个拥有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))
理想情况下,我们希望基于时间和最少的数据点来创建窗口,但这可能会使它更加困难... 有任何建议/想法吗?