Cómo convertir un DataFrame en tabla de hechos

Resumen

Transformar un DataFrame principal en una tabla de hechos es el paso clave para dejar tu ETL listo para analítica. Aquí aprendes a separar dimensiones, generar IDs únicos y unir todo con merges en pandas, usando datos reales de importaciones y exportaciones entre países.

¿Qué es una tabla de hechos y por qué la necesitas?

Una tabla de hechos guarda solo métricas y llaves que conectan con dimensiones. En el caso del proyecto, las métricas son valor en dólares, kilogramos y cantidades; las llaves apuntan a países, códigos de producto, año, flow y quantity name.

¿Qué es una tabla de hechos? Es la tabla central de un modelo estrella que contiene métricas numéricas y claves foráneas hacia tablas de dimensión. No guarda descripciones, solo lo que puedes sumar, contar o promediar.

Dentro del DataFrame unido tras el merge aparecen columnas que no son métricas: flow indica si el trade es importación o exportación, quantity name describe la unidad (peso, cantidades) y year funciona como dimensión temporal. Todas estas deben salir de la tabla de hechos y convertirse en dimensiones independientes [01:00].

¿Cómo crear dimensiones a partir de valores únicos en pandas?

La estrategia es construir una función reutilizable que reciba un DataFrame y un nombre de ID, y devuelva una dimensión con identificador único y valores. Así evitas repetir código por cada columna candidata a dimensión.

¿Cómo se arma la función create_dimension?

La función create_dimension recibe los datos y un id_name, inicializa una lista de llaves y un contador en uno, e itera con un for sobre los valores [02:30]. En cada vuelta agrega el contador a la lista y lo incrementa en uno. Al final retorna un DataFrame construido desde un diccionario con dos columnas: el ID y los values.

python def create_dimension(data, id_name): list_keys = [] value = 1 for _ in data: list_keys.append(value) value = value + 1 return pd.DataFrame({id_name: list_keys, "values": data})

Con esa función puedes generar tres dimensiones rápidas:

  • df_quantity: pasando los valores únicos de quantity name y el ID id_quantity. El resultado son 12 valores únicos.
  • df_flow: pasando los valores únicos de flow con el ID id_flow.
  • df_year: pasando los valores únicos de year con el ID id_year.

Usar .unique() sobre la columna garantiza que la dimensión no tenga duplicados antes de entrar a la función [04:00].

¿Cómo unir las dimensiones a la tabla de hechos con merge?

Una vez creadas las dimensiones, viene la parte de pegarlas al DataFrame principal usando merge con left join. Aunque sabes que todos los registros harán match (porque las dimensiones nacen del mismo dataset), el left join mantiene la integridad de la tabla de hechos [05:30].

¿Cuándo uso left join en un merge de pandas? Cuando quieres conservar todas las filas del DataFrame izquierdo aunque no encuentren coincidencia en el derecho. Es la opción segura al enriquecer una tabla de hechos con dimensiones.

El patrón se repite tres veces:

  1. Merge con df_quantity usando left_on="quantity_name" y right_on="values".
  2. Merge con df_flow usando left_on="flow" y right_on="values".
  3. Merge con df_year usando left_on="year" y right_on="values".

Después de los tres merges, el DataFrame limpio tiene las columnas id_quantity, id_flow e id_year, que reemplazan a las columnas originales de texto.

¿Cómo genero un ID único para la tabla de hechos?

Antes de filtrar columnas, creas un identificador único llamado id_trades basado en el index del DataFrame más uno [07:30]. Es la misma técnica usada antes del merge inicial y asegura que cada transacción tenga su propia llave primaria.

python df_clean["id_trades"] = df_clean.index + 1

¿Qué columnas conservar en el dataset final?

El dataset_final se queda solo con lo esencial para análisis: id_trades, trade_usd, kilograms, quantity, el código del producto, el código del país, id_quantity, id_flow e id_year. Una copia con .copy() evita advertencias de pandas al modificar el resultado [08:30].

Para las dimensiones que ya existían desde antes, df_country y df_codes, solo se reordenan columnas:

  • df_country: id_country, alpha_3, country, region, subregion.
  • df_codes: id_code, clean_code, description, parent_description.

Ese orden hace la lectura más natural y respeta la convención de poner la llave primaria al inicio.

¿Qué sigue después de transformar el DataFrame?

Con la tabla de hechos lista, dos dimensiones existentes (countries y codes) y tres dimensiones nuevas (quantity, flow, year), el modelo estrella queda armado. En la práctica real, no toda ETL termina en modelo estrella ni en base de datos: depende del negocio, de las relaciones entre variables y del objetivo del proyecto.

Lo que no cambia son los tres pasos: extraes, transformas y cargas. La carga al destino es el siguiente movimiento. ¿Qué dimensiones identificarías tú en tu propio dataset? Cuéntalo en los comentarios.