From 154f09e488602f1469f64225526a5e3b467ebfe8 Mon Sep 17 00:00:00 2001 From: Antoine Palazzolo <97433407+antoine-palazz@users.noreply.github.com> Date: Tue, 26 Sep 2023 14:59:11 +0200 Subject: [PATCH] =?UTF-8?q?Des=20typos=20corrig=C3=A9es=20par=20Antoine=20?= =?UTF-8?q?(#411)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 1st vague typos * vague typos 2 --- README.md | 4 +-- content/NLP/01_intro.qmd | 2 +- content/NLP/02_exoclean.qmd | 4 +-- content/NLP/03_lda.qmd | 6 ++-- content/NLP/04_word2vec.qmd | 2 +- content/NLP/05_exo_supp.qmd | 2 +- content/annexes/evaluation.qmd | 4 +-- content/getting-started/01_installation.qmd | 30 +++++++++---------- content/getting-started/02_DS_environment.qmd | 16 +++++----- content/getting-started/03_data_analysis.qmd | 26 ++++++++-------- .../getting-started/04_python_practice.qmd | 14 ++++----- content/getting-started/05_rappels_types.qmd | 4 +-- content/getting-started/index.qmd | 14 ++++----- content/git/exogit.qmd | 10 +++---- content/git/index.qmd | 4 +-- content/git/introgit.qmd | 2 +- content/manipulation/01_numpy.qmd | 6 ++-- content/manipulation/02a_pandas_tutorial.qmd | 14 ++++----- content/manipulation/02b_pandas_TP.qmd | 4 +-- content/manipulation/03_geopandas_TP.qmd | 2 +- .../manipulation/03_geopandas_tutorial.qmd | 2 +- content/manipulation/04a_webscraping_TP.qmd | 30 +++++++++---------- content/manipulation/04b_regex_TP.qmd | 14 ++++----- content/manipulation/04c_API_TP.qmd | 8 ++--- .../manipulation/06a_exo_supp_webscraping.qmd | 10 +++---- content/manipulation/07_dask.qmd | 10 +++---- content/manipulation/index.qmd | 2 +- content/modelisation/3_regression.qmd | 4 +-- content/modelisation/5_clustering.qmd | 2 +- content/modelisation/6_pipeline.qmd | 6 ++-- content/modelisation/index.qmd | 2 +- content/modern-ds/continuous_integration.qmd | 2 +- content/modern-ds/dallE.qmd | 10 +++---- .../modern-ds/elastic_approfondissement.qmd | 2 +- content/modern-ds/elastic_intro.qmd | 12 ++++---- content/modern-ds/index.qmd | 4 +-- content/modern-ds/s3.qmd | 10 +++---- content/visualisation/maps.qmd | 2 +- content/visualisation/matplotlib.qmd | 2 +- index.qmd | 2 +- slides/intro/index.qmd | 6 ++-- 41 files changed, 156 insertions(+), 156 deletions(-) diff --git a/README.md b/README.md index 6bb6cb249..05cef0881 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ _data science_ que des personnes à la recherche de contenu plus avancé : 1. __Manipulation de données__ : manipulation de données standards (`Pandas`), données géographiques (`Geopandas`), récupération de données (webscraping, API)... 1. __Visualisation de données__ : visualisations classiques (`Matplotlib`, `Seaborn`), cartographie, visualisations réactives (`Plotly`, `Folium`) -1. __Modélisation__: _machine learning_ (`Scikit`), économétrie +1. __Modélisation__ : _machine learning_ (`Scikit`), économétrie 1. __Traitement de données textuelles__ (NLP): découverte de la tokenisation avec `NLTK` et `SpaCy`, modélisation... 1. **Introduction à la _data science_ moderne**: _cloud computing_, `ElasticSearch`, intégration continue... @@ -44,7 +44,7 @@ centralisatrice [`data.gouv`](https://www.data.gouv.fr) ou du site _web_ de l'[Insee](https://www.insee.fr)) ou de données américaines. -Un bon complément du contenu du site web est le cours que nous donnons avec Romain Avouac ([@avouacr](https://github.com/avouacr)) en dernière année de l'ENSAE plus tourné autour de la mise en production de projets _data-science_: [https://ensae-reproductibilite.github.io/website/](https://ensae-reproductibilite.github.io/website/) +Un bon complément du contenu du site web est le cours que nous donnons avec Romain Avouac ([@avouacr](https://github.com/avouacr)) en dernière année de l'ENSAE plus tourné autour de la mise en production de projets _data-science_ : [https://ensae-reproductibilite.github.io/website/](https://ensae-reproductibilite.github.io/website/)
diff --git a/content/NLP/01_intro.qmd b/content/NLP/01_intro.qmd index 93e6a1958..e990904fb 100644 --- a/content/NLP/01_intro.qmd +++ b/content/NLP/01_intro.qmd @@ -211,7 +211,7 @@ mesure de les comparer. Lors de la première utilisation de `NLTK`, il est nécessaire de télécharger quelques éléments nécessaires à la tokenisation, notamment la ponctuation. -Pour cela, il est recommandé d'utiliser la commande suivante: +Pour cela, il est recommandé d'utiliser la commande suivante : ~~~python import nltk diff --git a/content/NLP/02_exoclean.qmd b/content/NLP/02_exoclean.qmd index f434807fe..f5b227b4b 100644 --- a/content/NLP/02_exoclean.qmd +++ b/content/NLP/02_exoclean.qmd @@ -20,7 +20,7 @@ description: | anglo-saxons : Mary Shelley, Edgar Allan Poe, H.P. Lovecraft. Dans cette série d'exercice nous mettons en oeuvre de manière plus approfondie les différentes méthodes présentées - précedemment. + précédemment. bibliography: ../../reference.bib image: featured_nlp_exo.png --- @@ -623,7 +623,7 @@ on peut utiliser la librairie `nltk` comme détaillé [précédemment](#nlp).

Exercice 4 : Nettoyage du texte

``` -Repartir de `train`, notre jeu de données d'entraînement. Pour rappel, `train` a la structure suivante: +Repartir de `train`, notre jeu de données d'entraînement. Pour rappel, `train` a la structure suivante : 1. Tokeniser chaque phrase avec `nltk`. 2. Retirer les stopwords avec `nltk`. diff --git a/content/NLP/03_lda.qmd b/content/NLP/03_lda.qmd index d282b5b46..2a4b80a27 100644 --- a/content/NLP/03_lda.qmd +++ b/content/NLP/03_lda.qmd @@ -215,7 +215,7 @@ Mathématiquement, on peut se représenter la LDA comme une technique de maximisation de *log vraisemblance* avec un algorithme EM (*expectation maximisation*) dans un modèle de mélange. -La matrice termes-documents qui sert de point de départ est la suivante: +La matrice termes-documents qui sert de point de départ est la suivante : | | word_1 | word_2 | word_3 | ... | word_J | |---- |--------|--------|--------|-----|--------| @@ -232,7 +232,7 @@ La LDA consiste à transformer cette matrice *sparse*document-terme en deux matr En notant $K_i$ le sujet $i$. On obtient donc -* Une __matrice document-sujet__ ayant la structure suivante: +* Une __matrice document-sujet__ ayant la structure suivante : | | K_1 | K_2 | K_3 | ... | K_M | |---- |--------|--------|--------|-----|--------| @@ -240,7 +240,7 @@ En notant $K_i$ le sujet $i$. On obtient donc | ... | ... | ... | ... | ... | ... | |doc_N| 1 | 1 | 1 | ... | 0 | -* Une __matrice sujets-mots__ ayant la structure suivante: +* Une __matrice sujets-mots__ ayant la structure suivante : | | word_1 | word_2 | word_3 | ... | word_J | |---- |--------|--------|--------|-----|--------| diff --git a/content/NLP/04_word2vec.qmd b/content/NLP/04_word2vec.qmd index ca089c642..998d6213a 100644 --- a/content/NLP/04_word2vec.qmd +++ b/content/NLP/04_word2vec.qmd @@ -606,7 +606,7 @@ L'un des modèles les plus connus pour démarrer est le `glove_model` de > GloVe is an unsupervised learning algorithm for obtaining vector representations for words. Training is performed on aggregated global word-word co-occurrence statistics from a corpus, and the resulting representations showcase interesting linear substructures of the word vector space. > -> _Source_: https://nlp.stanford.edu/projects/glove/ +> _Source_ : https://nlp.stanford.edu/projects/glove/ [^1]: Jeffrey Pennington, Richard Socher, and Christopher D. Manning. 2014. _GloVe: Global Vectors for Word Representation_. diff --git a/content/NLP/05_exo_supp.qmd b/content/NLP/05_exo_supp.qmd index 0b91f43c6..a0804a55f 100644 --- a/content/NLP/05_exo_supp.qmd +++ b/content/NLP/05_exo_supp.qmd @@ -197,7 +197,7 @@ wordcount_words(df_openfood, "tokenized") 5. Utiliser la librairie `Fasttext` pour extraire les noms de produits français -* Appliquer le modèle téléchargé précedemment pour déterminer le langage +* Appliquer le modèle téléchargé précédemment pour déterminer le langage * Ne récupérer que les libellés français ```{python} diff --git a/content/annexes/evaluation.qmd b/content/annexes/evaluation.qmd index fdc858dc2..2794890e5 100644 --- a/content/annexes/evaluation.qmd +++ b/content/annexes/evaluation.qmd @@ -16,7 +16,7 @@ Résumé : - De la modélisation * Les étudiants sont invités à proposer des sujets qui leur plaisent, à faire valider par le chargé de TD. * __Le projet doit utiliser `Git` et être disponible sous -[github](https://github.com/) ou [gitlab](https://gitlab.com/)__ (dépôt public ou dépôt privé à partager avec le chargé de TD) +[Github](https://github.com/) ou [gitlab](https://gitlab.com/)__ (dépôt public ou dépôt privé à partager avec le chargé de TD) * La __date du rendu__ est fixée au : **X décembre 2022 23h59** * Le **06 janvier 2023**, auront lieu des __soutenances__ @@ -65,7 +65,7 @@ quelques conseils pour avoir des notebooks agréables à lire. N'oubliez pas cet > code is read much more often than written Lors de l'évaluation, une attention particulière sera donnée à la *reproductibilité* de votre projet. -Chaque étape (récupération et traitement des données, analyses descriptives, modélisation) doit pouvoir être reproduite à partir du notebook final. Pour les opérations qui prennent du temps (ex : webscraping massif, requêtage d'API avec des limites de nombre de requêtes, entraînement de modèle, etc.), vous devez inclure l'output (base de données, modèle entraîné..) dans le dépôt, afin que les étapes suivantes puissent s'éxecuter sans problème. +Chaque étape (récupération et traitement des données, analyses descriptives, modélisation) doit pouvoir être reproduite à partir du notebook final. Pour les opérations qui prennent du temps (ex : web scraping massif, requêtage d'API avec des limites de nombre de requêtes, entraînement de modèle, etc.), vous devez inclure l'output (base de données, modèle entraîné..) dans le dépôt, afin que les étapes suivantes puissent s'éxecuter sans problème. Le test à réaliser : faire tourner toutes les cellules de votre notebook et ne pas avoir d’erreur est une condition _sine qua non_ pour avoir la moyenne. diff --git a/content/getting-started/01_installation.qmd b/content/getting-started/01_installation.qmd index 38032bebc..bc703a07a 100644 --- a/content/getting-started/01_installation.qmd +++ b/content/getting-started/01_installation.qmd @@ -57,7 +57,7 @@ print_badges("content/manipulation/01_numpy.qmd") ``` ::: -Quelque soit l'environnement d'exécution des scripts, l'un des objectifs +Quel que soit l'environnement d'exécution des scripts, l'un des objectifs de ce cours est d'adopter un environnement favorable à la reproductibilité des traitements. Ils devraient donc fonctionner, dès lors que l'environnement est bien configuré, d'une manière similaire quel que soit @@ -135,7 +135,7 @@ permettent d'exécuter du code très facilement dans un environnement pour ajouter du code ou du texte à un document déjà existant, d'où le terme de _notebook_. -Néanmoins, passé l'étape d'exploration, il est recommandé de plutôt recourir à des +Néanmoins, passée l'étape d'exploration, il est recommandé de plutôt recourir à des scripts au format `.py`. L'utilisation du format `.py` est l'un des premiers gestes pour favoriser la reproductibilité des analyses. Ces scripts peuvent être édités à l'aide d'éditeurs de texte adaptés au code, comme @@ -168,7 +168,7 @@ externes, notamment les interfaces de développement comme ## Exécution dans un environnement temporaire sur un serveur distant -Comme évoqué précedemment, les technologies dominantes dans +Comme évoqué précédemment, les technologies dominantes dans le domaine du traitement des données ont amené à une évolution des pratiques depuis quelques années. La multiplication de données volumineuses qui dépassent les capacités en RAM @@ -189,7 +189,7 @@ d'exécution de ceux-ci. Un système de stockage `S3`, présenté dans un [chapitre ultérieur](#reads3), permet en supplément de dissocier l'environnement de stockage des données de ces deux premiers environnements. Sur le -dépôt github de ce cours {{< githubrepo >}}, on peut +dépôt Github de ce cours {{< githubrepo >}}, on peut naviguer dans les fichiers (et voir tout l'historique de modification de ceux-ci). Mais, comment exécuter les scripts sans passer par un poste local ? @@ -198,8 +198,8 @@ Depuis quelques années, des services en ligne permettant de lancer une instance `Jupyter` à distance (analogue à celle que vous pouvez lancer en local en utilisant `Anaconda`) ont émergé. Parmi celles-ci : -* __Le SSP Cloud__ [![Onyxia](https://img.shields.io/badge/SSPcloud-Tester%20via%20SSP--cloud-informational&color=yellow?logo=Python)](https://datalab.sspcloud.fr/launcher/ide/jupyter-python?autoLaunch=true&onyxia.friendlyName=«python-datascientist»&resources.requests.memory=«4Gi»&security.allowlist.enabled=false&git.repository=«https%3A%2F%2Fgithub.com%2Flinogaliana%2Fpython-datascientist.git») plateforme développée par l'Insee qui fournit des environnements bac à sable basés sur des technologie de conteneurisation -* __Google collaboratory__ +* __Le SSP Cloud__ [![Onyxia](https://img.shields.io/badge/SSPcloud-Tester%20via%20SSP--cloud-informational&color=yellow?logo=Python)](https://datalab.sspcloud.fr/launcher/ide/jupyter-python?autoLaunch=true&onyxia.friendlyName=«python-datascientist»&resources.requests.memory=«4Gi»&security.allowlist.enabled=false&git.repository=«https%3A%2F%2Fgithub.com%2Flinogaliana%2Fpython-datascientist.git»), plateforme développée par l'Insee qui fournit des environnements bac à sable basés sur des technologie de conteneurisation +* __Google colaboratory__ [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](http://colab.research.google.com/github/linogaliana/python-datascientist/blob/master) ; Github Visual Studio Editor [![githubdev](https://open.vscode.dev/badges/open-in-vscode.svg)](https://github.dev/linogaliana/python-datascientist) ; @@ -213,10 +213,10 @@ distant `Gitlab`/`Github`, sans session ouverte pour les éditer. Cette approche est très appropriée pour assurer la reproductibilité d'une chaîne de traitement (on peut aller jusqu'au -déploiement de visualisations automatiques[^2]) mais n'est pas très pratique pour +déploiement de visualisations automatiques[^1]) mais n'est pas très pratique pour le griffonnage. -[^2] A cet égard, il est recommandé de consulter le cours de dernière année +[^1] A cet égard, il est recommandé de consulter le cours de dernière année de l'ENSAE déjà cité: https://ensae-reproductibilite.github.io/website/ [Kaggle](https://www.kaggle.com/notebooks) @@ -248,10 +248,10 @@ de garder à l'esprit qu'elles sont également temporaires. {{% /box %}} -### SSP-Cloud Onyxia
+### SSP Cloud Onyxia
-`Onyxia`, l'autre petit nom du SSP-Cloud, +`Onyxia`, l'autre petit nom du SSP Cloud, est une plateforme libre service mutualisée de traitement de données statistiques et de datascience. @@ -267,7 +267,7 @@ Elle est aussi utilisé à des fins de formations et d’auto-formations. Dans cet environnement, `Jupyter` et `Visual Studio` sont tous deux disponibles. -### Google collaboratory Open In Colab +### Google colaboratory Open In Colab Google met à disposition une plateforme de calculs basée sur le format `Jupyter Notebook`. @@ -275,7 +275,7 @@ Un grand avantage de cette solution est la mise à disposition gratuite de [GPUs](https://fr.wikipedia.org/wiki/Processeur_graphique) de qualité raisonnable, outil quasi-indispensable dans les projets basés sur des méthodes de `deep learning`. Il est possible de connecter les *notebooks* ouverts à Google Drive ou à -[github](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb). L'icone +[Github](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb). L'icone [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/googlecolab/colabtools/blob/master/notebooks/colab-github-demo.ipynb) fournit un raccourci pour lancer le notebook dans un environnement dédié. @@ -292,7 +292,7 @@ d'un dépôt `Github`. -### La technologie en arrière-plan: Docker +### La technologie en arrière-plan : Docker [Docker](https://www.docker.com/) est l'outil open-source de référence en matière de création d'environnements isolés et auto-suffisants ( @@ -307,7 +307,7 @@ du système sur laquelle elle est éxécutée. `Docker` est utilisé dans le cadre de cours afin d'assurer la reproductibilité des exemples. Plus de détails sont disponibles dans le cours de dernière année d'ENSAE -dédié à la mise en production de projets data-science +dédié à la mise en production de projets data science (ensae-reproductibilite.netlify.app/). Il est possible d'utiliser les images `Docker` sur lesquelles reposent @@ -369,7 +369,7 @@ pas la réponse sans comprendre la solution. ### Les gestionnaires de packages Les packages d'un langage *open-source* sont mis à disposition sur -des dépôts. Le CTAN est ainsi le dépôt `\(\LaTeX\)` le plus connu, le +des dépôts. Le CTAN est ainsi le dépôt `LaTeX` le plus connu, le CRAN celui du langage `R`. En `Python`, il existe deux gestionnaires de packages qu'on utilise diff --git a/content/getting-started/02_DS_environment.qmd b/content/getting-started/02_DS_environment.qmd index 7f007760b..7a4991822 100644 --- a/content/getting-started/02_DS_environment.qmd +++ b/content/getting-started/02_DS_environment.qmd @@ -1,5 +1,5 @@ --- -title: "L'environnement Python pour la data-science" +title: "L'environnement Python pour la data science" date: 2020-07-22T12:00:00Z draft: false weight: 30 @@ -29,7 +29,7 @@ selon que l'on est plutôt SysAdmin, développeur web ou data scientist. C'est ce dernier profil qui va ici nous intéresser. -Le data-scientist devant disposer de nombreuses cordes +Le data scientist devant disposer de nombreuses cordes à son arc. Cela se reflète sur l'écosystème de la _data-science_ qui est assez éclaté. Cependant, ce foisonnement n'est pas propre à `Python` puisque `R` propose encore plus de @@ -53,7 +53,7 @@ rapides de la recherche ou de la technologie. Ce [post](https://medium.com/data-science-library/ultimate-python-library-guide-for-data-science-2562148158bf), dont l'image ci-dessus est tirée, résume la plupart des packages utiles -pour un data-scientist ou un économiste/sociologue. Nous nous bornerons +pour un data scientist ou un économiste/sociologue. Nous nous bornerons ici à évoquer ceux utilisés quotidiennement. ### `numpy` @@ -165,7 +165,7 @@ résultats est très proche de ce qu’on trouve en `R`. `requests` est l'une des librairies de base de `Python`, dédiée à gérer la connexion avec internet. Les amateurs d'API seront des utilisateurs fréquents de celle-ci. Les -personnes plus spécialistes de _webscraping_ lui préféreront +personnes plus spécialistes de _web scraping_ l'utiliseront avec `beautifulsoup` qui offre une syntaxe extrêmement puissante pour récupérer automatiquement du contenu de pages web. @@ -246,16 +246,16 @@ qui est assez exigeant :sweating:, pour épouser les évolutions de l'écosystème. `Twitter` est une excellente source d'information pour être rapidement -au courant des évolutions du monde de la data-science. Les agrégateurs -de contenu comme `medium` ou `towarddatascience` proposent des _posts_ +au courant des évolutions du monde de la data science. Les agrégateurs +de contenu comme `medium` ou `towardsdatascience` proposent des _posts_ de qualité hétérogène mais il peut être utile de recevoir par mail -le _feed_ des nouveaux _posts_: au bout d'un certain temps, cela peut +le _feed_ des nouveaux _posts_ : au bout d'un certain temps, cela peut permettre de dégager les nouvelles tendances. Le site `realpython` propose généralement de très bon posts, complets et pédagogiques. En ce qui concerne les ouvrages papiers, certains sont de très bonne qualité. -Cependant, il convient de faire attention à la date de mise à jour de ceux-ci: +Cependant, il convient de faire attention à la date de mise à jour de ceux-ci : la vitesse d'évolution de certains éléments de l'écosystème peut les périmer très rapidement. diff --git a/content/getting-started/03_data_analysis.qmd b/content/getting-started/03_data_analysis.qmd index 44aa4a451..0fc43038c 100644 --- a/content/getting-started/03_data_analysis.qmd +++ b/content/getting-started/03_data_analysis.qmd @@ -26,7 +26,7 @@ nombre de gestes sont assez simple. Dans un projet sur des jeux de données, on peut schématiquement séparer les étapes en quatre grandes parties : -1. La récupération et structuration des données; +1. La récupération et structuration des données ; 2. L'analyse de celle-ci, notamment la production de statistiques descriptives indispensables pour orienter les exploitations ultérieures ; 3. La modélisation ; 4. La valorisation finale des étapes précédentes et la communication de résultats ou la mise en oeuvre d'une chaine de production. @@ -64,7 +64,7 @@ _est-ce que je peux les compléter avec d'autres données ?_ Vient ensuite la phase de mise en forme et nettoyage des jeux de données récupérés. Cette étape est primordiale et est généralement celle qui mobilise le plus -de temps. Pendant quelques années, on parlait de _data-cleaning_. Cependant, +de temps. Pendant quelques années, on parlait de _data cleaning_. Cependant, cela a pu, implicitement, laisser penser qu'il s'agissait d'une tâche subalterne. On commence à lui préférer le concept de _feature engineering_ qui souligne bien qu'il s'agit d'une compétence qui nécessite beaucoup @@ -73,14 +73,14 @@ de compétences. Un jeu de données propre est un jeu de données dont la structure est adéquate et n'entraînera pas d'erreur, visible ou non, lors de la phase d'analyse. Voici quelques éléments structurants -d'un jeu de données propre: +d'un jeu de données propre : - les __informations manquantes__ sont bien comprises et traitées. `numpy` et `pandas` proposent un certain formalisme sur le sujet qu'il est utile d'adopter en remplaçant par `NaN` les observations manquantes. Cela implique de faire attention à la manière dont certains producteurs -codent les valeurs manquantes: certains ont la facheuse tendance à -être imaginatifs sur les codes pour valeurs manquantes: _"-999"_, _"XXX"_, _"NA"_ +codent les valeurs manquantes : certains ont la facheuse tendance à +être imaginatifs sur les codes pour valeurs manquantes : _"-999"_, _"XXX"_, _"NA"_ - les __variables servant d'identifiants__ sont bien les mêmes d'une table à l'autre (notamment dans le cas de jointure) : même format, même modalités - pour des __variables textuelles__, qui peuvent etre mal saisies, avoir corrigé les éventuelles fautes (ex "Rolland Garros" -> "Roland Garros") - créer des variables qui synthétisent l'information dont vous avez besoin @@ -97,18 +97,18 @@ en réalité vous devrez régulièrement passer de votre nettoyage à quelques s Les questions à se poser pour _"challenger"_ le jeu de données : -- est-ce que mon échantillon est bien __représentatif__ de ce qui m'intéresse ? N'avoir que 2000 communes sur les 35000 n'est pas nécessairement un problème mais il est bon de s'être posé la question. -- est-ce que les __ordres de grandeur__ sont bons ? pour cela, confronter vos premieres stats desc à vos recherches internet. Par exemple trouver que les maisons vendues en France en 2020 font en moyenne 400 m² n'est pas un ordre de grandeur réaliste. -- est-ce que je __comprends toutes les variables__ de mon jeu de données ? est-ce qu'elles se "comportent" de la bonne façon ? à ce stade, il est parfois utile de se faire un dictionnaire de variable (qui explique comment elles sont construites ou calculées). On peut également mener des études de __corrélation__ entre nos variables. -- est-ce que j'ai des __outliers__, i.e. des valeurs aberrantes pour certains individus ? Dans ce cas, il faut décider quel traitement on leur apporte (les supprimer, appliquer une transformation logarithmique, les laisser tel quel) et surtout bien le justifier. -- est-ce que j'ai des __premiers grands messages__ sortis de mon jeu de données ? est-ce que j'ai des résultats surprenants ? Si oui, les ai-je creusé suffisamment pour voir si les résultats tiennent toujours ou si c'est à cause d'un souci dans la construction du jeu de données (mal nettoyées, mauvaise variable...) +- Est-ce que mon échantillon est bien __représentatif__ de ce qui m'intéresse ? N'avoir que 2000 communes sur les 35000 n'est pas nécessairement un problème mais il est bon de s'être posé la question. +- Est-ce que les __ordres de grandeur__ sont bons ? Pour cela, confronter vos premieres stats desc à vos recherches internet. Par exemple trouver que les maisons vendues en France en 2020 font en moyenne 400 m² n'est pas un ordre de grandeur réaliste. +- Est-ce que je __comprends toutes les variables__ de mon jeu de données ? Est-ce qu'elles se "comportent" de la bonne façon ? A ce stade, il est parfois utile de se faire un dictionnaire de variables (qui explique comment elles sont construites ou calculées). On peut également mener des études de __corrélation__ entre nos variables. +- Est-ce que j'ai des __outliers__, i.e. des valeurs aberrantes pour certains individus ? Dans ce cas, il faut décider quel traitement on leur apporte (les supprimer, appliquer une transformation logarithmique, les laisser tel quel) et surtout bien le justifier. +- Est-ce que j'ai des __premiers grands messages__ sortis de mon jeu de données ? Est-ce que j'ai des résultats surprenants ? Si oui, les ai-je creusé suffisamment pour voir si les résultats tiennent toujours ou si c'est à cause d'un souci dans la construction du jeu de données (mal nettoyées, mauvaise variable...) ## Lors de la modélisation A cette étape, l'analyse descriptive doit voir avoir donné quelques premières pistes pour savoir dans quelle direction vous voulez mener votre modèle. Une erreur de débutant est de se lancer directement dans la modélisation parce qu'il s'agirait d'une compétence plus poussée. Cela amène généralement -à des analyses de pauvre qualité: la modélisation tend généralement à confirmer +à des analyses de pauvre qualité : la modélisation tend généralement à confirmer les intuitions issues de l'analyse descriptive. Sans cette dernière, l'interprétation des résultats d'un modèle peu s'avérer inutilement complexe. @@ -179,7 +179,7 @@ Avouac et moi revenons sur les moyens de communication et de partage de code alt -## Ethique et responsabilité du data-scientist +## Ethique et responsabilité du data scientist ### La reproductibilité est importante @@ -350,7 +350,7 @@ plus massives, notamment la constitution de corpus monumentaux de textes, récupérés par scraping, est une première source de dépense d'énergie. De même, la récupération -en continue de nouvelles traces numériques +en continu de nouvelles traces numériques nécessite d'avoir des serveurs fonctionnels en continu. A cette première source de dépense d'énergie, s'ajoute l'entraînement diff --git a/content/getting-started/04_python_practice.qmd b/content/getting-started/04_python_practice.qmd index 956a7263d..ded41fbbc 100644 --- a/content/getting-started/04_python_practice.qmd +++ b/content/getting-started/04_python_practice.qmd @@ -111,7 +111,7 @@ Une fois que `modu.py` est trouvé, il sera exécuté dans un environnement isol aux dépendances renseignées) et le résultat rendu disponible à l'interpréteur `Python` pour un usage dans la session via le *namespace* (espace où python associe les noms donnés aux objets). -En premier lieu, ne **jamais** utiliser la syntaxe suivante: +En premier lieu, ne **jamais** utiliser la syntaxe suivante : ~~~python # A NE PAS UTILISER @@ -120,7 +120,7 @@ x = sqrt(4) # Is sqrt part of modu? A builtin? Defined above? ~~~ L'utilisation de la syntaxe `import *` créé une ambiguité sur les fonctions disponibles dans l'environnement. Le code -est ainsi moins clair, moins compartimenté et ainsi moins robuste. La syntaxe à privilégier est la suivante: +est ainsi moins clair, moins compartimenté et ainsi moins robuste. La syntaxe à privilégier est la suivante : ~~~python import modu @@ -180,7 +180,7 @@ programmation qui est à utiliser avec parcimonie. ## Documenter les fonctions {.docfonctions} -La documentation d'une fonction s'appelle le `docstring`. Elle prend la forme suivante: +La documentation d'une fonction s'appelle le `docstring`. Elle prend la forme suivante : ~~~python def square_and_rooter(x): @@ -211,12 +211,12 @@ la fonction produit bien un résultat espéré dans une expérience contrôlée. En fait, il existe deux types de tests: -* tests unitaires: on teste seulement une fonctionalité ou propriété -* tests d'intégration: on teste l'intégration de la fonction dans un ensemble plus large de fonctionalité +* tests unitaires : on teste seulement une fonctionalité ou propriété +* tests d'intégration : on teste l'intégration de la fonction dans un ensemble plus large de fonctionalités -Ici, on va plutôt se focaliser sur la notion de test unitaire ; la notion de +Ici, on va plutôt se focaliser sur la notion de test unitaire, la notion de test d'intégration nécessitant d'avoir une chaîne plus complète de fonctions (mais il ne faut -pas la négliger) +pas la négliger). On peut partir du principe suivant: diff --git a/content/getting-started/05_rappels_types.qmd b/content/getting-started/05_rappels_types.qmd index 3b0de5e36..bfab6dc27 100644 --- a/content/getting-started/05_rappels_types.qmd +++ b/content/getting-started/05_rappels_types.qmd @@ -165,7 +165,7 @@ Par contre, la fonction `addition_v2` permet d'avoir un objet de type `int`, un entier donc. -## Les types de base : variables, listes, dictionnaires ... +## Les types de base : variables, listes, dictionnaires... `Python` permet de manipuler différents types de base. Nous en verrons des extensions dans la suite du cours (`np.array` par exemple) @@ -412,7 +412,7 @@ nous allons voir comment nous en servir. Pour comprendre comment modifier un objet, il convient de distinguer deux concepts, développés plus amplement -dans le chapitre dédié: les __attributs__ et les __méthodes__: +dans le chapitre dédié: les __attributs__ et les __méthodes__ : - Les _attributs_ décrivent la structure interne d'un objet. Par exemple, la taille d'un objet, sa langue, etc. diff --git a/content/getting-started/index.qmd b/content/getting-started/index.qmd index ea5ec7819..ce83c8037 100644 --- a/content/getting-started/index.qmd +++ b/content/getting-started/index.qmd @@ -16,7 +16,7 @@ bibliography: "../../reference.bib" # Introduction Ce cours rassemble l'ensemble du contenu du cours -*Python {{< fa brands python >}} pour la data-science* que je donne +*Python {{< fa brands python >}} pour la data science* que je donne à l'[ENSAE](https://www.ensae.fr/courses/python-pour-le-data-scientist-pour-leconomiste/) depuis 2018. Ce cours était auparavant donné par [Xavier Dupré](http://www.xavierdupre.fr/app/ensae_teaching_cs/helpsphinx3/td_2a.html). @@ -43,7 +43,7 @@ depuis quelques années - ou des chercheurs dans des champs à la fois théoriques et appliqués. Contrairement à beaucoup de langages informatiques qui fédèrent une communauté assez homogène, `Python` est parvenu à réunir -largement grâce à quelques principes centraux: la lisibilité +largement grâce à quelques principes centraux : la lisibilité du langage, la simplicité à utiliser des modules, la simplicité à l'associer à des langages plus performants pour certaines tâches données, l'énorme volume de documentation @@ -109,7 +109,7 @@ modèles équivalents. Dans le domaine du _Deep Learning_, `Python` écrase la concurrence. Au contraire, dans certains domaines, `R` reste meilleur, même si les évolutions très récentes de certains outils peuvent amener à réviser -ce constant. Historiquement, +ce constat. Historiquement, `R` était très bien intégré au langage de publication `Markdown` ce qui, permet la construction de documents reproductibles très raffinés. L'émergence récente de `Quarto`, héritier de `R Markdown` développé par @@ -150,7 +150,7 @@ pratiques peuvent être transposées de manière presque transparente d'un langage à l'autre. Il s'agit d'un point qui est développé plus amplement dans le cours plus avancé que je donne avec Romain Avouac en dernière année d'ENSAE: [ensae-reproductibilite.github.io/website](https://ensae-reproductibilite.github.io/website). -A terme, les data-scientists et chercheurs en sciences sociales ou +A terme, les data scientists et chercheurs en sciences sociales ou économie utiliseront de manière presque indifférente, et en alternance, `Python` et `R`. Ce cours présentera ainsi régulièrement des analogies avec `R` pour aider les @@ -201,7 +201,7 @@ Je donne également un cours, plus avancé, sur ce sujet à l'ENSAE avec Romain Avouac: -https://ensae-reproductibilite.github.io/website/. +[ensae-reproductibilite.github.io/website](https://ensae-reproductibilite.github.io/website). @@ -220,7 +220,7 @@ plutôt nécessaire dans l'interprétation des résultats. Cependant, la facilité avec laquelle il est possible de construire des modèles complexes avec `Python` peut laisser apparaître que connaître les spécifités de chaque modèle est inutile. Il -s'agirait d'une grave erreur: même si l'implémentation de modèles est aisée, il +s'agirait d'une grave erreur : même si l'implémentation de modèles est aisée, il est nécessaire de bien comprendre la structure des données et leur adéquation avec les hypothèses d'un modèle. @@ -249,7 +249,7 @@ pour être redirigé vers le dépôt `Github` associé à ce cours. page web en `Jupyter Notebooks` s'il est nécessaire de visualiser ou exécuter du code `Python`. -Voici, par exemple, ces boutons pour le tutoriel `Numpy` +Voici, par exemple, ces boutons pour le tutoriel `numpy` : ```{python} #| echo: false diff --git a/content/git/exogit.qmd b/content/git/exogit.qmd index 8fafcd6a1..3b97404fc 100644 --- a/content/git/exogit.qmd +++ b/content/git/exogit.qmd @@ -58,7 +58,7 @@ et des ressources de la documentation collaborative sur `R` qu'est `utilitR` ([des éléments sur la configuration](https://www.book.utilitr.org/03_fiches_thematiques/fiche_configurer_git) et [pratique sur RStudio](https://www.book.utilitr.org/03_fiches_thematiques/fiche_git_utilisation)). Toutes les ressources ne sont donc pas du `Python` car `Git` est un outil tranversal -qui doit servir quelque soit le langage de prédilection. +qui doit servir quel que soit le langage de prédilection. L'idée de ce chapitre est d'amener, progressivement, à la mise en oeuvre de pratiques collaboratives devenues standards dans le domaine de l'_open-source_ @@ -575,7 +575,7 @@ git remote -v Le dépôt distant s'appelle `remote` en langage Git. L'option `-v` (*verbose*) permet de lister le(s) dépôt(s) distant(s). Le résultat devrait avoir la -structure suivante: +structure suivante : ```raw origin https://github.com//.git (fetch) @@ -623,7 +623,7 @@ le bouton `Code` comme ci-dessous ![](gitclone.png) 2. Créer la connexion avec le dépôt distant (`remote`), qu'on va nommer `origin`, -en utilisant la commande suivante: +en utilisant la commande suivante : ~~~~shell git remote add origin **** @@ -650,7 +650,7 @@ dessus) vers mon dépôt (alias Normalement, si vous avez utilisé le `credential helper`, `Git` ne vous demande pas vos identifiants de connexion. Sinon, il faut taper -votre identifiant github et **votre mot de passe correspond au personal access token nouvellement créé** ! +votre identifiant Github et **votre mot de passe correspond au personal access token nouvellement créé** ! @@ -1128,7 +1128,7 @@ Régler le conflit et valider (`add` et `commit`). Pousser le résultat. Le main :seven: L'auteur (si 2 développeurs) ou les deux auteurs (si 3 développeurs) de la `pull request` non validée doivent à nouveau répéter l'opération 6. -:eight: Une fois le conflit de version réglé et poussé, le mainteneur valide la `pull request` selon la même procédure que précedemment. +:eight: Une fois le conflit de version réglé et poussé, le mainteneur valide la `pull request` selon la même procédure que précédemment. :nine: Vérifier l'arborescence du dépôt dans `Insights > Network`. Votre arbre doit avoir une forme caractéristique de ce qu'on appelle le `Github flow`: diff --git a/content/git/index.qmd b/content/git/index.qmd index cd8b61577..c4ed09566 100644 --- a/content/git/index.qmd +++ b/content/git/index.qmd @@ -1,5 +1,5 @@ --- -title: "Git: un outil nécessaire pour les data-scientists" +title: "Git: un outil nécessaire pour les data scientists" date: 2020-07-16T13:00:00Z draft: false weight: 70 @@ -9,7 +9,7 @@ icon_pack: fab description: | Une partie annexe au cours pour découvrir `Git`, un outil - devenu indispensable pour les data-scientists + devenu indispensable pour les data scientists afin de mener des projets impliquant du code `Python`. type: book diff --git a/content/git/introgit.qmd b/content/git/introgit.qmd index 48eb45351..1f040ad9e 100644 --- a/content/git/introgit.qmd +++ b/content/git/introgit.qmd @@ -208,7 +208,7 @@ Cela signifie que: * Chaque membre d'un projet travail sur une copie locale du dépôt (système *decentralisé*). Cette copie de travail s'appelle un `clone`. -Cela signifie qu'on n'a pas une cohérence en continue de notre version +Cela signifie qu'on n'a pas une cohérence en continu de notre version de travail avec le dépôt ; on peut très bien ne jamais vouloir les mettre en cohérence (par exemple, si on teste une piste qui s'avère infructueuse) ; diff --git a/content/manipulation/01_numpy.qmd b/content/manipulation/01_numpy.qmd index 0cb2001ae..6edacfebd 100644 --- a/content/manipulation/01_numpy.qmd +++ b/content/manipulation/01_numpy.qmd @@ -46,7 +46,7 @@ sur une fonction. Dans ce chapitre, on ne dérogera pas à la convention qui s'est imposée d'importer `numpy` de la -manière suivante: +manière suivante : ```{python import np} import numpy as np @@ -205,7 +205,7 @@ L'indexation est dans ce cas similaire à celle d'une liste: * le premier élément est 0 * le énième élément est accessible à la position $n-1$ -La logique d'accès aux éléments est ainsi la suivante: +La logique d'accès aux éléments est ainsi la suivante : ~~~python x[start:stop:step] @@ -494,7 +494,7 @@ Voici quelques fonctions pour modifier un array, | Opération | Implémentation | |-----------|----------------| -| Applatir un array | `x.flatten()` (méthode) | +| Aplatir un array | `x.flatten()` (méthode) | | Transposer un array | `x.T` (méthode) ou `np.transpose(x)` (fonction) | | Ajouter des éléments à la fin | `np.append(x, [1,2])` | | Ajouter des éléments à un endroit donné (aux positions 1 et 2) | `np.insert(x, [1,2], 3)` | diff --git a/content/manipulation/02a_pandas_tutorial.qmd b/content/manipulation/02a_pandas_tutorial.qmd index cdf1c97a9..031ba373b 100644 --- a/content/manipulation/02a_pandas_tutorial.qmd +++ b/content/manipulation/02a_pandas_tutorial.qmd @@ -43,7 +43,7 @@ print_badges("content/manipulation/02a_pandas_tutorial.qmd") ::: Le _package_ `Pandas` est l'une des briques centrales de l'écosystème de -la data-science. Son créateur, Wes McKinney, l'a pensé comme +la data science. Son créateur, Wes McKinney, l'a pensé comme une surcouche à la librairie `Numpy` pour introduire le _DataFrame_ qui est un objet central dans des langages comme `R` ou `Stata` mais qui était absent dans `Python`. `Pandas` est rapidement @@ -368,7 +368,7 @@ Le `DataFrame` est l'objet central de la librairie `pandas`. Il s'agit d'une collection de `pandas.Series` (colonnes) alignées par les index. Les types des variables peuvent différer. -Un `DataFrame` non-indexé a la structure suivante: +Un `DataFrame` non-indexé a la structure suivante : ```{python} #| echo: false @@ -381,7 +381,7 @@ df = pd.DataFrame( df.reset_index() ``` -Alors que le même `DataFrame` indexé aura la structure suivante: +Alors que le même `DataFrame` indexé aura la structure suivante : ```{python} #| echo: false @@ -976,7 +976,7 @@ entre des labels (valeurs des variables de groupe) et des observations. Par exemple, pour compter le nombre de communes par département en SQL, on -utiliserait la requête suivante: +utiliserait la requête suivante : ```sql SELECT dep, count(INSEE commune) @@ -1044,7 +1044,7 @@ Cependant, toutes les `lambda` functions ne se justifient pas. Par exemple, prenons le résultat d'agrégation précédent. Imaginons qu'on désire avoir les résultats en milliers de tonnes. Dans ce cas, le premier réflexe est d'utiliser -la `lambda` function suivante: +la `lambda` function suivante : ```{python} numeric_columns = df.select_dtypes(['number']).columns @@ -1117,8 +1117,8 @@ Se référer à la documentation de `concat` pour voir les options possibles. On présente généralement deux types de données: -* format __wide__: les données comportent des observations répétées, pour un même individu (ou groupe), dans des colonnes différentes -* format __long__: les données comportent des observations répétées, pour un même individu, dans des lignes différentes avec une colonne permettant de distinguer les niveaux d'observations +* format __wide__ : les données comportent des observations répétées, pour un même individu (ou groupe), dans des colonnes différentes +* format __long__ : les données comportent des observations répétées, pour un même individu, dans des lignes différentes avec une colonne permettant de distinguer les niveaux d'observations Un exemple de la distinction entre les deux peut être emprunté à l'ouvrage de référence d'Hadley Wickham, *R for Data Science*: diff --git a/content/manipulation/02b_pandas_TP.qmd b/content/manipulation/02b_pandas_TP.qmd index 4e1ab7bf7..b64dbee71 100644 --- a/content/manipulation/02b_pandas_TP.qmd +++ b/content/manipulation/02b_pandas_TP.qmd @@ -443,8 +443,8 @@ df_copy2 = df_copy2.reset_index() On présente généralement deux types de données : -* format __wide__: les données comportent des observations répétées, pour un même individu (ou groupe), dans des colonnes différentes -* format __long__: les données comportent des observations répétées, pour un même individu, dans des lignes différentes avec une colonne permettant de distinguer les niveaux d'observations +* format __wide__ : les données comportent des observations répétées, pour un même individu (ou groupe), dans des colonnes différentes +* format __long__ : les données comportent des observations répétées, pour un même individu, dans des lignes différentes avec une colonne permettant de distinguer les niveaux d'observations Un exemple de la distinction entre les deux peut être pris à l'ouvrage de référence d'Hadley Wickham, *R for Data Science*: diff --git a/content/manipulation/03_geopandas_TP.qmd b/content/manipulation/03_geopandas_TP.qmd index d0d96022e..db7a3c8f9 100644 --- a/content/manipulation/03_geopandas_TP.qmd +++ b/content/manipulation/03_geopandas_TP.qmd @@ -141,7 +141,7 @@ communes_borders.crs # Les données sont en WGS84, on les reprojette en lambert 93 ``` -La carte du 92 est la suivante: +La carte du 92 est la suivante : ```{python} # 4) afficher les communes du département 92 diff --git a/content/manipulation/03_geopandas_tutorial.qmd b/content/manipulation/03_geopandas_tutorial.qmd index 3403473a2..7ff9af794 100644 --- a/content/manipulation/03_geopandas_tutorial.qmd +++ b/content/manipulation/03_geopandas_tutorial.qmd @@ -250,7 +250,7 @@ de carte consolidés comme celui dont on a besoin ici: arrondissements dans Paris, communes ailleurs. Comme cela est expliqué dans un encadré à part, il s'agirait d'une opération pénible à mettre en oeuvre sans `cartiflette`. -Les contours de cet espace peuvent être récupérés de la manière suivante: +Les contours de cet espace peuvent être récupérés de la manière suivante : ```{python} import cartiflette.s3 as s3 diff --git a/content/manipulation/04a_webscraping_TP.qmd b/content/manipulation/04a_webscraping_TP.qmd index 1a3674f59..ef8cfac89 100644 --- a/content/manipulation/04a_webscraping_TP.qmd +++ b/content/manipulation/04a_webscraping_TP.qmd @@ -15,7 +15,7 @@ categories: type: book description: | `Python` permet de facilement récupérer une page web pour en extraire des - données à restructurer. Le webscraping, que les Canadiens nomment + données à restructurer. Le web scraping, que les Canadiens nomment _"moissonnage du web"_, est une manière de plus en plus utilisée de récupérer une grande masse d'information en temps réel. eval: false @@ -47,10 +47,10 @@ Ce chapitre est très fortement inspiré et réadapté à partir de [celui de Xa ## Enjeux -Un certain nombre d'enjeux du _webscraping_ ne seront évoqués +Un certain nombre d'enjeux du _web scraping_ ne seront évoqués que superficiellement dans le cadre de ce chapitre. -### La zone grise de la légalité du _webscraping_ +### La zone grise de la légalité du _web scraping_ En premier lieu, en ce qui concerne la question de la légalité de la récupération d'information par _scraping_, il existe @@ -64,17 +64,17 @@ Dans le champ français, la CNIL a publié en 2020 de nouvelles directives sur le *webscraping* reprécisant que toute donnée ne peut être réutilisée à l'insu de la personne à laquelle ces données appartiennent. Autrement dit, en principe, -les données collectées par _webscraping_ sont soumises au +les données collectées par _web scraping_ sont soumises au RGPD, c'est-à-dire nécessitent le consentement des personnes à partir desquelles la réutilisation des données est faite. Il est donc recommandé d'__être vigilant avec les données récupérées__ -par _webscraping_ pour ne pas se mettre en faute légalement. +par _web scraping_ pour ne pas se mettre en faute légalement. ### Stabilité et fiabilité des informations reçues -La récupération de données par _webscraping_ +La récupération de données par _web scraping_ est certes pratique mais elle ne correspond pas nécessairement à un usage pensé, ou désiré, par un fournisseur de données. Les données étant coûteuses à collecter et à mettre à disposition, @@ -100,7 +100,7 @@ proche de celui de l'humain mais sans contrefaire le fait qu'il ne s'agit pas d'un humain. Il convient d'ailleurs -d'être prudent quant aux informations reçues par _webscraping_. +d'être prudent quant aux informations reçues par _web scraping_. La donnée étant au coeur du modèle économique de certains acteurs, certains n'hésitent pas à renvoyer des données fausses aux robots plutôt que les bloquer. C'est de bonne guerre! @@ -109,10 +109,10 @@ n'irait jamais visiter - par exemple parce qu'elles n'apparaissent pas dans l'interface graphique - mais sur lesquelles un robot, en recherche automatique de contenu, va rester bloquer. -Sans aller jusqu'à la stratégie de blocage du _webscraping_, d'autres raisons +Sans aller jusqu'à la stratégie de blocage du _web scraping_, d'autres raisons peuvent expliquer qu'une récupération de données ait fonctionné par le passé mais ne fonctionne plus. La plus fréquente est un changement dans la structure -d'un site _web_. Le _webscraping_ présente en effet l'inconvénient d'aller chercher +d'un site _web_. Le _web scraping_ présente en effet l'inconvénient d'aller chercher de l'information dans une structure très hiérarchisée. Un changement dans cette structure peut suffire à rendre un robot incapable de récupérer du contenu. Or, pour rester attractifs, les sites _web_ changent fréquemment ce qui peut facilement @@ -124,7 +124,7 @@ __webscraping est une solution de dernier ressort, pour des récupérations ponc Ces dernières ressemblent à un contrat (formel ou non) entre un fournisseur de données et un utilisateur où sont définis des besoins (les données) mais aussi des conditions d'accès (nombre de requêtes, volumétrie, authentification...) là -où le _webscraping_ est plus proche du comportement dans le _Far West_. +où le _web scraping_ est plus proche du comportement dans le _Far West_. ### Les bonnes pratiques @@ -132,7 +132,7 @@ La possibilité de récupérer des données par l'intermédiaire d'un robot ne signifie pas qu'on peut se permettre de n'être pas civilisé. En effet, lorsqu'il est non-maîtrisé, le _webscraping_ peut ressembler à une attaque informatique -classique pour faire sauter un site _web_: le déni de service. +classique pour faire sauter un site _web_ : le déni de service. Le cours d'[Antoine Palazzolo](https://inseefrlab.github.io/formation-webscraping/) revient sur certaines bonnes pratiques qui ont émergé dans la communauté des _scrapeurs_. Il est recommandé de lire cette ressource @@ -693,7 +693,7 @@ for i in range(0,len(gdf)): m.fit_bounds([sw, ne]) ``` -La carte obtenue doit ressembler à la suivante: +La carte obtenue doit ressembler à la suivante : ```{python} #| eval : false @@ -704,7 +704,7 @@ m ## Récupérer des informations sur les pokemons -Le prochain exercice pour mettre en pratique le _webscraping_ +Le prochain exercice pour mettre en pratique le _web scraping_ consiste à récupérer des informations sur les pokemons à partir du site internet [pokemondb.net](http://pokemondb.net/pokedex/national). @@ -1194,7 +1194,7 @@ Sur `Colab`, vous pouvez utiliser les commandes suivantes: !cp /usr/lib/chromium-browser/chromedriver /usr/bin ``` -Si vous êtes sur le `SSP-Cloud`, vous pouvez +Si vous êtes sur le `SSP Cloud`, vous pouvez exécuter les commandes suivantes: ```{python} @@ -1550,7 +1550,7 @@ for ministre in tqdm(ministres): ``` _In fine_, on obtient une liste dont le premier élément -prend la forme suivante: +prend la forme suivante : ```{python} liste[0] diff --git a/content/manipulation/04b_regex_TP.qmd b/content/manipulation/04b_regex_TP.qmd index a766b4a87..0397ae4af 100644 --- a/content/manipulation/04b_regex_TP.qmd +++ b/content/manipulation/04b_regex_TP.qmd @@ -46,7 +46,7 @@ succès dans la communauté du traitement automatisé du langage (NLP, voir part Dans les chapitres précédents, nous avons parfois été amenés à chercher des éléments textuels basiques. Cela était possible avec la méthode `str.find` du package `Pandas` qui constitue une version vectorisée de la méthode `find` de base. Nous avons d'ailleurs -pu utiliser cette dernière directement, notamment lorsqu'on a fait du _webscraping_. +pu utiliser cette dernière directement, notamment lorsqu'on a fait du _web scraping_. Cependant, cette fonction de recherche trouve rapidement ses limites. @@ -125,8 +125,8 @@ print(re.search(pattern, "La soupe est chaude.")) La regex précédente comportait deux types de caractères: -- les _caractères littéraux_: lettres et nombres qui sont reconnus de manière littérale -- les _méta-caractères_: symboles qui ont un sens particulier dans les regex. +- les _caractères littéraux_ : lettres et nombres qui sont reconnus de manière littérale +- les _méta-caractères_ : symboles qui ont un sens particulier dans les regex. Les principaux _méta-caractères_ sont `.`, `+`, `*`, `[`, `]`, `^` et `$` mais il en existe beaucoup d'autres. @@ -331,7 +331,7 @@ les exemples précédents sur une `regex` un peu plus complète. Cet exercice ne nécessite pas la connaissance des subtilités du _package_ `re`, vous n'aurez besoin que de `re.findall`. -Cet exercice utilisera la chaine de caractère suivante: +Cet exercice utilisera la chaine de caractère suivante : ```{python} s = """date 0 : 14/9/2000 @@ -460,14 +460,14 @@ re.match("(to){2}", "toto à la plage") `re.search` est plus puissant que `re.match`, on peut capturer des termes quelle que soit leur position -dans un _string_. Par exemple, pour capturer _age_: +dans un _string_. Par exemple, pour capturer _age_ : ```{python} re.search("age", "toto a l'age d'aller à la plage") ``` Et pour capturer exclusivement _"age"_ en fin -de _string_: +de _string_ : ```{python} re.search("age$", "toto a l'age d'aller à la plage") @@ -616,7 +616,7 @@ df['a'].str.replace("ti$", " punch")
Exemple de str.contains 👇 ``` -Vérifions les cas où notre ligne termine par _"ti"_: +Vérifions les cas où notre ligne termine par _"ti"_ : ```{python} df = pd.DataFrame({"a": ["toto", "titi"]}) diff --git a/content/manipulation/04c_API_TP.qmd b/content/manipulation/04c_API_TP.qmd index b64cd25ce..1e1505527 100644 --- a/content/manipulation/04c_API_TP.qmd +++ b/content/manipulation/04c_API_TP.qmd @@ -157,7 +157,7 @@ L'exemple donné dans la documentation technique est ce qui en python se traduira par l'utilisation de la méthode `get` du package `request` -sur un url dont la structure est la suivante: +sur un url dont la structure est la suivante : - il commencera par `https://koumoul.com/data-fair/api/v1/datasets/dpe-france/values/` ; - il sera ensuite suivi par des paramètres de recherche? Le champ `{field}` @@ -180,7 +180,7 @@ il convient de passer le code commune sous le format: mauvais formatage, on va utiliser `%3A%` pour signifier `:` - D'autres paramètres annexes, suggérés par la documentation -Cela nous donne ainsi un URL dont la structure est la suivante: +Cela nous donne ainsi un URL dont la structure est la suivante : ```{python} code_commune="01450" @@ -248,7 +248,7 @@ dpe.head(2) Essayons de représenter sur une carte ces DPE avec les années de construction des logements. -Avec `folium`, on obtient la carte interactive suivante: +Avec `folium`, on obtient la carte interactive suivante : ```{python} import seaborn as sns @@ -597,7 +597,7 @@ moyenne_nationale = (df['B_NB']*df['B_TR']).sum()/df['B_NB'].sum() print("Sur cet échantillon, le taux de réussite moyen était, en 2018, de {:.2%}".format(moyenne_nationale/100)) ``` -Nos informations géographiques prennent la forme suivante: +Nos informations géographiques prennent la forme suivante : ```{python} df.loc[:,['Adresse','CP','Ville']].head(5) diff --git a/content/manipulation/06a_exo_supp_webscraping.qmd b/content/manipulation/06a_exo_supp_webscraping.qmd index 83c82239c..234368be8 100644 --- a/content/manipulation/06a_exo_supp_webscraping.qmd +++ b/content/manipulation/06a_exo_supp_webscraping.qmd @@ -15,7 +15,7 @@ categories: - Manipulation type: book summary: | - Un exercice supplémentaire de _webscraping_, + Un exercice supplémentaire de _web scraping_, où l'on construit de manière automatique sa liste de courses à partir des données de [`Marmiton`](https://www.marmiton.org/). eval: false @@ -38,10 +38,10 @@ print_badges("content/manipulation/06a_exo_supp_webscraping.qmd") ``` ::: -Cette page présente une série d'exercices de webscraping. Ils permettent +Cette page présente une série d'exercices de web scraping. Ils permettent d'aller plus loin que le [chapitre dédié](#webscraping) -## Construction automatisée d'une liste de courses via webscraping :spaghetti: :pizza: :strawberry: +## Construction automatisée d'une liste de courses via web scraping :spaghetti: :pizza: :strawberry: Les comptes sont dans le rouge, le banquier appelle tous les jours. Plus le choix : fini les commandes de plats tout faits via des plateformes bien connues, @@ -54,7 +54,7 @@ Heureusement, [Marmiton](https://www.marmiton.org/) est là pour nous. Dans ce TP, on va construire un outil Python qui permet d'exporter directement une liste de courses, en fonctions des plats que l'on a envie de manger cette semaine. Et tout ça en *webscrapant* les données de Marmiton. Plus d'excuse ! -Pour cet exercice, on va utiliser principalement trois librairies très utilisées en webscraping : +Pour cet exercice, on va utiliser principalement trois librairies très utilisées en web scraping : * `requests` & `BeautifulSoup` pour scraper des pages statiques ; * `selenium` lorsque l'on aura besoin d'interagir avec les éléments scriptés des pages web. @@ -194,7 +194,7 @@ pertinent d'utiliser les [sélécteurs XPath](https://fr.wikipedia.org/wiki/XPat qui permettent de sélectionner les éléments selon leur position dans l'arborescence html de la page. On utilisera une combinaison des deux méthodes dans cette partie selon les cas. -On le voit, le webscraping reste une pratique assez instable, +On le voit, le web scraping reste une pratique assez instable, dans la mesure où les sites web évoluent en permanence. Il y a ainsi toutes les chances qu'au moment où vous effectuerez ce TP, le code proposé en solution ne fonctionne plus, car les balises auront changé. diff --git a/content/manipulation/07_dask.qmd b/content/manipulation/07_dask.qmd index b8e380bcc..4fa945dac 100644 --- a/content/manipulation/07_dask.qmd +++ b/content/manipulation/07_dask.qmd @@ -46,7 +46,7 @@ print_badges("content/manipulation/07_dask.qmd") La documentation complète sur `Dask` se trouve sur . Le projet requiert l'installation de `dask`. Afin d'avoir -la distribution complète on utilise la commande suivante: +la distribution complète on utilise la commande suivante : ```shell pip install dask[complete] @@ -131,7 +131,7 @@ car la volumétrie accède la RAM disponible. Ici on travaille sur un `DataFrame` d'environ 3.5 millions de lignes et 44 variables. L'objet `dvf` est un `pandas.DataFrame` -qui tient en mémoire sur le `SSP-Cloud` ou sur les serveurs utilisés +qui tient en mémoire sur le `SSP Cloud` ou sur les serveurs utilisés pour construire ce site web. ::: {.cell .markdown} @@ -235,7 +235,7 @@ des bases intermédiaires. ::: -On peut accéder aux index que couvrent les partitions de la manière suivante: +On peut accéder aux index que couvrent les partitions de la manière suivante : ```{python} dvf_dd.divisions @@ -473,7 +473,7 @@ def ajout_aire_perim(a, b): Sans _timer_, c'est-à-dire de manière classique, on ferait nos appels de fonctions de la -manière suivante: +manière suivante : ```{python} start_time = time.time() @@ -485,7 +485,7 @@ print(time.time() - start_time) ``` Avec le décorateur `dask.delayed`, on définit -nos fonctions de la manière suivante: +nos fonctions de la manière suivante : ```{python} import dask diff --git a/content/manipulation/index.qmd b/content/manipulation/index.qmd index ae854d5a1..ad69b483f 100644 --- a/content/manipulation/index.qmd +++ b/content/manipulation/index.qmd @@ -112,7 +112,7 @@ L'écosystème `Pandas` représente donc un couteau-suisse pour l'analyse de données. C'est pour cette raison que ce cours développera beaucoup de contenu dessus. Avant d'essayer de mettre en oeuvre une solution _ad hoc_, il est -souvent utile de se poser la question suivante: _"ne pourrais-je pas le faire +souvent utile de se poser la question suivante : _"ne pourrais-je pas le faire avec les fonctionalités de base de `Pandas` ?"_ Se poser cette question peut éviter des chemins ardus et faire économiser beaucoup de temps. diff --git a/content/modelisation/3_regression.qmd b/content/modelisation/3_regression.qmd index 96915d866..4be7361fa 100644 --- a/content/modelisation/3_regression.qmd +++ b/content/modelisation/3_regression.qmd @@ -145,14 +145,14 @@ $$ \theta = \arg \min_{\theta \in \Theta} \mathbb{E}\bigg[ \left( y - h_\theta(X) \right)^2 \bigg] $$ -Ce qui, dans le cadre de la régression linéaire, s'exprime de la manière suivante: +Ce qui, dans le cadre de la régression linéaire, s'exprime de la manière suivante : $$ \beta = \arg\min \mathbb{E}\bigg[ \left( y - X\beta \right)^2 \bigg] $$ Lorsqu'on amène le modèle théorique ($\mathbb{E}_\theta(Y|X) = X\beta$) aux données, -on formalise le modèle de la manière suivante: +on formalise le modèle de la manière suivante : $$ Y = X\beta + \epsilon diff --git a/content/modelisation/5_clustering.qmd b/content/modelisation/5_clustering.qmd index e960a1383..a58c4244d 100644 --- a/content/modelisation/5_clustering.qmd +++ b/content/modelisation/5_clustering.qmd @@ -214,7 +214,7 @@ votes['label'] = model.labels_ La carte obtenue à la question 4, qui permet de représenter spatialement nos groupes, est -la suivante: +la suivante : ```{python} diff --git a/content/modelisation/6_pipeline.qmd b/content/modelisation/6_pipeline.qmd index 7f3a64c65..2ef7eab18 100644 --- a/content/modelisation/6_pipeline.qmd +++ b/content/modelisation/6_pipeline.qmd @@ -340,13 +340,13 @@ regr = RandomForestRegressor(max_depth=2, random_state=123) Notre _pipeline_ va intégrer les étapes suivantes: -1. __Preprocessing__: +1. __Preprocessing__ : + Les variables numériques vont être standardisées avec un `StandardScaler`. Pour cela, nous allons utiliser la liste `numeric_features` définie précédemment. + Les variables catégorielles vont être explosées avec un *one hot encoding* (méthode `OneHotEncoder` de `scikit`) Pour cela, nous allons utiliser la liste `categorical_features` -2. __Random forest__: nous allons appliquer l'estimateur `regr` défini plus haut +2. __Random forest__ : nous allons appliquer l'estimateur `regr` défini plus haut J'ajoute en commentaire un exemple de comment s'introduirait une imputation de valeurs manquantes. La version 1.0 de `scikit` facilite l'intégration @@ -625,7 +625,7 @@ On peut récupérer les paramètres optimaux avec la méthode `best_params_`: grid_search.best_params_ ``` -On pourra aussi ré-utiliser le modèle optimal de la manière suivante: +On pourra aussi ré-utiliser le modèle optimal de la manière suivante : ~~~python grid_search.best_estimator_ diff --git a/content/modelisation/index.qmd b/content/modelisation/index.qmd index 90fb415c9..3ccd215d3 100644 --- a/content/modelisation/index.qmd +++ b/content/modelisation/index.qmd @@ -237,7 +237,7 @@ permettra d'associer tout nouveau consommateur à un groupe. Ces deux exemples illustrent l'approche différente selon qu'on essaie de construire des modèles sur un _label_ observé ou non. Cela constitue même l'une des dualités fondamentale dans les -techniques de _machine learning_: +techniques de _machine learning_ : * __Apprentissage supervisé__ : la valeur cible est connue et peut-être utilisée pour évaluer la qualité d'un modèle ; * __Apprentissage non supervisé__ : la valeur cible est inconnue et ce sont des critères statistiques qui vont amener diff --git a/content/modern-ds/continuous_integration.qmd b/content/modern-ds/continuous_integration.qmd index 0339f863a..6943ae5de 100644 --- a/content/modern-ds/continuous_integration.qmd +++ b/content/modern-ds/continuous_integration.qmd @@ -314,7 +314,7 @@ dependencies: ``` Le même fichier sous le format `requirements.txt` aura -la forme suivante: +la forme suivante : ```python jupyter diff --git a/content/modern-ds/dallE.qmd b/content/modern-ds/dallE.qmd index 9a83ba99b..eba6c7f9f 100644 --- a/content/modern-ds/dallE.qmd +++ b/content/modern-ds/dallE.qmd @@ -165,13 +165,13 @@ _"A Shiba Inu dog wearing a beret and black turtleneck"_ `Midjourney`, spécialisé dans le contenu esthétique, -génèrera l'image suivante avec l'instruction _"mechanical dove"_: +génèrera l'image suivante avec l'instruction _"mechanical dove"_ : ![](https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/A_mechanical_dove_8274822e-52fe-40fa-ac4d-f3cde5a332ae.png/250px-A_mechanical_dove_8274822e-52fe-40fa-ac4d-f3cde5a332ae.png) `StableDiffusion`, modèle généraliste comme `Dall-E`, crééra le contenu suivant avec -l'instruction _"A photograph of an astronaut riding a horse"_: +l'instruction _"A photograph of an astronaut riding a horse"_ : !["A photograph of an astronaut riding a horse"](https://upload.wikimedia.org/wikipedia/commons/thumb/3/32/A_photograph_of_an_astronaut_riding_a_horse_2022-08-28.png/250px-A_photograph_of_an_astronaut_riding_a_horse_2022-08-28.png) @@ -289,7 +289,7 @@ l'utiliser - mais aussi modifier des images à partir d'instructions. `Stable Diffusion` est un modèle plus pratique à utiliser depuis `Python` que `Dall-E`. Celui-ci -est _open source_ et peut être téléchargé et réutilisé directement depuis `Python`. +est _open-source_ et peut être téléchargé et réutilisé directement depuis `Python`. La méthode la plus pratique est d'utiliser le modèle mis à disposition sur `HuggingFace`. Le modèle est implémenté à travers le _framework_ [`PyTorch`](https://pytorch.org/). @@ -334,7 +334,7 @@ condacolab.install() Pour installer `PyTorch`, la librairie de _Deep Learning_ développée par `Meta`, il suffit de suivre les recommandations sur le [site web officiel](https://pytorch.org/). -Dans un `Notebook`, cela prendra la forme suivante: +Dans un `Notebook`, cela prendra la forme suivante : ```{python} #| eval: false @@ -427,7 +427,7 @@ HF_TOKEN = os.getenv('HF_PAT') # Générer une image -On va créer l'image suivante: +On va créer l'image suivante : > __"Chuck Norris fighting against Zeus on Mount Olympus in an epic Mortal Kombat scene"__ diff --git a/content/modern-ds/elastic_approfondissement.qmd b/content/modern-ds/elastic_approfondissement.qmd index 59791e74d..f680f83cf 100644 --- a/content/modern-ds/elastic_approfondissement.qmd +++ b/content/modern-ds/elastic_approfondissement.qmd @@ -279,7 +279,7 @@ Si vous avez accès à un espace de stockage cloud de type cette base. Afin de l'enregistrer dans un espace de stockage public, nous allons l'enregistrer dans un dossier `diffusion`[^1] -[^1]: Le SSP-Cloud, dont la technologie de stockage repose sur +[^1]: Le SSP Cloud, dont la technologie de stockage repose sur MinIO permet de partager des fichiers dans des espaces publics ou privés. Par construction, les fichiers enregistrés dans un dossier nommé `diffusion` seront publics. diff --git a/content/modern-ds/elastic_intro.qmd b/content/modern-ds/elastic_intro.qmd index 240d28b6a..7dab78d69 100644 --- a/content/modern-ds/elastic_intro.qmd +++ b/content/modern-ds/elastic_intro.qmd @@ -164,8 +164,8 @@ ingredients = ['500 g de carottes', '10 cl de crème liquide (facultatif)'] ``` -Essayer de récupérer par webscraping cette liste est un bon exercice pour réviser -les concepts [vus précedemment](#webscraping) +Essayer de récupérer par web scraping cette liste est un bon exercice pour réviser +les concepts [vus précédemment](#webscraping) On va donc créer une liste de course compilant @@ -226,7 +226,7 @@ Quelques fonctions utiles sont regroupées dans le script `functions.py` et impo La base `OpenFood` peut être récupérée en ligne via la fonction `fc.import_openfood`. Néanmoins, cette opération nécessitant un certain temps (les données brutes faisant autour de 2Go), nous proposons une méthode -pour les utilisateurs du `SSP-Cloud` où une version est disponible sur +pour les utilisateurs du `SSP Cloud` où une version est disponible sur l'espace de stockage. La base `Ciqual`, qui plus légère, est récupérée elle directement en ligne @@ -234,9 +234,9 @@ via la fonction `fc.import_ciqual`. ```{python} #| eval: false -# Pour les utilisateurs du SSP-Cloud +# Pour les utilisateurs du SSP Cloud openfood = fc.import_openfood_s3() -# Pour les utilisateurs hors du SSP-Cloud +# Pour les utilisateurs hors du SSP Cloud # openfood = fc.import_openfood() ciqual = fc.import_ciqual() ``` @@ -491,7 +491,7 @@ ciqual.head(2) ``` Après retrait des _stop-words_, nos libellés prennent -la forme suivante: +la forme suivante : ```{python} #| echo: false diff --git a/content/modern-ds/index.qmd b/content/modern-ds/index.qmd index 793362fc1..4ba1563c2 100644 --- a/content/modern-ds/index.qmd +++ b/content/modern-ds/index.qmd @@ -7,10 +7,10 @@ categories: - Avancé description: | Après avoir abordé les différents champs de la - data-science, nous pouvons maintenant + data science, nous pouvons maintenant introduire à quelques outils et méthodes plus avancés qui correspondent à des aspects plus à la pointe - du travail du data-scientist. Cette partie + du travail du data scientist. Cette partie évoquera ainsi les infrastructures modernes de traitement de la donnée, les grands paradigmes concernant les méthodes de travail ou les diff --git a/content/modern-ds/s3.qmd b/content/modern-ds/s3.qmd index ba5ebb18b..fa70f421a 100644 --- a/content/modern-ds/s3.qmd +++ b/content/modern-ds/s3.qmd @@ -392,7 +392,7 @@ exemple des niveaux géographiques) en une arborescence de fichiers `parquet`. C permet de travailler sur un échantillon pour facilement passer à l'échelle ensuite. Par exemple, une structure partitionnée, empruntée à la [documentation `Spark`](https://spark.apache.org/docs/latest/sql-data-sources-parquet.html#partition-discovery) -peut prendre la forme suivante: +peut prendre la forme suivante : ```raw path @@ -677,7 +677,7 @@ reconnus par le serveur de stockage. On peut alors lire et écrire dans le *buck ``` Les exemples suivants seront réplicables pour les utilisateurs de la plateforme -SSP-cloud +SSP Cloud ```{python} #| echo: false @@ -945,12 +945,12 @@ S3 = S3RemoteProvider(host = "https://" + os.getenv('AWS_S3_ENDPOINT'), access_k

Note

``` -Dans le SSP-cloud, -lorsque l'initialisation du service `Jupyter` du SSP-cloud est récente +Dans le SSP Cloud, +lorsque l'initialisation du service `Jupyter` du SSP Cloud est récente (moins de 12 heures), il est possible d'utiliser automatiquement les jetons stockés automatiquement à la création du dépôt. -Si on désire accéder aux données du SSP-cloud depuis une session python du +Si on désire accéder aux données du SSP Cloud depuis une session python du datalab (service VSCode, Jupyter...), il faut remplacer l'url par `http://minio.lab.sspcloud.fr` ```{=html} diff --git a/content/visualisation/maps.qmd b/content/visualisation/maps.qmd index 516a5654a..29a386501 100644 --- a/content/visualisation/maps.qmd +++ b/content/visualisation/maps.qmd @@ -653,7 +653,7 @@ for i in range(0,len(df1)): m.fit_bounds([sw, ne]) ``` -La carte obtenue doit ressembler à la suivante: +La carte obtenue doit ressembler à la suivante : ```{python} #| echo : true diff --git a/content/visualisation/matplotlib.qmd b/content/visualisation/matplotlib.qmd index 8905e4745..0489e23eb 100644 --- a/content/visualisation/matplotlib.qmd +++ b/content/visualisation/matplotlib.qmd @@ -627,7 +627,7 @@ valeurs exactes) ou cliquer pour faire apparaître des informations complémenta sur la visualisation ou autour. Ces visualisations reposent sur le même triptyque que l'ensemble de l'écosystème -_web_: `HTML`, `CSS` et `JavaScript`. Les utilisateurs de `Python` +_web_ : `HTML`, `CSS` et `JavaScript`. Les utilisateurs de `Python` ne vont jamais manipuler directement ces langages, qui demandent une certaine expertise, mais vont utiliser des librairies au niveau de `R` qui génèreront automatiquement tout le code `HTML`, `CSS` et `JavaScript` permettant de créer la figure. diff --git a/index.qmd b/index.qmd index 92b76810f..9c4d757b6 100644 --- a/index.qmd +++ b/index.qmd @@ -36,7 +36,7 @@ Lino Galiana
Ce site web rend public le contenu du cours de deuxième année (Master 1) de l'ENSAE: -[*Python pour la data-science*](https://www.ensae.fr/courses/1425-python-pour-le-data-scientist) +[*Python pour la data science*](https://www.ensae.fr/courses/1425-python-pour-le-data-scientist) Tout est présent sur ce site _web_ ! Des `Notebooks Jupyter` peuvent être récupérés pour s'exercer. L'ensemble des codes sources est stocké sur [Github](https://github.com/linogaliana/python-datascientist) diff --git a/slides/intro/index.qmd b/slides/intro/index.qmd index 29321da3a..ea4c28cd8 100644 --- a/slides/intro/index.qmd +++ b/slides/intro/index.qmd @@ -9,7 +9,7 @@ institute: | date: 06-09-2023 slide-number: true footer: | - **_Python pour la data-science_, ENSAE** + **_Python pour la data science_, ENSAE** # uncomment for French presentations: lang: fr-FR # for blind readers: @@ -97,13 +97,13 @@ from: markdown+emoji -* __Points d'entrée principaux__: +* __Points d'entrée principaux__ : + Site web {{< fa brands firefox >}}: ; + Dépôt `Github` {{< fa brands github >}} : . . . -* Des __tutoriels et exercices sous format `Jupyter Notebook`__: +* Des __tutoriels et exercices sous format `Jupyter Notebook`__ : + Possibilité de les tester sur des environnements temporaires d'exécution Onyxia Binder