{ "cells": [ { "cell_type": "markdown", "id": "0", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/git/https%3A%2F%2Fgitlab.dsi.universite-paris-saclay.fr%2Fbruno.denis%2Fintro_jupyter/HEAD?labpath=notebooks%2Fenseignement.ipynb)\n", "[![NbViewer](https://badgen.net/static/render/NbViewer/orange)](https://nbviewer.org/urls/gitlab.dsi.universite-paris-saclay.fr/bruno.denis/intro_jupyter/-/raw/main/notebooks/enseignement.ipynb)\n", "\n", "# Enseigner avec Jupyter\n", "\n", "Les carnets Jupyter sont de bons outils d’enseignement." ] }, { "cell_type": "markdown", "id": "1", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Scénario 1\n", "\n", "L'alternance de cellules de code et de cellules de texte formaté pour **expliquer un langage informatique**." ] }, { "cell_type": "markdown", "id": "2", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Exemple\n", "\n", "Une liste Python est un conteneur d'objets Python de type différent." ] }, { "cell_type": "code", "execution_count": 1, "id": "3", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "[1, 2, ['a', 'b', 'c']]" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[1, 2, 3] # liste de trois entiers\n", "[1, \"bonjour\", 3.2] # liste de trois éléments de type différent\n", "[1, 2, [\"a\", \"b\", \"c\"]] # Liste contenant une liste comme élément" ] }, { "cell_type": "markdown", "id": "4", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "La méthode `append()` permet d'ajouter un élément à une liste." ] }, { "cell_type": "code", "execution_count": 2, "id": "5", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "l1 = [1, 2, 3]\n", "l1.append(4)" ] }, { "cell_type": "markdown", "id": "6", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Scénario 2\n", "\n", "Utilisation des carnets Jupyter pour organiser des **exercices de programmation** en classe. Les instructions sont décrites dans des cellules de texte formaté et les étudiant(e)s sont invités à suivre ces instructions pour résoudre des problèmes dans des cellules de code vides ou partiellement remplies." ] }, { "cell_type": "markdown", "id": "7", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Exemple\n", "\n", "Coder une fonction qui retourne la somme des entiers positifs pairs inférieurs ou égale à $n$. Le paramètre d'entrée de la fonction est $n$. Si ce paramètre n'est pas une valeur numérique positive ou nulle, la fonction renvoie $-1$." ] }, { "cell_type": "code", "execution_count": 3, "id": "8", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "def volume_cylindre(rayon, hauteur):\n", " pass # placer le code ici à la placce de l'instruction pass\n", "\n" ] }, { "cell_type": "markdown", "id": "9", "metadata": { "editable": true, "jp-MarkdownHeadingCollapsed": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Pour tester votre code, exécuter les assertions suivantes, elles ne doivent pas lever d'exception si votre fonction répond au cahier des charges." ] }, { "cell_type": "code", "execution_count": null, "id": "10", "metadata": { "editable": false, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "assert somme_paire(0) == 0\n", "assert somme_paire(2) == 2\n", "assert somme_paire(10) == 30\n", "assert somme_paire(100) == 2550\n", "assert somme_paire(12.2) == 42\n", "assert somme_paire(\"8\") == -1" ] }, { "cell_type": "markdown", "id": "11", "metadata": { "editable": true, "jp-MarkdownHeadingCollapsed": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Proposition d'une solution" ] }, { "cell_type": "code", "execution_count": 5, "id": "12", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [], "source": [ "def somme_paire(n):\n", " \"\"\"Renvoie la somme des entiers positifs paires inférieur a n.\"\"\"\n", " res = -1\n", " if isinstance(n, (float, int)):\n", " if n >= 0:\n", " res = sum([i for i in range(0, int(n)+1, 2)])\n", " return res" ] }, { "cell_type": "markdown", "id": "13", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "## Scénario 3\n", "\n", "L'interactivité d'un carnet Jupyter permet des **explorations de données** en ligne." ] }, { "cell_type": "markdown", "id": "14", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "### Exemple\n", "\n", "La base de toutes les adresses postales de France est disponible sur l'API http https://adresse.data.gouv.fr/api-doc/adresse\n", "\n", "Le code suivant envoie une requête et affiche les 5 premiers résultats. La requête paramétrable en adaptant le dictionnaire `params`." ] }, { "cell_type": "code", "execution_count": 6, "id": "15", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "34 réponses obtenues\n" ] } ], "source": [ "import requests\n", "import pandas\n", "\n", "api_url=\"https://api-adresse.data.gouv.fr/search/\"\n", "params = {\n", " \"q\": \"avenue\",\n", " \"limit\": 100,\n", " \"type\": \"street\", # housenumber, street, locality, municipality\n", " \"postcode\": 91190,\n", "}\n", "\n", "data_json = requests.get(api_url, params=params).json()\n", "data_frame = pandas.json_normalize(data_json[\"features\"])\n", "\n", "print(len(data_frame), \"réponses obtenues\")" ] }, { "cell_type": "code", "execution_count": 7, "id": "16", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
typegeometry.typegeometry.coordinatesproperties.labelproperties.scoreproperties.idproperties.nameproperties.postcodeproperties.citycodeproperties.xproperties.yproperties.cityproperties.contextproperties.typeproperties.importanceproperties.street
0FeaturePoint[2.116187, 48.704444]Avenue du Génèral Leclerc 91190 Gif-sur-Yvette0.88202791272_1260Avenue du Génèral Leclerc9119091272634963.336845286.41Gif-sur-Yvette91, Essonne, Île-de-Francestreet0.70230Avenue du Génèral Leclerc
1FeaturePoint[2.115624, 48.694571]Avenue du Panorama 91190 Gif-sur-Yvette0.87775491272_1930Avenue du Panorama9119091272634909.616844189.27Gif-sur-Yvette91, Essonne, Île-de-Francestreet0.65529Avenue du Panorama
2FeaturePoint[2.115367, 48.693057]Avenue Centrale 91190 Gif-sur-Yvette0.87667091272_0470Avenue Centrale9119091272634888.816844021.17Gif-sur-Yvette91, Essonne, Île-de-Francestreet0.64337Avenue Centrale
3FeaturePoint[2.125022, 48.710608]Avenue du Bois des Roches 91190 Gif-sur-Yvette0.87547791272_0380Avenue du Bois des Roches9119091272635621.046845964.45Gif-sur-Yvette91, Essonne, Île-de-Francestreet0.63025Avenue du Bois des Roches
4FeaturePoint[2.118026, 48.692642]Avenue des Carrières 91190 Gif-sur-Yvette0.87547791272_0450Avenue des Carrières9119091272635084.006843972.84Gif-sur-Yvette91, Essonne, Île-de-Francestreet0.63025Avenue des Carrières
\n", "
" ], "text/plain": [ " type geometry.type geometry.coordinates \\\n", "0 Feature Point [2.116187, 48.704444] \n", "1 Feature Point [2.115624, 48.694571] \n", "2 Feature Point [2.115367, 48.693057] \n", "3 Feature Point [2.125022, 48.710608] \n", "4 Feature Point [2.118026, 48.692642] \n", "\n", " properties.label properties.score \\\n", "0 Avenue du Génèral Leclerc 91190 Gif-sur-Yvette 0.882027 \n", "1 Avenue du Panorama 91190 Gif-sur-Yvette 0.877754 \n", "2 Avenue Centrale 91190 Gif-sur-Yvette 0.876670 \n", "3 Avenue du Bois des Roches 91190 Gif-sur-Yvette 0.875477 \n", "4 Avenue des Carrières 91190 Gif-sur-Yvette 0.875477 \n", "\n", " properties.id properties.name properties.postcode \\\n", "0 91272_1260 Avenue du Génèral Leclerc 91190 \n", "1 91272_1930 Avenue du Panorama 91190 \n", "2 91272_0470 Avenue Centrale 91190 \n", "3 91272_0380 Avenue du Bois des Roches 91190 \n", "4 91272_0450 Avenue des Carrières 91190 \n", "\n", " properties.citycode properties.x properties.y properties.city \\\n", "0 91272 634963.33 6845286.41 Gif-sur-Yvette \n", "1 91272 634909.61 6844189.27 Gif-sur-Yvette \n", "2 91272 634888.81 6844021.17 Gif-sur-Yvette \n", "3 91272 635621.04 6845964.45 Gif-sur-Yvette \n", "4 91272 635084.00 6843972.84 Gif-sur-Yvette \n", "\n", " properties.context properties.type properties.importance \\\n", "0 91, Essonne, Île-de-France street 0.70230 \n", "1 91, Essonne, Île-de-France street 0.65529 \n", "2 91, Essonne, Île-de-France street 0.64337 \n", "3 91, Essonne, Île-de-France street 0.63025 \n", "4 91, Essonne, Île-de-France street 0.63025 \n", "\n", " properties.street \n", "0 Avenue du Génèral Leclerc \n", "1 Avenue du Panorama \n", "2 Avenue Centrale \n", "3 Avenue du Bois des Roches \n", "4 Avenue des Carrières " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_frame.head(5)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.9" } }, "nbformat": 4, "nbformat_minor": 5 }