我有一个包含纬度,经度和时间戳的GPS点的样本数据。
url = "https://raw.githubusercontent.com/csmontt/trajectory-sample/master/dayGPS.csv"
df = pd.read_csv(url)
为了确定有意义的位置(例如,家庭/工作位置),我运行了HDBSCAN算法,并为每个GPS点分配了一个群集。在此特定情况下,假设群集3对应于家庭位置,群集6对应于工作位置。我想做的是为每一行提供一个旅行ID,但仅适用于那些与上班或上班相关的旅行。我的最终结果应该像这样,通过删除带有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之后,我为每个行点创建了一个唯一的行程ID,然后将与我感兴趣的行相对应的IDS进行了子集化
trips = pd.factorize(df['cluster'].isin([3,6]).iloc[::-1].cumsum().sort_index())[0]
df['trip_id'] = trips
此解决方案有两个问题。首先,我必须“手动”识别出感兴趣的旅程ID,第二,我错过了每次旅程的首次观察,因为旅程的第一点应该以不同的唯一ID结束。
# 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
...
任何指针将不胜感激。谢谢!