譯者 | 崔皓
審校 | 孫淑娟
1、簡(jiǎn)介
大家在處理機(jī)器學(xué)習(xí)的大型數(shù)據(jù)集時(shí),是否會(huì)遇到如下的地址欄?

上面的位置數(shù)據(jù)非常混亂,難以處理。對(duì)地址進(jìn)行編碼是很困難的,因?yàn)樗鼈兙哂蟹浅8呋鶖?shù)。如果你試圖用單次編碼技術(shù)來對(duì)某列進(jìn)行編碼,就會(huì)導(dǎo)致高維度的結(jié)果,這會(huì)導(dǎo)致機(jī)器學(xué)習(xí)模型表現(xiàn)欠佳。解決問題的最簡(jiǎn)單方法就是對(duì)列進(jìn)行地理編碼。
2、什么是地理編碼?
地理編碼是將地址轉(zhuǎn)換為地理坐標(biāo),這意味著將把原始地址轉(zhuǎn)化為經(jīng)度/緯度的方式。
3、Python中的地理編碼
有許多不同的庫(kù)可以幫助你用Python進(jìn)行地理編碼。最快的是谷歌地圖提供的API,如果有超過1000個(gè)地址需要在短時(shí)間內(nèi)轉(zhuǎn)換,我推薦你使用。然而,谷歌地圖的API并不是免費(fèi)的,你需要為每1000個(gè)請(qǐng)求支付約5美元。
谷歌地圖API的免費(fèi)替代品是OpenStreetMap API。然而,OpenStreetMap API的速度比起谷歌地圖來說要慢得多,而且準(zhǔn)確性也稍差。
在這篇文章中,我將指導(dǎo)你使用上述兩個(gè)API完成地理編碼過程。
4、谷歌地圖API
讓我們首先使用谷歌地圖API將地址轉(zhuǎn)換成精度/緯度。首先需要?jiǎng)?chuàng)建一個(gè)谷歌云賬戶,并輸入信用卡信息。雖然這是一項(xiàng)付費(fèi)服務(wù),但當(dāng)你第一次創(chuàng)建谷歌云賬戶時(shí),谷歌會(huì)給你200美元的免費(fèi)信用。這意味著,在你被收費(fèi)之前,你可以用他們的地理編碼API進(jìn)行大約40,000次調(diào)用。只要你沒有達(dá)到這個(gè)限制,你的賬戶就不會(huì)被收費(fèi)。
首先,在谷歌云上建立一個(gè)免費(fèi)賬戶。然后,一旦你建立了一個(gè)賬戶,你就可以按照這個(gè)教程來獲得你的谷歌地圖API密鑰。
一旦你收到API密鑰,就可以開始編碼了!
(1)前提條件
在本教程中使用Zomato餐廳Kaggle數(shù)據(jù)集。確保在你的路徑中安裝了該數(shù)據(jù)集。然后,用這個(gè)命令安裝googlemaps API包。
(2)讀取數(shù)據(jù)集
現(xiàn)在,讓我們讀取數(shù)據(jù)集并檢查數(shù)據(jù)幀的頭部。

這個(gè)數(shù)據(jù)集合有21列,9551行。
只需要針對(duì)地址列來進(jìn)行地理編碼,所以去掉所有其他的列。然后,再去掉重復(fù)記錄,最后只得到地址列信息。
再看一下數(shù)據(jù)框架的頭部,在處理之后就只看到地址信息了。

接下來,就可以開始地理編碼了。
(3)地理編碼
首先,用Python訪問我們的API密鑰,運(yùn)行下面幾行代碼來完成這個(gè)任務(wù)。
現(xiàn)在,讓我們先嘗試對(duì)一個(gè)地址進(jìn)行地理編碼,并看看輸出結(jié)果。
運(yùn)行上述代碼,得到類似如下的輸出結(jié)果。

如果你得到上述輸出,很好!表示一切順利。我們可以針對(duì)整個(gè)數(shù)據(jù)集應(yīng)用類似的處理,過程如下:
再次檢查數(shù)據(jù)集合的頭部,看看代碼是否生效。

如果輸出類似上面的截圖,恭喜你!你已經(jīng)成功地對(duì)整個(gè)數(shù)據(jù)框架中的地址進(jìn)行了地理編碼。
5、OpenStreetMap API
OpenStreetMap API是完全免費(fèi)的,但與谷歌地圖API相比,速度較慢,精確度較低。這個(gè)API無法定位數(shù)據(jù)集中的許多地址,所以這次我們將使用地點(diǎn)欄來代替。在開始學(xué)習(xí)教程之前,讓我們先看看地址欄和位置欄的區(qū)別。運(yùn)行下面幾行代碼來完成這個(gè)任務(wù)。

地址欄(Address)比地點(diǎn)(Locality)欄細(xì)化得多,它提供了餐廳的確切位置,包括樓層號(hào)。這可能是地址不被OpenStreetMap API識(shí)別,而地點(diǎn)卻被識(shí)別的原因。
讓我們對(duì)第一個(gè)Locality進(jìn)行地理編碼,看看輸出結(jié)果。
地理編碼
運(yùn)行以下幾行代碼。
左右滑動(dòng)查看完整代碼
上述代碼的輸出與谷歌地圖API生成的結(jié)果非常相似。

現(xiàn)在,讓我們創(chuàng)建一個(gè)函數(shù)來尋找整個(gè)數(shù)據(jù)集合的坐標(biāo)。
很好!現(xiàn)在,讓我們來看看數(shù)據(jù)集合的頭部。
請(qǐng)注意,這個(gè)API無法為數(shù)據(jù)集合中的一些地方提供坐標(biāo)。
雖然它是谷歌地圖API的免費(fèi)替代品,如果用OpenStreetMap進(jìn)行地理編碼,有可能會(huì)失去大量的數(shù)據(jù)。本教程到此結(jié)束!希望你從這里學(xué)到了一些新的東西,并對(duì)處理地理空間數(shù)據(jù)有了更好的理解。
原文鏈接:https://www.kdnuggets.com/2022/11/geocoding-python-complete-guide.html
譯者介紹
崔皓,51CTO社區(qū)編輯,資深架構(gòu)師,擁有18年的軟件開發(fā)和架構(gòu)經(jīng)驗(yàn),10年分布式架構(gòu)經(jīng)驗(yàn)。



















