譯者| 崔皓
審校| 孫淑娟
大家在處理機器學習的大型資料集時,是否會遇到如下的網址列?
上面的位置資料非常混亂,很難處理。對地址進行編碼是很困難的,因為它們具有非常高基數。如果你試圖用單次編碼技術來對某一列進行編碼,就會導致高維度的結果,這會導致機器學習模型表現不佳。解決問題最簡單的方法就是對列進行地理編碼。
地理編碼是將地址轉換為地理座標,這意味著將原始地址轉換為經度/緯度的方式。
有許多不同的函式庫可以幫助你用Python進行地理編碼。最快的是Google地圖提供的API,如果有超過1000個地址需要在短時間內轉換,我推薦你使用。然而,Google地圖的API並不是免費的,你需要為每1000個請求支付約5美元。
Google地圖API的免費替代品是OpenStreetMap API。然而,OpenStreetMap API的速度比起Google地圖來說要慢得多,而且準確性也稍差。
在這篇文章中,我將引導你使用上述兩個API完成地理編碼過程。
讓我們先使用Google地圖API將位址轉換成精確度/緯度。首先需要建立一個谷歌雲端帳戶,並輸入信用卡資訊。雖然這是一項付費服務,但當你第一次建立Google雲端帳號時,Google會給你200美元的免費信用。這意味著,在你被收費之前,你可以用他們的地理編碼API進行大約40,000次呼叫。只要你沒有達到這個限制,你的帳戶就不會被收費。
首先,在Google雲端建立一個免費帳戶。然後,一旦你建立了一個帳戶,你就可以按照這個教學來取得你的Google地圖API金鑰。
一旦你收到API金鑰,就可以開始編碼了!
(1)前提條件
在本教學中使用Zomato餐廳Kaggle資料集。確保在你的路徑中安裝了該資料集。然後,用這個指令安裝googlemaps API套件。
pip install -U googlemaps
(2)讀取資料集
現在,讓我們讀取資料集並檢查資料幀的頭部。
data = pd. read_csv('zomato.csv',encoding="ISO-8859-1") df = data.copy() df.head()
這個資料集合有21列,9551行。
只需要針對位址列來進行地理編碼,所以去掉所有其他的欄位。然後,再去掉重複記錄,最後只得到地址列資訊。
df = df[['地址']] df = df. drop_duplicates()
再看一下資料框架的頭部,在處理之後就只看到地址資訊了。
接下來,就可以開始地理編碼了。
(3)地理編碼
首先,用Python存取我們的API金鑰,執行下面幾行程式碼來完成這個任務。
gmaps_key = googlemaps.Client(key="your_API_key")
現在,讓我們先嘗試對一個位址進行地理編碼,並看看輸出結果。
add_1 = df['地址'][0] g = gmaps_key. geocode(add_1) lat = g[0]["geometry"]["location"]["lat"] long = g[0]["geometry"]["location"]["lng"] print('Latitude: '+str(lat)+', Longitude: '+str(long))
執行上述程式碼,得到類似如下的輸出結果。
如果你得到上述輸出,很好!表示一切順利。我們可以針對整個資料集套用類似的處理,流程如下:
def geocode(add): g = gmaps_key. geocode(add) lat = g[0]["geometry"]["location"]["lat"] lng = g[0]["geometry"]["location"]["lng"] return(lat, lng)。 df['geocoded'] = df['Address']. apply(geocode)
再次檢查資料集合的頭部,看看程式碼是否生效。
df.head()
如果輸出類似上面的截圖,恭喜你!你已經成功地對整個資料框架中的地址進行了地理編碼。
OpenStreetMap API是完全免費的,但與Google地圖API相比,速度較慢,精確度較低。這個API無法定位資料集中的許多位址,所以這次我們將使用地點欄來代替。在開始學習教學之前,讓我們先看看網址列和位置列的差異。運行下面幾行程式碼來完成這個任務。
print('Address: '+data['Address'][0]+'nnLocality: '+data['Locality'][0] )#
地址栏(Address)比地点(Locality)栏细化得多,它提供了餐厅的确切位置,包括楼层号。这可能是地址不被OpenStreetMap API识别,而地点却被识别的原因。
让我们对第一个Locality进行地理编码,看看输出结果。
地理编码
运行以下几行代码。
Import url Import requests data = data[['Locality']] url = 'https://nominatim.openstreetmap.org/search/' + urllib. parse. quote(df['Locality'][0]) +'?format=json' 。 response = requests.get(url).json() print('Latitude: '+response[0]['lat']+', Longitude: '+response[0]['lon'] )
左右滑动查看完整代码
上述代码的输出与谷歌地图API生成的结果非常相似。
现在,让我们创建一个函数来寻找整个数据集合的坐标。
def geocode2(locality): url = 'https://nominatim.openstreetmap.org/search/' + urllib. parse. quote(locality) +'?format=json' response = requests.get(url).json() if (len(response)!=0)。 return(response[0]['lat'], response[0]['lon'] ) else: return('-1') data['geocoded'] = data['Locality']. apply(geocode2)
很好!现在,让我们来看看数据集合的头部。
Data.head(15)
请注意,这个API无法为数据集合中的一些地方提供坐标。
虽然它是谷歌地图API的免费替代品,如果用OpenStreetMap进行地理编码,有可能会失去大量的数据。本教程到此结束!希望你从这里学到了一些新的东西,并对处理地理空间数据有了更好的理解。
原文链接:https://www.kdnuggets.com/2022/11/geocoding-python-complete-guide.html
崔皓,51CTO社区编辑,资深架构师,拥有18年的软件开发和架构经验,10年分布式架构经验。
以上是全解Python的地理編碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!