¿Tablas con datos en PDF? No problem, Python🐍 to the rescue 😀
Hoy en día, poder trabajar con datos es mucho más sencillo: muchas páginas e instituciones tienen sistemas con consultas dinámicas, datos abiertos, archivos de Excel, CSV, etc., etc.
Sin embargo, aún hay algunos que siguen usando formato poco amigables para manipular datos, verbigracia, archivos de Word, Powerpoint y el favorito de muchos: PDF.😡
Así es, en muchos lados puedes encontrarte datos en el espantoso formato de PDF. Si bien existen herramientas en línea de conversión de archivos PDF a Excel u otros formatos como I love PDF o hacerlo de manera manual copiando y pegando, la transformación de los datos muchas veces no suele ser del todo correcta o puede ser una tarea bastante larga si es que se tienen muchas observaciones.
Entonces, ¿qué hacer? Pues bueno, esa es una de las razones de ser de los lenguajes de programación: solucionar problemas👌🏼. En Python existe una librería llamada Tabula-py, un wrapper de tabula-java que permite leer tablas de un PDF.
Trabajaremos un ejemplo para comprobar la funcionalidad de la librería. En este caso, usaremos los resultados de aspirantes aceptados al curso propedéutico de la Maestría en Administración y Políticas Públicas del Centro de Investigación y Docencia Económicas para 2021:
Esta tabla está compuesta por 27 observaciones. Son pocas y bien podría hacerse de otra forma pero la idea es ser más cercanos a los lenguajes de programación. Así que va el ejemplo.
Lo primero que necesitamos es importar las librerías que necesitamos. No olvidemos que para usar tabula es necesario contar con Java.
import pandas as pd
import tabula
import matplotlib.pyplot as plt
import numpy as np
Posteriormente, definimos la URL objetivo:
#URL PDF CIDE
url="https://www.cide.edu/wp-content/uploads/2021/04/Proceso_admision_2021_MAPP-1.pdf"
Ahora sí, comenzamos a usar tabula. El PDF cuenta con 6 tablas pero solo traeremos la de la primera página correspondiente a los aceptados al curso propedéutico:
###Importar solo la primera tabla
df = tabula.read_pdf(url,
pages=1, lattice=True)
Dentro de la instrucción de lectura incluimos la opción “lattice” que nos permite la extracción de la información considerando que está dividida por líneas (ruling lines). Una vez realizado esto, tenemos un objeto de tipo lista:
¿Y cómo la pasamos entonces, a dataframe? Sencillo, usando Numpy. Dentro de la instrucción, especificamos el reshape de 27 observaciones y 4 columnas:
#Transformamos el objeto a dataframe
df = pd.DataFrame(np.array(df).reshape(27,4))
Con esto, nuestro objeto ya es una dataframe:
Renombramos columnas para poder trabajar de mejor manera:
#Renombrar columnas
df= df.rename(columns={df.columns[0]: 'folio',
df.columns[1]: 'cuanti',
df.columns[2]: "analit",
df.columns[3]: "ensayo"})
Ahora, si le pedimos a Python que imprima nuestra df veremos lo siguiente:
Y pues ya teniendo los datos, podemos jugar con ellos. Por ejemplo, haremos un histograma con las calificaciones de habilidades cuantitativas de los 27 aspirantes a la Maestría:
#Graficamos ejemplo de habilidades cuantitativas de la
#Maestría en Administración y Políticas Públicas 2021
#Histograma
#Definición de la figura
fig, ax = plt.subplots(figsize=(10, 8))
#Fuente del gráfico
plt.rcParams["font.family"] = "Montserrat"
plt.hist(df["cuanti"],
facecolor='#7fcdbb',
alpha=0.75,
edgecolor='#e0e0e0',
linewidth=0.5
)
#Línea de la media
plt.axvline(df["cuanti"].mean(), color='k',
linestyle='dashed', linewidth=1)
#Textos en el gráfico
min_ylim, max_ylim = plt.ylim()
#Total de observaciones
plt.text(df["cuanti"].mean()*1.01, max_ylim*0.9,
'Observaciones: {:.0f}'.format(df["cuanti"].count()))
#Media de calificaciones
plt.text(df["cuanti"].mean()*1.01, max_ylim*0.86,
'Media: {:.2f}'.format(df["cuanti"].mean()))
#Títulos de ejes
plt.xlabel('Calificaciones')
plt.ylabel('Frecuencia')
#Título del gráfico
plt.title("Centro de Investigación y Docencia Económicas\n"
"Maestría en Administración y Políticas Públicas, 2021\n"
"Histograma de calificaciones de habilidades cuantitativas\n")
#Cuadrícula del gráfico
plt.grid(True)
#Mostrar gráfico
plt.show()
El resultado es el siguiente:
Hasta aquí hemos visto un sencillo ejemplo de cómo podemos traer información de una tabla de PDF a Python y manipular los datos. Parece trivial pero a muchos nos ha pasado encontrarnos con este tipo de problemas.
Si llegaste hasta aquí, te dejo la liga del código en Github:
Happy coding😊!