崔浩评论|SunShujuan1.Introduction当你为机器学习处理大数据集时,你是否遇到过下面的地址栏?上面的位置数据非常混乱,难以处理。编码地址很困难,因为它们具有非常高的基数。如果您尝试使用单通道编码技术对列进行编码,则会导致高维结果,从而导致机器学习模型性能不佳。解决问题的最简单方法是对该列进行地理编码。2.什么是地理编码?地理编码是将地址转换为地理坐标,也就是将原始地址转换为经/纬度。3.在Python中进行地理编码有许多不同的库可以帮助您在Python中进行地理编码。最快的是谷歌地图提供的API。如果你有超过1000个地址需要在短时间内转换,我推荐你使用它。但是,GoogleMapsAPI不是免费的,您需要为每1000次请求支付大约5美元。GoogleMapsAPI的免费替代品是OpenStreetMapAPI。然而,OpenStreetMapAPI比谷歌地图慢得多,而且准确度稍差。在本文中,我将指导您使用上述两个API完成地理编码过程。4.GoogleMapsAPI让我们首先使用GoogleMapsAPI将地址转换为精度/纬度。您首先需要创建一个GoogleCloud帐户并输入您的信用卡信息。虽然它是一项付费服务??,但在您首次创建GoogleCloud帐户时,Google会为您提供200美元的免费赠金。这意味着,您可以在收到账单之前使用他们的地理编码API进行大约40,000次调用。只要您没有达到此限制,就不会向您的帐户收费。首先,在GoogleCloud上设置一个免费帐户。然后,一旦您设置了一个帐户,您就可以按照本教程获取您的GoogleMapsAPI密钥。收到API密钥后,您就可以开始编码了!(1)先决条件本教程使用ZomatoRestaurantKaggle数据集。确保数据集安装在您的路径中。然后,使用此命令安装googlemapsAPI包。pipinstall-Ugooglemaps(2)读取数据集现在,让我们读取数据集并检查数据帧的标题。data=pd.read_csv('zomato.csv',encoding="ISO-8859-1")df=data.copy()df.head()这个数据集有21列9551行。只有地址列需要进行地理编码,所以去掉所有其他列。然后,去掉重复的记录,最后只得到地址栏的信息。df=df[['address']]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))运行上面的代码,得到类似下面的输出。如果你得到上面的输出,太棒了!表示一切正常。我们可以对整个数据集应用类似的过程,如下所示:defgeocode(add):g=gmaps_key.geocode(add)lat=g[0]["geometry"]["location"]["lat"]lng=g[0]["几何"]["位置"]["lng"]返回(经纬度)。df['地理编码']=df['地址']。apply(geocode)再次检查数据集的标题以查看代码是否有效。df.head()如果输出类似于上面的截图,恭喜!您已成功对整个数据框中的地址进行地理编码。5.OpenStreetMapAPIOpenStreetMapAPI是完全免费的,但与GoogleMapsAPI相比,速度较慢且准确性较低。此API无法定位数据集中的许多地址,因此这次我们将改用位置列。在我们开始教程之前,让我们看看地址栏和位置栏之间的区别。运行以下代码行来完成此任务。print('Address:'+data['Address'][0]+'\n\nLocality:'+data['Locality'][0])地址栏(Address)比位置(Locality)详细很多)bar,它提供餐厅的确切位置,包括楼层数。这可能是OpenStreetMapAPI无法识别地址但地点可以的原因。让我们对第一个Locality进行地理编码并查看输出。地理编码运行以下代码行。导入urlImportrequestsdata=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'])左右滑动到查看完整代码上面代码的输出与GoogleMapsAPI生成的输出非常相似。现在,让我们创建一个函数来查找整个数据集的坐标。defgeocode2(locality):url='https://nominatim.openstreetmap.org/search/'+urllib.parse.quote(locality)+'?format=json'response=requests.get(url).json()如果(len(响应)!=0)。返回(响应[0]['lat'],响应[0]['lon'])else:返回('-1')数据['geocoded']=数据['Locality'].apply(geocode2)是非常好!现在,让我们看看数据收集的负责人。Data.head(15)请注意,此API无法提供数据集合中某些位置的坐标。虽然它是GoogleMapsAPI的免费替代品,但如果使用OpenStreetMap进行地理编码,则存在丢失大量数据的风险。本教程到此结束!希望您从中学到了一些新东西,并对使用地理空间数据有了更好的理解。原文链接:https://www.kdnuggets.com/2022/11/geocoding-python-complete-guide.html译者介绍崔浩,社区编辑,资深架构师,18年软件开发和架构经验,10年的分布式架构经验。
