Определить, движется ли точка (оконная функция панд) - PullRequest
1 голос
/ 16 мая 2019

У меня есть набор данных (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))

В идеале мы хотели бы, чтобы окно основывалось на времени и минимальном количестве точек данных, но это может усложнить задачу ... Есть предложения / идеи?

...