¿Cómo transformar un DataFrame para un proceso ETL?
La transformación de un DataFrame es uno de los pasos fundamentales en cualquier proceso ETL (Extract, Transform, Load), especialmente cuando nos centramos en modelos de datos como las tablas de hechos y dimensiones. En esta clase nos enfocamos en cómo transformar un DataFrame que contiene la transaccionalidad de importación y exportación de varios países. Profundicemos en el código y veamos cómo se realiza paso a paso el proceso.
¿Cómo crear una tabla de dimensiones?
Para comenzar, es esencial separar las columnas de un DataFrame en métricas y dimensiones. En este caso, se identificaron columnas como flow
, SQN
, y año
que necesitaban un tratamiento específico:
- Flow: Indica si el comercio fue una importación o exportación.
- SQN: Explica la métrica utilizada, si es por peso o por cantidades.
- Año: No es una métrica sino una dimensión y, por lo tanto, debe ser separada.
Para conseguirlo, se creó una función llamada createDimension
que transforma cada valor único de estas columnas en un nuevo DataFrame. A continuación, el código que lo ilustra:
def createDimension(dataframe, idName, valueName):
listKeys = []
valor = 1
for value in dataframe:
listKeys.append(valor)
valor += 1
return pd.DataFrame({idName: listKeys, 'values': dataframe})
¿Cómo realizar un merge de DataFrames con joins?
Al separar las métricas y las dimensiones, se vuelve crucial efectuar un merge para asegurar que estos datos pueden relacionarse efectivamente entre sí en futuras consultas y análisis. El proceso de merge sigue un patrón de left join, que asegura que todos los datos del DataFrame base se mantengan:
dfClean = dfClean.merge(dfQuantity, how='left', left_on='quantityName', right_on='values')
dfClean = dfClean.merge(dfFlow, how='left', left_on='flowName', right_on='values')
¿Cómo estructurar la tabla final de hechos?
La meta en este punto es crear una tabla que concentre las métricas y las llaves necesarias para conectar a las respectivas dimensiones. Esto se logra seleccionando solo las columnas esenciales y creando un identificador único para cada transacción:
dfClean['idTrades'] = dfClean.index + 1
dataset_final = dfClean[['idTrades', 'tradeUSD', 'kilogramos', 'quantity', 'productCode', 'countryCode', 'yearCode']].copy()
¿Cómo organizar las dimensiones country y code?
Para asegurar la calidad de nuestros datos, también se trabajaron las dimensiones Country y Code, organizándolas según sus atributos claves:
dfCountry = dfCountry[['idCountry', 'alfa3', 'alcountry', 'region', 'subregion']]
dfCodes = dfCodes[['idCode', 'clincode', 'description', 'parentDescription']]
Recomendaciones para la carga final
Una vez realizadas todas estas transformaciones con éxito, el último paso en el proceso ETL consiste en cargar este resultado en nuestro destino final. Aunque en este espacio hemos hecho un ejercicio práctico local, siempre es crucial entender el contexto del negocio en el que se trabaja, lo que puede implicar ajustes en el modelo de datos y lo que se busca analizar o resolver. ¡Anímate y continúa descubriendo el fascinante mundo del ETL!
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?