Séance 5 : le temps et les figures (
df.plot, séries temporelles,resample/rolling,MultiIndex/unstack,matplotlib). Clé de correction avec explications synthétiques. La lettre correspond à l’ordre des choix sur le sujet (A = 1er choix).
Clé de correction
| Q | Réponse | Rappel | Référence |
|---|---|---|---|
| 1 | A | df.plot() : une courbe par colonne numérique, index en abscisse |
S5 slide « df.plot() » · nb 2-06 § df.plot() |
| 2 | C | to_datetime : chaînes → datetime64 |
S5 slide « dates en texte » · nb 2-11 § ex. 2 to_datetime |
| 3 | B | accesseur .dt : .dt.year |
S5 slide « .dt » · nb 2-11 § ex. 4 .dt |
| 4 | D | resample exige un DatetimeIndex |
S5 slides « DatetimeIndex », « resample » · nb 2-11 § ex. 5 + § resample() |
| 5 | C | resample = corbeilles disjointes, rolling = fenêtre glissante |
S5 slide « rolling » · nb 2-11 § aggrégations resample/rolling |
| 6 | A | plot relie, scatter disperse |
S5 slide « figure et axes » (plot seul) · nb 3-01 § plt.plot + § plt.scatter |
| 7 | B | label= + plt.legend() |
S5 slide « figure et axes » · nb 3-01 § légende label |
| 8 | D | axes[0, 2] : ligne 0, colonne 2 |
S5 slide « subplots » · nb 3-02 § plt.subplots |
| 9 | A | ax.set_title (vs plt.title pour la figure courante) |
S5 slides « figure et axes », « subplots » · nb 3-02 § améliorer les figures composées |
| 10 | C | savefig avant show |
S5 slide « savefig avant show » · nb 3-01 § plt.figure/plt.show + exercice savefig |
| 11 | D | df.plot.scatter(x=, y=) : le nuage de points depuis pandas |
S5 slide « df.plot() » (variantes) · nb 2-06 § nuages de points df.plot.scatter |
| 12 | B | fig = la figure (l’image), ax = un repère (sous-figure) |
S5 slide « figure et axes » · nb 3-02 § figures et sous-figures |
| 13 | A | slicing loc inclusif ; février 2020 = 29 jours |
S5 slide « DatetimeIndex » · nb 2-11 § slicing avec des dates |
| 14 | D | semaines W ancrées au dimanche : 3 + 7 + 4 |
S5 slide « resample » (étiquetée au dimanche) · nb 2-11 § resample() |
| 15 | B | rolling(3) : 2 premiers NaN |
S5 slide « rolling » (premiers NaN) · nb 2-11 § rolling() |
| 16 | C | Timestamp − Timestamp = Timedelta ; 42 jours |
S5 slide « .dt » (Timedelta) · nb 2-11 § les types de base / version pandas |
| 17 | A | 20 octobre 2026 = mardi (Tuesday), mois 10 |
S5 slide « .dt » (day_name) · nb 2-11 § ex. 4 .dt |
| 18 | D | unstack() : dernier niveau → colonnes |
S5 slide « unstack » · aucun nb S5 ; TP Covid (nb 2-07 S4 : « pour les avancés ») |
| 19 | B | un NaN coupe la ligne |
S5 slide « 3 pièges » (clôture) · nb 3-01 § attention aux valeurs manquantes |
| 20 | C | s.loc["FR"] : le 1er niveau du MultiIndex, donc les 2 lignes FR |
S5 slides « unstack », « TP du jour » (MultiIndex) · aucun nb ; TP Covid (.loc sur MultiIndex) |
Q1
Bonne réponse : A — une courbe par colonne, l’index en abscisse, avec une légende automatique
Pourquoi : df.plot() trace toutes les colonnes numériques en fonction de l’index, et met le nom des colonnes dans la légende (c’est ce qu’on a vu avec les iris et Amazon). Pas besoin de x=/y= ; le nuage de points est df.plot.scatter(x=..., y=...).
Où dans le cours : slide « df.plot() : une courbe par colonne » · nb 2-06 § « visualisation de la dataframe - df.plot() »
Q2
Bonne réponse : C — convertit la colonne de chaînes en une Series de type datetime64
Pourquoi : pd.to_datetime parse les chaînes ; format="%Y-%m-%d" décrit la forme d’entrée (2026-10-20, année sur 4 chiffres, mois, jour) et évite les ambiguïtés. Il ne touche pas à l’index (il faudra set_index) et ne produit pas de texte formaté.
Où dans le cours : slide « Les dates arrivent en texte » · nb 2-11 § « exercice 2 : pd.to_datetime() »
Q3
Bonne réponse : B — df["date"].dt.year
Pourquoi : les attributs de dates d’une Series passent par l’accesseur .dt (comme .str pour les chaînes, .cat pour les catégories). .year directement sur la Series lève AttributeError ; .dt.year(), un TypeError (c’est un attribut, pas une méthode) ; .str[:4] ne marche que sur des chaînes.
Où dans le cours : slide « L’accesseur .dt » · nb 2-11 § « exercice 4 : l’accessor .dt »
Q4
Bonne réponse : D — que l’index soit un DatetimeIndex (par ex. après df.set_index("date"))
Pourquoi : resample découpe le temps : il lui faut un index temporel (sinon TypeError: Only valid with DatetimeIndex…), ou bien le paramètre on="date". L’ordre de tri et le type chaîne n’ont rien à voir.
Où dans le cours : slide « Les dates en index : DatetimeIndex » + slide « resample » · nb 2-11 § « exercice 5 : indexons par les dates » et § « resample() »
Q5
Bonne réponse : C — resample découpe le temps en corbeilles disjointes (une valeur par corbeille) ; rolling utilise une fenêtre glissante (une valeur par point)
Pourquoi : avec resample("7D") chaque donnée appartient à une seule corbeille et on obtient environ n/7 valeurs ; avec rolling(7) chaque point reçoit la moyenne des 7 dernières observations et on garde autant de valeurs que de points (effet lissant).
Où dans le cours : slide « rolling : la fenêtre glissante » · nb 2-11 § « aggrégations : resample() et rolling() »
Q6
Bonne réponse : A — plot relie les points par des segments, scatter affiche des points isolés
Pourquoi : plt.plot trace une ligne brisée (on peut ajouter des marqueurs) ; plt.scatter dessine un nuage de points non reliés, avec taille et couleur réglables par point (s=, c=).
Où dans le cours : slide « matplotlib : figure et axes » (plot seulement ; scatter n’apparaît que via df.plot.scatter, slide « df.plot() ») · nb 3-01 § « tracer une courbe avec plt.plot » et § « nuages de points (plt.scatter) »
Q7
Bonne réponse : B — label= sur chaque plot, puis plt.legend()
Pourquoi : le paramètre s’appelle label et la légende ne s’affiche que si on appelle plt.legend(). name= n’existe pas (AttributeError) ; sans plt.legend() rien n’apparaît ; plt.title met un titre, pas une légende.
Où dans le cours : slide « matplotlib : figure et axes » (label= + legend()) · nb 3-01 § « donner une légende à plusieurs plots sur la même figure label »
Q8
Bonne réponse : D — axes[0, 2].plot(x, y)
Pourquoi : plt.subplots(2, 3) renvoie un tableau numpy axes de forme (2, 3) : ligne 0 = haut, colonne 2 = droite. axes[2, 0] et axes[1, 3] sont hors limites (IndexError) ; fig.plot n’existe pas.
Où dans le cours : slide « subplots : une grille » · nb 3-02 § « par vecteur de sous-figures (plt.subplots) » (l’exemple y est justement subplots(2, 3))
Q9
Bonne réponse : A — ax.set_title("Titre")
Pourquoi : sur un objet Axes (sous-figure), les réglages sont des méthodes préfixées par set_ : set_title, set_xlabel, set_ylabel. plt.title s’applique à la figure courante, pas à un ax donné ; ax.title est un objet Text (non appelable) ; la figure globale a fig.suptitle, pas set_title.
Où dans le cours : slide « matplotlib : figure et axes » + slide « subplots » · nb 3-02 § « améliorer les figures composées » (ax1.set_title)
Q10
Bonne réponse : C — après les tracés et avant plt.show()
Pourquoi : plt.show() affiche puis clôt la figure courante (en mode inline) ; un savefig placé après enregistre une figure vide. Placé avant le premier plot, il enregistrerait aussi une figure vide.
Où dans le cours : slide « Sauvegarder : savefig avant show » · nb 3-01 § « plt.figure(), plt.show() » et § « exercice : sauver une figure dans un fichier »
Q11
Bonne réponse : D — df.plot.scatter(x="Volume", y="Close")
Pourquoi : les variantes de df.plot se nomment comme la question qu’elles posent : .plot.scatter(x=, y=) met deux colonnes l’une contre l’autre. df.plot(x=, y=) fonctionne mais relie les points (une courbe, pas un nuage) ; df.scatter(...) n’existe pas (AttributeError : c’est df.plot.scatter) ; sur une Series, plot.scatter n’a plus de colonne x (TypeError).
Où dans le cours : slide « df.plot() : une courbe par colonne » (encadré des variantes : df.plot.scatter(x="Volume", y="Close")) · nb 2-06 § « nuages de points df.plot.scatter »
Q12
Bonne réponse : B — fig est la figure entière (l’image), ax un repère dessiné dessus
Pourquoi : plt.subplots() renvoie le couple (figure, sous-figure). Le faux ami du jour : axes désigne un repère, pas les axes x et y. On trace et on habille dans le repère (ax.plot, ax.set_title), on enregistre la figure (fig.savefig) ; fig.plot n’existe pas, et les deux objets ne sont pas interchangeables.
Où dans le cours : slide « matplotlib : figure et axes » (« fig : la page ; ax : UN repère dessus ») · nb 3-02 § « figures et sous-figures » (« fig désigne la figure globale, axis les sous-figures — et non les axes des figures »)
Q13
Bonne réponse : A — 11 29
Pourquoi : avec .loc et des chaînes de dates, les deux bornes sont incluses : du 10 au 20 janvier, cela fait 11 jours. s.loc["2020-02"] sélectionne tout le mois ; 2020 est bissextile, d’où 29 jours (la série couvre bien tout février puisqu’elle va jusqu’au 9 avril).
Où dans le cours : slide « Les dates en index : DatetimeIndex » (slicing inclusif, chaîne partielle) · nb 2-11 § « slicing avec des dates »
Q14
Bonne réponse : D — [3, 7, 4]
Pourquoi : la fréquence "W" désigne des semaines calendaires se terminant le dimanche, indépendamment du début des données. Du vendredi 1er au dimanche 3 janvier : 3 jours ; du 4 au 10 : 7 jours ; du 11 au jeudi 14 : 4 jours. Les corbeilles ne sont donc pas [7, 7] : resample ne compte pas « 7 jours à partir du premier point ».
Où dans le cours : slide « resample : des corbeilles régulières » (« une valeur par semaine (étiquetée au dimanche) ») · nb 2-11 § « resample() » (mentionne 'W' mais pas l’ancrage au dimanche)
Q15
Bonne réponse : B — [nan, nan, 2.0, 3.0, 4.0]
Pourquoi : rolling(3) attache à chaque point la moyenne des 3 dernières valeurs (la sienne et les 2 précédentes) ; les 2 premiers points n’ont pas assez d’historique, d’où les NaN. La longueur est conservée (5). [1.0, 1.5, 2.0, …] correspondrait à min_periods=1.
Où dans le cours : slide « rolling : la fenêtre glissante » (« les premiers sont NaN ») · nb 2-11 § « rolling() » (encadré « au centre ou à droite »)
Q16
Bonne réponse : C — Timedelta 42
Pourquoi : la différence de deux instants (Timestamp) est une durée (Timedelta) ; du 8 septembre au 20 octobre il y a 22 + 20 = 42 jours. (Rappel : Timestamp + Timestamp est interdit, Timestamp ± Timedelta donne un Timestamp.)
Où dans le cours : slide « L’accesseur .dt » ((d - d.min()).dt.days) · nb 2-11 § « les types de base › la version pandas » (encadré « arithmétique » : TS - TS -> TD)
Q17
Bonne réponse : A — Tuesday 10
Pourquoi : .dt.day_name() renvoie le nom du jour en anglais par défaut (le 20 octobre 2026 est un mardi : Tuesday) ; .dt.month renvoie le numéro du mois (10), .dt.day donnerait 20.
Où dans le cours : slide « L’accesseur .dt » (d.dt.day_name()) · nb 2-11 § « exercice 4 : l’accessor .dt » (le nb ne montre que dayofweek, day_name vient du slide)
Q18
Bonne réponse : D — (2, 2) ['d1', 'd2']
Pourquoi : après set_index(["pays", "date"]), la série cas a un MultiIndex (pays, date) ; unstack() fait pivoter le dernier niveau (date) en colonnes : lignes FR, IT et colonnes d1, d2, soit une forme (2, 2). C’est le passage « format long → format large » utilisé dans le TP Covid pour tracer une courbe par pays.
Où dans le cours : slide « unstack : préparer un tracé » + TP Covid · aucun notebook du planning S5 ; seule trace : nb 2-07 (S4) § « conclusion », où unstack() est signalé « pour les avancés »
Q19
Bonne réponse : B — deux segments séparés, la ligne étant interrompue au NaN
Pourquoi : plt.plot relie les points consécutifs ; un point manquant ne peut être relié à rien, la ligne est coupée (ici (0,1)–(1,2) puis (3,4)–(4,5)). Aucune interpolation automatique, aucune erreur ; avec marker= on verrait les 4 points valides.
Où dans le cours : slide « Les 3 pièges du jour » (piège « NaN coupe une courbe » cité en clôture dans le README, absent du texte du slide) · nb 3-01 § « attention aux valeurs manquantes »
Q20
Bonne réponse : C — 2 40
Pourquoi : après set_index(["pays", "jour"]) l’index a deux niveaux ; s.loc["FR"] sélectionne tout le premier niveau et renvoie une sous-Series (les jours 1 et 2 de la France) : len vaut 2 et la somme 10 + 30 = 40. Donner seulement le premier niveau est légal (c’est le geste du TP Covid pour extraire un pays) : pas de KeyError, et ce n’est pas une valeur unique.
Où dans le cours : slide « unstack : préparer un tracé » (Series à MultiIndex) et slide « TP du jour : Covid par pays » (index (Date, Pays), « extraire 4 ou 5 pays ») · aucun notebook du planning S5 ; .loc sur MultiIndex se pratique dans le TP Covid
