Resumen
El episodio presenta Snakemake, una herramienta en Python para orquestar flujos de datos (inputs, parámetros, Script y outputs) de forma reproducible, sirviendo para productivizar modelos y dejar proyectos analíticos ordenados. Snakemake detecta qué Scripts, parámetros o inputs cambiaron y solo reejecuta lo necesario, ahorrando tiempo y evitando olvidos al trabajar en equipo. Tras una discusión inicial sobre Anaconda frente a venv, Windows frente a Linux/WSL y lenguajes para análisis de datos, Cristian muestra once ejemplos progresivos: Hello World, Scripts de Python, parámetros desde un archivo de configuración y línea de comandos, el paquete propio `ipipe`, outputs únicos por versión, variables de ambiente en `.env`, cadenas de reglas y ejecución en paralelo con `expand` y Parquet particionado. Se compara con Airflow (orquestación de tareas, interfaz visual) y se critica Kedro por su dificultad para depurar y su dependencia de Python. Conclusión: Snakemake es una herramienta de apoyo, no un framework intrusivo, útil para desarrollar rápido y luego pasar a producción, incluso como un único nodo de Airflow.
Capítulos
- 00:00IntroSe presenta Snakemake como ayuda para productivizar modelos y tener flujos más organizados y reproducibles, evitando reejecutar partes que ya funcionaron. Se discute que su instalación se piensa con Anaconda/conda (los presentadores prefieren pip y `python -m venv`), la compatibilidad con Windows, Linux y WSL, y se responden dudas sobre Linux frente a Windows y sobre qué lenguaje aprender (python, R, Julia, Rust).
- 12:40Qué es Snakemake y qué es un flujo de datos?Un flujo de datos va de input a Script a output, y se representa como un DAG (grafo dirigido acíclico) donde cada caja es un Script. Visualizar el DAG ayuda a entender un proyecto heredado, ubicar dónde modificar y detectar puntos de mejora; se muestra un DAG real y otro simplificado.
- 17:00Cómo nos ayuda Snakemake a hacer un flujo de datos?Se explica la instalación (conda, activar el ambiente) y se justifica la herramienta: ejecutar Scripts a mano es tedioso y propenso a olvidos. Se comenta que no obliga a modificar el código y funciona con Python, R y otros lenguajes; se aborda el clásico "en mi local funcionaba" (versiones, sistema operativo, contenedores como Docker e instrucciones manuales incompletas).
- 27:00Hello World: DemoUna regla en un archivo `.smk` con `shell` ejecuta `echo`. Se ejecuta con `snakemake -c1 -s <snakefile> <regla>`; `-c` define los cores y se habla de leer el log de la terminal sin miedo.
- 40:04Ejemplo con parámetrosSe ejecuta un Script de Python con argumentos (fecha inicial y final) y luego los parámetros pasan a un archivo de configuración centralizado que se puede sobrescribir por línea de comando (`--config`). Se aclara la diferencia entre parámetro (nombre) y argumento (valor), y se discute no versionar claves ni mezclar variables de ambiente con la configuración; se menciona BFG para limpiar claves subidas por error a un repositorio.
- 50:11MemesMemes sobre la evolución de ejecución manual, Script de Bash, paralelo y Snakemake, y sobre el deployment sin soporte. Se opina que el Script de Bash ya es aceptable, que lo manual no, y se adelanta que la prueba de selección exigirá un pipeline.
- 55:05Ejemplo de flujo con parámetros e inputsEl Script se declara también como input para que un cambio fuerce la reejecución, aunque un espacio en blanco cuenta como cambio. Se muestran múltiples inputs separados por coma y el uso de `f-format` en las rutas, con el archivo de configuración definiendo rutas de input, output e intermedios.
- 58:38Uso de epipe: librería propiaSe presenta un paquete propio (`ipipe`) con unas cinco funciones, creado con ayuda de ChatGPT-4 para tests y documentación, y se insiste en que un paquete compartido debe ser robusto. Su función `run_cmd` arma automáticamente la línea de comando desde parámetros, input y output; se usa `run` en vez de `shell`, y se aclara que `run` ejecuta código Python y `shell` ejecuta en la terminal.
- 01:03:25Script con outputs únicosLos archivos generados llevan un tag de versión (con formato `f-format`) para que varias personas no se pisen archivos en una carpeta compartida. Se recomienda que los tags indiquen el desarrollo y no nombres de persona; el config se carga y reemplaza `versión` automáticamente.
- 01:11:08Memoria de ejecusión y discusiónAl reejecutar sin cambios Snakemake responde "no hay nada que hacer"; si cambia un parámetro o Script, solo reejecuta esa regla y sus dependencias. Se explica la diferencia con Airflow (tareas frente a flujo de datos, interfaz visual, ETLs) y que un pipeline de Snakemake puede ser un solo nodo de Airflow, con la desventaja de perder el seguimiento fino de dónde falló; se recomienda no encariñarse con las herramientas.
- 01:21:41Utilización de .env para variables de ambientePara que dos personas no sobrescriban la versión en el config versionado, se lee la versión desde un archivo oculto `.env` que no se comitea. Es una práctica interna del equipo.
- 01:22:49Cadenas de reglasCon varias reglas, la dependencia se infiere porque el output de una es el input de otra, y también se puede referenciar con `rules.<regla>.output`. Al modificar el primer Script se reejecutan ambas reglas.
- 01:24:38Por qué no nos gusta Kedro y Snakemake es mejor para nosotrosKedro intenta algo similar pero es difícil de depurar, obliga a hacer todo en Python y se pierde el catálogo con otros lenguajes, aunque se valora que impone estructura. Se destaca que en desarrollo analítico se itera mucho y se depura con `print`, por lo que el desarrollo debe ser ágil.
- 01:28:40Reglas paralelasSe procesan 12 meses de datos con `expand`, generando 12 dependencias independientes que se ejecutan en paralelo con `-c3`. Se guarda en Parquet particionado por periodo, que conserva los formatos y permite consultas tipo SQL, y se advierte que cada core consume RAM.
- 01:36:43CierreSe muestra cómo Snakemake reporta la línea del error (por ejemplo, una coma olvidada) y se anima a usar la herramienta sabiendo que habrá errores al aprender. Se invita a dejar dudas en Discord.