Python | 计算一天内每小时 / 30分钟出租车订单的数量,并绘制订单时变情况的折线图

一、案例目的

在python中计算一天内每小时 / 30分钟出租车订单的数量,并绘制订单时变情况的折线图。

二、练习数据

深圳市出租车GPS数据:TaxiData-Sample.csv
核心字段:车辆ID(Num),时间(Time),经度(Lon),纬度(Lat),载客状态(OpenStatus)。说明:当OpenStatus值为1的时候,为载客状态,反之OpenStatus值为0时为空载(如图所示)。
在这里插入图片描述

三、解题思路

  1. 对出租车GPS数据进行数据清洗及预处理
  2. 利用TransBigData提取出租车OD
  3. 对OD数据的接单时间按小时/分钟进行分组
  4. 统计每个时段的订单数量
  5. 利用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

出租车OD数据

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交通数据分析》的免费课程以及小旭学长耐心的解答!

  • 3
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值