Trabajando a 100 por hora en Jupyter Notebook
Tags: jupyter, python
Published: 2021-07-10 12:40:08

## Qué es Jupyter

Para el que no lo conozca, el [Proyecto Jupyter](https://jupyter.org/) es una herramienta diseñada para crear documentos con código, ecuaciones, imágenes... que puedes ejecutar en vivo.

Es tremendamente útil con fines académicos y con el objetivo de compartir código.

Es muy usado para investigación y enseñanza, como es el caso que nos ocupa.

En mi caso, uso Jupyter en el curso de Data Science y Machine Learning que estoy haciendo en la academia [Core Code School](https://www.corecode.school/). La verdad, los cursos molan bastante y no necesitas conocimiento previo para embarcarte en ellos (toma publi, Marc).

Una vez hechas las presentaciones, vamos a ver cuál es el objetivo de este post.

## ¿Por qué modificar lo que viene de base?

Creo que la respuesta a esta pregunta es bastante obvia... ~~porque puedo~~ para intentar mejorar la experiencia con la herramienta.

La idea de todo esto es modificar la interfaz y el comportamiento de Jupyter para mejorar tu productividad y el flujo de trabajo de forma que puedas hacer el mismo trabajo en menos tiempo.

## Pre-requisitos

No es parte de este post explicar cómo funciona Jupyter ni cómo instalarlo. Se asume que tienes python y Jupyter en tu equipo (preferiblemente con [Anaconda](https://www.anaconda.com/products/individual)) y que sabes manejarte con lo básico en jupyter.

## Instalar los paquetes

Antes de empezar necesitas instalar unos paquetes de python para que Jupyter se entienda con las extensiones y los temas.

Para poder gestionar temas necesitas instalar [jupyter-themes](https://github.com/dunovank/jupyter-themes) con el comando:

```bash
pip install jupyterthemes
```

Una vez tienes eso, toca ir a por el paquete para gestionar extensiones. En este caso es [jupyter_contrib_nbextensions](https://github.com/ipython-contrib/jupyter_contrib_nbextensions):

```bash
conda install -c conda-forge jupyter_contrib_nbextensions
```

Y una vez que tienes ese paquete, falta instalar los archivos necesarios en Jupyter. Afortunadamente, el paquete expone un comando para eso:

```bash
jupyter contrib nbextension install --user
```

Y ya lo tienes todo listo para empezar a ponerlo a tu gusto.

## Lo primero es lo primero

Las extensiones y la productividad están muy bien, pero aquí hemos venido a la fantasía, y por eso voy a empezar con los temas.

> Nota: Te recomiendo parar Jupyter y borrar la caché del navegador antes de cambiar el tema.

La extensión de los temas expone el comando `jt` para gestionarla. Para listar los temas disponibles usa el comando:

```bash
jt -l
```

En mi caso tengo disponibles los temas:

```
Available Themes: 
   chesterish     
   grade3
   gruvboxd
   gruvboxl
   monokai
   oceans16
   onedork
   solarizedd
   solarizedl
```

A mi, personalmente, el que más me gustó es `oceans16`. Para activarlo se usa el comando `jt -t [nombre_del_tema]`. Pero hay otra serie de opciones que se pueden usar para cambiar la fuente y muchas cosas más.

En mi caso, voy a cambiar la fuente del código a `FiraCode` y la del texto y el markdown a `Merriweather`. Para eso voy a usar los a argumentos `-f` (fuente del código), `-nf` (fuente del notebook) y `-tf` (fuente del texto/makrdown):

```bash
jt -t oceans16 -f firacode -nf merriserif -tf merriserif
```

Puedes cambiar el tamaño de la fuente, qué elementos se muestran y [muchas cosas más](https://github.com/dunovank/jupyter-themes#command-line-usage). En mi caso, la configuración que he elegido es:

```bash
jt -t oceans16 -f firacode -nf merriserif -tf merriserif -fs 95 -altp -tfs 11 -nfs 115 -cellw 88% -T -N -kl
```

Y queda así:
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k6vbofjoljewpskkb7zy.png)
 

## Ahora sí, las extensiones

Una vez que ya lo tienes bonito, a por las extensiones para trabajar mejor. 

Si, como yo, tienes la versión de Jupyter 6, vas a tener que desactivar esta casilla en la pestaña `NbExtensions`:

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/owojnph5i8vtm5q8wyf3.png)

Para poder instalar las extensiones. Esto es porque todas las extensiones ponen que son para Jupyter 4 y 5. Sin embargo, yo las he probado con la versión 6 y funcionan todas. 

Ahora sí, sin más rodeos, vamos con ellas (las que yo tengo).

### Tree Filter

Esta extensión añade una barra de búsqueda a la vista de archivos de Jupyter. Esto te permite buscar archivos o carpetas de manera mucho más rápida y sencilla.

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aoyv8497ltb9x7ihvfov.png)
 
### Table of Contents (2)

Esta extensión hace lo que promete. Pone de manera visual el índice del notebook para que puedas tener una navegación rápida:

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/etvxwpoz120p46ctt58y.png)

Para activarla y desactivarla sólo tienes que clicar el botón con el símbolo de la lista en la barra de herramientas. 

Desde la pestaña de `NbExtensions` puedes configurar la apariencia, cuántos subniveles se muestran, etc.

### Collapsible Headers

Parecido al anterior. Te permite ocultar secciones completas contrayendo su cabecera. Con esto puedes ocultar el contenido de las secciones que no necesites para navegar mucho más rápido por el notebook.

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nodm65p7d89byf4vz1sl.png)
 
Con la flecha izquierda contraes la cabecera de la celda seleccionada y con la derecha la expandes. De nuevo, tienes más configuraciones desde la pestaña de extensiones.

### Snippets

Esta es una muy simple pero que me parece realmente útil. Puedes definirte fragmentos de código para colocar con un click en una celda.

La configuración no es tan sencilla como en las demás, pues tienes que definir los snippets en un archivo JSON llamado `snippets.json` y colocarlo en la carpeta:

```
$(jupyter --data-dir)/nbextensions/snippets/
```

Si, por ejemplo, quieres un snippet para importar numpy y pandas llamado `np, pandas` definirías un JSON como el que sigue:

```json
{
    "snippets" : [
        {
            "name" : "np, pandas",
            "code" : [
                "import numpy as np",
                "import pandas",
            ]
        }
    ]
}
```

Ahora podremos incrustar nuestro snippet usando el menú de la barra de herramientas:

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1v2uexa9rcunrpdo2e2p.png)

### Initialization Cells

Muy de la mano con la de snippets se puede usar esta. Esta extensión te permite marcar algunas celdas como "celdas de inicialización", para ejecutarlas automáticamente al abrir un notebook, o a mano, o cuando prefieras.

Lo primero que hay que hacer es mostrar la casilla de la extensión a través del menú *View > Cell Toolbar > Initialization Cell*

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4vgnkvv5tsyk0nv6skv8.png)

Una vez hecho eso, ya podrás marcar casillas como inicialización:

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d7b2wgttnv2410obk12d.png)

Y, para lanzarlas todas, solo tendrás que clicar el icono de la calculadora de la barra de herramientas.  

### Autopep8 

No hay mucho que decir. Te permite formatear el código de una celda acorde a las reglas de autopep8.

Para hacerlo, se puede usar el mazo que hay en la barra de tareas:

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vmuiw2extmeu3uohypzn.png)

Otra opción (la que yo he hecho) es configurar un atajo de teclado para formatear una celda. Desde la página de extensiones, configura la opción *Hotkey to use to prettify the selected cell(s)* con el atajo que prefieras. En mi caso he usado Ctrl+Alt+F.

> Nota: Para que funcione, necesitas tener instalada la extensión `autopep8` en tu entorno. Puedes hacerlo con `pip install autopep8`

### Comment/Uncomment Hotkey

A esta no voy a darle muchas vueltas. Te permite definir un atajo de teclado para comentar una línea o un bloque de código.

Yo lo tengo configurado con el atajo `Ctrl+Shift+7`, igual que Visual Studio Code.

### ExecuteTime

Esta extensión es más informativa que otra cosa. Te añade una línea debajo de la celda con el tiempo que ha tardado en ejecutarse.

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tc86fzvjeqetnmlkmb9o.png)

Esta extensión permite configurar el formato en el que aparecen las marcas temporales y cuándo se limpian. 

### Variable Inspector

Tampoco deja mucho a la imaginación. Cuando pulsas el botón con una mirilla de la barra de herramientas, te va a abrir una ventana flotante con las variables que tienes ahora mismo y sus valores.

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/99kj1n9p7o8g0gkqn3ec.png)
 
Esa ventana la puedes actualizar, minimizar y cerrar :) Muy útil para hacer una suerte de depuración.

### Hinterland

Esta extensión lo que hace es extender una funcionalidad que ya tiene Jupyter. Cuando vas escribiendo código, puedes autocompletar pulsando Ctrl + Espacio. Esta extensión lo que hace es que el autocomlpetado (Intellisense) funcione automáticamente mientras escribes, como en casi cualquier IDE.

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u6jcuaxylq2h1zn721dq.png)

### Scratchpad

Por último, esta extensión te permite abrir una especie de celda aparte en la que puedes ejecutar código para probar, volátil.

En esa celda aparte tienes acceso a todas las variables del notebook, tanto para consulta como para modificación. Puedes ver un [vídeo](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ro3ipo4bfo05rvg5ftsy.gif) de cómo funciona sacado directamente desde su documentación.

## Conclusiones

Pues no mucho más que decir :). Ahora tienes tu Jupyter precioso y echas fuego por las orejas cuando trabajas.

Si tienes más extensiones o flujos de trabajo que merezcan la pena compartir, te leo en los comentarios.

Y, por supuesto, visita la página de [Core Code School](https://www.corecode.school/) para ver sus cursos!!