번역가 | Cui Hao
리뷰어 | Sun Shujuan
머신러닝을 위한 대규모 데이터 세트를 다룰 때 다음 주소 표시줄을 접하시나요?
위의 위치 데이터는 매우 혼란스럽고 처리하기 어렵습니다. 주소는 카디널리티가 매우 높기 때문에 인코딩이 어렵습니다. 단일 패스 인코딩 기술을 사용하여 열을 인코딩하려고 하면 결국 고차원 결과가 나타나게 되어 기계 학습 모델의 성능이 저하됩니다. 문제를 해결하는 가장 쉬운 방법은 열을 지오코딩하는 것입니다.
지오코딩은 주소를 지리적 좌표로 변환하는 것입니다. 즉, 원래 주소가 경도/위도로 변환됩니다.
Python으로 지오코딩하는 데 도움이 되는 다양한 라이브러리가 있습니다. 가장 빠른 것은 Google Maps에서 제공하는 API입니다. 단시간에 변환해야 할 주소가 1000개 이상인 경우에는 이를 사용하는 것이 좋습니다. 그러나 Google Maps API는 무료가 아니며 요청 1,000개당 약 5달러를 지불해야 합니다.
Google Maps API의 무료 대안은 OpenStreetMap API입니다. 그러나 OpenStreetMap API는 Google 지도보다 훨씬 느리고 정확도가 떨어집니다.
이 글에서는 위의 두 API를 사용한 지오코딩 과정을 안내해드리겠습니다.
먼저 Google Maps API를 사용하여 주소를 정밀도/위도로 변환해 보겠습니다. 먼저 Google Cloud 계정을 만들고 신용카드 정보를 입력해야 합니다. 유료 서비스이지만 Google Cloud 계정을 처음 만들면 Google에서 200달러의 무료 크레딧을 제공합니다. 이는 요금이 청구되기 전에 지오코딩 API를 사용하여 약 40,000번의 호출을 할 수 있음을 의미합니다. 이 한도에 도달하지 않는 한 귀하의 계정에 요금이 청구되지 않습니다.
먼저 Google Cloud에서 무료 계정을 만드세요. 그런 다음 계정을 설정하고 나면 이 튜토리얼에 따라 Google Maps API 키를 얻을 수 있습니다.
API 키를 받으면 코딩을 시작할 수 있습니다!
(1) 전제 조건
이 튜토리얼에서는 Zomato Restaurant 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 Maps 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!