# -*- coding: utf-8 -*- """ Corrigé Python - Bac NSI 2026 - Épreuve pratique - Sujet 16 Thème : warming stripes, CSV, moyenne et graphique """ from __future__ import annotations import csv import matplotlib.pyplot as plt def charger(nom_fichier: str) -> list[dict]: """Lit un fichier CSV et renvoie une liste de dictionnaires typés.""" donnees = [] with open(nom_fichier, mode="r", encoding="utf-8") as f: lecteur = csv.DictReader(f) for ligne in lecteur: donnees.append({"année": int(ligne["Year"]), "écart": float(ligne["Anomaly"])}) return donnees def ecart_temperature(datas: list[dict], annee: int) -> float | None: """Renvoie l'écart de température de l'année donnée, ou None si absente.""" for dico in datas: if dico["année"] == annee: return dico["écart"] return None def derniere_annee_ecart_negatif(datas: list[dict]) -> int | None: """Renvoie la dernière année dont l'écart est négatif.""" annees = sorted(dico["année"] for dico in datas) for annee in reversed(annees): ecart = ecart_temperature(datas, annee) if ecart is not None and ecart < 0: return annee return None def moyenne_ecarts(annee_debut: int, annee_fin: int, datas: list[dict]) -> float: """Renvoie la moyenne des écarts sur la période indiquée.""" somme = 0 compteur = 0 for dico in datas: if annee_debut <= dico["année"] <= annee_fin: somme += dico["écart"] compteur += 1 return somme / compteur def prevision(datas: list[dict], annee: int, n: int) -> float: """Prévoit l'écart de température par régression linéaire sur les n dernières années.""" longueur = len(datas) annee_debut = datas[longueur - n]["année"] annee_fin = datas[longueur - 1]["année"] moy_annees = (annee_debut + annee_fin) / 2 moy_temperatures = moyenne_ecarts(annee_debut, annee_fin, datas) numerateur = 0 denominateur = 0 for i in range(1, n + 1): ecart_annee = datas[longueur - i]["année"] - moy_annees ecart_temp = datas[longueur - i]["écart"] - moy_temperatures numerateur += ecart_annee * ecart_temp denominateur += ecart_annee ** 2 a = numerateur / denominateur b = moy_temperatures - a * moy_annees return a * annee + b def graphique(datas: list[dict]) -> None: """Affiche les warming stripes.""" fig, ax = plt.subplots(figsize=(10, 2)) cmap = plt.get_cmap("seismic") temperatures = [dico["écart"] for dico in datas] max_val = max(max(temperatures), -min(temperatures)) norm = plt.Normalize(-max_val, max_val) annees = [dico["année"] for dico in datas] ordonnees = [1 for _ in datas] ax.bar(annees, ordonnees, width=1.0, color=cmap(norm(temperatures))) ax.set_title("Warming Stripes mondiales - Base 1901-2000") plt.yticks([], []) ax.set_xlabel("Année") plt.tight_layout() plt.show() def tests() -> None: datas = [ {"année": 2020, "écart": -0.2}, {"année": 2021, "écart": 0.1}, {"année": 2022, "écart": 0.3}, ] assert ecart_temperature(datas, 2021) == 0.1 assert ecart_temperature(datas, 1999) is None assert derniere_annee_ecart_negatif(datas) == 2020 assert moyenne_ecarts(2020, 2022, datas) == (-0.2 + 0.1 + 0.3) / 3 print("Tous les tests du sujet 16 sont passés.") if __name__ == "__main__": tests()