Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
4bfa640
typo meteo + link broken
nicotlm Dec 19, 2025
b5e480e
Q3 : correction counting total rows
nicotlm Dec 24, 2025
0e6f72d
fix link to BAN API issue #30
nicotlm Jan 5, 2026
ed18c7e
initialisation polars #31
nicotlm Jan 5, 2026
3d7bbcc
add polars to site structure
nicotlm Jan 5, 2026
4d49d81
move to uv
nicotlm Jan 5, 2026
f1fca47
polars tutorial skeleton
nicotlm Jan 5, 2026
35af977
wtih select and csv
nicotlm Jan 6, 2026
1cc6808
filter and select
nicotlm Jan 6, 2026
fcec381
tidypolars
nicotlm Jan 6, 2026
39503cf
parquet section
nicotlm Jan 6, 2026
0ca557b
export/import dictionnaire
nicotlm Jan 6, 2026
417f81e
depuis/vers pandas
nicotlm Jan 6, 2026
200b4cb
preview
nicotlm Jan 6, 2026
9a03290
missing values
nicotlm Jan 6, 2026
3b6d554
with_columns
nicotlm Jan 20, 2026
64a4607
with cast and data transformation
nicotlm Jan 20, 2026
fcc565a
with rename
nicotlm Jan 20, 2026
f396233
update renaming
nicotlm Jan 21, 2026
9dd963b
complex functions and sorting
nicotlm Jan 21, 2026
1730fc6
nans en None
nicotlm Jan 21, 2026
b138858
aggregation
nicotlm Jan 21, 2026
9bca87e
missing values and NaNs
nicotlm Jan 21, 2026
cc9a836
fill_null and fill_nan
nicotlm Jan 21, 2026
3718aeb
string operations
nicotlm Jan 21, 2026
420a73c
with categories
nicotlm Jan 21, 2026
0544639
with temporal column
nicotlm Jan 21, 2026
69222c6
with joining dataframes
nicotlm Jan 21, 2026
739d8c5
with intro
nicotlm Jan 21, 2026
6348c4c
without english part
nicotlm Jan 21, 2026
f850eb2
with the right title levels
nicotlm Jan 21, 2026
ea060fa
with typos and unnest
nicotlm Jan 28, 2026
abb20f6
uv for rendering notebooks
nicotlm Feb 24, 2026
1f21ff6
intro polars
nicotlm Feb 24, 2026
91e39a0
intro
nicotlm Feb 24, 2026
bbc72fc
review
nicotlm Feb 24, 2026
4ebefae
with answer exo1
nicotlm Feb 24, 2026
ee16125
with exo prenoms
nicotlm Feb 24, 2026
a29cbbb
with exo prenoms - end
nicotlm Feb 24, 2026
b52ef30
with exo prenom -end
nicotlm Feb 24, 2026
a3f533f
Merge branch 'dev' of https://github.com/ntoulemonde/formation-python…
nicotlm Feb 24, 2026
5889334
with exo empreinte carbone - 1
nicotlm Feb 24, 2026
7333c22
with exo empreinte carbone - pivot partial
nicotlm Feb 24, 2026
f14c5bc
with selectors
nicotlm Feb 25, 2026
0cd93c6
fix typo
nicotlm Feb 25, 2026
994d55f
with corr
nicotlm Feb 25, 2026
ad1bd2b
with exo empreinte carbone - 2
nicotlm Feb 25, 2026
cda6c2b
with exo empreinte carbone - end
nicotlm Feb 25, 2026
9f27225
indice - part 1
nicotlm Feb 25, 2026
96e5087
indice - end
nicotlm Feb 25, 2026
85945f1
typo
nicotlm Feb 25, 2026
26703d6
harmonization
nicotlm Feb 25, 2026
7103b7f
with correction questions
nicotlm Feb 25, 2026
52a7765
review and harmonization
nicotlm Feb 25, 2026
ff36c29
review - aggregate
nicotlm Feb 25, 2026
2a06f33
transfer import at first cell
nicotlm Feb 25, 2026
7bc1f22
review missing
nicotlm Feb 25, 2026
b753b25
review until merge
nicotlm Feb 25, 2026
0c1d73b
review merge
nicotlm Feb 26, 2026
628db63
review exo1
nicotlm Feb 26, 2026
5c2512e
review exo2 prenoms
nicotlm Feb 26, 2026
ea74452
with select to transform
nicotlm Feb 26, 2026
8f2f594
review exo3 empreinte
nicotlm Feb 26, 2026
439428a
typos
nicotlm Feb 26, 2026
f03b686
review exo3 empreinte - end
nicotlm Feb 26, 2026
eefc105
with modified intro
nicotlm Feb 26, 2026
8d0c120
add remark to return statement #26
nicotlm Feb 26, 2026
34638ea
meteo app : API issue #31
nicotlm Dec 19, 2025
41cc082
solution with polars
nicotlm Dec 19, 2025
15a48b3
add error handling case
nicotlm Dec 19, 2025
f8a8a96
RP with polars with functions to load one year and the whole dataset #31
nicotlm Dec 23, 2025
ab8e101
with year as int
nicotlm Dec 23, 2025
9a030f6
fix column renaming for null cases
nicotlm Dec 24, 2025
f097804
RP: with plot function - Q3
nicotlm Dec 24, 2025
2bfff13
with pyramide data and plot age pyramide
nicotlm Dec 24, 2025
f37391c
change var name for graph legend
nicotlm Dec 24, 2025
41823e9
with regions and departements
nicotlm Dec 24, 2025
247bc57
with plot pop per region
nicotlm Dec 24, 2025
68995c7
clean up post rebase
nicotlm Feb 26, 2026
21da98d
review - RP - 1
nicotlm Feb 26, 2026
ef2de3f
review - RP - 2
nicotlm Feb 26, 2026
dc8b6d7
review - RP - 3
nicotlm Feb 26, 2026
5149479
review - RP - with compute population_growth_per_region
nicotlm Feb 26, 2026
87a6220
review - RP - with compute_mean_population_growth_per_region
nicotlm Feb 26, 2026
ed85df6
review - RP - with plot_growth_population_by_regions - final #31
nicotlm Feb 26, 2026
d18a218
tutorial RP with polars #31
nicotlm Feb 26, 2026
bdc1af8
typo
nicotlm Feb 26, 2026
1f00558
tutorial meteo with polars #31
nicotlm Feb 26, 2026
7fd3286
cleaning solutions_polars meteo #31
nicotlm Feb 26, 2026
78bd438
clearer import statement
nicotlm Feb 26, 2026
1181932
remove unnecessary dependancies
nicotlm Feb 26, 2026
52fc17d
jupyter was necessaery :o
nicotlm Feb 26, 2026
aad2416
update gha with uv
nicotlm Feb 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 13 additions & 13 deletions .github/workflows/publish.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: Publish slides and notebooks

on:
on:
push:
branches:
- main
Expand All @@ -11,24 +11,24 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v6

- uses: actions/setup-python@v5
- uses: actions/setup-python@v6
with:
python-version: '3.10'
- run: pip install -r requirements.txt
python-version: "3.13"

- name: Install the default version of uv
id: setup-uv
uses: astral-sh/setup-uv@v7

- name: Set up quarto
uses: quarto-dev/quarto-actions/setup@v2

- name: Render FR version
uses: quarto-dev/quarto-actions/render@v2
env:
QUARTO_PROFILE: fr
- name: Render EN version
uses: quarto-dev/quarto-actions/render@v2
env:
QUARTO_PROFILE: en
- name: Render FR and EN version
run: |
uv run quarto render --profile fr
uv run quarto render --profile en

- name: Publish to GitHub Pages (and render)
uses: quarto-dev/quarto-actions/publish@v2
with:
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -153,3 +153,5 @@ dmypy.json
.pyre/

/.quarto/

**/*.quarto_ipynb
11 changes: 6 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Formation - Initiation à Python

*Auteur : Romain Avouac*
_Auteur : Romain Avouac_

*Contributeurs : Yves-Laurent Bénichou, Olivier Chateau, Thomas Faria, Antoine Palazzolo*
_Contributeurs : Yves-Laurent Bénichou, Olivier Chateau, Thomas Faria, Antoine Palazzolo_

## Site associé

Expand All @@ -15,6 +15,7 @@ Ce projet contient les supports de cours de l'auto-formation d'initiation à Pyt
## Génération des notebooks

Afin de favoriser la reproductibilité de la formation, les sources des supports de cours sont disponibles au format `.qmd` ([Quarto](https://quarto.org/)) dans les différents sous-dossiers du dossier `source/`. Les notebooks `Jupyter` (format `.ipynb`) exécutables associés peuvent être générés en suivant les étapes suivantes :

- [installer Quarto](https://quarto.org/docs/get-started/)
- cloner le dépôt de la formation :

Expand All @@ -26,13 +27,13 @@ cd formation-python-initiation
- installer les packages `Python` nécessaires :

```bash
pip install -r requirements.txt
uv sync
```

- générer les notebooks :

```bash
quarto render --profile notebooks
uv run quarto render --profile notebooks
```

Une fois l'étape de *rendering* terminée, les notebooks générés au format `.ipynb` sont disponibles dans les différents sous-dossiers du dossier `source/`.
Une fois l'étape de _rendering_ terminée, les notebooks générés au format `.ipynb` sont disponibles dans les différents sous-dossiers du dossier `source/`.
8 changes: 5 additions & 3 deletions _quarto-en.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ website:
style: 'docked'
contents:
- section: "Fundamentals"
contents:
contents:
- text: "Basic types and variables"
href: source/fundamentals/types-variables/tutorial.qmd
- text: "Data structures 1: lists and tuples"
Expand All @@ -23,7 +23,7 @@ website:
- text: "Introduction to object-oriented programming"
href: source/fundamentals/oop/tutorial.qmd
- section: "Data handling"
contents:
contents:
- text: "File manipulation"
href: source/manipulation/modules-files/tutorial.qmd
- text: "Working with CSV and JSON files"
Expand All @@ -32,10 +32,12 @@ website:
href: source/manipulation/numpy/tutorial.qmd
- text: "Processing tabular data with Pandas"
href: source/manipulation/pandas/tutorial.qmd
- text: "Processing tabular data with Polars"
href: source/manipulation/polars/tutorial.qmd
- text: "Introduction to data visualization"
href: source/manipulation/dataviz/tutorial.qmd
- section: "Projects"
contents:
contents:
- text: "Project 1 - Connect 4"
href: source/projects/puissance4/tutorial.qmd
- text: "Project 2 - Wheather forecast"
Expand Down
8 changes: 5 additions & 3 deletions _quarto-fr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ website:
style: 'docked'
contents:
- section: "Fondamentaux du langage"
contents:
contents:
- text: "Types de base et variables"
href: source/fundamentals/types-variables/tutorial.qmd
- text: "Structures de données 1 : listes et tuples"
Expand All @@ -20,7 +20,7 @@ website:
- text: "Notions de programmation orientée objet"
href: source/fundamentals/oop/tutorial.qmd
- section: "Manipulation de données"
contents:
contents:
- text: "Manipulation de fichiers"
href: source/manipulation/modules-files/tutorial.qmd
- text: "Travailler avec des fichiers CSV et JSON"
Expand All @@ -29,10 +29,12 @@ website:
href: source/manipulation/numpy/tutorial.qmd
- text: "Traiter des données tabulaires avec Pandas"
href: source/manipulation/pandas/tutorial.qmd
- text: "Traiter des données tabulaires avec Polars"
href: source/manipulation/polars/tutorial.qmd
- text: "Introduction à la visualisation de données"
href: source/manipulation/dataviz/tutorial.qmd
- section: "Projets"
contents:
contents:
- text: "Projet 1 - Puissance 4"
href: source/projects/puissance4/tutorial.qmd
- text: "Projet 2 - Prédictions météorologiques"
Expand Down
23 changes: 23 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
[project]
name = "formation-python-initiation"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
"matplotlib",
"numpy",
"pandas",
"pyarrow",
"scikit-learn",
"cartiflette>=0.1.9",
"geopandas>=1.1.1",
"plotnine>=0.15.2",
"polars>=1.36.1",
"pyarrow>=22.0.0",
"requests>=2.32.5",
"seaborn>=0.13.2",
"xlrd>=2.0.2",
"fastexcel>=0.19.0",
"jupyter>=1.1.1",
]
9 changes: 0 additions & 9 deletions requirements.txt

This file was deleted.

38 changes: 19 additions & 19 deletions source/fundamentals/oop/tutorial.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ print(type({}))

def f(x):
print(x)

print(type(f))
```

Expand All @@ -43,10 +43,10 @@ class Citron:
self.saveur = "acide"
self.couleur = couleur
self.jus = qte_jus

def recup_qte_jus(self):
print("Il reste " + str(self.jus) + " mL de jus dans le citron.")

def extraire_jus(self, quantite):
if quantite > self.jus:
print("Il n'y a pas assez de jus dans le citron pour la quantité demandée.")
Expand All @@ -64,7 +64,7 @@ Analysons la syntaxe de construction d'une classe d'objets :

- le constructeur a un paramètre obligatoire : `self`. C'est une référence aux **instances** qui vont être créées à partir de cette classe. Notons la syntaxe qui définit un attribut : `self.attribut = valeur`.

- les autres méthodes sont définies par l'utilisateur. Elles prennent également le `self` en paramètre, ce qui leur permet d'effectuer des opérations sur / à partir des attributs. Comme ce sont des fonctions, elles peuvent également admettre d'autres paramètres. Ainsi, la fonction `extraire_jus` prend un paramètre `quantite` qui définit quelle quantité de jus on extrait du citron lorsqu'on le presse.
- les autres méthodes sont définies par l'utilisateur. Elles prennent également le `self` en paramètre, ce qui leur permet d'effectuer des opérations sur / à partir des attributs. Comme ce sont des fonctions, elles peuvent également admettre d'autres paramètres. Ainsi, la fonction `extraire_jus` prend un paramètre `quantite` qui définit quelle quantité de jus on extrait du citron lorsqu'on le presse. On peut remarquer que les méthodes ne prennent pas de déclaration `return`, contrairement aux fonctions.


## La classe et ses instances
Expand Down Expand Up @@ -202,7 +202,7 @@ Les trois exécutions donnent des résultats différents, alors que le code exé

- 3/ A quoi sert le constructeur `__init__` ?

- 4/ A quoi sert le `self` ?
- 4/ A quoi sert le `self` ?

- 5/ Quelle est la différence entre une classe et une instance ?

Expand Down Expand Up @@ -268,10 +268,10 @@ class Citron:
self.saveur = "acide"
self.couleur = couleur
self.jus = qte_jus

def recup_qte_jus(self):
print("Il reste " + str(self.jus) + " mL de jus dans le citron.")

def extraire_jus(self, quantite):
if quantite > self.jus:
print("Il n'y a pas assez de jus dans le citron pour la quantité demandée.")
Expand All @@ -297,19 +297,19 @@ class Citron:
self.couleur = couleur
self.masse = masse
self.jus = masse / 4

def recup_masse(self):
print("La masse du citron est " + str(self.masse) + " grammes.")

def recup_qte_jus(self):
print("Il reste " + str(self.jus) + " mL de jus dans le citron.")

def extraire_jus(self, quantite):
if quantite > self.jus:
print("Il n'y a pas assez de jus dans le citron pour la quantité demandée.")
else:
self.jus = max(0, self.jus - quantite) # évite toute valeur négative de `jus`

citron = Citron("jaune", 500)

citron.recup_masse()
Expand All @@ -333,7 +333,7 @@ Implémenter une classe `Compte` avec :

- une méthode `depot` qui admet un paramètre `montant`. Lorsqu'un dépôt est effectué, le solde du compte est incrémenté du montant du dépôt.

- une méthode `retrait` qui admet un paramètre `montant`. Lorsqu'un retrait est effectué :
- une méthode `retrait` qui admet un paramètre `montant`. Lorsqu'un retrait est effectué :

- si le montant est inférieur au solde : le solde est décrémenté du montant, est on affiche "Retrait accepté.".

Expand All @@ -344,7 +344,7 @@ Implémenter une classe `Compte` avec :
- si le montant est inférieur au solde de client1 : le solde de client1 est décrémenté du montant, le solde de client2 est incrémenté du montant.

- si le montant est supérieur au solde de client1 : on affiche "Transfert refusé : fonds insuffisants." et les soldes des deux clients restent inchangés.

Créer deux clients et tester que les différentes fonctionnalités à implémenter marchent comme prévu.

```{python}
Expand All @@ -362,27 +362,27 @@ class Compte:
def __init__(self, titulaire, solde):
self.titulaire = titulaire
self.solde = solde

def affiche_solde(self):
print("Le solde du compte de " + self.titulaire + " est " + str(self.solde) + " euros.")

def depot(self, montant):
self.solde += montant

def retrait(self, montant):
if self.solde >= montant:
self.solde -= montant
print("Retrait accepté.")
else:
print("Retrait refusé : fonds insuffisants.")

def transfert(self, destinataire, montant):
if self.solde >= montant:
destinataire.solde += montant
self.solde -= montant
else:
print("Transfert refusé : fonds insuffisants.")

client1 = Compte("Bernard", 2000)
client2 = Compte("Bianca", 5000)

Expand Down Expand Up @@ -830,4 +830,4 @@ client1.show_balance() # + 2000
:::


:::
:::
Loading