(資料科學學習手札89)geopandas&geoplot近期重要更新
阿新 • • 發佈:2020-07-10
> 本文示例程式碼及資料已上傳至我的`Github`倉庫[https://github.com/CNFeffery/DataScienceStudyNotes](https://github.com/CNFeffery/DataScienceStudyNotes)
# 1 簡介
最近一段時間(本文寫作於2020-07-10)`geopandas`與`geoplot`兩個常用的GIS類`Python`庫都進行了一系列較為重大的內容更新,新增了一些特性,本文就將針對其中比較實際的新特性進行介紹。
# 2 geopandas&geoplot近期重要更新內容
## 2.1 geopandas近期重要更新
### 2.1.1 新增高效能檔案格式
從`geopandas`0.8.0版本開始,在向量檔案讀寫方面,新增了`.feather`與`.parquet`兩種嶄新的資料格式,他們都是`Apache Arrow`專案下的重要資料格式,提供高效能檔案儲存服務,使得我們可以既可以快速讀寫檔案,又可以顯著減少檔案大小,做到了“多快好省”:
圖1
在將`geopandas`更新到0.8.0版本後,便新增了`read_feather()`、`to_feather()`、`read_parquet()`以及`to_parquet()`這四個API,但要**注意**,這些新功能依賴於`pyarrow`,首先請確保`pyarrow`被正確安裝,推薦使用`conda install -c conda-forge pyarrow`來安裝。
安裝完成後,我們就來一睹這些新功能的效率如何,首先我們建立一個足夠大的虛擬表(200萬行11列),併為其新增點要素向量列:
```Python
import numpy as np
from shapely.geometry import Point
import pandas as pd
from tqdm.notebook import tqdm
# 建立虛擬表,其中欄位名為了匯出shapefile不報錯加上非數字的字首
base = pd.DataFrame(np.column_stack([np.random.randint(1, 100, (2000000, 10)),
np.random.uniform(-90, 90, (2000000, 2))]),
columns=['_'+str(i) for i in range(12)])
tqdm.pandas() # 開啟apply進度條
base['geometry'] = base.progress_apply(lambda row: Point(row['_10'], row['_11']), axis=1) # 新增向量列
base = gpd.GeoDataFrame(base, crs='EPSG:4326') # 轉換為GeoDataFrame
```
最終得到一個較為龐大的`GeoDataFrame`,接著我們分別測試`geopandas`讀寫`shapefile`、`feather`以及`parquet`三種資料格式的耗時及檔案佔硬碟空間大小:
圖2
圖3
具體的效能比較結果如下,可以看到與原始的`shapefile`相比,`feather`與`parquet`取得了非常卓越的效能提升,且`parquet`的檔案體積非常小:
| 型別 | 寫出耗時 | 讀入耗時 | 寫出檔案大小 |
|:----------|:-----------|:-----------|:---------------|
| shapefile | 325秒 | 96秒 | 619MB |
| feather | 50秒 | 25.7秒 | 128MB |
| parquet | 52.4秒 | 26秒 | 81.2MB |
所以當你要儲存的向量資料規模較大時,可以嘗試使用`feather`和`parquet`來代替傳統的檔案格式。
## 2.2 geoplot近期重要更新
### 2.2.1 webplot線上底圖切換方式升級
在之前我們出品的**基於geopandas的空間資料分析**系列文章中的**geoplot篇(上)**中,對可以新增線上底圖的`webplot()`進行過介紹,但在先前的版本中只能使用固定的少數幾種內建的線上地圖,而在最近的版本中,`webplot()`的底圖疊加方式進行了非常大的調整,使得可以利用引數`provider`來像`folium`那樣自由切換底圖,其傳入格式為:
```
{
'url': 地圖源url,
'attribution': 自定義字串,必填
}
```
譬如我們可以在一個神奇的網站 http://openwhatevermap.xyz/#3/-60.50/167.87 上點選自己感興趣的地圖樣式:
圖4
將對應的url和自定義的`attribution`傳入`webplot()`中:
圖5
圖6
你也可以利用下面的方式檢視`contextily`中所有內建的底圖引數,從中選擇你心儀的底圖:
圖7
---
以上就是本文的全部內容,歡迎在評論區與我們進