Coverage for bim2sim/plugins/PluginComfort/bim2sim_comfort/task/create_result_df.py: 0%
36 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-12 17:09 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-03-12 17:09 +0000
1import json
3import pandas as pd
4import pint_pandas
5from pint_pandas import PintArray
7from bim2sim.plugins.PluginEnergyPlus.bim2sim_energyplus.utils import \
8 PostprocessingUtils
9from bim2sim.tasks.base import ITask
10from bim2sim.elements.mapping.units import ureg
11from bim2sim.plugins.PluginEnergyPlus.bim2sim_energyplus.task import CreateResultDF as BPSResultDF
13bim2sim_energyplus_mapping_base = {
14 "Environment:Site Outdoor Air Drybulb Temperature [C](Hourly)": "site_outdoor_air_temp",
15 "SPACEGUID:Zone Operative Temperature [C](Hourly)": "operative_air_temp_rooms",
16 "SPACEGUID:Zone Thermal Comfort CEN 15251 Adaptive Model Category I Status [](Hourly)": "cen15251_cat1_status_rooms",
17 "SPACEGUID:Zone Thermal Comfort CEN 15251 Adaptive Model Category II Status [](Hourly)": "cen15251_cat2_status_rooms",
18 "SPACEGUID:Zone Thermal Comfort CEN 15251 Adaptive Model Category III Status [](Hourly)": "cen15251_cat3_status_rooms",
19 "SPACEGUID:Zone Thermal Comfort CEN 15251 Adaptive Model Running Average Outdoor Air Temperature [C](Hourly)": "cen15251_adapt_outdoor_air_temp_rooms",
20 "SPACEGUID:Zone Thermal Comfort Fanger Model PMV [](Hourly)":
21 "fanger_pmv_rooms",
22 "SPACEGUID:Zone Thermal Comfort Fanger Model PPD [%](Hourly)":
23 "fanger_ppd_rooms",
24}
26pint_pandas.PintType.ureg = ureg
27unit_mapping = {
28 "_status": ureg.dimensionless,
29 "air_temp": ureg.degree_Celsius,
30}
33class CreateResultDF(BPSResultDF):
34 """This ITask creates a result dataframe for EnergyPlus Comfort BEPS.
36 Args:
37 idf: eppy idf
38 Returns:
39 df_final: final dataframe that holds only relevant data, with generic
40 `bim2sim` names and index in form of MM/DD-hh:mm:ss
41 """
42 reads = ('idf', 'sim_results_path', 'df_finals')
43 touches = ('df_finals',)
45 def run(self, idf, sim_results_path, df_finals):
46 # only create dataframes if plots are requested.
47 if not self.playground.sim_settings.create_plots:
48 self.logger.warning("Skipping task Comfort CreateResultDF as "
49 "sim_setting 'create_plots' is set to False and "
50 "no DataFrame ist needed.")
51 return df_finals,
53 raw_csv_path = sim_results_path / self.prj_name / 'eplusout.csv'
54 zone_dict_path = sim_results_path / self.prj_name / 'zone_dict.json'
55 with open(zone_dict_path) as j:
56 zone_dict =json.load(j)
58 df_original = PostprocessingUtils.read_csv_and_format_datetime(
59 raw_csv_path)
60 df_original = PostprocessingUtils.shift_dataframe_to_midnight(df_original)
61 df_final = self.format_dataframe(df_original, zone_dict)
62 df_finals[self.prj_name] = pd.concat([df_finals[self.prj_name], df_final], axis=1)
63 return df_finals,
65 def format_dataframe(self, df_original: pd.DataFrame, zone_dict: dict) \
66 -> pd.DataFrame:
67 """Formats the dataframe to generic bim2sim output structure.
69 This function:
70 - adds the space GUIDs to the results
71 - selects only the selected simulation outputs from the result
73 Args:
74 df_original: original dataframe directly taken from simulation
75 zone_dict: dictionary with all zones, in format {GUID : Zone Usage}
77 Returns:
78 df_final: converted dataframe in `bim2sim` result structure
79 """
80 bim2sim_energyplus_mapping = self.map_zonal_results(
81 bim2sim_energyplus_mapping_base, zone_dict)
82 # select only relevant columns
83 short_list = \
84 list(bim2sim_energyplus_mapping.keys())
85 df_final = df_original[df_original.columns[
86 df_original.columns.isin(short_list)]].rename(
87 columns=bim2sim_energyplus_mapping)
89 # handle units
90 for column in df_final:
91 for key, unit in unit_mapping.items():
92 if key in column:
93 df_final[column] = PintArray(df_final[column], unit)
95 return df_final