#region Chargement des packages
#from IPython import get_ipython;
#get_ipython().magic('reset -sf')
import os
import sys
if os.path.basename(os.getcwd())=='Prospective_conso':
sys.path.append('../../')
from functions.f_notebook import hide_toggle
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
import pandas as pd
pd.options.mode.chained_assignment = None # default='warn'
from functions.f_tools import *
from functions.f_graphicalTools import *
from Models.Prospective_conso.f_evolution_tools import *
import plotly.express as px
from mycolorpy import colorlist as mcp
import qgrid # great package https://github.com/quantopian/qgrid
import numpy as np
import time
from functools import reduce
dpe_colors = ['#009900', '#33cc33', '#B3FF00', '#e6e600', '#FFB300', '#FF4D00', '#FF0000',"#000000"]
# print(os.getcwd())
Graphic_folder = "Graphics/"
Data_folder = "data/"
# endregion
This is notebook Evolution_ResTer_Heating_2D.ipynb from Models/Prospective_conso
Vous pouvez comparer ici deux scénarios de rénovation en passant d'un fichier excel d'entrée à un autre (Scenario1 et Scenario2).
Le premier scenario présente (i) une modélisation simplifiée de l'évolution du parc (pas de construction nouvelle ni de destruction de l'ancien, pas d'évolution des mix gaz, chauffage urbain dans le temps...) et (ii) une stratégie de rénovation sous-optimale, menant à une réduction des émissions de GES de 60% uniquement à l'horizon 2050. De plus, cette stratégie implique une forte augmentation de la pointe électrique en hiver.
Le second scenario, qui fait office de corrigé, présente l'évolution du parc de bâtiment en prenant en compte:
Ce scenario permet d'atteindre 95% de réduction des emissions de GES à l'horizon 2050 avec une augmentation de la pointe électrique de seulement 1%.
N'hésitez pas à créer votre propre scenario, utilisant des hypothèses différentes pour parvenir à la décarbonation du chauffage du parc bâti français.
# Four dimensions in the dataset
dim_names = ["Energy_source", "building_type", "Vecteur", "year"];
# Two main indexes
Index_names = ["Energy_source", "building_type"];
Energy_system_name = "Energy_source"
# Reading the data
#data_set_from_excel = pd.read_excel(Data_folder + "Hypotheses_ResTer_Heating_Scenario1.xlsx", None);
data_set_from_excel = pd.read_excel(Data_folder + "Hypotheses_ResTer_Heating_Scenario2.xlsx", None);
# Extracting info from sheets and creating indexes etc
sim_param = extract_sim_param(data_set_from_excel, Index_names=Index_names, dim_names=dim_names,
Energy_system_name=Energy_system_name)
# Creating the initial building description
sim_param["init_sim_stock"] = create_initial_parc(sim_param).sort_index()
sim_param["volume_variable_name"] = "surface"
sim_param["init_sim_stock"]["surface"] = sim_param["init_sim_stock"]["surface"] * sim_param["init_sim_stock"]["IPONDL"]
# When data is not given for every numeric index (typically years), we interpolate
sim_param = interpolate_sim_param(sim_param)
sim_param["retrofit_change_surface"] = sim_param["retrofit_change_total_proportion_surface"].diff().fillna(0)
# We fill the missing parameters/indexes
Para_2_fill = {param: sim_param["base_index_year"] for param in
["retrofit_improvement", "retrofit_change_surface", "retrofit_Transition", "new_yearly_surface",
"new_energy"]}
sim_param = complete_parameters(sim_param, Para_2_fill=Para_2_fill)
final_share = (1-sim_param["old_taux_disp"].sum()) if "old_taux_disp" in sim_param else 1
sim_param["retrofit_change_surface"] = sim_param["retrofit_change_surface"] *sim_param["init_sim_stock"]["surface"]*final_share
# When data is not given for every string index (typically vecteurs), we complete
sim_param = complete_missing_indexes(data_set_from_excel, sim_param, Index_names, dim_names)
## We define some functions which will calculate at each time step the energy need, consumption, emissions...
sim_param = set_model_functions(sim_param)
# We lanch the simulation
sim_stock = launch_simulation(sim_param)
sim_stock_df = pd.concat(sim_stock, axis=0).reset_index(). \
rename(columns={"level_0": "year"}).set_index(["year", "Energy_source", "building_type", "old_new"])
warning, too much retrofit, excess of 66.7502251152036 % Computing: [########################################] 30/30
col_class_dict = {'elec': 1, 'bois': 2, 'ordures': 2, 'autres': 2, 'gaz': 3, 'fioul': 3,
'charbon': 3}
Var = "conso"
all_columns = [Var + "_" + Vec for Vec in sim_param['Vecteurs']]
y_df = sim_stock_df.loc[(2021, slice(None), slice(None))].reset_index().set_index(
['Energy_source', 'building_type', 'old_new']).filter(all_columns)
y_df = pd.melt(y_df, value_name=Var, ignore_index=False)
y_df[['v1', 'Vecteur']] = y_df['variable'].str.split('_', expand=True)
y_df = y_df.drop(['v1', 'variable'], axis=1)
y_df = y_df.reset_index().groupby(['building_type', 'Vecteur']).sum().reset_index()
# y_df = y_df.loc[y_df["year"]==2021]
y_df[Var] = y_df[Var] / 10 ** 9
color_dict = gen_grouped_color_map(col_class_dict)
y_df["class"] = [col_class_dict[cat] for cat in y_df["Vecteur"]]
y_df = y_df.sort_values(by=['class'])
locals()[Var] = y_df.copy()
fig = px.bar(y_df, x="building_type", y=Var, color="Vecteur", title="Wide-Form Input", color_discrete_map=color_dict)
fig = fig.update_layout(title_text="Consommation d'énergie finale par vecteur énergétique (en TWh)", xaxis_title="Categorie",
yaxis_title="Consommation [TWh]")
fig.show()
Var = "emissions"
all_columns = [Var + "_" + Vec for Vec in sim_param['Vecteurs']]
y_df = sim_stock_df.loc[(2021, slice(None), slice(None))].reset_index().set_index(
['Energy_source', 'building_type', 'old_new']).filter(all_columns)
y_df = pd.melt(y_df, value_name=Var, ignore_index=False)
y_df[['v1', 'Vecteur']] = y_df['variable'].str.split('_', expand=True)
y_df = y_df.drop(['v1', 'variable'], axis=1)
y_df = y_df.reset_index().groupby(['building_type', 'Vecteur']).sum().reset_index()
# y_df = y_df.loc[y_df["year"]==2021]
y_df[Var] = y_df[Var] / 10 ** 12
color_dict = gen_grouped_color_map(col_class_dict)
y_df["class"] = [col_class_dict[cat] for cat in y_df["Vecteur"]]
y_df = y_df.sort_values(by=['class'])
locals()[Var] = y_df.copy()
fig = px.bar(y_df, x="building_type", y=Var, color="Vecteur", title="Wide-Form Input", color_discrete_map=color_dict)
fig = fig.update_layout(title_text="Emissions de GES par vecteur énergétique (en MtCO2e)", xaxis_title="Categorie",
yaxis_title="Emissions [MtCO2e]")
fig.show()
#region représentations graphiques
Var = "Conso"
y_df = sim_stock_df.groupby(["year", Energy_system_name])[Var].sum().to_frame().reset_index(). \
pivot(index=['year'], columns=Energy_system_name).loc[[year for year in sim_param["years"][1:]], Var]/10**9
fig = MyStackedPlotly(y_df=y_df)
fig = fig.update_layout(title_text="Consommation d'énergie finale par mode chauffage (en TWh)", xaxis_title="Année",
yaxis_title="Conso [TWh]")
fig.show()
# #endregion
#region représentations graphiques
Var = "Conso"
y_df = sim_stock_df.groupby(["year", "old_new"])[Var].sum().to_frame().reset_index(). \
pivot(index=['year'], columns=['old_new']).loc[[year for year in sim_param["years"][1:]], Var]/10**9
fig = MyStackedPlotly(y_df=y_df)
fig = fig.update_layout(title_text="Consommation d'énergie finale par mode chauffage (en TWh)", xaxis_title="Année",
yaxis_title="Conso [TWh]")
fig.show()
# #endregion
Var = "emissions"
y_df = sim_stock_df.groupby(["year", Energy_system_name])[Var].sum().to_frame().reset_index(). \
pivot(index=['year'], columns=Energy_system_name).loc[[year for year in sim_param["years"][1:]], Var]/10**12
fig = MyStackedPlotly(y_df=y_df)
fig = fig.update_layout(title_text="Emissions de GES par mode de chauffage (en MtCO2e)", xaxis_title="Année",
yaxis_title="Emissions [MtCO2e]")
fig.show()
new_names={"conso_" + cat : cat for cat in sim_param["Vecteurs"]}
y_df = sim_stock_df.groupby(["year"])[[ 'conso_'+Vecteur for Vecteur in sim_param["Vecteurs"]]].sum().loc[[year for year in sim_param["years"][1:]],:].rename(columns=new_names)
y_df=y_df/10**9
fig = MyStackedPlotly(y_df=y_df)
fig=fig.update_layout(title_text="Consommation d'énergie finale par vecteur (en TWh)", xaxis_title="Année",yaxis_title="Conso [TWh]")
#plotly.offline.plot(fig, filename=Graphic_folder+'file.html') ## offline
fig.show()
new_names={"emissions_" + cat : cat for cat in sim_param["Vecteurs"]}
y_df = sim_stock_df.groupby(["year"])[[ 'emissions_'+Vecteur for Vecteur in sim_param["Vecteurs"]]].sum().loc[[year for year in sim_param["years"][1:]],:].rename(columns=new_names)
y_df=y_df/10**12
fig = MyStackedPlotly(y_df=y_df)
fig=fig.update_layout(title_text="Emissions par vecteur [MtCO2e]", xaxis_title="Année",yaxis_title="Emissions [MtCO2e]")
#plotly.offline.plot(fig, filename=Graphic_folder+'file.html') ## offline
fig.show()
stock_copy=sim_stock_df.copy().reset_index()
initial_stock=stock_copy[stock_copy["year"]==2020]
initial_energy_need=initial_stock["Besoin"].sum()/10**9
initial_energy_cons=initial_stock["Conso"].sum()/10**9
initial_thermosensitivity=initial_stock['electrical_peak'].sum()/10**9
initial_emissions=initial_stock["emissions"].sum()/10**12
final_stock=stock_copy[stock_copy["year"]==2050]
final_energy_need=final_stock["Besoin"].sum()/10**9
final_energy_cons=final_stock["Conso"].sum()/10**9
final_thermosensitivity=final_stock['electrical_peak'].sum()/10**9
final_emissions=final_stock["emissions"].sum()/10**12
emission_reduction=(initial_emissions-final_emissions)/initial_emissions
energy_cons_reduction=(initial_energy_cons-final_energy_cons)/initial_energy_cons
energy_need_reduction=(initial_energy_need-final_energy_need)/initial_energy_need
print("Réduction des émissions de GES: " + str(np.round(emission_reduction*100,2)) + "%")
print("Réduction de la consommation: " + str(np.round(energy_cons_reduction*100,2)) + "%")
print("Réduction du besoin: " + str(np.round(energy_need_reduction*100,2)) + "%")
print('--------------------------------------------------------')
print("Termosensibilité finale: " + str(np.round(final_thermosensitivity,2)) + "GW/°C")
T_base=-5
initial_peak=initial_thermosensitivity*(15-T_base)
final_peak=final_thermosensitivity*(15-T_base)
print("Nouveau pic électrique: " + str(np.round(final_peak,1)) +"GW")
print("Ajout de puissance lors du pic électrique: " + str(np.round(final_peak-initial_peak,1)) +"GW")
print("Evolution du pic électrique: " + str(np.round((final_peak-initial_peak)/initial_peak*100,1)) +"%")
Réduction des émissions de GES: 93.72% Réduction de la consommation: 65.07% Réduction du besoin: 34.13% -------------------------------------------------------- Termosensibilité finale: 2.2GW/°C Nouveau pic électrique: 44.0GW Ajout de puissance lors du pic électrique: 0.4GW Evolution du pic électrique: 1.0%
#region représentations graphiques
Var = "surface"
y_df = sim_stock_df.groupby(["year", "old_new"])[Var].sum().to_frame().reset_index(). \
pivot(index=['year'], columns=['old_new']).loc[[year for year in sim_param["years"][1:]], Var]/10**6
fig = MyStackedPlotly(y_df=y_df)
fig = fig.update_layout(title_text="Surface bâtie par état des bâtiments (en Mm²)", xaxis_title="Année",
yaxis_title="Surface [Mm²]")
fig.show()
# #endregion
#region représentations graphiques
Var = "surface"
y_df = sim_stock_df.groupby(["year", Energy_system_name])[Var].sum().to_frame().reset_index(). \
pivot(index=['year'], columns=Energy_system_name).loc[[year for year in sim_param["years"][1:]], Var]/10**6
fig = MyStackedPlotly(y_df=y_df)
fig = fig.update_layout(title_text="Surface bâtie selon le mode de chauffage (en Mm²)", xaxis_title="Année",
yaxis_title="Surface [Mm²]")
fig.show()
# #endregion