akshayballal commited on
Commit
fdd11ec
·
2 Parent(s): e3c6dcf 21bf222

Merge branch 'lstm' of hf.co:spaces/smartbuildings/smart-buildings into lstm

Browse files
.gitignore CHANGED
@@ -3,4 +3,5 @@ venv
3
  .vscode
4
  __pycache__/
5
  *.tf
6
- data
 
 
3
  .vscode
4
  __pycache__/
5
  *.tf
6
+ data
7
+ *.keras
EnergyLSTM/EDA_lstm_energy.ipynb ADDED
@@ -0,0 +1,262 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import pandas as pd \n",
10
+ "from datetime import datetime \n",
11
+ "from datetime import timedelta\n",
12
+ "from datetime import date\n",
13
+ "import matplotlib.pyplot as plt\n",
14
+ "# import seaborn as sns\n",
15
+ "import numpy as np\n",
16
+ "import pandas as pd\n",
17
+ "from statsmodels.tsa.holtwinters import ExponentialSmoothing\n",
18
+ "\n",
19
+ "dataPATH = r\"C:\\Users\\levim\\OneDrive\\Documents\\MastersAI_ES\\TeamProject-5ARIP10\\smart-buildings\\Data\"\n",
20
+ "\n",
21
+ "### Load ALL data ###\n",
22
+ "# all_data = pd.read_csv(dataPATH + r\"\\long_merge.csv\")\n",
23
+ "all_data = pd.read_csv(dataPATH + r\"\\extended_energy_data.csv\")"
24
+ ]
25
+ },
26
+ {
27
+ "cell_type": "markdown",
28
+ "metadata": {},
29
+ "source": [
30
+ "### Load selection of data"
31
+ ]
32
+ },
33
+ {
34
+ "cell_type": "code",
35
+ "execution_count": null,
36
+ "metadata": {},
37
+ "outputs": [],
38
+ "source": [
39
+ "# Prepar energy data set with extended features\n",
40
+ "feature_list = ['date', 'hvac_N', 'hvac_S', 'air_temp_set_1', 'solar_radiation_set_1']\n",
41
+ "extended_energy_data = all_data[feature_list]\n",
42
+ "\n",
43
+ "extended_energy_data['date'] = pd.to_datetime(extended_energy_data['date'])\n",
44
+ "extended_energy_data.set_index('date', inplace=True)\n",
45
+ "\n",
46
+ "# eed = extended energy data\n",
47
+ "# Resampling back to 15 minutes and 1 hour\n",
48
+ "eed_15m = extended_energy_data.resample('15T').mean()\n",
49
+ "eed_1h = extended_energy_data.resample('60T').mean()"
50
+ ]
51
+ },
52
+ {
53
+ "cell_type": "code",
54
+ "execution_count": null,
55
+ "metadata": {
56
+ "vscode": {
57
+ "languageId": "ruby"
58
+ }
59
+ },
60
+ "outputs": [],
61
+ "source": [
62
+ "# Assuming you want to apply a moving average window of size 3 on the 'column_name' column\n",
63
+ "window_size = 4*4 # 4 hours\n",
64
+ "eed_15m_avg = eed_15m.copy()\n",
65
+ "eed_15m_avg['hvac_N'] = eed_15m['hvac_N'].rolling(window=window_size).mean()\n",
66
+ "eed_15m_avg['hvac_S'] = eed_15m['hvac_S'].rolling(window=window_size).mean()\n",
67
+ "\n",
68
+ "window_size = 4 # 4 hours\n",
69
+ "eed_1h_avg = eed_1h.copy()\n",
70
+ "eed_1h_avg['hvac_N'] = eed_1h['hvac_N'].rolling(window=window_size).mean()\n",
71
+ "eed_1h_avg['hvac_S'] = eed_1h['hvac_S'].rolling(window=window_size).mean()"
72
+ ]
73
+ },
74
+ {
75
+ "cell_type": "code",
76
+ "execution_count": null,
77
+ "metadata": {},
78
+ "outputs": [],
79
+ "source": [
80
+ "%matplotlib qt\n",
81
+ "\n",
82
+ "start_date = '2018-06-02'\n",
83
+ "end_date = '2018-06-08'\n",
84
+ "\n",
85
+ "plt.plot(eed_15m['hvac_N'].loc[start_date:end_date])\n",
86
+ "plt.plot(eed_15m_avg['hvac_N'].loc[start_date:end_date])\n",
87
+ "plt.plot(eed_1h_avg['hvac_N'].loc[start_date:end_date])\n",
88
+ "plt.xticks(rotation=45)\n",
89
+ "plt.show()"
90
+ ]
91
+ },
92
+ {
93
+ "cell_type": "code",
94
+ "execution_count": null,
95
+ "metadata": {},
96
+ "outputs": [],
97
+ "source": [
98
+ "%matplotlib qt\n",
99
+ "\n",
100
+ "plt.figure(figsize=(20,10))\n",
101
+ "plt.plot(eed_1h['hvac_S'])\n",
102
+ "plt.show()"
103
+ ]
104
+ },
105
+ {
106
+ "cell_type": "markdown",
107
+ "metadata": {},
108
+ "source": [
109
+ "### Filling data gaps"
110
+ ]
111
+ },
112
+ {
113
+ "cell_type": "code",
114
+ "execution_count": null,
115
+ "metadata": {},
116
+ "outputs": [],
117
+ "source": [
118
+ "def fillgap(firstTS, secondTS, seasonal_periods):\n",
119
+ " \n",
120
+ " #PREPARATION\n",
121
+ " one = timedelta(hours=1)\n",
122
+ " secondTSr = secondTS[::-1].copy()\n",
123
+ " firstTSr = firstTS[::-1].copy()\n",
124
+ " indexr = pd.date_range(start=firstTS.index[0], end=secondTS.index[-1], freq='H')\n",
125
+ " firstTSr.index = indexr[-len(firstTSr):]\n",
126
+ " secondTSr.index = indexr[:len(secondTSr)]\n",
127
+ " \n",
128
+ " #FORWARD \n",
129
+ " es = ExponentialSmoothing(firstTS, seasonal_periods=seasonal_periods,seasonal='add', freq='H').fit()\n",
130
+ " forwardPrediction = es.predict(start=firstTS.index[-1]+one, end=secondTS.index[0]-one)\n",
131
+ " \n",
132
+ " #BACKWARD\n",
133
+ " es = ExponentialSmoothing(secondTSr, seasonal_periods=seasonal_periods,seasonal='add', freq='H').fit()\n",
134
+ " backwardPrediction = es.predict(start=secondTSr.index[-1]+one, end=firstTSr.index[0]-one)\n",
135
+ " \n",
136
+ " #INTERPOLATION\n",
137
+ " l = len(forwardPrediction)\n",
138
+ " interpolation = pd.Series([(backwardPrediction[i] * i + forwardPrediction[i] * (l -i) )/ l for i in range(l)], index=forwardPrediction.index.copy())\n",
139
+ " \n",
140
+ " return interpolation"
141
+ ]
142
+ },
143
+ {
144
+ "cell_type": "code",
145
+ "execution_count": null,
146
+ "metadata": {},
147
+ "outputs": [],
148
+ "source": [
149
+ "# Function to split the data into multiple DataFrames based on the gaps\n",
150
+ "def split_dfs(data):\n",
151
+ "\n",
152
+ " # Prepare the DataFrame\n",
153
+ " df = data.copy()\n",
154
+ " df = df.reset_index()\n",
155
+ " df = df.dropna()\n",
156
+ " \n",
157
+ " # Set the maximum allowable gap (e.g., 1 hour)\n",
158
+ " max_gap = pd.Timedelta(hours=1)\n",
159
+ "\n",
160
+ " # Calculate the differences between consecutive timestamps\n",
161
+ " time_diff = df['date'].diff()\n",
162
+ "\n",
163
+ " # Identify gaps larger than the maximum allowable gap\n",
164
+ " gaps = time_diff > max_gap\n",
165
+ "\n",
166
+ " # Create a new column to identify different groups\n",
167
+ " df['group'] = gaps.cumsum()\n",
168
+ "\n",
169
+ " df.set_index('date', inplace=True)\n",
170
+ "\n",
171
+ " # Split the DataFrame into a list of DataFrames based on the groups\n",
172
+ " dfs = [group for _, group in df.groupby('group')]\n",
173
+ "\n",
174
+ " return dfs"
175
+ ]
176
+ },
177
+ {
178
+ "cell_type": "code",
179
+ "execution_count": null,
180
+ "metadata": {},
181
+ "outputs": [],
182
+ "source": [
183
+ "def interpolate_gaps(data, col):\n",
184
+ "\n",
185
+ " # Split the data into multiple DataFrames based on the gaps\n",
186
+ " dfs = split_dfs(data[[col]])\n",
187
+ "\n",
188
+ " # Interpolate the gaps between the DataFrames\n",
189
+ " ip_df = pd.DataFrame()\n",
190
+ " for ii in range(len(dfs)-1):\n",
191
+ " seasonal_periods = max(min([len(dfs[ii]), len(dfs[ii+1])]) // 2 - 10, 2)\n",
192
+ " \n",
193
+ " if seasonal_periods > 24*7: # Using more than 1 week of seasonal patterns is not necessary\n",
194
+ " seasonal_periods = 24*7\n",
195
+ " interpolation = fillgap(dfs[ii][col], dfs[ii+1][col], seasonal_periods)\n",
196
+ " else:\n",
197
+ " interpolation = fillgap(dfs[ii][col], dfs[ii+1][col], seasonal_periods)\n",
198
+ "\n",
199
+ " ip_df = pd.concat([ip_df,dfs[ii][col],interpolation])\n",
200
+ " \n",
201
+ " # Add the last DataFrame\n",
202
+ " ip_df = pd.concat([ip_df,dfs[-1][col]])\n",
203
+ "\n",
204
+ " return ip_df"
205
+ ]
206
+ },
207
+ {
208
+ "cell_type": "code",
209
+ "execution_count": null,
210
+ "metadata": {},
211
+ "outputs": [],
212
+ "source": [
213
+ "# interpolation of the whole data set\n",
214
+ "\n",
215
+ "ip_eed_1h = pd.DataFrame()\n",
216
+ "for ii in eed_1h.columns:\n",
217
+ " ip_df = interpolate_gaps(eed_1h['2018-1-2':], ii)\n",
218
+ " ip_eed_1h = pd.concat([ip_eed_1h, ip_df[0]], axis=1) # axis=1 for horizontal concat\n",
219
+ "ip_eed_1h.columns = list(eed_1h.columns)\n",
220
+ "\n",
221
+ "ip_eed_1h = ip_eed_1h.set_axis('date', axis=0)\n",
222
+ "ip_eed_1h.to_csv(dataPATH + r\"\\interpolated_energy_data.csv\")\n",
223
+ "\n",
224
+ "ip_eed_1h.head()"
225
+ ]
226
+ },
227
+ {
228
+ "cell_type": "code",
229
+ "execution_count": null,
230
+ "metadata": {},
231
+ "outputs": [],
232
+ "source": [
233
+ "%matplotlib qt\n",
234
+ "# plt.plot(eed_1h['hvac_N'])\n",
235
+ "plt.plot(ip_df)\n",
236
+ "\n",
237
+ "plt.show()"
238
+ ]
239
+ }
240
+ ],
241
+ "metadata": {
242
+ "kernelspec": {
243
+ "display_name": "experiments",
244
+ "language": "python",
245
+ "name": "python3"
246
+ },
247
+ "language_info": {
248
+ "codemirror_mode": {
249
+ "name": "ipython",
250
+ "version": 3
251
+ },
252
+ "file_extension": ".py",
253
+ "mimetype": "text/x-python",
254
+ "name": "python",
255
+ "nbconvert_exporter": "python",
256
+ "pygments_lexer": "ipython3",
257
+ "version": "3.8.15"
258
+ }
259
+ },
260
+ "nbformat": 4,
261
+ "nbformat_minor": 2
262
+ }
EnergyLSTM/lstm_energy.ipynb ADDED
@@ -0,0 +1,843 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 85,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import pandas as pd \n",
10
+ "from datetime import datetime \n",
11
+ "from datetime import date\n",
12
+ "import matplotlib.pyplot as plt\n",
13
+ "import numpy as np\n",
14
+ "import pandas as pd\n",
15
+ "from keras.models import Sequential\n",
16
+ "from keras.layers import LSTM, Dense\n",
17
+ "from sklearn.model_selection import train_test_split\n",
18
+ "from sklearn.preprocessing import MinMaxScaler,StandardScaler\n",
19
+ "from keras.callbacks import ModelCheckpoint\n",
20
+ "\n",
21
+ "dataPATH = r\"C:\\Users\\levim\\OneDrive\\Documents\\MastersAI_ES\\TeamProject-5ARIP10\\smart-buildings\\Data\"\n",
22
+ "# all_data = pd.read_csv(dataPATH + r\"\\long_merge.csv\")\n",
23
+ "all_data = pd.read_csv(dataPATH + r\"\\extended_energy_data.csv\")\n",
24
+ "interpolated_data = pd.read_csv(dataPATH + r\"\\interpolated_energy_data.csv\", index_col=0)"
25
+ ]
26
+ },
27
+ {
28
+ "cell_type": "code",
29
+ "execution_count": null,
30
+ "metadata": {},
31
+ "outputs": [],
32
+ "source": [
33
+ "# Prepar energy data set with extended features\n",
34
+ "feature_list = ['date', 'hvac_N', 'hvac_S', 'air_temp_set_1', 'solar_radiation_set_1']\n",
35
+ "extended_energy_data = all_data[feature_list]\n",
36
+ "\n",
37
+ "extended_energy_data['date'] = pd.to_datetime(extended_energy_data['date'])\n",
38
+ "extended_energy_data.set_index('date', inplace=True)\n",
39
+ "\n",
40
+ "eed_15m = extended_energy_data.resample('15T').mean()\n",
41
+ "eed_1h = extended_energy_data.resample('60T').mean()\n",
42
+ "\n",
43
+ "eed_15m = eed_15m.reset_index(drop=False)\n",
44
+ "eed_1h = eed_1h.reset_index(drop=False)\n",
45
+ "\n",
46
+ "window_size = 4*4 # 4 hours\n",
47
+ "eed_15m_avg = eed_15m.copy()\n",
48
+ "eed_15m_avg['hvac_N'] = eed_15m['hvac_N'].rolling(window=window_size).mean()\n",
49
+ "eed_15m_avg['hvac_S'] = eed_15m['hvac_S'].rolling(window=window_size).mean()\n",
50
+ "\n",
51
+ "window_size = 4 # 4 hours\n",
52
+ "eed_1h_avg = eed_1h.copy()\n",
53
+ "eed_1h_avg['hvac_N'] = eed_1h['hvac_N'].rolling(window=window_size).mean()\n",
54
+ "eed_1h_avg['hvac_S'] = eed_1h['hvac_S'].rolling(window=window_size).mean()\n",
55
+ "\n",
56
+ "eed_15m.head()"
57
+ ]
58
+ },
59
+ {
60
+ "cell_type": "code",
61
+ "execution_count": 86,
62
+ "metadata": {},
63
+ "outputs": [
64
+ {
65
+ "data": {
66
+ "text/html": [
67
+ "<div>\n",
68
+ "<style scoped>\n",
69
+ " .dataframe tbody tr th:only-of-type {\n",
70
+ " vertical-align: middle;\n",
71
+ " }\n",
72
+ "\n",
73
+ " .dataframe tbody tr th {\n",
74
+ " vertical-align: top;\n",
75
+ " }\n",
76
+ "\n",
77
+ " .dataframe thead th {\n",
78
+ " text-align: right;\n",
79
+ " }\n",
80
+ "</style>\n",
81
+ "<table border=\"1\" class=\"dataframe\">\n",
82
+ " <thead>\n",
83
+ " <tr style=\"text-align: right;\">\n",
84
+ " <th></th>\n",
85
+ " <th>date</th>\n",
86
+ " <th>hvac_N</th>\n",
87
+ " <th>hvac_S</th>\n",
88
+ " <th>day_of_week</th>\n",
89
+ " <th>air_temp_set_1</th>\n",
90
+ " <th>solar_radiation_set_1</th>\n",
91
+ " </tr>\n",
92
+ " </thead>\n",
93
+ " <tbody>\n",
94
+ " <tr>\n",
95
+ " <th>0</th>\n",
96
+ " <td>2018-01-02 00:00:00</td>\n",
97
+ " <td>38.225000</td>\n",
98
+ " <td>26.4000</td>\n",
99
+ " <td>1</td>\n",
100
+ " <td>14.9550</td>\n",
101
+ " <td>87.4450</td>\n",
102
+ " </tr>\n",
103
+ " <tr>\n",
104
+ " <th>1</th>\n",
105
+ " <td>2018-01-02 01:00:00</td>\n",
106
+ " <td>38.297501</td>\n",
107
+ " <td>21.1750</td>\n",
108
+ " <td>1</td>\n",
109
+ " <td>14.2125</td>\n",
110
+ " <td>2.8675</td>\n",
111
+ " </tr>\n",
112
+ " <tr>\n",
113
+ " <th>2</th>\n",
114
+ " <td>2018-01-02 02:00:00</td>\n",
115
+ " <td>38.072500</td>\n",
116
+ " <td>21.7225</td>\n",
117
+ " <td>1</td>\n",
118
+ " <td>14.2700</td>\n",
119
+ " <td>0.0925</td>\n",
120
+ " </tr>\n",
121
+ " <tr>\n",
122
+ " <th>3</th>\n",
123
+ " <td>2018-01-02 03:00:00</td>\n",
124
+ " <td>39.147500</td>\n",
125
+ " <td>21.7000</td>\n",
126
+ " <td>1</td>\n",
127
+ " <td>14.1375</td>\n",
128
+ " <td>0.1175</td>\n",
129
+ " </tr>\n",
130
+ " <tr>\n",
131
+ " <th>4</th>\n",
132
+ " <td>2018-01-02 04:00:00</td>\n",
133
+ " <td>38.172500</td>\n",
134
+ " <td>21.6250</td>\n",
135
+ " <td>1</td>\n",
136
+ " <td>13.9850</td>\n",
137
+ " <td>0.0725</td>\n",
138
+ " </tr>\n",
139
+ " </tbody>\n",
140
+ "</table>\n",
141
+ "</div>"
142
+ ],
143
+ "text/plain": [
144
+ " date hvac_N hvac_S day_of_week air_temp_set_1 \\\n",
145
+ "0 2018-01-02 00:00:00 38.225000 26.4000 1 14.9550 \n",
146
+ "1 2018-01-02 01:00:00 38.297501 21.1750 1 14.2125 \n",
147
+ "2 2018-01-02 02:00:00 38.072500 21.7225 1 14.2700 \n",
148
+ "3 2018-01-02 03:00:00 39.147500 21.7000 1 14.1375 \n",
149
+ "4 2018-01-02 04:00:00 38.172500 21.6250 1 13.9850 \n",
150
+ "\n",
151
+ " solar_radiation_set_1 \n",
152
+ "0 87.4450 \n",
153
+ "1 2.8675 \n",
154
+ "2 0.0925 \n",
155
+ "3 0.1175 \n",
156
+ "4 0.0725 "
157
+ ]
158
+ },
159
+ "execution_count": 86,
160
+ "metadata": {},
161
+ "output_type": "execute_result"
162
+ }
163
+ ],
164
+ "source": [
165
+ "# energy_data = pd.read_csv(dataPATH + r\"\\extended_energy_data.csv\")\n",
166
+ "# energy_data = eed_15m\n",
167
+ "# energy_data = eed_15m_avg\n",
168
+ "energy_data = interpolated_data.copy()\n",
169
+ "energy_data = energy_data.reset_index()\n",
170
+ "\n",
171
+ "# Convert the date column to datetime\n",
172
+ "energy_data['date'] = pd.to_datetime(energy_data['date'], format = \"%Y-%m-%d %H:%M:%S\")\n",
173
+ "\n",
174
+ "energy_data.insert(3, 'day_of_week', energy_data['date'].dt.weekday)\n",
175
+ "# Filter the data for the year 2019\n",
176
+ "df_filtered = energy_data[ (energy_data.date.dt.date >date(2018, 1, 1)) & (energy_data.date.dt.date< date(2021, 1, 1))]\n",
177
+ "\n",
178
+ "# Check for NA values in the DataFrame\n",
179
+ "if df_filtered.isna().any().any():\n",
180
+ " print(\"There are NA values in the DataFrame columns.\")\n",
181
+ "\n",
182
+ "df_filtered.head()"
183
+ ]
184
+ },
185
+ {
186
+ "cell_type": "code",
187
+ "execution_count": 88,
188
+ "metadata": {},
189
+ "outputs": [
190
+ {
191
+ "data": {
192
+ "text/plain": [
193
+ "[]"
194
+ ]
195
+ },
196
+ "execution_count": 88,
197
+ "metadata": {},
198
+ "output_type": "execute_result"
199
+ }
200
+ ],
201
+ "source": [
202
+ "testdataset_df = df_filtered[(df_filtered.date.dt.date >=date(2019, 3, 1)) & (df_filtered.date.dt.date <= date(2019, 6, 1))]\n",
203
+ "\n",
204
+ "traindataset_df = df_filtered[ (df_filtered.date.dt.date <date(2019, 3, 1)) | (df_filtered.date.dt.date > date(2019, 6, 1))]\n",
205
+ "\n",
206
+ "testdataset = testdataset_df.drop(columns=[\"date\"]).values\n",
207
+ "\n",
208
+ "traindataset = traindataset_df.drop(columns=[\"date\"]).values\n",
209
+ "\n",
210
+ "columns_with_na = traindataset_df.columns[traindataset_df.isna().any()].tolist()\n",
211
+ "columns_with_na"
212
+ ]
213
+ },
214
+ {
215
+ "cell_type": "code",
216
+ "execution_count": 89,
217
+ "metadata": {},
218
+ "outputs": [],
219
+ "source": [
220
+ "traindataset = traindataset.astype('float32')\n",
221
+ "testdataset = testdataset.astype('float32')\n",
222
+ "\n",
223
+ "mintest = np.min(testdataset[:,0:2])\n",
224
+ "maxtest = np.max(testdataset[:,0:2])\n",
225
+ "\n",
226
+ "scaler = MinMaxScaler(feature_range=(0, 1))\n",
227
+ "traindataset = scaler.fit_transform(traindataset)\n",
228
+ "testdataset = scaler.transform(testdataset)"
229
+ ]
230
+ },
231
+ {
232
+ "cell_type": "code",
233
+ "execution_count": 104,
234
+ "metadata": {},
235
+ "outputs": [],
236
+ "source": [
237
+ "def create_model(X_train, time_step, no_outputs):\n",
238
+ " model = Sequential()\n",
239
+ " model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))\n",
240
+ " model.add(LSTM(units=50, return_sequences=True))\n",
241
+ " model.add(LSTM(units=time_step*no_outputs))\n",
242
+ " model.add(Dense(units=time_step*no_outputs))\n",
243
+ "\n",
244
+ " model.compile(optimizer='adam', loss='mean_squared_error')\n",
245
+ "\n",
246
+ " return model"
247
+ ]
248
+ },
249
+ {
250
+ "cell_type": "markdown",
251
+ "metadata": {},
252
+ "source": [
253
+ "### Model 1 (continous predictions)"
254
+ ]
255
+ },
256
+ {
257
+ "cell_type": "code",
258
+ "execution_count": 94,
259
+ "metadata": {},
260
+ "outputs": [
261
+ {
262
+ "name": "stdout",
263
+ "output_type": "stream",
264
+ "text": [
265
+ "Epoch 1/5\n",
266
+ "370/371 [============================>.] - ETA: 0s - loss: 0.0224\n",
267
+ "Epoch 1: val_loss improved from inf to 0.01162, saving model to lstm_energy_01.keras\n",
268
+ "371/371 [==============================] - 11s 15ms/step - loss: 0.0224 - val_loss: 0.0116\n",
269
+ "Epoch 2/5\n",
270
+ "368/371 [============================>.] - ETA: 0s - loss: 0.0139\n",
271
+ "Epoch 2: val_loss improved from 0.01162 to 0.01146, saving model to lstm_energy_01.keras\n",
272
+ "371/371 [==============================] - 5s 12ms/step - loss: 0.0139 - val_loss: 0.0115\n",
273
+ "Epoch 3/5\n",
274
+ "370/371 [============================>.] - ETA: 0s - loss: 0.0125\n",
275
+ "Epoch 3: val_loss improved from 0.01146 to 0.01132, saving model to lstm_energy_01.keras\n",
276
+ "371/371 [==============================] - 5s 13ms/step - loss: 0.0125 - val_loss: 0.0113\n",
277
+ "Epoch 4/5\n",
278
+ "367/371 [============================>.] - ETA: 0s - loss: 0.0119\n",
279
+ "Epoch 4: val_loss improved from 0.01132 to 0.01007, saving model to lstm_energy_01.keras\n",
280
+ "371/371 [==============================] - 5s 13ms/step - loss: 0.0119 - val_loss: 0.0101\n",
281
+ "Epoch 5/5\n",
282
+ "371/371 [==============================] - ETA: 0s - loss: 0.0117\n",
283
+ "Epoch 5: val_loss did not improve from 0.01007\n",
284
+ "371/371 [==============================] - 5s 13ms/step - loss: 0.0117 - val_loss: 0.0101\n"
285
+ ]
286
+ },
287
+ {
288
+ "data": {
289
+ "text/plain": [
290
+ "<keras.callbacks.History at 0x1da353bd790>"
291
+ ]
292
+ },
293
+ "execution_count": 94,
294
+ "metadata": {},
295
+ "output_type": "execute_result"
296
+ }
297
+ ],
298
+ "source": [
299
+ "train,test = traindataset,testdataset\n",
300
+ "steps_in_past = 7 \n",
301
+ "time_step = 24\n",
302
+ "no_inputs = 5\n",
303
+ "no_outputs = 2\n",
304
+ "def create_dataset(dataset,time_step):\n",
305
+ " x = [[] for _ in range(no_inputs)] \n",
306
+ " Y = [[] for _ in range(no_outputs)]\n",
307
+ " for i in range(time_step * steps_in_past, len(dataset) - time_step * steps_in_past): # -time_step is to ensure that the Y value has enough values\n",
308
+ " for j in range(no_inputs):\n",
309
+ " x[j].append(dataset[(i-time_step*steps_in_past):i, j])\n",
310
+ " for j in range(no_outputs):\n",
311
+ " Y[j].append(dataset[i:i+time_step, j]) \n",
312
+ " x = [np.array(feature_list) for feature_list in x]\n",
313
+ " x = np.stack(x,axis=1)\n",
314
+ " Y = [np.array(feature_list) for feature_list in Y] \n",
315
+ " Y = np.stack(Y,axis=1)\n",
316
+ " Y = np.reshape(Y, (Y.shape[0], time_step*no_outputs))\n",
317
+ " return x, Y\n",
318
+ "\n",
319
+ "\n",
320
+ "X_train, y_train = create_dataset(train, time_step)\n",
321
+ "X_test, y_test = create_dataset(test, time_step)\n",
322
+ "\n",
323
+ "model = create_model(X_train, time_step, no_outputs)\n",
324
+ "checkpoint_path = \"lstm_energy_01.keras\"\n",
325
+ "checkpoint_callback = ModelCheckpoint(filepath=checkpoint_path, monitor='val_loss', verbose=1, save_best_only=True, mode='min')\n",
326
+ "model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=5, batch_size=64, verbose=1, callbacks=[checkpoint_callback])"
327
+ ]
328
+ },
329
+ {
330
+ "cell_type": "code",
331
+ "execution_count": 95,
332
+ "metadata": {},
333
+ "outputs": [
334
+ {
335
+ "name": "stdout",
336
+ "output_type": "stream",
337
+ "text": [
338
+ "60/60 [==============================] - 0s 4ms/step - loss: 0.0101\n",
339
+ "60/60 [==============================] - 1s 3ms/step\n",
340
+ "Loss: 0.010141444392502308\n"
341
+ ]
342
+ }
343
+ ],
344
+ "source": [
345
+ "loss = model.evaluate(X_test, y_test)\n",
346
+ "test_predict1 = model.predict(X_test)\n",
347
+ "print(\"Loss: \", loss)\n",
348
+ "# Converting values back to the original scale\n",
349
+ "scalerBack = MinMaxScaler(feature_range=(mintest, maxtest))\n",
350
+ "test_predict2 = scalerBack.fit_transform(test_predict1)\n",
351
+ "y_test1 = scalerBack.fit_transform(y_test)\n"
352
+ ]
353
+ },
354
+ {
355
+ "cell_type": "code",
356
+ "execution_count": 100,
357
+ "metadata": {},
358
+ "outputs": [],
359
+ "source": [
360
+ "%matplotlib qt\n",
361
+ "\n",
362
+ "# Create a 3x3 grid of subplots\n",
363
+ "fig, axes = plt.subplots(3, 3, figsize=(10, 10))\n",
364
+ "\n",
365
+ "var = 15\n",
366
+ "# Loop over the value index\n",
367
+ "for i, ax in enumerate(axes.flat):\n",
368
+ " # Plot your data or perform any other operations\n",
369
+ " ax.plot(y_test1[var+i*9,0:time_step], label='Original Testing Data', color='blue')\n",
370
+ " ax.plot(test_predict2[var+i*9,0:time_step], label='Predicted Testing Data', color='red',alpha=0.8)\n",
371
+ " # ax.set_title(f'Plot {i+1}')\n",
372
+ " ax.set_title('Testing Data - Predicted vs Actual')\n",
373
+ " ax.set_xlabel('Time [hours]')\n",
374
+ " ax.set_ylabel('Energy Consumption [kW]') \n",
375
+ " ax.legend()\n",
376
+ "\n",
377
+ "# Adjust the spacing between subplots\n",
378
+ "plt.tight_layout()\n",
379
+ "\n",
380
+ "# Show the plot\n",
381
+ "plt.show()"
382
+ ]
383
+ },
384
+ {
385
+ "cell_type": "code",
386
+ "execution_count": null,
387
+ "metadata": {},
388
+ "outputs": [],
389
+ "source": [
390
+ "# Autoregressive prediction\n",
391
+ "X_pred = testdataset.copy()\n",
392
+ "for i in range(steps_in_past,steps_in_past*2):\n",
393
+ " xin = X_pred[i-steps_in_past:i].reshape((1, steps_in_past, no_outputs)) \n",
394
+ " X_pred[i] = model.predict(xin, verbose = 0)"
395
+ ]
396
+ },
397
+ {
398
+ "cell_type": "code",
399
+ "execution_count": null,
400
+ "metadata": {},
401
+ "outputs": [],
402
+ "source": [
403
+ "# Plot prediction vs actual for test data\n",
404
+ "plt.figure()\n",
405
+ "plt.plot(X_pred[steps_in_past:steps_in_past*2,0],':',label='LSTM')\n",
406
+ "plt.plot(testdataset[steps_in_past:steps_in_past*2,0],'--',label='Actual')\n",
407
+ "plt.legend()"
408
+ ]
409
+ },
410
+ {
411
+ "cell_type": "markdown",
412
+ "metadata": {},
413
+ "source": [
414
+ "### Model 2 (Predicting once per day)"
415
+ ]
416
+ },
417
+ {
418
+ "cell_type": "code",
419
+ "execution_count": 105,
420
+ "metadata": {},
421
+ "outputs": [
422
+ {
423
+ "name": "stdout",
424
+ "output_type": "stream",
425
+ "text": [
426
+ "Epoch 1/20\n",
427
+ "13/16 [=======================>......] - ETA: 0s - loss: 0.0893\n",
428
+ "Epoch 1: val_loss improved from inf to 0.02898, saving model to lstm_energy_01.keras\n",
429
+ "16/16 [==============================] - 6s 100ms/step - loss: 0.0820 - val_loss: 0.0290\n",
430
+ "Epoch 2/20\n",
431
+ "13/16 [=======================>......] - ETA: 0s - loss: 0.0316\n",
432
+ "Epoch 2: val_loss improved from 0.02898 to 0.02435, saving model to lstm_energy_01.keras\n",
433
+ "16/16 [==============================] - 0s 20ms/step - loss: 0.0310 - val_loss: 0.0243\n",
434
+ "Epoch 3/20\n",
435
+ "16/16 [==============================] - ETA: 0s - loss: 0.0242\n",
436
+ "Epoch 3: val_loss improved from 0.02435 to 0.01740, saving model to lstm_energy_01.keras\n",
437
+ "16/16 [==============================] - 0s 24ms/step - loss: 0.0242 - val_loss: 0.0174\n",
438
+ "Epoch 4/20\n",
439
+ "16/16 [==============================] - ETA: 0s - loss: 0.0213\n",
440
+ "Epoch 4: val_loss improved from 0.01740 to 0.01566, saving model to lstm_energy_01.keras\n",
441
+ "16/16 [==============================] - 0s 25ms/step - loss: 0.0213 - val_loss: 0.0157\n",
442
+ "Epoch 5/20\n",
443
+ "16/16 [==============================] - ETA: 0s - loss: 0.0189\n",
444
+ "Epoch 5: val_loss improved from 0.01566 to 0.01483, saving model to lstm_energy_01.keras\n",
445
+ "16/16 [==============================] - 0s 25ms/step - loss: 0.0189 - val_loss: 0.0148\n",
446
+ "Epoch 6/20\n",
447
+ "13/16 [=======================>......] - ETA: 0s - loss: 0.0184\n",
448
+ "Epoch 6: val_loss improved from 0.01483 to 0.01359, saving model to lstm_energy_01.keras\n",
449
+ "16/16 [==============================] - 0s 25ms/step - loss: 0.0182 - val_loss: 0.0136\n",
450
+ "Epoch 7/20\n",
451
+ "14/16 [=========================>....] - ETA: 0s - loss: 0.0177\n",
452
+ "Epoch 7: val_loss improved from 0.01359 to 0.01285, saving model to lstm_energy_01.keras\n",
453
+ "16/16 [==============================] - 0s 22ms/step - loss: 0.0175 - val_loss: 0.0128\n",
454
+ "Epoch 8/20\n",
455
+ "13/16 [=======================>......] - ETA: 0s - loss: 0.0168\n",
456
+ "Epoch 8: val_loss did not improve from 0.01285\n",
457
+ "16/16 [==============================] - 0s 20ms/step - loss: 0.0171 - val_loss: 0.0148\n",
458
+ "Epoch 9/20\n",
459
+ "14/16 [=========================>....] - ETA: 0s - loss: 0.0178\n",
460
+ "Epoch 9: val_loss did not improve from 0.01285\n",
461
+ "16/16 [==============================] - 0s 20ms/step - loss: 0.0175 - val_loss: 0.0143\n",
462
+ "Epoch 10/20\n",
463
+ "15/16 [===========================>..] - ETA: 0s - loss: 0.0165\n",
464
+ "Epoch 10: val_loss improved from 0.01285 to 0.01277, saving model to lstm_energy_01.keras\n",
465
+ "16/16 [==============================] - 0s 22ms/step - loss: 0.0166 - val_loss: 0.0128\n",
466
+ "Epoch 11/20\n",
467
+ "16/16 [==============================] - ETA: 0s - loss: 0.0164\n",
468
+ "Epoch 11: val_loss did not improve from 0.01277\n",
469
+ "16/16 [==============================] - 0s 23ms/step - loss: 0.0164 - val_loss: 0.0139\n",
470
+ "Epoch 12/20\n",
471
+ "15/16 [===========================>..] - ETA: 0s - loss: 0.0162\n",
472
+ "Epoch 12: val_loss improved from 0.01277 to 0.01235, saving model to lstm_energy_01.keras\n",
473
+ "16/16 [==============================] - 1s 33ms/step - loss: 0.0162 - val_loss: 0.0124\n",
474
+ "Epoch 13/20\n",
475
+ "15/16 [===========================>..] - ETA: 0s - loss: 0.0154\n",
476
+ "Epoch 13: val_loss did not improve from 0.01235\n",
477
+ "16/16 [==============================] - 0s 20ms/step - loss: 0.0153 - val_loss: 0.0131\n",
478
+ "Epoch 14/20\n",
479
+ "13/16 [=======================>......] - ETA: 0s - loss: 0.0156\n",
480
+ "Epoch 14: val_loss did not improve from 0.01235\n",
481
+ "16/16 [==============================] - 0s 21ms/step - loss: 0.0160 - val_loss: 0.0136\n",
482
+ "Epoch 15/20\n",
483
+ "13/16 [=======================>......] - ETA: 0s - loss: 0.0167\n",
484
+ "Epoch 15: val_loss did not improve from 0.01235\n",
485
+ "16/16 [==============================] - 0s 20ms/step - loss: 0.0164 - val_loss: 0.0125\n",
486
+ "Epoch 16/20\n",
487
+ "16/16 [==============================] - ETA: 0s - loss: 0.0149\n",
488
+ "Epoch 16: val_loss improved from 0.01235 to 0.01134, saving model to lstm_energy_01.keras\n",
489
+ "16/16 [==============================] - 0s 25ms/step - loss: 0.0149 - val_loss: 0.0113\n",
490
+ "Epoch 17/20\n",
491
+ "16/16 [==============================] - ETA: 0s - loss: 0.0147\n",
492
+ "Epoch 17: val_loss did not improve from 0.01134\n",
493
+ "16/16 [==============================] - 0s 21ms/step - loss: 0.0147 - val_loss: 0.0125\n",
494
+ "Epoch 18/20\n",
495
+ "15/16 [===========================>..] - ETA: 0s - loss: 0.0143\n",
496
+ "Epoch 18: val_loss did not improve from 0.01134\n",
497
+ "16/16 [==============================] - 0s 23ms/step - loss: 0.0143 - val_loss: 0.0116\n",
498
+ "Epoch 19/20\n",
499
+ "15/16 [===========================>..] - ETA: 0s - loss: 0.0138\n",
500
+ "Epoch 19: val_loss improved from 0.01134 to 0.01108, saving model to lstm_energy_01.keras\n",
501
+ "16/16 [==============================] - 0s 23ms/step - loss: 0.0138 - val_loss: 0.0111\n",
502
+ "Epoch 20/20\n",
503
+ "16/16 [==============================] - ETA: 0s - loss: 0.0137\n",
504
+ "Epoch 20: val_loss improved from 0.01108 to 0.01093, saving model to lstm_energy_01.keras\n",
505
+ "16/16 [==============================] - 0s 25ms/step - loss: 0.0137 - val_loss: 0.0109\n"
506
+ ]
507
+ },
508
+ {
509
+ "data": {
510
+ "text/plain": [
511
+ "<keras.callbacks.History at 0x1da50f44760>"
512
+ ]
513
+ },
514
+ "execution_count": 105,
515
+ "metadata": {},
516
+ "output_type": "execute_result"
517
+ }
518
+ ],
519
+ "source": [
520
+ "train,test = traindataset,testdataset\n",
521
+ "steps_in_past = 7 \n",
522
+ "time_step = 24\n",
523
+ "no_inputs = 5\n",
524
+ "no_outputs = 2\n",
525
+ "def create_dataset(dataset,time_step):\n",
526
+ " x = [[] for _ in range(no_inputs)] \n",
527
+ " Y = [[] for _ in range(no_outputs)]\n",
528
+ " for i in range(steps_in_past, round(len(dataset)/24) - steps_in_past): # -time_step is to ensure that the Y value has enough values\n",
529
+ " for j in range(no_inputs):\n",
530
+ " x[j].append(dataset[(i-steps_in_past)*time_step:i*time_step, j])\n",
531
+ " for j in range(no_outputs):\n",
532
+ " Y[j].append(dataset[i*time_step:(i+1)*time_step, j]) \n",
533
+ " x = [np.array(feature_list) for feature_list in x]\n",
534
+ " x = np.stack(x,axis=1)\n",
535
+ " Y = [np.array(feature_list) for feature_list in Y] \n",
536
+ " Y = np.stack(Y,axis=1)\n",
537
+ " Y = np.reshape(Y, (Y.shape[0], time_step*no_outputs))\n",
538
+ " return x, Y\n",
539
+ "\n",
540
+ "\n",
541
+ "X_train, y_train = create_dataset(train, time_step)\n",
542
+ "X_test, y_test = create_dataset(test, time_step)\n",
543
+ "\n",
544
+ "model2 = create_model(X_train, time_step, no_outputs)\n",
545
+ "checkpoint_path = \"lstm_energy_01.keras\"\n",
546
+ "checkpoint_callback = ModelCheckpoint(filepath=checkpoint_path, monitor='val_loss', verbose=1, save_best_only=True, mode='min')\n",
547
+ "model2.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=20, batch_size=64, verbose=1, callbacks=[checkpoint_callback])"
548
+ ]
549
+ },
550
+ {
551
+ "cell_type": "code",
552
+ "execution_count": 106,
553
+ "metadata": {},
554
+ "outputs": [
555
+ {
556
+ "name": "stdout",
557
+ "output_type": "stream",
558
+ "text": [
559
+ "3/3 [==============================] - 0s 5ms/step - loss: 0.0109\n",
560
+ "3/3 [==============================] - 1s 5ms/step\n",
561
+ "Loss: 0.010930849239230156\n"
562
+ ]
563
+ }
564
+ ],
565
+ "source": [
566
+ "loss = model2.evaluate(X_test, y_test)\n",
567
+ "test_predict1 = model2.predict(X_test)\n",
568
+ "print(\"Loss: \", loss)\n",
569
+ "# Converting values back to the original scale\n",
570
+ "scalerBack = MinMaxScaler(feature_range=(mintest, maxtest))\n",
571
+ "test_predict2 = scalerBack.fit_transform(test_predict1)\n",
572
+ "y_test1 = scalerBack.fit_transform(y_test)\n"
573
+ ]
574
+ },
575
+ {
576
+ "cell_type": "code",
577
+ "execution_count": 107,
578
+ "metadata": {},
579
+ "outputs": [],
580
+ "source": [
581
+ "%matplotlib qt\n",
582
+ "\n",
583
+ "# Create a 3x3 grid of subplots\n",
584
+ "fig, axes = plt.subplots(3, 3, figsize=(10, 10))\n",
585
+ "\n",
586
+ "var = 1\n",
587
+ "# Loop over the value index\n",
588
+ "for i, ax in enumerate(axes.flat):\n",
589
+ " # Plot your data or perform any other operations\n",
590
+ " ax.plot(y_test1[var+i,0:time_step], label='Original Testing Data', color='blue')\n",
591
+ " ax.plot(test_predict2[var+i,0:time_step], label='Predicted Testing Data', color='red',alpha=0.8)\n",
592
+ " # ax.set_title(f'Plot {i+1}')\n",
593
+ " ax.set_title('Testing Data - Predicted vs Actual')\n",
594
+ " ax.set_xlabel('Time [hours]')\n",
595
+ " ax.set_ylabel('Energy Consumption [kW]') \n",
596
+ " ax.legend()\n",
597
+ "\n",
598
+ "# Adjust the spacing between subplots\n",
599
+ "plt.tight_layout()\n",
600
+ "\n",
601
+ "# Show the plot\n",
602
+ "plt.show()"
603
+ ]
604
+ },
605
+ {
606
+ "cell_type": "markdown",
607
+ "metadata": {},
608
+ "source": [
609
+ "### Model 3 predicting based on past Mondays"
610
+ ]
611
+ },
612
+ {
613
+ "cell_type": "code",
614
+ "execution_count": 140,
615
+ "metadata": {},
616
+ "outputs": [
617
+ {
618
+ "name": "stdout",
619
+ "output_type": "stream",
620
+ "text": [
621
+ "Epoch 1/20\n",
622
+ "16/16 [==============================] - ETA: 0s - loss: 0.0888\n",
623
+ "Epoch 1: val_loss improved from inf to 0.02289, saving model to lstm_energy_01.keras\n",
624
+ "16/16 [==============================] - 7s 109ms/step - loss: 0.0888 - val_loss: 0.0229\n",
625
+ "Epoch 2/20\n",
626
+ "13/16 [=======================>......] - ETA: 0s - loss: 0.0288\n",
627
+ "Epoch 2: val_loss improved from 0.02289 to 0.01442, saving model to lstm_energy_01.keras\n",
628
+ "16/16 [==============================] - 0s 25ms/step - loss: 0.0276 - val_loss: 0.0144\n",
629
+ "Epoch 3/20\n",
630
+ "16/16 [==============================] - ETA: 0s - loss: 0.0197\n",
631
+ "Epoch 3: val_loss improved from 0.01442 to 0.01279, saving model to lstm_energy_01.keras\n",
632
+ "16/16 [==============================] - 0s 25ms/step - loss: 0.0197 - val_loss: 0.0128\n",
633
+ "Epoch 4/20\n",
634
+ "16/16 [==============================] - ETA: 0s - loss: 0.0186\n",
635
+ "Epoch 4: val_loss improved from 0.01279 to 0.01133, saving model to lstm_energy_01.keras\n",
636
+ "16/16 [==============================] - 0s 26ms/step - loss: 0.0186 - val_loss: 0.0113\n",
637
+ "Epoch 5/20\n",
638
+ "16/16 [==============================] - ETA: 0s - loss: 0.0183\n",
639
+ "Epoch 5: val_loss improved from 0.01133 to 0.01111, saving model to lstm_energy_01.keras\n",
640
+ "16/16 [==============================] - 0s 22ms/step - loss: 0.0183 - val_loss: 0.0111\n",
641
+ "Epoch 6/20\n",
642
+ "16/16 [==============================] - ETA: 0s - loss: 0.0183\n",
643
+ "Epoch 6: val_loss did not improve from 0.01111\n",
644
+ "16/16 [==============================] - 0s 24ms/step - loss: 0.0183 - val_loss: 0.0113\n",
645
+ "Epoch 7/20\n",
646
+ "16/16 [==============================] - ETA: 0s - loss: 0.0177\n",
647
+ "Epoch 7: val_loss did not improve from 0.01111\n",
648
+ "16/16 [==============================] - 0s 23ms/step - loss: 0.0177 - val_loss: 0.0112\n",
649
+ "Epoch 8/20\n",
650
+ "15/16 [===========================>..] - ETA: 0s - loss: 0.0176\n",
651
+ "Epoch 8: val_loss improved from 0.01111 to 0.01089, saving model to lstm_energy_01.keras\n",
652
+ "16/16 [==============================] - 0s 22ms/step - loss: 0.0177 - val_loss: 0.0109\n",
653
+ "Epoch 9/20\n",
654
+ "16/16 [==============================] - ETA: 0s - loss: 0.0170\n",
655
+ "Epoch 9: val_loss improved from 0.01089 to 0.01028, saving model to lstm_energy_01.keras\n",
656
+ "16/16 [==============================] - 0s 27ms/step - loss: 0.0170 - val_loss: 0.0103\n",
657
+ "Epoch 10/20\n",
658
+ "13/16 [=======================>......] - ETA: 0s - loss: 0.0164\n",
659
+ "Epoch 10: val_loss improved from 0.01028 to 0.00991, saving model to lstm_energy_01.keras\n",
660
+ "16/16 [==============================] - 0s 23ms/step - loss: 0.0164 - val_loss: 0.0099\n",
661
+ "Epoch 11/20\n",
662
+ "16/16 [==============================] - ETA: 0s - loss: 0.0162\n",
663
+ "Epoch 11: val_loss improved from 0.00991 to 0.00951, saving model to lstm_energy_01.keras\n",
664
+ "16/16 [==============================] - 0s 25ms/step - loss: 0.0162 - val_loss: 0.0095\n",
665
+ "Epoch 12/20\n",
666
+ "16/16 [==============================] - ETA: 0s - loss: 0.0156\n",
667
+ "Epoch 12: val_loss improved from 0.00951 to 0.00937, saving model to lstm_energy_01.keras\n",
668
+ "16/16 [==============================] - 0s 27ms/step - loss: 0.0156 - val_loss: 0.0094\n",
669
+ "Epoch 13/20\n",
670
+ "13/16 [=======================>......] - ETA: 0s - loss: 0.0151\n",
671
+ "Epoch 13: val_loss improved from 0.00937 to 0.00884, saving model to lstm_energy_01.keras\n",
672
+ "16/16 [==============================] - 0s 22ms/step - loss: 0.0151 - val_loss: 0.0088\n",
673
+ "Epoch 14/20\n",
674
+ "15/16 [===========================>..] - ETA: 0s - loss: 0.0151\n",
675
+ "Epoch 14: val_loss improved from 0.00884 to 0.00858, saving model to lstm_energy_01.keras\n",
676
+ "16/16 [==============================] - 0s 27ms/step - loss: 0.0150 - val_loss: 0.0086\n",
677
+ "Epoch 15/20\n",
678
+ "13/16 [=======================>......] - ETA: 0s - loss: 0.0140\n",
679
+ "Epoch 15: val_loss improved from 0.00858 to 0.00820, saving model to lstm_energy_01.keras\n",
680
+ "16/16 [==============================] - 0s 24ms/step - loss: 0.0141 - val_loss: 0.0082\n",
681
+ "Epoch 16/20\n",
682
+ "16/16 [==============================] - ETA: 0s - loss: 0.0138\n",
683
+ "Epoch 16: val_loss did not improve from 0.00820\n",
684
+ "16/16 [==============================] - 0s 22ms/step - loss: 0.0138 - val_loss: 0.0083\n",
685
+ "Epoch 17/20\n",
686
+ "15/16 [===========================>..] - ETA: 0s - loss: 0.0134\n",
687
+ "Epoch 17: val_loss improved from 0.00820 to 0.00776, saving model to lstm_energy_01.keras\n",
688
+ "16/16 [==============================] - 1s 34ms/step - loss: 0.0133 - val_loss: 0.0078\n",
689
+ "Epoch 18/20\n",
690
+ "16/16 [==============================] - ETA: 0s - loss: 0.0128\n",
691
+ "Epoch 18: val_loss improved from 0.00776 to 0.00728, saving model to lstm_energy_01.keras\n",
692
+ "16/16 [==============================] - 0s 27ms/step - loss: 0.0128 - val_loss: 0.0073\n",
693
+ "Epoch 19/20\n",
694
+ "16/16 [==============================] - ETA: 0s - loss: 0.0119\n",
695
+ "Epoch 19: val_loss improved from 0.00728 to 0.00668, saving model to lstm_energy_01.keras\n",
696
+ "16/16 [==============================] - 0s 27ms/step - loss: 0.0119 - val_loss: 0.0067\n",
697
+ "Epoch 20/20\n",
698
+ "13/16 [=======================>......] - ETA: 0s - loss: 0.0118\n",
699
+ "Epoch 20: val_loss improved from 0.00668 to 0.00635, saving model to lstm_energy_01.keras\n",
700
+ "16/16 [==============================] - 0s 23ms/step - loss: 0.0118 - val_loss: 0.0064\n"
701
+ ]
702
+ },
703
+ {
704
+ "data": {
705
+ "text/plain": [
706
+ "<keras.callbacks.History at 0x1da6976bcd0>"
707
+ ]
708
+ },
709
+ "execution_count": 140,
710
+ "metadata": {},
711
+ "output_type": "execute_result"
712
+ }
713
+ ],
714
+ "source": [
715
+ "train,test = traindataset,testdataset\n",
716
+ "days_in_past = 3 # number of days to look back \n",
717
+ "time_step = 24 # define a day in hours\n",
718
+ "no_inputs = 2\n",
719
+ "no_outputs = 2\n",
720
+ "def create_dataset(dataset,time_step):\n",
721
+ " x = [[] for _ in range(no_inputs*days_in_past)] \n",
722
+ " Y = [[] for _ in range(no_outputs)]\n",
723
+ " for i in range(days_in_past*7, round(len(dataset)/time_step) - days_in_past): # -time_step is to ensure that the Y value has enough values\n",
724
+ " for k in range(no_inputs*days_in_past):\n",
725
+ " if k > 3:\n",
726
+ " j = 1\n",
727
+ " l = k - 4\n",
728
+ " x[k].append(dataset[(i-l*7)*time_step:(i-l*7+1)*time_step, j])\n",
729
+ " else:\n",
730
+ " j = 0\n",
731
+ " x[k].append(dataset[(i-k*7)*time_step:(i-k*7+1)*time_step, j])\n",
732
+ " \n",
733
+ " for j in range(no_outputs):\n",
734
+ " Y[j].append(dataset[i*time_step:(i+1)*time_step, j]) \n",
735
+ " x = [np.array(feature_list) for feature_list in x]\n",
736
+ " x = np.stack(x,axis=1)\n",
737
+ " Y = [np.array(feature_list) for feature_list in Y] \n",
738
+ " Y = np.stack(Y,axis=1)\n",
739
+ " Y = np.reshape(Y, (Y.shape[0], time_step*no_outputs))\n",
740
+ " return x, Y\n",
741
+ "\n",
742
+ "\n",
743
+ "X_train, y_train = create_dataset(train, time_step)\n",
744
+ "X_test, y_test = create_dataset(test, time_step)\n",
745
+ "\n",
746
+ "model3 = create_model(X_train, time_step, no_outputs)\n",
747
+ "checkpoint_path = \"lstm_energy_01.keras\"\n",
748
+ "checkpoint_callback = ModelCheckpoint(filepath=checkpoint_path, monitor='val_loss', verbose=1, save_best_only=True, mode='min')\n",
749
+ "model3.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=20, batch_size=64, verbose=1, callbacks=[checkpoint_callback])"
750
+ ]
751
+ },
752
+ {
753
+ "cell_type": "code",
754
+ "execution_count": 142,
755
+ "metadata": {},
756
+ "outputs": [
757
+ {
758
+ "name": "stdout",
759
+ "output_type": "stream",
760
+ "text": [
761
+ "3/3 [==============================] - 0s 5ms/step - loss: 0.0064\n",
762
+ "3/3 [==============================] - 1s 4ms/step\n",
763
+ "Loss: 0.00635459553450346\n"
764
+ ]
765
+ }
766
+ ],
767
+ "source": [
768
+ "loss = model3.evaluate(X_test, y_test)\n",
769
+ "test_predict1 = model3.predict(X_test)\n",
770
+ "print(\"Loss: \", loss)\n",
771
+ "# Converting values back to the original scale\n",
772
+ "scalerBack = MinMaxScaler(feature_range=(mintest, maxtest))\n",
773
+ "test_predict2 = scalerBack.fit_transform(test_predict1)\n",
774
+ "y_test1 = scalerBack.fit_transform(y_test)\n"
775
+ ]
776
+ },
777
+ {
778
+ "cell_type": "code",
779
+ "execution_count": 143,
780
+ "metadata": {},
781
+ "outputs": [],
782
+ "source": [
783
+ "%matplotlib qt\n",
784
+ "\n",
785
+ "# Create a 3x3 grid of subplots\n",
786
+ "fig, axes = plt.subplots(3, 3, figsize=(10, 10))\n",
787
+ "\n",
788
+ "var = 1\n",
789
+ "# Loop over the value index\n",
790
+ "for i, ax in enumerate(axes.flat):\n",
791
+ " # Plot your data or perform any other operations\n",
792
+ " ax.plot(y_test1[var+i,0:time_step], label='Original Testing Data', color='blue')\n",
793
+ " ax.plot(test_predict2[var+i,0:time_step], label='Predicted Testing Data', color='red',alpha=0.8)\n",
794
+ " # ax.set_title(f'Plot {i+1}')\n",
795
+ " ax.set_title('Testing Data - Predicted vs Actual')\n",
796
+ " ax.set_xlabel('Time [hours]')\n",
797
+ " ax.set_ylabel('Energy Consumption [kW]') \n",
798
+ " ax.legend()\n",
799
+ "\n",
800
+ "# Adjust the spacing between subplots\n",
801
+ "plt.tight_layout()\n",
802
+ "\n",
803
+ "# Show the plot\n",
804
+ "plt.show()"
805
+ ]
806
+ },
807
+ {
808
+ "cell_type": "code",
809
+ "execution_count": null,
810
+ "metadata": {},
811
+ "outputs": [],
812
+ "source": []
813
+ },
814
+ {
815
+ "cell_type": "code",
816
+ "execution_count": null,
817
+ "metadata": {},
818
+ "outputs": [],
819
+ "source": []
820
+ }
821
+ ],
822
+ "metadata": {
823
+ "kernelspec": {
824
+ "display_name": "experiments",
825
+ "language": "python",
826
+ "name": "python3"
827
+ },
828
+ "language_info": {
829
+ "codemirror_mode": {
830
+ "name": "ipython",
831
+ "version": 3
832
+ },
833
+ "file_extension": ".py",
834
+ "mimetype": "text/x-python",
835
+ "name": "python",
836
+ "nbconvert_exporter": "python",
837
+ "pygments_lexer": "ipython3",
838
+ "version": "3.8.15"
839
+ }
840
+ },
841
+ "nbformat": 4,
842
+ "nbformat_minor": 2
843
+ }