Jupyter Noteboook

Jupyter Notebook, es un entorno de trabajo interactivo que permite desarrollar código en Python.

python
jupyter-notebooks
Autor/a

Francisco Alfaro

Fecha de publicación

31 de julio de 2021

Jupyter Noteboook


Introducción

Jupyter Notebook, es un entorno de trabajo interactivo que permite desarrollar código en Python (por defecto, aunque permite otros lenguajes) de manera dinámica, a la vez que integrar en un mismo documento tanto bloques de código como texto, gráficas o imágenes. Es un SaaS utilizado ampliamente en análisis numérico, estadística y machine learning, entre otros campos de la informática y las matemáticas.

Por otro lado, JupyterLab es similar a Jupyter Notebook en cuanto a sus funcionalidade, pero tiene un interfaz más interesante para los usuarios. Eventualmente Jupyter Lab reemplazará a Jupyter Notebok.

Nos centraremos en comprender aspectos básicos de cómo trabajar un archivo en jupyter notebook (extensión .ipynb).

Primeros Pasos

Instalación

Para instalar RISE, necesitará usar la línea de comando. Si ha instalado Anaconda, puede usar:

conda install -c conda-forge notebook

De lo contrario, puede instalar con pip:

pip install notebook

Nota: SI desea instalar JupyterLab, simplemente reemplaza notebook por jupyterlab.

Primeros pasos

Notebook Server

Una vez que haya instalado Jupyter Notebook en su computadora, estará listo para ejecutar el servidor de la computadora portátil. Puede iniciar el servidor del portátil desde la línea de comandos (usando Terminal en Mac/Linux, Símbolo del sistema en Windows) ejecutando:

jupyter notebook

Esto imprimirá cierta información sobre el servidor en su terminal, incluida la URL de la aplicación web (de forma predeterminada, http://localhost:8888):

$ jupyter notebook
[I 08:58:24.417 NotebookApp] Serving notebooks from local directory: /Users/catherine
[I 08:58:24.417 NotebookApp] 0 active kernels
[I 08:58:24.417 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/
[I 08:58:24.417 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

A continuación, abrirá su navegador web predeterminado a esta URL. Cuando el notebook se abra en su navegador, verá el Panel, que mostrará una lista de notebooks, archivos y subdirectorios en el directorio donde se inició el servidor.

La parte superior de la lista de notebooks se muestran rutas de navegación en las que se puede hacer clic del directorio actual.

Para crear un nuevo notebook, haga clic en el botón New en la parte superior de la lista y seleccione el kernel del menú desplegable (como se ve a continuación). Los kernels que se enumeran dependen de lo que esté instalado en el servidor.

Nota: Es posible que algunos de los kernels de la siguiente captura de pantalla no existan como una opción para usted.

Una vez seleccionado el kernel, se abrira nuestro primer notebook!.

Toolbox

Jupyter notebook nos ofrece el siguiente toolbox:

  • File: En él, puede crear un nuevo cuaderno o abrir uno preexistente. Aquí es también a donde iría para cambiar el nombre de un Cuaderno. Creo que el elemento de menú más interesante es la opción Guardar y Checkpoint. Esto le permite crear puntos de control a los que puede retroceder si lo necesita.

  • Edit: Aquí puede cortar, copiar y pegar celdas. Aquí también es donde irías si quisieras eliminar, dividir o fusionar una celda. Puede reordenar celdas aquí también.

  • View: es útil para alternar la visibilidad del encabezado y la barra de herramientas. También puede activar o desactivar los números de línea dentro de las celdas. Aquí también es donde irías si quieres meterte con la barra de herramientas de la celda.

  • Insert: es solo para insertar celdas encima o debajo de la celda seleccionada actualmente.

  • Cell: le permite ejecutar una celda, un grupo de celdas o todas las celdas. También puede ir aquí para cambiar el tipo de celda, aunque personalmente considero que la barra de herramientas es más intuitiva para eso.

  • Kernel: es para trabajar con el kernel que se ejecuta en segundo plano. Aquí puede reiniciar el kernel, volver a conectarlo, apagarlo o incluso cambiar el kernel que está utilizando su computadora portátil.

  • Widgets: es para guardar y borrar el estado del widget. Los widgets son básicamente widgets de JavaScript que puede agregar a sus celdas para crear contenido dinámico utilizando Python (u otro Kernel).

  • Help: es donde debe aprender sobre los atajos de teclado del Notebook, un recorrido por la interfaz de usuario y mucho material de referencia.

Markdown

Jupyter Notebook permite que escribamos texto formateado, es decir, texto con cursiva, negritas, títulos de distintos tamaños, etc., de forma simple. Para ello Jupyter nos permite usar Markdown, que es un lenguaje de marcado (markup) muy popular.

Los lenguajes de markup son lenguajes ideados para procesar texto, algunos de los más conocidos son HTML y \(\LaTeX\). Markdown tiene como objetivo ser un lenguaje de sintaxis minimalista, simple de aprender y usar; de esa forma uno puede dar formato al texto pero sin perder demasiado tiempo en los detalles.

La cantidad de tutoriales en la red sobre Markdown es inmenso, por lo que nos centraremos en indicar las opciones que más se utilizan.

  • Texto en negrita/cursiva: El texto en negrita se indica entre dos pares de asteriscos. De este modo **palabra** aparecerá como palabra. Por otro lado, el texto en cursiva se indica entre dos asteriscos simples; es decir *palabra* aparecerá como palabra.

  • Listas: Las listas en Markdown se realizan indicando un asterisco o un número seguido de un punto si se desean listas numeradas. Markdown organiza automáticamente los items asignándoles el número correcto.

  • Inclusión de imágenes: La sintaxis para incluir imágenes en Markdown es ![nombre alternativo](dirección de la imagen) en donde el nombre alternativo aparecerá en caso de que no se pueda cargar la imágen y la dirección puede referirse a una imagen local o un enlace en Internet.

  • Inclusión de código HTML: El lenguaje Markdown es un subconjunto del lenguaje HTML y en donde se necesite un mayor control del formato, se puede incluir directamente el código HTML.

  • Enlaces: Las celdas de texto pueden contener enlaces, tanto a otras partes del documento, como a páginas en internet u otros archivos locales. Su sintaxis es [texto](dirección del enlace).

  • Fórmulas matemáticas: Gracias al uso de MathJax, se puede incluir código en \(\LaTeX\) para mostrar todo tipo de fórmulas y expresiones matemáticas. Las fórmulas dentro de una línea de texto se escriben entre símbolos de dólar $...$, mientras que las expresiones separadas del texto utilizan símbolos de dólar dobles $$...$$. Los siguientes son ejemplos de fórmulas matemáticas escritas en \(\LaTeX\):

\[p(x) = 3x^2 + 5y^2 + x^2y^2\]

\[e^{\pi i} - 1 = 0\]

\[\lim_{x \rightarrow \infty} 3x+1\]

\[\sum_{n=1}^\infty\frac{1}{n^2}\]

\[\int_0^\infty\frac{\sin x}{x}\,\mathrm{d}x=\frac{\pi}{2}\]

Código

Jupyter Notebook permite que escribamos código dependiendo del kernel a trabajar. Por defecto, se trabaja con el kernel de Python.

Veamos unos ejemplos sencillos de código:

import math
n = 16
print(f"La raiz cuadra de {n} es {math.sqrt(n)}")
La raiz cuadra de 16 es 4.0

También es posible visualizar tablas de datos con la librería pandas:

#collapse-hide
import pandas as pd
import altair as alt

# datasets
movies = 'https://vega.github.io/vega-datasets/data/movies.json'
stocks = 'https://vega.github.io/vega-datasets/data/stocks.csv'
df = pd.read_json(movies) # load movies data
df.columns = [x.replace(' ', '_') for x in df.columns.values]

df.head()
Title US_Gross Worldwide_Gross US_DVD_Sales Production_Budget Release_Date MPAA_Rating Running_Time_min Distributor Source Major_Genre Creative_Type Director Rotten_Tomatoes_Rating IMDB_Rating IMDB_Votes
0 The Land Girls 146083.0 146083.0 NaN 8000000.0 Jun 12 1998 R NaN Gramercy None None None None NaN 6.1 1071.0
1 First Love, Last Rites 10876.0 10876.0 NaN 300000.0 Aug 07 1998 R NaN Strand None Drama None None NaN 6.9 207.0
2 I Married a Strange Person 203134.0 203134.0 NaN 250000.0 Aug 28 1998 None NaN Lionsgate None Comedy None None NaN 6.8 865.0
3 Let's Talk About Sex 373615.0 373615.0 NaN 300000.0 Sep 11 1998 None NaN Fine Line None Comedy None None 13.0 NaN NaN
4 Slam 1009819.0 1087521.0 NaN 1000000.0 Oct 09 1998 R NaN Trimark Original Screenplay Drama Contemporary Fiction None 62.0 3.4 165.0

Unas de las cosas más significativas de Jupyter notebook es poder trabajar con distintos tipos de gráficos (imagen estática o interactiva). Estos son de bastante utilidad para poder comprender nuestros procedimientos.

#collapse-hide

# select a point for which to provide details-on-demand
label = alt.selection_single(
    encodings=['x'], # limit selection to x-axis value
    on='mouseover',  # select on mouseover events
    nearest=True,    # select data point nearest the cursor
    empty='none'     # empty selection includes no data points
)

# define our base line chart of stock prices
base = alt.Chart().mark_line().encode(
    alt.X('date:T'),
    alt.Y('price:Q', scale=alt.Scale(type='log')),
    alt.Color('symbol:N')
)

alt.layer(
    base, # base line chart
    
    # add a rule mark to serve as a guide line
    alt.Chart().mark_rule(color='#aaa').encode(
        x='date:T'
    ).transform_filter(label),
    
    # add circle marks for selected time points, hide unselected points
    base.mark_circle().encode(
        opacity=alt.condition(label, alt.value(1), alt.value(0))
    ).add_selection(label),

    # add white stroked text to provide a legible background for labels
    base.mark_text(align='left', dx=5, dy=-5, stroke='white', strokeWidth=2).encode(
        text='price:Q'
    ).transform_filter(label),

    # add text labels for stock prices
    base.mark_text(align='left', dx=5, dy=-5).encode(
        text='price:Q'
    ).transform_filter(label),
    
    data=stocks
).properties(
    width=500,
    height=400
)

Completado mediantes Tabs.

La completación mediante tabs, especialmente para los atributos, es una forma conveniente de explorar la estructura de cualquier objeto con el que esté tratando.

Simplemente escriba object_name.<TAB> para ver los atributos del objeto. Además de los objetos y palabras clave de Python, la finalización de pestañas también funciona en nombres de archivos y directorios.

import collections
collections. # aprete la tecla <𝑇𝐴𝐵>

Buscando ayuda

En caso de necesitar ayuda sobre cualquier comando de Python, Jupyter nos ofrece una función llamada help.

En resumen, ¡suele ser más importante saber como buscar información que memorizarla! Por todo esto, Jupyter nos ofrece ayuda sobre cualquier comando agregando un signo de interrogación ? luego del nombre del comando (y luego ejecutar la celda con la combinación de teclas SHIFT + ENTER).

import numpy as np
np.sum?

Magics

Jupyter posee varias funciones mágicas predefinidas que sirven para simplificar tareas comunes.

Hay dos tipos de magias:

  • Magias por linea (line magics): son comandos que empiezan con el caracter % y que toman como argumentos valores escritos en la misma línea.

  • Magias por celda (cell magics): son comandos que empiezan con los caracteres %%, y que reciben argumentos en la misma línea y en toda la celda.

En general solo se puede usar una sola mágias por celda en cada celda y debe ser escrita en la primer linea de la celda.

Un buen ejemplo de mágia es %lsmagic que lista todas las magias disponibles:

%lsmagic
Available line magics:
%alias  %alias_magic  %autoawait  %autocall  %automagic  %autosave  %bookmark  %cat  %cd  %clear  %colors  %conda  %config  %connect_info  %cp  %debug  %dhist  %dirs  %doctest_mode  %ed  %edit  %env  %gui  %hist  %history  %killbgscripts  %ldir  %less  %lf  %lk  %ll  %load  %load_ext  %loadpy  %logoff  %logon  %logstart  %logstate  %logstop  %ls  %lsmagic  %lx  %macro  %magic  %man  %matplotlib  %mkdir  %more  %mv  %notebook  %page  %pastebin  %pdb  %pdef  %pdoc  %pfile  %pinfo  %pinfo2  %pip  %popd  %pprint  %precision  %prun  %psearch  %psource  %pushd  %pwd  %pycat  %pylab  %qtconsole  %quickref  %recall  %rehashx  %reload_ext  %rep  %rerun  %reset  %reset_selective  %rm  %rmdir  %run  %save  %sc  %set_env  %store  %sx  %system  %tb  %time  %timeit  %unalias  %unload_ext  %who  %who_ls  %whos  %xdel  %xmode

Available cell magics:
%%!  %%HTML  %%SVG  %%bash  %%capture  %%debug  %%file  %%html  %%javascript  %%js  %%latex  %%markdown  %%perl  %%prun  %%pypy  %%python  %%python2  %%python3  %%ruby  %%script  %%sh  %%svg  %%sx  %%system  %%time  %%timeit  %%writefile

Automagic is ON, % prefix IS NOT needed for line magics.

En varias situaciones resulta necesario medir el tiempo de ejecución de una porción de código. Para ello podemos usar la magia %timeit. Esta magia está disponible tanto para línea como para celda:

%%timeit 
1+1 # timeit repite (adaptativamente) la medición a fin de reducir el error.
8.68 ns ± 0.387 ns per loop (mean ± std. dev. of 7 runs, 100000000 loops each)

Jupyter notebook permite también mezclar varios lenguajes de programación en una misma notebook. Por ejemplo, podríamos escribir en bash lo siguiente:

%%bash
for i in {3..1}; do
    echo $i
done
echo "Hola desde $BASH"
3
2
1
Hola desde /usr/bin/bash

También, puede acceder a la línea de comandos, anteponiendo el símbolo de !. Esto es de bastante utilidad cuando se quiere mostrar las dependencias que se necesitan instalar. (ejemplo: !pip install pandas).

Veamos un ejemplo:

!pwd
/home/fralfaro/PycharmProjects/ds_blog/_notebooks

Referencias