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
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”:
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:
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):
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)
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)
Y ahora nos quedamos solo con los índices (posición en la lista index_rv) para aquellos valores que tienen 1 en index_rv:
Ahora podemos seleccionar uno de esos índices en la variable “lines” y ver qué obtenemos:
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
¡Y esto es todo por ahora!
Quizás en una segunda parte realicemos algún tipo de análisis con este tipo de datos.
Si te has quedado con ganas de leer más puedes seguir con otros artículos: