1、TransBigData簡介
#TransBigData為處理常見的交通時空大數據(如出租車GPS數據、共享單車數據和公車GPS數據等)提供了快速而簡潔的方法。 TransBigData為交通時空大數據分析的各個階段提供了多種處理方法,程式碼簡潔、高效、靈活、易用,可以用簡潔的程式碼實現複雜的資料任務。
目前,TransBigData主要提供以下方法:
- 資料預處理:對資料集提供快速計算資料量、時間段、取樣間隔等基本資訊的方法,也針對多種數據雜訊提供了相應的清洗方法。
- 資料柵格化:提供在研究區域內產生、匹配多種類型的地理柵格(矩形、三角形、六邊形及geohash柵格)的方法體系,能夠以向量化的方式快速演算法將空間點資料映射到地理柵格上。
- 資料視覺化:基於視覺化套件keplergl,用簡單的程式碼即可在Jupyter Notebook上互動式地視覺化展示資料。
- 軌跡處理:從軌跡資料GPS點產生軌跡線型,軌跡點增密、稀疏化等。
- 地圖底圖、座標轉換與計算:載入顯示地圖底圖與各類特殊座標系之間的座標轉換。
- 特定處理方法:針對各類特定數據提供相應處理方法,如從出租車GPS數據中提取訂單起証點,從手機信令數據中識別居住地與工作地,從地鐵網絡GIS數據建構網路拓撲結構並計算最短路徑等。
TransBigData可以透過pip或conda安裝,在命令提示字元中執行下面程式碼即可安裝:
pip install -U transbigdata
安裝完成後,在Python中執行如下程式碼即可匯入TransBigData包。
import transbigdata as tbd
2、資料預處理
TransBigData與資料處理中常用的Pandas和GeoPandas套件能夠無縫銜接。首先我們引進Pandas包並讀取計程車GPS資料:
import pandas as pd # 读取数据 data = pd.read_csv('TaxiData-Sample.csv',header = None) data.columns = ['VehicleNum','time','lon','lat','OpenStatus','Speed'] data.head()
結果如圖2所示:
▲圖2 計程車GPS資料
然後,引入GeoPandas包,讀取研究範圍的區域資訊並展示:
import geopandas as gpd # 读取研究范围区域信息 sz = gpd.read_file(r'sz/sz.shp') sz.plot()
結果如圖3所示:
▲圖3 研究範圍的區域資訊
TransBigData套件整合了一些交通時空資料的常用預處理方法。其中,tbd.clean_outofshape方法輸入資料和研究範圍區域信息,能夠剔除研究範圍外的資料。而tbd.clean_taxi_status方法則可以剔除出租車GPS資料中載客狀態瞬間變化的記錄。使用預處理方法時需要傳入資料表中重要資訊列所對應的列名,程式碼如下:
# 数据预处理 #剔除研究范围外的数据,计算原理是在方法中先栅格化后栅格匹配研究范围后实现对应。因此这里需要同时定义栅格大小,越小则精度越高 data = tbd.clean_outofshape(data, sz, col=['lon', 'lat'], accuracy=500) # 剔除出租车数据中载客状态瞬间变化的数据 data = tbd.clean_taxi_status(data, col=['VehicleNum', 'time', 'OpenStatus'])
經過上述程式碼的處理,我們就已經將計程車GPS資料中研究範圍以外的資料和載客狀態瞬間變化的資料予以剔除。
3、資料柵格化
柵格形式(地理空間上相同大小的網格)是表達資料分佈最基本的方法,GPS資料經過柵格化後,每個資料點都含有其所在的柵格資訊。採用柵格表達資料的分佈時,其表示的分佈情況與真實情況接近。
TransBigData工具為我們提供了一套完整、快速、便捷的柵格處理系統。用TransBigData進行柵格劃分時,首先需要確定柵格化的參數(可以理解為定義了一個柵格座標系),參數可以幫助我們快速進行柵格化:
# 定义研究范围边界 bounds = [113.75, 22.4,114.62, 22.86] # 通过边界获取栅格化参数 params = tbd.area_to_params(bounds,accuracy = 1000) params
輸出:
{'slon': 113.75, 'slat': 22.4, 'deltalon': 0.00974336289289822, 'deltalat': 0.008993210412845813, 'theta': 0, 'method': 'rect', 'gridsize': 1000}
此時輸出的柵格化參數params的內容儲存了柵格座標系的原點座標(slon、slat)、單一柵格的經緯度長寬(deltalon、deltalat)、柵格的旋轉角度(theta)、柵格的形狀(method參數,其值可以是方形rect、三角形tri和六邊形hexa)以及柵格的大小(gridsize參數,單位為米)。
取得柵格化參數後,我們便可以用TransBigData中提供的方法對GPS資料進行柵格匹配、產生等操作。
完整的柵格處理方法系統如圖4所示:
#▲圖4 TransBigData所提供的柵格處理系統
#使用tbd.GPS_to_grid方法能夠為每一個出租車GPS點生成,該方法會生成編號列LONCOL與LATCOL,由這兩列共同指定所在的柵格:
# 将GPS数据对应至栅格,将生成的栅格编号列赋值到数据表上作为新的两列 data['LONCOL'],data['LATCOL']= tbd.GPS_to_grids(data['lon'],data['lat'],params)
下一步,聚合集计每一栅格内的数据量,并为栅格生成地理几何图形,构建GeoDataFrame:
# 聚合集计栅格内数据量 grid_agg=data.groupby(['LONCOL','LATCOL'])['VehicleNum'].count().reset_index() # 生成栅格的几何图形 grid_agg['geometry']=tbd.grid_to_polygon([grid_agg['LONCOL'],grid_agg['LATCOL']],params) # 转换为GeoDataFrame grid_agg=gpd.GeoDataFrame(grid_agg) # 绘制栅格 grid_agg.plot(column = 'VehicleNum',cmap = 'autumn_r')
结果如图5所示:
▲图5 数据栅格化的结果
对于一个正式的数据可视化图来说,我们还需要添加底图、色条、指北针和比例尺。TransBigData也提供了相应的功能,代码如下:
import matplotlib.pyplot as plt fig =plt.figure(1,(8,8),dpi=300) ax =plt.subplot(111) plt.sca(ax) # 添加行政区划边界作为底图 sz.plot(ax=ax,edgecolor=(0,0,0,0),facecolor=(0,0,0,0.1),linewidths=0.5) # 定义色条位置 cax = plt.axes([0.04, 0.33, 0.02, 0.3]) plt.title('Data count') plt.sca(ax) # 绘制数据 grid_agg.plot(column = 'VehicleNum',cmap = 'autumn_r',ax = ax,cax = cax,legend = True) # 添加指北针和比例尺 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()
结果如图6所示:
▲图6 tbd包绘制的出租车GPS数据分布
4、订单起讫点OD提取与聚合集计
针对出租车GPS数据,TransBigData提供了直接从数据中提取出出租车订单起讫点(OD)信息的方法,代码如下:
# 从GPS数据提取OD oddat=tbd.taxigps_to_od(data,col=['VehicleNum','time','Lng','Lat','OpenStatus']) oddata
结果如图7所示:
▲图7 tbd包提取的出租车OD
TransBigData包提供的栅格化方法可以让我们快速地进行栅格化定义,只需要修改accuracy参数,即可快速定义不同大小粒度的栅格。我们重新定义一个2km*2km的栅格坐标系,将其参数传入tbd.odagg_grid方法对OD进行栅格化聚合集计并生成GeoDataFrame:
# 重新定义栅格,获取栅格化参数 params=tbd.area_to_params(bounds,accuracy = 2000) # 栅格化OD并集计 od_gdf=tbd.odagg_grid(oddata,params) od_gdf.plot(column = 'count')
结果如图8所示:
▲图8 tbd集计的栅格OD
添加地图底图,色条与比例尺指北针:
# 创建图框 import matplotlib.pyplot as plt fig =plt.figure(1,(8,8),dpi=300) ax =plt.subplot(111) plt.sca(ax) # 添加行政区划边界作为底图 sz.plot(ax=ax,edgecolor=(0,0,0,1),facecolor=(0,0,0,0),linewidths=0.5) # 绘制colorbar cax=plt.axes([0.05, 0.33, 0.02, 0.3]) plt.title('Data count') plt.sca(ax) # 绘制OD od_gdf.plot(ax = ax,column = 'count',cmap = 'Blues_r',linewidth = 0.5,vmax = 10,cax = cax,legend = True) # 添加比例尺和指北针 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()
结果如图9所示:
▲ 图9 TransBigData绘制的栅格OD数据
同时,TransBigData包也提供了将OD直接聚合集计到区域间的方法:
# OD集计到区域 # 方法1:在不传入栅格化参数时,直接用经纬度匹配 od_gdf = tbd.odagg_shape(oddata,sz,round_accuracy=6) # 方法2:传入栅格化参数时,程序会先栅格化后匹配以加快运算速度,数据量大时建议使用 od_gdf = tbd.odagg_shape(oddata,sz,params = params) od_gdf.plot(column = 'count')
结果如图10所示:
▲图10 tbd集计的小区OD
加载地图底图并调整出图参数:
# 创建图框 import matplotlib.pyplot as plt import plot_map fig =plt.figure(1,(8,8),dpi=300) ax =plt.subplot(111) plt.sca(ax) # 添加行政区划边界作为底图 sz.plot(ax = ax,edgecolor = (0,0,0,0),facecolor = (0,0,0,0.2),linewidths=0.5) # 绘制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,cmap = 'autumn_r',linewidth = 1,legend = True) # 添加比例尺和指北针 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()
结果如图11所示:
▲ 图11区域间OD可视化结果
5、交互可视化
在TransBigData中,我们可以对出租车数据使用简单的代码在jupyter notebook中快速进行交互可视化。这些可视化方法底层依托了keplergl包,可视化的结果不再是静态的图片,而是能够与鼠标响应交互的地图应用。
tbd.visualization_data方法可以实现数据分布的可视化,将数据传入该方法后,TransBigData会首先对数据点进行栅格集计,然后生成数据的栅格,并将数据量映射至颜色上。代码如下:
结果如图12所示:
# 可视化数据点分布 tbd.visualization_data(data,col = ['lon','lat'],accuracy=1000,height = 500)
▲ 图12数据分布的栅格可视化
对于出租车数据中所提取出的出行OD,也可使用tbd.visualization_od方法实现OD的弧线可视化。该方法也会对OD数据进行栅格聚合集计,生成OD弧线,并将不同大小的OD出行量映射至不同颜色。代码如下:
# 可视化数据点分布 tbd.visualization_od(oddata,accuracy=2000,height = 500)
结果如图13所示:
▲ 图13 OD分布的弧线可视化
对个体级的连续追踪数据,tbd.visualization_trip方法可以将数据点处理为带有时间戳的轨迹信息并动态地展示,代码如下:
# 动态可视化轨迹 tbd.visualization_trip(data,col = ['lon','lat','VehicleNum','time'],height = 500)
结果图14所示。点击其中的播放键,可以看到出租车运行的动态轨迹效果。
以上是酷炫,Python實現交通數據視覺化!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

選擇Python還是C 取決於項目需求:1)如果需要快速開發、數據處理和原型設計,選擇Python;2)如果需要高性能、低延遲和接近硬件的控制,選擇C 。

通過每天投入2小時的Python學習,可以有效提升編程技能。 1.學習新知識:閱讀文檔或觀看教程。 2.實踐:編寫代碼和完成練習。 3.複習:鞏固所學內容。 4.項目實踐:應用所學於實際項目中。這樣的結構化學習計劃能幫助你係統掌握Python並實現職業目標。

在兩小時內高效學習Python的方法包括:1.回顧基礎知識,確保熟悉Python的安裝和基本語法;2.理解Python的核心概念,如變量、列表、函數等;3.通過使用示例掌握基本和高級用法;4.學習常見錯誤與調試技巧;5.應用性能優化與最佳實踐,如使用列表推導式和遵循PEP8風格指南。

Python適合初學者和數據科學,C 適用於系統編程和遊戲開發。 1.Python簡潔易用,適用於數據科學和Web開發。 2.C 提供高性能和控制力,適用於遊戲開發和系統編程。選擇應基於項目需求和個人興趣。

Python更適合數據科學和快速開發,C 更適合高性能和系統編程。 1.Python語法簡潔,易於學習,適用於數據處理和科學計算。 2.C 語法複雜,但性能優越,常用於遊戲開發和系統編程。

每天投入兩小時學習Python是可行的。 1.學習新知識:用一小時學習新概念,如列表和字典。 2.實踐和練習:用一小時進行編程練習,如編寫小程序。通過合理規劃和堅持不懈,你可以在短時間內掌握Python的核心概念。

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1
好用且免費的程式碼編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),