← Tous les corrigés

Q5passé le

Le sujet

Sujet du quiz (PDF)

Les questions à revoir sont listées sur votre page personnelle (lien reçu par mail), à côté de votre note.

Bilan de la classe

Copies
17
Moyenne
15.7
Médiane
16
Min – max
11 – 18
  • 10–122
  • 14–164
  • 16–188
  • 18–203

Ce qu'il faut retenir

  • Q11, ratée par 10 élèves sur 17 : le nuage de points se trace avec df.plot.scatter(x="Volume", y="Close"). df.scatter n'existe pas, et sur une Series (df["Volume"]) il n'y a plus de colonne x.
  • Q20, ratée par 9 élèves : s.loc["FR"] sur un MultiIndex (pays, jour) est légal, il renvoie tout le premier niveau : 2 lignes, 10 + 30 = 40. Pas de KeyError, c'est le geste du TP Covid pour extraire un pays.
  • Q14, ratée par 8 élèves : resample("W") découpe en semaines calendaires finissant le dimanche, pas en blocs de 7 jours depuis le premier point. Du vendredi 1er au dimanche 3 : 3 jours, puis 7, puis 4.
  • Q18, ratée par 8 élèves : unstack() fait pivoter le dernier niveau de l'index (date) en colonnes : lignes FR, IT et colonnes d1, d2, forme (2, 2).
  • Q19, ratée par 7 élèves : un NaN ne lève pas d'erreur, plt.plot coupe simplement la ligne à cet endroit (deux segments).

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