Faut-il un vendeur de plus le samedi ?
Un loueur de vélos garde une ligne par jour de l’année 2025. La gérante se pose deux questions. Le week-end est-il vraiment plus chargé ? Combien de jours ont dépassé 400 locations ?
Faire défiler 365 lignes ne répond à aucune des deux. Quelques lignes de pandas y répondent en quelques secondes.
À la fin de cette leçon
Remarque
Je peux charger un tableau de données et lui poser des questions.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| DataFrame | un tableau de pandas aux colonnes nommées | |
| Colonne | un champ nommé, présent dans chaque ligne | locations["rain_mm"] |
| Filtre | un test qui ne garde que certaines lignes | locations["hires"] > 400 |
| Regrouper | séparer les lignes selon la valeur d’une colonne | groupby("weather") |
| Résumer | remplacer beaucoup de valeurs par une seule | |
| Médiane | la valeur du milieu, une fois les valeurs rangées | |
| Mode | la valeur la plus fréquente |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Deux entrées dans le labo
Appuyez sur Démarrer dans la barre de la leçon et attendez que le labo tourne. Le terminal n’a pas de Python à lui. Chaque bouton Exécuter tape donc docker exec jupyter, qui lance une commande dans le conteneur du labo.
Ouvrez JupyterLab depuis la barre pour le carnet. Un bloc titré À taper dans votre carnet va dans une cellule. Il ne tourne pas sur cette page, dont le Python n’a pas pandas.
Un DataFrame est un tableau à colonnes nommées
pd.read_csv lit un fichier CSV et rend un DataFrame. Chaque colonne prend son nom dans la première ligne du fichier.
Ici, les noms sont en anglais : date, month, weekday, weather, temp_c, rain_mm et hires, le nombre de vélos loués. Les valeurs aussi : sunny pour le soleil, rainy pour la pluie, cloudy pour un ciel couvert.
Charger le fichier et voir le début
docker exec jupyter python3 steps/load.pyAffiché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.
À taper dans votre carnet : une colonne
import pandas as pd
locations = pd.read_csv("hires.csv")
# La pluie la plus forte de l’année, en millimètres.
locations["rain_mm"].max()
Un filtre ne garde que certaines lignes
locations["hires"] > 400 pose une question à chaque ligne. La réponse est une colonne de True et de False.
Placée dans locations[...], cette réponse ne garde que les lignes True. Pour deux tests, écrivez & pour « et », | pour « ou », et mettez chaque test entre parenthèses.
Compter les jours très chargés
docker exec jupyter python3 steps/filter.pyAffiché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.
À taper dans votre carnet : deux tests
# Les jours de pluie qui ont quand même dépassé 300 locations.
pluie_et_monde = locations[(locations["weather"] == "rainy") & (locations["hires"] >= 300)]
len(pluie_et_monde)
Une erreur fréquente
Attention
Beaucoup pensent que le and de Python relie deux tests dans pandas. C’est faux : and attend un seul True ou False, et un test sur une colonne en donne 365. pandas s’arrête alors sur « The truth value of a Series is ambiguous ». Écrivez &, avec des parenthèses autour de chaque test.
groupby sépare les lignes, puis résume
locations.groupby("weather")["hires"].mean() fait trois choses. Il sépare les lignes par météo. Il prend la colonne hires de chaque groupe. Il calcule la moyenne de chacun.
La moyenne se laisse tirer par quelques jours extrêmes. La médiane résiste mieux : regardez les deux. Le mode convient à une colonne de mots, comme la météo.
Exemple travaillé : un seul grand jour
| Jours | Moyenne | Médiane | Mode |
|---|---|---|---|
| 210, 185, 240, 185, 260, 230, 495 | 1805 / 7 = 257,9 | 230, la 4e des 7 valeurs rangées | 185, vu deux fois |
| Les mêmes sans 495 | 1310 / 6 = 218,3 | (210 + 230) / 2 = 220 | 185, vu deux fois |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Moyenne et médiane à la main
# Une semaine de locations à une station.
jours = [210, 185, 240, 185, 260, 230, 495]
total = 0
for valeur in jours:
total = total + valeur
print("moyenne :", round(total / len(jours), 1))
dans_l_ordre = sorted(jours)
milieu = len(dans_l_ordre) // 2
print("médiane :", dans_l_ordre[milieu])
# Retirez 495 de la liste, puis relancez.
# Lequel des deux nombres bouge le plus ?
Moyenne des locations par météo
docker exec jupyter python3 steps/weather.pyAffiché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.
Comparer week-end et semaine
docker exec jupyter python3 steps/weekend.pyAffiché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.
À taper dans votre carnet : la médiane
# La médiane par météo, à comparer aux moyennes de weather.py.
locations.groupby("weather")["hires"].median()
Pour aller plus loin
Dans votre carnet, trouvez le mois le plus calme. Regroupez par month, prenez la moyenne de hires, puis rangez le résultat avec sort_values.
Posez ensuite votre propre question, avec un filtre et un regroupement. Par exemple : les jours de soleil seulement, le week-end reste-t-il plus chargé ? Notez votre prévision avant d’exécuter la cellule.