Logotipo de Zephyrnet

Geocodificación en Python: una guía completa

Fecha:

Geocodificación en Python: una guía completa
Foto por Andres Stutesman on Unsplash

 

Cuando se trata de grandes conjuntos de datos para el aprendizaje automático, ¿alguna vez se encontró con una columna de dirección que se vea así?

 

Geocodificación en Python: una guía completa

Imagen del autor

 

Los datos de ubicación pueden ser muy confusos y difíciles de procesar.

Es difícil codificar direcciones, ya que son de cardinalidad muy alta. Si intenta codificar una columna como esta con una técnica como la codificación one-hot, dará lugar a una alta dimensionalidad y es posible que su modelo de aprendizaje automático no funcione bien.

La manera más fácil de superar este problema es geocódigo estas columnas.

La geocodificación es el proceso de convertir direcciones en coordenadas geográficas. Esto significa que transformará direcciones sin procesar en pares de latitud/longitud.

Hay muchas bibliotecas diferentes disponibles que pueden ayudarlo a hacer esto con Python. El más rápido es el API de mapas de Google, que recomiendo si tiene más de 1000 direcciones que necesita convertir en un corto período de tiempo.

Sin embargo, la API de Google Maps no es gratuita. Deberá pagar alrededor de $ 5 por cada 1000 solicitudes.

Una alternativa gratuita a la API de Google Maps es la API de OpenStreetMap. Sin embargo, la API de OpenStreetMap es mucho más lenta y también un poco menos precisa.

En este artículo, lo guiaré a través del proceso de geocodificación con estas dos API.

Primero usemos la API de Google Maps para convertir direcciones en pares de latitud/longitud. Primero deberá crear una cuenta de Google Cloud para hacer esto e ingresar la información de su tarjeta de crédito.

Aunque este es un servicio pago, Google le otorga $ 200 en crédito gratis cuando crea una cuenta de Google Cloud por primera vez. Esto significa que puede realizar alrededor de 40,000 llamadas con su API de geocodificación antes de que se le cobre por ello. Mientras no alcance este límite, no se le cobrará a su cuenta.

En primer lugar, configurar una cuenta gratis con la nube de Google. Luego, una vez que haya configurado una cuenta, puede seguir así tutorial para obtener su clave API de Google Maps.

Una vez que haya recibido su clave API, ¡puede comenzar a codificar!

Pre-requisitos

Vamos a utilizar el Restaurantes de Zomato conjunto de datos para este tutorial. Asegúrese de tener el conjunto de datos instalado en su ruta. Luego, instala el paquete API de Google Maps con este comando:

pip install -U googlemaps

Importaciones

Ejecute las siguientes líneas de código para importar las bibliotecas que necesita para comenzar:

pip install -U googlemaps

 

Leer el conjunto de datos

Ahora, leamos el conjunto de datos y verifiquemos el encabezado del marco de datos:

data = pd.read_csv('zomato.csv',encoding="ISO-8859-1")
df = data.copy()
df.head()

 

Geocodificación en Python: una guía completa

Imagen del autor

 

Este dataframe tiene 21 columnas y 9551 filas.

Solo necesitamos la columna de dirección para la codificación geográfica, por lo que eliminaré todas las demás columnas. Luego, eliminaré los duplicados para que solo obtengamos direcciones únicas:

df = df[['Address']]
df = df.drop_duplicates()

 

Echando un vistazo al encabezado del marco de datos nuevamente, podemos ver solo la columna de dirección:

 

Geocodificación en Python: una guía completa

Imagen del autor

 

¡Excelente! Podemos empezar a geocodificar ahora.

Geocodificación

Primero, necesitamos acceder a nuestra clave API con Python. Ejecute las siguientes líneas de código para hacer esto:

gmaps_key = googlemaps.Client(key="your_API_key")

 

Ahora, intentemos geocodificar una dirección primero y echemos un vistazo a la salida.

add_1 = df['Address'][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))

 

La salida del código anterior se ve así:

 

Geocodificación en Python: una guía completa

Imagen del autor

 

Si obtiene el resultado anterior, ¡excelente! Todo funciona.

Ahora podemos replicar este proceso para todo el marco de datos:

# geocode the entire dataframe: 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)

 

Revisemos el encabezado del marco de datos nuevamente para ver si esto funcionó:

 

Geocodificación en Python: una guía completa
 

Si su salida se parece a la captura de pantalla anterior, ¡felicidades! Tiene direcciones geocodificadas con éxito en un marco de datos completo.

La API de OpenStreetMap es completamente gratuita, pero es más lenta y menos precisa que la API de mapas de Google.

Esta API no pudo ubicar muchas de las direcciones en el conjunto de datos, por lo que usaremos el localidad columna esta vez en su lugar.

Antes de comenzar con el tutorial, veamos la diferencia entre el dirección y localidad columna. Ejecute las siguientes líneas de código para hacer esto:

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

 

Su salida se verá así:

 

Geocodificación en Python: una guía completa

Imagen del autor

 

La dirección la columna es mucho más granular que la localidad columna, y proporciona la ubicación exacta del restaurante, incluido el número de piso. Esta podría ser la razón por la que la API de OpenStreetMap no reconoce la dirección, pero sí la localidad.

Vamos a geocodificar la primera localidad y echar un vistazo a la salida.

Geocode

Ejecute las siguientes líneas de código:

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'])

 

El resultado de los códigos anteriores es muy similar al resultado generado por la API de Google Maps:

 

Geocodificación en Python: una guía completa

Imagen del autor

 

Ahora, creemos una función para encontrar las coordenadas de todo el marco de datos:

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)

 

¡Excelente! Ahora, echemos un vistazo al encabezado del marco de datos:

data.head(15)

 

Tenga en cuenta que esta API no pudo generar coordenadas para muchas de las localidades en el marco de datos.

Aunque es una excelente alternativa gratuita a la API de Google Maps, corre el riesgo de perder una gran cantidad de datos si geocodifica con OpenStreetMap.

¡Eso es todo por este tutorial! Espero que hayas aprendido algo nuevo de aquí y tengas una mejor comprensión sobre el manejo de datos geoespaciales.

¡Buena suerte con su viaje de ciencia de datos y gracias por leer!

 
 
Natassha Selvaraj es un científico de datos autodidacta apasionado por la escritura. Puedes conectarte con ella en Etiqueta LinkedIn.

 
Original. Publicado de nuevo con permiso.
 

punto_img

Información más reciente

punto_img