Cómo extraer información de PDFs mediante Python

Veremos cómo extraer información de los PDFs reportados por un Fondo de Inversión a la CNMV para luego analizarla

Antonio Fernández Troyano
5 min readFeb 10, 2021

0. Presentación del caso de uso

Muchas veces tenemos que realizar tareas aburridas y de poco valor añadido como puede ser la limpieza y registro de algún tipo de información que tenemos recogida en PDFs.

Por lo general, cuando tenemos que extraer información de ficheros PDF siempre nos encontramos con el mismo problema:

  • Formatos inconsistentes
  • Tratamos de convertir a todo tipo de ficheros editables como Word o Excel

Si encima tenemos que repetir esta tarea una y otra vez acaba convirtiéndose en un infierno.

En esta ocasión vamos a utilizar como ejemplo la información que trimestralmente tienen que reportar los Fondos de Inversión a la CNMV

En mi caso particular me parece interesante recopilar, limpiar y analizar esta información para:

  • Identificar potenciales oportunidades de inversión
  • Ver en qué sectores se están posicionando estos Fondos
  • Poner a prueba nuestras skills con Python

1. Análisis de la información reportada en PDF

Con el fin de no complicar por ahora el caso de uso, vamos a descargar manualmente los PDFs de la página web de la CNMV.

Si quisiéramos automatizar la descarga de los ficheros, podríamos hacerlo mediante la librería requests y el método GET

En este caso vamos a recopilar la información reportada por el fondo “COBAS INTERNACIONAL”:

http://www.cnmv.es/Portal/Consultas/IIC/Fondo.aspx?nif=V87758306

Si analizamos uno de los ficheros PDF, veremos que al final del mismo indican el Valor de Mercado (VM) y el % sobre el total del fondo para el periodo actual y pasado, esta es la información que nos interesa:

Ejemplo de la información reportada por el fondo

Tal y como vemos, podríamos tratar de extraer esta información de forma manual o bien tratando de convertir el fichero a formato Word y luego copiando la tabla en Excel, pero…

¿y si lo automatizamos con Python y así no tendremos que realizar todas esas tareas de forma manual?

2. Obtención de la información de PDF mediante Python

Vamos a realizar el ejemplo con un único PDF para ver lo fácil que es obtener ésta información.

2.1. Requisitos previos

Vamos a utilizar las siguientes librerías:

  • “re” para utilizar expresiones regulares
  • “pymupdf” para trabajar con ficheros PDFs
  • “pandas” para obtener el resultado en formato tabular

Nota: Las librerías pymupdf y pandas las tendréis que instalar con pip install o conda install

2.2. Carga y lectura del fichero PDF:

Después de cargar las librerías que vamos a utilizar leeremos el fichero PDF página por página y almacenaremos el contenido en la variable “text”

Adicionalmente reemplazamos los símbolos � que son errores a la hora de decodificar el PDF:

2.3. Tratamiento de texto

Una vez hemos conseguido almacenar todo el fichero PDF en nuestra variable “text”, tendremos que separar cada una de las filas en una lista.

Para ello haremos uso de la función “split” para separar el texto cuando encuentre un salto de línea (\n):

Cada línea del fichero se ha separado en una lista. El documento completo tiene 1607 líneas

Tal y como vemos, después de utilizar el método “split” tendremos cada línea separada por comas en variable la “lines”.

Del total de las 1607 líneas, solo nos interesan aquellas que contienen información relativa a acciones de empresas cotizadas.

¿Cómo sabes cuáles son aquellas líneas que nos interesan? Pues todas aquellas que contengan un código ISIN (International Securities Identification Number)

Los códigos ISIN están formados por 2 letras y 9 números

2.4. Utilización de expresiones regulares REGEX

Con el fin de identificar aquellas líneas que contienen códigos ISIN, haremos uso de una expresión regular (REGEX)

Ya he comentado alguna vez lo útiles que son, en este caso volvemos a hacer uso de ellas.

Quizás este paso es el más complicado ya que vamos a utilizar expresiones regular y list comprehension.

Básicamente vamos a:

  • Iterar por cada elemento de la variable “lines”: pondremos un 1 si encuentra un ISIN con REGEX y un 0 si no encuentra ningún ISIN
  • Posteriormente obtendremos los índices para todas aquellas posiciones donde existe un ISIN

Utilizaremos la expresión ^\w{2}\d{9} que básicamente significa: encuentra un texto que cumpla el formato ISIN (2 letras + 9 dígitos)

Variable index_rv donde aparecerá un 0 si no hay código ISIN en la línea y 1 si existen ISIN

Y ahora nos quedamos solo con los índices (posición en la lista index_rv) para aquellos valores que tienen 1 en index_rv:

Estos son todos los índices donde hemos encontrado un código ISIN

Ahora podemos seleccionar uno de esos índices en la variable “lines” y ver qué obtenemos:

Tal y como vemos, si elegimos los índices almacenados en index_rv, obtendremos el ISIN y el nombre de la acción

Así mismo, si nos fijamos, después de cada ISIN + nombre de la acción tenemos 5 valores que corresponden a las columnas del PDF:

  • ISIN + Nombre acción
  • Divisa
  • Valor de Mercado Actual
  • % Actual del fondo
  • Valor de Mercado Pasado
  • % Pasado del fondo

Como los datos de cada fila van en bloques de 6 en 6, iteraremos por cada uno de los índices almacenados en index_rv y simplemente almacenaremos el resultado en una lista de listas llamada result:

Nota: en este caso he aprovechado para separar el ISIN del nombre y eliminar el texto “ACCIONES |” ya que no aporta ninguna información adicional

Resultado final de la información obtenida del PDF

¡Y esto es todo por ahora!

Quizás en una segunda parte realicemos algún tipo de análisis con este tipo de datos.

--

--

Antonio Fernández Troyano

Civil Engineer | 📈Management consultant and Master in Data Analytics and Big Data💻 | Website: www.fernandeztroyano.es | Git https://github.com/afernandez119