文章目录
一、案例目的
在python中计算一天内每小时 / 30分钟出租车订单的数量,并绘制订单时变情况的折线图。
二、练习数据
深圳市出租车GPS数据:TaxiData-Sample.csv
核心字段:车辆ID(Num),时间(Time),经度(Lon),纬度(Lat),载客状态(OpenStatus)。说明:当OpenStatus值为1的时候,为载客状态,反之OpenStatus值为0时为空载(如图所示)。
三、解题思路
- 对出租车GPS数据进行数据清洗及预处理
- 利用TransBigData提取出租车OD
- 对OD数据的接单时间按小时/分钟进行分组
- 统计每个时段的订单数量
- 利用matplotlib绘制折线图
四、代码实现
1.数据清洗及预处理
为什么要进行数据清洗?
因为出租车GPS数据的OpenStatus字段中可能会出现异常情况:
- 在连续0的序列中,突然出现一个1
- 在连续1的序列中,突然出现一个0
这种两种情况的产生都极有可能是采集设备的突发异常造成的,这些记录的存在会影响出行订单判断。因此在数据清洗中,应将这两种情况都予以剔除。
本次练习主要利用TransBigData包中的 tbd.clean_taxi_status()对出租车GPS数据进行清洗(参考:TransBigData出租车GPS数据处理)。
#导入所需模块
import pandas as pd
import geopandas as gpd
import transbigdata as tbd
import datetime
import numpy as np
#输入数据
data = pd.read_csv('data/TaxiData-Sample.csv',header= None)
#由于原始数据没有列名,因此这里需要重新命名
data.columns = ['Num','Time','Lon','Lat','Openstatus','Speed']
#删除多余列Speed
data = data.drop(columns='Speed')
#数据排序:根据车辆Num和Time
data = data.sort_values(by=['Num','Time'])
#利用TransbigData进行数据清洗
data = tbd.clean_taxi_status(data,col=['Num','Time','Openstatus'])
data
2.利用TransBigData提取出租车OD
为什么要用TransBigData提取出租车OD?
因为TransBigData包中的 transbigdata.taxigps_to_od()方法能根据清洗后的出租车GPS数据快速识别出租车OD,且返回字段包含出租车OD的接单时间(stime),接单经纬度(slon,slat),结束时间(etime),结束经纬度(elon,elat)等关键字段。因此,可根据接单时间统计每小时出租车订单数量。
#提取出租车OD
data = tbd.taxigps_to_od(data,col=['Num','Time','Lon','Lat','Openstatus'])
data
3.对OD数据的接单时间按小时/分钟进行分组
方法参考:pandas.Series.dt
(1)按照小时进行分组
将时间转为时间戳,按照小时(hour)分组
#将时间转换为时间戳
data['stime'] = data['stime'].astype('datetime64')
#对OD数据的接单时间按小时进行分组
data['hour'] = data['stime'].dt.hour
data
(2)按照30分钟进行分组
将时间转为时间戳,按照分钟(minute)分组:按照30分钟分组的代码要复杂一些,需要判断minute是否小于30,且记得把布尔类型转换为整数型。具体代码如下:
#将时间转换为时间戳
data['stime'] = data['stime'].astype('datetime64')
data['minute'] = data['stime'].dt.minute
data['flag'] = data['minute']<30
#布尔类型转换为整数型.astype(int)
data['flag'] = data['flag'].astype(int)
data
4.统计每个时段的订单数量
(1)按小时分组统计
result = data.groupby(by=['hour']).size().to_frame('count').reset_index()
result['hour'] = range(1,len(result)+1)
result
(2)按30min分组统计
tmp = data.groupby(['hour','flag'])['Num'].count().rename('count').reset_index()
tmp['hour'] = range(1,len(tmp)+1)
tmp.head(10)
5.利用matplotlib绘制折线图
(1)一天内每小时出租车订单时变折线图
import matplotlib.pyplot as plt
import matplotlib
fig, ax = plt.subplots()
ax.plot(result['hour'], result['count'])
#使用代码帮助matplotlib识别中文字体
matplotlib.rc("font",family = 'FangSong')
#设置坐标轴间隔
plt.xticks(range(0,25,1))
ax.set(xlabel='时间(h)', ylabel='数量(个)',
title='一天内每小时出租车订单数量')
#ax.grid()
plt.show()
#输出折线图
fig.savefig("test_hour.png")
(2)一天内每30分钟出租车订单时变折线图
import matplotlib.pyplot as plt
import matplotlib
fig, ax = plt.subplots()
ax.plot(tmp['hour'], tmp['count'])
#使用代码帮助matplotlib识别中文字体
matplotlib.rc("font",family = 'FangSong')
#plt.xlim(0,50)
plt.xticks(range(0,50,2)) #设置坐标轴间隔
ax.set(xlabel='时间(0.5h)', ylabel='数量(个)',
title='一天内每30min出租车订单时变折线图')
#ax.grid()
plt.show()
#输出折线图
fig.savefig("test_min.png")
参考资料:
立方数据学院 | 出租车GPS数据清洗和分析的技术要点:https://mp.weixin.qq.com/s/rpJkv8HgzxcBJiQeMA_T3w
TransBigData 为交通时空大数据而生:https://transbigdata.readthedocs.io/zh_CN/latest/index.html
matplotlib折线图绘制:https://matplotlib.org/3.4.3/gallery/lines_bars_and_markers/simple_plot.html
最后,特别鸣谢立方数据学院《一周快速掌握Python交通数据分析》的免费课程以及小旭学长耐心的解答!