En el desarrollo de aplicaciones con Python, es habitual encontrarse con la necesidad de tener un entorno rápido, flexible y visual para hacer pruebas, experimentar con datos o validar pequeños scripts. Para estas tareas, pocas herramientas resultan tan versátiles como Jupyter Notebook y JupyterLab.
Para comprender de dónde proviene Jupyter, es necesario remontarse a IPython, una consola interactiva para Python creada por Fernando Pérez, pensada para facilitar la experimentación científica. Con el tiempo, esta herramienta evolucionó y, en 2014, dio paso al nacimiento del Proyecto Jupyter, una organización sin ánimo de lucro responsable del desarrollo de las herramientas mencionadas.
A lo largo de este post vamos a explorar cómo preparar un entorno JupyterLab desde cero con Python.
Conceptos clave
Un cuaderno o notebook de Jupyter es un documento interactivo que permite combinar código, resultados, visualizaciones, ecuaciones matemáticas (con LaTeX), y texto formateado en Markdown, todo en un solo lugar. Estos notebooks son ficheros con extensión .ipynb (de IPython Notebook), que contienen un JSON estructurado.
Cada notebook contiene una lista ordenada de «celdas», que pueden ser de código, texto o visualizaciones. Esto permite un flujo de trabajo ideal para exploración, análisis de datos, enseñanza o documentación técnica reproducible.
El nombre de Jupyter hace referencia a los tres lenguajes de programación que soporta (Julia, Python, R), para este post nos centraremos en las características de Python.
Componentes de Jupyter
Jupyter sigue una arquitectura cliente-servidor dividida en tres piezas clave:
- Cliente (la interfaz del notebook):
Es lo que se ve en el navegador, donde se escribe el código, se permite ejecutar celdas (aunque la ejecución real de estas ocurre en el kernel) y se ven los resultados. - Servidor de Jupyter:
Es el backend que arranca la interfaz web. Administra los cuadernos, ficheros, y coordina la comunicación con el kernel. - Kernel:
Es un proceso independiente que ejecuta realmente el código. Se comunica con el servidor mediante un protocolo de mensajes llamado ZeroMQ, usando JSON estructurado, que puede ser de los siguientes tipos:
- execute_request: el cliente envía código al kernel.
- execute_result: el kernel devuelve el resultado.
- stream: para salida estándar (como print()).
- error: si el código lanza una excepción.
- status: indica si el kernel está ocupado, ejecutando o inactivo.
Puesta a punto del entorno de trabajo en JupyterLab
Para comenzar, vamos a crear y activar un entorno virtual para aislar las dependencias y que no haya conflictos entre varios proyectos en nuestro equipo.

A continuación, instalaremos las dependencias. La forma más cómoda es utilizar el paquete de PyPi llamado jupyter, que de manera indirecta instalará los siguientes paquetes:
- notebook: la aplicación Jupyter Notebook.
- jupyterlab: la interfaz avanzada de JupyterLab, ideal para proyectos de análisis o desarrollo.
- ipython: la consola interactiva de IPython.
- ipykernel: el kernel de IPython para Jupyter.
- jupyter-console: un cliente de consola para Jupyter.
- nbconvert: una herramienta para convertir notebooks a varios formatos.
- ipywidgets: para crear widgets interactivos en IPython.

Iniciando Jupyter
Tanto si usas Jupyter Notebook como si prefieres trabajar con JupyterLab, el proceso de inicio es muy similar.
Una vez instaladas las dependencias, ya puedes iniciar el servidor de Jupyter. Desde tu terminal, simplemente ejecuta:
jupyter notebook

Este comando mostrará información sobre el servidor, incluyendo la URL para acceder a la interfaz. Por defecto, también abrirá tu navegador predeterminado en esta URL. Si prefieres evitar que se abra automáticamente, puedes añadir el argumento –no-browser. El puerto por defecto es 8888, pero puedes modificarlo con el parámetro –port <número_de_puerto>.
jupyter notebook --port 8000 --no-browser
Una vez accedemos a la URL proporcionada, encontraremos una página similar a esta:

Desde aquí, en la opción de la barra de herramientas File > New > Notebook podemos crear nuestro primer cuaderno.
Tipos de celdas
Como mencionamos anteriormente, en las celdas podemos utilizar tanto Markdown como código, podemos seleccionar el tipo de celda que queramos desde la barra de herramientas. Empecemos por añadir un título y descripción con Markdown:

Para ejecutar el contenido de la celda tenemos que pulsar la combinación de teclas Ctrl+Enter. El notebook se debería ver de la siguiente forma:

Dentro de una celda de tipo código, también puedes ejecutar comandos del sistema operativo si los precedes con el carácter !. Esto es útil para instalar paquetes o interactuar con el sistema de archivos directamente desde tu notebook:
!ls -l # Listar ficheros en Linux/macOS
!dir # Listar ficheros en Windows

A través de esta misma interfaz también podemos instalar dependencias que nos hagan falta para nuestro proyecto. Para asegurar que los paquetes se instalen directamente en el kernel que está ejecutando Jupyter, es recomendable usar sys.executable, para ello vamos a aplicar un ejemplo muy sencillo con bibliotecas básicas de análisis de datos:
import sys
!{sys.executable} -m pip install numpy matplotlib polars

Ahora, vamos a usar un código sencillo para crear y visualizar una matriz de valores aleatorios, demostrando las capacidades de Jupyter combinando código, ejecución y visualización:
import numpy as np
import polars as pl
import matplotlib.pyplot as plt
# Dimensiones de la matriz
rows, cols = 10, 10
# Dataframe con números aleatorios
df = pl.DataFrame({
f"col_{j}": np.random.rand(rows) for j in range(cols)
})
# Convertir a un array para visualización
matrix = df.to_numpy()
# Mostrar gráfico
plt.figure(figsize=(6, 5))
plt.imshow(matrix, cmap="viridis", aspect="auto")
plt.colorbar(label="Valor")
plt.title("Matriz aleatoria")
plt.xlabel("Columnas")
plt.ylabel("Filas")
plt.show()
Al ejecutar este código en tu cuaderno, obtendrás un resultado similar a la siguiente visualización:

Conclusiones sobre el uso de JupyterLab en proyectos con Python
En resumen, la versatilidad de JupyterLab y su fácil instalación hacen que sea una herramienta muy potente. Los notebooks son utilizados en un amplio rango de ámbitos y aplicaciones, desde procesamiento de imágenes a análisis financieros pasando por todo tipo de desarrollos de inteligencia artificial. Existen repositorios con listados de cuadernos en diversas materias que pueden ser un buen punto de referencia para seguir explorando el ecosistema de Jupyter.