Manual Jupyter Spanish

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 38

Universidad Complutense de Madrid
MANUAL DE USO DE JUPYTER NOTEBOOK
PARA APLICACIONES DOCENTES
Autores:
Eduardo Cabrera Granado
Elena D´ıaz Garc´ıa
´
Indice general
Introducci´on 1
Jupyter Notebook 3
Python 11
Gesti´on de cursos 21
Propuestas Docentes 27
Conclusiones 31
Referencias 33
Introducci´on
El proyecto de c´odigo abierto Jupyter pretende generar una plataforma compu-
tacional que permita utilizar diferentes lenguajes (su nombre proviene de unir los
3 lenguajes quiz´as m´as populares en c´alculo cient´ıfico: Julia, Python y R). El pilar
en el que se sustenta es la interfaz web Jupyter Notebook, que aglutina la ejecuci´on
de c´odigo, inclusi´on de texto junto a ecuaciones en LaTeX (v´ıa MathJax), video, y
todo lo que se pueda visualizar con un navegador. Su funcionalidad, por otro lado,
puede ser extendida gracias a herramientas como nbconvert , encargada de gestionar
la conversi´on a formatos como LaTeX, PDF o presentaciones web basadas en Re-
veal.js, o ipywidgets que proporciona widgets interactivos dentro del documento. Su
desarrollo ha sido patrocinado por compa˜n´ıas como Micro- soft o Google as´ı como
impulsado por el proyecto de infraestructura europea Horizonte 2020 denominado
OpenDreamKit. Su uso en entornos docentes ha crecido en popularidad debido a
su gran flexibilidad, f´acil acceso a trav´es del navegador y las posibilidades a˜nadidas
de separar el propio documento del n´ucleo de c´alculo en el lenguaje escogido. Esta
arquitectura permite abandonar la instalaci´on local. El profesor puede hacer uso
de un servidor externo (o su propio ordenador) para proporcionar a los estudiantes
lecciones, presentaciones, o tareas interactivas. Esta caracter´ıstica permite eliminar
una de las grandes barreras de acceso que se presentan al incluir un nuevo tipo de
documento o programa, como es su instalaci´on en el equipo personal del estudiante.
Utilizando este tipo de documentos se pueden generar lecciones o material de apoyo
al estudio individual ricos en contenido, as´ı como material de trabajo colaborativo
que incluya elementos de c´alculo num´erico. Dado que resulta inevitable que un estu-
diante del ´area de ciencias necesite trabajar con alg´un tipo de programa de c´alculo a
2 Introducci´on
lo largo de su carrera universitaria as´ı como en su futuro laboral, la inclusi´on de este
tipo de elementos permite al alumno comenzar a familiarizarse con ellos, adquirien-
do por tanto una competencia transversal de gran valor para su formaci´on. Adem´as,
proporciona otro nivel m´as de profundizaci´on en los contenidos de la asignatura, que
podr´a ser explorado por aquellos estudiantes con una mayor motivaci´on, aunque no
se requiera para el desarrollo normal del curso.
A lo largo del presente manual veremos las caracter´ısticas generales de la interfaz
Jupyter Notebook, su instalaci´on y uso para proporcionar lecciones y ejercicios ´utiles
en estudios cient´ıficos. A su vez, se describir´an varias opciones para proporcionar
un servidor de este tipo de documentos accesible por los estudiantes a trav´es del
ordenador, as´ı como a˜nadidos espec´ıficos para docencia como es la gesti´on de un
curso ´ıntegramente realizado en Jupyter Notebooks.
Jupyter Notebook
Jupyter Notebook es una interfaz web de c´odigo abierto que permite la inclusi´on de
texto, v´ıdeo, audio, im´agenes as´ı como la ejecuci´on de c´odigo a trav´es del navegador
en m´ultiples lenguajes. Esta ejecuci´on se realiza mediante la comunicaci´on con un
n´ucleo (Kernel) de c´alculo. Aunque en principio, el equipo de desarrollo de Jupyter
Notebook incluye por defecto ´unicamente el n´ucleo de c´alculo Python, el car´acter
abierto del proyecto ha permitido aumentar el n´umero de n´ucleos disponibles [1],
incluyendo, por ejemplo Octave, Julia, R, Haskell, Ruby, C/C++, Fortran, Java,
SageMath, Scala, o tambi´en Matlab y Mathematica. Esta interfaz, agn´ostica del
lenguaje (de ah´ı su nombre al unir 3 de los lenguajes de programaci´on de c´odigo
abierto m´as utilizados en el ´ambito cient´ıfico: Ju-lia, Py-thon y R), puede suponer
por tanto una estandarizaci´on para mostrar el contenido de cursos cient´ıficos, sin
encontrarse limitado a la adopci´on de un ´unico lenguaje.
Esta versatilidad ha permitido una adopci´on creciente tanto en el ´ambito docen-
te como investigador. En este ´ultimo campo, la inclusi´on de Jupyter Notebooks con
alculos, datos y figuras adicionales a art´ıculos aparecen cada vez m´as en las revistas
cient´ıficas. Por ejemplo, los datos y c´alculos facilitados en este formato por el equipo
de LIGO, dedicado al descubrimiento de las ondas gravitacionales. En lo referente
a su uso docente cabe destacar el curso AeroPython de la Universidad George Wa-
shington e impartido por la profesora Lorena Barba enteramente utilizando Jupyter
Notebooks.
4 Jupyter Notebook
Or´ıgenes
Jupyter Notebook nace como una evoluci´on de la interfaz Ipython Notebook, b´asi-
camente con las mismas funcionalidades pero a˜nadiendo la posibilidad de ejecutar
odigo en m´ultiples lenguajes. Por otro lado, la interfaz web, com´un tanto a Jupyter
Notebook como a Ipython Notebook, supone el desarrollo en software libre de un
“cuaderno computacional” al mismo estilo que los cuadernos empleados en el progra-
ma Mathematica o en Maple y cuyo primer intento fue realizado por William Stein
para el programa de c´alculo Sage (Sage Notebooks). Para este desarrollo, llevado a
cabo por Fernando P´erez y Robert Kern, en la Universidad de Berkeley (California,
EEUU), se basaron en principio en el lenguaje de programaci´on Python, dada su
gran versatilidad, amplia adopci´on por la comunidad cient´ıfica y su car´acter libre.
Aunque en un principio el desarrollo no se centr´o en una interfaz web, sino en propor-
cionar un int´erprete de comandos interactivo para el lenguaje Python (denominado
IPython), a partir de 2010 el trabajo del equipo de desarrollo de IPython permite
la aparici´on de la interfaz Jupyter Notebook.
Desde entonces, el desarrollo de estos “cuadernos computacionales”, as´ı como su
uso, no ha parado de crecer. Por ejemplo, la plataforma de desarrollo de proyectos
libres m´as importante actualmente, GitHub, permite la visualizaci´on de Jupyter
Notebooks directamente en su p´agina web, alojando m´as de un mill´on de este tipo
de documentos, de libre acceso, en sus servidores.
Descripci´on de la interfaz
Al ejecutar Jupyter Notebook en el ordenador, aparecer´a, en nuestro navegador una
primera p´agina denominada Jupyter Dashboard. En ella podremos ver la lista de
archivos disponibles en la carpeta en donde hayamos ejecutado nuestro programa.
Adem´as, en caso de tener instalados a˜nadidos (extensiones) a nuestro Jupyter No-
tebook, como por ejemplo el gestor de cursos y correcci´on autom´atica Nbgrader,
tambi´en nos aparecer´a en esta p´agina de acceso. Otro elemento importante es el
bot´on, en la esquina superior derecha, para subir archivos al servidor. En caso de
5
ejecutarse Jupyter Notebook localmente, este bot´on no presenta una gran funcionali-
dad, pero s´ı para el caso en que accedamos a estos documentos desde otro ordenador
y a trav´es del navegador.
Para generar un primer Jupyter Notebook, pincharemos en New y elegiremos el
n´ucleo de c´alculo entre aquellos que tengamos instalados. Por defecto ´unicamente
tendremos Python. Un ejemplo de un documento tipo Jupyter Notebook puede
visualizarse en la Figura 1.
Figura 1. Ejemplo de un documento Jupyter Notebook.
En la parte superior del documento disponemos de los distintos men´us para
controlar tanto la edici´on, como para descargar el documento en varios formatos (por
ejemplo, PDF) as´ı como insertar o borrar partes del documento. Tambi´en incluye
la elecci´on y el control del n´ucleo de c´alculo (pudiendo pararlo si as´ı se desea) y un
bot´on de ayuda que cubre gran parte de las caracter´ısticas de Jupyter Notebook.
El documento en s´ı se divide en distintas celdas, el comportamiento de las cua-
les puede seleccionarse entre distintas opciones: t´ıtulo (de diversos tama˜nos), texto
(plano o enriquecido utilizando el lenguaje Markdown) o c´odigo. Aparte de estas op-
ciones, las librer´ıas espec´ıficas permiten importar im´agenes o v´ıdeos, incluir enlaces
a recursos web o incluso incrustar una p´agina web completa dentro del documento.
Para insertar texto con formato, la opci´on elegida por Jupyter Notebook es
utilizar el lenguaje Markdown. De este modo, por ejemplo, se pueden incluir listas,
texto en negrita o cursiva, tablas o im´agenes. La cantidad de tutoriales en la red
sobre este lenguaje es inmenso por lo que nos centraremos en indicar c´omo se utiliza
6 Jupyter Notebook
para las opciones de formato m´as utilizadas:
Texto en negrita/cursiva: El texto en negrita se indica entre dos pares de
asteriscos. De este modo **palabra** aparecer´a como palabra. Por otro lado,
el texto en cursiva se indica entre dos asteriscos simples, es decir *palabra*
aparecer´a como palabra.
Listas: Las listas en Markdown se realizan indicando un asterisco o un n´ume-
ro seguido de un punto si se desean listas numeradas. Markdown organiza
autom´aticamente los items asign´andoles el n´umero correcto.
Inclusi´on de im´agenes: La sintaxis para incluir im´agenes en Markdown es
![nombre alternativo](direcci´on de la imagen) en donde el nombre al-
ternativo aparecer´a en caso de que no se pueda cargar la im´agen y la direcci´on
puede referirse a una imagen local o un enlace en Internet.
Inclusi´on de c´odigo HTML: El lenguaje Markdown es un subconjunto del len-
guaje HTML y en donde se necesite un mayor control del formato, se puede
incluir directamente en HTML.
Enlaces: Las celdas de texto pueden contener enlaces, tanto a otras partes del
documento, como a p´aginas en internet u otros archivos locales. Su sintaxis es
[texto](direcci´on del enlace).
ormulas matem´aticas: Gracias al uso de MathJax, se puede incluir c´odigo
en LaTeX para mostrar todo tipo de f´ormulas y expresiones matem´aticas.
Las f´ormulas dentro de una l´ınea de texto se escriben entre s´ımbolos de dolar
($...$) mientras que las expresiones separadas del texto utilizan s´ımbolos de
dolar dobles ($$...$$).
Estas posibilidades permiten utilizar las celdas de texto de manera vers´atil docu-
mentando el c´odigo de otras celdas o, por ejemplo, explicando detalladamente alg´un
concepto te´orico, del que despu´es se puede presentar un ejercicio.
La creaci´on de una nueva celda provoca la aparici´on autom´atica de una celda
de c´odigo. El lenguaje que se utiliza viene determinado por la elecci´on del n´ucleo
7
para todo el documento. Actualmente, mezclar dos lenguajes de programaci´on en el
mismo documento no est´a soportado.
Instalaci´on
Uno de los requisitos que el sistema donde se instale Jupyter Notebook ha de po-
seer es disponer de Python. Aunque los documentos permiten la ejecuci´on en otros
lenguajes de programaci´on, algunas de las funciones de Jupyter Notebook est´an im-
plementadas en este lenguaje. Dada su enorme popularidad en el ´ambito cient´ıfico,
suites de c´alculo cient´ıfico ofreciendo gran cantidad de m´odulos de Python han apa-
recido en los ´ultimos a˜nos. Dentro de ellas, quiz´as la m´as conocida es Anaconda, de
la empresa Continuum Analytics. Este pack de m´odulos de Python dispone a su vez
de un gestor de paquetes y ha facilitado enormemente la instalaci´on y gesti´on de
librer´ıas de Python relacionadas con aplicaciones cient´ıficas.
Uno de los m´odulos por defecto que Anaconda instala es Jupyter Notebook por
lo que la instalaci´on recomendada, independientemente del sistema operativo, es
instalar dicha distribuci´on de Python cient´ıfico. Para ello, la p´agina de descarga de
Anaconda [2] permite obtener gratuitamente este producto. Siguiendo los pasos de
instalaci´on, podemos tener disponible Jupyter Notebook, el cual podemos ejecutar
escribiendo jupyter notebook en una consola.
Plataformas online para su uso sin instalaci´on
Aunque la instalaci´on de Jupyter Notebook se ha simplificado enormemente en los
´ultimos a˜nos, una de las caracter´ısticas esenciales en su uso docente es la separaci´on
de esta interfaz del n´ucleo de c´alculo, lo cual hace que el estudiante pueda consultar,
mediante un navegador, los documentos interactivos en este formato que se ejecutan
en otro ordenador, bien sea el del profesor o un servidor facilitado por un servicio en
la nube. A continuaci´on se enumeran algunas de estas alternativas. Nos centraremos
en aquellas que no se restrinjan a mostrar una versi´on est´atica del documento, sino
que permitan la ejecuci´on de c´odigo en ellos. Ejemplos del primer caso, podr´ıan ser
8 Jupyter Notebook
GitHub [3] o NbViewer [4].
1. CoCalc: Este entorno de computaci´on online [5] proporciona varias herra-
mientas ´unicas destinadas a un uso docente: permite la edici´on colaborativa de
documentos Jupyter Notebook, lo que multiplica las posibilidades para realizar
trabajos en grupo y dispone de un gestor de cursos y tareas, lo que simplifica
la tarea del profesor para proporcionar tanto material de apoyo, como para
calificar tareas y distribuir una retroalimentaci´on a los estudiantes. Adem´as, es
gratuito y por tanto los estudiantes siguen manteniendo su cuenta al finalizar
el curso, lo que permite el acceso a las simulaciones y explicaciones que pue-
den resultar de utilidad en otras asignaturas de cursos posteriores. Tambi´en
dispone de paquetes de cursos de pago en donde se ofrece acceso a servidores
as estables que en las cuentas gratuitas y m´as recursos computacionales.
2. Gryd: Este servicio [6] ofrece cuentas gratuitas para estudiantes as´ı como un
paquete acad´emico para la gesti´on de cursos utilizando nbgrader, aunque su
precio no se encuentra publicado actualmente.
3. Google Colab: Aunque actualmente su acceso se encuentra restringido [7]
Google Colab proporciona un servidor de Jupyter Notebooks donde se incluye
la opci´on de editar colaborativamente un mismo documento, al estilo de Google
Documents. Esta funcionalidad lo hace especialmente atractivo como servicio
destinado a trabajos en grupo durante el desarrollo de un curso universitario.
4. MyBinder: Este servicio [8] permite la creaci´on de un servidor temporal pa-
ra ejecutar los documentos Jupyter Notebooks alojados en un repositorio en
GitHub. Es completamente gratuito.
5. JupyterHub: M´as que un servicio online, JupyterHub es una de herramienta
as dentro del ecosistema Jupyter, enfocado a proporcionar un servidor multi-
usuario para poder ser utilizado en clase o por un equipo de investigaci´on, por
ejemplo. Sobre esta herramienta dedicamos un cap´ıtulo aparte en este mismo
manual por lo que su discusi´on se pospone a ese punto.
9
Exportar a otros formatos
Aunque los documentos generados por Jupyter Notebook son f´acilmente ac-
cesibles a trav´es de un navegador, en ocasiones es necesario o ´util disponer
de otros formatos, por ejemplo, utilizar un archivo Python ejecutable. Con
el fin de facilitar la conversi´on de los notebooks, Jupyter dispone desde la
versi´on 1.0 (versi´on actual a d´ıa de hoy) de la herramienta nbconvert, que
permite exportar los documentos hechos en Jupyter Notebook a otros for-
matos. Concretamente, la herramienta incluida en la instalaci´on de Jupyter
Notebook denominada nbconvert proporciona la conversi´on a documentos
est´aticos (es decir, las celdas no pueden ejecutarse), en formato HTML, La-
TeX, Markdown, reStructuredText, script de Python ejecutable y, finalmente,
en formato presentaci´on. El uso de esta herramienta requiere la instalaci´on
de un nuevo paquete denominado Pandoc, que puede instalarse a trav´es del
gestor de paquetes de las distintas distribuciones Linux o bien, a trav´es de su
agina web [9].
El funcionamiento de esta herramienta puede realizarse mediante una terminal
o consola, o bien directamente desde el documento, a trav´es del men´u File
->Download as..., aunque para explotar todas sus capacidades indicamos a
continuaci´on la sintaxis para su uso en una terminal. Esta es,
$jupyter nbconvert --to FORMAT notebook.ipynb
donde FORMAT es el formato que se desea obtener. Por ejemplo, si queremos
convertir nuestro documento a un archivo en LaTeX, escribir´ıamos:
$jupyter nbconvert --to latex notebook.ipynb
Una vez generado el archivo .tex podemos convertirlo a pdf mediante, por
ejemplo, pdflatex o cualquier editor de LaTeX. Si queremos realizar realizar
la conversi´on a formato pdf directamente, podemos a˜nadirlo a la anterior ins-
trucci´on, quedando,
$jupyter nbconvert --to latex notebook.ipynb --post PDF
10 Jupyter Notebook
Tambi´en es posible modificar las plantillas de nuestro archivo LaTeX generado
a formato libro por ejemplo a˜nadiendo --template book. Es necesario hacer
notar que el formato presentaci´on no genera un archivo PowerPoint o similar,
sino una presentaci´on Reveal.js en HTML, que requiere para su visualizaci´on
que el ordenador muestre la presentaci´on en el navegador. Este requisito se
cumple si a˜nadimos a la l´ınea anterior la opci´on --post serve. Este tipo
de presentaciones, aunque m´as dif´ıciles de mostrar por la necesidad de que
el ordenador act´ue como servidor de esa p´agina en HTML, dan un mayor
n´umero de opciones que las presentaciones tradicionales y son m´as sencillas de
compartir a trav´es de diferentes sistemas operativos y plataformas.
Para m´as informaci´on, se pueden consultar los siguientes enlaces [10, 11].
Recursos en la red
La cantidad de recursos en la red dedicada a Jupyter Notebooks no para de crecer y
de modificarse con el tiempo. Es por ello que la siguiente lista ha de tomarse como
una muestra, para nada completa, y v´alida ´unicamente en las fechas en las que se
ha generado este documento. Sin embargo, y dada la importancia de los sitios web
a los que se refieren los siguientes enlaces, es esperable que, aunque nuevos sitios de
referencia puedan surgir, los resaltados a continuaci´on puedan seguir siendo recursos
´utiles en el futuro.
1. Documentaci´on de Jupyter Notebook [12]
2. Subforo en Reddit dedicado a Jupyter Notebooks [13]
3. Galer´ıa con una selecci´on de Jupyter Notebooks [14]
4. agina de desarrollo de CoCalc [15]
Dado que el lenguaje principal de los documentos mostrados en el Anexo ha sido
Python, a continuaci´on se muestran algunas de sus caracter´ısticas, especialmente
comparando con otros programas de c´alculo como Matlab, tambi´en ampliamente
utilizado en los estudios universitarios de car´acter cient´ıfico.
Python
Among the different alternatives for open source software devoted to computational
programming, Python has become one of the most used options. Thus, learning this
programming language can be very beneficial for students in their future careers.
Moreover, there is a vast amount of scientific modules that are easily imported,
matching the capabilities of Python to those of commercial software.
The most relevant libraries in the scientific environment are:
SciPy: it groups together many relevant functions for numerical calculations.
NumPy: it provides specific functions for vector and matrix calculations.
SymPy: it encompasses all necessary functions for symbolic calculations.
Matplotlib: it contains tools for 2D and 3D plots (similar to those in MATLAB).
Mayavi: specific library for 3D plots.
Pandas: specific library for data management and analysis.
Apart from these, there are numerous libraries designes for specific needs, such
as image processing (openCV), machine learning (scikit-learn) and many more.
Most common commands
We will now enumerate the most common commands in Python to perform scientific
operations in Jupyter Notebook using Pythonaas the computational kernel.
aNotice that we will consider Python 3 as the computational kernel. There are not many diffe-
rences with Python 2, except for some syntax subtleties, an example of which corresponds to the
12 Python
Library management
Import all functions within a library: taking the NumPy library as
an example, we would have to write in our document
from numpy import *
There are functions appearing in two different libraries which act diffe-
rently. Hence, it is sometimes useful to import a library with a distinctive
prefix. Moreover, specially when writing Python scripts, it is good prac-
tice to include this prefix for a future reading of the script and to fix
possibly appearing bugs. It is common to choose the prefix np for the
NumPy library. This is accomplished by
import numpy as np
Import a specific function: sometimes we just want to import a fun-
ction from a library, instead of the whole library. As an example, let us
consider importing the cosine function from the NumPy library. In this
case, we would write
from numpy import cos
– Advice for educational applications: in general, for scientific sub-
jects, the easiest thing to do would be to use the PyLab environment.
Once executed, this environment automatically imports the most used
functions and allows to write code in a very similar way to MATLAB.
Moreover, in order for the plots to appear in the notebook instead of
in a different tab, it is necessary to include the inline command. Both
aspects are taken care of by writing at the beginning of the file
%pylab inline b
print command.
bAnother alternative would be to write the following three lines at the beginning of any docu-
ment:
from numpy import *
from matplotlib.pyplot import *
%matplotlib inline
13
Commands for numerical calculations:
– Help: we can retrieve more information from a specific function by typing
help(function) or function?
Printing on screen: in order to display text or the value of a variable,
x, when executing a cell, we would write
print(’Variable x has the value’)
print(x)
Inserting an image: this is done by importing the function Image. Its
syntax isc
from IPython.display import Image
Image(filename=TestFigure)
As an alternative, an image can also be included directly in a Markdown
cell by using Markdown’s syntax, or even with HTML for further custo-
mization options, such as changing the size or position of the image in a
cell. In order to include an image in a Markdown cell we would type the
following:
![Alternative Text](files/Test Figure)
Alternative Text in the previous command refers to a text that would
be shown in case the image could not be loaded. The text in parenthesis
corresponds to the directory of the image, which can also be a webpage. If
we want to include an image that is in the same directory as the notebook
is, we have to include the directory after files/.
Embed a webpage: Jupyter Notebook allows to embed a webpage wit-
hin the notebook, indicating the width and height of the frame containing
it. In order to do so, we must include the HTML function. An example
would be:
from IPython.display import HTML
cIn this case, the image is considered to be in the same directory as the notebook is, but it is
also possible to insert an image from the Internet.
14 Python
HTML(’<iframe
src=http://www.wikipedia.org width=800px height=400px >’)
Embed a YouTube video: embeding videos allows to broaden the spec-
trum of educational possibilities. Among the different alternatives, You-
Tube hosts an enormous amount of scientific videos. In order to display
one of them, we would need to use the video ID assigned by YouTube to
each that specific video:
from IPython.display import Youtube
Youtube(videoID)
– Loop: we will consider the most common loop, the for loop. For instance,
if we want to print the numbers from 1 to 10 on the screen, we would
write
for j in range(1,10):
print(j)
– Conditionals: we will consider the three most general cases. The sim-
plest conditional is usually written with the if command, as is shown in
the following example,
if j>0:
print(’The variable’, j, ’is positive’)
For a conditional including two cases, we would use if . . . else . . . as
follows
if j>0:
print(’Variable’, j, ’is positive’)
else:
print(’Variable’, j, ’is negative or zero’)
Finally, the while command, which is used in conditionals within loops,
will be used in the following way
j=-5
while j<0:
15
print(’Variable’, j, ’is still negative’)
j++
Defining functions: specific functions can be defined by means of the
def command. For instance, if we want to define the step function we
would do
def fun(x):
if(x>0):
return 1
else:
return 0
Vectors and matrices: there are different alternatives to create vectors
and matrices. Here we will only consider a few examples. In order to create
a vector of numbers with a fixed number of elements, say, a 100, with
values within an initial and a final value, say, 0 and a 10, the linspace
function is very useful, and in our example would be used as follows,
x=linspace(0,10,100)
If instead of the number of elements, we wish to specify the step between
different elements of the vector, the function to use is arange. For ins-
tance, if we want to generate a vector from 0 to 10 with a step of 1, we
would write:
arange(0,11,1)
Notice that the second element of arange has to be the final value of our
desired range plus the step.
Other useful functions to generate m×nmatrices are the following:
If all elements are equal to zero:
zeros((m,n))
If all elements are equal to one:
ones((m,n))
If all elements do not have an initially predetermined value:
16 Python
empty((m,n))
– Plots: a basic plot would be that of the cosine function. This can be
achieved by using the following sequence of commands:
x=linspace(0,10,100)
y=cos(x)
plot(x,y)
xlabel(’X’)
ylabel(’Y’)
title(’PlotTest’)
The last three lines define the X-axis, Y-axis and plot titles, respectively.
As it can be seen in the previous examples, in Jupyter Notebook it is not
necessary to separate each line of code by any punctuation mark. However,
it is very important to respect the indentation style. This characteristic eases
legibility and cleanness of the code, which can be helpful for the students.
Finally, each cell can be executed using the combination of keys Shift + Enter
or clicking the play button that appears in the notebook.
Converting code from a different language to Pyt-
hon
It is possible to execute code written in different programming languages using
a specific kernel to those languages. However, the ever-increasing applicability of
Python to the scientific environment, as well as the vast collection of libraries that
are created continuously, make this language an excellent choice of open source
software for general purposes. For this reason, we will now analyze how to convert
code from a different language to Python, focusing on the most used languages:
MATLAB/Octave, Mathematica and C/C++.
MATLAB/Octave. MATLAB is one of the most used programming softwa-
res due to its power and flexibility, as well as to it being easy to learn.
17
In Table 1 we provide some of the most common commands in MATLAB and
their equivalent in Python, using NumPy or SciPy. More information can be
found at [16].
Operations MATLAB NumPy/SciPy
First element of the array a a(1) a[0]
Last element of the array a a(end) a[-1]
Elementwise multiplication of two arrays aand b a.*b a*b
Size of a matrix A size(A) shape(A)
Find indices where a > 2 find(a>2) nonzero(a>2)
Maximum of a matrix A max(max(A)) A.max()
Generate a vector with elements from 0 to 5 0:5 arange(6)
Generate a 3×3 zero matrix zeros(3,3) zeros((3,3))
ato the power 4 a^4 a**4
Fourier transform of a fft(a) fft.fft(a)
Tabla 1. Equivalence of MATLAB y NumPy/SciPy commands.
Mathematica. Mathematica is primarily a symbolic calculation software, alt-
hough its newest versions have increased the number of numerical calculation
capabilities. Probably, the most similar module in Python would be SymPy,
which enables to perform this kind of symbolic operations very easily. Even
though its power and library is not at the same level of Mathematica, it is more
than enough for educational purposes, as well as for most scientific needs. On
the other hand, its constant development guarantees continuous improvements
in the future. Another more powerful alternative is SageMath, which allows to
use various open software alternatives, such as Maxima, SymPy, NumPy, etc.
using a unified syntax. However, SageMath is out of the Python ecosystem so
it will not be considered here.
In Table 2 we provide a list with some equivalences between Mathematica and
SymPy. More Information can be found at [17].
18 Python
Operations Mathematica SymPy
Definition of a symbol Not needed x=Symbol(’x’)
Fraction decomposition Apart[expr] apart(expr,x)
Fraction combination Together[expr] together(expr,x)
Evaluate an expression N[] N()/evalf()
Limit of a function Limit[expr,x->x0] limit(expr,x,x0)
Differentiation D[expr,var] diff(expr,var)
Power Series expansion Series[f,{x,x0,n}] f.series(x,x0,n)
Indefinite integral Integrate[f,x] integrate(f,x)
Definite integral Integrate[f,{x,a,b}] integrate(f,(x,a,b))
Algebraic equation solver Solve[expr,x] solve(expr,x)
Tabla 2. Command equivalences between Mathematica and SymPy.
C/C++.
C/C++, together with Fortran, is well-known for being extremely fast, espe-
cially in executing loops. Since Python is an interpreted language, execution is
slower than in a compiled language such as C. In turn, legibility and easiness
for programming is obtained, which saves time both for developing code and
for fixing bugs. More importantly, from an educational viewpoint, it is much
simpler to learn that with C/C++ or Fortran, which limits the use of the lat-
ter for generating simple codes to support the explanations of other concepts.
However, the fact that C is faster than Python has led to the development of
some alternatives to use C in Python. Below we describe two of them:
– Weave: it is part of the SciPy module and allows to write C or C++ code
directly within a Python program. In order to use it, a C/C++ compiler
must be installed beforehand, apart from Python. Weave can be used in
two ways: with the inline function or with the blitz function. In the
first case, C/C++ code is written directly as a chain of characters (wit-
hin quotation marks) inside the function inline(). The first time the
19
program is executed, Weave takes care of compiling that code (calling
the previously installed compiler) and it will generate a library which
in successive executions will not need to be compiled anymore, substan-
tially reducing executing time. On the other hand, blitz() transforms
expressions from NumPy to C/C++ code, performing that exact same
function, but in a much faster way. In this case, the main advantage is
that the user needs not know how to program in C/C++, but only how
to use the expressions from the NumPy module.
– Cython: during the last years, Cython has gained popularity and it
is a very flexible solution to save time executing Python programs. In
contrast to Weave, Cython is a programming language itself, based on
Python and encompassing it. It can execute Python code or modify it
including definition of variables with type declaration, which allows to
fasten execution. Using Cython requires a much more advance knowledge
than that described in this Guide, so it will not be considered in detail
here. More information can be found at [18].
Gesti´on de cursos
Jupyter Notebook permite generar documentos interactivos para el alumno que le
ayuden a explorar y profundizar en los distintos aspectos tratados en una asignatura
de ´ambito cient´ıfico. En este sentido, suponen una herramienta muy ´util de apoyo
para el trabajo individual del estudiante y una ayuda para el profesor para extender
las explicaciones en clase a otros niveles. Sin embargo, la gesti´on de un curso basado
totalmente o parcialmente parte en este tipo de documentos obliga a disponer de un
servidor capaz de ofrecer el acceso a estos cuadernos interactivos. Adem´as, si inclui-
mos ejercicios en este formato, requeriremos de alguna herramienta para corregirlos
y para distribuir dicha correcci´on entre todos los estudiantes.
En este cap´ıtulo abordamos dos posibilidades para la gesti´on de un curso utili-
zando Jupyter Notebooks. En primer lugar, un servicio externo, con la gran ventaja
de disponer de una plataforma con nulo trabajo para ser puesta en marcha. En
segundo lugar, una soluci´on local, en la que el profesor configura ese servidor de
Jupyter Notebooks. La ventaja en ese ´ultimo caso es el control completo de todo el
proceso por parte del profesor, aunque con el coste de una mayor complejidad para
su configuraci´on.
CoCalc
Cocalc [5] , anteriormente conocido como SageMathCloud, proporciona una plata-
forma completa de trabajo en la nube para la computaci´on cient´ıfica. Dentro de sus
caracter´ısticas, destaca, adem´as de poder ejecutar Jupyter Notebooks, disponer de
una terminal completa (Linux), un editor de texto, editor de LaTeX con previsua-
22 Gesti´on de cursos
lizaci´on instananea, gestor de tareas y un completo gestor de cursos. El software
instalado, todo ello basado en herramientas libres, es muy amplio, cubriendo multi-
tud de lenguajes de programaci´on, pudiendo extenderse f´acilmente instalando en el
espacio del usuario otros programas en Linux.
El espacio personal en CoCalc se organiza en diferentes proyectos, cada uno de
los cuales con sus archivos, los cuales pueden ser generados en la propia plataforma
o bien subidos desde el ordenador del usuario. Por otro lado, tambi´en dispone de
tutoriales de distntos aspectos tanto de uso de la plataforma, como de programaci´on
en distintos lenguajes.
En lo referente a la gesti´on de cursos, el profesor puede a˜nadir estudiantes por su
direcci´on de correo, asignar tareas copiando autom´aticamente a todos los integrantes
del curso una carpeta determinada, llevar un registro de la correcci´on de dichas tareas
y devolver una copia corregida a todos los estudiantes pulsando un ´unico bot´on. Por
otro lado, su acceso es gratuito, ofreciendo un espacio de 3GB para estas cuentas,
aunque existen paquetes de cursos para distinto n´umero de alumnos con un cierto
coste, comenzando por 199$para 25 estudiantes d. Estos paquetes ofrecen acceso
reservado a recursos computacionales logrando por tanto una mejor experiencia de
uso.
Otra de las caracter´ısticas m´as ´utiles de CoCalc desde el punto de vista docente
es que permite la edici´on colaborativa simult´anea de los documentos Jupyter No-
tebook al estilo de Google Documents, gracias a una versi´on propia de la interfaz
web de Jupyter Notebook. Este a˜nadido, no presente en la versi´on por defecto de
Jupyter Notebook, facilita en´ormemente el trabajo en grupo sobre una tarea, y se
complementa con un chat integrado en la propia plataforma.
Todas estas opciones hacen de CoCalc una soluci´on completa y sencilla de
usar para la integraci´on de Jupyter Notebooks en un curso acad´emico. Adem´as,
su car´acter completamente libre ha propiciado la aparici´on de una versi´on local de
la plataforma completa, pudiendo ser instalada en un ordenador cualquiera. Esta
versi´on local, a modo de imagen Docker, puede ser descargada desde su p´agina de
desarrollo en GitHub [19] y permite, si se dispone de un ordenador suficientemente
dOfrecido por CoCalc a fecha de Abril de 2018
23
potente, utilizar recursos propios para la impartici´on de un curso basado en Jupyter
Notebooks.
JupyterHub
JupyterHub es una de las herramientas ofrecidas por el proyecto Jupyter, y consiste
en un servidor multiusuario cada uno de los cuales accede a su propio Dashboard
y gestiona sus propios Jupyter Notebooks. M´as detalladamente, JupyterHub se en-
carga de presentar una p´agina de identificaci´on a quien accede con el navegador a
la p´agina del servicio, gestiona la identificaci´on del usuario y una vez el acceso ha
sido permitido, presenta un servidor de notebooks espec´ıfico para ese usuario, donde
puede copiar desde su ordenador cualquier tipo de archivo, descargarlos, crear nue-
vos Jupyter Notebooks y, por supuesto, trabajar con ellos. Tambi´en permite abrir
una terminal del sistema y, en el caso de tener instaladas extensiones, activarlas
y desactivarlas o hacer uso de sus funcionalidades. En este sentido, y dentro del
contexto de gesti´on de un curso acad´emico, cabe destacar la extensi´on denominada
Nbgrader la cual permite a un profesor crear, gestionar y evaluar ejercicios para los
estudiantes (o en el caso en que sea un estudiante quien acceda, trabajar con las
tareas pendientes y enviarlas al profesor).
Por ello JupyterHub posee un gran potencial para su uso docente, al facilitar
un servidor de notebooks para cada uno de los estudiantes de un curso, y en donde
el profesor tiene el control absoluto del software instalado y puede monitorizar el
acceso de cada estudiante.
La instalaci´on y configuraci´on de JupyterHub no es dif´ıcil, pero es necesario tener
en cuenta algunas consideraciones:
Acceso externo: Evidentemente, si JupyterHub se utiliza para poner a disposi-
ci´on de los estudiantes material de un curso, es necesario que se pueda acceder
desde el exterior para facilitar el trabajo fuera de clase. Este acceso hace ne-
cesaria cierta seguridad para proteger las contrase˜nas de los estudiantes, como
es configurar que JupyterHub utilice una conexi´on segura mediante el uso del
protocolo https.
24 Gesti´on de cursos
Docker : Cada estudiante o usuario accede a un servidor propio en donde se
dispone de una terminal completa, ejecut´andose en el ordenador elegido por
el profesor. Esta terminal puede suponer un riesgo de seguridad importante
en caso de no poner l´ımites a su funcionamiento. No solo eso, la ejecuci´on
de comandos del sistema puede ser llevada a cabo a su vez desde un Jupyter
Notebook. Es por ello que, especialmente cuando el servidor es utilizado por
parte del profesor para otras tareas, se hace necesario encapsular de alg´un
modo el funcionamiento de JupyterHub del resto del sistema.
Afortunadamente, realizar este proceso es relativamente sencillo gracias a Doc-
ker, el cual proporciona contenedores, con un consumo bajo de recursos, ca-
paces de aislar del resto del sistema aplicaciones individuales. El equipo del
proyecto Jupyter tiene disponible para su descarga y ejecuci´on directa uno
de estos contenedores docker (denominada imagen) para JupyterHub [20] as´ı
como un tutorial con todos los pasos para configurarlo.
Escalamiento: El uso simult´aneo de diferentes Jupyter Notebooks por parte
de muchos alumnos puede imponer una gran carga de trabajo al servidor
elegido para desarrollar el curso. Es necesario por tanto realizar una estimaci´on
previa de dicha carga, en funci´on del n´umero de alumnos y de los c´alculos que
requieran las tareas propuestas por parte del profesor. Como referencia, los
autores de este manual han desarrollado sin problemas un curso con acceso
simult´aneo de 25 estudiantes a Jupyter Notebooks (sin requerir un manejo
masivo de datos) utilizando como servidor un ordenador con 8 n´ucleos y 16
GB de RAM donde se instal´o JupyterHub. Mayores necesidades impondr´ıan
el uso de ordenadores m´as potentes o bien de clusters.
JupyterHub proporciona por tanto la base para poder ofrecer a los estudiantes
un entorno unificado de acceso a Jupyter Notebooks a trav´es de su navegador, sin
requerir una instalaci´on local. Sin embargo, para gestionar un curso, es necesario
adem´as una herramienta para generar ejercicios, poderlos corregir y proporcionar
una retroalimentaci´on a los estudiantes. Esta herramienta es la extensi´on Nbgrader
que se describe a continuaci´on.
25
Nbgrader
Nbgrader es una extensi´on a Jupyter Notebook que gestiona la generaci´on, correc-
ci´on e intercambio de tareas entre el profesor y los estudiantes. Permite incluir tareas
tanto basadas en c´odigo (utilizando Python) como ejercicios con respuestas libres
de texto. Para ello dispone de dos herramientas: por un lado, incluye una barra de
opciones adicional a cada celda de Jupyter Notebook para elegir si dicha celda es
el enunciado de un ejercicio, si va a incluir la respuesta del estudiante, o bien si es
una celda de correcci´on con la posibilidad de incluir c´odigos que permitan la auto-
correcci´on de esos ejercicios. Por otro lado, genera una nueva pesta˜na denominada
Formgrader en la p´agina de acceso a Jupyter Notebook (Jupyter Dashboard) con
una doble funcionalidad. Para el profesor, permite la asignaci´on de tareas, validar los
tests en caso de disponer de celdas de autocorrecci´on, recoger los ejercicios enviados
por los estudiantes, corregirlos y distribuir las versiones corregidas de nuevo a los
alumnos. Para estas tareas, aparte de la interfaz web
Como se puede observar por las anteriores caracter´ısticas descritas, Nbgrader
cubre todo el proceso de gesti´on de de un curso. Para su instalaci´on, es recomenda-
ble de nuevo utilizar la distribuci´on de Python cient´ıfico Anaconda pues la exten-
si´on se instalar´a y se activar´a en un ´unico paso. Instalaciones manuales requerir´an
realizar la activaci´on posteriormente adem´as de la instalaci´on (vease la documen-
taci´on de Nbgrader en [21]. En el caso, de elegir Anaconda, su gestor de paquetes
de Python realiza todo el trabajo por nosotros con el comando conda install -c
conda-forge nbgrader.
Para comenzar a utilizar la extensi´on en un curso, pueden ser necesarias ciertas
instrucciones previas para su configuraci´on. Sin embargo, tambi´en es posible reali-
zar un comienzo autom´atico con el comando nbgrader quistart course id donde
course id es el nombre que queremos asignar a nuestro curso.
Propuestas Docentes
Consideraciones generales
Las Comisiones que han elaborado los protocolos del Nuevo Espacio Europeo de
Educaci´on Superior (EEES) destacan la importancia de la innovaci´on docente para
la mejora de las clases presenciales te´oricas y pr´acticas, complementadas con una
fuerte participaci´on en seminarios y ejercicios realizados fuera del aula. En particular,
el desarrollo de seminarios interactivos permite al alumno adquirir un conocimiento
te´orico a la vez que realiza actividades pr´acticas al respecto. En el ´area de ciencias es
importante, adem´as, dotar a los estudiantes de recursos de programaci´on para favo-
recer el aprendizaje de t´ecnicas num´ericas imprescindibles en problemas cient´ıficos
de alta complejidad, optimizando el tiempo que se emplea en la adquisici´on de co-
nocimientos y minimizado el empleado en los c´alculos que demuestran los aspectos
te´oricos fundamentales. En este marco, hemos propuesto Jupyter Notebook para
el dise˜no de seminarios interactivos, constituyendo una nueva herramienta docente
utilizable en el aula y puesta a disposici´on a trav´es del Campus Virtual. Destacamos
que en esta plataforma de c´alculo simolico y num´erico, las l´ıneas de texto explicati-
vo, las l´ıneas de comandos y la representaci´on gr´afica coexisten en el mismo entorno,
facilitando as´ı que los estudiantes puedan manejarlo a´un sin conocer en detalle todas
sus funcionalidades. El uso de estos seminarios puede realizarse a diferentes niveles
de profundidad seg´un las necesidades docentes y la motivaci´on del alumno.
El primer nivel consistir´a en el uso de las explicaciones, apoyadas con figuras
obtenidas de las simulaciones.
28 Propuestas Docentes
En un siguiente nivel se plantear´an ejercicios en los que el estudiante utilizar´a
las simulaciones como una caja negra, es decir, cambiando los par´ametros y
obteniendo los resultados sin conocer el m´etodo de c´alculo.
En el nivel m´as avanzado los estudiantes podr´an modificar los c´odigos para
ampliar las simulaciones mostradas, adquiriendo as´ı nuevas competencias en
el c´alculo num´erico.
Jupyter Notebook como herramienta docente, aunque puede ser de utilidad en
cualquier disciplina universitaria, es de especial relevancia en titulaciones de natura-
leza cient´ıfica, t´ecnica o relativas a ciencias de la salud, donde usualmente se requiere
una potente herramienta de c´alculo num´erico, simolico o estad´ıstico. Sin embargo,
no es menos importante destacar otra de las ventajas principales para la comunidad
universitaria, y es que establece una pasarela hacia el conocimiento de herramientas
de software libre, cuya filosof´ıa (y no solo por su menor coste econ´omico) conside-
ramos m´as af´ın a la ense˜nanza universitaria.
Nos gustar´ıa destacar que Jupyter Notebook no circunscribe su aplicaci´on ´uni-
camente a las tareas docentes. Los m´odulos y funciones que se utilizan son tambi´en
alidos para el desarrollo de programas m´as avanzados orientados a la investigaci´on,
pudiendo sustituir en gran parte el uso de otros programas comerciales de c´alculo
num´erico y simolico. As´ı pues, su aprendizaje resulta ´util para la adquisici´on de
competencias y capacidades para el ejercicio profesional futuro. En la web [22] se
puede encontrar informaci´on sobre la gran cantidad de proyectos cient´ıficos y docen-
tes que usan Python y la herramienta Jupyter Notebook para realizar y compartir
sus c´alculos. Entre ellos, cabe destacar el sistema Ganga, desarrollado en el CERN
para el control de trabajos en red de los experimentos en el LHC, o en aplicaciones
docentes como el curso de biolog´ıa computacional en la Universidad de Michigan
State, basado en Jupyter Notebook. Por todo esto, el aprendizaje de esta herra-
mienta y la base del lenguaje de programaci´on Python permite a los alumnos y
profesores interaccionar con otros proyectos cient´ıficos y docentes muy activos en
otras partes del mundo.
29
Beneficios para los estudiantes
Detallamos ahora los aspectos del apredizaje que son potenciados por los seminarios
interactivos desarrollados con Jupyter Notebook y los beneficios que este tipo de
seminarios conllevan para los estudiantes:
Favorecen el aprendizaje aut´onomo de los estudiantes a diferentes niveles de
complejidad seg´un los intereses y las necesidades de cada alumno.
Permiten un aprendizaje m´as atractivo, ya que estos seminarios digitales pue-
den incluir im´agenes y v´ıdeos de alta calidad y enlaces a otras webs de inter´es.
Facilitan el proceso activo de adquisici´on de competencias en el c´alculo num´eri-
co.
Promueven el aprendizaje de c´odigo de texto en formato LaTeX que se utiliza
para la elaboraci´on de documentos cient´ıficos de amplia difusi´on, incluso en
imprenta.
Promueven el conocimiento y aprendizaje de nuevos lenguajes de programa-
ci´on basados en software libre que no conllevan coste econ´omico y que utilizan
formatos est´andar. Es decir, pueden ser f´acilmente utilizados por otras perso-
nas y exportados con mayor facilidad.
Ofrecen nuevas posibilidades de uso del Campus Virtual, con el que los estu-
diantes est´an cada vez m´as familiarizados.
Permiten realizar tareas de evaluaci´on y autoevaluaci´on en remoto de una
forma m´as flexible y adecuada a las necesidades particulares de cada alumno.
Esto liberar´a parte del tiempo de clase presencial que podr´a ser usado para
ampliar las explicaciones del docente.
Facilitan su utilizaci´on por parte de un mayor n´umero de alumnos, ya que est´an
disponibles sin necesidad de instalar ning´un software comercial y se puede
acceder a ellos a trav´es de dispositivos electr´onicos m´as din´amicos, como los
tel´efonos inteligentes o tabletas.
30 Propuestas Docentes
Ejemplos de propuestas docentes
Recientemente hemos recolectado un dosier de los documentos docentes basados en
Jupyter Notebook elaborados en diferentes proyectos de innovaci´on educativa desa-
rrollados en la Universidad Complutense desde el a˜no 2012, visitar la web [23]. Estos
documentos desarrollan algunos de los conceptos m´as relevantes de las asignaturas
de ´
Optica F´ısica y ´
Optica Biom´edica impartidas en el Grado de ´
Optica y Optometr´ıa
de la Facultad de ´
Optica y Optometr´ıa, y de la asignatura de F´ısica de Estado S´oli-
do del Grado de F´ısica y del Grado de Ingenier´ıa de Materiales impartidos en la
Facultad de Ciencias F´ısicas, todos adscritos a la Universidad Complutense de Ma-
drid. Estos documentos, sin pretender cubrir todos los conceptos explicados en los
temas de referencia, presentan una peque˜na muestra de las capacidades de Jupyter
Notebook dentro de las tareas docentes. Adem´as no deber´ıan entenderse como do-
cumentos cerrados, sino, como cualquier material docente, en constante proceso de
actualizaci´on y mejora para futuros cursos.
Conclusiones
Tras la evaluaci´on del uso de documentos interactivos basados en la herramienta
Jupyter Notebook para aplicaciones docentes, hemos mostrado que esta platafor-
ma ofrece un entorno rico en contenidos que facilitan el aprendizaje, integrando de
manera natural simulaciones realizadas en Python. As´ı, el estudiante adquiere com-
petencias en c´alculo num´erico a la vez que profundiza en los conceptos explicados
en el aula. El acceso remoto y la ausencia de coste asociado a su licencia facilitan sin
lugar a dudas la implantaci´on de estas herramientas en los contenidos curriculares
de los Grados en Ciencias.
Los documentos interactivos se pueden utilizar como texto explicativo y ampliado
de los conceptos presentados en el aula, como ejercicio que eval´ue el profesor o como
ejercicio de autoevaluaci´on del alumno. Dependiendo de la respuesta del alumnado,
podr´ıa incluso involucrarse a los estudiantes en la elaboraci´on de apuntes din´amicos
(a la manera de una Wiki) que puedan ser mejoras en cursos sucesivos.
Bibliograf´ıa
[1] https://github.com/jupyter/jupyter/wiki/Jupyter-kernels
[2] https://www.anaconda.com/download/
[3] https://github.com
[4] https://jupyter.nbviewer.org
[5] https://cocalc.com
[6] https://gryd.us
[7] https://research.google.colab.com
[8] https://mybinder.org
[9] http://johnmacfarlane.net/pandoc/installing.html
[10] http://ipython.org/ipython-doc/stable/interactive/nbconvert.html#nbconvert
[11] http://www.slideviper.oquanta.info/tutorial/slideshow tutorial slides.html?transition=none#/6
[12] https://jupyter-notebook.readthedocs.io/en/stable/notebook.html
[13] https://www.reddit.com/r/JupyterNotebooks/
[14] https://github.com/jupyter/jupyter/wiki/A-gallery-of-interesting-Jupyter-Notebooks
[15] https://github.com/sagemathinc/cocalc
[16] http://wiki.scipy.org/NumPy for Matlab Users
34 References
[17] https://github.com/sympy/sympy/wiki/SymPy-vs.-Mathematica
[18] http://cython.org
[19] https://github.com/sagemathinc/cocalc-docker
[20] https://hub.docker.com/r/jupyterhub/jupyterhub/
[21] http://nbgrader.readthedocs.io/en/latest/user guide/installation.html
[22] https://wiki.python.org/moin/
[23] https://github.com/ecabreragranado/JupyterUCM

Navigation menu