TransData Lab
交通数据实验室
课程资料

交通大数据Python包TransBigData

 二维码 609






TransBigData是由同济大学交通运输工程学院的学生开发的一个Python包,只需几行代码,就能完成较为复杂的交通时空大数据挖掘任务。该包非常适合时空数据的快速处理及出图,目前提供以下通用方法:数据质量分析、数据预处理、数据栅格化、数据聚合集计、数据可视化、数据获取、轨迹处理、GIS处理、底图加载、坐标距离计算等。值得一提的是,还提供了出租车轨迹、共享单车、公交车轨迹等多模式交通数据的挖掘与分析功能。

下面通过一个出租车数据处理的例子展示一些通用方法的效果

              官网文档见文末

1   读取数据

本数据是深圳市出租车GPS数据。获取案例数据请点击阅读原文。

#导入包import transbigdata as tbdimport pandas as pdimport geopandas as gpd#读取数据data = pd.read_csv('TaxiData-Sample.csv',header = None)data.columns= ['VehicleNum','Time','Lng','Lat','OpenStatus','Speed']sz = gpd.read_file(r'sz.shp')


2   数据质量分析

快速获取数据集的一般信息,包括数据量、时间段和采样间隔等。

tbd.data_summary(data, col=['VehicleNum', 'Time'], show_sample_duration=True)


3   数据预处理

提供了清理多种类型数据错误的方法,包括各种类型的数据处理方法、轨迹数据清洗、出租车数据清洗、数据格式转换等。

#数据预处理#剔除研究范围外的数据data = tbd.clean_outofshape(data, sz, col=['Lng', 'Lat'], accuracy=500)#剔除出租车数据中载客状态瞬间变化的记录data = tbd.clean_taxi_status(data, col=['VehicleNum', 'Time', 'OpenStatus'])


4   数据聚合集计

以交通小区为研究对象来分析交通小区之间的OD出行量是交通规划的传统方法。TransBigData包也提供了将OD直接集计到小区的方法。
#OD集计到小区(在不传入栅格化参数时,直接用经纬度匹配)od_gdf = tbd.odagg_shape(oddata,sz,round_accuracy=6)od_gdf.plot(column = 'count')#创建图框import matplotlib.pyplot as pltimport plot_mapfig =plt.figure(1,(8,8),dpi=80)ax =plt.subplot(111)plt.sca(ax)#绘制colorbarcax = plt.axes([0.05, 0.33, 0.02, 0.3])plt.title('count')plt.sca(ax)#绘制ODod_gdf.plot(ax = ax,vmax = 100,column = 'count',cax = cax,legend = True)plt.axis('off')


5   数据可视化

提供了快速实现栅格化数量分布图、出行轨迹图、OD分布图等功能,便于快速了解数据整体分布情况。

1

栅格化的数量分布图

tbd.visualization_data(data,col = ['Lng','Lat'],accuracy=300)

2

出行轨迹图

tbd.visualization_trip(data,col=['Lng','Lat','VehicleNum','Time'],zoom='auto',height=500)   #需要将basic设置为polygon

3

OD分布图

#OD可视化tbd.visualization_od(oddata)


6   基于matplotlib的图绘制及底图加载

提供了底图加载和比例尺、指北针等功能。底图由mapbox提供,坐标系为WGS-1984。使用底图加载功能需要注册一个mapbox的账号,mapbox上注册成为开发者,并获取到一个mapbox token。这种功能的图形绘制可以保存为高清文件
#创建图框import matplotlib.pyplot as pltimport plot_mapfig =plt.figure(1,(8,8),dpi=500)ax =plt.subplot(111)plt.sca(ax)#底图加载tbd.plot_map(plt,bounds,zoom = 12,style = 4)#绘制colorbarcax = plt.axes([0.05, 0.33, 0.02, 0.3])plt.title('count')plt.sca(ax)#添加比例尺和指北针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.savefig('picture.png',dpi=500,bbox_inches='tight')#保存图片,设置清晰度


7   数据栅格化

以栅格形式表达数据分布。GPS数据经过栅格化后,每个数据点包含在对应的栅格中。下面展示基于matplotlib绘制栅格轨迹点的数量图。

#栅格化#定义范围,获取栅格化参数bounds = [113.6,22.4,114.8,22.9]params = tbd.grid_params(bounds,accuracy = 500)#将GPS栅格化data['LONCOL'],data['LATCOL'] = tbd.GPS_to_grids(data['Lng'],data['Lat'],params)#集计栅格数据量datatest = data.groupby(['LONCOL','LATCOL'])['VehicleNum'].count().reset_index()#生成栅格地理图形datatest['geometry'] = tbd.gridid_to_polygon(datatest['LONCOL'],datatest['LATCOL'],params)#转为GeoDataFramedatatest = gpd.GeoDataFrame(datatest)# 绘制栅格fig = plt.figure(1, (16, 6), dpi=300) ax1 = plt.subplot(111)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);


END



本文作者:18级本科生SYC。



►►►

参考资料


官网:

https://transbigdata.readthedocs.io/zh_CN/latest/index.html


开源软件社区:

https://github.com/ni1o1/transbigdata


小旭学长b站:

https://space.bilibili.com/3051484/video