from loguru import logger
import pandas as pd
from ebm.cmd.run_calculation import calculate_building_category_area_forecast
from ebm.cmd.run_calculation import calculate_building_category_energy_requirements, calculate_heating_systems
from ebm.model.data_classes import YearRange
from ebm.model.building_category import BuildingCategory
from ebm.energy_consumption import (HEATING_RV_BASE_TOTAL, HEATING_RV_PEAK_TOTAL, BASE_LOAD_ENERGY_PRODUCT, PEAK_LOAD_ENERGY_PRODUCT,
TERTIARY_LOAD_ENERGY_PRODUCT, HEATING_RV_TERTIARY_TOTAL, COOLING_TOTAL, OTHER_TOTAL, DHW_TOTAL,
DOMESTIC_HOT_WATER_ENERGY_PRODUCT, HEAT_PUMP, HP_ENERGY_SOURCE)
ELECTRICITY = 'Elektrisitet'
DISTRICT_HEATING = 'Fjernvarme'
BIO = 'Bio'
FOSSIL = 'Fossil'
DOMESTIC_HOT_WATER = 'Tappevann'
HEATPUMP_AIR_SOURCE = 'Heat pump air-air'
HEATPUMP_WATER_SOUCE = 'Heat pump central heating'
CALIBRATION_YEAR = 2023
model_period = YearRange(2020, 2050)
start_year = model_period.start
end_year = model_period.end
[docs]
def group_heating_systems_by_energy_carrier(df: pd.DataFrame) -> pd.DataFrame:
df = df.reindex()
df = df.sort_index()
df['building_group'] = 'yrkesbygg'
try:
df.loc[('house', slice(None),slice(None),slice(None),slice(None), slice(None),), 'building_group'] = 'bolig'
except KeyError as key_error:
logger.error('Missing key when setting group bolig for house')
logger.error(key_error)
try:
df.loc[('apartment_block', slice(None),slice(None),slice(None), slice(None), slice(None),), 'building_group'] = 'bolig'
except KeyError as key_error:
logger.error('Missing key when setting group bolig for apartment_block')
logger.error(key_error)
# df.loc['apartment_block', 'building_group'] = 'bolig'
df['ALWAYS_ELECTRICITY'] = 'Electricity'
rv_gl = transform_by_energy_source(df, HEATING_RV_BASE_TOTAL, BASE_LOAD_ENERGY_PRODUCT)
rv_sl = transform_by_energy_source(df, HEATING_RV_PEAK_TOTAL, PEAK_LOAD_ENERGY_PRODUCT)
rv_el = transform_by_energy_source(df, HEATING_RV_TERTIARY_TOTAL, TERTIARY_LOAD_ENERGY_PRODUCT)
cooling = transform_by_energy_source(df, COOLING_TOTAL, 'ALWAYS_ELECTRICITY')
spesifikt_elforbruk = transform_by_energy_source(df, OTHER_TOTAL, 'ALWAYS_ELECTRICITY')
tappevann = transform_by_energy_source(df, DHW_TOTAL, DOMESTIC_HOT_WATER_ENERGY_PRODUCT)
rv_hp = transform_by_energy_source(df, HEAT_PUMP, HP_ENERGY_SOURCE)
energy_use = pd.concat([rv_gl, rv_sl, rv_el, cooling, spesifikt_elforbruk, tappevann, rv_hp])
sums = energy_use.groupby(by=['building_group', 'energy_source', 'year']).sum() / (10**6)
df = sums.reset_index()
df = df.rename(columns={'building_group': 'building_category'})
try:
df.loc[df.energy_source == 'DH', 'energy_source'] = 'Fjernvarme'
except KeyError as ex:
logger.exception(ex)
try:
df.loc[df.energy_source == 'Electricity', 'energy_source'] = 'Elektrisitet'
except KeyError as ex:
logger.exception(ex)
try:
df.loc[df.building_category == 'bolig', 'building_category'] = 'Bolig'
except KeyError as ex:
logger.exception(ex)
try:
df.loc[df.building_category == 'yrkesbygg', 'building_category'] = 'Yrkesbygg'
except KeyError as ex:
logger.exception(ex)
return df.set_index(['building_category', 'energy_source', 'year'])
def _calculate_energy_source(df, heating_type, primary_source, secondary_source=None):
if secondary_source and primary_source == secondary_source:
df.loc[(heating_type, slice(None)), primary_source] = df.loc[(heating_type, slice(None)), HEATING_RV_BASE_TOTAL] + \
df.loc[(heating_type, slice(None)), HEATING_RV_PEAK_TOTAL]
return df
df.loc[(heating_type, slice(None)), primary_source] = df.loc[(heating_type, slice(None)), HEATING_RV_BASE_TOTAL]
if secondary_source:
df.loc[(heating_type, slice(None)), secondary_source] = df.loc[
(heating_type, slice(None)), HEATING_RV_PEAK_TOTAL]
return df
[docs]
def sort_heating_systems_by_energy_source(transformed):
custom_order = [ELECTRICITY, BIO, FOSSIL, DISTRICT_HEATING]
unsorted = transformed.reset_index()
unsorted['energy_source'] = pd.Categorical(unsorted['energy_source'], categories=custom_order, ordered=True)
df_sorted = unsorted.sort_values(by=['energy_source'])
df_sorted = df_sorted.set_index([('energy_source', '')])
return df_sorted
[docs]
class DistributionOfHeatingSystems: