Extracción ETL con Pandas desde Postgres

Resumen

Extraer datos con Python y Pandas es el primer paso para construir un pipeline ETL funcional. Aquí aprenderás a conectar una base de datos Postgres, leer archivos JSON y CSV, y dejar todo listo en un staging para transformar después. Es ideal si estás dando tus primeros pasos en data engineering o ciencia de datos.

¿Qué necesitas antes de extraer datos con Pandas?

Antes de abrir tu notebook, conviene tener el ambiente listo. En la clase anterior se levantó una base de datos Postgres con Docker, se ejecutó un script .sql para crear la tabla y se ubicaron los archivos JSON y CSV en la carpeta de fuentes.

  • Una base de datos Postgres corriendo en localhost, creada con Docker.
  • Un archivo JSON con países, regiones y subregiones.
  • Un archivo CSV con códigos de producto y su descripción.

¿Qué es un staging en un pipeline ETL? Es el área temporal donde cargas los datos crudos antes de transformarlos. Te sirve para limpiar, normalizar y validar sin tocar la fuente original.

Si tuviste problemas en la instalación, apóyate en la comunidad. Y si todo funcionó, ayuda a quien venga detrás.

¿Cómo conectar Python con Postgres usando SQLAlchemy?

Para leer desde Postgres con Pandas necesitas un engine de conexión. Aquí entra SQLAlchemy junto con el driver psycopg2, que traduce las instrucciones de Python al protocolo de Postgres [01:55].

El flujo es directo: importas las librerías, defines la cadena de conexión y creas el motor.

python import pandas as pd from sqlalchemy import create_engine

engine = create_engine('postgresql+psycopg2://postgres:mysecretpass@localhost/postgres')

La cadena indica el motor (postgresql), el driver (psycopg2), el usuario, la contraseña, el host y la base de datos. En el ejemplo se usa mysecretpass como contraseña, pero en producción siempre debes usar contraseñas robustas y nunca dejarlas hardcodeadas.

¿Cómo leer una tabla SQL en un DataFrame?

Una vez creado el engine, Pandas hace el resto con read_sql. Le pasas la consulta y el motor, y obtienes un DataFrame listo para trabajar.

python df_trades = pd.read_sql('SELECT * FROM trades', engine)

La tabla trades contiene transacciones internacionales con campos como código de país, año, código de seis dígitos del producto, tipo de operación (importación, exportación o reexportación), valor en dólares, peso en kilogramos, cantidad y un flag que indica la unidad de medida [02:50].

¿Qué hace psycopg2 en la conexión? Es el driver que permite a Python comunicarse con Postgres. SQLAlchemy lo usa por debajo para enviar y recibir consultas.

¿Cómo leer archivos JSON y CSV con Pandas?

No todo vive en bases de datos. Muchos pipelines combinan fuentes y Pandas resuelve ambas con una línea.

Para el JSON de países, que incluye código, nombre, región y subregión:

python df_countries = pd.read_json('sources/country.json')

Para el CSV con los códigos de producto, su descripción y el nivel jerárquico:

python df_codes = pd.read_csv('sources/hs_code.csv')

El detalle interesante está en el campo nivel: un producto puede pertenecer a una categoría más amplia, y esa a otra todavía mayor. Es una jerarquía típica del sistema armonizado de comercio internacional.

¿Cómo filtrar un DataFrame para crear una tabla padre?

Cuando trabajas con datos jerárquicos, conviene separar los niveles superiores. En este caso se crea un DataFrame solo con los códigos de nivel dos, que representan los capítulos del sistema internacional, por ejemplo animales vivos [06:30].

python df_parents = df_codes[df_codes['level'] == 2].copy()

El .copy() no es decorativo. Le dice a Pandas que esto es un nuevo DataFrame independiente, evitando el clásico SettingWithCopyWarning cuando intentes modificarlo después.

¿Por qué este paso de extracción es clave en un pipeline?

Con solo Pandas ya tienes tres fuentes consolidadas en memoria: las transacciones desde Postgres, los países desde JSON y los códigos de producto desde CSV. Eso es tu staging.

  • Los datos están en estructuras homogéneas (DataFrames) sin importar su origen.
  • Puedes aplicar limpieza, normalización y validación sin tocar la fuente.
  • Quedas listo para la fase de transformación, que es donde el dato toma valor.

La extracción no parece glamorosa, pero define la calidad de todo lo que sigue. Si esta capa falla, las métricas finales también.

¿Cómo organizas tú tus fuentes antes de transformar? Cuéntalo en los comentarios y comparte tu enfoque con la comunidad.