出租车轨迹处理(一):预处理+DBSCAN聚类+gmplot可视化

因为项目需要,要处理一些轨迹数据,借此机会,也算是熟悉了一下pandas。本以为会用到很多numpy的功能,截止到现在发现pandas完全可以胜任所有任务。
按照我的想法, 后续的数据处理会包括可视化(matplotlib+gmplot)、聚类分析(DBSCAN、K-means等)和时间序列分析(目前如何实施还没想好,所以不确定是用python还是ENVI、Arcgis)。
同时,若有需要,可以借此学一下数据库(mysql、MongoDB等)。

1、认识数据

我要处理的是2015年成都市的出租车数据
数据格式及示例为:
出租车ID,纬度,经度,载客状态(1表示载客,0表示无客),时间点
1, 30.4996330000,103.9771760000,1,2014/08/03 06:01:22
1, 30.4936580000,104.0036220000,1,2014/08/03 06:02:22
2, 30.6319760000,104.0384040000,0,2014/08/03 06:01:13
2, 30.6318830000,104.0366790000,1,2014/08/03 06:02:53

import pandas as pd
import numpy as np
import datetime
f=open('D:\动态人口分布实验\交通赛数据_下\\20140816_train.txt')
data=pd.read_csv(f,names=['ID','lat','lon','passager','time'])

2、对数据进行简单预处理

由于我的兴趣只在于出租车的载客位置与卸客位置,于是需要做一个简单的预处理,把载客状态变更(0变1、1变0)的行提取出来。
于是一个简单的做法就是把每一行的“载客状态”,减去上一行或者下一行。所以需要对这一列数据整体进行一个向上或向下平移,生成一个新列,然后做一个两列相减。
然后,要删除掉对后续数据分析无意义的列,减少数据量。
最后,使用pandas强大的索引功能,只选取载客状态变更的数据,进行后续计算。

data['passager_1']=data['passager'].shift(1)
data['change']=data['passager']-data['passager_1']
data=data.drop(['passager_1'],axis=1) #axis=0 为删掉某行; axis=1位删掉某列
data=data.loc[(data['change']==1) |(data['change']==-1)]

3、时间数据的处理
这部分看似简单,但由于基础太差,真心是踩了不少坑。
首先是,要把代表时间的那一列,转换为pandas的datetime类型。
其次,把这一列设置为索引。

data['time']=pd.to_datetime(data['time'])
data=data.set_index('time')
print(data['2014-08-16 09:00:00':'2014-08-16 10:00:00'])

其次为了观察数据的空间分布,保存了一下文件:

data.to_csv('D:\深度学习估算人口\data.csv')

CSV文件可以导入Arcgis中看一下分布。
但是还是想学习一下如何用Python进行可视化。
学习了这两篇博文

1、使用Python加载谷歌地图并可视化
https://blog.csdn.net/qq_38684480/article/details/85123777

2、 Inferring home and work locations using GPS trajectories and DBSCAN
https://yidatao.github.io/2016-12-23/geolife-dbscan/

于是尝试着实现可视化:

import gmplot
data=data.sort_index()  #突然发现数据本身的排序并非是严格按照时间,于是还要先进行一个排序
gmap=gmplot.GoogleMapPlotter(data.lat[0],data.lon[0],11)
data1=data.loc[data['ID']==1]
gmap.plot(data1.lat,data1.lon)
gmap.draw('user001_map.html')

4、位置数据的处理
这次数据好的地方在于位置数据都是用经纬度显示,但是有时轨迹数据的位置信息是用Geohash后编码数据表示,因此还需要进行解码。
如之前处理的MOBIKE数据,数据如下:
在这里插入图片描述
可以看出位置两列并非是经纬度。于是需要进行解码。还有一个小知识点是关于数据的切片:pd.iloc

import numpy as np
import pandas as pd
import Geohash as geohash

# 获取出发地的经纬度
def get_eloc_latlon
  • 36
    点赞
  • 361
    收藏
    觉得还不错? 一键收藏
  • 33
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值