Ir al contenido

Cómo convertir direcciones a latitud y longitud con Tabpy y Tableau Prep

·2466 palabras·12 mins
tableau tableau prep tabpy google cloud
Pablo Sáenz de Tejada
Autor
Pablo Sáenz de Tejada
Ayudo a las personas a analizar, visualizar y comunicar con datos.
Tabla de contenido

Uno de los puntos fuertes de Tableau es la potencia con mapas y datos geográficos. Pero si queremos mapear direcciones, necesitamos la latitud y longitud de cada una ¿Cómo podemos convertir direcciones en coordenadas para mapear nuestros datos?

La respuesta es con Tabpy, Tableau Prep y una API que permita la conversión de direcciones en latitudes y longitudes como la Geocoding API de Google.

La dificultad al visualizar direcciones postales
#

En Tableau es muy sencillo analizar información geolocalizada si disponemos de datos sobre el país, provincia, ciudad o código postal, o incluso podemos combinar nuestros datos con información geoespacial de archivos shapefile (shp). Pero si lo que tenemos en nuestros datos de origen son sólamente direcciones postales, necesitaremos convertirlas en coordenadas geográficas (latitud y longitud) para poder visualizar los datos geográficamente.

Geolocalizar una dirección es algo que nos parece muy sencillo hoy en día ya que servicios como Google Maps forman parte de nuestro día a día. Si quiero saber donde está una dirección, voy a Google Maps, busco la dirección y… ¡ahi está! Incluso podemos obtener la latitud y longitud de cualquier punto en Google Maps símplemente haciendo clic derecho en cualquier punto del mapa.

Por desgracia, Tableau y otras plataformas de visualización no son capaces de hacer eso automáticamente. Pero sí podemos usar Tableau para agilizar la transformación y guardado de direcciones en latitudes y longitudes para su posterior uso. Para ello vamos a utilizar las siguientes herramientas:

  • TabPy: una extensión de Tableau que permite ejecutar scripts de Python, ampliando con ello las capacidades de Tableau.
  • Tableau Prep: Para realizar un flujo que nos permita cargar nuestras direcciones de partida, ejecutar el script de Python, comprobar los resultados y guardarlos donde queramos: una fichero local, una base de datos, en Tableau Cloud, Tableau Server o en Data Cloud de Salesforce.
  • Geocoding API de Google: Para buscar cada una de las direcciones y transformarla automáticamente en latitud y longitud. O dicho de otro modo, para geolocalizar las direcciones postales.

Vamos a realizar todo el proceso paso a paso.

Paso 1: Instalar TabPy
#

TabPy se puede instalar tanto localmente como en un servidor para así poder usarlo de forma global. Para hacerlo algo más sencillo, en este caso vamos a instalar TabPy localmente en nuestro ordenador.

Para ello lo primero que vamos a necesitar es instalar Python si no lo tienes ya. Voy a dar por hecho que ya tienes instalado Python en tu ordenador, pero si no es así te recomiendo que sigas las instrucciones en la web oficial dependiendo del sistema operativo que uses.

Instalar y actualizar pip
#

Una vez tengamos Python instalado es hora de instalar TabPy, pero primero es recomendable primero instalar y actualizar pip. Para ello, en la línea de comandos de nuestro ordenador ejecutaremos:

python -m pip install --upgrade pip

Instalar TabPy
#

Tras instalar y actualizar pip es cuando podemos intalar el paquete TabPy ejecutando el siguiente código en la línea de comandos:

pip install tabpy

¡Listo! Ya tenemos TabPy instalado, aunque de momento no lo vamos a usar.

Paso 2: Instalar los módulos de pandas y googlemaps
#

Hay algunos módulos más que necesitaremos en nuestro script de Python por lo que es importante asegurarse de que los tenemos instalados.

El primero de ellos es pandas, el cual muy posiblemente tendrás ya porque es de los más habituales. Para instalarlo, ejecuta el siguiente código en la línea de comandos:

pip install pandas

A continuación instalaremos una librería de de python que permita usar directamente la plataforma de servicios de Google Maps en Python, para lo cual ejecutaremos este otro código en la línea de comandos:

pip install googlemaps

¡Perfecto! Ya tenemos todo lo necesario relacionado con Python.

Paso 3: Activar Google Geocoding API de Google Cloud
#

Lo siguiente que necesitamos es un servicio que transforme una dirección postal en su latitud y longitud. Hoy en día hay muchos servicios de este tipo: Amazon Geocoding, Mapbox Geocoding, Openroute Service o Google Geocoding API entre muchos otros.

El motivo por el que en este caso uso el último de ellos es porque fue el primero de todos que probé, me pareció fácil de usar, y hay que reconocer que los resultados de Google son muy buenos en general.

Configurar Google Cloud
#

Eso sí, es importante aclarar que la API de Geocoding de Google es un servicio de pago de la plataforma Google Cloud. Aunque si no me equivoco para pocas consultas es bastante barato o incluso tiene un límite mensual gratuito. No obstante, recomiendo siempre consultar la documentación al respecto antes aquí.

Acceso a Google Cloud
#

Para empezar, tenemos que ir a Google Cloud y acceder a la Consola con una cuenta de Google. A día de hoy el enlace para acceder a la Consola se encuentra arriba a la derecha de la página principal de Google Cloud, como puedes ver ampliando la siguiente imagen.

Acceso a la Consola de Google Cloud
Acceso a la Consola de Google Cloud.

Crear un proyecto
#

Una vez en nuestra consola tendremos que crear un proyecto a través de:

Menú > IAM y administración > Crear un proyecto.
Menú para crear un nuevo proyecto en Google Cloud
Menú para crear un nuevo proyecto en Google Cloud.

Le damos un nombre al proyecto y añadimos una cuenta de facturación (necesaria al tratarse de un servicio de pago) y una ubicación. En mi caso, al usar Google Cloud para uso personal, mi ubicación aparece como “Sin Organización”, ya que no tengo Workspaces ni servicios de Google para empresas, pero esto no nos afectará y podemos hacer clic en Crear una vez estemos listos.

Opciones al crear un nuevo proyecto en Google Cloud
Opciones al crear un nuevo proyecto en Google Cloud.

Crear una credencial para usar la API de Google Maps
#

Ya tenemos nuestro proyecto en Google Cloud. Ahora iremos a la sección de Credenciales en:

Menú > APIs y servicios > Credenciales.
Credenciales de API en Google Cloud
Credenciales de API en Google Cloud.

Y en la siguiente pantalla, haremos clic en:

Crear credenciales > Clave de API

Una vez se haya creado la clave de API, en la pantalla de Credenciales deberíamos ver la sección de Claves de API con el nombre por defecto que se le ha dado, la fecha de creación y las restricciones. Vamos a ver algo más en detalle las opciones de la clave, así que haz clic en ella para entrar en los detalles.

Configurar y limitar el uso de la credencial
#

¿Por qué es importante conocer más en detalle las opciones de las credenciales? Porque aquí podremos crear restricciones a la hora de usar la API y así limitar el uso indebido de la misma.

Configuración y limitación de las credenciales para APIs en Google Cloud
Configuración y limitación de las credenciales para APIs en Google Cloud.

Aquí podremos, desde algo tan sencillo como cambiarle el nombre a la API y revisar la llave - key - de la misma, hasta establecer restricciones. En concreto podemos establecer dos tipos de restricciones:

  • Restricciones por direcciones IP: Indicando desde qué direcciones IP queremos que se pueda utilizar la credencial.
  • Restricciones por API: limitando qué APIs de Google Cloud se podrán usar con la key. En nuestro caso, podemos restringir la clave para que sólo se pueda usar con la Geocoding API.

Una vez hemos creado la clave y limitado su uso como creamos conveniente, podemos seguir avanzando.

Paso 4: El Script de Python de Tableau Prep
#

Ahora viene la parte más complicada (al menos lo fue para mí, que no soy un experto en Python), pero que tienes suerte porqyue te la voy a dar ya lista para usar. Ahora necesitamos ese famoso script de Python que utilice nuestros datos de origen en Tableau Prep con direcciones postales, y envíe esa información a la Geocoding API de Google para geolocalizar cada dirección a través de TabPy. Es decir, necesitaremos que nuestras direcciones tengan un formato parecido a este:

Calle Nombre de la Calle, 1, Ciudad, Provincia, Pais

¿Cómo crear un script de TabPy para Tableau Prep?
#

Pero aquellos de vosotros que queráis entender mejor cómo funcionan los scripts de TabPy en Tableau Prep para crear los vuestros en el futuro, voy a dedicar unos párrafos a explicarlo brevemente, pero puedes pasar directamente al script si no te interesa entrar en detalles.

Hay ciertos aspectos que hay que tener en cuenta a la hora de crear el script de Python para que funcione correctamente en Tableau Prep:

  1. El script debe incluir una función que especifique un Pandas DataFrame (pd.DataFrame) como argumento de la función que se utilizará para llamar a nuestros datos desde Tableau Prep.

  2. La función tendrá también que devolver los resultados en un Pandas DataFrame (pd.DataFrame) usando los tipos de datos que están permitidos y soportados, que son:

    Dato en PrepDato en Python
    StringStandard UTF-8 String
    DecimalDouble
    IntInteger
    BoolBoolean
    DateString en formato ISO_DATE: “YYYY-MM-DD”
    DateTimeString en formato ISO_DATE_TIME: “YYYY-MM-DDT:HH:mm:ss”
  3. Si queremos obtener en nuestros resultados campos diferentes a los utilizados en el input - como es nuestro caso, ya que el input será una dirección y obtendremos además la latitud y la longitud - tenemos que incluir una función get_output_schema que defina el output que queremos y los tipos de dato de cada columna. Los campos a definir en esta función get_output_schema deberán seguir esta sintaxis:

    Función en el scriptTipo de dato
    prep_string()String
    prep_decimal()Decimal
    prep_int()Integer
    prep_bool()Boolean
    prep_date()Date
    prep_datetime()DateTime

El Script de geocodificación
#

Y aquí está el script que usaremos en Tableau Prep:

import googlemaps
import pandas as pd
import json

def geocode_address(df):

    lat = []
    lon = []
    adr = []
    for i in df.index:
        mykey = 'paste-here-Google-api-key'
        gmaps = googlemaps.Client(key=mykey)
        id = df['address'][i]
        print(id)
        geocode_result = gmaps.geocode(id)
        json_data = json.dumps(geocode_result)
        json_dict = json.loads(json_data)
        lt = json_dict[0]['geometry']['location']['lat']
        lg = json_dict[0]['geometry']['location']['lng']
        formatted_address = json_dict[0]['formatted_address']
        adr.append(formatted_address)
        lat.append(lt)
        lon.append(lg)
    
    df = pd.concat([df['address'], pd.Series(adr, name='formatted_address'),
                     pd.Series(lat, name='latitude'), pd.Series(lon, name='longitude')], axis=1)
    return df

def get_output_schema():
    return pd.DataFrame({
        'address': prep_string(),
        'formatted_address' : prep_string(),
        'latitude' : prep_decimal(),
        'longitude' : prep_decimal(),
        })

¿Qué hay que hacer para usar el script?

Tendrás que copiar el script y pegarlo en Visual Code Studio, un bloc de notas o la aplicación que prefieras, y guardarlo en un archivo con extensión .py

En mi caso he guardado el archivo y lo he llamado tabpy_geocoding.py. Si eres usuario de Github, también puedes acceder al archivo en mi repositorio de GitHub.

psaenzdetejada/tabpy-geocoding

Script to geocode addresses and convert them to latitude and longitude using Python’s googlemaps module, TabPy and Tableau Prep

Python
0
0

Tendrás también que abrir el archivo con Visual Code Studio o tu herramienta de preferencia para editarlo y modificar la línea 18:

17
18
19
 for i in df.index:
        mykey = 'paste-here-Google-api-key'
        gmaps = googlemaps.Client(key=mykey)

Y reemplazar el texto paste-here-Google-api-key por la credencial de la API de Google que hemos creado en el paso anterior. Recuerda que la credencial deberá ir entre comillas.

Paso 5: Iniciar TabPy
#

Recapitulemos: Tenemos instalado TabPy, creada la credencial de la API de Google en Google Cloud y descargado el script de Python con nuestra credencial añadida. Ahora es cuando podemos poner en marcha TabPy. Si hemos instalado TabPy correctamente en nuestro ordenador, lo único que tendremos que hacer es abrir una ventana de la línea de comandos y ejecutar el comando:

tabpy

Normalmente nos dará un aviso de que no se ha configurado ningún usuario / contraseña. Lo ideal sería configurar uno, pero para esta prueba podemos pulsar “y” para continuar sin usar usuario / contraseña. Deberá aparecernos el puerto en el que está el servicio de TabPy, normalmente 9004. Por lo que TabPy debería estar ya listo para que lo usemos. Ahora toca crear un flujo de Tableau Prep para geocodificar nuestras direcciones.

Paso 6: Configurar TabPy en Tableau Prep: Extensiones Analíticas
#

Para ello tenemos que configurar TabPy en Tableau Prep ¿Cómo? A través de la sección de extensiones analíticas de Tableau, que es donde podemos definir la IP o el servidor donde se encuentra la extensión que queramos usar - TabPy, R, etc. -. Para configurarla, tenemos que abrir el menú de extensiones analíticas en Tableau Prep en:

Menú > Server > Settings and Performance 
> Manage Analytics Extension Connection.
Configurar la extensión analítica de TabPy en Tableau Prep
Configurar la extensión analítica de TabPy en Tableau Prep.

Seleccionamos TabPy en el menú desplegable, y si hemos ejecutado TabPy en nuestro ordenador, tendremos que poner localhost en Server y 9004 en Port y en principio deberíamos dejar el username y password en blanco si no lo hemos configurado. Si quieres configurar un usuario y contraseña tienes más información en la documentación oficial de TabPy, en GitHub.

Configurar la extensión analítica de TabPy en Tableau Prep
Configurar la extensión analítica de TabPy en Tableau Prep.

Hacemos clic en Sign In y ya deberíamos tener TabPy listo para usarlo en nuestro flujo.

Paso 7: Crear el flujo de Tableau Prep
#

Crear el flujo en Tableau Prep es de los pasos más sencillos: lo primero será cargar los datos que contengan nuestras direcciones. Lo más importante es que el campo que contenga la dirección se llame “address” si no queremos tener que modificar el script de Python o cambiar el nombre del campo con las direcciones a “address” (en minúsculas) en un paso de preparación dentro del flujo.

En cuanto al formato de las direcciones, cuanta más información podemos aportar mejor será la geolocalización. Es importante tener en cuenta que puede haber dos calles con el mismo nombre en dos ciudades distintas. O dos ciudades con el mismo nombre en dos países distintos. Por lo que mi recomendación es incluir el nombre y número de la calle, el código postal, la ciudad, la provincia o estado y el país. Aunque el país no parezca importante, puede ayudar a diferenciar direcciones parecidas en dos países distintos. Así que cuanto más contexto demos en la dirección que ayude a localizarla, mejor.
Configurar la extensión analítica de TabPy en Tableau Prep
Configurar la extensión analítica de TabPy en Tableau Prep.

El segundo nodo o paso en Tableau Prep será un nodo Script en el cual indicaremos TabPy como Tipo de conexión, seleccionaremos en el menú desplegable el archivo .py con el script que hemos descargado, creado o guardado en el paso 4 y por último indicamos el nombre de la función del script: geocode_address, que es la que se encarga de enviar las direcciones a Google Cloud para su geocodificación.

Configurar la extensión analítica de TabPy en Tableau Prep
Configurar la extensión analítica de TabPy en Tableau Prep.

Como se ve en la imagen, el script ha cogido el campo “address” de mi fichero de datos, y ha devuelto esa misma columna y tres columnas más:

  • formatted_address: Una columna con la dirección que devuelve la API de Google (la dirección en el formato de Google).
  • latitude: la latitud de la dirección.
  • longitude: la longitud de la dirección.

Ya tenemos nuestras direcciones geolocalizadas, y listas. Por último, podemos guardar el output donde nos interese: un fichero local, una base de datos o Data Cloud de Salesforce y visualizar los datos en Tableau fácilmente utilizando esos nuevos campos.