Traitement des données
# Supression des variables précédentes
from IPython import get_ipython
get_ipython().magic('reset -sf')
# Importation des packages
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import pathlib as pl
current_WD = pl.Path().absolute()
print(current_WD)
# Importation et lecture des données
data1 = pd.read_csv (f"{current_WD}/18_010113_311218_hora.csv", delimiter=';', decimal=',')
data2 = pd.read_csv (f"{current_WD}/18_010119_311219_hora.csv", delimiter=';', decimal=',')
data3 = pd.read_csv (f"{current_WD}/18_010120_311220_hora.csv", delimiter=';', decimal=',')
data4 = pd.read_csv (f"{current_WD}/insh.csv", delimiter=';', decimal=',' )
df = data1.head(0)
df = df.append(data1)
df = df.append(data2)
df = df.append(data3)
df = df.append(data4)
df.drop_duplicates(subset=None, keep='first', inplace=False)
# Définition du format de la date
df['Datetime'] = pd.to_datetime(df['timestamp'],format='%d/%m/%Y-%H:%M:%S')
df = df.set_index('Datetime')
df.loc[df.tsa == -9999,['tsa']] = np.nan
df.loc[df.tsf == -9999,['tsf']] = np.nan
df.loc[df.tss == -9999,['tss']] = np.nan
df.loc[df.plu == -9999,['plu']] = np.nan
df.loc[df.ens == -9999,['ens']] = np.nan
df = df.drop_duplicates(subset=None, keep='first', inplace=False)
df = df.sort_values('Datetime')
start_date = '2013-01-01'
end_date = '2015-12-31 23:00:00'
# Filtrage du DataFrame afin de ne garder que les lignes en dehors de la plage de dates spécifiées
df = df[(df.index > end_date)]
# Affichage du DF filtré
print(df)
#### Création d'une année type ####
import calendar
# Fonction pour supprimer les données du 29 février (années bissextiles)
def remove_leap_day_data(df):
return df[~((df.index.month == 2) & (df.index.day == 29) & ((df.index.year >= 2000) & (df.index.year % 4 == 0)))]
# Suppression des données du 29 février
df = remove_leap_day_data(df)
# Calcul des moyennes horaires pour chaque journée de l'année
df['dayofyear'] = df.index.dayofyear
df_hourly_mean = df.groupby(['dayofyear', df.index.hour]).mean()
df_hourly_mean.reset_index(inplace=True)
df_hourly_mean = df_hourly_mean.drop(df_hourly_mean[df_hourly_mean['dayofyear'] == 365].index)
# Visualisation des données moyennes pour l'année
print(df_hourly_mean)
print(df_hourly_mean.index)
#### Traitement des données du vent ####
# Définition des valeurs de z2 et z_ref
z2 = 2 # Hauteur à laquelle la vitesse du vent est mesurée [m]
z_ref = 60 # Hauteur de référence en mètres
z0 = 0.2 # Rugosité de l'environnement
# Fonction de calcul de v_ref en fonction de v_2
def calculate_v_ref(v_2, z_2, z_ref, z0):
return v_2 * (np.log(z_ref / z0) / np.log(z_2 / z0))
# Application de la fonction calculate_v_ref à la colonne 'vvt' du DataFrame
df_hourly_mean['vvt']= df_hourly_mean['vvt'].apply(lambda x: calculate_v_ref(x, z2, z_ref, z0))
## Traitement des données de consommation
data4.columns = ['date', 'puissance']
# Convertion de la colonne 'date' en datetime
data4['date'] = pd.to_datetime(data4['date'], format='%d/%m/%Y %H:%M', errors='coerce')
# Suppression les lignes avec des valeurs NaN
data4 = data4.dropna(subset=['date', 'puissance'])
data4.drop(data4.tail(1).index, inplace=True)
# Calcul de l'heure de l'année et conservation de celle-ci comme colonne distincte
data4['heure_année'] = data4['date'].apply(lambda x: (x.dayofyear - 1) * 24 + x.hour)
# Réglage de la colonne 'date' comme index
data4.set_index('date', inplace=True)
# Groupement par heure de l'année et calcul de la moyenne, si nécessaire
data4_resampled = data4.resample('H').mean()
# Affichage des premières lignes pour vérifier
print("\nConsommation :\n", data4_resampled)
print(df)
print(df_hourly_mean)
Production
######calcule des potentielle de production ######
##Biomasse
production_biomasse_anuelle = 55000000 #[kWh]
production_biomasse_horaire_moy = np.full(8760, production_biomasse_anuelle/8760)
print(production_biomasse_anuelle, 'kWh (production biomasse totale)')
## tracer le graphique
plt.figure(figsize=(25, 15))
plt.plot(df_hourly_mean['dayofyear'], production_biomasse_horaire_moy, label='production biomasse', color='green')
plt.xlabel('Temps',fontsize = 25)
plt.ylabel('production biomasse [kWh]',fontsize = 25)
#plt.title('Production biomasse en fonction du temps',fontsize = 25)
plt.legend(fontsize = 20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.grid(True)
plt.savefig('biom')
plt.show()
## Variable photovoltaïque
S = 16229.26 # Surface exploitable [m²]
ens = df_hourly_mean['ens'] # Ensoleillement [W/m²]
Ir = ens/1000 # kW/m² # Irradiation solaire [kWh/m²]
Cp = 0.9 # Coefficient de performance de l'installation
R_pv = 0.22 # Rendement des panneaux photovoltaïques
# Calcul de la puissance photovoltaïque (kW)
production_photovoltaique = S * R_pv * Cp * ens # Rendement des panneaux photovoltaïques
print(sum(production_photovoltaique/1000), 'kWh (production photovoltaïque totale)')
# Tracer le graphique
plt.figure(figsize=(25, 15))
plt.plot(df_hourly_mean['dayofyear'], production_photovoltaique/1000, label='Puissance photovoltaïque', color='orange')
plt.xlabel('Temps', fontsize=25)
plt.ylabel('Production photovoltaïque [kWh]', fontsize=25)
#plt.title('Production photovoltaïque en fonction du temps', fontsize=25)
plt.legend(fontsize = 20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.grid(True)
plt.savefig('PV')
plt.show()
### calcule eolienne
d= 1.125 #densité du vent
vitesse_vent = df_hourly_mean['vvt']
# Paramètres pour les éoliennes de 900 kW
nombre_eolienne_1 = 6
diametre_rotor_1 = 54 # Diamètre du rotor pour le premier type d'éolienne en mètres
surface_pales_1 = np.pi * (diametre_rotor_1 / 2) ** 2 # Surface balayée par les pales pour le premier type d'éolienne en mètres carrés
coefficient_puissance_1 = 0.3 # Coefficient de puissance pour le premier type d'éolienne
# Paramètres pour les éoliennes de 1MW
nombre_eolienne_2 = 6
diametre_rotor_2 = 61 # Diamètre du rotor pour le deuxième type d'éolienne en mètres
surface_pales_2 = np.pi * (diametre_rotor_2 / 2) ** 2 # Surface balayée par les pales pour le deuxième type d'éolienne en mètres carrés
coefficient_puissance_2 = 0.3 # Coefficient de puissance pour le deuxième type d'éolienne
# Paramètres pour les éoliennes de 900 kW et de 1MW
puissance_nominal_1 = 900 * 1000 # 900 kW en watts
puissance_nominal_2 = 1000 * 1000 # 1 MW en watts
# Production éolienne pour chaque heure
production_eolienne = np.zeros(len(vitesse_vent))
# Calcul de la production éolienne
for i, vent in enumerate(vitesse_vent):
if 2.5 <= vent < 13.5:
# Calcul basé sur la formule de la puissance éolienne
production_eolienne[i] = 0.5 * d * (
surface_pales_1 * coefficient_puissance_1 * (vent ** 3) * nombre_eolienne_1 +
surface_pales_2 * coefficient_puissance_2 * (vent ** 3) * nombre_eolienne_2
)
elif 13.5 <= vent < 25:
# Puissance nominale atteinte
production_eolienne[i] = puissance_nominal_1 * nombre_eolienne_1 + puissance_nominal_2 * nombre_eolienne_2
# Pas de production au-delà de 25 m/s ou en dessous de 2.5 m/s
# Affichage de la somme totale de la production éolienne
print(sum(production_eolienne)/1000, 'kWh (production éolienne totale)')
# Tracé du graphique
plt.figure(figsize=(25,15))
plt.plot(production_eolienne/1000, label='Puissance éolienne', color='blue')
plt.xlabel('Heures de l\'année', fontsize=25)
plt.ylabel('Production éolienne [kWh]', fontsize=25)
plt.legend(fontsize = 20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
#plt.title('Production éolienne en fonction du temps', fontsize=25)
plt.legend(fontsize=20)
plt.savefig('eolien')
plt.show()
# Calcul de la production totale
production_hors_biomasse = production_photovoltaique/1000 + production_eolienne/1000
production_totale = production_photovoltaique/1000 + production_eolienne/1000 + production_biomasse_horaire_moy #[kWh]
print(sum(production_totale), 'kWh (production totale)') #[kWh]
# Tracé du graphique de la production totale
plt.figure(figsize=(25, 15))
plt.plot(production_totale, label='Production totale', color='purple')
plt.xlabel('Heures de l\'année', fontsize=25)
plt.ylabel('Production totale [kWh]', fontsize=25)
#plt.title('Production totale photovoltaïque, éolienne et biomasse', fontsize=25)
plt.legend(fontsize = 20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.grid(True)
plt.savefig('prodtot')
plt.show()
# Création du graphique combiné
plt.figure(figsize=(25, 15))
# Tracer la production biomasse
plt.plot(df_hourly_mean['dayofyear'], production_biomasse_horaire_moy, label='Production biomasse', color='green')
# Tracer la production photovoltaïque
plt.plot(df_hourly_mean['dayofyear'], production_photovoltaique/1000, label='Puissance photovoltaïque', color='orange')
# Tracer la production éolienne
plt.plot(df_hourly_mean['dayofyear'], production_eolienne/1000, label='Puissance éolienne', color='blue')
# Tracer la production totale
plt.plot(df_hourly_mean['dayofyear'], production_totale, label='Production totale', color='purple')
# Ajouter les étiquettes et la légende
plt.xlabel('Temps', fontsize=25)
plt.ylabel('Production [kWh]', fontsize=25)
#plt.title('Comparaison des productions biomasse, photovoltaïque et éolienne', fontsize=25)
plt.legend(fontsize=20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.grid(True)
plt.show()
print(production_totale)
##Estimation des profils de production PV des ménages
#Paramètres
densité_pv = 1.5 #Nbre panneaux par habitant
pop_lln = 10503 # Nbre habitant LLN (2021), Mémoire Théo Schepers
panneaux = pop_lln * densité_pv #Nombre de panneaux a LLN
surf_moy_panneau = 1.7 #[m^2]surface moyenne d'un PV
## Variable photovoltaïque
Surf_panneaux = surf_moy_panneau * panneaux # Estimation de la surface de pv [m²]
ens = df_hourly_mean['ens'] # Ensoleillement [W/m²]
Ir = ens/1000 # Irradiation solaire [kWh/m²]
Cp = 0.9 # Coefficient de performance de l'installation
R_pv = 0.22 # Rendement des panneaux photovoltaïques
# Calcul de la puissance photovoltaïque (kW)
production_photovoltaique_men = Surf_panneaux * R_pv * Cp * ens # Rendement des panneaux photovoltaïques
print(sum(production_photovoltaique_men/1000), 'kWh (production photovoltaïque totale)')
# Tracer le graphique
plt.figure(figsize=(25, 15))
plt.plot(df_hourly_mean['dayofyear'], production_photovoltaique/1000, label='Puissance photovoltaïque', color='orange')
plt.xlabel('Temps', fontsize=25)
plt.ylabel('Estimation de la production photovoltaïque des ménages (kWh)', fontsize=25)
plt.title('Production photovoltaïque des ménages en fonction du temps', fontsize=25)
plt.legend(fontsize=20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.grid(True)
plt.show()
Consommation
##### Calcul des consommations de l'UCLouvain ######
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from tabulate import tabulate
# Importation des packages nécessaires
import pandas as pd
# Création de consommation horaire
consommation_horaire = data4_resampled["puissance"]
# Retirer les jours bissextiles
consommation_horaire = remove_leap_day_data(consommation_horaire)
# Concorder le début des consommations UCL avec celles des partenaires
derniere_ligne = consommation_horaire.iloc[-1:]
consommation_horaire = consommation_horaire.iloc[:-1]
consommation_horaire = pd.concat([derniere_ligne, consommation_horaire], ignore_index=True)
## Création d'un tableau statistique
# Calculer la consommation mensuelle
consommation_mensuelle = data4_resampled.resample('M').sum()
consommation_mensuelle_tracé = consommation_mensuelle['puissance'] / 1000 # Changement des unités : kWh => MWh
# Calculer les statistiques mensuelles
tableau_statistiques_mensuelles = data4_resampled['puissance'].resample('M').agg(['min', 'max', 'mean', 'sum']).round(2).reset_index()
# Renommer les colonnes pour plus de clarté
tableau_statistiques_mensuelles.columns = ['Mois', 'Minimum [kWh]', 'Maximum [kWh]', 'Moyenne [kWh]', 'Somme [MWh]']
# Convertir la colonne 'Somme [kWh]' en MWh
tableau_statistiques_mensuelles['Mois'] = ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Aout','Septembre','Octobre','Novembre','Décembre']
tableau_statistiques_mensuelles['Somme [MWh]'] = (tableau_statistiques_mensuelles['Somme [MWh]'] / 1000).round(2)
# Afficher le tableau formaté
tableau_formate = tabulate(tableau_statistiques_mensuelles, headers='keys', tablefmt='pretty', showindex=False)
print(tableau_formate)
## Création du graphique de consomation mensuelle en bâtonnets
plt.figure(figsize=(12, 6))
ax = consommation_mensuelle_tracé.plot(kind='bar', color='skyblue')
month_labels = [pd.to_datetime(str(date)).strftime('%B') for date in consommation_mensuelle_tracé.index]
ax.set_xticklabels(month_labels, rotation=45)
plt.xticks(rotation=45)
#plt.title('Consommation mensuelle totale 2022')
plt.xlabel('Mois',)
plt.ylabel('Consommation totale (MWh)')
plt.show()
## Création du graphique de consommation annuel
plt.figure(figsize=(40, 15))
plt.plot(consommation_horaire, label='consommation', color='green', linewidth=4)
#plt.title('Consommation annuelle totale 2022', fontsize=40)
plt.xlabel('Temps', fontsize=35)
plt.ylabel('Consommation totale (kWh)', fontsize=35)
plt.xticks(fontsize=30)
plt.yticks(fontsize=30)
plt.grid(True)
plt.savefig('UCL')
plt.show()
##Représentation hebdomadaire
# Fonction pour tracer le graphique pour une semaine donnée
def plot_week(data, start_date, end_date, title):
# Filtrer les données pour la semaine donnée
week_data = data[start_date:end_date]
plt.figure(figsize=(15, 5))
plt.plot(week_data['puissance'], label='Consommation', color='blue', linewidth=1.5)
plt.title(title, fontsize=16)
plt.xlabel('Date', fontsize=20)
plt.ylabel('Consommation (kWh)', fontsize=20)
plt.grid(True)
plt.xticks(rotation=45,fontsize=12)
plt.yticks(fontsize=12)
plt.savefig(title)
plt.legend()
plt.show()
# Dates de début et de fin pour les semaines spécifiques
dates_semaines = {
'Consommation première semaine de janvier': ('2022-01-01', '2022-01-07'),
'Consommation première semaine de mai': ('2022-05-02', '2022-05-08'),
'Consommation troisième semaine de juillet': ('2022-07-18', '2022-07-24'),
'Consommation mois de juillet': ('2022-07-01', '2022-07-31'),
'Consommation mois d aout' : ('2022-08-01','2022-08-31'),
'Consommation troisième semaine de decembre': ('2022-12-19', '2022-12-25')
}
# Tracer les graphiques pour chaque semaine
for title, (start_date, end_date) in dates_semaines.items():
plot_week(data4, start_date, end_date, title)
### caalcule des profile de Consommation des ménages à LLN ###
##Import des packages
from scipy.interpolate import make_interp_spline
import pandas as pd
##Importation et lecture des données
conso_menage = pd.read_csv (f"{current_WD}/ConsMen.csv", delimiter=';', decimal=',')
df_menage = conso_menage.head(0)
df_menage = df_menage.append(conso_menage)
df_menage = df_menage.drop(8760)
# Créer un nouvel index temporel
index = pd.date_range(start='2021-01-01', end='2022-01-01', freq='H')
# Supprimer la dernière valeur de l'index
index = index[:-1]
# Assigner le nouvel index à df_menage
df_menage = df_menage.set_index(index)
##Création d'un tableau statistique
# Calculer les statistiques mensuelles
tableau_statistiques_menages = df_menage['conso_m [kWh]'].resample('M').agg(['min', 'max', 'mean', 'sum']).round(2).reset_index()
# Renommer les colonnes pour plus de clarté
tableau_statistiques_menages.columns = ['Mois', 'Minimum [kWh]', 'Maximum [kWh]', 'Moyenne [kWh]', 'Somme [MWh]']
# Convertir la colonne 'Somme [kWh]' en MWh
tableau_statistiques_menages['Mois'] = ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre', 'Décembre']
tableau_statistiques_menages['Somme [MWh]'] = (tableau_statistiques_menages['Somme [MWh]'] / 1000).round(2)
# Afficher le tableau formaté
tableau_formate_menages = tabulate(tableau_statistiques_menages, headers='keys', tablefmt='pretty', showindex=False)
print(tableau_formate_menages)
## Création du graphique de consommation annuelle
plt.figure(figsize=(25, 15))
plt.plot(df_menage['Time of the year [kWh]'], df_menage['conso_m [kWh]'])
plt.xlabel('Temps [heures]', fontsize=16)
plt.ylabel('Consommation des ménages [kWh]', fontsize = 16)
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
#plt.title('Consommation des ménages sur l année')
plt.savefig('Conso_Men')
plt.show
#Représentation hebdomadaire
# Fonction pour tracer le graphique pour une semaine donnée pour la consommation des ménages de LLN
def plot_week_menage(data, start_date, end_date, title):
# Filtrer les données pour la semaine donnée
week_data = data[start_date:end_date]
plt.figure(figsize=(15, 5))
plt.plot(week_data['conso_m [kWh]'], label='Consommation', color='green', linewidth=1.5)
#plt.title(title, fontsize=16)
plt.xlabel('Date', fontsize=18)
plt.ylabel('Consommation (kWh)', fontsize=18)
plt.grid(True)
plt.xticks(rotation=45, fontsize=15)
plt.yticks(fontsize=15)
plt.legend()
plt.savefig(title)
plt.show()
# Dates de début et de fin pour les semaines spécifiques des ménages à LLN
dates_semaines_menage = {
'Consommation ménages deuxième semaine de janvier': ('2021-01-02', '2021-01-08')
#'Consommation première semaine de mai': ('2021-05-03', '2021-05-09'),
#'Consommation troisième semaine de juillet': ('2021-07-19', '2021-07-25'),
#'Consommation mois de juillet': ('2021-07-01', '2021-07-31'),
#'Consommation mois d aout' : ('2021-08-01','2021-08-31'),
#'Consommation troisième semaine de decembre': ('2021-12-20', '2021-12-26')
}
# Tracer les graphiques pour chaque semaine des ménages à LLN
for title, (start_date, end_date) in dates_semaines_menage.items():
plot_week_menage(df_menage, start_date, end_date, title)
# Calculer la consommation annuelle total
conso_men_tot= df_menage['conso_m [kWh]'].sum()
print ("Consommation annuelle (GWh, 2021)':", conso_men_tot/1000000)
### Consommation des bus éléctrique passant par LLN ###
# Livraison de 38 bus 100% électriques dans les 2 ans --> hypothèse!
##Variables
kmBW= 6230713 #km parcouru dans le BW https://rapportannuel.letec.be/rapport/#amelioration-offre-transport
nbr_bus = 94 #nombre de bus (flotte) dans le BW https://rapportannuel.letec.be/rapport/#amelioration-offre-transport
kmBW_1=kmBW/nbr_bus #km parcouru pour un bus dans le BW https://rapportannuel.letec.be/rapport/#amelioration-offre-transport
kmBUS=kmBW_1/(356) #km parcouru pour une journée par 1 bus
kmBUS_h=kmBW_1/(356*15) #km parcouru par heure par 1 bus (sachant qu'il ne consomme que 15h par jour)
conso_busE_km = 1.6 #kWh/km https://roulezelectrique.com/autobus-electriques-vs-autobus-hybrides-lelectricite-plus-chere-que-le-diesel-a-moins-de-53-000-kmannee/
conso_busE = conso_busE_km*kmBUS #consommation d'un bus par journée
conso_busE_h = conso_busE_km*kmBUS_h #consommation d'un bus par heure
#print(conso_busE_h)
##Calcul de la capacité de la batterie pendant une semaine type
# Initialiser la valeur
valeur = conso_busE
# Initialiser une liste pour stocker les valeurs
valeurs_liste = [conso_busE]
#Première boucle - retirer la consommation d'un bus pour une heure à chaque heure
while valeur >= 0:
valeurs_liste.append(valeur)
valeur -= conso_busE_h
# Deuxième boucle - ajouter 50 à la dernière valeur de la première boucle
derniere_valeur = valeurs_liste[-1]
nouvelles_valeurs_liste = []
while derniere_valeur <= conso_busE:
nouvelles_valeurs_liste.append(derniere_valeur)
derniere_valeur += 50
derniere_heure = [conso_busE]
# Concaténer les deux listes
resultat_liste = valeurs_liste + nouvelles_valeurs_liste + derniere_heure
# Créer un DataFrame à partir de la liste combinée
df_bus = pd.DataFrame({'Valeur': resultat_liste})
derniere_valeur_2 = nouvelles_valeurs_liste[-1]
##Création d'un semaine type
bus_5 = resultat_liste*5
liste_selectionnee = [valeur if valeur >= 98 else 98 for valeur in resultat_liste]
bus_WK = []
bus_WK = liste_selectionnee *2
bus_sem = bus_5 + bus_WK
df_bus_sem = pd.DataFrame({'Valeur': bus_sem})
#Représentation de la capacité de la batterie pendant cette semaine type
plt.figure(figsize=(25, 15))
plt.plot(df_bus_sem.index/24, df_bus_sem['Valeur'], label='Consommation')
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
#plt.title('Capacité de la batterie', fontsize = 20)
plt.xlabel('Temps [jours]', fontsize = 20)
plt.ylabel('Production [kWh]', fontsize = 20)
plt.legend(loc='upper right', fontsize = 10)
plt.savefig('Bus_semaine_type')
##Consommation du bus (ce que la borne de recharge lui donne) pendant une semaine type
# Créer un DataFrame avec un index de 0 à 23
df_bus_new = pd.DataFrame(index=range(24))
df_bus_new['Conso'] = 0
df_bus_new.loc[:5, 'Conso'] = 50
df_bus_semaine = pd.concat([df_bus_new.copy().assign(jour=i) for i in range(7)], ignore_index=True)
#Représentation des consommation du bus
plt.figure(figsize=(25, 15))
plt.plot(df_bus_semaine.index/24, df_bus_semaine['Conso'], label='Consommation')
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
#plt.title('Consommation d un bus', fontsize = 20)
plt.xlabel('Temps [jours]', fontsize = 25)
plt.ylabel('Consommation [kWh]', fontsize = 25)
plt.legend(loc='upper right', fontsize = 20)
plt.savefig('Conso_BUS')
##Calcul de la consommation annuelle du bus
df_bus_annee_new = pd.concat([df_bus_semaine] *52, ignore_index=True)
premiere_jour = df_bus_annee_new.head(24)
# Concaténer le DataFrame avec les 24 premières lignes à la fin
df_bus_annee_new = pd.concat([df_bus_annee_new, premiere_jour], ignore_index=True)
# Afficher le DataFrame après les modifications
#print(df_bus_annee_new)
# Visualisation de la time series sur une année
#plt.figure(figsize=(25, 15))
#plt.plot(df_bus_annee_new.index/24, df_bus_annee_new['Conso'])
#plt.xlabel('Temps')
#plt.ylabel('Conso [kWh]')
#plt.title('Time Series sur une année')
#plt.show()
#Résultats de consommation annuelle
conso_bus_ann_new = df_bus_annee_new['Conso'].sum()
print("La consommation annuelle du bus est :", conso_bus_ann_new, '[kWh]')
#print(df_bus_semaine)
#print(df_bus_annee_new)
##Scénario : 38 bus électriques qui circulent à LLN
# Visualisation de la time series sur une année
#plt.figure(figsize=(25, 15))
#plt.plot(df_bus_annee_new.index/24, (df_bus_annee_new['Conso'])*38)
#plt.xlabel('Temps')
#plt.ylabel('Conso')
#plt.title('Time Series sur une année')
#plt.show()
# Consommation annuelle
conso_bus_ann_new = df_bus_annee_new['Conso'].sum()
print("La consommation annuelle des 38 bus est :", conso_bus_ann_new*38, '[kWh]')
### Consommation des batiments communaux à LLN ###
##Variable
consommation_annuelle_communale = 1712842.58 # [kWh] - Consommation totale de tous les batiments communaux en 2022
##Construction du profil communal avec le profil de l'UCL (Hypothèses : ils ont la même tendance de consommation)
# Calcul de la moyenne horaire de l'UCLouvain
moyenne_uclouvain = consommation_horaire.mean()
# Calcul du facteur d'ajustement pour la commune
facteur_ajustement = consommation_annuelle_communale / (moyenne_uclouvain * len(consommation_horaire))
# Ajustement du profil annuel de la commune en fonction du profil horaire de l'UCLouvain
profil_annuel_communal_ajuste = consommation_horaire * facteur_ajustement
# Affichage des résultats
print("Moyenne horaire de l'UCLouvain :", moyenne_uclouvain)
print("Facteur d'ajustement pour la commune :", facteur_ajustement)
#print("Profil annuel communal ajusté :\n", profil_annuel_communal_ajuste)
## Création du graphique de consommation annuel
plt.figure(figsize=(40, 15))
plt.plot(profil_annuel_communal_ajuste, label='consommation', color='red', linewidth=4)
#plt.title("Consommation annuelle totale de la commune", fontsize=40)
plt.xlabel('Temps', fontsize=35)
plt.ylabel('Consommation totale [kWh]', fontsize=35)
plt.xticks(fontsize=30)
plt.yticks(fontsize=30)
plt.grid(True)
plt.savefig('Conso_COMM')
plt.show()
plt.figure(figsize=(40, 15))
plt.plot(profil_annuel_communal_ajuste[0:168], label='consommation', color='red', linewidth=4)
#plt.title("Consommation annuelle totale de la commune", fontsize=40)
plt.xlabel('Temps', fontsize=40)
plt.ylabel('Consommation totale [kWh]', fontsize=40)
plt.xticks(fontsize=30)
plt.yticks(fontsize=30)
plt.grid(True)
plt.savefig('Conso_COMM_hebdo')
plt.show()
### Consommation des batiments du Parc scientifiques de LLN ###
##Variables
conso_parc_annuel = 30000000 #kWh - Energie donnée par l'UCL au Parc sur un an
# idéal = 28541011
conso_parc_horaire = conso_parc_annuel/8760 #kWh - Energie donnée par l'UCL par heure
##Visualisation de la consommation annuelle du Parc
#Création de l'index
index = pd.date_range(start='2021-01-01', end='2021-12-31 23:00:00', freq='H')
# Créer un DataFrame avec la même valeur pour chaque heure
df_parc = pd.DataFrame(index=index, columns=['consommation'], data=conso_parc_horaire)
#Représentation
plt.figure(figsize=(40, 15))
plt.plot(df_parc['consommation'])
plt.title('Consommation annuelle totale du Parc Scientifique', fontsize=40)
plt.xlabel('Temps', fontsize=35)
plt.ylabel('Consommation totale (kWh)', fontsize=35)
plt.xticks(fontsize=30)
plt.yticks(fontsize=30)
plt.grid(True)
plt.show()
###Consommation totale de la CER###
TOT_conso = pd.DataFrame(index=range(1,8761), columns=["date", "conso UCL",'conso_menage','conso_TEC'])
TOT_conso['date']=consommation_horaire.index
TOT_conso['conso UCL'] = consommation_horaire.values
TOT_conso['conso_menage'] = df_menage['conso_m [kWh]'].values
TOT_conso['conso_TEC'] = df_bus_annee_new.values
TOT_conso['conso_Com'] = profil_annuel_communal_ajuste.values
TOT_conso['conso_Parc'] = df_parc['consommation'].values
print(TOT_conso)
CONS = TOT_conso[['conso UCL']].values + TOT_conso[['conso_menage']].values +TOT_conso[['conso_TEC']].values +TOT_conso[['conso_Com']].values#+TOT_conso[['conso_Parc']].values
print(CONS)
5 scenarios de production
# Create a stackplot
prod_S2 = sum(production_eolienne)/1000+sum(production_photovoltaique)/1000+production_biomasse_anuelle
print(prod_S2)
plt.figure(figsize=(30, 15))
plt.stackplot(
df_hourly_mean.index[:]/24,
production_biomasse_horaire_moy[:],
production_photovoltaique[:]/1000,
production_eolienne[:]/1000,
labels=['Biomass', 'Photovoltaic', 'Wind'],
colors=['green','orange', 'b']
)
plt.plot(
df_hourly_mean.index[:]/24,
TOT_conso[['conso UCL']].values, label='Consommation UCL', color='red',linewidth=5)
plt.axhline(0, color='black', linestyle='--', linewidth=2)
# Add labels and legend
#plt.title("consomation et production annuelles de l'UCL pour le Senario 2",fontsize = 30)
plt.xlabel('Time [days]',fontsize = 30)
plt.ylabel('Production [kWh]',fontsize = 30)
plt.legend(loc='upper left',fontsize = 25)
plt.xticks(fontsize=25)
plt.yticks(fontsize=25)
# Show the plot
plt.savefig('Production annuelle full et consommation UCL')
plt.show()
# Create a stackplot
prod_S3 = sum(production_photovoltaique)/1000+production_biomasse_anuelle
print(prod_S3)
plt.figure(figsize=(35, 25))
plt.stackplot(
df_hourly_mean.index[:]/24,
production_biomasse_horaire_moy[:],
production_photovoltaique[:]/1000,
labels=['Biomass', 'Photovoltaic']
)
plt.plot(
df_hourly_mean.index[:]/24,
TOT_conso[['conso UCL']].values, label='Consommation UCL', color='red',linewidth=5)
plt.axhline(0, color='black', linestyle='--', linewidth=2)
# Add labels and legend
plt.xlabel('Time [days]',fontsize=30)
plt.ylabel('Production [kWh]',fontsize=30)
#plt.title("consomation et production annuelles de l'UCL pour le Senario 3",fontsize = 30)
plt.legend(loc='upper left',fontsize=25)
plt.xticks(fontsize=25)
plt.yticks(fontsize=25)
# Show the plot
plt.savefig('Production annuelle photo bio et consommation UCL')
plt.show()
# Create a stackplot
prod_S4 = sum(production_eolienne)/1000+production_biomasse_anuelle
print(prod_S4)
plt.figure(figsize=(35, 25))
plt.stackplot(
df_hourly_mean.index[:]/24,
production_biomasse_horaire_moy[:],
production_eolienne[:]/1000,
labels=['Biomass', 'Wind']
)
plt.plot(
df_hourly_mean.index[:]/24,
TOT_conso[['conso UCL']].values, label='Consommation UCL', color='red',linewidth=5)
plt.axhline(0, color='black', linestyle='--', linewidth=2)
# Add labels and legend
plt.xlabel('Time [days]',fontsize=30)
plt.ylabel('Production [kWh]',fontsize=30)
#plt.title("consomation et production annuelles de l'UCL pour le Senario 4",fontsize = 30)
plt.legend(loc='upper left',fontsize=25)
plt.xticks(fontsize=25)
plt.yticks(fontsize=25)
# Show the plot
plt.savefig('Production annuelle eol bio et consommation UCL')
plt.show()
# Create a stackplot
prod_S5 = sum(production_eolienne)/1000+sum(production_photovoltaique)/1000
print(prod_S5)
plt.figure(figsize=(15, 10))
plt.stackplot(
df_hourly_mean.index[:]/24,
production_photovoltaique[:]/1000,
production_eolienne[:]/1000,
labels=['Photovoltaic', 'Wind']
)
plt.plot(
df_hourly_mean.index[:]/24,
TOT_conso[['conso UCL']].values, label='Consommation UCL', color='red',linewidth=5)
plt.axhline(0, color='black', linestyle='--', linewidth=2)
# Add labels and legend
plt.xlabel('Time [days]',fontsize=15)
plt.ylabel('Production [kWh]',fontsize=15)
#plt.title("consomation et production annuelles de l'UCL pour le sénario 5",fontsize = 30)
plt.legend(loc='upper left',fontsize=10)
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
# Show the plot
plt.savefig('Production annuelle photo eol et consommation UCL')
plt.show()
# Create a stackplot
prod_S2 = sum(production_eolienne)/1000+sum(production_photovoltaique)/1000+production_biomasse_anuelle
print(prod_S2)
plt.figure(figsize=(35, 25))
plt.stackplot(
df_hourly_mean.index[0:168]/24,
production_biomasse_horaire_moy[0:168],
production_photovoltaique[0:168]/1000,
production_eolienne[0:168]/1000,
labels=['Biomass', 'Photovoltaic', 'Wind'],
colors=['green','orange', 'b']
)
plt.plot(
df_hourly_mean.index[0:168]/24,
TOT_conso.iloc[0:168,1].values, label='Consommation UCL', color='red',linewidth=5)
plt.axhline(0, color='black', linestyle='--', linewidth=2)
# Add labels and legend
plt.xlabel('Time [days]',fontsize=45)
plt.ylabel('Production [kWh]',fontsize=45)
#plt.title("consomation et production annuelles de l'UCL pour le sénario 2",fontsize = 30)
plt.legend(loc='upper left',fontsize=35)
plt.xticks(fontsize=25)
plt.yticks(fontsize=25)
plt.ylim(0, 17000)
# Show the plot
plt.savefig('Production hebdo full et consommation UCL ')
plt.show()
# Create a stackplot
prod_S3 = sum(production_photovoltaique)/1000+production_biomasse_anuelle
print(prod_S3)
plt.figure(figsize=(35, 25))
plt.stackplot(
df_hourly_mean.index[0:168]/24,
production_biomasse_horaire_moy[0:168],
production_photovoltaique[0:168]/1000,
labels=['Biomass', 'Photovoltaic'],
colors=['green','orange' ]
)
plt.plot(
df_hourly_mean.index[0:168]/24,
TOT_conso.iloc[0:168,1].values, label='Consommation UCL', color='red',linewidth=5)
plt.axhline(0, color='black', linestyle='--', linewidth=2)
# Add labels and legend
plt.xlabel('Time [days]',fontsize=45)
plt.ylabel('Production [kWh]',fontsize=45)
plt.legend(loc='upper left',fontsize=35)
plt.xticks(fontsize=25)
plt.yticks(fontsize=25)
plt.ylim(0, 17000)
# Show the plot
plt.savefig('Production hebdo sol bio et consommation UCL ')
plt.show()
# Create a stackplot
prod_S4 = sum(production_eolienne)/1000+production_biomasse_anuelle
print(prod_S4)
plt.figure(figsize=(35, 25))
plt.stackplot(
df_hourly_mean.index[0:168]/24,
production_biomasse_horaire_moy[0:168],
production_eolienne[0:168]/1000,
labels=['Biomass', 'Wind'],
colors=['green', 'b']
)
plt.plot(
df_hourly_mean.index[0:168]/24,
TOT_conso.iloc[0:168,1].values, label='Consommation UCL', color='red',linewidth=5)
plt.axhline(0, color='black', linestyle='--', linewidth=2)
# Add labels and legend
plt.xlabel('Time [days]',fontsize=45)
plt.ylabel('Production [kWh]',fontsize=45)
#plt.title("Profil de consomation et production hebdomadaire de l'UCL pour le sénario 4",fontsize = 30)
plt.legend(loc='upper left',fontsize=35)
plt.xticks(fontsize=25)
plt.yticks(fontsize=25)
plt.ylim(0, 17000)
# Show the plot
plt.savefig('Production hebdo eol bio et consommation UCL ')
plt.show()
# Create a stackplot
prod_S5 = sum(production_eolienne)/1000+sum(production_photovoltaique)/1000
print(prod_S5)
plt.figure(figsize=(35, 25))
plt.stackplot(
df_hourly_mean.index[0:168]/24,
production_photovoltaique[0:168]/1000,
production_eolienne[0:168]/1000,
labels=['Photovoltaic', 'Wind'],
colors=['orange', 'b']
)
plt.plot(
df_hourly_mean.index[0:168]/24,
TOT_conso.iloc[0:168,1].values, label='Consommation UCL', color='red',linewidth=5)
plt.axhline(0, color='black', linestyle='--', linewidth=2)
# Add labels and legend
plt.xlabel('Time [days]',fontsize=45)
plt.ylabel('Production [kWh]',fontsize=45)
#plt.title("Profil de consomation et production hebdomadaire de l'UCL pour le Senario 5",fontsize = 30)
plt.legend(loc='upper left',fontsize=35)
plt.xticks(fontsize=25)
plt.yticks(fontsize=25)
plt.ylim(0, 17000)
# Show the plot
plt.savefig('Production hebdo sol eol et consommation UCL ')
plt.show()
5 scénarios appliqués à la consommation de la communauté d'énergie
# Create a stackplot
#prod_S[] = sum(production_eolienne)/1000+sum(production_photovoltaique)/1000+production_biomasse_anuelle
#print(prod_S2)
production_biomasse_j=np.zeros(365)
production_photovoltaique_j=np.zeros(365)
production_eolienne_j=np.zeros(365)
CONS_j=np.zeros(365)
j=np.zeros(365)
daily_biomass_production = np.full(365, production_biomasse_anuelle / 365)
for i in range(365):
#production_biomasse_j[i:] = sum(production_biomasse_anuelle[24*i:24*(i+1)])
production_photovoltaique_j[i] = sum(production_photovoltaique[24*i:24*(i+1)])
production_eolienne_j[i]= sum(production_eolienne[24*i:24*(i+1)])
CONS_j[i] = sum(CONS[24*i:24*(i+1)])
j[i] = i
plt.figure(figsize=(25, 15))
plt.stackplot(
j,
daily_biomass_production,
production_photovoltaique_j/1000,
production_eolienne_j/1000,
labels=['Biomass', 'Photovoltaic', 'Wind'],
colors=['green','orange', 'b']
)
plt.plot(
j,
CONS_j, label='Consommation', color='red',linewidth=5)
plt.axhline(0, color='black', linestyle='--', linewidth=2)
# Add labels and legend
plt.xlabel('Time [days]', fontsize= 32)
plt.ylabel('Production [kWh]', fontsize= 32)
plt.legend(loc='upper left', fontsize= 25)
plt.xticks(fontsize=25)
plt.yticks(fontsize=25)
# Show the plot
plt.savefig('Somme journalière de la production annuelle full et consommation tot')
plt.show()
# Create a stackplot
prod_S2 = sum(production_eolienne)/1000+sum(production_photovoltaique)/1000+production_biomasse_anuelle
print(prod_S2)
plt.figure(figsize=(25, 15))
plt.stackplot(
df_hourly_mean.index[:]/24,
production_biomasse_horaire_moy[:],
production_photovoltaique[:]/1000,
production_eolienne[:]/1000,
labels=['Biomass', 'Photovoltaic', 'Wind'],
colors=['green','orange', 'b']
)
plt.plot(
df_hourly_mean.index[:]/24,
CONS[0:8760], label='Consommation', color='red',linewidth=5)
plt.axhline(0, color='black', linestyle='--', linewidth=2)
# Add labels and legend
plt.xlabel('Time [days]')
plt.ylabel('Production [kWh]')
plt.legend(loc='upper left')
# Show the plot
plt.savefig('Production annuelle full et consommation tot')
plt.show()
# Create a stackplot
prod_S2 = sum(production_eolienne)/1000+sum(production_photovoltaique)/1000+production_biomasse_anuelle
print(prod_S2)
plt.figure(figsize=(25, 15))
plt.stackplot(
df_hourly_mean.index[0:168]/24,
production_biomasse_horaire_moy[0:168],
production_photovoltaique[0:168]/1000,
production_eolienne[0:168]/1000,
labels=['Biomass', 'Photovoltaic', 'Wind'],
colors=['green','orange', 'b']
)
plt.plot(
df_hourly_mean.index[0:168]/24,
CONS[0:168], label='Consommation', color='red',linewidth=5)
plt.axhline(0, color='black', linestyle='--', linewidth=2)
# Add labels and legend
plt.xlabel('Time [days]', fontsize=20)
plt.ylabel('Production [kWh]', fontsize=20)
plt.legend(loc='upper left', fontsize=18)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
# Show the plot
plt.savefig('Production hebdo full et consommation tot')
plt.show()
prod_S3 = sum(production_photovoltaique)/1000+production_biomasse_anuelle
print(prod_S3)
# Create a stackplot
plt.figure(figsize=(25, 15))
plt.stackplot(
df_hourly_mean.index[0:168]/24,
production_biomasse_horaire_moy[0:168],
production_photovoltaique[0:168]/1000,
labels=['Biomass', 'Photovoltaic'],
colors=['green','orange']
)
plt.plot(
df_hourly_mean.index[0:168]/24,
CONS[0:168], label='Consommation', color='red',linewidth=5)
plt.axhline(0, color='black', linestyle='--', linewidth=2)
# Add labels and legend
plt.xlabel('Time [days]')
plt.ylabel('Production [kWh]')
plt.legend(loc='upper left')
# Show the plot
plt.savefig('Production hebdo sol bio et consommation tot')
plt.show()
prod_S4 = sum(production_eolienne)/1000+production_biomasse_anuelle
print(prod_S4)
# Create a stackplot
plt.figure(figsize=(25, 15))
plt.stackplot(
df_hourly_mean.index[0:168]/24,
production_biomasse_horaire_moy[0:168],
production_eolienne[0:168]/1000,
labels=['Biomass', 'Wind'],
colors=['green', 'b']
)
plt.plot(
df_hourly_mean.index[0:168]/24,
CONS[0:168], label='Consommation', color='red',linewidth=5)
plt.axhline(0, color='black', linestyle='--', linewidth=2)
# Add labels and legend
plt.xlabel('Time [days]')
plt.ylabel('Production [kWh]')
plt.legend(loc='upper left')
# Show the plot
plt.savefig('Production hebdo eol bio et consommation tot')
plt.show()
prod_S5 = sum(production_eolienne)/1000+sum(production_photovoltaique)/1000
print(prod_S5)
# Create a stackplot
plt.figure(figsize=(25, 15))
plt.stackplot(
df_hourly_mean.index[0:168]/24,
production_photovoltaique[0:168]/1000,
production_eolienne[0:168]/1000,
labels=[ 'Photovoltaic','Wind'],
colors=['orange', 'b']
)
plt.plot(
df_hourly_mean.index[0:168]/24,
CONS[0:168], label='Consommation', color='red',linewidth=5)
plt.axhline(0, color='black', linestyle='--', linewidth=2)
# Add labels and legend
plt.xlabel('Time [days]')
plt.ylabel('Production [kWh]')
plt.legend(loc='upper left')
# Show the plot
plt.savefig('Production hebdo eol sol et consommation tot')
plt.show()
surplus / scénarios pour l'ensemble de la communauté
np.set_printoptions(suppress=True, precision=2)
### Calcul des surplus hebdomadaires pour le scénario 1 ###
i=0
surplus_mat1 = np.zeros((52,2),dtype=float)
for i in range(52):
surplus = sum(production_photovoltaique[168*i:168*(i+1)])/1000 + sum(production_biomasse_horaire_moy[168*i:168*(i+1)]) + sum(production_eolienne[168*i:168*(i+1)])/1000-sum(CONS[168*i:168*(i+1)])
if sum(TOT_conso.iloc[168*i:168*(i+1),1]) ==0 :
surplus_mat1[i,1]= float('NaN')
surplus_mat1[i,0] = i
else :
surplus_mat1[i,1]=surplus
surplus_mat1[i,0] = i
print(max(surplus_mat1[:,1]))
### Calcul des surplus hebdomadaires pour le scénario 2 ###
i=0
surplus_mat2 = np.zeros((52,2))
for i in range(52):
surplus = sum(production_photovoltaique[168*i:168*(i+1)])/1000+sum(production_biomasse_horaire_moy[168*i:168*(i+1)])-sum(CONS[168*i:168*(i+1)])
if sum(TOT_conso.iloc[168*i:168*(i+1),1]) ==0 :
surplus_mat2[i,1]= float('NaN')
surplus_mat2[i,0] = i
else :
surplus_mat2[i,1]=surplus
surplus_mat2[i,0] = i
print(max(surplus_mat2[:,1]))
### Calcul des surplus hebdomadaire pour le scénario 3 ###
i=0
surplus_mat3 = np.zeros((52,2),dtype=float)
for i in range(52):
surplus = sum(production_biomasse_horaire_moy[168*i:168*(i+1)]) + sum(production_eolienne[168*i:168*(i+1)])/1000-sum(CONS[168*i:168*(i+1)])
if sum(TOT_conso.iloc[168*i:168*(i+1),1]) ==0 :
surplus_mat3[i,1] = float('NaN')
surplus_mat3[i,0] = i
else :
surplus_mat3[i,1]=surplus
surplus_mat3[i,0] = i
print(max(surplus_mat3[:,1]))
### Calcul des surplus hebdomadaire du scénario 4 ###
i=0
surplus_mat4 = np.zeros((52,2),dtype=float)
for i in range(52):
surplus = sum(production_photovoltaique[168*i:168*(i+1)])/1000 + sum(production_eolienne[168*i:168*(i+1)])/1000-sum(CONS[168*i:168*(i+1)])
if sum(TOT_conso.iloc[168*i:168*(i+1),1]) ==0 :
surplus_mat4[i,1] = float('nan')
surplus_mat4[i,0] = i
else :
surplus_mat4[i,1]=surplus
surplus_mat4[i,0] = i
print(max(surplus_mat4[:,1]))
### Représentation des surplus de chaque scénario sur un an ###
plt.figure(figsize=(25, 15))
plt.plot(
surplus_mat1[:,1],
label='Surplus BIO + PV + EOL', color ='red')
plt.plot(
surplus_mat2[:,1],
label='Surplus BIO + PV',color ='green')
plt.plot(
surplus_mat3[:,1],
label='Surplus BIO + EOL',color ='black'
)
plt.plot(
surplus_mat4[:,1],
label='Surplus EOL + PV',color ='blue'
)
plt.axhline(0, color='black', linestyle='--', linewidth=2)
plt.legend(loc='upper left', fontsize=12)
plt.xlabel('Time [week]')
plt.ylabel('bilan [Wh]')
plt.title('somme des surplus tot/semaines')
plt.savefig('Bilan surplus annuel avec conso tot ')
plt.show()
### Calcul des surplus hebdomadaires pour le scénario 1 ###
i=0
surplus_UCL1 = np.zeros((52,2),dtype=float)
for i in range(52):
surplus = sum(production_photovoltaique[168*i:168*(i+1)])/1000 + sum(production_biomasse_horaire_moy[168*i:168*(i+1)]) + sum(production_eolienne[168*i:168*(i+1)])/1000-sum(TOT_conso.iloc[168*i:168*(i+1),1].values)
if sum(TOT_conso.iloc[168*i:168*(i+1),1]) ==0 :
surplus_UCL1[i,1]= float('NaN')
surplus_UCL1[i,0] = i
else :
surplus_UCL1[i,1]=surplus
surplus_UCL1[i,0] = i
print(max(surplus_UCL1[:,1]))
### Calcul des surplus hebdomadaires pour le scénario 2 ###
i=0
surplus_UCL2 = np.zeros((52,2),dtype=float)
for i in range(52):
surplus = sum(production_photovoltaique[168*i:168*(i+1)])/1000 + sum(production_biomasse_horaire_moy[168*i:168*(i+1)]) -sum(TOT_conso.iloc[168*i:168*(i+1),1].values)
if sum(TOT_conso.iloc[168*i:168*(i+1),1]) ==0 :
surplus_UCL2[i,1]= float('NaN')
surplus_UCL2[i,0] = i
else :
surplus_UCL2[i,1]=surplus
surplus_UCL2[i,0] = i
print(max(surplus_UCL2[:,1]))
### Calcul des surplus hebdomadaires pour le scénario 3 ###
i=0
surplus_UCL3 = np.zeros((52,2),dtype=float)
for i in range(52):
surplus = sum(production_biomasse_horaire_moy[168*i:168*(i+1)]) + sum(production_eolienne[168*i:168*(i+1)])/1000-sum(TOT_conso.iloc[168*i:168*(i+1),1].values)
if sum(TOT_conso.iloc[168*i:168*(i+1),1]) ==0 :
surplus_UCL3[i,1]= float('NaN')
surplus_UCL3[i,0] = i
else :
surplus_UCL3[i,1]=surplus
surplus_UCL3[i,0] = i
print(max(surplus_UCL3[:,1]))
### Calcul des surplus hebdomadaires pour le scénario 4 ###
i=0
surplus_UCL4 = np.zeros((52,2),dtype=float)
for i in range(52):
surplus = sum(production_photovoltaique[168*i:168*(i+1)])/1000 + sum(production_eolienne[168*i:168*(i+1)])/1000-sum(TOT_conso.iloc[168*i:168*(i+1),1].values)
if sum(TOT_conso.iloc[168*i:168*(i+1),1]) ==0 :
surplus_UCL4[i,1]= float('NaN')
surplus_UCL4[i,0] = i
else :
surplus_UCL4[i,1]=surplus
surplus_UCL4[i,0] = i
print(max(surplus_UCL4[:,1]))
#print(surplus_UCL4)
plt.figure(figsize=(25, 15))
plt.plot(
surplus_UCL1[:,1],
label='Surplus BIO + PV + EOL', color ='red')
plt.plot(
surplus_UCL2[:,1],
label='Surplus BIO + PV',color ='green')
plt.plot(
surplus_UCL3[:,1],
label='Surplus BIO + EOL',color ='black'
)
plt.plot(
surplus_UCL4[:,1],
label='Surplus EOL + PV',color ='blue'
)
plt.axhline(0, color='black', linestyle='--', linewidth=2)
plt.legend(loc='upper left', fontsize=12)
plt.xlabel('Time [week]')
plt.ylabel('bilan [Wh]')
plt.title('somme des surplus UCL/semaines')
plt.savefig('Bilan surplus annuel avec conso UCL ')
plt.show()
### Représentation des surplus chaque demi-journée sur une année pour le scénario 2 ###
## Calcul du surplus
i=0
surplus_h_S1 = np.zeros((730,2))
for i in range(730):
surplus = sum(production_photovoltaique[12*i:12*(i+1)])/1000 + sum(production_eolienne[12*i:12*(i+1)])/1000+sum(production_biomasse_horaire_moy[12*i:12*(i+1)])-sum(CONS[12*i:12*(i+1)])
if sum(TOT_conso.iloc[12*i:12*(i+1),1]) ==0 :
surplus_h_S1[i,1]= float('NaN')
surplus_h_S1[i,0] = i
else :
surplus_h_S1[i,1]=surplus
surplus_h_S1[i,0]= i
print(surplus_h_S1)
## Déterminer les incertitudes
#Cacul des quantiles
q1, q3 = np.nanpercentile(surplus_h_S1[:, 1], [25, 75])
# Calculer l'IQR (écart interquartile)
iqr = q3 - q1
print(iqr)
# Définir les limites pour identifier les outliers
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
# Filtrer les valeurs non-outliers
surplus_no_outliers = surplus_h_S1[(surplus_h_S1[:, 1] >= lower_bound) & (surplus_h_S1[:, 1] <= upper_bound)]
max_surpl = np.max(surplus_no_outliers)
## Représentation des données sans outliers
plt.plot(surplus_h_S1[:, 1], label='Surplus', color='red')
plt.plot(surplus_no_outliers[:, 1], label='Surplus sans outliers', color='green')
plt.xlabel('Index')
plt.ylabel('Valeur de Surplus en kWh')
plt.legend()
plt.savefig("surplus")
plt.show()
print(f"La valeur maximale de surplus à stocker est de {max_surpl}")
Calcules des KPIs
# parametre generaux
taux_emission_be = 220 #[gCO2eq/kWh] https://base-empreinte.ademe.fr/donnees/jeu-donnees
taux_emission_cogen = 515 #[gCO2eq/kWh] https://app.electricitymaps.com/zone/BE
taux_emission_eolien= 14.1 #[gCO2eq/kWh] https://www.hellocarbo.com/blog/calculer/bilan-carbone-eolienne-etude/
taux_emission_solaire = 34.55 #[gCO2eq/kWh] https://www.hellocarbo.com/blog/calculer/bilan-carbone-eolienne-etude/
taux_emission_biomasse = 230 #[gCO2eq/kWh] https://app.electricitymaps.com/zone/BE
# = 0.7
# = 202.312
inv_eol = 24000000
inv_bio = 53000000
inv_cogen = 2400000
prix_exploit_sol = 5 #€/kWh
prix_exploit_eol = 20 #€/MWh
prix_revente = 0.15 #€/kWh
vie = 25
prix_achat_UCl =0.28 #€/kWh
import pandas as pd
scenarios = pd.DataFrame(index=range(1, 21), columns=["Scenario 1", "Scenario 2", "Scenario 3", "Scenario 4", "Scenario 5"])
scenarios.rename(index={1: "Cout d'investissement PV"}, inplace=True)
scenarios.rename(index={2: "Cout d'investissement eolien"}, inplace=True)
scenarios.rename(index={3: "Cout d'investissement Biomasse"}, inplace=True) #45M€ / 50 à 60€ par MWh -> repris des chiffre de la central mais mieux si la source n'est pas le journal : https://www.lecho.be/dossier/choixredac/la-centrale-biomasse-wallonne-plus-chere-que-l-eolien-ou-le-photovoltaique/9901762.html
scenarios.rename(index={4: "Cout d'investissement cogen"}, inplace=True)
scenarios.rename(index={5: "Cout d'exploitation PV [€/an]"}, inplace=True) # #https://www.photovoltaique.info/fr/preparer-un-projet/quelles-demarches-realiser/choisir-son-modele-economique/#tab-content
scenarios.rename(index={6: "Cout d'exploitation eolien [€/an]"}, inplace=True) # https://www.uvcw.be/energie/vos-questions/art-1327
scenarios.rename(index={7: "Cout d'exploitation Biomasse [€/an]"}, inplace=True) #aucune info
scenarios.rename(index={8: "cout d'exploitation cogen [€/an]"}, inplace=True) #aucune info marmourad reponds pas
scenarios.rename(index={9: "Revenus annuels"}, inplace=True)
scenarios.rename(index={10: "Production_totale [kWh/an]"}, inplace=True)
scenarios.rename(index={11: "Durée de vie"}, inplace=True)
scenarios.rename(index={12: "Production PV [kWh/an]"}, inplace=True)
scenarios.rename(index={13: "Production eolien [kWh/an]"}, inplace=True)
scenarios.rename(index={14: "Production Biomasse [kWh/an]"}, inplace=True)
scenarios.rename(index={15: "Nombre de consommateurs"}, inplace=True) #à adapter
scenarios.rename(index={16: "Nombre de producteurs"}, inplace=True)
scenarios.rename(index={17: "Capacité de stockage requise [kWh]"}, inplace=True) #encore à définir
scenarios.rename(index={18: "Prise sur le réseau UCL[kWh/an]"}, inplace=True) #verifier
scenarios.rename(index={19: "Consommation [kWh/an]"}, inplace=True) #verifier
scenarios.rename(index={20: "Investissement stockage €"}, inplace=True) #à definir
scenarios.rename(index={21: "Economie annuelles nettes"}, inplace=True) # à verifier
nan_indices = np.isnan(CONS)
CONS = CONS[~np.isnan(CONS)]
nan_indices = np.isnan(TOT_conso)
TOT_conso = TOT_conso.dropna()
scenarios.loc["Cout d'investissement PV", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = 0,0.7 * 202.312 * S,0.7 * 202.312 * S,0,0.7 * 202.312 * S # valeur ok
scenarios.loc["Cout d'investissement eolien", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [0,24000000,0,24000000,24000000] # donnée de didier https://www.uvcw.be/energie/vos-questions/art-1327
scenarios.loc["Cout d'investissement Biomasse", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [0,53000000,53000000,53000000,0]
scenarios.loc["Cout d'exploitation PV [€/an]", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = (0, 5*S*202.312/1000, 5*S*202.312/1000 , 0 ,5*S*202.312/1000 )
scenarios.loc["Cout d'exploitation eolien [€/an]", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [0,sum(production_eolienne)/1000000*20,0,sum(production_eolienne)/1000000*20,sum(production_eolienne)/1000000*20]
scenarios.loc["Cout d'exploitation Biomasse [€/an]", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [0,53000000*0.06,53000000*0.06,53000000*0.06,0] # choix arbitraire de 8% des cout initial d'investissement
scenarios.loc["Revenus annuels", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [0,(prod_S2-sum(TOT_conso['conso UCL']))*0.15,(prod_S3-sum(TOT_conso['conso UCL']))*0.15,(prod_S4-sum(TOT_conso['conso UCL']))*0.15,(prod_S5-sum(TOT_conso['conso UCL']))*0.15]
scenarios.loc["Production_totale [kWh/an]", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [15000000,prod_S2,prod_S3,prod_S4,prod_S5]
scenarios.loc["Durée de vie", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [15,25,25,25,25]
scenarios.loc["Production PV [kWh/an]", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [0,sum(production_photovoltaique)/1000,sum(production_photovoltaique)/1000,0,sum(production_photovoltaique)/1000]
scenarios.loc["Production eolien [kWh/an]", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [0,sum(production_eolienne)/1000,0,sum(production_eolienne)/1000,sum(production_eolienne)/1000]
scenarios.loc["Production Biomasse [kWh/an]", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [0,production_biomasse_anuelle,production_biomasse_anuelle,production_biomasse_anuelle,0]
scenarios.loc["Nombre de consommateurs", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [1,1,1,1,1]
scenarios.loc["Nombre de producteurs", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [1,1,1,1,1]
scenarios.loc["Capacité de stockage requise [kWh]", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [0,0,0,0,0]
scenarios.loc["Prise sur le réseau UCL[kWh/an]", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [sum(TOT_conso['conso UCL'])-15000000,sum(TOT_conso['conso UCL'])-prod_S2,sum(TOT_conso['conso UCL'])-prod_S3,sum(TOT_conso['conso UCL'])-prod_S4,sum(TOT_conso['conso UCL'])-prod_S5]
scenarios.loc["Consommation [kWh/an]", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [sum(TOT_conso['conso UCL']),sum(CONS),sum(CONS),sum(CONS),sum(CONS)]
scenarios.loc["Cout d'investissement cogen", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [2400000,0,0,0,0]
scenarios.loc["cout d'exploitation cogen [€/an]", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [2400000*0.06,0,0,0,0]
scenarios.loc["Investissement stockage €", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [0,0,0,0,0]
scenarios.loc["Economie annuelles nettes", ["Scenario 1", "Scenario 2", "Scenario 3","Scenario 4", "Scenario 5"]] = [
(12200383.89*0.28),
(sum(TOT_conso['conso UCL'].values))*0.28,
(sum(TOT_conso['conso UCL'].values) )*0.28,
(sum(TOT_conso['conso UCL'].values) )*0.28,
sum(TOT_conso['conso UCL'].values)*0.28
]
print(scenarios)
scenarios.to_excel('scenarios.xlsx')
print(prod_S3-sum(TOT_conso['conso UCL']))
# Fonctions pour calculer les indicateurs
## Calcul du cashflow pour chaque Scenarios
def calculer_cash_flow_annuel(scenario):
revenus_annuels = scenarios.loc["Revenus annuels", scenario] + scenarios.loc["Economie annuelles nettes", scenario]
couts_exploitation_annuels = scenarios.loc["Cout d'exploitation PV [€/an]", scenario] + \
scenarios.loc["Cout d'exploitation eolien [€/an]", scenario] + \
scenarios.loc["Cout d'exploitation Biomasse [€/an]", scenario] + \
scenarios.loc["cout d'exploitation cogen [€/an]", scenario]
cash_flow_annuel = revenus_annuels - couts_exploitation_annuels
return cash_flow_annuel
# Appliquer la fonction à tous les scénarios et stocker les résultats dans un dictionnaire
cash_flows = {scenario: calculer_cash_flow_annuel(scenario) for scenario in scenarios.columns}
# Affichage des cash flows pour chaque scénario
for scenario, cash_flow in cash_flows.items():
print(f"Le cash flow annuel pour {scenario} est: {cash_flow} €")
## Calcul du ROI pour chaque Scenario
def calculer_roi(scenario):
economie_annuelle = scenarios.loc["Economie annuelles nettes", scenario]
revenus_annuels = scenarios.loc["Revenus annuels", scenario]
cout_exploitation_pv = scenarios.loc["Cout d'exploitation PV [€/an]", scenario]
cout_exploitation_eolien = scenarios.loc["Cout d'exploitation eolien [€/an]", scenario]
cout_exploitation_biomasse = scenarios.loc["Cout d'exploitation Biomasse [€/an]", scenario]
cout_exploitation_cogen = scenarios.loc["cout d'exploitation cogen [€/an]", scenario]
cout_investissement_pv = scenarios.loc["Cout d'investissement PV", scenario]
cout_investissement_eolien = scenarios.loc["Cout d'investissement eolien", scenario]
cout_investissement_biomasse = scenarios.loc["Cout d'investissement Biomasse", scenario]
cout_investissement_cogen = scenarios.loc["Cout d'investissement cogen", scenario]
cash_flow_annuel = economie_annuelle + revenus_annuels - (cout_exploitation_pv + cout_exploitation_eolien + cout_exploitation_biomasse + cout_exploitation_cogen)
investissement_total = cout_investissement_pv + cout_investissement_eolien + cout_investissement_biomasse + cout_investissement_cogen
roi = cash_flow_annuel / investissement_total
return roi
for scenario in scenarios.columns:
scenarios.loc["ROI", scenario] = calculer_roi(scenario)
print(scenarios.loc["ROI"])
## Calcule de la valeur actuelles net pour chaque Scenarios
import matplotlib.pyplot as plt
# Assurez-vous que 'scenarios' est votre DataFrame et qu'il est correctement défini avec toutes les valeurs nécessaires
taux_actualisation = 0.03 # Exemple de taux d'actualisation de 5%
# Fonction pour calculer la VAN cumulée en prenant en compte les économies annuelles nettes
def calculer_van_cumulee_avec_economies(scenario, taux_actualisation):
cout_investissement = scenarios.at["Cout d'investissement PV", scenario] + \
scenarios.at["Cout d'investissement eolien", scenario] + \
scenarios.at["Cout d'investissement Biomasse", scenario] + \
scenarios.at["Cout d'investissement cogen", scenario]
duree_vie = int(scenarios.at["Durée de vie", scenario])
van_cumulee = []
npv = -cout_investissement
van_cumulee.append(npv)
for an in range(1, duree_vie + 1):
flux_annuel = scenarios.at["Revenus annuels", scenario] - \
scenarios.at["Cout d'exploitation PV [€/an]", scenario] - \
scenarios.at["Cout d'exploitation eolien [€/an]", scenario] - \
scenarios.at["Cout d'exploitation Biomasse [€/an]", scenario] - \
scenarios.at["cout d'exploitation cogen [€/an]", scenario] + \
scenarios.at["Economie annuelles nettes", scenario] # Ajout des économies annuelles nettes
npv += flux_annuel / ((1 + taux_actualisation) ** an)
van_cumulee.append(npv)
return van_cumulee
# Création du graphique
plt.figure(figsize=(12, 7))
# Boucle sur chaque scénario pour calculer la VAN cumulée et la tracer
for scenario in scenarios.columns:
van_cumulee = calculer_van_cumulee_avec_economies(scenario, taux_actualisation)
plt.plot(range(len(van_cumulee)), van_cumulee, label=scenario)
# Ajout d'une ligne horizontale à y=0 pour indiquer le point de rentabilité
plt.axhline(0, color='red', linestyle='--', linewidth=2)
# Mettre en forme le graphique
plt.title("Valeurs actuelles net")
plt.xlabel("Années")
plt.ylabel("Valeur Actuelle Nette Cumulée [€]")
plt.legend()
plt.grid(True)
plt.show()
## calcule du LCOE pour chaque Scenarios
def calculer_lcoe_total(scenario):
# Récupération des données nécessaires à partir du dataframe 'scenarios'
I_t = scenarios.loc["Cout d'investissement PV", scenario] + \
scenarios.loc["Cout d'investissement eolien", scenario] + \
scenarios.loc["Cout d'investissement Biomasse", scenario] + \
scenarios.loc["Cout d'investissement cogen", scenario]
M_t = scenarios.loc["Cout d'exploitation PV [€/an]", scenario] + \
scenarios.loc["Cout d'exploitation eolien [€/an]", scenario] + \
scenarios.loc["Cout d'exploitation Biomasse [€/an]", scenario] + \
scenarios.loc["cout d'exploitation cogen [€/an]", scenario]
# F_t est omis car nous n'avons pas de coûts de carburant spécifiés pour ces sources d'énergie renouvelables
F_t = 0
E_t = scenarios.loc["Production_totale [kWh/an]", scenario]
n = int(scenarios.loc["Durée de vie", scenario])
# Calcul des coûts et de la production totale actualisés sur la durée de vie du système
couts_actualises = I_t + sum([M_t / ((1 + taux_actualisation) ** t) for t in range(1, n+1)])
production_actualisee = sum([E_t / (1** t) for t in range(1, n+1)])
# Calcul du LCOE
lcoe = couts_actualises / production_actualisee
return lcoe
# Calcul du LCOE pour chaque scénario et stockage des résultats dans un dictionnaire
lcoe_values = {scenario: calculer_lcoe_total(scenario) for scenario in scenarios.columns}
# Affichage des résultats
for scenario, lcoe in lcoe_values.items():
print(f"{scenario}: LCOE = {lcoe:.4f} €/kWh")
# Tracé du graphique
plt.figure(figsize=(10, 6))
plt.bar(lcoe_values.keys(), lcoe_values.values(), color='teal')
plt.title('LCOE pour chaque scénarios sur leur durée de vie totale')
plt.xlabel('Scénarios')
plt.ylabel('LCOE (€/kWh)')
plt.show()
print(scenarios.loc["Cout d'investissement PV", scenario])
#### calcul des KPI ENVI ### PAS TOUCHER OU MOI FACHER TOUT ROUGE
#bilan basé sur ces données pour eolien et PV https://www.hellocarbo.com/blog/calculer/bilan-carbone-eolienne-etude/
def taux_emission_actuelle(i):
conso_actuelle = scenarios.iloc[18:19,0:1].values[0][0]- scenarios.iloc[9:10,0:1].values[0][0]
return (conso_actuelle*taux_emission_be + scenarios.iloc[9:10,0:1].values[0][0]*taux_emission_cogen)/scenarios.iloc[18:19,0:1].values[0][0]
def taux_emission_scenario(i):
conso_actuelle = scenarios.iloc[18:19,0:1].values[0][0]- scenarios.iloc[9:10,0:1].values[0][0]
if i == 1:
cogen = conso_actuelle*taux_emission_be + scenarios.iloc[9:10,0:1].values[0][0]*taux_emission_cogen
else :
cogen = 0
return (cogen /scenarios.iloc[18:19,0:1].values[0][0]) +( scenarios.iloc[12:13,i-1:i].values[0][0] *taux_emission_eolien + scenarios.iloc[11:12,i-1:i].values[0][0]*taux_emission_solaire + scenarios.iloc[13:14,i-1:i].values[0][0] * taux_emission_biomasse)/scenarios.iloc[9:10,i-1:i].values[0][0]
def bilan_CO2_annuel(i):
conso_actuelle = scenarios.iloc[18:19,0:1].values[0][0]- scenarios.iloc[9:10,0:1].values[0][0]
emission_actuelle = conso_actuelle*taux_emission_be + scenarios.iloc[9:10,0:1].values[0][0]*taux_emission_cogen
#conso_actuelle = scenarios.iloc[18:19,0:1].values[0][0]- scenarios.iloc[9:10,0:1].values[0][0]
if i == 1:
cogen = conso_actuelle*taux_emission_be + scenarios.iloc[9:10,0:1].values[0][0]*taux_emission_cogen
else :
cogen = 0
emission_scenario = cogen +scenarios.iloc[12:13,i-1:i].values[0][0] *taux_emission_eolien + scenarios.iloc[11:12,i-1:i].values[0][0]*taux_emission_solaire + scenarios.iloc[13:14,i-1:i].values[0][0] * taux_emission_biomasse
return emission_scenario - emission_actuelle*(scenarios.iloc[9:10,i-1:i].values[0][0]/scenarios.iloc[18:19,0:1].values[0][0])
def emmission_annuelles(i):
return sum(TOT_conso['conso UCL']) * taux_emission_scenario(i)
print(taux_emission_actuelle(1))
print(taux_emission_scenario(1))
print(bilan_CO2_annuel(1))
# crée un data frame
KPIs = pd.DataFrame(
index=[
"taux_emission_scenario [gCo2eq/kWh]",
#"bilan_CO2_annuel [kg]",
"emmission annuelles UCL [t]",
"NPV [M€]",
"Cash_flow [€/an]",
"LCOE [€/kWh]",
"ROI [/]"
],
columns=["Scenario 1", "Scenario 2", "Scenario 3", "Scenario 4", "Scenario 5"]
)
# Remplissage initial du tableau
KPIs.loc["taux_emission_scenario [gCo2eq/kWh]"] = [taux_emission_scenario(i) for i in range(1, 6)]
#KPIs.loc["bilan_CO2_annuel [kg]"] = [bilan_CO2_annuel(i)/1000 for i in range(1, 6)]
KPIs.loc["emmission annuelles UCL [t]"] = [emmission_annuelles(i)/1000000 for i in range(1, 6)]
KPIs.loc["NPV [M€]"] = [calculer_van_cumulee_avec_economies("Scenario " + str(i), taux_actualisation)[-1]/1000000 for i in range(1, 6)]
KPIs.loc["Cash_flow [€/an]"] = [calculer_cash_flow_annuel("Scenario " + str(i)) for i in range(1, 6)]
KPIs.loc["LCOE [€/kWh]"] = [calculer_lcoe_total("Scenario " + str(i)) for i in range(1, 6)]
KPIs.loc["ROI [/]"] = scenarios.loc["ROI"]
for col in KPIs.columns:
KPIs[col] = pd.to_numeric(KPIs[col], errors='coerce')
# Arrondir les valeurs
KPIs = KPIs.round(2)
print(KPIs.loc["emmission annuelles UCL [t]"])
## print graph
fig, ax = plt.subplots(figsize=(10, 8)) # Adjust the size as needed
ax.axis('tight')
ax.axis('off')
table = ax.table(cellText=KPIs.values, colLabels=KPIs.columns, rowLabels=KPIs.index, cellLoc = 'center', loc='center')
table.scale(1, 2)
plt.title('Tableau des KPIs pour chaque scénario', fontsize=16, pad=20)
plt.show()
### print parametre financier
#fig, ax = plt.subplots(figsize=(10, 8)) # Adjust the size as needed
#ax.axis('tight')
#ax.axis('off')
#table = ax.table(cellText=KPIs_subset.values, colLabels=KPIs_subset.columns, rowLabels=KPIs_subset.index, cellLoc = 'center', loc='center')
#table.scale(1, 2) # Adjust the scale if needed
#plt.title('Tableau des KPIs pour les quatre derniers indicateurs de chaque scénario', fontsize=16, pad=20)
#plt.show()
Incertitudes
np.set_printoptions(suppress=True, precision=2)
S = 16229.26 # Surface exploitable [m²]
Cp = 0.9 # Coefficient de performance de l'installation
R_pv = 0.22 # Rendement des panneaux photovoltaïques
deviation_sol = np.std(df_hourly_mean['ens'])
sol_max= df_hourly_mean['ens']+0.5*deviation_sol
sol_min = df_hourly_mean['ens'] -0.5*deviation_sol
ensol= df_hourly_mean['ens']
prod_solmoy = S * R_pv * Cp * ensol # Rendement des panneaux photovoltaïques
prod_solmax = S * R_pv * Cp * sol_max # Rendement des panneaux photovoltaïques
prod_solmin = S * R_pv * Cp * sol_min # Rendement des panneaux photovoltaïques
prod_solmoy = prod_solmoy.clip(0) # remplacer toutes les valeurs négatives par 0
prod_solmin =prod_solmin.clip(0)
prod_solmoy = prod_solmoy.clip(0)
plt.plot(prod_solmax, label='Production Solaire Max')
plt.plot(prod_solmoy, label='Production Solaire Moyenne')
plt.plot(prod_solmin, label='Production Solaire Min')
# Légende pour les axes
plt.xlabel('Heures')
plt.ylabel('Production en kWh')
# Afficher la légende
plt.legend()
plt.savefig("prod_sol")
# Afficher le graphe solaire
plt.show()
print(sum(prod_solmax)/1000)
print(sum(prod_solmin)/1000)
print(sum(prod_solmoy)/1000)
d = 1.225 # Densité de l'air (valeur typique en Kg/m³)
# Paramètres pour les éoliennes de 900 kW
nombre_eolienne_1 = 6
diametre_rotor_1 = 54 # Diamètre du rotor pour le premier type d'éolienne en mètres
surface_pales_1 = np.pi * (diametre_rotor_1 / 2) ** 2 # Surface balayée par les pales pour le premier type d'éolienne en mètres carrés
coefficient_puissance_1 = 0.3 # Coefficient de puissance pour le premier type d'éolienne
puissance_nominal_1 = 900 * 1000 # 900 kW en watts
# Paramètres pour les éoliennes de 1MW
nombre_eolienne_2 = 6
diametre_rotor_2 = 61 # Diamètre du rotor pour le deuxième type d'éolienne en mètres
surface_pales_2 = np.pi * (diametre_rotor_2 / 2) ** 2 # Surface balayée par les pales pour le deuxième type d'éolienne en mètres carrés
coefficient_puissance_2 = 0.3 # Coefficient de puissance pour le deuxième type d'éolienne
puissance_nominal_2 = 1000 * 1000 # 1 MW en watts
deviation_eol = np.std(df_hourly_mean.loc[:,'vvt'].values)
print(deviation_eol)
vvt_moy = df_hourly_mean.loc[:,'vvt'].values
vvt_max = df_hourly_mean['vvt']+ 0.5*deviation_eol
vvt_min = df_hourly_mean['vvt'] - 0.5*deviation_eol
print(df_hourly_mean['vvt'])
print(vvt_max)
print(vvt_min)
plt.plot(vvt_max)
plt.plot(df_hourly_mean['vvt'])
plt.plot(vvt_min)
plt.show()
prod_eolmoy = np.zeros(len(vvt_max))
prod_eolmax = np.zeros(len(vvt_moy))
prod_eolmin = np.zeros(len(vvt_min))
for i, ventmax in enumerate(vvt_max):
if 2.5 <= ventmax < 13.5:
# Calcul basé sur la formule de la puissance éolienne
prod_eolmax[i] = 0.5 * d * (
surface_pales_1 * coefficient_puissance_1 * (ventmax ** 3) * nombre_eolienne_1 +
surface_pales_2 * coefficient_puissance_2 * (ventmax ** 3) * nombre_eolienne_2
)
elif 13.5 <= ventmax < 25:
# Puissance nominale atteinte
prod_eolmax[i] = puissance_nominal_1 * nombre_eolienne_1 + puissance_nominal_2 * nombre_eolienne_2
# Pas de production au-delà de 25 m/s ou en dessous de 2.5 m/s
for i, ventmoy in enumerate(vvt_moy):
if 2.5 <= ventmoy < 13.5:
# Calcul basé sur la formule de la puissance éolienne
prod_eolmoy[i] = 0.5 * d * (
surface_pales_1 * coefficient_puissance_1 * (ventmoy ** 3) * nombre_eolienne_1 +
surface_pales_2 * coefficient_puissance_2 * (ventmoy ** 3) * nombre_eolienne_2
)
elif 13.5 <= ventmoy < 25:
# Puissance nominale atteinte
prod_eolmoy[i] = puissance_nominal_1 * nombre_eolienne_1 + puissance_nominal_2 * nombre_eolienne_2
# Pas de production au-delà de 25 m/s ou en dessous de 2.5 m/s
for i, ventmin in enumerate(vvt_min):
if 2.5 <= ventmin < 13.5:
# Calcul basé sur la formule de la puissance éolienne
prod_eolmin[i] = 0.5 * d * (
surface_pales_1 * coefficient_puissance_1 * (ventmin ** 3) * nombre_eolienne_1 +
surface_pales_2 * coefficient_puissance_2 * (ventmin ** 3) * nombre_eolienne_2
)
elif 13.5 <= ventmin < 25:
# Puissance nominale atteinte
prod_eolmin[i] = puissance_nominal_1 * nombre_eolienne_1 + puissance_nominal_2 * nombre_eolienne_2
# Pas de production au-delà de 25 m/s ou en dessous de 2.5 m/s
prod_eolmoy=prod_eolmoy.clip(0)
prod_eolmax= prod_eolmax.clip(0)
prod_eolmin=prod_eolmin.clip(0)
plt.plot(prod_eolmax, label='Production Éolienne Max')
plt.plot(prod_eolmoy, label='Production Éolienne Moyenne')
plt.plot(prod_eolmin, label='Production Éolienne Min')
# Légende pour les axes
plt.xlabel('Heures')
plt.ylabel('Production en kWh')
# Afficher la légende
plt.legend()
plt.savefig("prod eol")
# Afficher le graphe
plt.show()
print(sum(prod_eolmoy)/1000)
print(sum(prod_eolmin)/1000)
print(sum(prod_eolmax)/1000)
prod_tot_max = sum(prod_eolmax)/1000+sum(prod_solmax)/1000+production_biomasse_anuelle
prod_tot_min = sum(prod_eolmin)/1000+sum(prod_solmin)/1000+production_biomasse_anuelle
pd.set_option('display.float_format', '{:.0f}'.format)
pd.set_option('display.precision', 2)
scenarios.loc["Cout d'investissement PV", ["Prod Max ", "Prod Min"]] = 0.7 * 202.312 * S,0.7 * 202.312 * S
scenarios.loc["Cout d'investissement eolien", ["Prod Max ", "Prod Min"]] = [24000000,24000000] # en €
scenarios.loc["Cout d'investissement Biomasse", ["Prod Max ", "Prod Min"]] = [53000000,53000000] # €
scenarios.loc["Cout d'exploitation PV [€/an]", ["Prod Max ", "Prod Min" ]]= 5*S*202.312/1000, 5*S*202.312/1000 # a prendre par an absolument et surtout check formule pour eviter d'oublier de multiplier par la durée de vie quand c'est nécessaire (valable pour tout les cout d'exploitation)https://www.photovoltaique.info/fr/preparer-un-projet/quelles-demarches-realiser/choisir-son-modele-economique/#tab-content
scenarios.loc["Cout d'exploitation eolien [€/an]", ["Prod Max ", "Prod Min"]] = [sum(prod_eolmax)/1000000*20,sum(prod_eolmin)/1000000*20] #-> faut exprimer la valeur en € par an -> info bizzard donnée par kWh semble chelou https://www.uvcw.be/energie/vos-questions/art-1327
scenarios.loc["Cout d'exploitation Biomasse [€/an]", ["Prod Max ", "Prod Min"]] = [53000000*0.06,53000000*0.06]
scenarios.loc["Revenus annuels", ["Prod Max ", "Prod Min"]] = [(prod_tot_max-sum(TOT_conso['conso UCL']))*0.15,(prod_tot_min-sum(TOT_conso['conso UCL']))*0.15]
scenarios.loc["Production_totale [kWh/an]", ["Prod Max ", "Prod Min"]] = [prod_tot_max,prod_tot_min]
scenarios.loc["Durée de vie", ["Prod Max ", "Prod Min"]] = [25,25]
scenarios.loc["Production PV [kWh/an]", ["Prod Max ", "Prod Min"]] = [sum(prod_solmax)/1000,sum(prod_solmin)/1000]
scenarios.loc["Production eolien [kWh/an]", ["Prod Max ", "Prod Min"]] = [sum(prod_eolmax)/1000,sum(prod_eolmin)/1000]
scenarios.loc["Production Biomasse [kWh/an]", ["Prod Max ", "Prod Min"]] = [production_biomasse_anuelle,production_biomasse_anuelle]
scenarios.loc["Nombre de consommateurs", ["Prod Max ", "Prod Min"]] = [1,1]
scenarios.loc["Nombre de producteurs", ["Prod Max ", "Prod Min"]] = [1,1]
scenarios.loc["Capacité de stockage requise [kWh]", ["Prod Max ", "Prod Min"]] = [0,0]
scenarios.loc["Prise sur le réseau [kWh/an]", ["Prod Max ", "Prod Min"]] = [sum(TOT_conso['conso UCL'])-prod_tot_max,sum(TOT_conso['conso UCL'])-prod_tot_min]
scenarios.loc["Consommation [kWh/an]", ["Prod Max ", "Prod Min"]] = [sum(CONS), sum(CONS)]
scenarios.loc["Cout d'investissement cogen", ["Prod Max ", "Prod Min"]] = [0,0]
scenarios.loc["cout d'exploitation cogen [€/an]", ["Prod Max ", "Prod Min"]] = [0,0]
scenarios.loc["Investissement stockage €", ["Prod Max ", "Prod Min"]] = [0,0]
scenarios.loc["Economie annuelles nettes", ["Prod Max ", "Prod Min"]] = [(sum(TOT_conso['conso UCL'].values))*0.28,(sum(TOT_conso['conso UCL'].values))*0.28]
# Afficher les colonnes Scenario 2, Prod Max, et Prod Min
#print(scenarios[["Scenario 2", "Prod Max ", "Prod Min"]])
scenarios[["Scenario 2", "Prod Max ", "Prod Min"]].to_excel('scenarios_variability.xlsx')
Calcule des KPIs pour les scenarios max et min
# Appliquer la fonction à tous les scénarios et stocker les résultats dans un dictionnaire
cash_flows = {scenario: calculer_cash_flow_annuel(scenario) for scenario in scenarios.columns}
scenarios_to_process = ["Scenario 2", "Prod Max ", "Prod Min"]
# Affichage des cash flows pour les scénarios spécifiques
for scenario in scenarios_to_process:
cash_flow = calculer_cash_flow_annuel(scenario)
print(f"Le cash flow annuel pour {scenario} est: {cash_flow} €")
scenarios.loc["ROI"] = (
(scenarios.loc["Economie annuelles nettes"] + scenarios.loc["Revenus annuels"] -
(scenarios.loc["Cout d'exploitation PV [€/an]"] + scenarios.loc["Cout d'exploitation eolien [€/an]"] +
scenarios.loc["Cout d'exploitation Biomasse [€/an]"] + scenarios.loc["cout d'exploitation cogen [€/an]"])) /
(scenarios.loc["Cout d'investissement PV"] + scenarios.loc["Cout d'investissement eolien"] +
scenarios.loc["Cout d'investissement Biomasse"] + scenarios.loc["Cout d'investissement cogen"])
).fillna(0)
## Calcul du ROI pour chaque Scenario
# Affichage du ROI pour les scénarios spécifiques
print("ROI pour les scénarios spécifiques:")
for scenario in scenarios_to_process:
roi = scenarios.loc["ROI", scenario]
print(f"{scenario}: ROI = {roi}")
# Calcul et tracé de la VAN cumulée pour le "Scenario 2"
plt.figure(figsize=(12, 7))
van_cumulee_scenario_2 = calculer_van_cumulee_avec_economies("Scenario 2", taux_actualisation)
plt.plot(range(len(van_cumulee_scenario_2)), van_cumulee_scenario_2, label="Scenario 2")
# Calcul et tracé des bornes de confiance pour le "Scenario 2"
van_cumulee_prod_max = calculer_van_cumulee_avec_economies("Prod Max ", taux_actualisation)
van_cumulee_prod_min = calculer_van_cumulee_avec_economies("Prod Min", taux_actualisation)
plt.fill_between(range(len(van_cumulee_scenario_2)), van_cumulee_prod_min, van_cumulee_prod_max, color='grey', alpha=0.3, label="Variabilités")
# Ajout d'une ligne horizontale à y=0 pour indiquer le point de rentabilité
plt.axhline(0, color='red', linestyle='--', linewidth=2)
# Mettre en forme le graphique
plt.title("Valeurs Actuelles Nettes Cumulées pour le Scenario 2 avec les variabilités")
plt.xlabel("Années")
plt.ylabel("Valeur Actuelle Nette Cumulée (€)")
plt.legend(title="legende")
plt.grid(True,)
plt.show()
# LCOE pour les scénarios spécifiques
print("LCOE pour le scénario 2 savec les variabilités")
for scenario in scenarios_to_process:
lcoe = calculer_lcoe_total(scenario)
print(f"{scenario}: LCOE = {lcoe:.4f} €/kWh")
# Tracé du graphique LCOE pour les scénarios spécifiques
plt.figure(figsize=(10, 6))
plt.bar(scenarios_to_process, [calculer_lcoe_total(scenario) for scenario in scenarios_to_process], color='teal')
plt.title('LCOE pour le scénario 2 avec la variabilité')
plt.xlabel('')
plt.ylabel('LCOE (€/kWh)')
plt.show()
# Définition des scénarios à traiter
scenarios_to_process = ["Scenario 2", "Prod Max ", "Prod Min"]
# Calcul des valeurs pour les KPIs
cash_flows = {scenario: calculer_cash_flow_annuel(scenario) for scenario in scenarios_to_process}
roi_values = {scenario: scenarios.loc["ROI", scenario] for scenario in scenarios_to_process}
npv_values = {scenario: calculer_van_cumulee_avec_economies(scenario, taux_actualisation)[-1] for scenario in scenarios_to_process}
lcoe_values = {scenario: calculer_lcoe_total(scenario) for scenario in scenarios_to_process}
# Création du DataFrame pour les KPIs
KPIs = pd.DataFrame({
'Cash Flow (€/an)': cash_flows,
'ROI': roi_values,
'NPV (€)': npv_values,
'LCOE (€/kWh)': lcoe_values
})
# Arrondir les valeurs pour une meilleure présentation
KPIs = KPIs.round(2)
# Transposer le DataFrame pour l'affichage
KPIs_transposed = KPIs.T
# Affichage du tableau des KPIs
fig, ax = plt.subplots(figsize=(10, 8)) # Ajustez la taille selon les besoins
ax.axis('tight')
ax.axis('off')
table = ax.table(cellText=KPIs_transposed.values, colLabels=KPIs_transposed.columns, rowLabels=KPIs_transposed.index, cellLoc='center', loc='center')
table.auto_set_font_size(False)
table.set_fontsize(12)
table.scale(1, 2) # Vous pouvez ajuster la mise à l'échelle pour un meilleur ajustement
plt.title('Tableau des KPIs pour les scénarios spécifiques', fontsize=16, pad=20)
plt.show()
print(KPIs.columns)
print("prod max : taux emission en moins = " +str((165-141)/165*100) +" %")
print("prod min : taux emission en plus = "+ str(-(165-178)/165*100) +" %")
print("prod max bilan Co2 en moins = "+str(-(-37983364+47558377)/-37983364*100)+" %")
print("prod min :bilan Co2 en plus = "+str((-37983364+34050469)/-37983364*100)+" %")
print("prod max Cash flow en plus = "+str(-(11363569-13426275 )/11363569*100)+" %")
print("prod min :Cash flow en moins = "+str((11363569-10535209)/11363569*100)+" %")