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í?
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()
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:
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í:
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ó:
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í:
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:
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.
- Coinsmart. El mejor intercambio de Bitcoin y criptografía de Europa.Haga clic aquí
- Platoblockchain. Inteligencia del Metaverso Web3. Conocimiento amplificado. Accede Aquí.
- Fuente: https://www.kdnuggets.com/2022/11/geocoding-python-complete-guide.html?utm_source=rss&utm_medium=rss&utm_campaign=geocoding-in-python-a-complete-guide