Идентификация поездок из точек GPS - PullRequest
0 голосов
/ 17 июня 2019

У меня есть пример данных о точках GPS с широтой, долготой и отметкой времени.

url = "https://raw.githubusercontent.com/csmontt/trajectory-sample/master/dayGPS.csv"
df = pd.read_csv(url)

Для определения значимых местоположений (например, дома / рабочего места) я запустил алгоритм HDBSCAN и назначил каждой точке GPS кластер.В этом конкретном случае давайте предположим, что кластер 3 соответствует местоположению дома, а кластер 6 соответствует местоположению работы.Что я хочу сделать, так это дать каждому ряду идентификатор поездки, но только для тех поездок, которые соответствуют дому на работу или работе на дом.Мой конечный результат должен выглядеть следующим образом, что позволило бы мне избавиться от неинтересных мне наблюдений, отбросив ряды с NA

df
Out[24]: 
     Unnamed: 0        lat   ...                datetime  cluster   trip_id
5          6527  52.497950   ...     2018-11-14 07:52:05        3      NA
6          6528  52.499457   ...     2018-11-14 08:01:34        3       1
7          6529  52.504406   ...     2018-11-14 08:04:57        2       1
8          6530  52.508824   ...     2018-11-14 08:14:33       -1       1
19         6541  52.526574   ...     2018-11-14 08:53:55        5       1
21         6543  52.528029   ...     2018-11-14 08:57:59        6       1
22         6544  52.527763   ...     2018-11-14 09:03:30        6      NA
78         6600  52.523626   ...     2018-11-14 20:07:18        6       2
79         6601  52.522004   ...     2018-11-14 20:09:49       -1       2
85         6607  52.518066   ...     2018-11-14 20:21:23        4       2
86         6608  52.504473   ...     2018-11-14 20:41:05        2       2
95         6617  52.500502   ...     2018-11-14 20:56:03        3       2
96         6618  52.498646   ...     2018-11-14 20:57:38        3      NA

Вместо того, что я до сих пор достиг после этого post - создание уникального идентификатора поездки для каждой точки строки, а затем я выделил те IDS, которые соответствуют интересующим меня строкам.

trips = pd.factorize(df['cluster'].isin([3,6]).iloc[::-1].cumsum().sort_index())[0]
df['trip_id'] = trips

Есть две проблемыс этим решением.Во-первых, мне нужно «вручную» идентифицировать интересующие идентификаторы поездки, а во-вторых, я пропускаю первое наблюдение за каждой поездкой, так как первая точка поездки заканчивается уникальным идентификатором.

# get only trips of interest
# Though I am missing first observation of each trip!! I need to select
# them separately. 
df = df[(df.trip_id == 6) | (df.trip_id == 7) | (df.trip_id == 55) | (df.trip_id == 56)]

df
Out[137]: 
 Unnamed: 0        lat         ...     cluster  trip_id
                               ...
  5          6527  52.497950   ...           3        5
  6          6528  52.499457   ...           3        6   # should be 7!
  7          6529  52.504406   ...           2        7
  8          6530  52.508824   ...          -1        7
                               ...
  20         6542  52.527379   ...           5        7
  21         6543  52.528029   ...           6        7   # this is fine
                               ...
  77         6599  52.524396   ...           6       54
  78         6600  52.523626   ...           6       55   # should be 56!
  79         6601  52.522004   ...          -1       56
  80         6602  52.520797   ...          -1       56
                               ...

Любые указатели будут высоко оценены.Спасибо!

...