Datos por todos lados😻: la API del Gobierno de la Ciudad de México
Contar con datos de cualquier nivel de gobierno ha sido una demanda recurrente por parte de los ciudadanos para dar seguimiento a su actividad, saber cómo gasta, qué se hace, dónde y cómo. Hoy, se ha avanzado muchísimo en el desarrollo de herramientas de consulta de información que han facilitado la observancia de la actividad gubernamental. Dentro de este esfuerzo por satisfacer esta demanda de información, algunos gobiernos han avanzado en esto generando sitios de datos abiertos.📊📉📈🗃
En este sentido, uno de los trabajos que deben destacarse 🙌🏼es el realizado por la actual administración del Gobierno de la Ciudad de México con la Agencia Digital de Innovación Pública(ADIP) la cual se dio a la tarea de abrir los datos de distintas dependencias de la administración de la Ciudad mediante el portal de datos, el cual ha resultado un mecanismo efectivo de rendición de cuentas y, además, permite realizar análisis de diferentes tipos.
Si bien el portal ha sufrido algunos cambios, ofrece información para la consulta y descarga de cualquier usuario independientemente de su destreza con lenguajes de programación o softwares para manejo de datos.
Algo que en últimas fechas me ha interesado es la explotación de información mediante las APIs (puedes ver el artículo de la API del DENUE aquí). En este artículo, te enseño algunas características y cómo puedes obtener información de las APIs de la ADIP.🤗
Características de la API de la ADIP
Algo que debes saber sobre la API de la ADIP es que, a diferencia de otras, no es necesario enviar una solicitud para contar con una llave (key), basta con entrar al conjunto de datos y copiar directamente la liga y listo.😃
Otra cosa que debes saber es que, por defecto, arroja un resultado de 100 observaciones y un máximo de 32,000 por lo que debes ajustar el límite de éstas en la URL. En esta página puedes checar un poquito más sobre las características de la API de la ADIP.🤓
Por ejemplo, en este ocasión, te mostraré cómo acceder al conjunto de datos que contiene la tasa de positividad de COVID-19 en la Ciudad de México.🦠
El número total de observaciones de ese conjunto al día en que se redacta esto es de 547, por lo que, en la URL, establezco lo siguiente:
“https://datos.cdmx.gob.mx/api/3/action/datastore_search?resource_id=ae2cd306-1aed-45a1-8ee4-3d0b0852ae4b&limit=400000"
Si te das cuenta, en donde dice limit, escribo 400 mil. Como resultado la API me arrojará las 547. Ojo, estoy estableciendo un límite superior al permitido por lo que si el conjunto tuviera más de 32 mil, únicamente me mostraría el límite permitido por lo que hay que tener esto en consideración.😔
Ahora sí, a usar la API
Como comenté, usaré como ejemplo los datos de positividad:
Lo primero que hacemos es definir las librerías con las que se trabajará:
#Uso de la API de la ADIP#Libreríasimport requests
import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px
import numpy as np
import chart_studio.plotly as py
import chart_studio
Una vez hecho esto, definimos la URL de donde se extraerán los datos con el límite que había comentado y se establece la respuesta a la consulta en formato JSON:
#url de la APIurl="https://datos.cdmx.gob.mx/api/3/action/datastore_search?resource_id=ae2cd306-1aed-45a1-8ee4-3d0b0852ae4b&limit=400000"
#Respuesta de la consulta a la API con formato JSON
respuesta = requests.get(url).json()
Si se exploran las llaves de la respuesta, se puede ver que obtenemos 3 resultados: help, success y result:
Te preguntarás, ¿y dónde están los datos? Pues justo en la llave “results” por lo que guardamos únicamente ésta:
#Guardamos únicamente los elementos de resultados
result=respuesta["result"]
Hacemos esto previo a guardarlo como una dataframe ya que dentro de ésta llave contamos con las siguientes subllaves:
De tooooodas estas subllaves, la buena es la de “records” la cual, ahora sí, guardamos como dataframe:
#Declaramos una dataframe únicamente usando la key denominada RECORDSdf= pd.DataFrame(result["records"])##Pasamos los nombres de las variables a minúsculas
df.columns= df.columns.str.lower()
¿Cómo queda esta dataframe? Pues la imprimimos y notamos que obtenemos 547 observaciones con 8 variables:
Ahora, seleccionamos las variables que usaremos para visualizar, hacemos un promedio móvil de 7 días, pasamos a formato long y cambiamos el nombre de las observaciones en este formato:
#Seleccionar variables y calcular promedio móvildf=df[["fecha_toma_muestra", "tasa_positividad_cdmx"]]#tasa de positividad en porcentajedf["tasa_positividad_cdmx"]=df["tasa_positividad_cdmx"]*100
df['roll'] = df['tasa_positividad_cdmx'].rolling(7).mean()#Wide a longdf=pd.melt(df, id_vars=["fecha_toma_muestra"],value_vars=["tasa_positividad_cdmx","roll"])#Cambiar nombre de valores de "variable"df["variable"] = np.where(df["variable"]=="roll", 'Promedio móvil 7 días', 'Tasa de positividad')
La visualización
Después de todo esto, viene la visualización, la cual, será una gráfica de línea que haremos con Plotly. Para esto, se establece el siguiente código:
#Gráfica en plotly#Definición de la gráficafig=px.line(df, x='fecha_toma_muestra', y='value', color="variable", color_discrete_map={ "Promedio móvil 7 días": "#285c4d", "Tasa de positividad": "#b38e5d"},
title="<b>Tasa de positividad en la Ciudad de México</b><br><i>(marzo 2020-septiembre 2021)</i>", labels=dict(fecha_toma_muestra="Fecha de toma de muestra", value="%", variable="Tipo"))#Formatos#Fuente y color de texto
fig.update_layout( font_family="Montserrat",font_color="black"),
Y ahora, ¿dónde está la gráfica?🧐
Esto es un bonus. Para poderla poner en este artículo, usaré mi cuenta de Chart Studio para esto. Lo primero que tienes que hacer, entonces, es crear una cuenta:
Una vez que creamos la cuenta, podemos realizar gráficos en Plotly desde ella.
Pero… ya hicimos una visualización y queremos subirla a nuestra cuenta. ¿Cómo le hago? Para eso, necesitamos los datos de la API de Plotly. Concretamente, tu usuario y llave de la API.
Ya que se tiene esta información, se corre la siguiente línea de código:
###Credenciales para subir gráfica generada a cuenta de Chart Studiousername = 'tu_usuario' # Tu usuario
api_key = 'tu_llave' # API Key
chart_studio.tools.set_credentials_file(username=username, api_key=api_key)
Ahora sí, se salva y muestra la gráfica cargada en nuestra cuenta con esta línea dando este resultado:
#Salvar y mostrar
py.plot(fig, filename = 'positiv', auto_open=True)
Y ya se puede copiar la liga y utilizarla para mostrar nuestra gráfica interactiva en sitios web o aplicaciones que se tengan💫:
Con estos elementos, ahora te toca a ti jugar y explorar datos de esta API.🙃
Si llegaste hasta aquí, te dejo el código que está colgado en mi Github:
Y ya, es todo. 😉
Happy coding😀!