Lo mínimo e indispensable para ser un Data Engineer competente
Difícil que zafes
Python es lo que mucho denominan el lenguaje de facto en data. El rol de la Ingeniería de Datos no es ajeno a este lenguaje, de hecho, todo lo contrario, puede llegar a una herramienta del día a día en muchas empresas.
Pero, ¿qué es lo que tiene que conocer un Data Engineer sobre este lenguaje para ser competente? Veamos brevemente 9 conceptos básicos (el último es vital).
Quizá te tocó arrancar en este rol sin tener que tocar mucho código (algo poco probable pero posible) o a lo mejor estás buscando transicionar a Data Engineering y te preguntas cómo empezar. Sea como sea, espero que lo que veamos acá te sea de utilidad.

Los 9 conceptos
Si tu objetivo es introducirte en Data Engineering, esto es lo que se suele considerar conocimiento mínimo de Python para ser competente.
Si creés que falta algo, decime y lo agrego :)
1. Variables
Un espacio de almacenamiento en memoria volátil (RAM) que lleva un identificador (el nombre) y guarda un valor.
1# Definición de variables con nombres claros
2limite_reintentos = 3
3nombre_tabla = "usuarios_activos"
4es_proceso_batch = True
5ruta_archivo = f"/data/raw/{nombre_tabla}.csv" # Uso de f-string (Hábito de pythonista)2. Operadores
Utilizados para transformar datos o validar condiciones. Existen varios, todos importantes:
- aritméticos
- de comparación
- lógicos
1# Aritméticos y de comparación para validación de datos
2conteo_registros = 1500
3umbral_minimo = 1000
4
5# ¿Cumple con el mínimo para ser procesado?
6proceso_valido = (conteo_registros >= umbral_minimo) and es_proceso_batch3. Estructuras de datos
Formas de representar datos. Cada una tiene sus pros y contras, como así también casos de uso ideales.
Consideralas como herramientas que deben usarse en el momento indicado (un martillo no siempre es la mejor opción, a veces es bueno ir por un destornillador).
Algunas estructuras destacadas para estudiar:
- Listas: colección ordenada de elementos que pueden ser accedidos si se conoce la ubicación del elemento (también conocido como índice)
- Diccionarios: colección de pares clave-valor donde cada clave está mapeada a un valor usando una función hash. Muy eficientes en búsquedas
- Set: también conocida como “conjunto”, es otra colección de elementos similar a la lista pero que no admite valores duplicados
- Tupla: colección ordenada de elementos que no puede ser modificada, o en otras palabras, es inmutable
1# Lista de registros (secuencias)
2columnas = ["id", "nombre", "fecha_ingreso"]
3
4# Diccionario para mapear configuraciones (mapeos)
5config_db = {
6 "host": "localhost",
7 "puerto": 5432,
8 "db": "analytics"
9}
10
11# Sets para, por ejemplo, identificar IDs únicos de dos fuentes distintas para evitar duplicados
12ids_fuente_a = {101, 102, 103, 104, 105}
13ids_fuente_b = {104, 105, 106, 107}
14
15# Con Tuplas, podemos definir un esquema de tabla o una fila de datos inmutable
16# (ID, nombre_columna, tipo_dato, es_nuleable)
17columna_id = (1, "user_id", "INT", False)
18
19# Intentar modificarla daría un error: columna_id[1] = "new_name" -> TypeError4. Loops (Bucles)
Permiten que una porción de código pueda ser repetida una cierta cantidad de veces.
1archivos_pendientes = ["ventas_ene.csv", "ventas_feb.csv", "ventas_mar.csv"]
2
3# Procesando cada archivo de forma secuencial
4for archivo in archivos_pendientes:
5 print(f"Iniciando ingesta de: {archivo}")Un tipo de estructura especial de Python, llamado comprehensions, es una manera de escribir loops de forma compacta en listas, diccionarios o sets.
1archivos_crudos = ["ventas_2023.csv", "logs_sistema.txt", "ventas_2024.csv", "config.yaml"]
2
3# --- FORMA TRADICIONAL ---
4archivos_csv = []
5for f in archivos_crudos:
6 if f.endswith(".csv"):
7 archivos_csv.append(f.upper())
8
9# --- FORMA PYTHONICA (List Comprehension) ---
10# Si estás filtrando y transformando, usá comprensiones para mayor claridad
11csv_limpios = [f.upper() for f in archivos_crudos if f.endswith(".csv")]
12# Resultado: ['VENTAS_2023.CSV', 'VENTAS_2024.CSV']
13
14
15# --- Dict Comprehension ---
16# Escenario: Mapear nombres de tablas a su estado de carga
17tablas = ["usuarios", "pedidos", "productos"]
18estado_carga = {tabla: "pendiente" for tabla in tablas}
19# Resultado: {'usuarios': 'pendiente', 'pedidos': 'pendiente', 'productos': 'pendiente'}5. Funciones
Bloque de código que puede ser reutilizado según sea necesario. Esto permite tener cierta lógica definida en un único lugar, permitiendo que nuestro código sea más mantenible y fácil de utilizar.
1# Hábito de pythonista: Usar None como valor por defecto para mutables
2def limpiar_datos(dataset, filtros=None):
3 if filtros is None:
4 filtros = []
5 # Lógica de limpieza acá...
6 return f"Limpiando dataset con {len(filtros)} filtros"
7
8print(limpiar_datos("raw_data"))6. Clases y Objetos
Esto hace referencia al paradigma de programación orientada a objetos, concepto importantísimo. Se puede pensar en una clase como un plano y a los objetos como creaciones realizadas en base a ese plano.
Todo esto te permite modelar entidades complejas como una conexión a una base de datos o un esquema de datos.
1class PipelineConfig:
2 def __init__(self, entorno):
3 self.entorno = entorno
4
5 def obtener_prefijo_s3(self):
6 return "prod/raw/" if self.entorno == "prod" else "dev/test/"
7
8# Instanciando un objeto
9mi_config = PipelineConfig(entorno="prod")
10print(mi_config.obtener_prefijo_s3())7. Librería
Conjuntos de módulos y funciones reutilizables. Python trae muchas por defecto y se pueden instalar más con pip, el gestor de paquetes más famoso de este lenguaje.
Gracias a estos módulos externos, podemos extender las capacidades de Python (como pandas para transformación o boto3 para AWS).
En este artículo vas a encontrar algunas muy utilizadas para extracción y carga de datos.
1import os
2import json
3
4import pandas as pd
5
6# Uso de librería estándar para leer variables de entorno
7db_user = os.getenv("DB_USER", "usuario_default")8. Excepciones
Manejo de errores para que el programa siga funcionando ante problemas. Crucial para que tus pipelines no mueran ante un error inesperado, sino que se gestionen correctamente.
1# Hábito pythonista: No usar 'except' genérico
2try:
3 with open("datos_inexistentes.json", "r") as f: # Context manager (Hábito pythonista)
4 data = json.load(f)
5except FileNotFoundError as e:
6 print(f"Error: El archivo no fue encontrado. Detalle: {e}")
7except json.JSONDecodeError:
8 print("Error: El archivo no tiene un formato JSON válido.")9. Entornos virtuales
Muy relacionado al concepto de librería, ya que un entorno virtual te permite generar un ambiente donde poder instalar librerías sin conflictos con el Python a nivel sistema. Si querés entrar más en detalle, acá te dejo el post donde hablo al respecto.
1# Comandos esenciales para gestionar tu entorno:
2python -m venv .venv # Crear el entorno
3source .venv/bin/activate # Activar entorno (Linux/Mac)
4pip install pandas # Instalar librerías aisladas
5pip freeze > requirements.txt # Exportar dependenciasConclusión
Como todo lenguaje, Python es un mundo. Pero no te abrumes. Si no sabes nada de nada, lo mejor es ver cuál puede ser tu próximo paso y arrancar por ahí.
¿Te gustaría aprender este lenguaje de manera ordenada, concepto por concepto y con ejercicios para practicar? Entonces tengo lo que buscás: Exercism.
Exercism es una plataforma gratuita (en inglés por ahora) con ejercicios guiados, mentoría de otros programadores y retos prácticos. Te ayuda a pasar de la teoría a la práctica rápido, con feedback real y casos concretos que simulan problemas del mundo real. Ideal para afianzar lo que aprendas en tus primeras lecciones.
Y no, Exercism no me sponsorea de ninguna manera y no me pagan por anunciarlos en mi blog (ojalá, je). Solamente comparto lo que me ha servido en mi aprendizaje y esta plataforma me parece muy buena para arrancar 😉
Demás está decir que si necesitás ayuda con la viborita, me tenés a un mensaje de distancia. Con gusto te ayudo :)