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