Entorno: Python + uv + Jupyter en 10 minutos

python
pandas
eda
Por qué Python necesita más configuración que R. uv como el gestor moderno que unifica pip, virtualenv y pyenv. Crear un proyecto, instalar pandas y arrancar Jupyter sin lío de versiones.

¿Por qué Python necesita más configuración que R?

R tiene una instalación canónica: descargas el instalador, ejecutas, listo. Hay una versión de R activa y las bibliotecas se instalan globalmente o por usuario.

Python es distinto:

  • Múltiples versiones coexisten. macOS y Linux vienen con Python preinstalado (a menudo desactualizado), y proyectos serios usan versiones específicas.
  • Las dependencias dependen del proyecto. Una librería que un proyecto necesita en versión 1.0 puede no funcionar con otro que necesita 2.0.
  • El ecosistema de instaladores está fragmentado: pip, conda, pyenv, virtualenv, poetry, pipenv… cada uno con su filosofía.

El resultado: instalar Python “a lo bruto” lleva a “funciona en mi máquina pero no en la del compañero”, “esta semana actualicé algo y todo dejó de funcionar”, “¿qué Python estoy usando ahora?”.

La solución moderna se llama uv.

uv: el gestor moderno

uv es un gestor de Python escrito en Rust, lanzado en 2024 por la empresa Astral (los del linter ruff). Sustituye a pip, virtualenv, pyenv y poetry con una sola herramienta, 10-100× más rápida que las alternativas.

Lo que hace:

  • Instala versiones de Python (como pyenv).
  • Crea entornos virtuales aislados (como virtualenv).
  • Instala dependencias (como pip, pero con resolver mucho mejor).
  • Gestiona proyectos con pyproject.toml (como poetry).
  • Lockfile reproducible (uv.lock), equivalente a renv.lock en R.

En 2026 es el estándar emergente. Si vas a empezar Python hoy, empieza con uv.

Instalar uv

Windows (PowerShell):

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

macOS / Linux:

curl -LsSf https://astral.sh/uv/install.sh | sh

Reinicia la terminal y prueba:

uv --version

Si responde con la versión, está listo.

Crear un proyecto

# Crea una carpeta nueva con estructura básica
uv init mi-proyecto
cd mi-proyecto

Esto genera:

mi-proyecto/
├── .gitignore
├── .python-version       # versión de Python fijada para el proyecto
├── README.md
├── pyproject.toml        # metadata + dependencias
├── hello.py              # ejemplo
└── uv.lock               # se crea al añadir dependencias

Si necesitas una versión específica de Python:

uv python install 3.12         # descarga e instala Python 3.12
uv python pin 3.12             # fija esa versión para el proyecto

uv instala la versión exacta y la usa solo para este proyecto. No interfiere con el Python del sistema.

Instalar paquetes

uv add pandas numpy matplotlib seaborn jupyter

Esto:

  1. Crea el entorno virtual (.venv/) si no existe.
  2. Instala los paquetes en ese entorno.
  3. Registra las dependencias en pyproject.toml.
  4. Actualiza uv.lock con las versiones exactas (reproducibilidad).

Para añadir una dependencia de desarrollo (linter, testing) sin meterla en producción:

uv add --dev pytest ruff

Para sincronizar el entorno con uv.lock (al clonar el proyecto en otra máquina):

uv sync

Equivalente conceptual a renv::restore() en R.

Jupyter en el proyecto

Jupyter es el equivalente de RStudio para Python (más o menos, la metáfora se rompe rápido, pero sirve para empezar). Notebook interactivo, ejecución por celdas, output inline.

Con uv instalado y jupyter añadido al proyecto:

uv run jupyter lab

uv run ejecuta el comando dentro del entorno virtual del proyecto. Sin él, jupyter lab usaría la instalación global de Python (si existe) y no encontraría los paquetes del proyecto.

Abre tu navegador en http://localhost:8888/lab y verás Jupyter Lab. Crea un nuevo notebook (kernel “Python 3”) y verifica:

import pandas as pd
print(pd.__version__)

Debería imprimir la versión que uv instaló.

Editor: ¿solo Jupyter o algo más?

Tres opciones razonables:

  • Jupyter Lab solo: suficiente para análisis exploratorio. La mayoría de analistas en Python viven aquí.
  • VS Code + extensión Jupyter: integra notebooks dentro del IDE con autocompletado y debugger mejor que Jupyter Lab nativo. Recomendado si vienes de programación.
  • PyCharm Professional: el equivalente robusto a RStudio. Excelente para desarrollo serio, gratis para estudiantes/open source, pagado para uso comercial.

Si vienes de RStudio, VS Code es probablemente lo más parecido en filosofía (IDE + chunks de código). Si vienes de Jupyter clásico, Jupyter Lab moderno es continuidad natural.

Para esta ruta, cualquier opción funciona, los ejemplos son código que pegas y ejecutas.

Estructura mínima del proyecto

mi-proyecto/
├── pyproject.toml         # qué paquetes usa
├── uv.lock                # versiones exactas (versionar en git)
├── .python-version        # versión de Python
├── data/                  # datos crudos (raros en git si son grandes)
│   └── ventas.csv
├── notebooks/             # análisis exploratorio
│   ├── 01_eda.ipynb
│   └── 02_modelo.ipynb
├── src/                   # código reutilizable
│   ├── __init__.py
│   ├── limpieza.py
│   └── modelos.py
└── README.md

Convenciones que importan:

  • pyproject.toml y uv.lock en git: son la receta de tu entorno.
  • .venv/ NUNCA en git: son binarios que se regeneran con uv sync.
  • Notebooks numerados: el número indica orden de ejecución (igual que los scripts R).
  • src/ para código reutilizable: funciones que importan los notebooks. Convierte tu análisis exploratorio en biblioteca interna.

.gitignore razonable (uv init lo genera correcto por defecto):

.venv/
__pycache__/
*.pyc
.ipynb_checkpoints/
.python-version    # opcional: ignorar si distintos devs usan distintas versiones

Trampas habituales

  • Usar pip install global sin entorno virtual. Instalar paquetes con pip install pandas directo desde la terminal los pone en el Python del sistema, contaminando entre proyectos. Si haces esto en macOS, además puedes romper herramientas del SO que dependen de su Python. Siempre dentro de un proyecto con uv add.
  • jupyter lab sin uv run. Sin uv run, Jupyter usa el Python global y no encuentra los paquetes del proyecto. El error es del estilo “ModuleNotFoundError: No module named pandas” incluso después de haberlo instalado. La solución es uv run jupyter lab.
  • Olvidar uv sync al cambiar de máquina. Cuando clonas un proyecto en otro ordenador, uv sync recrea el entorno desde uv.lock. Sin él, los notebooks fallan al primer import.
  • Versiones de Python distintas entre desarrollo y producción. Si desarrollas con Python 3.12 y producción usa 3.10, algunas features pueden no estar disponibles. Pin la versión en .python-version y respétala.

En la siguiente entrega

Tienes el entorno. La siguiente pieza es NumPy, la librería fundamental sobre la que se monta todo el análisis numérico en Python, incluido pandas. Sin entender NumPy mínimamente, pandas se siente como magia. Lo siguiente.