merge: quick/init-jupyter-immutable-rules — reglas inmutabilidad y funcional para notebooks

This commit is contained in:
2026-03-26 22:46:23 +01:00
+38 -5
View File
@@ -281,29 +281,62 @@ Este repositorio está configurado para exploración de datos con Jupyter + Clau
## Reglas OBLIGATORIAS para Claude ## Reglas OBLIGATORIAS para Claude
### 1. SIEMPRE usar MCP jupyter para ejecutar código Python ### 1. CÓDIGO INMUTABLE - NUNCA MODIFICAR CELDAS EXISTENTES
- **PROHIBIDO** usar NotebookEdit para reemplazar celdas existentes
- **PROHIBIDO** modificar o sobrescribir notebooks completos
- **SIEMPRE** añadir celdas NUEVAS al final del notebook
- Si hay un error en una celda → crear celda nueva con la corrección, NO editar la original
- El historial de trabajo debe quedar intacto para trazabilidad
### 2. PROGRAMACIÓN FUNCIONAL OBLIGATORIA
- **Funciones puras**: sin efectos secundarios, mismo input → mismo output
- **Inmutabilidad**: nunca mutar datos, crear copias transformadas
- **Composición**: funciones pequeñas que se combinan
- **Sin estado global**: evitar variables globales mutables
- Preferir: `map`, `filter`, `reduce`, list comprehensions
- Evitar: loops con mutación, `global`, modificar argumentos in-place
Ejemplo CORRECTO:
```python
# Función pura, sin efectos secundarios
def limpiar_columna(df, col):
return df.assign(**{col: df[col].str.strip().str.lower()})
# Composición de transformaciones
df_limpio = (df
.pipe(limpiar_columna, "nombre")
.pipe(limpiar_columna, "email"))
```
Ejemplo INCORRECTO:
```python
# Mutación directa - PROHIBIDO
df["nombre"] = df["nombre"].str.strip()
```
### 3. SIEMPRE usar MCP jupyter para ejecutar código Python
- Las ejecuciones se ven en tiempo real en Jupyter Lab del usuario - Las ejecuciones se ven en tiempo real en Jupyter Lab del usuario
- Compartimos variables y estado del kernel - Compartimos variables y estado del kernel
- **NUNCA usar bash para ejecutar Python en este repo** - **NUNCA usar bash para ejecutar Python en este repo**
### 2. Verificar Jupyter activo ANTES de ejecutar ### 4. Verificar Jupyter activo ANTES de ejecutar
```bash ```bash
pgrep -af "jupyter" | grep "$(pwd)" || cat .jupyter-port 2>/dev/null pgrep -af "jupyter" | grep "$(pwd)" || cat .jupyter-port 2>/dev/null
``` ```
- Si no está activo → pedir al usuario: "Ejecuta `./run-jupyter-lab.sh` en otra terminal" - Si no está activo → pedir al usuario: "Ejecuta `./run-jupyter-lab.sh` en otra terminal"
### 3. Gestión de notebooks ### 5. Gestión de notebooks
- **TODOS los notebooks van a la carpeta `notebooks/`** o subcarpetas dentro de ella - **TODOS los notebooks van a la carpeta `notebooks/`** o subcarpetas dentro de ella
- Si un notebook tiene >50 celdas → crear uno nuevo - Si un notebook tiene >50 celdas → crear uno nuevo
- Nombrar descriptivamente: `notebooks/01_exploracion.ipynb`, `notebooks/02_limpieza.ipynb` - Nombrar descriptivamente: `notebooks/01_exploracion.ipynb`, `notebooks/02_limpieza.ipynb`
- Mantener notebooks enfocados en una tarea - Mantener notebooks enfocados en una tarea
### 4. Gestión de Python ### 6. Gestión de Python
- **SIEMPRE usar `uv` para gestionar Python** (entornos, dependencias, etc.) - **SIEMPRE usar `uv` para gestionar Python** (entornos, dependencias, etc.)
- Añadir paquetes con `uv add nombre_paquete` - Añadir paquetes con `uv add nombre_paquete`
- Nunca usar pip directamente si uv está disponible - Nunca usar pip directamente si uv está disponible
### 5. Antes de código pesado ### 7. Antes de código pesado
- Avisar al usuario - Avisar al usuario
- Usar `%%time` o `tqdm` para progreso - Usar `%%time` o `tqdm` para progreso