Transbigdata——交通出租车大数据可视化分析,以成都市为例

这篇具有很好参考价值的文章主要介绍了Transbigdata——交通出租车大数据可视化分析,以成都市为例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

分享一个交通大数据可视化的案例,本案例来自于transbigdata包的出租车数据分析案例的复现,数据集采用的是成都市的出租车(网约车和传统的出租车数据),文件内容比较大,这里我会附带数据集的下载链接,由于电脑运行内存有限,本案例分享选择其中一个数据集中的一部分车辆轨迹进行分析.废话少说,直接上案例。数据链接如下
链接:https://pan.baidu.com/s/1OeNs36fZHEon2yNA2bhs9A
提取码:hqen
–来自百度网盘超级会员V6的分享


一、数据集

大家提取完数据集后,建议先压缩一个压缩包中的一个txt文件,如果电脑空间大,当我没说。
车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
不要试图去打开这个 txt文档,太大了根本打不开。这里直接将txt文档的后缀改成csv后缀,如下图
车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
然后还有一个地理信息文件(JESON)要准备
车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
这些都准备好之后我们就可以开始操作了。

二、操作步骤

1.引入库

这里建议在jupyter notebook上进行操作,并且假设你已经装好下面几个库。这里需要注意transbigdata、geopandas两个库如果之前没有用过的同学可能会比较陌生,但这两个库是本案例的核心库,具体的安装与引入请参考https://transbigdata.readthedocs.io/zh_CN/latest/index.html。CoordinatesConverter库用于转换坐标系。matplotlib、pandas库应该很常见,直接pip install就完事儿。

代码如下(示例):

import transbigdata as tbd
import CoordinatesConverter #GPS数据转换库
import geopandas as gpd
import matplotlib.pyplot as plt
import pandas as pd

2.读入数据

这里注意要将数据文件和jeson文件都放入.ipynb或者程序所在的文件夹下。
代码如下(示例):

data = pd.read_csv('20140803_train.csv',header=None)
data

输出结果如下
车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
上述数据又500多万条,如果电脑吃不消的话,可以筛选其中十几万条进行分析。五个字段,分别为车辆编号,纬度,经度,载客状态,时间。可以用下面代码给数据添加有意义的表头

代码如下(示例):

data.columns = ['VehicleNum','Lat','Lng','OpenStatus','Time']
data
data

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
查看数据统计

tbd.data_summary(data, col=['VehicleNum', 'Time'], show_sample_duration=False, roundnum=4)

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
这里的时间数据已经被识别,从6-23:59:59,也可以用下面代码识别数据集中的时间字段数据是否能够在后续的操作中被运用。

pd.to_datetime(data['Time'])

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib

3.数据预处理

这里我电脑运行内存只有8GB,所以运行不了那么大的数据量,需要筛选,经过我多次的筛选,最终确定了70万条数据为我电脑比较合适的数据处理量,如果各位读者电脑很牛掰(比我电脑牛)的话,这段话及下面的提取前70多万条数据的代码块可以跳过。

#提取前199俩车的轨迹数据
data = data[data['VehicleNum']<200]    #筛选前199辆车的轨迹数据
tbd.data_summary(data, col=['VehicleNum', 'Time'], show_sample_duration=False, roundnum=4) #统计这199俩车的数据情况

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
考虑到不同数据记录方式所用的坐标系可能不同,这里可以用transbigdata库的一个函数判断是否大体与底图配对。

tbd.visualization_data(data,col = ['Lng','Lat'],accuracy=20) #accuracy表示识别精度,建议50以下

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
很明显车辆轨迹点与路网匹配的偏差比较大,所以需要对坐标系进行转换。

data['Lng'],data['Lat'] = CoordinatesConverter.gcj02towgs84(data['Lng'],data['Lat']) #将数据点转换为84坐标系下的GPS点
tbd.visualization_data(data,col = ['Lng','Lat'],accuracy=20) #可视化

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
可以看出经过坐标转换之后数据点与路网基本配对上。

4.数据栅格化处理

transbigdata包栅格化处理数据框架
车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
读取研究范围内的地图信息,生成GeoDataFrame变量

#读取区域信息
cd = gpd.read_file(r'citys_510100.json')
cd.crs = None
cd.head()#展示表格前五行的数据

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
也可以用plot方法把cd变量画出来

cd.plot()

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
这里大概可以获取到图形的边界bounds = [103, 30.2, 104.75, 31.4] (后面有用上)。需要根据研究范围对数据集进行异常数据的处理,主要处理掉不在研究范围内的数据与载客状态变化异常的数据

data = tbd.clean_outofshape(data, cd, col=['Lng', 'Lat'], accuracy=1) #剔除研究范围外的数据,accuracy可以调整,越小越精确。
data = tbd.clean_taxi_status(data, col=['VehicleNum', 'Time', 'OpenStatus']) #剔除出租车数据中载客状态瞬间变化的记录

将研究范围进行栅格化,这里分两步进行,第一步先加载底图和绘制研究范围内的图像,第二步生成研究范围栅格化的图像。
第一步代码:

bounds = [102.95, 30.08, 104.9, 31.45] #设定研究范围的边界
#绘制区域以及地图底图
fig = plt.figure(1, (6, 6), dpi=800)
ax = plt.subplot(111)
plt.sca(ax)
#plot_map函数加载底图
tbd.plot_map(plt, bounds, zoom=12, style='OSM')
#绘制地理区域
cd.plot(ax=ax, alpha=0.5)
plt.axis('off');

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
第二步代码:

import pprint
grid, params = tbd.area_to_grid(cd)
#栅格参数,方形栅格下method参数是rect,代表方形栅格
pprint.pprint(params)
#栅格几何图形
grid.head()

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
栅格地图的表格形式已经生成好,同时栅格的切割参数如上图字典中的内容,下面代码进行切割后的栅格图像的可视化。

#可视化刚才创建的方形栅格
#创建图框
fig = plt.figure(1, (12, 8), dpi=800)
ax1 = plt.subplot(121)
plt.sca(ax1)
tbd.plot_map(plt, bounds, zoom=13, style='OSM')
#绘制方形栅格
grid.plot(ax=ax1, lw=0.2, edgecolor='blue', facecolor="None")
plt.axis('off');

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
这里我采用的样式也就是tbd.plot_map方法里面style='OSM’为免费的样式(OpenStreetMap),如果想用其它的样式可以参考https://transbigdata.readthedocs.io/zh_CN/latest/plot_map.html一共有12种样式,这里的12种样式都需要mapbox里面的Access token,可以通过申请mapbox并成为开发者免费获得Access token,这里我给大家展示一下style='streets’的样式:
车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
将获得的GPS数据栅格化,生成车辆轨迹所在栅格地图上的位置。

#GPS栅格化
data['LONCOL'], data['LATCOL'] = tbd.GPS_to_grid(data['Lng']
data['Lat'], params)
data

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
执行后的结果可以看到右边两列表示该轨迹点在栅格地图种的位置,0号轨迹在栅格中的位置为(215,126)。

#集计栅格数据量
datatest = data.groupby(['LONCOL', 'LATCOL'])
['VehicleNum'].count().reset_index()
#生成栅格地理图形
datatest['geometry'] = tbd.grid_to_polygon([datatest['LONCOL'], datatest['LATCOL']], params)
#转为GeoDataFrame
# import geopandas as gpd
datatest = gpd.GeoDataFrame(datatest)
datatest.head()

对车辆轨迹数据进行栅格统计,并生成栅格地理图形。可以调用变量datatest查看集计后的表格和地理图形。
车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
第一行的意思表示(237,399)栅格上有78条车辆轨迹数据。同时可以对该数据可视化。
不绘制底图的可视化

# 绘制栅格
fig = plt.figure(1, (16, 6), dpi=600)
ax1 = plt.subplot(111)

# tbd.plot_map(plt, bounds, zoom=10, style=4)
datatest.plot(ax=ax1, column='VehicleNum', legend=True)
plt.xticks([], fontsize=10)
plt.yticks([], fontsize=10)
plt.title('Counting of Taxi GPS Trajectory Points', fontsize=12);

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
绘制底图的可视化

bounds = [102.95, 30.08, 104.9, 31.45]
#创建图框
fig = plt.figure(1, (10, 10), dpi=800)
ax = plt.subplot(111)
plt.sca(ax)

#添加地图底图
tbd.plot_map(plt, bounds, zoom=14, style='streets')

cd.plot(ax=ax, edgecolor=(0, 0, 0, 1), facecolor=(0, 0, 0, 0.2), linewidths=0.5)
datatest.plot(ax=ax, column='VehicleNum', scheme='quantiles')
plt.title('Counting of Taxi GPS Trajectory Points', fontsize=12);

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
注意这里我用的是mapbox的底图,如果各位没用Access token的话就将style改成OSM。接下来提取车辆OD,这里有两种方法都可以提取OD。

#从GPS数据提取OD
#方法一:
oddata = tbd.taxigps_to_od(data,col = ['VehicleNum', 'Time', 'Lng', 'Lat', 'OpenStatus'])

#方法二:
'''data = data.sort_values(by = ['VehicleNum','Time'])
data['OpenStatus_pre'] = data['OpenStatus'].shift() 
data['OpenStatus_next'] = data['OpenStatus'].shift(-1)
data = data[-((data['OpenStatus']!=data['OpenStatus_next'])&(data['OpenStatus']!=data['OpenStatus_pre'])&
              (data['VehicleNum']==data['VehicleNum'].shift())&(data['VehicleNum']==data['VehicleNum'].shift(-1)))] 
data['VehicleNum_next']=data['VehicleNum'].shift(-1)
oddata = data[(data['VehicleNum'] == data['VehicleNum_next']) & (data['OpenStatus'] != data['OpenStatus_next'])].copy()
oddata = oddata[['VehicleNum','Time','Lng','Lat','OpenStatus']].copy()
oddata['VehicleNum_next'] = oddata['VehicleNum'].shift(-1)
oddata['OpenStatus_next'] = oddata['OpenStatus'].shift(-1)
oddata['Lng_'] = oddata['Lng'].shift(-1)
oddata['Lat_'] = oddata['Lat'].shift(-1)
oddata['Time_next'] = oddata['Time'].shift(-1)
oddata = oddata[(oddata['OpenStatus'] == 0)&(oddata['VehicleNum'] ==oddata['VehicleNum_next'])
      ].drop(['OpenStatus','VehicleNum_next','OpenStatus_next'],axis = 1).copy()
oddata
oddata.columns=['VehicleNum','stime','slog','slat','elog','elat','etime']'''
oddata

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib

OD数据提取后,也要将OD数据栅格化。

OD数据栅格化
od_gdf = tbd.odagg_grid(oddata, params)
od_gdf.head()

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
在执行完这段代码后可能会出现warning,不过对我们的结果不会有任何影响,我们继续。下面绘制栅格OD

# 绘制栅格OD
fig = plt.figure(1, (16, 6), dpi=800) # 确定图形高为6,宽为8;图形清晰度
ax1 = plt.subplot(111)
# data_grid_count.plot(ax=ax1, column='VehicleNum', legend=True, cmap='OrRd', scheme='quantiles')
plt.sca(ax1)
od_gdf.plot(ax=ax1, column='count', legend=True, scheme='quantiles')
plt.xticks([], fontsize=10)
plt.yticks([], fontsize=10)
plt.title('OD Trips', fontsize=12);
bounds = [102.95, 30.08, 104.9, 31.45]
cd.plot(ax=ax1, edgecolor=(0, 0, 0, 1), facecolor=(0, 0, 0, 0.2), linewidths=0.5)
tbd.plot_map(plt, bounds, zoom=12, style='streets')

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
这段代码执行也会有warning,无伤大雅,可以继续下面的步骤。将OD集计到小区,并进行可视化

od_gdf = tbd.odagg_shape(oddata, cd, round_accuracy=6) #OD集计到小区
bounds = [102.95, 30.08, 104.9, 31.45]
#创建图框
fig = plt.figure(1, (10, 10), dpi=800)
ax = plt.subplot(111)
plt.sca(ax)

#添加地图底图
tbd.plot_map(plt, bounds, zoom=12, style='streets')

#绘制colorbar
cax = plt.axes([0.05, 0.33, 0.02, 0.3])
plt.title('OD\nMatrix')
plt.sca(ax)

#绘制OD
od_gdf.plot(ax=ax, vmax=100, column='count', cax=cax, legend=True)

#绘制小区底图
cd.plot(ax=ax, edgecolor=(0, 0, 0, 1), facecolor=(0, 0, 0, 0.2), linewidths=0.5)

#添加比例尺和指北针
tbd.plotscale(ax, bounds=bounds, textsize=10, compasssize=1, accuracy=2000, rect=[0.06, 0.03], zorder=10)
plt.axis('off')
plt.xlim(bounds[0], bounds[2])
plt.ylim(bounds[1], bounds[3])
plt.show()

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
这样基本上将出租车数据栅格化分析整完了,下面开始进行可视化分析,进行下面的分析时需要用到上面的代码,所以请在上述程序下继续进行。

5.可视化分析

这里需要提取载客时的轨迹(data_deliver)和空载时的轨迹(data_idle),执行如下代码

data_deliver, data_idle = tbd.taxigps_traj_point(data,oddata,col=['VehicleNum',
                                                                  'Time',
                                                                  'Lng',
                                                                  'Lat',
                                                                  'OpenStatus'])

数据提取完毕之后可以将载客与空载的轨迹用图形表示
载客

bounds = [102.95, 30.08, 104.9, 31.45]
#创建图框
fig = plt.figure(1, (10, 10), dpi=800)
ax = plt.subplot(111)
plt.sca(ax)

#添加地图底图
tbd.plot_map(plt, bounds, zoom=12, style='streets')

#绘制colorbar
cax = plt.axes([0.05, 0.33, 0.02, 0.3])
plt.title('OD\nMatrix')
plt.sca(ax)

#绘制OD
traj_deliver = tbd.points_to_traj(data_deliver)
traj_deliver.plot(ax=ax);
#绘制小区底图
cd.plot(ax=ax, edgecolor=(0, 0, 0, 1), facecolor=(0, 0, 0, 0.2), linewidths=0.5)

#添加比例尺和指北针
tbd.plotscale(ax, bounds=bounds, textsize=10, compasssize=1, accuracy=2000, rect=[0.06, 0.03], zorder=10)
plt.axis('off')
plt.xlim(bounds[0], bounds[2])
plt.ylim(bounds[1], bounds[3])
plt.title('zaike', fontsize=12);
plt.show()

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib


空载

bounds = [102.95, 30.08, 104.9, 31.45]
#创建图框
fig = plt.figure(1, (10, 10), dpi=800)
ax = plt.subplot(111)
plt.sca(ax)

#添加地图底图
tbd.plot_map(plt, bounds, zoom=12, style='streets')

#绘制colorbar
cax = plt.axes([0.05, 0.33, 0.02, 0.3])
plt.title('OD\nMatrix')
plt.sca(ax)

#绘制OD
traj_deliver = tbd.points_to_traj(data_idle)
traj_deliver.plot(ax=ax);
#绘制小区底图
cd.plot(ax=ax, edgecolor=(0, 0, 0, 1), facecolor=(0, 0, 0, 0.2), linewidths=0.5)

#添加比例尺和指北针
tbd.plotscale(ax, bounds=bounds, textsize=10, compasssize=1, accuracy=2000, rect=[0.06, 0.03], zorder=10)
plt.axis('off')
plt.xlim(bounds[0], bounds[2])
plt.ylim(bounds[1], bounds[3])
plt.title('', fontsize=12);
plt.show()

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
根据处理后的数据可以生成相应的轨迹移动视频

from keplergl import KeplerGl
a=tbd.visualization_trip(data_deliver)
a.save_to_html(file_name='data_visua_vedio.html')
del a

这样就在当前文件夹目录下生成了一共html文件
车辆数据data,python,信息可视化,数据分析,pandas,matplotlib
在文件目录下打开html文件就可以显示其轨迹的结果了。如果要将空载的轨迹可视化则把data_deliver替换成data_idle即可。也可以根据od数据生成OD图

a=tbd.visualization_od(oddata,accuracy=2000)
a.save_to_html(file_name='od_visua.html')
del a

车辆数据data,python,信息可视化,数据分析,pandas,matplotlib

总结

本文主要运用transbigdata库对出租车数据进行栅格化处理后再对其OD和轨迹数据进行可视化。transbigdata库上的案例是深圳市的,这里的案例是成都市的轨迹数据分析,通过数据预处理、数据栅格化、可视化三个步骤复现,同时像文中的一些参数的调整将会生成不同的图形样式,如accuracy参数对应精确度,style参数对应底图的样式。对应不同的样式相关研究人员可以在此基础上进一步统计不同时间段不同区的订单数,行车速度等,也可以提取空间特征和时间特征并运用机器学习的方法对速度或者出租车流量进行预测。

存在的问题

交通小白刚入门,文中难免存在不妥之处,也诚恳地希望大家能够多多指出存在的问题,若有更好的处理意见也可以在评论区发言交流。愿本案例能够对大家处理交通大数据有所帮助,制作不易,多多支持文章来源地址https://www.toymoban.com/news/detail-789736.html

到了这里,关于Transbigdata——交通出租车大数据可视化分析,以成都市为例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 出租车计价c语言

    本关任务:根据某城市普通出租车收费标准编写程序对车费进行计算。具体标准如下: 起步里程为3km,起步费为10元;10km以内超起步里程部分,每千米2元,超过10km以上的部分加收50%的回空补贴费,即每千米3元。营运过程中,因堵车及乘客要求临时停车的,按每5分钟2元计收

    2024年02月07日
    浏览(35)
  • Java语言怎么编写一个程序计算出租车的运输费用:出租车起步15公里以内20块钱,需要支付调头费用

    下面是一个Java语言编写的计算出租车运输费用的程序:   ```java import java.util.Scanner;   public class TaxiFareCalculator {     public static void main(String[] args) {         Scanner input = new Scanner(System.in);           System.out.print(\\\"请输入出租车行驶的里程(公里):\\\");         double distance

    2024年02月12日
    浏览(41)
  • FPGA出租车计费系统设计

            设计一个简易的出租车计费系统,实现计价功能,计费标准为按里程收费, 起步价为6.00 元,当里程小于3公里时,按起步价收费, 超过3公里后按1.2元 /公里收费。         实现车辆行驶的模拟:能模拟汽车的 启动,暂停,停止 等状态。         计费显示部分设计

    2024年02月04日
    浏览(55)
  • 基于单片机出租车计价器设计

     功能介绍 以51单片机作为主控系统; 1602液晶屏显示最初的起步价,里程收费,等待时间收费; 按键调整起步价,里程收费,等待时间收费; 电机旋转,通过霍尔传感器检测转速,来模拟出租车行驶; 电路图 仿真图 元器件清单 B1 5V直流电机+托盘(粘好磁铁) BT1 2032纽扣电

    2024年02月11日
    浏览(44)
  • 企业spark案例 —— 出租车轨迹分析(Python)

    头歌的大数据作业,答案没找着,遂自己整了一份 第1关:SparkSql 数据清洗 任务描述 本关任务:将出租车轨迹数据规整化,清洗掉多余的字符串。 相关知识 为了完成本关任务,你需要掌握:1. 如何使用 SparkSQL 读取 CSV 文件,2. 如何使用正则表达式清洗掉多余字符串。 编程要

    2024年02月03日
    浏览(43)
  • 【Vivado】基于FPGA的出租车计价表设计

    学校FPGA设计结课课设 主要做了出租车计价表,一个比较旧的课题,代码如下: 分模块编程,按照价目表写代码,具体注释见代码。 在module里新加一个 input 变量 key_stage ,用 key_stage 表示不同车流量段,用以计数 在module里新增一个变量 state 来限定是在白天还是夜间

    2024年02月04日
    浏览(46)
  • LeetCode 2008. 出租车的最大盈利:动态规划 + 哈希表

    力扣题目链接:https://leetcode.cn/problems/maximum-earnings-from-taxi/ 你驾驶出租车行驶在一条有 n  个地点的路上。这 n  个地点从近到远编号为  1  到  n  ,你想要从 1  开到 n  ,通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向。 乘客信息用一个下标从 0  开

    2024年02月04日
    浏览(42)
  • 仿滴滴打车百度地图定位查找附近出租车或门店信息

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月09日
    浏览(52)
  • 0097-基于单片机的出租车计价器仿真设计

    1、采用51/52单片机作为主控芯片; 2、采用1602液晶显示:里程、计价、实时时间、实时单价、本次行程计时; 3、采用DS1302作为时钟芯片; 4、支持切换显示界面、设置日期时间、设置白天单价、设置夜晚单价; 5、支持分别设置3千米内的单价、3千米外的单价、等待时的单价

    2024年02月20日
    浏览(41)
  • 【Cocos 3d】从零开始自制3d出租车小游戏

    本文很长,建议收藏食用。 课程来源: 游戏开发教程 | 零基础也可以用18堂课自制一款3D小游戏 | Cocos Creator 3D 中文教程(合集)p1~p6 简介: 资源下载:https://github.com/cocos-creator/tutorial-taxi-game 适合学习人群:本教程假定你对编程有一定的了解,ts,js 学习过其中之一。 如果不

    2024年02月02日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包