Spaces:
Running
Running
jerin
commited on
Commit
•
66977cd
1
Parent(s):
a3fdea5
add seperate RTU anomalizer
Browse files- mqttpublisher.ipynb +0 -0
- src/main.py +25 -14
- src/rtu/{RTUAnomalizer.py → RTUAnomalizer1.py} +14 -14
- src/rtu/RTUAnomalizer2.py +189 -0
- src/rtu/RTUPipeline.py +30 -14
- src/rtu/models/kmeans_rtu_1.pkl +3 -0
- src/rtu/models/kmeans_rtu_2.pkl +3 -0
- src/rtu/models/kmeans_rtu_3.pkl +3 -0
- src/rtu/models/kmeans_rtu_4.pkl +3 -0
- lstm.ipynb → src/rtu/models/lstm.ipynb +491 -134
- src/rtu/models/lstm_2rtu_smooth_03.keras +0 -0
- src/rtu/models/lstm_2rtu_smooth_04.keras +0 -0
- src/rtu/models/scaler_rtu_1_2.pkl +3 -0
- src/rtu/models/scaler_rtu_3_4.pkl +3 -0
mqttpublisher.ipynb
CHANGED
The diff for this file is too large to render.
See raw diff
|
|
src/main.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1 |
import json
|
2 |
-
from rtu.
|
|
|
3 |
from rtu.RTUPipeline import RTUPipeline
|
4 |
from vav.VAVPipeline import VAVPipeline
|
5 |
from vav.VAVAnomalizer import VAVAnomalizer
|
@@ -7,32 +8,42 @@ import paho.mqtt.client as mqtt
|
|
7 |
|
8 |
|
9 |
def main():
|
10 |
-
rtu_data_pipeline = RTUPipeline(
|
11 |
-
|
12 |
-
|
|
|
13 |
clustering_model_paths=[
|
14 |
-
"src/rtu/models/
|
15 |
-
"src/rtu/models/
|
16 |
-
|
17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
],
|
19 |
num_inputs=rtu_data_pipeline.num_inputs,
|
20 |
num_outputs=rtu_data_pipeline.num_outputs,
|
21 |
)
|
22 |
|
23 |
-
vav_pipeline = VAVPipeline(rtu_id=1, scaler_path="src/vav/models/scaler_vav_1.pkl")
|
24 |
|
25 |
-
vav_anomalizer = VAVAnomalizer(prediction_model_path="src/vav/models/lstm__vav_01")
|
26 |
# print(vav_pipeline.input_col_names)
|
27 |
|
28 |
# print(len(vav_pipeline.output_col_names))
|
29 |
|
30 |
def on_message(client, userdata, message):
|
31 |
# print(json.loads(message.payload.decode()))
|
32 |
-
|
33 |
-
if not
|
34 |
-
out1,out2,out3,out4 =
|
35 |
-
|
|
|
36 |
|
37 |
broker_address = "localhost"
|
38 |
broker_port = 1883
|
|
|
1 |
import json
|
2 |
+
from rtu.RTUAnomalizer1 import RTUAnomalizer1
|
3 |
+
from rtu.RTUAnomalizer2 import RTUAnomalizer2
|
4 |
from rtu.RTUPipeline import RTUPipeline
|
5 |
from vav.VAVPipeline import VAVPipeline
|
6 |
from vav.VAVAnomalizer import VAVAnomalizer
|
|
|
8 |
|
9 |
|
10 |
def main():
|
11 |
+
rtu_data_pipeline = RTUPipeline(scaler1_path="src/rtu/models/scaler_rtu_1_2.pkl",scaler2_path="src/rtu/models/scaler_rtu_3_4.pkl")
|
12 |
+
#RTU - 1, 2
|
13 |
+
rtu_anomalizer1 = RTUAnomalizer1(
|
14 |
+
prediction_model_path="src/rtu/models/lstm_2rtu_smooth_04.keras",
|
15 |
clustering_model_paths=[
|
16 |
+
"src/rtu/models/kmeans_rtu_1.pkl",
|
17 |
+
"src/rtu/models/kmeans_rtu_2.pkl",
|
18 |
+
],
|
19 |
+
num_inputs=rtu_data_pipeline.num_inputs,
|
20 |
+
num_outputs=rtu_data_pipeline.num_outputs,
|
21 |
+
)
|
22 |
+
#RTU - 3,4
|
23 |
+
rtu_anomalizer2 = RTUAnomalizer2(
|
24 |
+
prediction_model_path="src/rtu/models/lstm_2rtu_smooth_03.keras",
|
25 |
+
clustering_model_paths=[
|
26 |
+
"src/rtu/models/kmeans_rtu_3.pkl",
|
27 |
+
"src/rtu/models/kmeans_rtu_4.pkl",
|
28 |
],
|
29 |
num_inputs=rtu_data_pipeline.num_inputs,
|
30 |
num_outputs=rtu_data_pipeline.num_outputs,
|
31 |
)
|
32 |
|
33 |
+
# vav_pipeline = VAVPipeline(rtu_id=1, scaler_path="src/vav/models/scaler_vav_1.pkl")
|
34 |
|
35 |
+
# vav_anomalizer = VAVAnomalizer(prediction_model_path="src/vav/models/lstm__vav_01")
|
36 |
# print(vav_pipeline.input_col_names)
|
37 |
|
38 |
# print(len(vav_pipeline.output_col_names))
|
39 |
|
40 |
def on_message(client, userdata, message):
|
41 |
# print(json.loads(message.payload.decode()))
|
42 |
+
df_new1, df_trans1, df_new2, df_trans2 = rtu_data_pipeline.fit(message)
|
43 |
+
if not df_new1 is None and not df_trans1 is None and not df_new2 is None and not df_trans2 is None:
|
44 |
+
out1,out2,out3,out4 = rtu_anomalizer1.pipeline(df_new1, df_trans1, rtu_data_pipeline.scaler1)
|
45 |
+
out5,out6,out7,out8 = rtu_anomalizer2.pipeline(df_new2, df_trans2, rtu_data_pipeline.scaler2)
|
46 |
+
print(out2)
|
47 |
|
48 |
broker_address = "localhost"
|
49 |
broker_port = 1883
|
src/rtu/{RTUAnomalizer.py → RTUAnomalizer1.py}
RENAMED
@@ -3,7 +3,7 @@ from tensorflow.keras.models import load_model
|
|
3 |
import joblib
|
4 |
|
5 |
|
6 |
-
class
|
7 |
"""
|
8 |
Class for performing anomaly detection on RTU (Roof Top Unit) data.
|
9 |
"""
|
@@ -31,6 +31,7 @@ class RTUAnomalizer:
|
|
31 |
self.num_outputs = num_outputs
|
32 |
if prediction_model_path is not None and clustering_model_paths is not None:
|
33 |
self.load_models(prediction_model_path, clustering_model_paths)
|
|
|
34 |
|
35 |
def initialize_lists(self, size=30):
|
36 |
"""
|
@@ -42,7 +43,7 @@ class RTUAnomalizer:
|
|
42 |
Returns:
|
43 |
tuple: A tuple containing three lists initialized with zeros.
|
44 |
"""
|
45 |
-
initial_values = [0] * size
|
46 |
return initial_values.copy(), initial_values.copy(), initial_values.copy()
|
47 |
|
48 |
def load_models(self, prediction_model_path, clustering_model_paths):
|
@@ -68,7 +69,7 @@ class RTUAnomalizer:
|
|
68 |
Returns:
|
69 |
array: Predicted values.
|
70 |
"""
|
71 |
-
return self.model.predict(df_new)
|
72 |
|
73 |
def calculate_residuals(self, df_trans, pred):
|
74 |
"""
|
@@ -120,7 +121,7 @@ class RTUAnomalizer:
|
|
120 |
actual = scaler.inverse_transform(np.array([df_trans[30, :]]))
|
121 |
return actual, pred
|
122 |
|
123 |
-
def update_lists(self,
|
124 |
"""
|
125 |
Update the lists of actual, predicted, and residual values.
|
126 |
|
@@ -135,13 +136,13 @@ class RTUAnomalizer:
|
|
135 |
Returns:
|
136 |
tuple: A tuple containing the updated lists of actual, predicted, and residual values.
|
137 |
"""
|
138 |
-
actual_list.pop(0)
|
139 |
-
pred_list.pop(0)
|
140 |
-
resid_list.pop(0)
|
141 |
-
actual_list.append(actual
|
142 |
-
pred_list.append(pred
|
143 |
-
resid_list.append(resid
|
144 |
-
return actual_list, pred_list, resid_list
|
145 |
|
146 |
def calculate_distances(self, resid):
|
147 |
"""
|
@@ -177,13 +178,12 @@ class RTUAnomalizer:
|
|
177 |
Returns:
|
178 |
tuple: A tuple containing the lists of actual, predicted, and residual values, and the distances.
|
179 |
"""
|
180 |
-
|
181 |
pred = self.predict(df_new)
|
182 |
actual, resid = self.calculate_residuals(df_trans, pred)
|
183 |
pred = self.resize_prediction(pred, df_trans)
|
184 |
actual, pred = self.inverse_transform(scaler, pred, df_trans)
|
185 |
actual_list, pred_list, resid_list = self.update_lists(
|
186 |
-
|
187 |
-
)
|
188 |
dist = self.calculate_distances(resid)
|
189 |
return actual_list, pred_list, resid_list, dist
|
|
|
3 |
import joblib
|
4 |
|
5 |
|
6 |
+
class RTUAnomalizer1:
|
7 |
"""
|
8 |
Class for performing anomaly detection on RTU (Roof Top Unit) data.
|
9 |
"""
|
|
|
31 |
self.num_outputs = num_outputs
|
32 |
if prediction_model_path is not None and clustering_model_paths is not None:
|
33 |
self.load_models(prediction_model_path, clustering_model_paths)
|
34 |
+
self.actual_list, self.pred_list, self.resid_list = self.initialize_lists()
|
35 |
|
36 |
def initialize_lists(self, size=30):
|
37 |
"""
|
|
|
43 |
Returns:
|
44 |
tuple: A tuple containing three lists initialized with zeros.
|
45 |
"""
|
46 |
+
initial_values = [[0]*self.num_outputs] * size
|
47 |
return initial_values.copy(), initial_values.copy(), initial_values.copy()
|
48 |
|
49 |
def load_models(self, prediction_model_path, clustering_model_paths):
|
|
|
69 |
Returns:
|
70 |
array: Predicted values.
|
71 |
"""
|
72 |
+
return self.model.predict(df_new,verbose=0)
|
73 |
|
74 |
def calculate_residuals(self, df_trans, pred):
|
75 |
"""
|
|
|
121 |
actual = scaler.inverse_transform(np.array([df_trans[30, :]]))
|
122 |
return actual, pred
|
123 |
|
124 |
+
def update_lists(self, actual, pred, resid):
|
125 |
"""
|
126 |
Update the lists of actual, predicted, and residual values.
|
127 |
|
|
|
136 |
Returns:
|
137 |
tuple: A tuple containing the updated lists of actual, predicted, and residual values.
|
138 |
"""
|
139 |
+
self.actual_list.pop(0)
|
140 |
+
self.pred_list.pop(0)
|
141 |
+
self.resid_list.pop(0)
|
142 |
+
self.actual_list.append(actual.flatten().tolist())
|
143 |
+
self.pred_list.append(pred.flatten().tolist())
|
144 |
+
self.resid_list.append(resid.flatten().tolist())
|
145 |
+
return self.actual_list, self.pred_list, self.resid_list
|
146 |
|
147 |
def calculate_distances(self, resid):
|
148 |
"""
|
|
|
178 |
Returns:
|
179 |
tuple: A tuple containing the lists of actual, predicted, and residual values, and the distances.
|
180 |
"""
|
181 |
+
|
182 |
pred = self.predict(df_new)
|
183 |
actual, resid = self.calculate_residuals(df_trans, pred)
|
184 |
pred = self.resize_prediction(pred, df_trans)
|
185 |
actual, pred = self.inverse_transform(scaler, pred, df_trans)
|
186 |
actual_list, pred_list, resid_list = self.update_lists(
|
187 |
+
actual, pred, resid)
|
|
|
188 |
dist = self.calculate_distances(resid)
|
189 |
return actual_list, pred_list, resid_list, dist
|
src/rtu/RTUAnomalizer2.py
ADDED
@@ -0,0 +1,189 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import numpy as np
|
2 |
+
from tensorflow.keras.models import load_model
|
3 |
+
import joblib
|
4 |
+
|
5 |
+
|
6 |
+
class RTUAnomalizer2:
|
7 |
+
"""
|
8 |
+
Class for performing anomaly detection on RTU (Roof Top Unit) data.
|
9 |
+
"""
|
10 |
+
|
11 |
+
model = None
|
12 |
+
kmeans_models = []
|
13 |
+
|
14 |
+
def __init__(
|
15 |
+
self,
|
16 |
+
prediction_model_path=None,
|
17 |
+
clustering_model_paths=None,
|
18 |
+
num_inputs=None,
|
19 |
+
num_outputs=None,
|
20 |
+
):
|
21 |
+
"""
|
22 |
+
Initialize the RTUAnomalizer object.
|
23 |
+
|
24 |
+
Args:
|
25 |
+
prediction_model_path (str): Path to the prediction model file.
|
26 |
+
clustering_model_paths (list): List of paths to the clustering model files.
|
27 |
+
num_inputs (int): Number of input features.
|
28 |
+
num_outputs (int): Number of output features.
|
29 |
+
"""
|
30 |
+
self.num_inputs = num_inputs
|
31 |
+
self.num_outputs = num_outputs
|
32 |
+
if prediction_model_path is not None and clustering_model_paths is not None:
|
33 |
+
self.load_models(prediction_model_path, clustering_model_paths)
|
34 |
+
self.actual_list, self.pred_list, self.resid_list = self.initialize_lists()
|
35 |
+
|
36 |
+
def initialize_lists(self, size=30):
|
37 |
+
"""
|
38 |
+
Initialize lists for storing actual, predicted, and residual values.
|
39 |
+
|
40 |
+
Args:
|
41 |
+
size (int): Size of the lists.
|
42 |
+
|
43 |
+
Returns:
|
44 |
+
tuple: A tuple containing three lists initialized with zeros.
|
45 |
+
"""
|
46 |
+
initial_values = [[0]*self.num_outputs] * size
|
47 |
+
return initial_values.copy(), initial_values.copy(), initial_values.copy()
|
48 |
+
|
49 |
+
def load_models(self, prediction_model_path, clustering_model_paths):
|
50 |
+
"""
|
51 |
+
Load the prediction and clustering models.
|
52 |
+
|
53 |
+
Args:
|
54 |
+
prediction_model_path (str): Path to the prediction model file.
|
55 |
+
clustering_model_paths (list): List of paths to the clustering model files.
|
56 |
+
"""
|
57 |
+
self.model = load_model(prediction_model_path)
|
58 |
+
|
59 |
+
for path in clustering_model_paths:
|
60 |
+
self.kmeans_models.append(joblib.load(path))
|
61 |
+
|
62 |
+
def predict(self, df_new):
|
63 |
+
"""
|
64 |
+
Make predictions using the prediction model.
|
65 |
+
|
66 |
+
Args:
|
67 |
+
df_new (DataFrame): Input data for prediction.
|
68 |
+
|
69 |
+
Returns:
|
70 |
+
array: Predicted values.
|
71 |
+
"""
|
72 |
+
return self.model.predict(df_new,verbose=0)
|
73 |
+
|
74 |
+
def calculate_residuals(self, df_trans, pred):
|
75 |
+
"""
|
76 |
+
Calculate the residuals between actual and predicted values.
|
77 |
+
|
78 |
+
Args:
|
79 |
+
df_trans (DataFrame): Transformed input data.
|
80 |
+
pred (array): Predicted values.
|
81 |
+
|
82 |
+
Returns:
|
83 |
+
tuple: A tuple containing the actual values and residuals.
|
84 |
+
"""
|
85 |
+
actual = df_trans[30, : self.num_outputs]
|
86 |
+
resid = actual - pred
|
87 |
+
return actual, resid
|
88 |
+
|
89 |
+
def resize_prediction(self, pred, df_trans):
|
90 |
+
"""
|
91 |
+
Resize the predicted values to match the shape of the transformed input data.
|
92 |
+
|
93 |
+
Args:
|
94 |
+
pred (array): Predicted values.
|
95 |
+
df_trans (DataFrame): Transformed input data.
|
96 |
+
|
97 |
+
Returns:
|
98 |
+
array: Resized predicted values.
|
99 |
+
"""
|
100 |
+
pred = np.resize(
|
101 |
+
pred, (pred.shape[0], pred.shape[1] + len(df_trans[30, self.num_outputs :]))
|
102 |
+
)
|
103 |
+
pred[:, -len(df_trans[30, self.num_outputs :]) :] = df_trans[
|
104 |
+
30, self.num_outputs :
|
105 |
+
]
|
106 |
+
return pred
|
107 |
+
|
108 |
+
def inverse_transform(self, scaler, pred, df_trans):
|
109 |
+
"""
|
110 |
+
Inverse transform the predicted and actual values.
|
111 |
+
|
112 |
+
Args:
|
113 |
+
scaler (object): Scaler object for inverse transformation.
|
114 |
+
pred (array): Predicted values.
|
115 |
+
df_trans (DataFrame): Transformed input data.
|
116 |
+
|
117 |
+
Returns:
|
118 |
+
tuple: A tuple containing the actual and predicted values after inverse transformation.
|
119 |
+
"""
|
120 |
+
pred = scaler.inverse_transform(np.array(pred))
|
121 |
+
actual = scaler.inverse_transform(np.array([df_trans[30, :]]))
|
122 |
+
return actual, pred
|
123 |
+
|
124 |
+
def update_lists(self, actual, pred, resid):
|
125 |
+
"""
|
126 |
+
Update the lists of actual, predicted, and residual values.
|
127 |
+
|
128 |
+
Args:
|
129 |
+
actual_list (list): List of actual values.
|
130 |
+
pred_list (list): List of predicted values.
|
131 |
+
resid_list (list): List of residual values.
|
132 |
+
actual (array): Actual values.
|
133 |
+
pred (array): Predicted values.
|
134 |
+
resid (array): Residual values.
|
135 |
+
|
136 |
+
Returns:
|
137 |
+
tuple: A tuple containing the updated lists of actual, predicted, and residual values.
|
138 |
+
"""
|
139 |
+
self.actual_list.pop(0)
|
140 |
+
self.pred_list.pop(0)
|
141 |
+
self.resid_list.pop(0)
|
142 |
+
self.actual_list.append(actual.flatten().tolist())
|
143 |
+
self.pred_list.append(pred.flatten().tolist())
|
144 |
+
self.resid_list.append(resid.flatten().tolist())
|
145 |
+
return self.actual_list, self.pred_list, self.resid_list
|
146 |
+
|
147 |
+
def calculate_distances(self, resid):
|
148 |
+
"""
|
149 |
+
Calculate the distances between residuals and cluster centers.
|
150 |
+
|
151 |
+
Args:
|
152 |
+
resid (array): Residual values.
|
153 |
+
|
154 |
+
Returns:
|
155 |
+
array: Array of distances.
|
156 |
+
"""
|
157 |
+
dist = []
|
158 |
+
for i, model in enumerate(self.kmeans_models):
|
159 |
+
dist.append(
|
160 |
+
np.linalg.norm(
|
161 |
+
resid[:, (i * 7) + 1 : (i * 7) + 8] - model.cluster_centers_[0],
|
162 |
+
ord=2,
|
163 |
+
axis=1,
|
164 |
+
)
|
165 |
+
)
|
166 |
+
|
167 |
+
return np.array(dist)
|
168 |
+
|
169 |
+
def pipeline(self, df_new, df_trans, scaler):
|
170 |
+
"""
|
171 |
+
Perform the anomaly detection pipeline.
|
172 |
+
|
173 |
+
Args:
|
174 |
+
df_new (DataFrame): Input data for prediction.
|
175 |
+
df_trans (DataFrame): Transformed input data.
|
176 |
+
scaler (object): Scaler object for inverse transformation.
|
177 |
+
|
178 |
+
Returns:
|
179 |
+
tuple: A tuple containing the lists of actual, predicted, and residual values, and the distances.
|
180 |
+
"""
|
181 |
+
|
182 |
+
pred = self.predict(df_new)
|
183 |
+
actual, resid = self.calculate_residuals(df_trans, pred)
|
184 |
+
pred = self.resize_prediction(pred, df_trans)
|
185 |
+
actual, pred = self.inverse_transform(scaler, pred, df_trans)
|
186 |
+
actual_list, pred_list, resid_list = self.update_lists(
|
187 |
+
actual, pred, resid)
|
188 |
+
dist = self.calculate_distances(resid)
|
189 |
+
return actual_list, pred_list, resid_list, dist
|
src/rtu/RTUPipeline.py
CHANGED
@@ -7,9 +7,10 @@ import numpy as np
|
|
7 |
|
8 |
|
9 |
class RTUPipeline:
|
10 |
-
|
|
|
11 |
|
12 |
-
def __init__(self, rtus=[1, 2],
|
13 |
|
14 |
outputs = [
|
15 |
"sa_temp",
|
@@ -27,20 +28,28 @@ class RTUPipeline:
|
|
27 |
for rtu in rtus:
|
28 |
for output in outputs:
|
29 |
self.output_col_names.append(f"rtu_00{rtu}_{output}")
|
|
|
|
|
|
|
|
|
|
|
30 |
|
31 |
-
self.input_col_names = [
|
32 |
"air_temp_set_1",
|
33 |
"air_temp_set_2",
|
34 |
"dew_point_temperature_set_1d",
|
35 |
"relative_humidity_set_1",
|
36 |
"solar_radiation_set_1",
|
37 |
]
|
38 |
-
self.num_inputs = len(self.input_col_names)
|
39 |
-
self.num_outputs = len(self.output_col_names)
|
40 |
self.column_names = self.output_col_names + self.input_col_names
|
41 |
|
42 |
-
if
|
43 |
-
self.
|
|
|
|
|
|
|
44 |
self.df = pd.DataFrame(columns=self.column_names)
|
45 |
|
46 |
def get_scaler(self, scaler_path):
|
@@ -48,16 +57,20 @@ class RTUPipeline:
|
|
48 |
|
49 |
def get_window(self, df):
|
50 |
len_df = len(df)
|
|
|
51 |
if len_df > 30:
|
|
|
52 |
return df[len_df - 31 : len_df].astype("float32")
|
53 |
else:
|
54 |
return None
|
55 |
|
56 |
def transform_window(self, df_window):
|
57 |
-
|
|
|
|
|
58 |
|
59 |
def prepare_input(self, df_trans):
|
60 |
-
return df_trans[:30, :].reshape((1, 30, len(self.column_names)))
|
61 |
|
62 |
def extract_data_from_message(self, message):
|
63 |
payload = json.loads(message.payload.decode())
|
@@ -74,9 +87,12 @@ class RTUPipeline:
|
|
74 |
df = self.extract_data_from_message(message)
|
75 |
df_window = self.get_window(df)
|
76 |
if df_window is not None:
|
77 |
-
|
78 |
-
|
|
|
79 |
else:
|
80 |
-
|
81 |
-
|
82 |
-
|
|
|
|
|
|
7 |
|
8 |
|
9 |
class RTUPipeline:
|
10 |
+
scaler1 = None # RTU 1,2
|
11 |
+
scaler2 = None # RTU 3,4
|
12 |
|
13 |
+
def __init__(self, rtus=[1, 2, 3, 4], scaler1_path=None,scaler2_path=None):
|
14 |
|
15 |
outputs = [
|
16 |
"sa_temp",
|
|
|
28 |
for rtu in rtus:
|
29 |
for output in outputs:
|
30 |
self.output_col_names.append(f"rtu_00{rtu}_{output}")
|
31 |
+
|
32 |
+
self.input_col_names = []
|
33 |
+
|
34 |
+
for rtu in rtus:
|
35 |
+
self.input_col_names.append(f"rtu_00{rtu}_sat_sp_tn")
|
36 |
|
37 |
+
self.input_col_names = self.input_col_names + [
|
38 |
"air_temp_set_1",
|
39 |
"air_temp_set_2",
|
40 |
"dew_point_temperature_set_1d",
|
41 |
"relative_humidity_set_1",
|
42 |
"solar_radiation_set_1",
|
43 |
]
|
44 |
+
self.num_inputs = len(self.input_col_names)-2
|
45 |
+
self.num_outputs = len(self.output_col_names)-14
|
46 |
self.column_names = self.output_col_names + self.input_col_names
|
47 |
|
48 |
+
if scaler1_path:
|
49 |
+
self.scaler1 = self.get_scaler(scaler1_path)
|
50 |
+
if scaler2_path:
|
51 |
+
self.scaler2 = self.get_scaler(scaler2_path)
|
52 |
+
|
53 |
self.df = pd.DataFrame(columns=self.column_names)
|
54 |
|
55 |
def get_scaler(self, scaler_path):
|
|
|
57 |
|
58 |
def get_window(self, df):
|
59 |
len_df = len(df)
|
60 |
+
print(len_df)
|
61 |
if len_df > 30:
|
62 |
+
df = df.rolling(window=30,min_periods=1).mean()
|
63 |
return df[len_df - 31 : len_df].astype("float32")
|
64 |
else:
|
65 |
return None
|
66 |
|
67 |
def transform_window(self, df_window):
|
68 |
+
columns_scaler1 = [0] + list(range(1,15)) + [29,30] + list(range(33, 38))
|
69 |
+
columns_scaler2 = [0] + list(range(15, 29)) + [31,32] + list(range(33, 38))
|
70 |
+
return self.scaler1.transform(df_window.iloc[:, columns_scaler1]),self.scaler2.transform(df_window.iloc[:, columns_scaler2])
|
71 |
|
72 |
def prepare_input(self, df_trans):
|
73 |
+
return df_trans[:30, :].reshape((1, 30, len(self.column_names)-16))
|
74 |
|
75 |
def extract_data_from_message(self, message):
|
76 |
payload = json.loads(message.payload.decode())
|
|
|
87 |
df = self.extract_data_from_message(message)
|
88 |
df_window = self.get_window(df)
|
89 |
if df_window is not None:
|
90 |
+
df_trans1,df_trans2 = self.transform_window(df_window)
|
91 |
+
df_new1 = self.prepare_input(df_trans1)
|
92 |
+
df_new2 = self.prepare_input(df_trans2)
|
93 |
else:
|
94 |
+
df_new1 = None
|
95 |
+
df_trans1 = None
|
96 |
+
df_new2 = None
|
97 |
+
df_trans2 = None
|
98 |
+
return df_new1, df_trans1, df_new2, df_trans2
|
src/rtu/models/kmeans_rtu_1.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:42621b20e5f4048526e82615e92de0031ba42c540fbaba637efe0b4506f13ff4
|
3 |
+
size 2065925
|
src/rtu/models/kmeans_rtu_2.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:e1c07513633ff899c5b1fa46bdf750420ee95593282f79bc4564db06c2dfb601
|
3 |
+
size 2065925
|
src/rtu/models/kmeans_rtu_3.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:31d6d81362dde61976f0617e51239a67c6962c1ea84f6c301970bafdb8406146
|
3 |
+
size 2065881
|
src/rtu/models/kmeans_rtu_4.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:72a5a1799b4546825815d9833598bcce7fb3241f9c15a3c03c3d0c28e5010b33
|
3 |
+
size 2065881
|
lstm.ipynb → src/rtu/models/lstm.ipynb
RENAMED
@@ -2,7 +2,7 @@
|
|
2 |
"cells": [
|
3 |
{
|
4 |
"cell_type": "code",
|
5 |
-
"execution_count":
|
6 |
"metadata": {},
|
7 |
"outputs": [],
|
8 |
"source": [
|
@@ -22,7 +22,7 @@
|
|
22 |
},
|
23 |
{
|
24 |
"cell_type": "code",
|
25 |
-
"execution_count":
|
26 |
"metadata": {},
|
27 |
"outputs": [
|
28 |
{
|
@@ -434,7 +434,7 @@
|
|
434 |
"[2072154 rows x 30 columns]"
|
435 |
]
|
436 |
},
|
437 |
-
"execution_count":
|
438 |
"metadata": {},
|
439 |
"output_type": "execute_result"
|
440 |
}
|
@@ -1135,7 +1135,7 @@
|
|
1135 |
},
|
1136 |
{
|
1137 |
"cell_type": "code",
|
1138 |
-
"execution_count":
|
1139 |
"metadata": {},
|
1140 |
"outputs": [
|
1141 |
{
|
@@ -1272,7 +1272,7 @@
|
|
1272 |
"[2 rows x 65 columns]"
|
1273 |
]
|
1274 |
},
|
1275 |
-
"execution_count":
|
1276 |
"metadata": {},
|
1277 |
"output_type": "execute_result"
|
1278 |
}
|
@@ -1294,7 +1294,7 @@
|
|
1294 |
},
|
1295 |
{
|
1296 |
"cell_type": "code",
|
1297 |
-
"execution_count":
|
1298 |
"metadata": {},
|
1299 |
"outputs": [
|
1300 |
{
|
@@ -1335,7 +1335,7 @@
|
|
1335 |
},
|
1336 |
{
|
1337 |
"cell_type": "code",
|
1338 |
-
"execution_count":
|
1339 |
"metadata": {},
|
1340 |
"outputs": [],
|
1341 |
"source": [
|
@@ -1354,20 +1354,20 @@
|
|
1354 |
"# 'solar_radiation_set_1']]\n",
|
1355 |
"\n",
|
1356 |
"df_filtered = df_filtered.loc[:,['date','hp_hws_temp',\n",
|
1357 |
-
"
|
1358 |
-
"
|
1359 |
-
"
|
1360 |
-
"
|
1361 |
-
"
|
1362 |
-
"
|
1363 |
-
"
|
1364 |
-
"
|
1365 |
-
"
|
1366 |
-
"
|
1367 |
-
"
|
1368 |
-
"
|
1369 |
-
"
|
1370 |
-
"
|
1371 |
" 'rtu_001_sa_temp',\n",
|
1372 |
" 'rtu_001_oadmpr_pct',\n",
|
1373 |
" 'rtu_001_ra_temp',\n",
|
@@ -1375,6 +1375,7 @@
|
|
1375 |
" 'rtu_001_ma_temp',\n",
|
1376 |
" 'rtu_001_sf_vfd_spd_fbk_tn',\n",
|
1377 |
" 'rtu_001_rf_vfd_spd_fbk_tn',\n",
|
|
|
1378 |
" 'rtu_002_sa_temp',\n",
|
1379 |
" 'rtu_002_oadmpr_pct',\n",
|
1380 |
" 'rtu_002_ra_temp',\n",
|
@@ -1382,8 +1383,9 @@
|
|
1382 |
" 'rtu_002_ma_temp',\n",
|
1383 |
" 'rtu_002_sf_vfd_spd_fbk_tn',\n",
|
1384 |
" 'rtu_002_rf_vfd_spd_fbk_tn',\n",
|
1385 |
-
"
|
1386 |
-
"
|
|
|
1387 |
" 'rtu_001_sat_sp_tn',\n",
|
1388 |
" 'rtu_002_sat_sp_tn',\n",
|
1389 |
" 'air_temp_set_1',\n",
|
@@ -1395,7 +1397,17 @@
|
|
1395 |
},
|
1396 |
{
|
1397 |
"cell_type": "code",
|
1398 |
-
"execution_count":
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1399 |
"metadata": {},
|
1400 |
"outputs": [
|
1401 |
{
|
@@ -1435,7 +1447,7 @@
|
|
1435 |
},
|
1436 |
{
|
1437 |
"cell_type": "code",
|
1438 |
-
"execution_count":
|
1439 |
"metadata": {},
|
1440 |
"outputs": [
|
1441 |
{
|
@@ -1459,64 +1471,31 @@
|
|
1459 |
},
|
1460 |
{
|
1461 |
"cell_type": "code",
|
1462 |
-
"execution_count":
|
1463 |
"metadata": {},
|
1464 |
"outputs": [
|
1465 |
{
|
1466 |
"data": {
|
1467 |
"text/plain": [
|
1468 |
-
"['
|
1469 |
]
|
1470 |
},
|
1471 |
-
"execution_count":
|
1472 |
"metadata": {},
|
1473 |
"output_type": "execute_result"
|
1474 |
}
|
1475 |
],
|
1476 |
"source": [
|
1477 |
"import joblib\n",
|
1478 |
-
"
|
1479 |
"# loaded_scaler = joblib.load('scaler.pkl')"
|
1480 |
]
|
1481 |
},
|
1482 |
{
|
1483 |
"cell_type": "code",
|
1484 |
-
"execution_count":
|
1485 |
"metadata": {},
|
1486 |
-
"outputs": [
|
1487 |
-
{
|
1488 |
-
"name": "stderr",
|
1489 |
-
"output_type": "stream",
|
1490 |
-
"text": [
|
1491 |
-
"c:\\Users\\jerin\\anaconda3\\envs\\smartbuilding\\Lib\\site-packages\\keras\\src\\layers\\rnn\\rnn.py:205: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.\n",
|
1492 |
-
" super().__init__(**kwargs)\n"
|
1493 |
-
]
|
1494 |
-
},
|
1495 |
-
{
|
1496 |
-
"name": "stdout",
|
1497 |
-
"output_type": "stream",
|
1498 |
-
"text": [
|
1499 |
-
"Epoch 1/2\n",
|
1500 |
-
"\u001b[1m8066/8067\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m━\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - loss: 0.0548\n",
|
1501 |
-
"Epoch 1: val_loss improved from inf to 0.34488, saving model to lstm_2rtu_smooth_04.keras\n",
|
1502 |
-
"\u001b[1m8067/8067\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m165s\u001b[0m 20ms/step - loss: 0.0548 - val_loss: 0.3449\n",
|
1503 |
-
"Epoch 2/2\n",
|
1504 |
-
"\u001b[1m8067/8067\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - loss: 0.0014\n",
|
1505 |
-
"Epoch 2: val_loss improved from 0.34488 to 0.27523, saving model to lstm_2rtu_smooth_04.keras\n",
|
1506 |
-
"\u001b[1m8067/8067\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m160s\u001b[0m 20ms/step - loss: 0.0014 - val_loss: 0.2752\n"
|
1507 |
-
]
|
1508 |
-
},
|
1509 |
-
{
|
1510 |
-
"data": {
|
1511 |
-
"text/plain": [
|
1512 |
-
"<keras.src.callbacks.history.History at 0x207bef58850>"
|
1513 |
-
]
|
1514 |
-
},
|
1515 |
-
"execution_count": 115,
|
1516 |
-
"metadata": {},
|
1517 |
-
"output_type": "execute_result"
|
1518 |
-
}
|
1519 |
-
],
|
1520 |
"source": [
|
1521 |
"#2 rtu model\n",
|
1522 |
"\n",
|
@@ -1543,17 +1522,17 @@
|
|
1543 |
"X_test, y_test = create_dataset(test, time_step)\n",
|
1544 |
"\n",
|
1545 |
"\n",
|
1546 |
-
"model = Sequential()\n",
|
1547 |
-
"model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))\n",
|
1548 |
-
"model.add(LSTM(units=50, return_sequences=True))\n",
|
1549 |
-
"model.add(LSTM(units=30))\n",
|
1550 |
-
"model.add(Dense(units=15))\n",
|
1551 |
"\n",
|
1552 |
-
"model.compile(optimizer='adam', loss='mean_squared_error')\n",
|
1553 |
"\n",
|
1554 |
-
"checkpoint_path = \"lstm_2rtu_smooth_04.keras\" #\"lstm_2rtu_smooth_03.keras\"--> 3,4rtu\n",
|
1555 |
-
"checkpoint_callback = ModelCheckpoint(filepath=checkpoint_path, monitor='val_loss', verbose=1, save_best_only=True, mode='min')\n",
|
1556 |
-
"model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=2, batch_size=64, verbose=1, callbacks=[checkpoint_callback])"
|
1557 |
]
|
1558 |
},
|
1559 |
{
|
@@ -1697,7 +1676,7 @@
|
|
1697 |
},
|
1698 |
{
|
1699 |
"cell_type": "code",
|
1700 |
-
"execution_count":
|
1701 |
"metadata": {},
|
1702 |
"outputs": [],
|
1703 |
"source": [
|
@@ -1715,15 +1694,15 @@
|
|
1715 |
},
|
1716 |
{
|
1717 |
"cell_type": "code",
|
1718 |
-
"execution_count":
|
1719 |
"metadata": {},
|
1720 |
"outputs": [
|
1721 |
{
|
1722 |
"name": "stdout",
|
1723 |
"output_type": "stream",
|
1724 |
"text": [
|
1725 |
-
"\u001b[1m19190/19190\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[
|
1726 |
-
"\u001b[1m16134/16134\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[
|
1727 |
]
|
1728 |
}
|
1729 |
],
|
@@ -1809,16 +1788,425 @@
|
|
1809 |
},
|
1810 |
{
|
1811 |
"cell_type": "code",
|
1812 |
-
"execution_count":
|
1813 |
"metadata": {},
|
1814 |
"outputs": [
|
1815 |
{
|
1816 |
-
"
|
1817 |
-
|
1818 |
-
|
1819 |
-
|
1820 |
-
|
1821 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1822 |
}
|
1823 |
],
|
1824 |
"source": [
|
@@ -1846,44 +2234,45 @@
|
|
1846 |
"\n",
|
1847 |
"\n",
|
1848 |
"\n",
|
1849 |
-
"pca = PCA(n_components=2)\n",
|
1850 |
-
"X = pca.fit_transform(X1)\n",
|
1851 |
"\n",
|
1852 |
"\n",
|
1853 |
"\n",
|
1854 |
"\n",
|
1855 |
-
"# # Getting the cluster centers and labels\n",
|
1856 |
-
"centroids = pca.transform(kmeans1.cluster_centers_)\n",
|
1857 |
-
"labels = kmeans1.labels_\n",
|
1858 |
-
"print(kmeans1.cluster_centers_)\n",
|
1859 |
-
"# Plotting the data points and cluster centers\n",
|
1860 |
-
"plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.5)\n",
|
1861 |
-
"plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', c='red', s=200, linewidths=2)\n",
|
1862 |
-
"plt.title('KMeans Clustering')\n",
|
1863 |
-
"plt.xlabel('Feature 1')\n",
|
1864 |
-
"plt.ylabel('Feature 2')\n",
|
1865 |
-
"plt.show()\n"
|
1866 |
]
|
1867 |
},
|
1868 |
{
|
1869 |
"cell_type": "code",
|
1870 |
-
"execution_count":
|
1871 |
"metadata": {},
|
1872 |
"outputs": [
|
1873 |
{
|
1874 |
"data": {
|
1875 |
"text/plain": [
|
1876 |
-
"['
|
1877 |
]
|
1878 |
},
|
1879 |
-
"execution_count":
|
1880 |
"metadata": {},
|
1881 |
"output_type": "execute_result"
|
1882 |
}
|
1883 |
],
|
1884 |
"source": [
|
1885 |
"import joblib\n",
|
1886 |
-
"
|
|
|
1887 |
"# joblib.dump(pca, 'pca_model.pkl')\n"
|
1888 |
]
|
1889 |
},
|
@@ -1915,7 +2304,7 @@
|
|
1915 |
},
|
1916 |
{
|
1917 |
"cell_type": "code",
|
1918 |
-
"execution_count":
|
1919 |
"metadata": {},
|
1920 |
"outputs": [],
|
1921 |
"source": [
|
@@ -2169,38 +2558,6 @@
|
|
2169 |
"# plt.plot(df_filtered['date'],df_filtered['hp_hws_temp'])"
|
2170 |
]
|
2171 |
},
|
2172 |
-
{
|
2173 |
-
"cell_type": "code",
|
2174 |
-
"execution_count": null,
|
2175 |
-
"metadata": {},
|
2176 |
-
"outputs": [],
|
2177 |
-
"source": []
|
2178 |
-
},
|
2179 |
-
{
|
2180 |
-
"cell_type": "code",
|
2181 |
-
"execution_count": 234,
|
2182 |
-
"metadata": {},
|
2183 |
-
"outputs": [
|
2184 |
-
{
|
2185 |
-
"data": {
|
2186 |
-
"text/plain": [
|
2187 |
-
"False"
|
2188 |
-
]
|
2189 |
-
},
|
2190 |
-
"execution_count": 234,
|
2191 |
-
"metadata": {},
|
2192 |
-
"output_type": "execute_result"
|
2193 |
-
}
|
2194 |
-
],
|
2195 |
-
"source": []
|
2196 |
-
},
|
2197 |
-
{
|
2198 |
-
"cell_type": "code",
|
2199 |
-
"execution_count": null,
|
2200 |
-
"metadata": {},
|
2201 |
-
"outputs": [],
|
2202 |
-
"source": []
|
2203 |
-
},
|
2204 |
{
|
2205 |
"cell_type": "code",
|
2206 |
"execution_count": null,
|
|
|
2 |
"cells": [
|
3 |
{
|
4 |
"cell_type": "code",
|
5 |
+
"execution_count": 3,
|
6 |
"metadata": {},
|
7 |
"outputs": [],
|
8 |
"source": [
|
|
|
22 |
},
|
23 |
{
|
24 |
"cell_type": "code",
|
25 |
+
"execution_count": 4,
|
26 |
"metadata": {},
|
27 |
"outputs": [
|
28 |
{
|
|
|
434 |
"[2072154 rows x 30 columns]"
|
435 |
]
|
436 |
},
|
437 |
+
"execution_count": 4,
|
438 |
"metadata": {},
|
439 |
"output_type": "execute_result"
|
440 |
}
|
|
|
1135 |
},
|
1136 |
{
|
1137 |
"cell_type": "code",
|
1138 |
+
"execution_count": 5,
|
1139 |
"metadata": {},
|
1140 |
"outputs": [
|
1141 |
{
|
|
|
1272 |
"[2 rows x 65 columns]"
|
1273 |
]
|
1274 |
},
|
1275 |
+
"execution_count": 5,
|
1276 |
"metadata": {},
|
1277 |
"output_type": "execute_result"
|
1278 |
}
|
|
|
1294 |
},
|
1295 |
{
|
1296 |
"cell_type": "code",
|
1297 |
+
"execution_count": 6,
|
1298 |
"metadata": {},
|
1299 |
"outputs": [
|
1300 |
{
|
|
|
1335 |
},
|
1336 |
{
|
1337 |
"cell_type": "code",
|
1338 |
+
"execution_count": 7,
|
1339 |
"metadata": {},
|
1340 |
"outputs": [],
|
1341 |
"source": [
|
|
|
1354 |
"# 'solar_radiation_set_1']]\n",
|
1355 |
"\n",
|
1356 |
"df_filtered = df_filtered.loc[:,['date','hp_hws_temp',\n",
|
1357 |
+
" 'rtu_003_sa_temp',\n",
|
1358 |
+
" 'rtu_003_oadmpr_pct',\n",
|
1359 |
+
" 'rtu_003_ra_temp',\n",
|
1360 |
+
" 'rtu_003_oa_temp',\n",
|
1361 |
+
" 'rtu_003_ma_temp',\n",
|
1362 |
+
" 'rtu_003_sf_vfd_spd_fbk_tn',\n",
|
1363 |
+
" 'rtu_003_rf_vfd_spd_fbk_tn',\n",
|
1364 |
+
" 'rtu_004_sa_temp',\n",
|
1365 |
+
" 'rtu_004_oadmpr_pct',\n",
|
1366 |
+
" 'rtu_004_ra_temp',\n",
|
1367 |
+
" 'rtu_004_oa_temp',\n",
|
1368 |
+
" 'rtu_004_ma_temp',\n",
|
1369 |
+
" 'rtu_004_sf_vfd_spd_fbk_tn',\n",
|
1370 |
+
" 'rtu_004_rf_vfd_spd_fbk_tn',\n",
|
1371 |
" 'rtu_001_sa_temp',\n",
|
1372 |
" 'rtu_001_oadmpr_pct',\n",
|
1373 |
" 'rtu_001_ra_temp',\n",
|
|
|
1375 |
" 'rtu_001_ma_temp',\n",
|
1376 |
" 'rtu_001_sf_vfd_spd_fbk_tn',\n",
|
1377 |
" 'rtu_001_rf_vfd_spd_fbk_tn',\n",
|
1378 |
+
" \n",
|
1379 |
" 'rtu_002_sa_temp',\n",
|
1380 |
" 'rtu_002_oadmpr_pct',\n",
|
1381 |
" 'rtu_002_ra_temp',\n",
|
|
|
1383 |
" 'rtu_002_ma_temp',\n",
|
1384 |
" 'rtu_002_sf_vfd_spd_fbk_tn',\n",
|
1385 |
" 'rtu_002_rf_vfd_spd_fbk_tn',\n",
|
1386 |
+
" \n",
|
1387 |
+
" 'rtu_003_sat_sp_tn',\n",
|
1388 |
+
" 'rtu_004_sat_sp_tn',\n",
|
1389 |
" 'rtu_001_sat_sp_tn',\n",
|
1390 |
" 'rtu_002_sat_sp_tn',\n",
|
1391 |
" 'air_temp_set_1',\n",
|
|
|
1397 |
},
|
1398 |
{
|
1399 |
"cell_type": "code",
|
1400 |
+
"execution_count": 8,
|
1401 |
+
"metadata": {},
|
1402 |
+
"outputs": [],
|
1403 |
+
"source": [
|
1404 |
+
"df_filtered = df_filtered.dropna()\n",
|
1405 |
+
"df_filtered.to_csv(\"sample_test_data.csv\",index=False)"
|
1406 |
+
]
|
1407 |
+
},
|
1408 |
+
{
|
1409 |
+
"cell_type": "code",
|
1410 |
+
"execution_count": 20,
|
1411 |
"metadata": {},
|
1412 |
"outputs": [
|
1413 |
{
|
|
|
1447 |
},
|
1448 |
{
|
1449 |
"cell_type": "code",
|
1450 |
+
"execution_count": 21,
|
1451 |
"metadata": {},
|
1452 |
"outputs": [
|
1453 |
{
|
|
|
1471 |
},
|
1472 |
{
|
1473 |
"cell_type": "code",
|
1474 |
+
"execution_count": 22,
|
1475 |
"metadata": {},
|
1476 |
"outputs": [
|
1477 |
{
|
1478 |
"data": {
|
1479 |
"text/plain": [
|
1480 |
+
"['scaler_rtu_3_4.pkl']"
|
1481 |
]
|
1482 |
},
|
1483 |
+
"execution_count": 22,
|
1484 |
"metadata": {},
|
1485 |
"output_type": "execute_result"
|
1486 |
}
|
1487 |
],
|
1488 |
"source": [
|
1489 |
"import joblib\n",
|
1490 |
+
"joblib.dump(scaler, 'scaler_rtu_3_4.pkl')\n",
|
1491 |
"# loaded_scaler = joblib.load('scaler.pkl')"
|
1492 |
]
|
1493 |
},
|
1494 |
{
|
1495 |
"cell_type": "code",
|
1496 |
+
"execution_count": 23,
|
1497 |
"metadata": {},
|
1498 |
+
"outputs": [],
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1499 |
"source": [
|
1500 |
"#2 rtu model\n",
|
1501 |
"\n",
|
|
|
1522 |
"X_test, y_test = create_dataset(test, time_step)\n",
|
1523 |
"\n",
|
1524 |
"\n",
|
1525 |
+
"# model = Sequential()\n",
|
1526 |
+
"# model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))\n",
|
1527 |
+
"# model.add(LSTM(units=50, return_sequences=True))\n",
|
1528 |
+
"# model.add(LSTM(units=30))\n",
|
1529 |
+
"# model.add(Dense(units=15))\n",
|
1530 |
"\n",
|
1531 |
+
"# model.compile(optimizer='adam', loss='mean_squared_error')\n",
|
1532 |
"\n",
|
1533 |
+
"# checkpoint_path = \"lstm_2rtu_smooth_04.keras\" #\"lstm_2rtu_smooth_03.keras\"--> 3,4rtu\n",
|
1534 |
+
"# checkpoint_callback = ModelCheckpoint(filepath=checkpoint_path, monitor='val_loss', verbose=1, save_best_only=True, mode='min')\n",
|
1535 |
+
"# model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=2, batch_size=64, verbose=1, callbacks=[checkpoint_callback])"
|
1536 |
]
|
1537 |
},
|
1538 |
{
|
|
|
1676 |
},
|
1677 |
{
|
1678 |
"cell_type": "code",
|
1679 |
+
"execution_count": 24,
|
1680 |
"metadata": {},
|
1681 |
"outputs": [],
|
1682 |
"source": [
|
|
|
1694 |
},
|
1695 |
{
|
1696 |
"cell_type": "code",
|
1697 |
+
"execution_count": 25,
|
1698 |
"metadata": {},
|
1699 |
"outputs": [
|
1700 |
{
|
1701 |
"name": "stdout",
|
1702 |
"output_type": "stream",
|
1703 |
"text": [
|
1704 |
+
"\u001b[1m19190/19190\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m83s\u001b[0m 4ms/step\n",
|
1705 |
+
"\u001b[1m16134/16134\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m58s\u001b[0m 4ms/step\n"
|
1706 |
]
|
1707 |
}
|
1708 |
],
|
|
|
1788 |
},
|
1789 |
{
|
1790 |
"cell_type": "code",
|
1791 |
+
"execution_count": 26,
|
1792 |
"metadata": {},
|
1793 |
"outputs": [
|
1794 |
{
|
1795 |
+
"data": {
|
1796 |
+
"text/html": [
|
1797 |
+
"<style>#sk-container-id-2 {\n",
|
1798 |
+
" /* Definition of color scheme common for light and dark mode */\n",
|
1799 |
+
" --sklearn-color-text: black;\n",
|
1800 |
+
" --sklearn-color-line: gray;\n",
|
1801 |
+
" /* Definition of color scheme for unfitted estimators */\n",
|
1802 |
+
" --sklearn-color-unfitted-level-0: #fff5e6;\n",
|
1803 |
+
" --sklearn-color-unfitted-level-1: #f6e4d2;\n",
|
1804 |
+
" --sklearn-color-unfitted-level-2: #ffe0b3;\n",
|
1805 |
+
" --sklearn-color-unfitted-level-3: chocolate;\n",
|
1806 |
+
" /* Definition of color scheme for fitted estimators */\n",
|
1807 |
+
" --sklearn-color-fitted-level-0: #f0f8ff;\n",
|
1808 |
+
" --sklearn-color-fitted-level-1: #d4ebff;\n",
|
1809 |
+
" --sklearn-color-fitted-level-2: #b3dbfd;\n",
|
1810 |
+
" --sklearn-color-fitted-level-3: cornflowerblue;\n",
|
1811 |
+
"\n",
|
1812 |
+
" /* Specific color for light theme */\n",
|
1813 |
+
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
1814 |
+
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
|
1815 |
+
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
|
1816 |
+
" --sklearn-color-icon: #696969;\n",
|
1817 |
+
"\n",
|
1818 |
+
" @media (prefers-color-scheme: dark) {\n",
|
1819 |
+
" /* Redefinition of color scheme for dark theme */\n",
|
1820 |
+
" --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
1821 |
+
" --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
|
1822 |
+
" --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
|
1823 |
+
" --sklearn-color-icon: #878787;\n",
|
1824 |
+
" }\n",
|
1825 |
+
"}\n",
|
1826 |
+
"\n",
|
1827 |
+
"#sk-container-id-2 {\n",
|
1828 |
+
" color: var(--sklearn-color-text);\n",
|
1829 |
+
"}\n",
|
1830 |
+
"\n",
|
1831 |
+
"#sk-container-id-2 pre {\n",
|
1832 |
+
" padding: 0;\n",
|
1833 |
+
"}\n",
|
1834 |
+
"\n",
|
1835 |
+
"#sk-container-id-2 input.sk-hidden--visually {\n",
|
1836 |
+
" border: 0;\n",
|
1837 |
+
" clip: rect(1px 1px 1px 1px);\n",
|
1838 |
+
" clip: rect(1px, 1px, 1px, 1px);\n",
|
1839 |
+
" height: 1px;\n",
|
1840 |
+
" margin: -1px;\n",
|
1841 |
+
" overflow: hidden;\n",
|
1842 |
+
" padding: 0;\n",
|
1843 |
+
" position: absolute;\n",
|
1844 |
+
" width: 1px;\n",
|
1845 |
+
"}\n",
|
1846 |
+
"\n",
|
1847 |
+
"#sk-container-id-2 div.sk-dashed-wrapped {\n",
|
1848 |
+
" border: 1px dashed var(--sklearn-color-line);\n",
|
1849 |
+
" margin: 0 0.4em 0.5em 0.4em;\n",
|
1850 |
+
" box-sizing: border-box;\n",
|
1851 |
+
" padding-bottom: 0.4em;\n",
|
1852 |
+
" background-color: var(--sklearn-color-background);\n",
|
1853 |
+
"}\n",
|
1854 |
+
"\n",
|
1855 |
+
"#sk-container-id-2 div.sk-container {\n",
|
1856 |
+
" /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
|
1857 |
+
" but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
|
1858 |
+
" so we also need the `!important` here to be able to override the\n",
|
1859 |
+
" default hidden behavior on the sphinx rendered scikit-learn.org.\n",
|
1860 |
+
" See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
|
1861 |
+
" display: inline-block !important;\n",
|
1862 |
+
" position: relative;\n",
|
1863 |
+
"}\n",
|
1864 |
+
"\n",
|
1865 |
+
"#sk-container-id-2 div.sk-text-repr-fallback {\n",
|
1866 |
+
" display: none;\n",
|
1867 |
+
"}\n",
|
1868 |
+
"\n",
|
1869 |
+
"div.sk-parallel-item,\n",
|
1870 |
+
"div.sk-serial,\n",
|
1871 |
+
"div.sk-item {\n",
|
1872 |
+
" /* draw centered vertical line to link estimators */\n",
|
1873 |
+
" background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
|
1874 |
+
" background-size: 2px 100%;\n",
|
1875 |
+
" background-repeat: no-repeat;\n",
|
1876 |
+
" background-position: center center;\n",
|
1877 |
+
"}\n",
|
1878 |
+
"\n",
|
1879 |
+
"/* Parallel-specific style estimator block */\n",
|
1880 |
+
"\n",
|
1881 |
+
"#sk-container-id-2 div.sk-parallel-item::after {\n",
|
1882 |
+
" content: \"\";\n",
|
1883 |
+
" width: 100%;\n",
|
1884 |
+
" border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
|
1885 |
+
" flex-grow: 1;\n",
|
1886 |
+
"}\n",
|
1887 |
+
"\n",
|
1888 |
+
"#sk-container-id-2 div.sk-parallel {\n",
|
1889 |
+
" display: flex;\n",
|
1890 |
+
" align-items: stretch;\n",
|
1891 |
+
" justify-content: center;\n",
|
1892 |
+
" background-color: var(--sklearn-color-background);\n",
|
1893 |
+
" position: relative;\n",
|
1894 |
+
"}\n",
|
1895 |
+
"\n",
|
1896 |
+
"#sk-container-id-2 div.sk-parallel-item {\n",
|
1897 |
+
" display: flex;\n",
|
1898 |
+
" flex-direction: column;\n",
|
1899 |
+
"}\n",
|
1900 |
+
"\n",
|
1901 |
+
"#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
|
1902 |
+
" align-self: flex-end;\n",
|
1903 |
+
" width: 50%;\n",
|
1904 |
+
"}\n",
|
1905 |
+
"\n",
|
1906 |
+
"#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
|
1907 |
+
" align-self: flex-start;\n",
|
1908 |
+
" width: 50%;\n",
|
1909 |
+
"}\n",
|
1910 |
+
"\n",
|
1911 |
+
"#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
|
1912 |
+
" width: 0;\n",
|
1913 |
+
"}\n",
|
1914 |
+
"\n",
|
1915 |
+
"/* Serial-specific style estimator block */\n",
|
1916 |
+
"\n",
|
1917 |
+
"#sk-container-id-2 div.sk-serial {\n",
|
1918 |
+
" display: flex;\n",
|
1919 |
+
" flex-direction: column;\n",
|
1920 |
+
" align-items: center;\n",
|
1921 |
+
" background-color: var(--sklearn-color-background);\n",
|
1922 |
+
" padding-right: 1em;\n",
|
1923 |
+
" padding-left: 1em;\n",
|
1924 |
+
"}\n",
|
1925 |
+
"\n",
|
1926 |
+
"\n",
|
1927 |
+
"/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
|
1928 |
+
"clickable and can be expanded/collapsed.\n",
|
1929 |
+
"- Pipeline and ColumnTransformer use this feature and define the default style\n",
|
1930 |
+
"- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
|
1931 |
+
"*/\n",
|
1932 |
+
"\n",
|
1933 |
+
"/* Pipeline and ColumnTransformer style (default) */\n",
|
1934 |
+
"\n",
|
1935 |
+
"#sk-container-id-2 div.sk-toggleable {\n",
|
1936 |
+
" /* Default theme specific background. It is overwritten whether we have a\n",
|
1937 |
+
" specific estimator or a Pipeline/ColumnTransformer */\n",
|
1938 |
+
" background-color: var(--sklearn-color-background);\n",
|
1939 |
+
"}\n",
|
1940 |
+
"\n",
|
1941 |
+
"/* Toggleable label */\n",
|
1942 |
+
"#sk-container-id-2 label.sk-toggleable__label {\n",
|
1943 |
+
" cursor: pointer;\n",
|
1944 |
+
" display: block;\n",
|
1945 |
+
" width: 100%;\n",
|
1946 |
+
" margin-bottom: 0;\n",
|
1947 |
+
" padding: 0.5em;\n",
|
1948 |
+
" box-sizing: border-box;\n",
|
1949 |
+
" text-align: center;\n",
|
1950 |
+
"}\n",
|
1951 |
+
"\n",
|
1952 |
+
"#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
|
1953 |
+
" /* Arrow on the left of the label */\n",
|
1954 |
+
" content: \"▸\";\n",
|
1955 |
+
" float: left;\n",
|
1956 |
+
" margin-right: 0.25em;\n",
|
1957 |
+
" color: var(--sklearn-color-icon);\n",
|
1958 |
+
"}\n",
|
1959 |
+
"\n",
|
1960 |
+
"#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
|
1961 |
+
" color: var(--sklearn-color-text);\n",
|
1962 |
+
"}\n",
|
1963 |
+
"\n",
|
1964 |
+
"/* Toggleable content - dropdown */\n",
|
1965 |
+
"\n",
|
1966 |
+
"#sk-container-id-2 div.sk-toggleable__content {\n",
|
1967 |
+
" max-height: 0;\n",
|
1968 |
+
" max-width: 0;\n",
|
1969 |
+
" overflow: hidden;\n",
|
1970 |
+
" text-align: left;\n",
|
1971 |
+
" /* unfitted */\n",
|
1972 |
+
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
1973 |
+
"}\n",
|
1974 |
+
"\n",
|
1975 |
+
"#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
|
1976 |
+
" /* fitted */\n",
|
1977 |
+
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
1978 |
+
"}\n",
|
1979 |
+
"\n",
|
1980 |
+
"#sk-container-id-2 div.sk-toggleable__content pre {\n",
|
1981 |
+
" margin: 0.2em;\n",
|
1982 |
+
" border-radius: 0.25em;\n",
|
1983 |
+
" color: var(--sklearn-color-text);\n",
|
1984 |
+
" /* unfitted */\n",
|
1985 |
+
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
1986 |
+
"}\n",
|
1987 |
+
"\n",
|
1988 |
+
"#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
|
1989 |
+
" /* unfitted */\n",
|
1990 |
+
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
1991 |
+
"}\n",
|
1992 |
+
"\n",
|
1993 |
+
"#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
|
1994 |
+
" /* Expand drop-down */\n",
|
1995 |
+
" max-height: 200px;\n",
|
1996 |
+
" max-width: 100%;\n",
|
1997 |
+
" overflow: auto;\n",
|
1998 |
+
"}\n",
|
1999 |
+
"\n",
|
2000 |
+
"#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
|
2001 |
+
" content: \"▾\";\n",
|
2002 |
+
"}\n",
|
2003 |
+
"\n",
|
2004 |
+
"/* Pipeline/ColumnTransformer-specific style */\n",
|
2005 |
+
"\n",
|
2006 |
+
"#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
2007 |
+
" color: var(--sklearn-color-text);\n",
|
2008 |
+
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
2009 |
+
"}\n",
|
2010 |
+
"\n",
|
2011 |
+
"#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
2012 |
+
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
2013 |
+
"}\n",
|
2014 |
+
"\n",
|
2015 |
+
"/* Estimator-specific style */\n",
|
2016 |
+
"\n",
|
2017 |
+
"/* Colorize estimator box */\n",
|
2018 |
+
"#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
2019 |
+
" /* unfitted */\n",
|
2020 |
+
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
2021 |
+
"}\n",
|
2022 |
+
"\n",
|
2023 |
+
"#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
|
2024 |
+
" /* fitted */\n",
|
2025 |
+
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
2026 |
+
"}\n",
|
2027 |
+
"\n",
|
2028 |
+
"#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
|
2029 |
+
"#sk-container-id-2 div.sk-label label {\n",
|
2030 |
+
" /* The background is the default theme color */\n",
|
2031 |
+
" color: var(--sklearn-color-text-on-default-background);\n",
|
2032 |
+
"}\n",
|
2033 |
+
"\n",
|
2034 |
+
"/* On hover, darken the color of the background */\n",
|
2035 |
+
"#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
|
2036 |
+
" color: var(--sklearn-color-text);\n",
|
2037 |
+
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
2038 |
+
"}\n",
|
2039 |
+
"\n",
|
2040 |
+
"/* Label box, darken color on hover, fitted */\n",
|
2041 |
+
"#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
|
2042 |
+
" color: var(--sklearn-color-text);\n",
|
2043 |
+
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
2044 |
+
"}\n",
|
2045 |
+
"\n",
|
2046 |
+
"/* Estimator label */\n",
|
2047 |
+
"\n",
|
2048 |
+
"#sk-container-id-2 div.sk-label label {\n",
|
2049 |
+
" font-family: monospace;\n",
|
2050 |
+
" font-weight: bold;\n",
|
2051 |
+
" display: inline-block;\n",
|
2052 |
+
" line-height: 1.2em;\n",
|
2053 |
+
"}\n",
|
2054 |
+
"\n",
|
2055 |
+
"#sk-container-id-2 div.sk-label-container {\n",
|
2056 |
+
" text-align: center;\n",
|
2057 |
+
"}\n",
|
2058 |
+
"\n",
|
2059 |
+
"/* Estimator-specific */\n",
|
2060 |
+
"#sk-container-id-2 div.sk-estimator {\n",
|
2061 |
+
" font-family: monospace;\n",
|
2062 |
+
" border: 1px dotted var(--sklearn-color-border-box);\n",
|
2063 |
+
" border-radius: 0.25em;\n",
|
2064 |
+
" box-sizing: border-box;\n",
|
2065 |
+
" margin-bottom: 0.5em;\n",
|
2066 |
+
" /* unfitted */\n",
|
2067 |
+
" background-color: var(--sklearn-color-unfitted-level-0);\n",
|
2068 |
+
"}\n",
|
2069 |
+
"\n",
|
2070 |
+
"#sk-container-id-2 div.sk-estimator.fitted {\n",
|
2071 |
+
" /* fitted */\n",
|
2072 |
+
" background-color: var(--sklearn-color-fitted-level-0);\n",
|
2073 |
+
"}\n",
|
2074 |
+
"\n",
|
2075 |
+
"/* on hover */\n",
|
2076 |
+
"#sk-container-id-2 div.sk-estimator:hover {\n",
|
2077 |
+
" /* unfitted */\n",
|
2078 |
+
" background-color: var(--sklearn-color-unfitted-level-2);\n",
|
2079 |
+
"}\n",
|
2080 |
+
"\n",
|
2081 |
+
"#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
|
2082 |
+
" /* fitted */\n",
|
2083 |
+
" background-color: var(--sklearn-color-fitted-level-2);\n",
|
2084 |
+
"}\n",
|
2085 |
+
"\n",
|
2086 |
+
"/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
|
2087 |
+
"\n",
|
2088 |
+
"/* Common style for \"i\" and \"?\" */\n",
|
2089 |
+
"\n",
|
2090 |
+
".sk-estimator-doc-link,\n",
|
2091 |
+
"a:link.sk-estimator-doc-link,\n",
|
2092 |
+
"a:visited.sk-estimator-doc-link {\n",
|
2093 |
+
" float: right;\n",
|
2094 |
+
" font-size: smaller;\n",
|
2095 |
+
" line-height: 1em;\n",
|
2096 |
+
" font-family: monospace;\n",
|
2097 |
+
" background-color: var(--sklearn-color-background);\n",
|
2098 |
+
" border-radius: 1em;\n",
|
2099 |
+
" height: 1em;\n",
|
2100 |
+
" width: 1em;\n",
|
2101 |
+
" text-decoration: none !important;\n",
|
2102 |
+
" margin-left: 1ex;\n",
|
2103 |
+
" /* unfitted */\n",
|
2104 |
+
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
2105 |
+
" color: var(--sklearn-color-unfitted-level-1);\n",
|
2106 |
+
"}\n",
|
2107 |
+
"\n",
|
2108 |
+
".sk-estimator-doc-link.fitted,\n",
|
2109 |
+
"a:link.sk-estimator-doc-link.fitted,\n",
|
2110 |
+
"a:visited.sk-estimator-doc-link.fitted {\n",
|
2111 |
+
" /* fitted */\n",
|
2112 |
+
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
2113 |
+
" color: var(--sklearn-color-fitted-level-1);\n",
|
2114 |
+
"}\n",
|
2115 |
+
"\n",
|
2116 |
+
"/* On hover */\n",
|
2117 |
+
"div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
|
2118 |
+
".sk-estimator-doc-link:hover,\n",
|
2119 |
+
"div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
|
2120 |
+
".sk-estimator-doc-link:hover {\n",
|
2121 |
+
" /* unfitted */\n",
|
2122 |
+
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
2123 |
+
" color: var(--sklearn-color-background);\n",
|
2124 |
+
" text-decoration: none;\n",
|
2125 |
+
"}\n",
|
2126 |
+
"\n",
|
2127 |
+
"div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
|
2128 |
+
".sk-estimator-doc-link.fitted:hover,\n",
|
2129 |
+
"div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
|
2130 |
+
".sk-estimator-doc-link.fitted:hover {\n",
|
2131 |
+
" /* fitted */\n",
|
2132 |
+
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
2133 |
+
" color: var(--sklearn-color-background);\n",
|
2134 |
+
" text-decoration: none;\n",
|
2135 |
+
"}\n",
|
2136 |
+
"\n",
|
2137 |
+
"/* Span, style for the box shown on hovering the info icon */\n",
|
2138 |
+
".sk-estimator-doc-link span {\n",
|
2139 |
+
" display: none;\n",
|
2140 |
+
" z-index: 9999;\n",
|
2141 |
+
" position: relative;\n",
|
2142 |
+
" font-weight: normal;\n",
|
2143 |
+
" right: .2ex;\n",
|
2144 |
+
" padding: .5ex;\n",
|
2145 |
+
" margin: .5ex;\n",
|
2146 |
+
" width: min-content;\n",
|
2147 |
+
" min-width: 20ex;\n",
|
2148 |
+
" max-width: 50ex;\n",
|
2149 |
+
" color: var(--sklearn-color-text);\n",
|
2150 |
+
" box-shadow: 2pt 2pt 4pt #999;\n",
|
2151 |
+
" /* unfitted */\n",
|
2152 |
+
" background: var(--sklearn-color-unfitted-level-0);\n",
|
2153 |
+
" border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
|
2154 |
+
"}\n",
|
2155 |
+
"\n",
|
2156 |
+
".sk-estimator-doc-link.fitted span {\n",
|
2157 |
+
" /* fitted */\n",
|
2158 |
+
" background: var(--sklearn-color-fitted-level-0);\n",
|
2159 |
+
" border: var(--sklearn-color-fitted-level-3);\n",
|
2160 |
+
"}\n",
|
2161 |
+
"\n",
|
2162 |
+
".sk-estimator-doc-link:hover span {\n",
|
2163 |
+
" display: block;\n",
|
2164 |
+
"}\n",
|
2165 |
+
"\n",
|
2166 |
+
"/* \"?\"-specific style due to the `<a>` HTML tag */\n",
|
2167 |
+
"\n",
|
2168 |
+
"#sk-container-id-2 a.estimator_doc_link {\n",
|
2169 |
+
" float: right;\n",
|
2170 |
+
" font-size: 1rem;\n",
|
2171 |
+
" line-height: 1em;\n",
|
2172 |
+
" font-family: monospace;\n",
|
2173 |
+
" background-color: var(--sklearn-color-background);\n",
|
2174 |
+
" border-radius: 1rem;\n",
|
2175 |
+
" height: 1rem;\n",
|
2176 |
+
" width: 1rem;\n",
|
2177 |
+
" text-decoration: none;\n",
|
2178 |
+
" /* unfitted */\n",
|
2179 |
+
" color: var(--sklearn-color-unfitted-level-1);\n",
|
2180 |
+
" border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
|
2181 |
+
"}\n",
|
2182 |
+
"\n",
|
2183 |
+
"#sk-container-id-2 a.estimator_doc_link.fitted {\n",
|
2184 |
+
" /* fitted */\n",
|
2185 |
+
" border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
|
2186 |
+
" color: var(--sklearn-color-fitted-level-1);\n",
|
2187 |
+
"}\n",
|
2188 |
+
"\n",
|
2189 |
+
"/* On hover */\n",
|
2190 |
+
"#sk-container-id-2 a.estimator_doc_link:hover {\n",
|
2191 |
+
" /* unfitted */\n",
|
2192 |
+
" background-color: var(--sklearn-color-unfitted-level-3);\n",
|
2193 |
+
" color: var(--sklearn-color-background);\n",
|
2194 |
+
" text-decoration: none;\n",
|
2195 |
+
"}\n",
|
2196 |
+
"\n",
|
2197 |
+
"#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
|
2198 |
+
" /* fitted */\n",
|
2199 |
+
" background-color: var(--sklearn-color-fitted-level-3);\n",
|
2200 |
+
"}\n",
|
2201 |
+
"</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KMeans(n_clusters=1, random_state=10)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\"> KMeans<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.4/modules/generated/sklearn.cluster.KMeans.html\">?<span>Documentation for KMeans</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>KMeans(n_clusters=1, random_state=10)</pre></div> </div></div></div></div>"
|
2202 |
+
],
|
2203 |
+
"text/plain": [
|
2204 |
+
"KMeans(n_clusters=1, random_state=10)"
|
2205 |
+
]
|
2206 |
+
},
|
2207 |
+
"execution_count": 26,
|
2208 |
+
"metadata": {},
|
2209 |
+
"output_type": "execute_result"
|
2210 |
}
|
2211 |
],
|
2212 |
"source": [
|
|
|
2234 |
"\n",
|
2235 |
"\n",
|
2236 |
"\n",
|
2237 |
+
"# pca = PCA(n_components=2)\n",
|
2238 |
+
"# X = pca.fit_transform(X1)\n",
|
2239 |
"\n",
|
2240 |
"\n",
|
2241 |
"\n",
|
2242 |
"\n",
|
2243 |
+
"# # # Getting the cluster centers and labels\n",
|
2244 |
+
"# centroids = pca.transform(kmeans1.cluster_centers_)\n",
|
2245 |
+
"# labels = kmeans1.labels_\n",
|
2246 |
+
"# print(kmeans1.cluster_centers_)\n",
|
2247 |
+
"# # Plotting the data points and cluster centers\n",
|
2248 |
+
"# plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.5)\n",
|
2249 |
+
"# plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', c='red', s=200, linewidths=2)\n",
|
2250 |
+
"# plt.title('KMeans Clustering')\n",
|
2251 |
+
"# plt.xlabel('Feature 1')\n",
|
2252 |
+
"# plt.ylabel('Feature 2')\n",
|
2253 |
+
"# plt.show()\n"
|
2254 |
]
|
2255 |
},
|
2256 |
{
|
2257 |
"cell_type": "code",
|
2258 |
+
"execution_count": 27,
|
2259 |
"metadata": {},
|
2260 |
"outputs": [
|
2261 |
{
|
2262 |
"data": {
|
2263 |
"text/plain": [
|
2264 |
+
"['kmeans_rtu_4.pkl']"
|
2265 |
]
|
2266 |
},
|
2267 |
+
"execution_count": 27,
|
2268 |
"metadata": {},
|
2269 |
"output_type": "execute_result"
|
2270 |
}
|
2271 |
],
|
2272 |
"source": [
|
2273 |
"import joblib\n",
|
2274 |
+
"joblib.dump(kmeans1, 'kmeans_rtu_3.pkl')\n",
|
2275 |
+
"joblib.dump(kmeans2, 'kmeans_rtu_4.pkl')\n",
|
2276 |
"# joblib.dump(pca, 'pca_model.pkl')\n"
|
2277 |
]
|
2278 |
},
|
|
|
2304 |
},
|
2305 |
{
|
2306 |
"cell_type": "code",
|
2307 |
+
"execution_count": 16,
|
2308 |
"metadata": {},
|
2309 |
"outputs": [],
|
2310 |
"source": [
|
|
|
2558 |
"# plt.plot(df_filtered['date'],df_filtered['hp_hws_temp'])"
|
2559 |
]
|
2560 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2561 |
{
|
2562 |
"cell_type": "code",
|
2563 |
"execution_count": null,
|
src/rtu/models/lstm_2rtu_smooth_03.keras
ADDED
Binary file (575 kB). View file
|
|
src/rtu/models/lstm_2rtu_smooth_04.keras
ADDED
Binary file (575 kB). View file
|
|
src/rtu/models/scaler_rtu_1_2.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:0ba51191b0f354f482615235908b9f3934b0986b8b97b3c34ef942c8d4706b5d
|
3 |
+
size 1149
|
src/rtu/models/scaler_rtu_3_4.pkl
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:096b8e146b1d09dac40661624f33d902e44eb19c8e2ca33b8854022ce2f77796
|
3 |
+
size 1149
|