我正在使用地理位置的社交媒体帖子,并使用DBSCAN对其位置(纬度/经度)进行聚类。在我的数据集中,我有许多用户多次发布,这使我可以得出他们的轨迹(从一个地方到另一个地方的时间有序排列)。例如:
3945641 [[38.9875, -76.94], [38.91711157, -77.02435118], [38.8991, -77.029], [38.8991, -77.029], [38.88927534, -77.04858468])
我已经为我的整个数据集导出了轨迹,我的下一步是聚类或聚合轨迹,以便识别位置之间密集移动的区域。关于如何在Python中处理轨迹聚类/聚合的任何想法?
以下是我一直在使用的一些代码来创建轨迹作为线串/ JSON dicts:
import pandas as pd
import numpy as np
import ujson as json
import time
# Import Data
data = pd.read_csv('filepath.csv', delimiter=',', engine='python')
#print len(data),"rows"
#print data
# Create Data Fame
df = pd.DataFrame(data, columns=['user_id','timestamp','latitude','longitude','cluster_labels])
#print data.head()
# Get a list of unique user_id values
uniqueIds = np.unique(data['user_id'].values)
# Get the ordered (by timestamp) coordinates for each user_id
output = [[id,data.loc[data['user_id']==id].sort_values(by='timestamp')[['latitude','longitude']].values.tolist()] for id in uniqueIds]
# Save outputs as csv
outputs = pd.DataFrame(output)
#print outputs
outputs.to_csv('filepath_out.csv', index=False, header=False)
# Save outputs as JSON
#outputDict = {}
#for i in output:
# outputDict[i[0]]=i[1]
#with open('filepath.json','w') as f:
#json.dump(outputDict, f, sort_keys=True, indent=4, ensure_ascii=False,)
修改
我遇到了一个python包,NetworkX,并且正在讨论从我的集群创建网络图的想法,而不是聚集轨迹线/段。关于聚类轨迹的任何意见v。将聚类转换为图形以识别位置之间的密集聚类移动。
答案 0 :(得分:1)
为了回答我自己1岁以上的问题,我提出了几个解决方案,尽管没有Python(这是我的希望),但已经解决了这个问题(以及类似的问题)。首先,使用一种方法,我使用ArcGIS在GIS StackExchange中为用户提供了一个用户,并使用了一些内置工具来进行线密度分析(https://gis.stackexchange.com/questions/42224/creating-polyline-based-heatmap-from-gps-tracks/270524#270524)。这将获取GPS点,创建线,对线进行分段,然后对其进行聚类。第二种方法使用SQL(主要是ST_MakeLine
)和Postgres / GIS / CARTO数据库来创建按时间戳升序排序的行,然后按用户分组(例如https://carto.com/blog/jets-and-datelines/)。然后,可以计算行出现的次数(假设点与清晰定义的质心相似,类似于上面的我的最初问题),并将其视为一个簇(例如Python/NetworkX: Add Weights to Edges by Frequency of Edge Occurance,https://carto.com/blog/alteryx-and-carto-to-explore-london-bike-data/)。 / p>