TransBigData是由同济大学交通运输工程学院的学生开发的一个Python包,只需几行代码,就能完成较为复杂的交通时空大数据挖掘任务。该包非常适合时空数据的快速处理及出图,目前提供以下通用方法:数据质量分析、数据预处理、数据栅格化、数据聚合集计、数据可视化、数据获取、轨迹处理、GIS处理、底图加载、坐标距离计算等。值得一提的是,还提供了出租车轨迹、共享单车、公交车轨迹等多模式交通数据的挖掘与分析功能。
下面通过一个出租车数据处理的例子展示一些通用方法的效果。
本数据是深圳市出租车GPS数据。获取案例数据请点击阅读原文。
#导入包
import transbigdata as tbd
import pandas as pd
import 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')
快速获取数据集的一般信息,包括数据量、时间段和采样间隔等。
tbd.data_summary(data, col=['VehicleNum', 'Time'], show_sample_duration=True)
提供了清理多种类型数据错误的方法,包括各种类型的数据处理方法、轨迹数据清洗、出租车数据清洗、数据格式转换等。
#数据预处理
#剔除研究范围外的数据
data = tbd.clean_outofshape(data, sz, col=['Lng', 'Lat'], accuracy=500)
#剔除出租车数据中载客状态瞬间变化的记录
data = tbd.clean_taxi_status(data, col=['VehicleNum', 'Time', 'OpenStatus'])
以交通小区为研究对象来分析交通小区之间的OD出行量是交通规划的传统方法。TransBigData包也提供了将OD直接集计到小区的方法。#OD集计到小区(在不传入栅格化参数时,直接用经纬度匹配)
od_gdf = tbd.odagg_shape(oddata,sz,round_accuracy=6)
od_gdf.plot(column = 'count')
#创建图框
import matplotlib.pyplot as plt
import plot_map
fig =plt.figure(1,(8,8),dpi=80)
ax =plt.subplot(111)
plt.sca(ax)
#绘制colorbar
cax = plt.axes([0.05, 0.33, 0.02, 0.3])
plt.title('count')
plt.sca(ax)
#绘制OD
od_gdf.plot(ax = ax,vmax = 100,column = 'count',cax = cax,legend = True)
plt.axis('off')
提供了快速实现栅格化数量分布图、出行轨迹图、OD分布图等功能,便于快速了解数据整体分布情况。tbd.visualization_data(data,col = ['Lng','Lat'],accuracy=300)
tbd.visualization_trip(data,col=['Lng','Lat','VehicleNum','Time'],zoom='auto',height=500) #需要将basic设置为polygon
#OD可视化
tbd.visualization_od(oddata)
提供了底图加载和比例尺、指北针等功能。底图由mapbox提供,坐标系为WGS-1984。使用底图加载功能需要注册一个mapbox的账号,mapbox上注册成为开发者,并获取到一个mapbox token。这种功能的图形绘制可以保存为高清文件。#创建图框
import matplotlib.pyplot as plt
import plot_map
fig =plt.figure(1,(8,8),dpi=500)
ax =plt.subplot(111)
plt.sca(ax)
#底图加载
tbd.plot_map(plt,bounds,zoom = 12,style = 4)
#绘制colorbar
cax = 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')#保存图片,设置清晰度
以栅格形式表达数据分布。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)
#转为GeoDataFrame
datatest = 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);
官网:
https://transbigdata.readthedocs.io/zh_CN/latest/index.html
开源软件社区:
https://github.com/ni1o1/transbigdata
小旭学长b站:
https://space.bilibili.com/3051484/video