首頁  >  文章  >  後端開發  >  全解Python的地理編碼

全解Python的地理編碼

WBOY
WBOY轉載
2023-04-14 16:55:031127瀏覽

譯者| 崔皓

審校| 孫淑娟

1、簡介

 大家在處理機器學習的大型資料集時,是否會遇到如下的網址列?

全解Python的地理編碼

上面的位置資料非常混亂,很難處理。對地址進行編碼是很困難的,因為它們具有非常高基數。如果你試圖用單次編碼技術來對某一列進行編碼,就會導致高維度的結果,這會導致機器學習模型表現不佳。解決問題最簡單的方法就是對列進行地理編碼。

2、什麼是地理編碼?

地理編碼是將地址轉換為地理座標,這意味著將原始地址轉換為經度/緯度的方式。

3、Python中的地理編碼

有許多不同的函式庫可以幫助你用Python進行地理編碼。最快的是Google地圖提供的API,如果有超過1000個地址需要在短時間內轉換,我推薦你使用。然而,Google地圖的API並不是免費的,你需要為每1000個請求支付約5美元。

Google地圖API的免費替代品是OpenStreetMap API。然而,OpenStreetMap API的速度比起Google地圖來說要慢得多,而且準確性也稍差。

在這篇文章中,我將引導你使用上述兩個API完成地理編碼過程。

4、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()

全解Python的地理編碼

這個資料集合有21列,9551行。

只需要針對位址列來進行地理編碼,所以去掉所有其他的欄位。然後,再去掉重複記錄,最後只得到地址列資訊。

df = df[['地址']]
df = df. drop_duplicates()

再看一下資料框架的頭部,在處理之後就只看到地址資訊了。

全解Python的地理編碼

接下來,就可以開始地理編碼了。

(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))

執行上述程式碼,得到類似如下的輸出結果。

 

全解Python的地理編碼

如果你得到上述輸出,很好!表示一切順利。我們可以針對整個資料集套用類似的處理,流程如下:

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()

全解Python的地理編碼

如果輸出類似上面的截圖,恭喜你!你已經成功地對整個資料框架中的地址進行了地理編碼。

5、OpenStreetMap API

OpenStreetMap API是完全免費的,但與Google地圖API相比,速度較慢,精確度較低。這個API無法定位資料集中的許多位址,所以這次我們將使用地點欄來代替。在開始學習教學之前,讓我們先看看網址列和位置列的差異。運行下面幾行程式碼來完成這個任務。

print('Address: '+data['Address'][0]+'nnLocality: '+data['Locality'][0] )

全解Python的地理編碼

#

地址栏(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生成的结果非常相似。

全解Python的地理編碼

现在,让我们创建一个函数来寻找整个数据集合的坐标。

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中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除