Baccalauréat — Épreuve pratique — 2026 — NSI
Épreuve pratique NSI 2026 — Sujet 16 : bandes de réchauffement et prévision
Sujet
Épreuve pratique de NSI, session 2026 — sujet n°16 de la banque nationale. Durée : 1 heure, sur ordinateur. Le candidat dispose de l'énoncé et de fichiers de code et de données ; il agit en autonomie et, aux « appels professeur » indiqués, présente son travail à l'examinateur ou le sollicite en cas de difficulté.
Bandes de réchauffement (warming stripes)
Conçues par le climatologue Ed Hawkins en 2018, les warming stripes (« bandes de réchauffement ») permettent de représenter visuellement l'évolution des températures au cours du temps par rapport à une moyenne historique.
Le fichier datas.csv est issu du site de l'agence américaine d'observation océanique et atmosphérique (NOAA). Il contient les écarts de températures mondiales par rapport à la moyenne du XXᵉ siècle (1901-2000), pour chaque année de 1851 à 2025. Par exemple, la ligne 2020,1.01 signifie qu'en 2020, la température moyenne mondiale (terres et océans) était supérieure de 1,01 °C à la moyenne de référence.
L'image warming_stripes.png représente les warming stripes obtenues à partir des données présentes dans le fichier datas.csv : une suite de bandes verticales, une par année, dont les couleurs varient du bleu au rouge, les tons de bleu indiquant des températures inférieures à la moyenne de référence et les tons de rouge des températures supérieures à cette même moyenne (figure 1 du sujet).
La fonction charger(fichier), dont le code est fourni dans le script warming_stripes.py, lit ce fichier et renvoie une liste de dictionnaires. Chaque dictionnaire représente une année avec les clés 'année' (type entier) et 'écart' (type flottant).
Question 1. Écrire la fonction ecart_temperature(datas, annee) qui prend en paramètres la liste des données et une année cible. Elle doit renvoyer l'écart de température correspondant à cette année, ou None si l'année n'est pas présente dans les données. Rédiger ensuite un jeu de tests (via des assertions) permettant de vérifier le bon fonctionnement de votre fonction, y compris pour une année hors du jeu de données.
Question 2. En utilisant la fonction derniere_annee_ecart_negatif (déjà fournie et qui utilise votre fonction), déterminer quelle a été la dernière année où la température mondiale était inférieure à la moyenne de référence.
Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.
La fonction prevision(datas, annee, n), dont le code est fourni, effectue une régression linéaire sur les n dernières années pour estimer l'écart de température d'une année future. C'est-à-dire que cette fonction calcule une droite proche des points des n dernières années et renvoie l'ordonnée du point sur cette droite dont l'abscisse est l'année cible.
Question 3. En exécutant prevision(datas_temperature, 2040, 20), le résultat obtenu semble absurde compte tenu du réchauffement actuel. Cette absurdité provient d'une erreur de logique qui s'est glissée dans la fonction annexe moyenne_ecarts. Analyser le code de cette fonction, identifier l'erreur, et la corriger. Que devient alors la prévision pour 2040 ?
Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.
Question 4. On souhaite générer la représentation graphique des warming stripes. Dans la fonction graphique(datas), le code pour gérer les couleurs (du bleu pour le froid au rouge pour le chaud) est déjà préparé. Compléter le code de la fonction en générant les listes annees (pour l'axe des abscisses) et ordonnees.
Indication : pour obtenir des bandes colorées de hauteur uniforme couvrant tout le graphique, la liste ordonnees devra contenir la valeur 1 pour chaque année traitée.
Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.
Fichiers fournis
Le dossier comporte une version PDF de l'énoncé, le code source de départ warming_stripes.py, le fichier datas.csv (écarts de 1851 à 2025) et l'image warming_stripes.png. Les bibliothèques matplotlib et csv doivent être disponibles.
warming_stripes.py
import csv
import matplotlib.pyplot as plt
############ Question 1 ############
def charger(nom_fichier):
"""
Lit un fichier CSV (contenant les colonnes 'Year' et 'Anomaly')
et renvoie une liste de dictionnaires correctement typés.
"""
donnees = []
with open(nom_fichier, mode='r', encoding='utf-8') as f:
lecteur = csv.DictReader(f)
for ligne in lecteur:
annee = int(ligne["Year"])
ecart = float(ligne["Anomaly"])
donnees.append({"année": annee, "écart": ecart})
return donnees
# Chargement global des données
datas_temperature = charger("datas.csv")
#############################################################################
# Question 1 : Recherche de l'écart #
#############################################################################
# Écrire la fonction ecart_temperature et ses tests ici
#############################################################################
# Question 2 : Dernière année négative #
#############################################################################
def derniere_annee_ecart_negatif(datas):
annee = max([element["année"] for element in datas])
ecart = ecart_temperature(datas, annee)
while ecart >= 0:
annee = annee - 1
ecart = ecart_temperature(datas, annee)
return annee
#############################################################################
# Question 3 : Analyse et correction de bug #
#############################################################################
def moyenne_ecarts(annee_debut, annee_fin, datas):
"""
Renvoie la moyenne des écarts de température pour la période comprise
entre annee_debut et annee_fin (incluses).
"""
somme = 0
compteur = 0
for dico in datas:
if annee_debut <= dico["année"] and dico["année"] <= annee_fin:
somme = somme - dico["écart"]
compteur += 1
return somme / compteur
def prevision(datas, annee, n):
"""
Renvoie l'écart de température attendu calculé 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
# print("Prévision pour 2040 :", prevision(datas_temperature, 2040, 20))
#############################################################################
# Question 4 : Dataviz (Warming Stripes) #
#############################################################################
def graphique(datas):
"""
Représente visuellement les warming stripes.
"""
fig, ax = plt.subplots(figsize=(10, 2))
# Création d'une palette de couleurs basée sur l'amplitude thermique
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)
# A COMPLETER
# Création des listes annees et ordonnees
# pour les abscisses et ordonnées
# Génération du graphique
ax.bar(annees, ordonnees, width=1.0, color=cmap(norm(temperatures)))
ax.set_title("Warming Stripes mondiales - Base 1901-2000")
plt.yticks([], []) # Masque l'axe Y car seule la couleur compte
ax.set_xlabel("Année")
plt.tight_layout()
plt.show()
# graphique(datas_temperature)datas.csv (début et fin du fichier)
Year,Anomaly
1851,-0.15
1852,-0.05
1853,-0.03
...
2023,0.9
2024,1.22
2025,1.29Corrigé
Créez un compte gratuit : votre première correction est offerte.