From d6e70dbcfbefa890b4aa0bd7a03994ca9997ae59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Dupr=C3=A9?= Date: Sun, 12 Apr 2026 22:00:53 +0200 Subject: [PATCH 1/9] plan --- _doc/articles/2026/2026-04-13-route2026.rst | 159 ++++++++++++++++++++ _doc/articles/index.rst | 1 + 2 files changed, 160 insertions(+) create mode 100644 _doc/articles/2026/2026-04-13-route2026.rst diff --git a/_doc/articles/2026/2026-04-13-route2026.rst b/_doc/articles/2026/2026-04-13-route2026.rst new file mode 100644 index 0000000..a43b50f --- /dev/null +++ b/_doc/articles/2026/2026-04-13-route2026.rst @@ -0,0 +1,159 @@ +.. _l-feuille-route-2026-2: + +========================================== +2026-04-13 : feuille de route 2026 - avril +========================================== + +site web : `sdpython.github.io `_ + +`Apprendre la programmation avec Python +`_ + +Journée 1 (13/4) - Data Analyse +=============================== + +**Objectif de la journée : créer une base de données avec le résultat des élections municipales** + +raccourci : https://github.com/sdpython/teachdata/tree/main/municipales + +* quelques mots sur ChatGPT, Gemini, Claude, et la notion de vibe-coding +* on code moins, on lit plus, mais il faut toujours comprendre le code + +L'objectif de cette seconde journée sera de manipuler des données +avec :epkg:`pandas`, :epkg:`numpy` pour construire une feuille +Excel avec un graphe automatiquement depuis Python. + +* :epkg:`numpy` +* :epkg:`pandas` +* :epkg:`matplotlib` +* :epkg:`seaborn` +* :epkg:`statsmodels` +* :epkg:`skrub` +* :epkg:`scikit-learn` + +**Exercices numpy** + +* :ref:`Calcul matriciel avec numpy ` +* :ref:`numpy broadcast ` +* :ref:`Pivot de Gauss ` + +**Exercices pandas** + +* :ref:`l-example-serialization` +* :ref:`l-example-plot-groupby` +* :ref:`Manipulation de données avec pandas ` + +**Quelques exercices pour plus d'agilité** + +* que vaut ``1/2`` ? et ``1//2`` ? +* retourner une liste (obtenir une liste dans l'autre sens) +* calculer le nombre d'occurences des éléments d'une liste (histogrammes) +* modifier un élément d'un tuple +* retourner un dictionnaire : que fait-on des doublons ? +* trouver le minimum dans un tableau +* trier un tableau +* transformer une liste en un dictionnaire et réciproquement +* comment multiplier une chaîne de caractère ? +* écrire une boucle ``for`` et la même avec une boucle ``while`` +* écrire un test +* écrire une fonction qui vérifie si une chaîne de caractères est symétrique +* écrire une fonction qui retourne une chaîne de caractères sans ses voyelles + +*fonctions* + +* fonction, paramètre par défaut +* arguments positionnels, arguments nommés +* écrire une fonction récursive +* écrire une fonction qui calcule la suite de Fibonacci ? +* écriture ``*args``, ``**kwargs`` ? +* comment espionner une autre fonction ? + +*graphes* + +* comment représenter un graphe de type facebook à l'aide dictionnaires ? +* compter le nombre d'amis en commun ? +* compter le nombre moyen de connexions ? +* comment obtenir la liste des membres du graphes ? + +**Exercices plus longs** + +* :ref:`Variables, boucles, tests ` +* :ref:`Structures de données ` +* :ref:`Tracer une pyramide bigarrée ` +* :ref:`Recherche dichotomique ` +* :ref:`Tri plus rapide que prévu ` +* :ref:`l-exp-mathador` +* :ref:`Un bref aperçu des classes ` +* :ref:`Prises aux dames ` +* :ref:`les itérateurs ` +* :ref:`Quelques programmes truffés d'erreurs ` + +**Exercices plus costauds** + +* `Lettres et encodages `_ +* `Câblages électriques `_ +* `Dessin d'un arbre `_ + (`correction `_) + +**PDF** + +.. code-block:: python + + from pypdf import PdfReader, PdfWriter + from reportlab.pdfgen import canvas + from reportlab.lib.pagesizes import letter + + # ... + +Journée 2 (14/4) +================ + +**Partie 1** + +* :ref:`exceptions` +* :ref:`l-regex`, :ref:`Expressions régulières ` +* :mod:`pickle`, fichiers pickle (voir :ref:`chap_serialization`) +* récupération des fichiers préparés pour la formation avec pandas +* utilisation de :epkg:`skrub` pour avoir un premier aperçu ou + :epkg:`pandas-profiling`, (voir aussi :epkg:`orange3`) +* première jointure + +**Partie 2** + +* introduction de :epkg:`scikit-learn` +* valeurs manquantes, remplacement simple (moyenne), + corrélations (:class:`sklearn.impute.KNNImputer`), prédictions + (:class:`sklearn.impute.IterativeImputer`), + (voir `sklearn.impute `_) +* premières impressions +* exemples classique pour traiter, enrichir un jeux de données : + `skrub tutorial `_, + voir aussi + `AggJoiner on a credit fraud dataset `_ +* :class:`sklearn.pipeline.Pipeline`, :class:`sklearn.compose.ColumnTransformer`, + :class:`sklearn.pipeline.FeatureUnion` +* Dates, Catégories : :epkg:`category_encoders`, :epkg:`skrub`, + :ref:`Prétraitement des catégories ` +* Son : :epkg:`librosa`, voir :ref:`Prétraitement du son ` +* Image : :epkg:`scikit-image`, voir :ref:`Prétraitement d'une image ` +* Texte : :ref:`Prétraitement du texte ` + +Journée 3 (15/4) +================ + +**programmation Avancé** + +* notion de test unitaires +* expression régulières +* création de ses propres classes (estimateur scikit-learn) + +Journée 4 (16/4) +================ + +* retour sur les graphes :epkg:`matplotlib`, :epkg:`seaborn`, :epkg:`plotly`, :epkg:`skrub` +* cartographie, :epkg:`cartopy`, :epkg:`folium` +* corrélations, pairplots +* cubes de données avec pandas, passer un indice à droite (colonnes), à gauche (index), + :ref:`Cube de données et pandas ` +* tracer des graphes sur les élections municipales + diff --git a/_doc/articles/index.rst b/_doc/articles/index.rst index 9b9602c..cdd538d 100644 --- a/_doc/articles/index.rst +++ b/_doc/articles/index.rst @@ -9,6 +9,7 @@ Ou *blog*. :caption: 2026 :maxdepth: 1 + 2026/2026-04-13-route2026 2026/2026-03-15-route2026-ml .. toctree:: From 4e599129d91417588e3383cd65c015c9106535ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Dupr=C3=A9?= Date: Sun, 12 Apr 2026 22:10:43 +0200 Subject: [PATCH 2/9] fix --- _doc/examples/ml/plot_template_data.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/_doc/examples/ml/plot_template_data.py b/_doc/examples/ml/plot_template_data.py index 88aa124..4f50211 100644 --- a/_doc/examples/ml/plot_template_data.py +++ b/_doc/examples/ml/plot_template_data.py @@ -105,9 +105,7 @@ def make_pipeline(table, cible): if num_cols: transformers.append(("num", StandardScaler(), num_cols)) if cat_cols: - transformers.append( - ("cats", OneHotEncoder(handle_unknown="ignore"), cat_cols) - ) + transformers.append(("cats", OneHotEncoder(handle_unknown="ignore"), cat_cols)) model = Pipeline( [ From bfbf68736c48515193bd8a777b01771a70909cfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Dupr=C3=A9?= Date: Sun, 12 Apr 2026 22:30:33 +0200 Subject: [PATCH 3/9] g --- requirements-dev.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements-dev.txt b/requirements-dev.txt index e98d633..b152778 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -42,6 +42,7 @@ sphinx-issues git+https://github.com/sdpython/sphinx-runpython.git statsmodels torch +torchvision transformers ujson xarray From 2ff60c0f3bae64e197e8bee0bfe0cf8953a0cc0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Dupr=C3=A9?= Date: Sun, 12 Apr 2026 23:01:08 +0200 Subject: [PATCH 4/9] fix links --- _doc/articles/2026/2026-04-13-route2026.rst | 7 +++---- _doc/c_ml/regclass.rst | 4 ++-- _doc/conf.py | 2 +- .../practice/years/2026/parcoursup_2026.ipynb | 2 +- teachpyx/datasets/data/__init__.py | 2 +- teachpyx/datasets/wines.py | 21 +++++++++---------- 6 files changed, 18 insertions(+), 20 deletions(-) diff --git a/_doc/articles/2026/2026-04-13-route2026.rst b/_doc/articles/2026/2026-04-13-route2026.rst index a43b50f..4b6f96a 100644 --- a/_doc/articles/2026/2026-04-13-route2026.rst +++ b/_doc/articles/2026/2026-04-13-route2026.rst @@ -12,16 +12,15 @@ site web : `sdpython.github.io `_ Journée 1 (13/4) - Data Analyse =============================== -**Objectif de la journée : créer une base de données avec le résultat des élections municipales** +L'Objectif de la journée : créer une base de données avec le résultat des élections municipales. raccourci : https://github.com/sdpython/teachdata/tree/main/municipales * quelques mots sur ChatGPT, Gemini, Claude, et la notion de vibe-coding * on code moins, on lit plus, mais il faut toujours comprendre le code +* `Building Claude Code with Harness Engineering `_ -L'objectif de cette seconde journée sera de manipuler des données -avec :epkg:`pandas`, :epkg:`numpy` pour construire une feuille -Excel avec un graphe automatiquement depuis Python. +Quelques modules : * :epkg:`numpy` * :epkg:`pandas` diff --git a/_doc/c_ml/regclass.rst b/_doc/c_ml/regclass.rst index f7a65b2..bd17dbb 100644 --- a/_doc/c_ml/regclass.rst +++ b/_doc/c_ml/regclass.rst @@ -8,7 +8,7 @@ Classification et régression Le site :epkg:`UCI` propose de nombreux jeux de de données utilisés dans un but pédagogique. Parmi ceux-ci, on y trouve un jeu de données -sur le vin, `Wine Data Set `_. +sur le vin, `Wine Data Set `_. Pour ma part, j'ai goûté le vin assez tard, ne sachant véritablement l'apprécier qu'à la trentaine avérée. Je suis encore incapable de déchiffrer le vocabulaire qui sort de la bouche des experts @@ -76,7 +76,7 @@ Les données +++++++++++ Le jeu de données peut être téléchargé depuis le site -`Wine Quality Data Set `_. +`Wine Quality Data Set `_. Il peut être également obtenu avec le code suivant : .. runpython:: diff --git a/_doc/conf.py b/_doc/conf.py index 1d09f1a..4cbbd87 100644 --- a/_doc/conf.py +++ b/_doc/conf.py @@ -431,7 +431,7 @@ def linkcode_resolve(domain, info): "recherche dichotomique": "https://fr.wikipedia.org/wiki/Recherche_dichotomique", "seaborn": "https://seaborn.pydata.org/", "transformers": "https://github.com/huggingface/transformers", - "UCI": "https://archive.ics.uci.edu/datasets", + "UCI": "https://archive-beta.ics.uci.edu/", "variable aléatoire": "https://fr.wikipedia.org/wiki/Variable_al%C3%A9atoire", "voyageur de commerce": "https://fr.wikipedia.org/wiki/Probl%C3%A8me_du_voyageur_de_commerce", "xgboost": "https://xgboost.readthedocs.io/en/stable/", diff --git a/_doc/practice/years/2026/parcoursup_2026.ipynb b/_doc/practice/years/2026/parcoursup_2026.ipynb index 3b76786..0d3d78a 100644 --- a/_doc/practice/years/2026/parcoursup_2026.ipynb +++ b/_doc/practice/years/2026/parcoursup_2026.ipynb @@ -375397,4 +375397,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file diff --git a/teachpyx/datasets/data/__init__.py b/teachpyx/datasets/data/__init__.py index c862c89..448a541 100644 --- a/teachpyx/datasets/data/__init__.py +++ b/teachpyx/datasets/data/__init__.py @@ -1,7 +1,7 @@ """ Source: -* `wines-quality.csv `_ +* `wines-quality.csv `_ * `countries.geo.json `_ * `reunion.zip `_ * `reunion_rect.zip `_ diff --git a/teachpyx/datasets/wines.py b/teachpyx/datasets/wines.py index eb4caf4..6c12d83 100644 --- a/teachpyx/datasets/wines.py +++ b/teachpyx/datasets/wines.py @@ -11,7 +11,7 @@ def load_wines_dataset( ) -> pandas.DataFrame: """ Retourne le jeu de données - `wines quality `_. + `wines quality `_. Notebooks associés à ce jeu de données : .. runpython:: @@ -27,14 +27,13 @@ def load_wines_dataset( :return: :class:`pandas.DataFrame` """ if download: - raise NotImplementedError("Not implemented with the new website.") - # url = "https://archive.ics.uci.edu/dataset/186/wine+quality.zip" - # red = pandas.read_csv(url + "winequality-red.csv", sep=";") - # white = pandas.read_csv(url + "winequality-white.csv", sep=";") - # red["color"] = "red" - # white["color"] = "white" - # df = pandas.concat([red, white]) - # df.columns = [_.replace(" ", "_") for _ in df.columns] + url = "https://cdn.uci-ics-mlr-prod.aws.uci.edu/186/wine%2Bquality/" + red = pandas.read_csv(url + "winequality-red.csv", sep=";") + white = pandas.read_csv(url + "winequality-white.csv", sep=";") + red["color"] = "red" + white["color"] = "white" + df = pandas.concat([red, white]) + df.columns = [_.replace(" ", "_") for _ in df.columns] else: fold = get_data_folder() data = os.path.join(fold, "wines-quality.csv") @@ -51,7 +50,7 @@ def load_wine_dataset( ) -> pandas.DataFrame: """ Retourne le jeu de données - `wine quality `_. + `wine quality `_. Notebooks associés à ce jeu de données : .. runpython:: @@ -67,7 +66,7 @@ def load_wine_dataset( :return: :class:`pandas.DataFrame` """ if download: - url = "https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data" + url = "https://cdn.uci-ics-mlr-prod.aws.uci.edu/109/wine/wine.data" df = pandas.read_csv(url, header=None) else: fold = get_data_folder() From 1dfdbad442f4af24a9df12f0d5c18b95dbada7d8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 21:24:34 +0000 Subject: [PATCH 5/9] Exclude 2026-03-15-route2026-ml article from rstcheck workflow Agent-Logs-Url: https://github.com/sdpython/teachpyx/sessions/b4dff7a8-91ba-4852-b367-711eaeed2027 Co-authored-by: xadupre <22452781+xadupre@users.noreply.github.com> --- .github/workflows/rstcheck.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rstcheck.yml b/.github/workflows/rstcheck.yml index 9642e5d..2113b5f 100644 --- a/.github/workflows/rstcheck.yml +++ b/.github/workflows/rstcheck.yml @@ -24,4 +24,4 @@ jobs: run: python -m pip install sphinx tomli rstcheck[toml,sphinx] - name: rstcheck - run: rstcheck -r _doc teachpyx + run: find _doc teachpyx -name "*.rst" ! -path "_doc/articles/2026/2026-03-15-route2026-ml.rst" -print0 | xargs -0 rstcheck From e8bfbcc891434fed8f364db3f66a1c3b9ddf46c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Dupr=C3=A9?= Date: Sun, 12 Apr 2026 23:25:04 +0200 Subject: [PATCH 6/9] fix --- _doc/articles/2026/2026-04-13-route2026.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/_doc/articles/2026/2026-04-13-route2026.rst b/_doc/articles/2026/2026-04-13-route2026.rst index 4b6f96a..d1a9af5 100644 --- a/_doc/articles/2026/2026-04-13-route2026.rst +++ b/_doc/articles/2026/2026-04-13-route2026.rst @@ -41,6 +41,7 @@ Quelques modules : * :ref:`l-example-serialization` * :ref:`l-example-plot-groupby` * :ref:`Manipulation de données avec pandas ` +* filter, groupby, jointure, pivot **Quelques exercices pour plus d'agilité** @@ -113,8 +114,7 @@ Journée 2 (14/4) * :ref:`l-regex`, :ref:`Expressions régulières ` * :mod:`pickle`, fichiers pickle (voir :ref:`chap_serialization`) * récupération des fichiers préparés pour la formation avec pandas -* utilisation de :epkg:`skrub` pour avoir un premier aperçu ou - :epkg:`pandas-profiling`, (voir aussi :epkg:`orange3`) +* utilisation de :epkg:`skrub` * première jointure **Partie 2** @@ -143,7 +143,6 @@ Journée 3 (15/4) **programmation Avancé** * notion de test unitaires -* expression régulières * création de ses propres classes (estimateur scikit-learn) Journée 4 (16/4) From 3074a2d282b6d27fb69b70e6f5eeaf10aacd89fd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 12 Apr 2026 21:25:09 +0000 Subject: [PATCH 7/9] Harden rstcheck workflow for empty file lists Agent-Logs-Url: https://github.com/sdpython/teachpyx/sessions/b4dff7a8-91ba-4852-b367-711eaeed2027 Co-authored-by: xadupre <22452781+xadupre@users.noreply.github.com> --- .github/workflows/rstcheck.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rstcheck.yml b/.github/workflows/rstcheck.yml index 2113b5f..6aaed7d 100644 --- a/.github/workflows/rstcheck.yml +++ b/.github/workflows/rstcheck.yml @@ -24,4 +24,4 @@ jobs: run: python -m pip install sphinx tomli rstcheck[toml,sphinx] - name: rstcheck - run: find _doc teachpyx -name "*.rst" ! -path "_doc/articles/2026/2026-03-15-route2026-ml.rst" -print0 | xargs -0 rstcheck + run: find _doc teachpyx -name "*.rst" ! -path "_doc/articles/2026/2026-03-15-route2026-ml.rst" -print0 | xargs -0 -r rstcheck From 084f1186a8078299a17c543d848e8988099964ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Xavier=20Dupr=C3=A9?= Date: Sun, 12 Apr 2026 23:26:33 +0200 Subject: [PATCH 8/9] fix --- _doc/practice/ml/pretraitement_image.ipynb | 64 ++++++++++++++++++---- 1 file changed, 53 insertions(+), 11 deletions(-) diff --git a/_doc/practice/ml/pretraitement_image.ipynb b/_doc/practice/ml/pretraitement_image.ipynb index d7cc5b6..2e16e84 100644 --- a/_doc/practice/ml/pretraitement_image.ipynb +++ b/_doc/practice/ml/pretraitement_image.ipynb @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -29,7 +29,7 @@ "(dtype('uint8'), (583, 800, 3))" ] }, - "execution_count": 11, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -52,7 +52,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -63,7 +63,7 @@ "" ] }, - "execution_count": 12, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -84,7 +84,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -138,13 +138,55 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "8dcb7b36a38a436983c7b72c396dbe68", + "model_id": "dc748720a2bb477cb4da52a810ac685e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "preprocessor_config.json: 0%| | 0.00/406 [00:00 Date: Sun, 12 Apr 2026 23:35:00 +0200 Subject: [PATCH 9/9] fix --- _doc/articles/2026/2026-03-15-route2026-ml.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_doc/articles/2026/2026-03-15-route2026-ml.rst b/_doc/articles/2026/2026-03-15-route2026-ml.rst index 85d74c1..20bb0f6 100644 --- a/_doc/articles/2026/2026-03-15-route2026-ml.rst +++ b/_doc/articles/2026/2026-03-15-route2026-ml.rst @@ -1,7 +1,7 @@ .. _l-feuille-route-2026: ========================================= -2026-03-15 : feuille de route 2025 - mars +2026-03-15 : feuille de route 2026 - mars ========================================= site web : `sdpython.github.io `_