У меня есть набор данных (pandas dataframe) нескольких людей, которые имеют устройство 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 ()) до этой позиции, и если расстояние какой-либо из точек в окне больше, чемзаданный порог (скажем, 15 м), чем эти точки считаются «движущимися».
Я смотрел в Интернете, но не могу понять, как это сделать (без использования неэффективных циклов),Я хотел бы посмотреть что-то вроде этого:
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))
В идеале мы хотели бы, чтобы окно основывалось на времени и минимальном количестве точек данных, но это может усложнить задачу ... Есть предложения / идеи?