У меня есть пример данных о точках 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
...
Любые указатели будут высоко оценены.Спасибо!