Proyecto final: pipeline ETL de inventario con validación, logging y reporte

Cierra el curso construyendo una automatización completa: ingesta de datos, normalización, manejo de errores, métricas y salida lista para operación.

Un proyecto final profesional no es un script largo: es un flujo con límites claros entre entrada, transformación y salida.

La fase de extracción debe tratar datos externos como no confiables; valida temprano para evitar errores en cascada.

La transformación concentra reglas de negocio, por lo que conviene expresarla con tipos claros y funciones puras cuando sea posible.

La carga debe producir una salida estable (JSON, CSV o BD) y métricas mínimas para observabilidad operativa.

  • Diseña el flujo antes de codificar: ETL + validación + observabilidad.
  • En este proyecto vas a simular un flujo de inventario: recibes registros en texto, los normalizas y generas un resumen para operaciones.
  • Separar `extract()`, `transform()` y `load()` evita acoplamiento y facilita testear cada parte de manera aislada.
  • El manejo de errores debe capturar filas inválidas sin tumbar todo el proceso, pero reportando cuántas se descartaron y por qué.
  • Una automatización es fiable cuando sus reglas son explícitas y auditables.

1) Arquitectura objetivo del proyecto final

Diseña el flujo antes de codificar: ETL + validación + observabilidad.

En este proyecto vas a simular un flujo de inventario: recibes registros en texto, los normalizas y generas un resumen para operaciones.

Separar `extract()`, `transform()` y `load()` evita acoplamiento y facilita testear cada parte de manera aislada.

El manejo de errores debe capturar filas inválidas sin tumbar todo el proceso, pero reportando cuántas se descartaron y por qué.

2) Reglas de negocio y validación de datos

Una automatización es fiable cuando sus reglas son explícitas y auditables.

Conviene modelar cada registro con estructura consistente (`sku`, `qty`, `price`, `total`) para evitar llaves inconsistentes en pasos posteriores.

Validar tipos en transformación (`int`, `float`) te permite descartar ruido de entrada de forma controlada.

Cuando una fila falla, registra el error con contexto mínimo (línea y causa) y continúa para no perder el resto del lote.

3) Carga, métricas y ejecución orquestada

El punto de entrada integra todo y produce una salida útil para el equipo.

La fase `load()` no solo guarda datos; también calcula métricas de negocio (ingresos, unidades, SKUs únicos).

Registrar el resumen final con logging facilita soporte y debugging cuando el pipeline se ejecuta por cron o CI.

El `main()` debe devolver una estructura estable para poder serializarla, testearla y compararla entre ejecuciones.

  • Incluye conteo de filas válidas e inválidas.
  • Expón métricas agregadas (`revenue_total`, `units_total`).
  • Conserva salida determinista para facilitar pruebas.
  • Evita efectos secundarios fuera de `main()` y `load()`.
Python
25

Proyecto final: pipeline ETL de inventario con validación, logging y reporte

Cierra el curso construyendo una automatización completa: ingesta de datos, normalización, manejo de errores, métricas y salida lista para operación.

Código del tema: Automatizacion y codigo legible en Python

📘 Teoría

1) Arquitectura objetivo del proyecto final

Diseña el flujo antes de codificar: ETL + validación + observabilidad.

1

En este proyecto vas a simular un flujo de inventario: recibes registros en texto, los normalizas y generas un resumen para operaciones.

2

Separar `extract()`, `transform()` y `load()` evita acoplamiento y facilita testear cada parte de manera aislada.

3

El manejo de errores debe capturar filas inválidas sin tumbar todo el proceso, pero reportando cuántas se descartaron y por qué.

Esqueleto ETL con contrato explícito
from typing import Iterable

def extract() -> Iterable[str]:
    return [
        'sku=A1,qty=10,price=9.5',
        'sku=B9,qty=2,price=31',
        'sku=C3,qty=bad,price=8.2',
    ]

def transform(rows: Iterable[str]) -> list[dict]:
    raise NotImplementedError

def load(records: list[dict]) -> dict:
    raise NotImplementedError

2) Reglas de negocio y validación de datos

Una automatización es fiable cuando sus reglas son explícitas y auditables.

Conviene modelar cada registro con estructura consistente (`sku`, `qty`, `price`, `total`) para evitar llaves inconsistentes en pasos posteriores.

Validar tipos en transformación (`int`, `float`) te permite descartar ruido de entrada de forma controlada.

Cuando una fila falla, registra el error con contexto mínimo (línea y causa) y continúa para no perder el resto del lote.

1

Conversión segura

Aísla parseo y lanza excepción con mensaje claro si una columna es inválida.

2

Transform con tolerancia a fallo

Procesa lote completo, acumula errores y devuelve registros válidos.

3) Carga, métricas y ejecución orquestada

El punto de entrada integra todo y produce una salida útil para el equipo.

La fase `load()` no solo guarda datos; también calcula métricas de negocio (ingresos, unidades, SKUs únicos).

Registrar el resumen final con logging facilita soporte y debugging cuando el pipeline se ejecuta por cron o CI.

El `main()` debe devolver una estructura estable para poder serializarla, testearla y compararla entre ejecuciones.

  • Incluye conteo de filas válidas e inválidas.
  • Expón métricas agregadas (`revenue_total`, `units_total`).
  • Conserva salida determinista para facilitar pruebas.
  • Evita efectos secundarios fuera de `main()` y `load()`.
Orquestador final con reporte
def pipeline() -> dict:
    rows = list(extract())
    records, errors = transform(rows)
    summary = load(records)
    summary['input_rows'] = len(rows)
    summary['invalid_rows'] = len(errors)
    summary['errors'] = errors
    return summary

🧪 Aprende probando

Ejemplo Ejemplo completo: ETL de inventario y resumen JSON Ejecuta este flujo mentalmente y observa cómo separa responsabilidades, tolera errores y produce una salida operativa.

🏁 Retos

Reto Reto: añade punto de entrada profesional Completa un `main()` que ejecute el pipeline y deje el patrón de ejecución listo para producción.

🧰 Recursos

Test

Comprueba tus conocimientos con un test sobre Python.

Test de Python

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .