diff --git a/.github/workflows/rstcheck.yml b/.github/workflows/rstcheck.yml index 9642e5dd..6aaed7dd 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 -r rstcheck diff --git a/_doc/articles/2026/2026-03-15-route2026-ml.rst b/_doc/articles/2026/2026-03-15-route2026-ml.rst index 85d74c10..20bb0f68 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 `_ 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 00000000..d1a9af52 --- /dev/null +++ b/_doc/articles/2026/2026-04-13-route2026.rst @@ -0,0 +1,157 @@ +.. _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 +=============================== + +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 `_ + +Quelques modules : + +* :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 ` +* filter, groupby, jointure, pivot + +**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` +* 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 +* 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 9b9602ce..cdd538df 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:: diff --git a/_doc/c_ml/regclass.rst b/_doc/c_ml/regclass.rst index f7a65b2e..bd17dbbb 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 1d09f1aa..4cbbd875 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/examples/ml/plot_template_data.py b/_doc/examples/ml/plot_template_data.py index 88aa124b..4f502111 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( [ diff --git a/_doc/practice/ml/pretraitement_image.ipynb b/_doc/practice/ml/pretraitement_image.ipynb index d7cc5b64..2e16e844 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`_ +* `wines-quality.csv `_ * `countries.geo.json `_ * `reunion.zip `_ * `reunion_rect.zip `_ diff --git a/teachpyx/datasets/wines.py b/teachpyx/datasets/wines.py index eb4caf46..6c12d83f 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()