Data Nurturing con Pandas. API

Patricia Carmona
Ironhack
Published in
7 min readMar 18, 2020
Photo by Michael Payne on Unsplash

Continuando con el procedimiento para enriquecer un DataFrame, en este post te muestro cómo trabajar con una API para recoger datos de interés e incorporarlos a un DataFrame que ya tenemos.

En este caso he trabajado con un dataset de Kaggle de vídeos de YouTube. Puedes descargarlo para ponerlo en práctica.

En este proyecto hice Data Nurturing sobre el DataFrame de vídeos de YouTube con información procedente de la API de YouTube, para complementar la información de la que ya disponía, con las visualizaciones de cada vídeo.

Puedes ver el proyecto completo en mi repositorio de GitHub.

Conociendo el dataset

Para comenzar a trabajar el dataset y convertirlo en un DataFrame usable y con información de valor hay que hacer un Data Cleaning, aunque es cierto que el dataset tiene una usabilidad de 10 y tanto en estructura como en calidad de dato, es muy bueno.

df.head()                 #Conocer los primeros registrosdf.isnull().sum()         #Revisar si existen registros nulosdf.Category.value_counts() #Conocer los registros que hay en cada categoría
Los primeros registros del DataFrame

El dataset contiene enlaces a vídeos de diferentes categorías:

Las categorías y el número de vídeos que hay por cada categoría registrada

Dado que las peticiones a una API, pueden ser restringidas o de pago, lo ideal es reducir el tamaño del DataFrame para realizar solo las peticiones necesarias. En este caso, filtré el DataFrame a la categoría ‘travel blog’.

df = df[(df.Category == 'travel blog')]#Seleccionar solo los registros clasificados en la categoría travel blog
El DataFrame final de vídeos de travel blog

¿Qué es una API?

Una API (‘Application Programming Interface’) es una interfaz que permite a dos servicios conectarse e intercambiar información. Se realiza una petición (o request) y se devuelve una respuesta en formato JSON (un objeto de JavaScript). Aunque este JSON visualmente es un como un diccionario de Python, solo almacena información en formato string.

Las API’s tienen en mayor o menor medida una documentación a la que recurrir para saber cómo funcionan, cómo debe ser el formato de la request y cómo devuelven la información. Te recomiendo que antes de comenzar, leas la documentación de la API, ya que influirá en el procedimiento que viene a continuación.

Hay muchos recopilatorios de API’s, te dejo un listado de API’s gratuitas, por si te apetece conocer otras opciones. Para algunas es necesario autenticarse, para otras no.

La API de YouTube

La API de YouTube tiene una documentación extensa sobre cómo funciona, información que puedes solicitar, tipos de request y cómo devuelve la información. Se utiliza la versión 3 de la API.

La API de YouTube no es gratuita, pero si te registras en la consola de developers te regalan un bono de 300$ para que realices tus primeras peticiones a la API. (Yo he lanzado varias veces las 2200 peticiones de este DataFrame a la API y no he consumido ni una 1/4 parte del bono).

Esta API requiere autenticación y aunque por seguridad, la API está blindando consultas a una autenticación OAuth, lo cierto es que en la documentación aún puede encontrarse cómo hacer peticiones con la autenticación Key, que es más sencilla de configurar.

Tipos de peticiones

Para hacer peticiones a la API utilizaremos una librería de HTTP de Python llamada requests, que permite realizar peticiones a una URL. Los tipos de peticiones pueden ser varios:

  • DELETE
  • GET
  • POST
  • PUT

Puedes ver que en la documentación de la API de YouTube te indican qué tipo de solicitud es la que admite cada llamada a la API.

Puesto que en este proyecto hago peticiones a la API para que me devuelva información sobre los vídeos, utilizaremos el método GET.

¿Cómo hacer peticiones a una API?

El procedimiento para hacer peticiones a la API es sencillo.

El primer paso es obtener una autorización, en este caso, un token, que puedes configurar en la consola de developers de Google. Crea un proyecto y solicita credencial tipo Key.

¡Cuidado con el token! El token es una credencial personal para acceder a la API, a través de la cual se gestiona tu cuota de solicitudes a ésta. Por ello, lo ideal es seguir un procedimiento de seguridad y guardar el token como variable en un documento .env y almacenar el nombre de este archivo en un .gitignore. De esta forma puedes hacer una llamada a la variable de entorno sin tener que mostrar públicamente el token.

Puesto que el token lo tenemos almacenado en .env, hacemos una llamada a la variable importando las librerías ‘os’ y ‘dotenv’.

import requests
import os
from dotenv import load_dotenv
load_dotenv()token = os.getenv("YOUTUBE_APIKEY")#YOUTUBE_APIKEY es el nombre de la variable que almacena el token en el archivo .env

La documentación clasifica el tipo de información que se solicita a la API en diferentes tipos. Las visualizaciones son del tipo ‘statistics’, concretamente ‘statistics.viewCount’.

La petición no es más que una llamada a una URL que devuelve información si se le pasan los parámetros adecuados. En el caso de YouTube, la URL se construye de la siguiente forma:

Dominio: https://www.googleapis.com/youtube/v3/videos

Endpoints: parámetros que se añaden al dominio

La documentación indica cómo montar la URL para hacer peticiones. También puedes ver cómo funciona en el apartado Try it.

Probando la API de YouTube

Antes de lanzarte a hacer muchas solicitudes, te recomiendo que hagas varias pruebas de la API para no consumir cuota de más sin que obtengas los resultados que necesitas. El apartado Try it es muy útil para saber la estructura del JSON que devuelve.

Yo he hecho una prueba con el vídeo Lost On You de LP.

El apartado ‘part’ es obligatorio, aquí se indica el tipo que queremos solicitar, en este caso “statistics” y hay que añadir el ‘id’ del vídeo.

Si hacemos scroll hasta el final, encontramos el resultado de la solicitud:

Resultado 200, solicitud hecha con éxito

En el apartado ‘items’, ‘statiscs’ puedes ver los resultados del vídeo, entre ellos ‘viewCount’.

De esta forma sabemos cómo montar la URL de la petición y cómo será la respuesta.

Peticiones a una API desde un DataFrame

Volviendo al DataFrame de vídeos de travel blog, quiero incluir una columna de visualizaciones de cada uno de los vídeos. Para ello recopilamos lo necesario:

  1. El token: gestionado en la consola de Google Developers y guardado como variable de entorno. Lo cargamos con load_dotenv().
  2. La URL a la que hacer la petición: https://www.googleapis.com/youtube/v3/videos
  3. El parámetro que solicitar: ‘statistics’.
  4. La ID del vídeo: en la serie ‘VideoURL’ del DataFrame.

Para crear esta nueva columna del DataFrame, primero creo una función llamada video_id a la que le paso la URL del vídeo y de la que obtengo solo la ID. Con el método .apply() aplico esta función a cada registro de la serie ‘Video’ y lo almaceno en una nueva serie llamada ‘id_video’.

Obtener la id y realizar la petición a la API puede realizarse en una misma función, pero he decidido separarlo para que se vean claramente los diferentes pasos.

#Extraer la ID de cada URLdef video_id(url):
return url.split("=")[-1]

df['id_video'] = df['Video'].apply(video_id)

El siguiente paso es crear una función para hacer las peticiones a la API. Esta función facilita que el parámetro de la ID pueda ser variable cada vez que aplicamos la función a un registro.

Lo bueno de las funciones es que puedes utilizarlas en un futuro para otras opciones similares.

def requestYoutube(id_video):
token = os.getenv("YOUTUBE_APIKEY")
if not token:
raise ValueError("You must set a YOUTUBE_APIKEY token")

url = "https://www.googleapis.com/youtube/v3/videos"

print(f"Requesting data from {url}")
params = {"part":"statistics",
"id":id_video,
"key":token}
res = requests.get(url,params=params)
if res.status_code != 200:
print(res.text)
raise ValueError("Bad Response")
return res.json()

En la función he incluido varios ‘print’ para que si sucede algún error, sepa en qué punto puede estar fallando. En primer lugar, hago una llamada a la variable de entorno que almacena el token. Después declaro los parámetros a incluir en la url y monto la petición GET con la url y los parámetros. Por último, si devuelve un 200, la respuesta es un json(), en caso contrario, devuelve un error.

A partir de aquí solo tenemos que aplicar la función a la serie ‘video_id’ que creamos anteriormente.

df['ViewsJSON'] = df['id_video'].apply(requestYoutube)

En el DataFrame se ha almacenado en cada fila un json con las estadísticas de la id sobre la que se ha hecho la petición.

DataFrame con la serie ViewsJSON

El JSON incluye el dato de visualizaciones en el siguiente formato:

df.iloc[0][‘ViewsJSON’]

Para iterar sobre el DataFrame y extraer el dato, desarrollo una función para aplicarla fácilmente.

def getViews(x):
return x['items'][0]['statistics']['viewCount']
df['Views'] = df['ViewsJSON'].apply(getViews)

Puede ampliarse la info del DataFrame con la información que ya hemos obtenido de la API, en el apartado ‘statistics’.

El DataFrame final enriquecido

Eliminamos las series ‘ViewsJSON’ y ‘id_video’ y éste es el DataFrame final enriquecido con información procedente de la API de YouTube.

DataFrame enriquecido las visualizaciones procedentes de la API

Las API’s son una alternativa para obtener información útil e incorporarla al DataFrame para ampliar la información de la que ya se dispone y hacer un análisis de mucho valor. ¡Seguimos!

--

--

Patricia Carmona
Ironhack

Data Analyst. Improving the relation brands-users.