Jesús Alberto Romero Hernández
Aquí comparto mi plantilla creada.
Crear una plantilla personalizada con Cookiecutter te permite estandarizar proyectos de Machine Learning, acelerar el inicio de cada nuevo desarrollo y mantener consistencia entre los miembros de tu equipo. Es una herramienta clave si trabajas en ciencia de datos y necesitas que tus repositorios sigan siempre la misma estructura.
¿Qué estructura debe tener una plantilla para Machine Learning?
La idea es replicar un directorio que cubra los componentes típicos de un proyecto de datos: gestión de datasets, código fuente, notebooks, modelos y documentación.
La estructura base que vas a construir incluye:
data para almacenar los conjuntos de datos.source con el código fuente del proyecto.notebooks exploratorios.models para guardar los modelos entrenados.environment, requirements.txt, README.md y la licencia.Todo esto vive dentro de una carpeta especial nombrada con la sintaxis de Jinja: {{cookiecutter.project_name}}. Ese motor de plantillas es el que permite reemplazar variables dinámicas según lo que el usuario ingrese [01:30].
¿Qué es Jinja en Cookiecutter? Es el motor de plantillas que reemplaza variables como
{{cookiecutter.project_name}}por los valores que el usuario escribe al generar el proyecto. También soporta condicionales con{% if %}.
¿Cómo defines las variables en cookiecutter.json?
El archivo cookiecutter.json vive en la raíz del template y declara todas las variables que el usuario completará al ejecutar el comando. Cada valor en el JSON funciona como valor por defecto: si el usuario presiona enter sin escribir nada, ese será el valor asignado [03:45].
Las variables típicas para un proyecto de ML son:
project_name: nombre del proyecto.author_name: autor o equipo responsable.python_version: versión de Python, por ejemplo 3.8 o 3.12.license: lista con opciones como MIT, GPL y Apache.Cuando defines la licencia como una lista de tres elementos, Cookiecutter automáticamente muestra un menú numerado al usuario y toma la primera opción como predeterminada.
¿Cómo personalizar README, environment y la licencia con Jinja?
Cada archivo dentro del template puede invocar variables y aplicar lógica condicional. Así logras que la documentación generada se adapte al proyecto sin intervención manual.
¿Cómo se usan variables en el README?
En el README.md empiezas con un título dinámico usando markdown y Jinja:
markdown
{{cookiecutter.project_name}}
Proyecto de Machine Learning creado por {{cookiecutter.author_name}}
Luego añades la descripción, los requisitos y las instrucciones de instalación. La versión de Python también se inyecta desde la variable correspondiente, lo que evita inconsistencias entre la documentación y el entorno real.
¿Cómo aplicar condicionales para múltiples licencias?
El archivo de licencia usa la sintaxis de control de Jinja con {% %}. Esto te permite mostrar contenido distinto según la opción que el usuario eligió [07:20]:
jinja {% if cookiecutter.license == 'MIT' %} Licencia MIT. Derechos pertenecen a {{cookiecutter.author_name}}. {% elif cookiecutter.license == 'GPL' %} Licencia GPL... {% elif cookiecutter.license == 'Apache' %} Licencia Apache... {% endif %}
Fíjate en tres detalles: las cadenas como 'MIT' van entre comillas, cada bloque debe cerrar con %}, y todo el condicional termina con {% endif %}. Olvidar uno de estos signos es el error más común al construir plantillas.
¿Cómo configurar el environment.yml?
En el archivo de entorno defines el nombre dinámico, los canales de conda y las dependencias base:
name: {{cookiecutter.project_name}}.numpy, pandas y python={{cookiecutter.python_version}}.La indentación es crítica en YAML, así que valida cada nivel antes de guardar.
¿Cómo organizar y ejecutar tu template de Cookiecutter?
Para mantener orden cuando manejas varios templates, conviene crear una carpeta contenedora, por ejemplo my-ml-template, y dentro colocar el cookiecutter.json junto con la carpeta {{cookiecutter.project_name}} al mismo nivel.
¿Cómo ejecuto un template local de Cookiecutter? Desde la terminal en el directorio padre, corre
cookiecutter my-ml-template. La herramienta te pedirá los valores de cada variable y generará el proyecto con la estructura completa.
Una vez activado tu entorno virtual, por ejemplo notebooks_env, ejecutas el comando y respondes las preguntas: nombre del proyecto, autor, versión de Python (puedes elegir 3.12) y la licencia. Al terminar, verás una nueva carpeta lista para abrirse en Visual Studio Code con todos los archivos personalizados según tus respuestas [13:50].
Una buena práctica adicional es comenzar siempre desde la plantilla oficial para ciencia de datos que provee Cookiecutter y luego adaptarla a las necesidades de tu equipo. Sube tu template personalizada a GitHub y comparte el enlace en los comentarios para que otros puedan reutilizarla.
Jesús Alberto Romero Hernández
Aquí comparto mi plantilla creada.
Jhon Alexander Mosquera Vanegas
El archivo cookiecutter.json es donde un equipo decide qué se pregunta y qué se da por hecho. Cada variable lleva un valor por defecto, de modo que quien solo presione Enter obtiene la configuración acordada, y la licencia se ofrece como una lista de tres opciones: MIT, GPL y Apache. Eso convierte la plantilla en una pequeña política de trabajo, porque define cuántas decisiones quedan libres y cuántas vienen resueltas. Conviene pensar con cuidado el valor por defecto de la versión de Python, ya que la clase recuerda vigilar las dependencias según esa versión.
Mariano David Melgar Zavala
Gracias, muy buena info y claramente explicado.
Daniel Andres Rojas Paredes
se me ocurrio preguntarle a chat gpt sobre la accesibilidad usando jinja(hasta esta clase no sabia que jinja existia), esto fue lo que me respondio, me parecio muy interesante Yes, Jinja fully respects the accessibility requirements of HTML because it is simply a template rendering engine. Jinja itself does not alter the structure, semantics, or accessibility of the HTML it generates. It is entirely up to the developer to ensure the templates include proper ARIA tags, roles, and other accessibility considerations.
Jinja templates are flexible and make it easy to dynamically include ARIA attributes or roles by leveraging variables and control structures.
Applying ARIA Tags and Roles in Jinja
Dynamic ARIA Attributes: You can insert ARIA attributes dynamically based on variables or conditions.Example:<button aria-expanded="{{ expanded }}" aria-controls="menu"> Toggle Menu </button>
expanded variable could be true or false, dynamically setting the aria-expanded attribute.Roles and Accessibility States: Jinja makes it straightforward to include roles and ARIA states, ensuring the HTML remains accessible.Example:<div role="alert" aria-live="assertive"> {{ message }} </div>
Conditional ARIA Attributes: You can conditionally include ARIA attributes or roles based on specific conditions.Example:<button {% if disabled %} aria-disabled="true" disabled {% endif %}> Click Me </button>
Example: Accessible Dynamic Menu
Below is an example of how Jinja can help generate an accessible menu with ARIA attributes dynamically:
Jinja Template:
<nav aria-label="Main Navigation"> <ul> {% for item in menu %} <li> <a href="{{ item.url }}" aria-current="{% if item.current %}page{% endif %}"> {{ item.name }} </a> </li> {% endfor %} </ul> </nav>
Python Code:
menu = [ {"name": "Home", "url": "/", "current": True}, {"name": "About", "url": "/about", "current": False}, {"name": "Contact", "url": "/contact", "current": False} ] rendered_template = template.render(menu=menu)
Rendered HTML:
<nav aria-label="Main Navigation"> <ul> <li> <a href="/" aria-current="page">Home</a> </li> <li> <a href="/about">About</a> </li> <li> <a href="/contact">Contact</a> </li> </ul> </nav>
Advantages of Using Jinja for Accessibility
aria-expanded, aria-hidden, or aria-current can be controlled dynamically with variables.if, for) allow you to tailor accessibility features based on specific content or states.Best Practices for Accessibility in Jinja Templates
Would you like a specific example of how to implement a particular ARIA feature using Jinja?