当前位置:   article > 正文

[转]出租车轨迹处理(二):时空分析_怎么根据出租车轨迹数据获取出租车的停驻点呢

怎么根据出租车轨迹数据获取出租车的停驻点呢

接下来就要进行一些简单的分析了。
今天的目标是如何对某一感兴趣区域进行出租车数据的时空分析。



一、轨迹数据预处理

这一步在上一篇文章中已经有了介绍。
步骤无非就是:



1)使用pandas读取数据

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



2)根据轨迹数据的flag列(代表是否为空车),得到flag列变化的行,视为上、下客的位置。然后丢弃无用的列。

  1. data['passager_1']=data['passager'].shift(1)
  2. data['change']=data['passager']-data['passager_1']
  3. data=data.drop(['passager_1'],axis=1)
  4. #索引得到change列为1或-1的列
  5. data=data.loc[(data['change']==1) |(data['change']==-1)]



3)将time一列从字符串转为datatime类型,并将该列设为索引。

  1. import datetime
  2. data['time']=pd.to_datetime(data['time'])
  3. data=data.set_index('time')
  4. #按照索引(时间)排序
  5. data=data.sort_index()



4) 分别保存上、下车的位置数据(根据flag=1/-1)

  1. PUP=data.loc[data['change']==1]
  2. PUP.to_csv('D:\深度学习估算人口\\0816PUP.csv')
  3. DOP=data.loc[data['change']==-1]
  4. DOP.to_csv('D:\深度学习估算人口\\0816DOP.csv')



二、得到特定区域出租车数据

结合shp数据处理数据,对大牛来说,最好的方法首先从arcgis中生成感兴趣区域的shp文件,然后从python中使用gdal等库来处理。不然就是用arcgis中的arcpy。
但可惜我不是大牛,我只好采用笨办法曲线救国。



1)arcgis中导入出租车上、下客的csv文件=

按照x、y坐标显示。相当于把点转为了shp格式。
如图:将DOP和PUP按照xy数据显示后,分别生成了对应的point格式文件
在这里插入图片描述



2)新建shpfile,选取感兴趣区

在这里插入图片描述



3)使用感兴趣区的shp裁剪上、下客point

在这里插入图片描述



4)对裁剪后的point导出csv格式属性表



5) python中导入csv,继续进行处理



三、时空数据挖掘



1) 预处理

  1. ## 下车文件读取
  2. fff=open('D:\深度学习估算人口\\成都体育中心0816DOP.txt')
  3. gym_DOP=pd.read_csv(fff)
  4. gym_DOP=gym_DOP.drop(["OBJECTID","ID","lat","lon","passager"],axis=1)
  5. gym_DOP['time']=pd.to_datetime(gym_DOP['time'])
  6. gym_DOP=gym_DOP.set_index('time')
  7. ## 上车文件读取
  8. ffff=open('D:\深度学习估算人口\\成都体育中心0816PUP.txt')
  9. gym_PUP=pd.read_csv(ffff)
  10. gym_PUP=gym_PUP.drop(["OBJECTID","ID","lat","lon","passager"],axis=1)
  11. gym_PUP['time']=pd.to_datetime(gym_PUP['time'])
  12. gym_PUP=gym_PUP.set_index('time')



2)按小时统计

人数可直接通过上、下车的标注列【change】来计算。
但由于下车人数的标注【change】为-1,故要新建一列,设为abs(change),然后再统计人数。上车人数的【change】是1,可以直接按照change列统计,但是为了统一起见(强迫症起见),还是同样新建num列处理了一下。
这里不得不感叹pandas对时间序列处理的强大之处。一个简单的resample('H) 函数就可以直接按照Hour统计。这方面的一些具体参数可以参考《使用python进行数据分析》一书。

  1. # 下车人数按小时统计
  2. gym_DOP['num']=abs(gym_DOP['change'])
  3. gym_DOP=gym_DOP.resample('H').sum()
  4. #上车人数按小时统计
  5. gym_PUP['num']=abs(gym_PUP['change'])
  6. gym_PUP=gym_PUP.resample('H').sum()



3)作图显示上、下车趋势

直接使用pandas自带的作图函数plot()。
发现这个函数不是太方便设置标注,如下:

  1. ##上车人数
  2. N=gym_PUP['num'].plot(title='passagers')
  3. fig=N.get_figure()
  4. fig.set_size_inches(20,9)
  5. # 下车人数
  6. N=gym_DOP['num'].plot(title='passagers')
  7. fig=N.get_figure()
  8. fig.set_size_inches(20,9)

在这里插入图片描述

所以使用pandas的concat函数整合两个文件中的上、下车人数,然后一起作图显示。

  1. all_data_col = pd.concat((gym_PUP['num'],gym_DOP['num']),axis = 1)
  2. all_data_col.columns=['gym_up','gym_down']
  3. all_data_col.plot()

在这里插入图片描述



4)统计累计净流量

在一天24小时内,从早到晚的“净流量”(即截止第t小时,流入的总数减去流出的总数)是很有意义的一个特征。
这时候就需要借助强大的pandas.num.cumsum()函数了。新建一列代表【净流量】,然后作图表示。

  1. gym_PUP['flow']=gym_DOP.num.cumsum()-gym_PUP.num.cumsum()
  2. FF=gym_PUP['flow'].plot(title='passagers')
  3. fig=N.get_figure()
  4. fig.set_size_inches(20,9)

在这里插入图片描述


---------------------
作者:菜鸡的自我拯救
来源:CSDN
原文:https://blog.csdn.net/weixin_37659245/article/details/89486425
 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号