Spaces:
Sleeping
Sleeping
import json | |
import joblib | |
import pandas as pd | |
from sklearn.preprocessing import StandardScaler | |
from pickle import load | |
import numpy as np | |
class RTUPipeline: | |
scaler1 = None # RTU 1,2 | |
scaler2 = None # RTU 3,4 | |
def __init__(self, rtus=[1, 2, 3, 4], scaler1_path=None, scaler2_path=None): | |
outputs = [ | |
"sa_temp", | |
"oadmpr_pct", | |
"ra_temp", | |
"oa_temp", | |
"ma_temp", | |
"sf_vfd_spd_fbk_tn", | |
"rf_vfd_spd_fbk_tn", | |
] | |
self.output_col_names = [ | |
"hp_hws_temp", | |
] | |
for rtu in rtus: | |
for output in outputs: | |
self.output_col_names.append(f"rtu_00{rtu}_{output}") | |
self.input_col_names = [] | |
for rtu in rtus: | |
self.input_col_names.append(f"rtu_00{rtu}_sat_sp_tn") | |
self.input_col_names = self.input_col_names + [ | |
"air_temp_set_1", | |
"air_temp_set_2", | |
"dew_point_temperature_set_1d", | |
"relative_humidity_set_1", | |
"solar_radiation_set_1", | |
] | |
self.num_inputs = len(self.input_col_names) - 2 | |
self.num_outputs = len(self.output_col_names) - 14 | |
self.column_names = self.output_col_names + self.input_col_names | |
if scaler1_path: | |
self.scaler1 = self.get_scaler(scaler1_path) | |
if scaler2_path: | |
self.scaler2 = self.get_scaler(scaler2_path) | |
self.df = pd.DataFrame(columns=self.column_names) | |
def get_scaler(self, scaler_path): | |
return joblib.load(scaler_path) | |
def transform_window(self, df_window): | |
columns_scaler1 = [0] + list(range(1, 15)) + [29, 30] + list(range(33, 38)) | |
columns_scaler2 = [0] + list(range(15, 29)) + [31, 32] + list(range(33, 38)) | |
return self.scaler1.transform( | |
df_window.iloc[:, columns_scaler1].values | |
), self.scaler2.transform(df_window.iloc[:, columns_scaler2].values) | |
def prepare_input(self, df_trans): | |
return df_trans[:30, :].reshape((1, 30, len(self.column_names) - 16)) | |
def extract_data_from_message(self, df: pd.DataFrame): | |
df = df[self.column_names] | |
len_df = len(self.df) | |
if len(self.df) != 0: | |
self.df = pd.concat([self.df, df], axis=0) | |
else: | |
self.df = df | |
if len_df > 31: | |
self.df = self.df.iloc[len_df - 31 : len_df] | |
self.df.loc[len_df] = self.df.mean() | |
return self.df | |
else: | |
return None | |
def fit(self, df: pd.DataFrame): | |
df_window = self.extract_data_from_message(df) | |
if df_window is not None: | |
df_trans1, df_trans2 = self.transform_window(df_window) | |
df_new1 = self.prepare_input(df_trans1) | |
df_new2 = self.prepare_input(df_trans2) | |
else: | |
df_new1 = None | |
df_trans1 = None | |
df_new2 = None | |
df_trans2 = None | |
return df_new1, df_trans1, df_new2, df_trans2 | |