Traducteur | Cui Hao
Reviewer | Sun Shujuan
Lorsque vous traitez de grands ensembles de données pour l'apprentissage automatique, rencontrez-vous la barre d'adresse suivante ?
Les données de localisation ci-dessus sont très confuses et difficiles à traiter. Le codage des adresses est difficile car elles ont une cardinalité très élevée. Si vous essayez d'encoder une colonne à l'aide d'une technique d'encodage en un seul passage, vous obtiendrez des résultats de grande dimension, ce qui entraînera de mauvaises performances du modèle d'apprentissage automatique. Le moyen le plus simple de résoudre le problème consiste à géocoder la colonne.
Le géocodage est la conversion d'une adresse en coordonnées géographiques, ce qui signifie que l'adresse d'origine sera convertie en longitude/latitude.
Il existe de nombreuses bibliothèques différentes qui peuvent vous aider à géocoder avec Python. La plus rapide est l'API fournie par Google Maps. S'il y a plus de 1000 adresses à convertir en peu de temps, je vous recommande de l'utiliser. Cependant, l'API Google Maps n'est pas gratuite, vous devez payer environ 5 $ pour 1 000 requêtes.
Une alternative gratuite à l'API Google Maps est l'API OpenStreetMap. Cependant, l'API OpenStreetMap est beaucoup plus lente et moins précise que Google Maps.
Dans cet article, je vais vous guider tout au long du processus de géocodage à l'aide des deux API ci-dessus.
Utilisons d'abord l'API Google Maps pour convertir l'adresse en précision/latitude. Vous devez d'abord créer un compte Google Cloud et saisir les informations de votre carte de crédit. Bien qu'il s'agisse d'un service payant, Google vous offrira 200 $ de crédit gratuit lorsque vous créerez pour la première fois un compte Google Cloud. Cela signifie que vous pouvez passer environ 40 000 appels avec leur API de géocodage avant d'être facturé. Tant que vous n'atteignez pas cette limite, votre compte ne sera pas débité.
Tout d'abord, créez un compte gratuit sur Google Cloud. Ensuite, une fois que vous avez créé un compte, vous pouvez suivre ce tutoriel pour obtenir votre clé API Google Maps.
Une fois que vous avez reçu la clé API, vous pouvez commencer à coder
(1) Prérequis
Utilisez l'ensemble de données Zomato Restaurant Kaggle dans ce tutoriel. Assurez-vous que l'ensemble de données est installé dans votre chemin. Ensuite, utilisez cette commande pour installer le package API googlemaps.
pip install -U googlemaps
(2) Lecture de l'ensemble de données
Maintenant, lisons l'ensemble de données et vérifions l'en-tête du bloc de données.
data = pd. read_csv('zomato.csv',encoding="ISO-8859-1") df = data.copy() df.head()
Cet ensemble de données comporte 21 colonnes et 9551 lignes.
Il vous suffit de géocoder la colonne d'adresse, supprimez donc toutes les autres colonnes. Ensuite, les enregistrements en double sont supprimés et finalement, seules les informations de la colonne d'adresse sont obtenues.
df = df[['地址']] df = df. drop_duplicates()
Regardez à nouveau l'en-tête du bloc de données. Après le traitement, vous ne voyez que les informations d'adresse.
Ensuite, vous pouvez commencer le géocodage.
(3) Géocodage
Tout d'abord, accédez à notre clé API en Python et exécutez les lignes de code suivantes pour terminer cette tâche.
gmaps_key = googlemaps.Client(key="your_API_key")
Maintenant, essayons de géocoder une adresse et voyons le résultat.
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))
Exécutez le code ci-dessus et obtenez un résultat similaire à celui-ci.
Si vous obtenez le résultat ci-dessus, parfait ! Cela veut dire que tout va bien. Nous pouvons appliquer un traitement similaire à l'ensemble de données comme suit :
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)
Vérifiez à nouveau l'en-tête de l'ensemble de données pour voir si le code fonctionne.
df.head()
Si le résultat est similaire à la capture d'écran ci-dessus, félicitations ! Vous avez géocodé avec succès les adresses dans tout votre bloc de données.
L'API OpenStreetMap est entièrement gratuite, mais comparée à l'API Google Maps, elle est plus lente et moins précise. Cette API ne peut pas localiser de nombreuses adresses dans l'ensemble de données, nous utiliserons donc cette fois la colonne d'emplacement à la place. Avant de commencer le didacticiel, regardons la différence entre la barre d'adresse et la barre d'emplacement. Exécutez les lignes de code suivantes pour accomplir cette tâche.
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年分布式架构经验。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!