Python es un lenguaje de programación que cada vez se utiliza más por las empresas y programadores que trabajan con datos (Business Intelligence, Integración de datos, Data Science, Machine Learning, Big Data…). El motivo de que cada vez cobra más importancia en su uso es en la gran cantidad de librerías existentes para realizar prácticamente todo y más aún si el objetivo es trabajar y gestionar datos, también por lo optimizado que está Python respecto a JAVA.
Para redactar este artículo he desarrollado un proceso ETL con Python desde cero en el que voy a explicar paso a paso todo lo utilizado y porqué. Para desarrollar el proceso me he inventado un objetivo y así dar sentido al desarrollo.
Descarga del proyecto: https://datamanagement.es/Recursos/python_parserXML.zip
Uno de nuestros clientes nos proporciona información sobre pedidos en formato XML porque no nos puede dar acceso a la Base de datos, esta es una práctica muy común ya que dar acceso de información sensible a terceros es un poco peligroso.
Bien, para acceder a los datos nos ofrecen la siguiente URL: https://datamanagement.es/Recursos/pedidos.rar
El contenido de este fichero son 3 ficheros .XML y hay que desarrollar un proceso en python que realice lo siguiente:
Además de todo esto, hay que registrar en una tabla de control todo lo que va sucediendo para poder consultar qué ficheros se han procesado, sí se han procesado bien, cuánto han tardado y cuando se han procesado.
Anaconda es una suite con todo lo necesario para empezar a desarrollar en Python. Incluye Python, un par de IDE’S de programación y muchas librerías preinstaladas para que no invirtamos tiempo e configurar un entorno de desarrollo.
Enlace: https://www.anaconda.com/distribution/#download-section
La versión de Anaconda a descargar es la versión de Python 3.7. Esta versión es la que he utilizado para hacer la DEMO.
Para el desarrollo de la DEMO es necesario instalar MySQL o tener acceso a una BBDD MySQL para poder insertar en las tablas el contenido de los ficheros XML.
Al final del documento adjunto las DDL ( creación de tablas ) para crear las tablas.
La información de los XML las tenemos que llevar a unas tablas de la BBDD y son las siguientes
Viendo la estructura del fichero XML, podemos extraer 3 tipos de información.
Descarga del proyecto: https://datamanagement.es/Recursos/python_parserXML.zip
Antes de empezar con el desarrollo he de decir que hay que tener conocimientos en programación orientada a objetos POO en cualquier lenguaje ya que he definido clases para encapsular la lógica en pequeños paquetes/módulos/clases.
La estructura del proyecto es la siguiente.
En este fichero se encuentran todas las variables de configuración del proceso.
Para hacer uso del proceso hay que configurar los valores de las variables. Hay que definir el acceso a las BBDD y cambiar las rutas absolutas de las variables RUTA_XML y RUTA_DOWNLOAD.
Este fichero es el responsable de la comunicación con la BBDD.
Tiene los métodos para ejecutar comandos SQL de inserción y actualización de registros que se generan en otras partes del código.
Esta clase es la responsable de la gestión de los archivos. Se responsabiliza de realizar la descarga del fichero rar que está en esta URL http://datamanagement.es/Recursos/pedidos.rar, descomprimir el contenido en una carpeta y luego obtener una lista de los ficheros que tienen la extensión .xml o .XML para posteriormente con otra clase realizar el parseo de los ficheros XML.
Para hacer funcionar esta clase es necesario instalar en Python los siguientes módulos.
Este fichero es el responsable de parsear el XML que se le indica. Obtiene toda la información del fichero, de los pedidos y de los detalles de los pedidos que están dentro de todos los ficheros XML descomprimidos.
Para parsear un XML hay que indicarle qué fichero tiene que parsear y después “ordenar” que inserte los registros en la BBDD invocando al método “insertRowsToBBDD”, para invocar a este método hay que pasarle como argumento la conexión a la BBDD porque hace uso de la conexión para insertar los registros en las tablas.
Este fichero es el responsable de ir registrando en una tabla de control todo lo qué sucede dentro del código. Para que pueda insertar en la tabla de control tiene que recibir por argumento la conexión a la BBDD.
Con el método iniStatusActivity lo que hace es insertar un nuevo registro con el nombre del fichero, descripción, fecha y status recibido.
Con el método updateStatusActivity lo que hace es actualizar el registro anteriormente insertado con la fecha fin y el estado.
Un ejemplo de uso es el siguiente:
Para este ejemplo, el resultado en BBDD es el siguiente
Y para una ejecución real es el siguiente
Se puede ver que para descargar el .rar el proceso ha tardado 1s y luego ha tardado menos de un segundo en copiar la información a la BBDD.
Es el fichero a ejecutar y es el que “orquesta” el proceso. Crea la conexión a la BBDD, “ordena” a descargar los ficheros y descomprimir y “ordena” a parsear los ficheros descomprimidos.
Al tener la funcionalidad separada en módulos es mucho más fácil de entender, el código se hace más limpio y reutilizamos mucho código.
CREATE TABLE ctl_activity_process (
etl_master varchar(50),
id_process bigint(20),
fichero varchar(100),
descri_activity varchar(100),
status int(11),
start_date datetime,
end_date datetime,
cant_row int(11),
fecha_desde date,
fecha_hasta date
);
create table header (
pagina varchar(100)
, fecha_desde date
, fecha_hasta date
, DateInsert datetime
);
create table pedidos (
id integer
, cliente_id integer
, cliente varchar(100)
, fecha datetime
, descuento_euro float
, DateInsert datetime
);
create table pedidos_detalles (
id integer
, cliente_id integer
, cliente varchar(100)
, fecha datetime
, descuento_euro float
, DateInsert datetime
, producto_id integer
, color varchar(50)
, precio_euro float
, unidades integer
);
Descarga del proyecto: http://datamanagement.es/Recursos/python_parserXML.zip
Si te ha parecido útil y tienes cualquier consulta no dudes en ponerte en contacto con el correo info@datamanagement.es o bien usando el formulario de contacto que se encuentra en la página web http://datamanagement.es/contacto.php
Enlaces de interés
¿Qué es el web scraping? ¿Qué se puede obtener con él? ¿Por qué es interesante…
¿Qué es el web scraping? ¿Qué se puede obtener con él? ¿Por qué es interesante…
En un mundo cada vez más digitalizado las personas tendemos cada vez más a realizar…
Introducción Ya utilizas powerBI de costumbre para analizar tu negocio y te gustaría ir un…
Introducción En el desarrollo de proyectos de Business Intelligence, Big Data y Data Science la…
¿Python en SQL Server? Sí, desde la versión de SQL Server 2016 se…
Ver comentarios
Cordial saludo, muy interesante el proyecto. Creé las rutas y la base de datos , trate de ejecutar y tengo el siguiente error
n execQuery
cursor = self.conn.cursor()
AttributeError: 'NoneType' object has no attribute 'cursor'
Que fallo?
Con la información que me das poco puedo ayudarte.
- ¿Has creado la BBDD MySQL en tu equipo local?
- ¿Has cambiado los valores del fichero config.json para que el proceso apunte a tu BBDD local?
- ¿Has creado las tablas que te indico en el artículo?
A la hora de ejecutar el proceso solo debes ejecutar el main.py y este utilizará las clases y métodos definidos anteriormente. Por lo que me indicas el problema que tienes es de conexión a la BBDD y es que no hay un objeto instanciado antes de ejecutar la función execQuery
Hola Francisco, Atento saludo. Ha sido un ejercicio genial, funciona perfecto!
¿Has creado la BBDD MySQL en tu equipo local?
si efectivamente, creé la base de datos con el nombre de: pedidos, esto lo hice en Your MariaDB connection id is 8 Server version: 10.4.11-MariaDB
¿Has cambiado los valores del fichero config.json para que el proceso apunte a tu BBDD local?
Si, pero había fallado en el nombre de la base de datos :~(, pensé en llamarla pruebas y no me dí cuenta ( que es pedidos)
Posteriormente creé las tablas:
MariaDB [pedidos]> show tables;
+----------------------+
| Tables_in_pedidos |
+----------------------+
| ctl_activity_process |
| header |
| pedidos |
| pedidos_detalles |
+----------------------+
Luego, observé que faltaba instalar mysql.connector, lo instalé por medio de pip, eso faltaba en el tutorial, pero pues no era difícil de arreglar.
Te felicito por tu excelente tutorial. Lo haré con estudiantes de la materia de BI, pues estaba buscando alternativas a VS analysis services, puesto que con la contingencia , las computadoras que tienen en sus casas no
son tan potentes como las de la universidad.
Tienes más ejercicios de este tipo?
Nuevamente muchas gracias por tu aporte al BI, un saludo desde Popayán Colombia, Cuídate mucho!
.
Muchas gracias Leonardo por tu Feedback.
En el blog tengo ejercicios y ejemplos de todo tipo, ahora estoy escribiendo sobre SQL ya que he visto que muchos profesionales que se dedican al BI no son informáticos y no tienen la base suficiente sobre las bases de datos relacionales.
https://datamanagement.es/2020/03/30/fundamentos-de-las-bases-de-datos-relacionales-para-data-science-y-dummies/
Luego de este tipo tengo estos otros ejercicios
https://datamanagement.es/2019/10/26/web-scraping-de-empresas-con-etl-en-python-y-powerbi/
https://datamanagement.es/2019/09/29/automatizacion-y-optimizacion-de-procesos/
https://datamanagement.es/2019/12/18/programacion-orientada-objetos-con-python/
Y uno de los mas importantes en el BI, ¿Qué es el modelo de estrella o modelo dimensional en estrella?
https://datamanagement.es/2019/06/27/business-intelligence-modelo-estrella/
Saludos desde Alicante ( España )
Excelente Francisco, funciona perfecto y está muy claro.
¡Gracias por tu tiempo y explicación!