Resumen

Construir un modelo de datos eficiente a partir de un DataFrame transaccional es una de las tareas más importantes dentro de cualquier proceso de ETL. En esta fase de transformación se separan las métricas de las dimensiones, se crean identificadores únicos y se reorganiza la información para que pueda cargarse en un destino analítico. A continuación se explica paso a paso cómo lograrlo usando pandas.

¿Por qué separar dimensiones de la tabla de hechos?

Cuando se parte de un DataFrame resultado de un merge previo, la estructura contiene columnas que no son métricas operables: flow indica si la transacción es importación o exportación, quantity name describe la unidad de medida y year representa el año del registro [00:44]. Estas columnas son atributos descriptivos, no valores que se puedan sumar o promediar, por lo que pertenecen a tablas de dimensiones separadas.

El objetivo es llevar el DataFrame a una tabla de hechos (fact table) que solo contenga métricas —como valor en dólares, kilogramos y cantidades— junto con llaves foráneas que la conecten con cada dimensión. Este diseño se conoce como modelo estrella y facilita las consultas analíticas.

¿Cómo crear dimensiones dinámicas con una función reutilizable?

Se define una función llamada create_dimension que recibe un conjunto de datos y el nombre del identificador [01:22]. Internamente funciona así:

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

  • Se inicializa una lista vacía (list_keys) y un contador en uno.
  • Se itera sobre los valores únicos recibidos, asignando un identificador incremental a cada registro.
  • Se retorna un nuevo DataFrame con dos columnas: el ID y los valores originales.

Con esta función se generan tres dimensiones a partir de los valores únicos del DataFrame limpio [02:18]:

python df_quantity = create_dimension(df_trades_clean['quantity_name'].unique(), 'id_quantity') df_flow = create_dimension(df_trades_clean['flow'].unique(), 'id_flow') df_year = create_dimension(df_trades_clean['year'].unique(), 'id_year')

El método .unique() garantiza que solo se extraigan valores distintos, generando dimensiones compactas. Por ejemplo, df_quantity resulta en apenas doce registros [03:08].

¿Cómo integrar las dimensiones y construir la tabla de hechos?

¿Qué merges se necesitan para incorporar los IDs?

Cada dimensión se une al DataFrame principal mediante un left join sobre la columna correspondiente [03:30]:

python df_trades_clean = df_trades_clean.merge(df_quantity, how='left', left_on='quantity_name', right_on='values') df_trades_clean = df_trades_clean.merge(df_flow, how='left', left_on='flow', right_on='values') df_trades_clean = df_trades_clean.merge(df_year, how='left', left_on='year', right_on='values')

Tras estos merges, el DataFrame contiene las columnas id_quantity, id_flow e id_year, que actúan como llaves foráneas.

¿Cómo generar el identificador único de la tabla de hechos?

Antes de recortar columnas, se crea un ID basado en el índice [04:20]:

python df_trades_clean['id_trades'] = df_trades_clean.index + 1

Este patrón simple asegura que cada fila tenga un identificador irrepetible.

¿Qué columnas conservar en el dataset final?

Solo se seleccionan métricas y llaves [04:48]:

python dataset_final = df_trades_clean[['id_trades', 'trade_usd', 'kg', 'quantity', 'code', 'country_code', 'id_quantity', 'id_flow', 'id_year']].copy()

El resultado es una tabla de hechos limpia con valores numéricos para análisis y códigos para relacionarse con las dimensiones de país, producto, flujo, cantidad y año.

¿Qué ajustes finales requieren las dimensiones de país y producto?

Las tablas df_country y df_codes se reordenan colocando el ID como primera columna, seguido de los atributos descriptivos como región, subregión, descripción y descripción padre [05:32]. Con esto se completan todas las piezas del modelo.

Los conceptos aplicados —extraer, transformar y cargar— se mantienen sin importar el destino final. No todos los proyectos terminan en un modelo estrella ni en una base de datos relacional, pero la lógica de separar métricas de atributos descriptivos y crear relaciones mediante llaves es universal. ¿Qué estructura de destino usarías en tu próximo proyecto? Comparte tu experiencia.