Les jours fériés sont-ils plus calmes ?
Le loueur de vélos a un tableau de locations et, à part, une liste de jours fériés. Il demande si ces jours-là sont plus calmes.
Aucun des deux tableaux ne répond seul. Les locations n’ont pas de colonne « férié », et la liste des fériés n’a pas de locations. Il faut les relier par la date qu’ils ont en commun.
À la fin de cette leçon
Remarque
Je peux relier deux tableaux par une colonne commune et vérifier que la jointure a fait ce que je voulais.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Jointure | mettre côte à côte les lignes de deux tableaux quand une colonne est égale | merge |
| Clé | la colonne que les deux tableaux ont en commun, pour trouver les paires | date |
| Jointure à gauche | garder toutes les lignes du premier tableau, avec ou sans partenaire | |
| Jointure interne | garder seulement les lignes qui ont un partenaire des deux côtés | |
| Sans partenaire | une ligne qui ne trouve rien dans l’autre tableau | |
| Unique | qui n’apparaît qu’une fois dans une colonne |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Deux tableaux, une colonne commune
On range souvent les données dans plusieurs petits tableaux, pour écrire chaque fait une seule fois. La liste des fériés est écrite une fois, pas recopiée sur 365 lignes.
Pour servir des deux, on les relie. On choisit une colonne que les deux ont, la clé. Chaque ligne de l’un cherche les lignes de l’autre qui ont la même valeur de clé.
Fabriquer le second tableau
Appuyez sur Démarrer dans la barre de la leçon et attendez que le labo tourne. Le terminal n’a pas Python : chaque Lancer démarre une commande dans le labo avec docker exec jupyter.
Le labo ne contient que hires.csv. Le premier Lancer écrit un second fichier, jours-feries.csv, avec huit jours fériés de 2025.
Écrire la liste des fériés
docker exec jupyter sh -c "printf '%s\n' 'date,ferie' '2025-01-01,Nouvel An' '2025-04-21,Lundi de Pâques' '2025-05-01,Fête du Travail' '2025-05-08,Victoire 1945' '2025-07-14,Fête nationale' '2025-08-15,Assomption' '2025-11-11,Armistice' '2025-12-25,Noël' > jours-feries.csv"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
La relire
docker exec jupyter cat jours-feries.csvAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
La jointure à gauche garde toutes vos lignes
Une jointure à gauche part du premier tableau. Toutes ses lignes restent. Si une ligne trouve un partenaire, les nouvelles colonnes sont remplies. Sinon, elles restent vides.
C’est le choix prudent pour ajouter de l’information à un tableau. Ajouter une colonne ne peut pas faire perdre un jour.
Exemple travaillé : trois jours reliés
| date | locations | ferie |
|---|---|---|
| 2025-04-20 | 298 | (vide) |
| 2025-04-21 | 232 | Lundi de Pâques |
| 2025-04-22 | 279 | (vide) |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Relier et montrer les fériés
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('jours-feries.csv'); j=h.merge(b, on='date', how='left'); print(len(h), len(b), len(j)); print(j['ferie'].notna().sum()); print(j[j['ferie'].notna()][['date','weekday','ferie','hires']].to_string(index=False))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une jointure faite à la main en Python
# Jointure à la main : chaque ligne de locations cherche sa date dans les fériés.
locations = [["2025-04-20", 298], ["2025-04-21", 232], ["2025-04-22", 279]]
feries = {"2025-04-21": "Lundi de Pâques"}
for ligne in locations:
date = ligne[0]
nom = "aucun"
if date in feries:
nom = feries[date]
print(date, ligne[1], nom)
# Ajoutez "2025-04-22": "Mardi" aux fériés et relancez.
À gauche, interne et externe
Une jointure interne garde seulement les lignes qui ont un partenaire des deux côtés. Une jointure externe garde toutes les lignes des deux tableaux, avec ou sans partenaire.
Le choix change le nombre de lignes, donc tous les nombres calculés ensuite. Dites quelle jointure vous avez utilisée, et pourquoi.
Compter les lignes de chaque sorte de jointure
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('jours-feries.csv'); print(len(h.merge(b, on='date', how='inner')), len(h.merge(b, on='date', how='left')), len(h.merge(b, on='date', how='outer')))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Regrouper, puis lire la taille de chaque groupe
Une fois reliés, posez la question. Marquez chaque jour comme férié ou non, gardez les jours de semaine, puis prenez la moyenne des locations pour chaque groupe.
Regardez combien de jours il y a dans chaque groupe. Une moyenne sur huit jours est une preuve bien plus faible qu’une moyenne sur 253.
Fériés et jours ordinaires de semaine
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('jours-feries.csv'); j=h.merge(b, on='date', how='left'); j['ferie_ou_non']=j['ferie'].notna(); w=j[j['weekday'].isin(['Mon','Tue','Wed','Thu','Fri'])]; print(w.groupby('ferie_ou_non')['hires'].agg(['count','mean']).round(1))"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une clé répétée multiplie les lignes
Si la clé se répète dans le second tableau, une ligne du premier trouve chaque copie et s’écrit une fois pour chacune. Le tableau grossit, et tous les totaux suivants sont trop grands.
Pandas peut le vérifier. Donnez validate="one_to_one" : il s’arrête avec une erreur si une clé n’est pas unique.
Répéter un férié et relier de nouveau
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('jours-feries.csv'); b=pd.concat([b, b.iloc[[0]]]); print(len(h.merge(b, on='date', how='left')), b['date'].is_unique)"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Demander à pandas de refuser
docker exec jupyter python3 -c "import pandas as pd; h=pd.read_csv('hires.csv'); b=pd.read_csv('jours-feries.csv'); b=pd.concat([b, b.iloc[[0]]]); h.merge(b, on='date', how='left', validate='one_to_one')" 2>&1 | tail -n 1Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Une erreur fréquente
Attention
Beaucoup pensent qu’une jointure à gauche ne peut pas changer le nombre de lignes. Elle peut l’augmenter. Elle ne perd jamais une ligne du premier tableau, mais une clé répétée en fait des copies. Comparez les nombres de lignes avant et après.
Pour aller plus loin : le lendemain
Dans votre carnet, reliez de nouveau les fériés à hires.csv. Puis calculez la moyenne des locations le lendemain de chaque férié.
Indice : ajoutez un jour à chaque date de férié avec pd.to_datetime(...) + pd.Timedelta(days=1) avant de relier. Dites d’abord ce que vous attendez.