Controller / utilities /data_generator.py
Gen-HVAC's picture
Upload 6 files
ba7b0bc verified
import os
import numpy as np
import pandas as pd
# ==========================================
# 1.(Internal Structure)
# ==========================================
TIME_COLS = ["step", "month", "day", "hour", "minute"]
ENV_COLS = ["out_temp", "out_rh"]
GLOBAL_REWARD_COLS = ["power_kw"]
GLOBAL_COLS = TIME_COLS + ENV_COLS + GLOBAL_REWARD_COLS
ZONE_LIST = ["core", "p1", "p2", "p3", "p4"]
ZONE_STATE_TEMPLATE = ["temp", "occ", "rh"]
ZONE_ACTION_TEMPLATE = ["htg", "clg"]
def get_full_schema():
states = []
actions = []
for name in ZONE_LIST:
states += [f"{prefix}_{name}" for prefix in ZONE_STATE_TEMPLATE]
actions += [f"{prefix}_{name}" for prefix in ZONE_ACTION_TEMPLATE]
return GLOBAL_COLS + states + actions
# ==========================================
# 2. PHYSICS UTILITIES
# ==========================================
def batch_calculate_rh(temp_array: np.ndarray, dewpoint_array: np.ndarray) -> np.ndarray:
"""August-Roche-Magnus approximation for Relative Humidity."""
A, B = 17.625, 243.04
rh = 100 * np.exp((A * dewpoint_array / (B + dewpoint_array)) -
(A * temp_array / (B + temp_array)))
return np.clip(rh, 0.0, 100.0)
# ==========================================
# 3. MAIN GENERATOR FUNCTION
# ==========================================
def save_dt_training_data(df_raw: pd.DataFrame, out_dir: str, location: str):
dt_df = pd.DataFrame()
dt_df['step'] = df_raw.get('step', range(len(df_raw)))
dt_df['month'] = df_raw.get('month', 1)
dt_df['day'] = df_raw.get('day_of_month', 1)
dt_df['hour'] = df_raw.get('hour', 0)
dt_df['minute'] = (dt_df['step'] % 4) * 15
dt_df['out_temp'] = df_raw['outdoor_temp']
dt_df['out_rh'] = batch_calculate_rh(
df_raw['outdoor_temp'].values,
df_raw['outdoor_dewpoint'].values
)
dt_df['power_kw'] = df_raw['elec_power'] / 1000.0
for zone in ZONE_LIST:
s_name = "core" if zone == "core" else f"perim{zone[-1]}"
# States
dt_df[f"temp_{zone}"] = df_raw[f"{s_name}_temp"]
dt_df[f"occ_{zone}"] = df_raw[f"{s_name}_occ_count"]
dt_df[f"rh_{zone}"] = df_raw[f"{s_name}_rh"]
dt_df[f"htg_{zone}"] = df_raw.get("setpoint_htg", 21.0)
dt_df[f"clg_{zone}"] = df_raw.get("setpoint_clg", 24.0)
ALL_COLUMNS = get_full_schema()
dt_df = dt_df[ALL_COLUMNS]
os.makedirs(out_dir, exist_ok=True)
filename = f"{location}_ComfortDT_Training.csv"
save_path = os.path.join(out_dir, filename)
dt_df.to_csv(save_path, index=False)
print(f" DT Data Saved: {filename} | Shape: {dt_df.shape}")
return save_path