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âtimentjour: chaîne (ex : "lundi", "mardi", …)appareil: type d'appareilconsommation: é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
Écrire une fonction lire_mesures(fichier) qui retourne un dictionnaire :
{batiment: [(jour, appareil, consommation), ...]}
Exemple (partiel)
lire_mesures("mesures.txt")
{
"A": [("Lundi", "Climatisation", 50), ("Lundi", "Eclairage", 20), ("Mardi", "Climatisation", 60)],
"B": [("Lundi", "Eclairage", 30), ("Mardi", "Chauffage", 80)],
"C": [("Lundi", "Climatisation", 40), ("Mardi", "Eclairage", 25)]
}
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
Écrire consommation_totale(mesures, batiment) qui retourne la consommation totale d'un bâtiment.
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
Écrire appareils_utilises(mesures, batiment) qui retourne l'ensemble des appareils utilisés dans un bâtiment.
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
Écrire jours_actifs(mesures) qui retourne l'ensemble des jours présents dans les données.
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
Écrire batiment_plus_consommateur(mesures) qui retourne le bâtiment ayant consommé le plus.
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
Écrire consommation_par_appareil(mesures) qui retourne un dictionnaire : {appareil: consommation_totale}
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
Écrire appareil_dominant(mesures, batiment) qui retourne l'appareil le plus consommateur dans un bâtiment.
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
Écrire batiments_par_appareil(mesures) qui retourne : {appareil: ensemble_des_batiments}
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
Écrire appareils_communs(mesures, b1, b2) qui retourne les appareils utilisés dans les deux bâtiments.
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
Écrire ecrire_consommations_elevees(fichier_entree, fichier_sortie, seuil) qui écrit dans un nouveau fichier uniquement les lignes où consommation ≥ seuil.
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
Écrire profil_journalier(mesures) qui retourne un dictionnaire : {jour: consommation_totale}
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
É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).
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
Discussion (0)
Soyez le premier à laisser un commentaire !
Laisser un commentaire
Votre commentaire sera visible après modération.