DS MPSI - Analyse de consommation énergétique - Relevés électriques

20 Mar 2026 20 Mar 2026 225 vues ESSADDOUKI Mostafa 6 min de lecture
Énergie Lecture de fichiers Structures de données Intermédiaire
6 parties
12 questions
Python CPGE MPSI
~70 min

Analyse de consommation énergétique - Relevés électriques

On dispose d'un fichier texte mesures.txt contenant des relevés de consommation électrique.

Chaque ligne est de la forme :

batiment;jour;appareil;consommation
  • batiment : nom du bâtiment
  • jour : chaîne (ex : "lundi", "mardi", …)
  • appareil : type d'appareil
  • consommation : énergie consommée en kWh (entier)

Exemple de contenu

A;Lundi;Climatisation;50
A;Lundi;Eclairage;20
A;Mardi;Climatisation;60
B;Lundi;Eclairage;30
B;Mardi;Chauffage;80
C;Lundi;Climatisation;40
C;Mardi;Eclairage;25
1
Lecture et structuration 1 question
Q1

Écrire une fonction lire_mesures(fichier) qui retourne un dictionnaire :
{batiment: [(jour, appareil, consommation), ...]}

Exemple (partiel)

Entrée
lire_mesures("mesures.txt")
Sortie
{
    "A": [("Lundi", "Climatisation", 50), ("Lundi", "Eclairage", 20), ("Mardi", "Climatisation", 60)],
    "B": [("Lundi", "Eclairage", 30), ("Mardi", "Chauffage", 80)],
    "C": [("Lundi", "Climatisation", 40), ("Mardi", "Eclairage", 25)]
}
Solution — Lecture des mesures
def lire_mesures(fichier):
    mesures = {}
    with open(fichier, 'r', encoding='utf-8') as f:
        for ligne in f:
            ligne = ligne.strip()
            if not ligne:
                continue
            batiment, jour, appareil, consommation = ligne.split(';')
            consommation = int(consommation)
            
            if batiment not in mesures:
                mesures[batiment] = []
            mesures[batiment].append((jour, appareil, consommation))
    
    return mesures
2
Exploitation simple 3 questions
Q2

Écrire consommation_totale(mesures, batiment) qui retourne la consommation totale d'un bâtiment.

Solution — Consommation totale
def consommation_totale(mesures, batiment):
    if batiment not in mesures:
        return 0
    
    total = 0
    for jour, appareil, conso in mesures[batiment]:
        total += conso
    
    return total
Q3

Écrire appareils_utilises(mesures, batiment) qui retourne l'ensemble des appareils utilisés dans un bâtiment.

Solution — Appareils utilisés
def appareils_utilises(mesures, batiment):
    if batiment not in mesures:
        return set()
    
    appareils = set()
    for jour, appareil, conso in mesures[batiment]:
        appareils.add(appareil)
    
    return appareils
Q4

Écrire jours_actifs(mesures) qui retourne l'ensemble des jours présents dans les données.

Solution — Jours actifs
def jours_actifs(mesures):
    jours = set()
    for batiment, liste_mesures in mesures.items():
        for jour, appareil, conso in liste_mesures:
            jours.add(jour)
    return jours
3
Analyse avancée 3 questions
Q5

Écrire batiment_plus_consommateur(mesures) qui retourne le bâtiment ayant consommé le plus.

Solution — Bâtiment le plus consommateur
def batiment_plus_consommateur(mesures):
    max_conso = -1
    meilleur_batiment = None
    
    for batiment in mesures:
        total = consommation_totale(mesures, batiment)
        
        if total > max_conso:
            max_conso = total
            meilleur_batiment = batiment
        elif total == max_conso:
            if meilleur_batiment is None or batiment < meilleur_batiment:
                meilleur_batiment = batiment
    
    return meilleur_batiment
Q6

Écrire consommation_par_appareil(mesures) qui retourne un dictionnaire : {appareil: consommation_totale}

Solution — Consommation par appareil
def consommation_par_appareil(mesures):
    conso_par_app = {}
    for batiment, liste_mesures in mesures.items():
        for jour, appareil, conso in liste_mesures:
            conso_par_app[appareil] = conso_par_app.get(appareil, 0) + conso
    return conso_par_app
Q7

Écrire appareil_dominant(mesures, batiment) qui retourne l'appareil le plus consommateur dans un bâtiment.

Solution — Appareil dominant
def appareil_dominant(mesures, batiment):
    if batiment not in mesures:
        return None
    
    conso_par_app = {}
    for jour, appareil, conso in mesures[batiment]:
        conso_par_app[appareil] = conso_par_app.get(appareil, 0) + conso
    
    max_conso = -1
    dominant = None
    
    for appareil, conso in conso_par_app.items():
        if conso > max_conso:
            max_conso = conso
            dominant = appareil
        elif conso == max_conso:
            if dominant is None or appareil < dominant:
                dominant = appareil
    
    return dominant
4
Traitements croisés 2 questions
Q8

Écrire batiments_par_appareil(mesures) qui retourne : {appareil: ensemble_des_batiments}

Solution — Bâtiments par appareil
def batiments_par_appareil(mesures):
    dico = {}
    for batiment, liste_mesures in mesures.items():
        for jour, appareil, conso in liste_mesures:
            if appareil not in dico:
                dico[appareil] = set()
            dico[appareil].add(batiment)
    return dico
Q9

Écrire appareils_communs(mesures, b1, b2) qui retourne les appareils utilisés dans les deux bâtiments.

Solution — Appareils communs
def appareils_communs(mesures, b1, b2):
    if b1 not in mesures or b2 not in mesures:
        return set()
    
    app_b1 = appareils_utilises(mesures, b1)
    app_b2 = appareils_utilises(mesures, b2)
    
    return app_b1 & app_b2
5
Fichiers et filtrage 1 question
Q10

Écrire ecrire_consommations_elevees(fichier_entree, fichier_sortie, seuil) qui écrit dans un nouveau fichier uniquement les lignes où consommation ≥ seuil.

Solution — Écrire consommations élevées
def ecrire_consommations_elevees(fichier_entree, fichier_sortie, seuil):
    with open(fichier_entree, 'r', encoding='utf-8') as f_entree, \
         open(fichier_sortie, 'w', encoding='utf-8') as f_sortie:
        
        for ligne in f_entree:
            ligne = ligne.strip()
            if not ligne:
                continue
            parties = ligne.split(';')
            if len(parties) >= 4:
                try:
                    consommation = int(parties[3])
                    if consommation >= seuil:
                        f_sortie.write(ligne + '\n')
                except ValueError:
                    pass  # Ignorer les lignes mal formatées
6
Extension avancée 2 questions
Q11

Écrire profil_journalier(mesures) qui retourne un dictionnaire : {jour: consommation_totale}

Solution — Profil journalier
def profil_journalier(mesures):
    profil = {}
    for batiment, liste_mesures in mesures.items():
        for jour, appareil, conso in liste_mesures:
            profil[jour] = profil.get(jour, 0) + conso
    return profil
Q12

Écrire recommandation_economies(mesures, batiment) qui retourne un appareil utilisé dans d'autres bâtiments mais pas dans batiment, et ayant la plus faible consommation totale (idée d'optimisation).

Solution — Recommandation d'économies
def recommandation_economies(mesures, batiment):
    if batiment not in mesures:
        return None
    
    # Appareils utilisés dans le bâtiment
    appareils_batiment = appareils_utilises(mesures, batiment)
    
    # Consommation totale par appareil
    conso_par_app = consommation_par_appareil(mesures)
    
    # Filtrer les appareils non utilisés dans le bâtiment
    appareils_autres = [app for app in conso_par_app.keys() if app not in appareils_batiment]
    
    if not appareils_autres:
        return None
    
    # Trouver l'appareil avec la plus faible consommation totale
    min_conso = float('inf')
    meilleur_appareil = None
    
    for appareil in appareils_autres:
        conso = conso_par_app[appareil]
        if conso < min_conso:
            min_conso = conso
            meilleur_appareil = appareil
        elif conso == min_conso:
            if meilleur_appareil is None or appareil < meilleur_appareil:
                meilleur_appareil = appareil
    
    return meilleur_appareil
Sortie
// La sortie apparaîtra ici…
Prêt · Ctrl+Entrée pour exécuter

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.