Que l'on soit développeur ou data scientist, il y a toujours un moment où l’on a besoin de montrer ce que l’on a fait. La plupart du travail de programmation est partagé sous la forme de code source brut ou bien en tant qu’exécutable compilé. Le code source fournit une information complète mais sous une forme qui « dit » davantage qu’elle ne montre. Quant à l’éxécutable, il nous montre ce que fait le logiciel, mais même lorsqu'il est livré avec son code source, il peut être difficile de comprendre exactement comment il fonctionne. Imaginez être capable de voir le code et de l’exécuter dans la même interface utilisateur, de telle façon que vous puissiez modifier le code et voir les résultats de ces changements instantanément en temps réel ? C’est exactement ce que propose l'application web open source Jupyter Notebook.
Jupyter a été créé pour faciliter la présentation du travail de programmation d’un développeur et permettre à d’autres d’y participer. Il permet de mélanger du code, des commentaires et des visualisations dans un document interactif appelé notebook (ou cahier, si on souhaite le traduire en français) qui peut être partagé, réutilisé et retravaillé. Et comme Jupyter Notebook s’exécute dans un navigateur web, le « cahier » lui-même peut être hébergé au choix sur l’ordinateur du développeur ou sur un serveur distant.
Ci-dessus, un cahier Jupyter associant du texte, du code et un graphique. Si l’on modifie le code et qu’on le réexécute en direct dans le navigateur, la présentation s’en trouvera changée en conséquence et les nouveaux résultats pourront être enregistrés dans un nouveau cahier.
Les bénéfices de Jupyter Notebook
Développé à l’origine pour les applications de data science écrites en Python (la distribution Anaconda de Python est par exemple livrée avec), mais aussi en R et en Julia, Jupyter Notebook est intéressant à utiliser de différentes façons pour tout type de projets.
- La visualisation de données. La plupart du temps, on se familiarise avec le notebook Jupyter à travers une visualisation de données, un cahier partagé qui présente des données sous la forme d’un graphique. Jupyter permet de créer ces visualisations, de les partager et d’autoriser les changements interactifs sur le code partagé et les jeux de données.
- Le partage de code. Les services cloud tels que GitHub et Pastebin permettent de partager du code, mais ils ne sont guère interactifs. Avec un cahier Jupyter, on peut voir le code, l’exécuter et afficher les résultats directement dans son navigateur web.
- Les interactions en direct avec le code. Le code n’est pas statique dans Jupyter. Il peut être modifié et être ré-exécuté de façon incrémentale en direct avec le feedback fourni directement dans le navigateur. Les cahiers Jupyter peuvent aussi embarquer des contrôles utilisateurs (par exemple des champs pour entrer du texte ou des diaporamas) qui peuvent être utilisés comme des sources de saisie de code.
- La documentation de code. Si l’on veut expliquer, ligne à ligne, comment fonctionne une séquence de code, avec des feedback en direct à chaque fois, il est possible de l’inclure dans un cahier Jupyter. Le code restera entièrement fonctionnel. Il sera possible d’accompagner l’explication d’interactivité en montrant et en racontant tout à la fois.
Les composants de Jupyter
Plusieurs ingrédients sont à l’oeuvre, chacun organisé de façon séparée.
- Le texte et le code HTML. Le texte plein ou le texte annoté utilisant la syntaxe Markdown pour générer du HTML, peut être inséré à n’importe quel endroit dans le document. Les feuilles de style CSS peuvent aussi être intégrées en ligne ou ajoutées au modèle utilisé pour générer le cahier.
- Le code et le rendu. Dans les cahiers de Jupyter, on trouve typiquement du code Python, quoi que l’on puisse ajouter dans l’environnement le support d’autres langages comme R ou Julia. Les résultats du code exécuté apparaissent immédiatement après les blocs de code et ces derniers peuvent être exécutés - et ré-exécutés - dans l’ordre que l’on choisira, aussi souvent qu’on le voudra.
- Les visualisations. Les graphiques peuvent être générés à partir du code en utilisant des modules comme Matplotlib, Plotly, or Bokeh. Comme les autres rendus, ces visualisations apparaissent en ligne à côté du code à partir duquel elles ont été générées. Toutefois, le code peut aussi être configuré pour les écrire dans le fichier externe si nécessaire.
- Le multimedia. Jupyter s’appuyant sur des technologies web, il peut supporter tous les types de multimédias supportés dans une page web. On peut les inclure dans un notebook comme des éléments HTML, ou on peut les générer de façon programmatique en passant par le module IPython.diplay.
- Les données peuvent être fournies dans un fichier séparé à côté du fichier.ipynb qui contient le notebook Jypyter. Ou bien être importées de façon programmatique, par exemple en incluant du code dans le notebook pour télécharger les données d’un référentiel Internet publique, ou encore pour y accéder via une connexion de type base de données.
Les cas d’usage de Jupyter Notebook
Les usages les plus courants sont la data science, les mathématiques et les autres projets de recherche qui nécessitent de faire des visualisations de données ou des formules. Mais il y en a d’autres.
- Pour partager une visualisation, avec ou sans interactivité. Les utilisateurs partagent souvent ces visualisations de données sous la forme d’une image statique, mais ce n’est utile que dans un cas. En partageant un cahier Jupyter, on autorise son audience cible à plonger dedans et à jouer avec. Ils peuvent acquérir une compréhension approfondie des données, de manière interactive.
- Pour documenter un processus avec du code. De nombreux programmeurs qui tiennent des blogs sur leurs expériences de programmation écrivent leurs billets dans un cahier Jupyter. On peut alors télécharger le cahier et recréer l’exercice.
- Pour documenter en direct une bibliothèque ou un module. La plupart de la documentation pour les modules Python est statique; un cahier Jupyter peut être utilisé comme un bac à sable (sandbox) interactif pour apprendre comment un module fonctionne. N’importe quel module Python qui fonctionne bien dans une interface de ce type (essentiellement tout ce qui écrit vers stdout, c'est à dire vers une sortie d’affichage standard) est un bon candidat.
- Pour le partage de code et de données en général. Tout ce que l’on a à faire pour partager un cahier Jupyter et ses fichiers de données associés, c’est de les réunir dans une archive.
Les limites de Jupyter Notebook
Tout puissant et utile qu’il soit, Jupyter a tout de même quelques limites qu’il faut prendre en compte.
- Les cahiers ne sont pas autonomes. C’est le principal inconvénient à l’utilisation de Jupyter. Ses notebooks nécessitent un runtime, de même que les bibliothèques que l’on souhaite utiliser. Il existe quelques stratégies pour créer des cahiers Jupyter autonomes, mais aucun d’eux n’est officiellement supporté. Il est donc préférable de distribuer des notebooks à ceux qui disposent déjà d’une infrastructure pour les exécuter ou qui pourront l’installer, par l’intermédiaire d’Anaconda par exemple. Dans cette distribution de Python fournie avec Jupyter Notebook, exécuter ce dernier s'avère aussi facile que de cliquer sur une icône.
- L’état d’une session ne peut pas être sauvegardé facilement. L’état d’un code s’exécutant dans un cahier Jupyter ne peut pas être préservé et restauré avec le jeu d’outils par défaut du cahier Jupyter. A chaque fois que l’on charge le notebook, il faut ré-exécuter le code à l’intérieur pour restaurer son état.
- Pas de debugging interactif ni autres fonctionnalités de type IDE (environnement de développement). Un cahier Jupyter, ce n’est pas vraiment un environnement de développement pour Python. De nombreuses fonctions que l’on s’attend à trouver dans un IDE - comme la complétion de code, un module de gestion ou le débugging interactif - ne s’y trouvent pas.