譯者 | 崔皓
審校 | 孫淑娟
1、簡介
大家在處理機器學習的大型數據集時,是否會遇到如下的地址欄?
上面的位置數據非?;靵y,難以處理。對地址進行編碼是很困難的,因為它們具有非常高基數。如果你試圖用單次編碼技術來對某列進行編碼,就會導致高維度的結果,這會導致機器學習模型表現欠佳。解決問題的最簡單方法就是對列進行地理編碼。
2、什么是地理編碼?
地理編碼是將地址轉換為地理坐標,這意味著將把原始地址轉化為經度/緯度的方式。
3、Python中的地理編碼
有許多不同的庫可以幫助你用Python進行地理編碼。最快的是谷歌地圖提供的API,如果有超過1000個地址需要在短時間內轉換,我推薦你使用。然而,谷歌地圖的API并不是免費的,你需要為每1000個請求支付約5美元。
谷歌地圖API的免費替代品是OpenStreetMap API。然而,OpenStreetMap API的速度比起谷歌地圖來說要慢得多,而且準確性也稍差。
在這篇文章中,我將指導你使用上述兩個API完成地理編碼過程。
4、谷歌地圖API
讓我們首先使用谷歌地圖API將地址轉換成精度/緯度。首先需要創建一個谷歌云賬戶,并輸入信用卡信息。雖然這是一項付費服務,但當你第一次創建谷歌云賬戶時,谷歌會給你200美元的免費信用。這意味著,在你被收費之前,你可以用他們的地理編碼API進行大約40,000次調用。只要你沒有達到這個限制,你的賬戶就不會被收費。
首先,在谷歌云上建立一個免費賬戶。然后,一旦你建立了一個賬戶,你就可以按照這個教程來獲得你的谷歌地圖API密鑰。
一旦你收到API密鑰,就可以開始編碼了!
(1)前提條件
在本教程中使用Zomato餐廳Kaggle數據集。確保在你的路徑中安裝了該數據集。然后,用這個命令安裝googlemaps API包。
(2)讀取數據集
現在,讓我們讀取數據集并檢查數據幀的頭部。
這個數據集合有21列,9551行。
只需要針對地址列來進行地理編碼,所以去掉所有其他的列。然后,再去掉重復記錄,最后只得到地址列信息。
再看一下數據框架的頭部,在處理之后就只看到地址信息了。
接下來,就可以開始地理編碼了。
(3)地理編碼
首先,用Python訪問我們的API密鑰,運行下面幾行代碼來完成這個任務。
現在,讓我們先嘗試對一個地址進行地理編碼,并看看輸出結果。
運行上述代碼,得到類似如下的輸出結果。
如果你得到上述輸出,很好!表示一切順利。我們可以針對整個數據集應用類似的處理,過程如下:
再次檢查數據集合的頭部,看看代碼是否生效。
如果輸出類似上面的截圖,恭喜你!你已經成功地對整個數據框架中的地址進行了地理編碼。
5、OpenStreetMap API
OpenStreetMap API是完全免費的,但與谷歌地圖API相比,速度較慢,精確度較低。這個API無法定位數據集中的許多地址,所以這次我們將使用地點欄來代替。在開始學習教程之前,讓我們先看看地址欄和位置欄的區別。運行下面幾行代碼來完成這個任務。
地址欄(Address)比地點(Locality)欄細化得多,它提供了餐廳的確切位置,包括樓層號。這可能是地址不被OpenStreetMap API識別,而地點卻被識別的原因。
讓我們對第一個Locality進行地理編碼,看看輸出結果。
地理編碼
運行以下幾行代碼。
左右滑動查看完整代碼
上述代碼的輸出與谷歌地圖API生成的結果非常相似。
現在,讓我們創建一個函數來尋找整個數據集合的坐標。
很好!現在,讓我們來看看數據集合的頭部。
請注意,這個API無法為數據集合中的一些地方提供坐標。
雖然它是谷歌地圖API的免費替代品,如果用OpenStreetMap進行地理編碼,有可能會失去大量的數據。本教程到此結束!希望你從這里學到了一些新的東西,并對處理地理空間數據有了更好的理解。
原文鏈接:https://www.kdnuggets.com/2022/11/geocoding-python-complete-guide.html
譯者介紹
崔皓,51CTO社區編輯,資深架構師,擁有18年的軟件開發和架構經驗,10年分布式架構經驗。