Introducción a Jupyter

Taller de herramientas para Big Data

del 4 al 6 de marzo de 2019

Juan Pablo Soto y Julio Waissman

¿Que es Jupyter?

Historia

  • Primera versión en diciembre 2011 como un método de libretas para Ipython.

  • Inició como una versión para python de las libretas de Mathematica

  • La arquitectura desarrollada permitió su uso más allá de python

  • En 2014 se separan como proyecto independiente bajo el nombre de Jupyter

Estructura de una libreta

  • Se basa en el concepto de celdas

  • Las celdas pueden ser de código o texto

  • Las celdas de texto se realiza en Markdown

    • Markdown con sabor de Github

    • Incluye MathJax

  • Las celdas de código se ejecutan en el orden solicitado en forma asíncrona

  • El sistema guarda memoria de lo ejecutado

Arquitectura del sistema

  • Aplicación cliente-servidor

  • El cliente interactúa a través de un navegador

  • El servidor se compone de Kernel y dashboard

    • El Kernel ejecuta el codigo de las celdas

    • El dashboard se encarga de la visualización y las celdas de texto.

¿Que se requiere para poder utilizar Jupyter?

Comenzamos con Python

Empezamos por cargar algunas librerías básicas

In [1]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['figure.figsize'] = (20,8)
plt.style.use('ggplot')

Probemos con un código sencillo

In [3]:
x = np.linspace(-np.pi, np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)

Todo se queda en memoria

mientras no se reinicie el kernel

In [5]:
plt.plot(x, y1, label='sen(x)')
plt.plot(x, y2, label='cos(x)')
plt.title('Funciones de ejemplo')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend()
plt.show()

Vamos por partes

  • ¿Qué puedo agregar en las celdas de texto?

  • ¿Qué puedo agregar en la celdas de código (aparte de código, por supuesto)?

  • ¿Cómo puedo cambiar el Kernel para usar otro lenguaje de programación?

Celdas de texto

  • Todo es Markdown

  • Una buena referencia rápida la puedes consultar aquí

Insertar imágenes

  • Lo más fácil es:

    ![texto](imagenes/jupyter.png)
    
  • Pero muchas veces es más conveniente

    <img src="imagenes/jupyter.png" width="70">
    

texto

Cuadros

  • Debe haber al menos trés lineas para marcar una separación
  • Los delimitadores externos son opcionales
| Col 1         | Col 2         | Col 3  |
| ------------- |:-------------:| ------:|
| Esta          | Esta          | \$1600 |
| columna       | se encuentra  |   \$12 |
| a la derecha  | centrada      |    \$1 |


Markdown | bien | feo
---|---|---
*No se ve muy bien* | ~el código~ | **pero genera un cuadro decente**
1 | 2 | 3
Col 1 Col 2 Col 3
Esta Esta \$1600
columna se encuentra \$12
a la derecha centrada \$1
Markdown bien feo
No se ve muy bien ~el código~ pero genera un cuadro decente
1 2 3

Notación matemática

  1. Jupyter usa por default mathjax

  2. Las ecuaciones en linea van entre signos \$ ecuación \$

  3. Las ecuaciones en propia linea van entre \$\$ ecuación \$\$

  4. Utiliza la notación estandard de $\LaTeX$

  5. Un buen lugar de consulta está aquí

Algunas ecuaciones

Podemos escribr cosas tanto en linea como $\forall x \in X, \quad \exists y \leq \epsilon$ que es muy práctico para calculo 1. Igualmente, se pueden escribir cosas como $\cos (2\theta) = \cos^2 \theta - \sin^2 \theta$ que es útil en trigonometría. O tambien podemos escribir
$$
\frac{n!}{k!(n-k)!} = \binom{n}{k},
$$

$$
P\left(A=2\middle|\frac{A^2}{B}>4\right) = \int_0^\infty \mathrm{e}^{-x}\,\mathrm{d}x
$$

Podemos escribr cosas tanto en linea como $\forall x \in X, \quad \exists y \leq \epsilon$ que es muy práctico para calculo 1. Igualmente se pueden escribir cosas como $\cos (2\theta) = \cos^2 \theta - \sin^2 \theta$ que es útil en trigonometría. O tambien podemos escribir $$ \frac{n!}{k!(n-k)!} = \binom{n}{k}, $$

$$ P\left(A=2\middle|\frac{A^2}{B}>4\right) = \int_0^\infty \mathrm{e}^{-x}\,\mathrm{d}x $$

Ingresando código de ejemplo en el texto

```python
def fibo(n):
    def fibo_r(x, y, acc):
        return y if acc < 2 else fibo_r(y, x + y, acc - 1)
    return fibo_r(1, 1, n)
`` `

lo que queda como

def fibo(n):
    def fibo_r(x, y, acc):
        return y if acc < 2 else fibo_r(y, x + y, acc - 1)
    return fibo_r(1, 1, n)

Celdas de código

Comandos mágicos

  • Jupyter tiene una serie de comandos mágicos,

  • Todos empiezan con '%'.

  • Todos son específicos a Python

Para probar, ejecuta en una casilla lo siguiente

%quickref
%lsmagic
In [11]:
%lsmagic
Out[11]:
Available line magics:
%alias  %alias_magic  %autocall  %automagic  %autosave  %bookmark  %cat  %cd  %clear  %colors  %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  %popd  %pprint  %precision  %profile  %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.
In [12]:
def fibo(n):
    def fibo_r(x, y, acc):
        
        return y if acc < 2 else fibo_r(y, x + y, acc - 1)
    return fibo_r(1, 1, n)

display(fibo(4))
display(fibo(20))
%timeit fibo(20)

# ¿Y que pasa si ejecutas %prun fibo(200)?
5
10946
4.34 µs ± 96.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [13]:
# Comandos mágicos que mandan llamar al shell 
!which python

%ls

%pwd
/Users/juliowaissman/anaconda/bin/python
LICENSE                     jupyter_basico.ipynb
README.md                   jupyter_basico.slides.html
imagenes/                   publish.sh*
index.html                  reveal.js/
Out[13]:
'/Users/juliowaissman/Documents/cursos/Capacitacion/jupyter-intro'

Tambien existe la biblioteca de Ipython

In [6]:
from IPython.display import YouTubeVideo
# a talk about IPython at Sage Days at U. Washington, Seattle.
# Video credit: William Stein.
YouTubeVideo('1j_HxD4iLn8')
Out[6]:

¿Y el código?

  • Depende de lo que quieras hacer.

  • Se puede hacer uso intensivo del autocompletado

  • Igualmente, se tiene la documentación de todas las funciones

  • Prácticamente todo lo que se hace en python funciona en Jupyter, sin embargo, se usa principalmente con:

¿Y si quiero ejecutar y guardar mis libretas en linea?

Dos opciones:

  • Colab. Libre, pero de Google (se usa desde drive)

  • Binder. Libre pero en etapa Beta y algo tardado (se usa desde github). No siepre funciona con las bibliotecas que se consideran de base.

Agregando otros Kernels a Jupyter

  • El nombre viene de Julia, python y R.

  • Instalar R, y desde R en la terminal:

    install.packages(c('repr', 'IRdisplay', 'evaluate', 'crayon', 
                        'pbdZMQ', 'devtools', 'uuid', 'digest'))
     devtools::install_github('IRkernel/IRkernel')
     IRkernel::installspec()
    
  • Instalar Julia, y luego ejecutar dentro del repl de Julia

    Pkg.add("IJulia")
    

¿Y si quiero agregar un interprete de C++?

  • Necesito tener instalado Jupyter a través de la distribución Anaconda

  • Usar el interprete (basado en python) Xeus-cling

Para instalar, desde la consola:

$ conda create -n cling
$ source activate cling
$ conda install xeus-cling notebook -c QuantStack -c conda-forge
$ source deactivate

Para probar

$ source activate cling
$ jupyter notebook

¿Y si quiero hacer una presentación en Jupyter?

  • Habilitar la edición de diapositivas en el menú (View -> Cell Toolbar -> Slideshow)

  • Seleccionar el tipo de diapositiva:

    • Slide Transparencia a la derecha

    • Subslide Transparencia hacia abajo

    • Fragment Para completar la transparencia paso a paso

    • - Para continuar con la transparencia

Y esto es todo por el momento...

Muchas gracias por su atencion

Muchas gracias por su atención