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

1import json 

2 

3import pandas as pd 

4import pint_pandas 

5from pint_pandas import PintArray 

6 

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 

12 

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} 

25 

26pint_pandas.PintType.ureg = ureg 

27unit_mapping = { 

28 "_status": ureg.dimensionless, 

29 "air_temp": ureg.degree_Celsius, 

30} 

31 

32 

33class CreateResultDF(BPSResultDF): 

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

35 

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

44 

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, 

52 

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) 

57 

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, 

64 

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

66 -> pd.DataFrame: 

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

68 

69 This function: 

70 - adds the space GUIDs to the results 

71 - selects only the selected simulation outputs from the result 

72 

73 Args: 

74 df_original: original dataframe directly taken from simulation 

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

76 

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) 

88 

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) 

94 

95 return df_final 

96