• Home
  • artículos
  • Geopy: geoposiciona las bases rebeldes con Python y Qlik Sense.
Search

Geopy: geoposiciona las bases rebeldes con Python y Qlik Sense.

Hola!,

aprovechando los datos que obtuvimos haciendo Web Scraping en la web de LEGO, vamos a intentar hacer dos cosillas:

  1. Conseguir las coordenadas geográficas de las tiendas que LEGO tiene dispersas por el mundo, gracias a geopy.
  2. Visualizarlas en un mapa con la ayuda de Qlik Sense.

Geopy es una librería de Python que nos permite acceder a servicios de geocodificación y obtener las coordenadas de paises, ciudades o direcciones. También podemos utilizarlo a la inversa, proporcionándole las coordenadas, nos devolverá una dirección. Otra función que puede ser de utilidad es la posibilidad de calcular distancias entre coordenadas.

En nuestro caso, nos aprovecharemos de la primera opción.

Con geopy podemos utilizar un número elevado de servicios de geolocalización. Por ejemplo, Google Maps, OpenStreetMap, Nominatim, Bing Maps o Yahoo BOSS. Y tiene implementada una clase para cada uno en geopy.geocoders.

Nosotros vamos a utilizar la API de codificación geográfica de Google (V3). Para ello primero tendremos que obtener una API key, siguiendo estas instrucciones. Ojo!, que también podemos usar cualquier otro servicio en el que no es necesario una key, si nos apetece.

Una vez que tenemos la API key de Google Maps, podemos empezar con el código.

Lo primero, importar librerías, incluyendo la del geocodificador que vamos a usar.

import pandas as pd
from geopy.geocoders import GoogleV3

Importamos los datos y los pasamos a un dataframe. (Descárgatelos de aquí).

df = pd.read_csv('Py_Lego_stores_2018218.csv', sep=";", encoding='utf-8')

Creamos una instancia de nuestro geocodificador

geolocator = GoogleV3(api_key = 'Aquí va la API key')

Vamos a escribir una función con la que Google Maps nos devolverá la dirección de la tienda, su latitud y su longitud. Ésta función tendrá como argumento una fila del dataframe de datos. De dicha fila utilizaremos el campo address para nuestro objetivo.

def geolego(row):
    address_src = row['address']
    if row['country'] == 'China':
        address_src = eval(address_src).decode('utf-8')
    try:
        address, (latitude, longitude) = geolocator.geocode(address_src, timeout=15)
    except TypeError:
        address, latitude, longitude = 'TypeError', -91, -181
    return pd.Series({"GOOGLE_address": address, "latitude": latitude, "longitude": longitude})

Recordamos que la dirección de la tienda en China estaba codificada en itf-8, así que tenemos que decodificar para pasarsela a Google. En caso de que Google no encuentre la dirección, la función nos devolverá los valores ‘TypeError’, -91 y -181 para la dirección, latitud y longitud, respectivamente.

Bien, ya solo queda aplicar nuestra función geolego a cada fila del dataframe, añadiendo a éste unas nuevas columnas ‘GOOGLE_address’, latitude y longitude.

df[['GOOGLE_address', 'latitude', 'longitude']] = df.apply(geolego, axis=1)

Ahora eliminamos las filas con las direcciones con valor ‘TypeError’.

df = df[df.GOOGLE_address != 'TypeError']

Imprimimos las 5 primeras filas.

print(df.head())
   country                                          store_url  \
0  Austria  https://www.lego.com/en-us/stores/stores/at/vi...   
1  Austria  https://www.lego.com/en-us/stores/stores/at/vi...   
2  Belgium  https://www.lego.com/en-us/stores/stores/be/wi...   
4   Canada  https://www.lego.com/en-us/stores/stores/ca/so...   
5   Canada  https://www.lego.com/en-us/stores/stores/ca/gu...   

                                         address  \
0    SHOPPING CITY SÜD, UNIT G103 2334 VÖSENDORF   
1          WAGRAMER STRAßE 81, #928B 1220 VIENNA   
2      SPACE 526, TURNHOUTSEBAAN 5 2110 WIJNEGEM   
4  5015-111 ST NW SPACE #424 EDMONTON AB T6H 4M6   
5             10355 152 STREET SURREY BC V3R 7C1   

                                   GOOGLE_address   latitude   longitude  
0         Bahnhofpl. 164, 2334 Vösendorf, Austria  48.109321   16.317248  
1       Wagramer Str. 81/928b, 1220 Wien, Austria  48.242361   16.434990  
2        Turnhoutsebaan 5, 2110 Wijnegem, Belgium  51.223114    4.500488  
4  5015 111 St #424, Edmonton, AB T6H 4M6, Canada  53.485497 -113.513713  
5        10355 152 St, Surrey, BC V3R 7C1, Canada  49.190417 -122.803713

Y guardamos el dataframe en un archivo csv.

df.to_csv('lego_stores_coord.csv', sep=';', index=False, encoding='utf-8')

Y ya tenemos los datos preparados para colocar las tiendas de LEGO en un mapa, con la ayuda de Qlik.

Qlik es una plataforma que te permite hacer análitica visual. Las versiones gratuitas son dos: la versión Cloud, en la que tienes que subir tus datos a la aplicación. Y la versión Desktop, que te permite usar datos en local o conectarte a BBDD remotas, pero tienes que instalarte la aplicación en tu equipo.

Vamos a usar Qlik Sense Cloud que tiene la ventaja de poder compartir luego tus gráficos.

Una vez que nos hemos registrado e iniciado sesión, nos aparecerá una ventana con varias opciones a la izquierda. Seleccionando Mis archivos de datos podemos importar nuestro archivo csv.

Qlik 1

Qlik 2

Con nuestros datos importados nos vamos a la sección Mi trabajo, y creamos una nueva app.

Qlik 3

Qlik 4

Una vez que cargue la nueva aplicación, nos pedirá añadir los datos que vamos a usar en ella. Pinchamos en añadir datos de archivos y otras fuentes.  seleccionamos nuestro archivo csv y nos mostrará información sobre él. Deseleccionamos las columnas que no vamos a usar, quedándonos con GOOGLE_Address, latitude y longitude, y pinchamos en añadir datos.

Qlik 5

Qlik 6

Qlik 7

A continuación nos aparecerá una pantalla como esta:

Qlik 8

En la que podremos elegir entre un montón de tipos de gráficos. Pinchamos en el gráfico Mapa y lo arrastramos al centro. Nos aparecerá el gráfico en modo edición, pidiéndonos que añadamos una dimensión. Pinchamos y nos aparece un menú desplegable con los distintos campos entre los que podemos elegir. Qlik ha detectado en nuestros datos que los campos latitude y longitude podrían ser datos de geoposicionamiento, y ha creado una nueva columna con el nombre longitude-latitude con el formato correcto para Qlik. Seleccionamos dicho campo.

Qlik 9

Lo siguiente que nos pide Qlik es elegir qué campo queremos que represente a los puntos que dibujará en el mapa. Elegimos el campo Google_address, para que al colocar el ratón sobre un punto nos aparezca su dirección.

Qlik 10

Al hacerlo, nos aparecerá el mapa del mundo con los puntos correspondientes a las tiendas. Solo queda desactivar el modo edición, haciendo click en Hecho, y ya podemos interactuar con nuestro mapa.

Qlik 11

Qlik 12

Si queremos utilizar nuestra visualización en nuestra web, podemos hacer click derecho sobre el gráfico y elegir la opción Compartir. Nos aparecerá un trozo de código HTML que podemos colocar en el código de nuestra página.

Qlik 13

Qlik 14

No te lo pienses y prueba!

Puedes descargarte el código de mi 

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.