Baccalauréat — Épreuve pratique — 2026 — NSI
Épreuve pratique NSI 2026 — Sujet 18 : températures océaniques en Polynésie
Sujet
Épreuve pratique de NSI, session 2026 — sujet n°18 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é.
Températures océaniques en Polynésie
En Polynésie française, un réseau de bouées océanographiques mesure quotidiennement la température de surface de l'océan dans quatre archipels : Société, Tuamotu, Marquises et Australes. Ces données permettent de documenter le réchauffement climatique dans le Pacifique Sud. Vous êtes chargé(e) de développer des outils d'analyse pour traiter ces relevés et détecter les anomalies thermiques.
On vous fournit le fichier analyse_temperatures_polynesie.py dans lequel figurent les données à utiliser, ainsi que les fonctions à écrire, compléter ou corriger.
Question 1. Écrire une fonction temperature_moyenne(zone, donnees) qui :
- prend en paramètres une chaîne
zone(nom d'un archipel) et un tableaudonneesde dictionnaires représentant les relevés ; - renvoie la température moyenne (
float) pour cette zone ; - renvoie
Nonesi la zone n'a aucun relevé.
Exemple :
>>> donnees = [
{'date': '2020-01-15', 'zone': 'Societe', 'temperature': 28.5},
{'date': '2020-01-16', 'zone': 'Societe', 'temperature': 29.0},
{'date': '2020-01-15', 'zone': 'Tuamotu', 'temperature': 27.5}
]
>>> temperature_moyenne('Societe', donnees)
28.75
>>> temperature_moyenne('Marquises', donnees)
>>>Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.
Question 2. Écrire une fonction detecter_anomalies(zone, seuil, donnees) qui :
- prend en paramètres une zone, un seuil (
float) et la listedonnees; - calcule la température moyenne de la zone ;
- renvoie la liste des dates où la température s'écarte de plus de
seuildegrés (en valeur absolue, via la fonctionabs()) de cette moyenne ; - renvoie une liste vide si la zone n'existe pas.
Exemple avec la liste donnees_test fournie dans le script :
>>> detecter_anomalies('Societe', 1.0, donnees_test)
['2010-06-20', '2021-05-30']Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.
Dans le fichier analyse_temperatures_polynesie.py figure le code de la fonction evolution_par_decennie(zone, donnees) censée calculer l'évolution des températures moyennes par décennie (2010, 2020).
Question 3. Compléter les trois fonctions de test, situées à la fin du fichier, pour la fonction evolution_par_decennie en utilisant le jeu de données fourni :
test_zone_inexistante(): tester une zone qui n'existe pas ;test_une_seule_decennie(): tester une zone avec données sur une seule décennie ;test_plusieurs_decennies(): tester une zone avec données sur plusieurs décennies.
Vos tests doivent permettre d'identifier le bug présent dans le code.
Question 4. Après avoir identifié le bug grâce à vos tests, corriger la fonction evolution_par_decennie.
Appel professeur — Appeler le professeur pour lui présenter votre réponse ou en cas de difficulté.
Fichier fourni : analyse_temperatures_polynesie.py
# =================================================================================#
# Données de test
donnees_test = [
# Société - Données sur 2010 et 2020
{'date': '2010-01-15', 'zone': 'Societe', 'temperature': 27.0},
{'date': '2010-06-20', 'zone': 'Societe', 'temperature': 26.5},
{'date': '2011-03-10', 'zone': 'Societe', 'temperature': 27.5},
{'date': '2020-02-14', 'zone': 'Societe', 'temperature': 28.0},
{'date': '2020-08-22', 'zone': 'Societe', 'temperature': 28.5},
{'date': '2021-05-30', 'zone': 'Societe', 'temperature': 29.0},
# Tuamotu - Données sur 2010 et 2020
{'date': '2015-04-10', 'zone': 'Tuamotu', 'temperature': 26.8},
{'date': '2020-07-15', 'zone': 'Tuamotu', 'temperature': 27.5},
{'date': '2021-09-20', 'zone': 'Tuamotu', 'temperature': 28.0},
# Marquises - Données uniquement sur 2020
{'date': '2020-03-15', 'zone': 'Marquises', 'temperature': 25.5},
{'date': '2021-07-10', 'zone': 'Marquises', 'temperature': 26.0},
{'date': '2022-11-25', 'zone': 'Marquises', 'temperature': 26.5},
]
# =================================================================================#
# Question 1 : Ecrire le code de votre fonction température_moyenne
# =================================================================================#
# Question 2 : Ecrire le code de votre fonction detection_anomalies
# =================================================================================#
# code de la fonction evolution_par_decennie à corriger dans la question 4:
def evolution_par_decennie(zone, donnees):
"""
Calcule l'évolution des températures moyennes par décennie pour une zone.
ATTENTION: Cette fonction contient un bug volontaire à détecter et corriger.
Arguments:
zone (str): Nom de l'archipel (ex: 'Societe', 'Tuamotu')
donnees (list): Liste de dictionnaires de relevés
Renvoie:
dict: Dictionnaire {décennie : température_moyenne}
ex: {2010: 27.5, 2020: 28.3}
Renvoie un dictionnaire vide si la zone n'existe pas
"""
# Filtrage des relevés pour la zone
releves_zone = [r for r in donnees if r['zone'] == zone]
if len(releves_zone) == 0:
return {}
# Regroupement par décennie
temperatures_par_decennie = {}
for releve in releves_zone:
# Extraction de l'année de la date (format: 'YYYY-MM-DD')
annee = int(releve['date'].split('-')[0])
# Calcul de la décennie
decennie = (annee // 10)
if decennie not in temperatures_par_decennie:
temperatures_par_decennie[decennie] = []
temperatures_par_decennie[decennie].append(releve['temperature'])
# Calcul des moyennes
moyennes = {}
for decennie, temperatures in temperatures_par_decennie.items():
moyennes[decennie] = round(sum(temperatures) / len(temperatures), 2)
return moyennes
# =================================================================================#
# Exercice 2.1 :
"""
Tests
À compléter par le candidat dans le cadre de la question 3
"""
def test_zone_inexistante():
"""
Test 1 : Tester une zone qui n'existe pas
À compléter:
1. Appeler evolution_par_decennie avec une zone inexistante
2. Vérifier que le résultat est un dictionnaire vide
"""
pass # à remplacer par le code du candidat
def test_une_seule_decennie():
"""
Test 2: Tester une zone avec données sur une seule décennie
À compléter:
1. Appeler evolution_par_decennie avec la zone appropriée
2. Vérifier que le résultat ne contient qu'une seule décennie (2020)
3. Vérifier la température moyenne
"""
pass # à remplacer par le code du candidat
def test_plusieurs_decennies():
"""
Test 3 : Tester une zone avec données sur plusieurs décennies
À compléter:
1. Appeler evolution_par_decennie avec la zone appropriée
2. Vérifier que le résultat contient bien les clés 2010 et 2020
3. Vérifier que les températures moyennes sont cohérentes
"""
pass # à remplacer par le code du candidatCorrigé
Créez un compte gratuit : votre première correction est offerte.