Maths & NSI

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 tableau donnees de dictionnaires représentant les relevés ;
  • renvoie la température moyenne (float) pour cette zone ;
  • renvoie None si 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 liste donnees ;
  • calcule la température moyenne de la zone ;
  • renvoie la liste des dates où la température s'écarte de plus de seuil degrés (en valeur absolue, via la fonction abs()) 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 :

  1. test_zone_inexistante() : tester une zone qui n'existe pas ;
  2. test_une_seule_decennie() : tester une zone avec données sur une seule décennie ;
  3. 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 candidat

Corrigé

Corrigé réservé aux abonnés Premium.

Créez un compte gratuit : votre première correction est offerte.

Sujet officiel de la banque nationale de sujets 2026 de l'épreuve pratique de NSI (ministère de l'Éducation nationale, sujets.examens-concours.gouv.fr). Corrigé rédigé pour ce site.