Pandas et Numpy, les premiers packages de notre parcours initiatique,
sont essentiels pour manipuler les données.
Néanmoins, il est nécessaire de ne pas faire l’impasse sur les fondements
du langage Python lorsqu’on découvre ce langage. Une bonne compréhension des éléments structurants du
langage permet de mieux comprendre la logique des packages de data science, de mieux comprendre les erreurs rencontrées et entraîne une plus grande productivité et liberté.
Pour découvrir les objets de base et la structure du langage, une série de notebooks est mise à disposition ci-dessous. Le parcours est à la carte, vous pouvez faire ces notebooks dans le désordre ou n’en faire qu’une partie si vous avez de bons souvenirs sur le contenu couvert par certains.
Après avoir révisé, des exercices de synthèse sont là pour mettre en oeuvre, en pratique, les éléments sur les structures de données. Après avoir fait ceux-ci, la suite du parcours se trouve dans la partie “Manipuler les données”.
1 Notebooks de révision
2 Exercices de synthèse
Pour vérifier que vous êtes au point sur les structures de données et les opérations adéquates en Python pour différents problèmes, voici une série d’exercice.
Ils demandent de se creuser un peu la tête sur la structure adéquate des données pour y répondre, c’est normal !
Une fois n’est pas coutume, les exercices se font directement sur cette page plutôt que par le biais de notebooks1. La correction sera prochainement dans la page dédiée.
2.1 Exercice 1
Vous disposez d’une liste de citations issues d’oeuvres littéraires de notre magnifique patrimoine littéraire :
Voir la liste de citations qui seront utiles
| Citation | Auteur |
|---|---|
| “Rien ne sert de courir ; il faut partir à point.” | La Fontaine |
| “Selon que vous serez puissant ou misérable, les jugements de cour vous rendront blanc ou noir.” | La Fontaine |
| “Heureux qui comme Ulysse a fait bon voyage” | Du Bellay |
| “L’homme est né libre, et partout il est dans les fers.” | Rousseau |
| “Parce que c’était lui, parce que c’était moi.” | Montaigne |
| “La première fois qu’Aurélien vit Bérénice, il la trouva franchement laide” | Aragon |
| “Aujourd’hui maman est morte. Ou peut-être hier, je ne sais pas.” | Camus |
Créer un objet citations qui utilise une structure de données adéquate en Python pour:
- Pouvoir facilement retrouver toutes les citations associées à un auteur. Créer un objet
citation_aragonqui teste la validité de votre approche avec l’exemple d’Aragon. - Pour chaque citation, compter le nombre de mots et le nombre de mots uniques. Créer un objet
stats_phrasesqui liste ces propriétés. Tester sur les citations de la Fontaine.
Voici les citations, ici en vrac, pour pouvoir démarrer.
Dans cette cellule, créer la structure de données adéquates pour cet exercice.
Quelle structure de données pourrait permettre d’avoir ce type de code ?
citations.get("La Fontaine")Quelle structure de données pourrait permettre d’avoir un objet ressemblant à
Un dictionnaire pourrait vous aider. Si vous avez encore du mal à comprendre pourquoi et comment, retournez au notebook dédié ⬆️.
A dictionary may help. If you are still struggling to understand why and how, go back to the dedicated notebook ⬆️.
Pour la question 1, vous pouvez utiliser cette cellule.
Pour la question 2, vous pouvez utiliser cette cellule.
Comment itérer sur les clés et valeurs de votre dict stats_phrases ?
Adopter cette structure générale :
for auteur, liste_citations in citations.items():
# do somethingComment avoir la longueur d’une phrase (suite de mots) et des mots uniques dans celle-ci ?
Comment avoir la longueur d’une phrase (suite de mots) et des mots uniques dans celle-ci ?
- Une phrase (chaîne de caractères) peut être décomposée en mots (liste) avec la méthode
split() - Un
setpermet de dédoublonner une liste
Vous devriez obtenir ce type de résultat:
Idéalement, il faudrait faire attention à la ponctuation.
Mais nous n’avons pas encore appris comment faire des substitutions raffinées dans des chaînes de caractères, cela sera dans un prochain chapitre.
2.2 Exercice 2
Les advent of code sont d’excellents problèmes pratiques pour apprendre l’algorithmique. Avec un problème par jour de difficulté croissante entre le 1er décembre et le jour de Noël, on devient très vite à l’aise avec les nombreuses structures de données qu’offre Python.
Le prochain exercice propose de résoudre la première partie du jour 1 (année 2022) exclusivement avec du Python base.
Il serait pertinent d’utiliser Numpy pour le prochain problème. Mais c’est l’objet du prochain chapitre de montrer la manière dont ce package simplifie les opérations numériques basiques.
Voici les objets dont nous aurons besoin pour cet exercice:
Cet exercice vise à vous guider pour résoudre le problème sur cette page (Advent of Code 2022, jour 1, première partie). Il va être nécessaire de trouver une structure de données plus adéquate que celle de départ.
- Lire la consigne
- En allant progressivement, essayez de retrouver sur l’exemple le volume de calories portées par chaque elfe.
- En déduire l’elfe portant le plus de calories. Vérifier que vous obtenez bien sur l’exemple les calories évoquées dans la consigne.
- Généraliser pour résoudre le problème
Vous pouvez dans cette cellule écrire votre code pour la question 2:
Il va falloir itérer sur chaque valeur de elves_example: comment transformer la chaîne de caractère en objet plus maniable ?
Attention au type d’objet que vous allez obtenir, n’oubliez pas de convertir dans un format numérique si vous désirez faire des opérations arithmétiques
Vous devriez finir avec la liste
Vous pouvez dans cette cellule écrire votre code pour la question 3:
Pour finir, après avoir généralisé, vous devriez retrouver les valeurs suivantes:
Elf number 217 carries the most calories (72602 calories).
2.3 Exercice 3: les chaînes de caractères
Voici le type de motif final vers lequel vous désirez aboutir à la question 1 et 2.
On 17 March 2022, Nadia (34) reported an income of $33,333.33.
- A partir de la méthode
format, essayez d’obtenir le résultat attendu. - Faites de même avec les f-strings.
- Modifiez le message pour créer un revenu mensuel arrondi à 1 chiffre. Utiliser l’espace comme séparateur de milliers plutôt que le séparateur par défaut (la virgule).
- Voici un chemin fictif
C:\Users\Nadia\Documents\cours\chapitre_03\notes.txtvers un fichier. Faire un print correctif de celui-ci.
Dans la première partie de cet exercice, vous devriez avoir ces résultats.
Question 1:
On 17 March 2022, Nadia (34) reported an income of $33,333.33.
Question 2:
On 17 March 2022, Nadia (34) reported an income of $33,333.33.
Question 3:
On 17 March 2022 Nadia (34) reported an income of $2 777.8.
Vous pouvez tester ci-dessous votre solution
Dans la deuxième partie de l’exercice, si vous utilisez le mauvais type de string, vous devriez avoir une erreur:
Cell In[14], line 2 chemin_bad = "C:\Users\Nadia\Documents\cours\chapitre_03\notes.txt" ^ SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
Les slashs posent souvent problème. Avec des raw strings vous ne devriez pas rencontrer ce problème:
File can be found here: C:\Users\Nadia\Documents\cours\chapitre_03\notes.txt
Informations additionnelles
Ce site a été construit automatiquement par le biais d’une action Github utilisant le logiciel de publication reproductible Quarto
L’environnement utilisé pour obtenir les résultats est reproductible par le biais d’uv. Le fichier pyproject.toml utilisé pour construire cet environnement est disponible sur le dépôt linogaliana/python-datascientist
pyproject.toml
[project]
name = "python-datascientist"
version = "0.1.0"
description = "Source code for Lino Galiana's Python for data science course"
readme = "README.md"
requires-python = ">=3.13,<3.14"
dependencies = [
"altair>=6.0.0",
"black==24.8.0",
"cartiflette",
"contextily==1.6.2",
"duckdb>=0.10.1",
"folium>=0.19.6",
"gdal!=3.11.1",
"geoplot==0.5.1",
"graphviz==0.20.3",
"great-tables>=0.12.0",
"gt-extras>=0.0.8",
"ipykernel>=6.29.5",
"jupyter>=1.1.1",
"jupyter-cache==1.0.0",
"kaleido==0.2.1",
"langchain-community>=0.3.27",
"loguru==0.7.3",
"markdown>=3.8",
"nbclient==0.10.0",
"nbformat==5.10.4",
"nltk>=3.9.1",
"pip>=25.1.1",
"plotly>=6.1.2",
"plotnine>=0.15",
"polars==1.8.2",
"pyarrow>=17.0.0",
"pynsee==0.1.8",
"python-dotenv==1.0.1",
"python-frontmatter>=1.1.0",
"pywaffle==1.1.1",
"requests>=2.32.3",
"scikit-image==0.24.0",
"scipy>=1.13.0",
"selenium<4.39.0",
"spacy>=3.8.4",
"webdriver-manager==4.0.2",
"wordcloud==1.9.3",
]
[tool.uv.sources]
cartiflette = { git = "https://github.com/inseefrlab/cartiflette" }
gdal = [
{ index = "gdal-wheels", marker = "sys_platform == 'linux'" },
{ index = "geospatial_wheels", marker = "sys_platform == 'win32'" },
]
[[tool.uv.index]]
name = "geospatial_wheels"
url = "https://nathanjmcdougall.github.io/geospatial-wheels-index/"
explicit = true
[[tool.uv.index]]
name = "gdal-wheels"
url = "https://gitlab.com/api/v4/projects/61637378/packages/pypi/simple"
explicit = true
[dependency-groups]
dev = [
"nb-clean>=4.0.1",
]
Pour utiliser exactement le même environnement (version de Python et packages), se reporter à la documentation d’uv.
| SHA | Date | Author | Description |
|---|---|---|---|
| 8cfd74d9 | 2025-12-26 13:57:40 | Lino Galiana | Adding fstring/rstring exercise (#671) |
| 086116d6 | 2025-12-23 13:35:15 | lgaliana | Fix problem with script location |
| 7b8b7f9b | 2025-12-15 11:01:54 | lgaliana | Traduction anglaise |
| 8e387110 | 2025-12-15 10:20:42 | Lino Galiana | Fix WASM build in GHA (#663) |
| 02abcf02 | 2025-12-14 22:52:19 | Lino Galiana | Intro à Python: des exercices sur les structures de données (#662) |
| 81837397 | 2025-09-26 15:13:01 | lgaliana | deployment url from vscode for intro notebooks |
| 91431fa2 | 2025-06-09 17:08:00 | Lino Galiana | Improve homepage hero banner (#612) |
| dac49604 | 2024-08-29 15:07:49 | linogaliana | Change URL on edit on github button |
| f8b04136 | 2024-08-28 15:15:04 | Lino Galiana | Révision complète de la partie introductive (#549) |
Notes de bas de page
Il est possible d’exécuter du
Pythonsur le navigateur grâce à son implémentation en WASM par le biais de Pyodide. Ce n’est pas une méthode recommandée quand on doit faire des calculs conséquents comme dans les prochains chapitres. Mais comme ici nous travaillons sur de petits exemples c’est assez pratique pour bénéficier de l’interactivité permise par le navigateur, notamment les aides en cas de blocage.↩︎
Citation
@book{galiana2025,
author = {Galiana, Lino},
title = {Python pour la data science},
date = {2025},
url = {https://pythonds.linogaliana.fr/},
doi = {10.5281/zenodo.8229676},
langid = {fr}
}