TUTORIAL_ETL.
md 2025-09-16
Tutorial: Cómo Realizar un Proceso ETL con Python y
Pandas
Ronaldo Ballesteros Salguero - Data Analyst & Jr. Data Scientist
Linkedin: [Link]
Este tutorial te guiará a través de un proceso de ETL (Extract, Transform, Load) básico utilizando Python
y la librería pandas. Usaremos un archivo de datos de ventas (datos_crudos.csv) como ejemplo.
¿Qué es ETL?
ETL es un proceso fundamental en el manejo de datos que consiste en tres fases:
. Extract (Extraer): Leer o extraer los datos desde una o varias fuentes (ej. archivos CSV, bases de
datos, APIs).
. Transform (Transformar): Limpiar, modificar y dar formato a los datos. Esta es la fase más compleja
y puede incluir tareas como:
Limpieza de valores nulos o incorrectos.
Conversión de tipos de datos (ej. de texto a número o fecha).
Cálculo de nuevas columnas.
Filtrado de información no necesaria.
. Load (Cargar): Cargar los datos ya transformados a un destino final (ej. una base de datos, un data
warehouse, o un nuevo archivo).
Prerrequisitos
Necesitarás tener Python y la librería pandas instalados. Si no tienes pandas, puedes instalarlo con el
siguiente comando en tu terminal:
pip install pandas
Escenario
Tenemos un archivo datos_crudos.csv con datos de ventas que contiene algunos errores e
inconsistencias. Nuestro objetivo es limpiarlo y prepararlo para un análisis posterior.
El archivo datos_crudos.csv que hemos creado contiene lo siguiente:
ID_Producto,Fecha_Venta,Cantidad,Precio_Unitario,Ciudad
101,2025-01-05,10,$50.00,Bogotá
102,2025-01-06,5,100.00,Medellín
103,2025-01-07,,75.50,Bogotá
1/5
TUTORIAL_ETL.md 2025-09-16
101,2025-01-08,8,$50.00,Cali
104,2025-01-09,12,120.00,
102,2025-01-10,3,100.00,Medellín
101,sin-fecha,15,$50.00,Bogotá
103,2025-01-12,6,75.50,Cali
Paso 1: Extraer
Primero, vamos a extraer los datos del archivo datos_crudos.csv y cargarlos en un DataFrame de
pandas.
Crea un script de Python (por ejemplo, proceso_etl.py) y añade el siguiente código:
import pandas as pd
# Ruta del archivo de origen
ruta_origen =
'/Users/ronaldoballesterossalguero/Downloads/datos_crudos.csv'
# Extraer los datos a un DataFrame
df = pd.read_csv(ruta_origen)
# Mostrar los primeros registros para verificar
print("Datos extraídos (crudos):")
print(df)
print("\n" + "="*30 + "\n")
Paso 2: Transformar
Esta es la fase donde realizaremos la limpieza y las modificaciones.
2.1. Limpiar la columna 'Precio_Unitario'
El precio tiene el símbolo $ y está como texto. Necesitamos convertirlo a un número.
# (Continuación del script)
# Copiamos el DataFrame para no modificar el original directamente
df_transformado = [Link]()
# Quitar el símbolo '$' y convertir a número (float)
df_transformado['Precio_Unitario'] =
df_transformado['Precio_Unitario'].replace({r'\$': ''},
regex=True).astype(float)
2.2. Manejar valores nulos en 'Cantidad' y 'Ciudad'
2/5
TUTORIAL_ETL.md 2025-09-16
Tenemos un valor nulo en Cantidad y otro en Ciudad. Para Cantidad, asumiremos que si está vacío es 0.
Para Ciudad, lo marcaremos como Desconocida.
# (Continuación del script)
# Rellenar valores nulos en 'Cantidad' con 0
df_transformado['Cantidad'] = df_transformado['Cantidad'].fillna(0)
# Rellenar valores nulos en 'Ciudad' con 'Desconocida'
df_transformado['Ciudad'] =
df_transformado['Ciudad'].fillna('Desconocida')
2.3. Corregir y convertir la columna 'Fecha_Venta'
Haz un valor "sin-fecha". Lo trataremos como un valor nulo y luego convertiremos la columna a tipo
datetime.
# (Continuación del script)
# Convertir fechas inválidas a NaT (Not a Time)
df_transformado['Fecha_Venta'] =
pd.to_datetime(df_transformado['Fecha_Venta'], errors='coerce')
errors='coerce' convierte cualquier texto que no pueda interpretar como fecha en NaT (un tipo de nulo
para fechas).
2.4. Crear una nueva columna 'Venta_Total'
Vamos a calcular el total de la venta para cada fila.
# (Continuación del script)
# Asegurarse de que 'Cantidad' es de tipo numérico (entero)
df_transformado['Cantidad'] = df_transformado['Cantidad'].astype(int)
# Calcular la nueva columna
df_transformado['Venta_Total'] = df_transformado['Cantidad'] *
df_transformado['Precio_Unitario']
2.5. Filtrar datos no deseados
Finalmente, vamos a suponer que no nos interesan las filas donde la fecha es nula.
# (Continuación del script)
3/5
TUTORIAL_ETL.md 2025-09-16
# Eliminar filas donde la fecha de venta no es válida
df_transformado.dropna(subset=['Fecha_Venta'], inplace=True)
# Mostrar el DataFrame transformado para verificar
print("Datos transformados (limpios):")
print(df_transformado)
print("\n" + "="*30 + "\n")
Paso 3: Cargar
Ahora que los datos están limpios, los cargaremos en un nuevo archivo CSV.
# (Continuación del script)
# Ruta del archivo de destino
ruta_destino =
'/Users/ronaldoballesterossalguero/Downloads/datos_limpios.csv'
# Cargar el DataFrame transformado a un nuevo archivo CSV
# index=False para no guardar el índice del DataFrame como una columna
df_transformado.to_csv(ruta_destino, index=False)
print(f"¡Proceso ETL completado! Los datos limpios se han guardado en:
{ruta_destino}")
Código Completo del Script
Aquí está el script proceso_etl.py completo para que lo ejecutes:
import pandas as pd
# --- 1. EXTRACT ---
ruta_origen =
'/Users/ronaldoballesterossalguero/Downloads/datos_crudos.csv'
df = pd.read_csv(ruta_origen)
print("Datos extraídos (crudos):")
print([Link]()) # .head() para no imprimir todo si es muy grande
print("\n" + "="*30 + "\n")
# --- 2. TRANSFORM ---
df_transformado = [Link]()
# 2.1. Limpiar Precio_Unitario
df_transformado['Precio_Unitario'] =
df_transformado['Precio_Unitario'].replace({r'\$': ''},
4/5
TUTORIAL_ETL.md 2025-09-16
regex=True).astype(float)
# 2.2. Manejar nulos en Cantidad y Ciudad
df_transformado['Cantidad'] = df_transformado['Cantidad'].fillna(0)
df_transformado['Ciudad'] =
df_transformado['Ciudad'].fillna('Desconocida')
# 2.3. Corregir y convertir Fecha_Venta
df_transformado['Fecha_Venta'] =
pd.to_datetime(df_transformado['Fecha_Venta'], errors='coerce')
# 2.4. Crear Venta_Total
df_transformado['Cantidad'] = df_transformado['Cantidad'].astype(int)
df_transformado['Venta_Total'] = df_transformado['Cantidad'] *
df_transformado['Precio_Unitario']
# 2.5. Filtrar filas sin fecha
df_transformado.dropna(subset=['Fecha_Venta'], inplace=True)
print("Datos transformados (limpios):")
print(df_transformado)
print("\n" + "="*30 + "\n")
# --- 3. LOAD ---
ruta_destino =
'/Users/ronaldoballesterossalguero/Downloads/datos_limpios.csv'
df_transformado.to_csv(ruta_destino, index=False)
print(f"¡Proceso ETL completado! Los datos limpios se han guardado en:
{ruta_destino}")
Al ejecutar este script, leerá datos_crudos.csv, aplicará todas las transformaciones y guardará el
resultado en datos_limpios.csv.
Ronaldo Ballesteros Salguero - Data Analyst & Jr. Data Scientist
Linkedin: [Link]
5/5