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

1import json 

2from pathlib import Path 

3 

4import pandas as pd 

5import pint_pandas 

6from geomeppy import IDF 

7from pint_pandas import PintArray 

8 

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 

14 

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} 

27 

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} 

35 

36 

37class CreateResultDF(BPSResultDF): 

38 """This ITask creates a result dataframe for EnergyPlus Comfort BEPS. 

39 

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',) 

48 

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, 

57 

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) 

62 

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, 

69 

70 def format_dataframe(self, df_original: pd.DataFrame, zone_dict: dict) \ 

71 -> pd.DataFrame: 

72 """Formats the dataframe to generic bim2sim output structure. 

73 

74 This function: 

75 - adds the space GUIDs to the results 

76 - selects only the selected simulation outputs from the result 

77 

78 Args: 

79 df_original: original dataframe directly taken from simulation 

80 zone_dict: dictionary with all zones, in format {GUID : Zone Usage} 

81 

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) 

93 

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) 

99 

100 return df_final 

101