Update fmda_rnn_train_and_save.ipynb
[notebooks.git] / fmda / rnn_workshop.ipynb
bloba388b36f721a0715dd55b1612e7ff864c2c3a1f1
2  "cells": [
3   {
4    "cell_type": "markdown",
5    "id": "244c2fb0-4339-476c-a2db-a641e124e25a",
6    "metadata": {},
7    "source": [
8     "# v2.2 exploration trying to make it work better"
9    ]
10   },
11   {
12    "cell_type": "code",
13    "execution_count": 58,
14    "id": "e6cc7920-e380-4b81-bac0-cd6840450e9a",
15    "metadata": {},
16    "outputs": [],
17    "source": [
18     "# Environment\n",
19     "import os\n",
20     "import os.path as osp\n",
21     "import numpy as np\n",
22     "import pandas as pd\n",
23     "import tensorflow as tf\n",
24     "import matplotlib.pyplot as plt\n",
25     "import sys\n",
26     "# Local modules\n",
27     "sys.path.append('..')\n",
28     "import reproducibility\n",
29     "import pandas as pd\n",
30     "from utils import print_dict_summary\n",
31     "from data_funcs import rmse, build_train_dict, combine_nested, subset_by_features\n",
32     "# from moisture_rnn import RNNParams, RNNData, RNN, RNN_LSTM, rnn_data_wrap\n",
33     "from moisture_rnn_pkl import pkl2train\n",
34     "from tensorflow.keras.callbacks import Callback\n",
35     "from utils import hash2\n",
36     "import copy\n",
37     "import logging\n",
38     "import pickle\n",
39     "from utils import logging_setup, read_yml, read_pkl, hash_ndarray, hash_weights, str2time\n",
40     "import yaml\n",
41     "import copy\n",
42     "import time"
43    ]
44   },
45   {
46    "cell_type": "code",
47    "execution_count": 10,
48    "id": "f58e8839-bf0e-4995-b966-c09e4df001ce",
49    "metadata": {},
50    "outputs": [],
51    "source": [
52     "logging_setup()"
53    ]
54   },
55   {
56    "cell_type": "markdown",
57    "id": "fae67b50-f916-45a7-bcc7-61995ba39449",
58    "metadata": {},
59    "source": [
60     "## Test Data"
61    ]
62   },
63   {
64    "cell_type": "code",
65    "execution_count": 11,
66    "id": "3efed1fa-9cda-4934-8a6c-edcf179c8755",
67    "metadata": {},
68    "outputs": [],
69    "source": [
70     "file_paths = ['data/fmda_rocky_202403-05_f05.pkl']"
71    ]
72   },
73   {
74    "cell_type": "code",
75    "execution_count": 12,
76    "id": "28fd3746-1861-4afa-ab7e-ac449fbed322",
77    "metadata": {},
78    "outputs": [
79     {
80      "data": {
81       "text/plain": [
82        "{'max_intp_time': 10,\n",
83        " 'zero_lag_threshold': 10,\n",
84        " 'hours': 720,\n",
85        " 'min_fm': 1,\n",
86        " 'max_fm': 90,\n",
87        " 'min_rain': 0,\n",
88        " 'max_rain': 100,\n",
89        " 'min_wind': 0,\n",
90        " 'max_wind': 35,\n",
91        " 'min_solar': 0,\n",
92        " 'max_solar': 1400,\n",
93        " 'min_soilm': 0,\n",
94        " 'features_all': ['Ed',\n",
95        "  'Ew',\n",
96        "  'solar',\n",
97        "  'wind',\n",
98        "  'elev',\n",
99        "  'lon',\n",
100        "  'lat',\n",
101        "  'soilm',\n",
102        "  'canopyw',\n",
103        "  'groundflux',\n",
104        "  'rain']}"
105       ]
106      },
107      "execution_count": 12,
108      "metadata": {},
109      "output_type": "execute_result"
110     }
111    ],
112    "source": [
113     "# Params used for data filtering\n",
114     "params_data = read_yml(\"params_data.yaml\") \n",
115     "params_data"
116    ]
117   },
118   {
119    "cell_type": "code",
120    "execution_count": 13,
121    "id": "c45cb8ef-41fc-4bf7-b506-dad5fd24abb3",
122    "metadata": {},
123    "outputs": [
124     {
125      "name": "stdout",
126      "output_type": "stream",
127      "text": [
128       "loading file data/fmda_rocky_202403-05_f05.pkl\n"
129      ]
130     }
131    ],
132    "source": [
133     "dat = read_pkl(file_paths[0])"
134    ]
135   },
136   {
137    "cell_type": "code",
138    "execution_count": 14,
139    "id": "3c960d69-4f8a-4abb-a5d9-ed6cf98f899b",
140    "metadata": {},
141    "outputs": [],
142    "source": [
143     "import importlib\n",
144     "import data_funcs\n",
145     "importlib.reload(data_funcs)\n",
146     "from data_funcs import build_train_dict"
147    ]
148   },
149   {
150    "cell_type": "code",
151    "execution_count": 15,
152    "id": "369cd913-85cb-4855-a80c-817d84637852",
153    "metadata": {},
154    "outputs": [],
155    "source": [
156     "params_data.update({'hours': None})"
157    ]
158   },
159   {
160    "cell_type": "code",
161    "execution_count": 16,
162    "id": "8cdc2ce8-45b4-4caa-81d9-646271ff2e97",
163    "metadata": {
164     "scrolled": true
165    },
166    "outputs": [
167     {
168      "name": "stdout",
169      "output_type": "stream",
170      "text": [
171       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
172       "Extracting data from input file data/fmda_rocky_202403-05_f05.pkl\n",
173       "loading file data/fmda_rocky_202403-05_f05.pkl\n",
174       "2024-10-21 11:27:35,248 - INFO - CPTC2_202403 HRRR.time time array increments are 1.0 hours\n",
175       "2024-10-21 11:27:35,275 - INFO - CPTC2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
176       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
177       "2024-10-21 11:27:35,366 - INFO - CHAC2_202403 HRRR.time time array increments are 1.0 hours\n",
178       "2024-10-21 11:27:35,394 - INFO - CHAC2 RAWS.time_raws time array increments are 1.0 hours\n",
179       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
180       "2024-10-21 11:27:35,487 - INFO - CHRC2_202403 HRRR.time time array increments are 1.0 hours\n",
181       "2024-10-21 11:27:35,512 - INFO - CHRC2 RAWS.time_raws time array increments are min 1.0 max 3.0\n",
182       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
183       "2024-10-21 11:27:35,604 - INFO - DYKC2_202403 HRRR.time time array increments are 1.0 hours\n",
184       "2024-10-21 11:27:35,639 - INFO - DYKC2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
185       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
186       "2024-10-21 11:27:35,735 - INFO - LKGC2_202403 HRRR.time time array increments are 1.0 hours\n",
187       "2024-10-21 11:27:35,768 - INFO - LKGC2 RAWS.time_raws time array increments are min 1.0 max 6.0\n",
188       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
189       "2024-10-21 11:27:35,864 - INFO - CCEC2_202403 HRRR.time time array increments are 1.0 hours\n",
190       "2024-10-21 11:27:35,892 - INFO - CCEC2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
191       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
192       "2024-10-21 11:27:35,981 - INFO - RDKC2_202403 HRRR.time time array increments are 1.0 hours\n",
193       "2024-10-21 11:27:36,008 - INFO - RDKC2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
194       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
195       "2024-10-21 11:27:36,104 - INFO - RFRC2_202403 HRRR.time time array increments are 1.0 hours\n",
196       "2024-10-21 11:27:36,140 - INFO - RFRC2 RAWS.time_raws time array increments are min 1.0 max 6.0\n",
197       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
198       "2024-10-21 11:27:36,240 - INFO - SAWC2_202403 HRRR.time time array increments are 1.0 hours\n",
199       "2024-10-21 11:27:36,272 - INFO - SAWC2 RAWS.time_raws time array increments are 1.0 hours\n",
200       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
201       "2024-10-21 11:27:36,374 - INFO - WLCC2_202403 HRRR.time time array increments are 1.0 hours\n",
202       "2024-10-21 11:27:36,404 - INFO - WLCC2 RAWS.time_raws time array increments are 1.0 hours\n",
203       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
204       "2024-10-21 11:27:36,499 - INFO - CCRU1_202403 HRRR.time time array increments are 1.0 hours\n",
205       "2024-10-21 11:27:36,527 - INFO - CCRU1 RAWS.time_raws time array increments are 1.0 hours\n",
206       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
207       "2024-10-21 11:27:36,617 - INFO - HSRU1_202403 HRRR.time time array increments are 1.0 hours\n",
208       "2024-10-21 11:27:36,655 - INFO - HSRU1 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
209       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
210       "2024-10-21 11:27:36,753 - INFO - YLSU1_202403 HRRR.time time array increments are 1.0 hours\n",
211       "2024-10-21 11:27:36,783 - INFO - YLSU1 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
212       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
213       "2024-10-21 11:27:36,895 - INFO - BRLW4_202403 HRRR.time time array increments are 1.0 hours\n",
214       "2024-10-21 11:27:36,927 - INFO - BRLW4 RAWS.time_raws time array increments are min 1.0 max 21.0\n",
215       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
216       "2024-10-21 11:27:37,034 - INFO - GTGW4_202403 HRRR.time time array increments are 1.0 hours\n",
217       "2024-10-21 11:27:37,066 - INFO - GTGW4 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
218       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
219       "2024-10-21 11:27:37,163 - INFO - SAWW4_202403 HRRR.time time array increments are 1.0 hours\n",
220       "2024-10-21 11:27:37,191 - INFO - SAWW4 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
221       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
222       "2024-10-21 11:27:37,280 - INFO - SPKW4_202403 HRRR.time time array increments are 1.0 hours\n",
223       "2024-10-21 11:27:37,308 - INFO - SPKW4 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
224       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
225       "2024-10-21 11:27:37,400 - INFO - ESPC2_202403 HRRR.time time array increments are 1.0 hours\n",
226       "2024-10-21 11:27:37,428 - INFO - ESPC2 RAWS.time_raws time array increments are min 1.0 max 8.0\n",
227       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
228       "2024-10-21 11:27:37,518 - INFO - MRFC2_202403 HRRR.time time array increments are 1.0 hours\n",
229       "2024-10-21 11:27:37,545 - INFO - MRFC2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
230       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
231       "2024-10-21 11:27:37,641 - INFO - PKLC2_202403 HRRR.time time array increments are 1.0 hours\n",
232       "2024-10-21 11:27:37,672 - INFO - PKLC2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
233       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
234       "2024-10-21 11:27:37,773 - INFO - BRAU1_202403 HRRR.time time array increments are 1.0 hours\n",
235       "2024-10-21 11:27:37,801 - INFO - BRAU1 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
236       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
237       "2024-10-21 11:27:37,890 - INFO - NLPU1_202403 HRRR.time time array increments are 1.0 hours\n",
238       "2024-10-21 11:27:37,918 - INFO - NLPU1 RAWS.time_raws time array increments are 1.0 hours\n",
239       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
240       "2024-10-21 11:27:38,009 - INFO - TS010_202403 HRRR.time time array increments are 1.0 hours\n",
241       "2024-10-21 11:27:38,017 - INFO - TS010 RAWS.time_raws time array increments are min 1.0 max 314.0\n",
242       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
243       "2024-10-21 11:27:38,093 - INFO - CUHC2_202403 HRRR.time time array increments are 1.0 hours\n",
244       "2024-10-21 11:27:38,120 - INFO - CUHC2 RAWS.time_raws time array increments are 1.0 hours\n",
245       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
246       "2024-10-21 11:27:38,206 - INFO - BAWC2_202403 HRRR.time time array increments are 1.0 hours\n",
247       "2024-10-21 11:27:38,233 - INFO - BAWC2 RAWS.time_raws time array increments are 1.0 hours\n",
248       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
249       "2024-10-21 11:27:38,321 - INFO - BTAC2_202403 HRRR.time time array increments are 1.0 hours\n",
250       "2024-10-21 11:27:38,348 - INFO - BTAC2 RAWS.time_raws time array increments are min 1.0 max 4.0\n",
251       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
252       "2024-10-21 11:27:38,435 - INFO - SOPC2_202403 HRRR.time time array increments are 1.0 hours\n",
253       "2024-10-21 11:27:38,462 - INFO - SOPC2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
254       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
255       "2024-10-21 11:27:38,550 - INFO - BMOC2_202403 HRRR.time time array increments are 1.0 hours\n",
256       "2024-10-21 11:27:38,579 - INFO - BMOC2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
257       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
258       "2024-10-21 11:27:38,674 - INFO - CYNC2_202403 HRRR.time time array increments are 1.0 hours\n",
259       "2024-10-21 11:27:38,702 - INFO - CYNC2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
260       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
261       "2024-10-21 11:27:38,790 - INFO - TR223_202403 HRRR.time time array increments are 1.0 hours\n",
262       "2024-10-21 11:27:38,805 - INFO - TR223 RAWS.time_raws time array increments are 1.0 hours\n",
263       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
264       "2024-10-21 11:27:38,885 - INFO - TCTM8_202403 HRRR.time time array increments are 1.0 hours\n",
265       "2024-10-21 11:27:38,915 - INFO - TCTM8 RAWS.time_raws time array increments are 1.0 hours\n",
266       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
267       "2024-10-21 11:27:39,003 - INFO - TR337_202403 HRRR.time time array increments are 1.0 hours\n",
268       "2024-10-21 11:27:39,013 - INFO - TR337 RAWS.time_raws time array increments are min 1.0 max 826.0\n",
269       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
270       "2024-10-21 11:27:39,124 - INFO - VLRW4_202403 HRRR.time time array increments are 1.0 hours\n",
271       "2024-10-21 11:27:39,137 - INFO - VLRW4 RAWS.time_raws time array increments are 1.0 hours\n",
272       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
273       "2024-10-21 11:27:39,210 - INFO - TR383_202403 HRRR.time time array increments are 1.0 hours\n",
274       "2024-10-21 11:27:39,228 - INFO - TR383 RAWS.time_raws time array increments are 1.0 hours\n",
275       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
276       "2024-10-21 11:27:39,305 - INFO - LEIW4_202403 HRRR.time time array increments are 1.0 hours\n",
277       "2024-10-21 11:27:39,331 - INFO - LEIW4 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
278       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
279       "2024-10-21 11:27:39,421 - INFO - TR390_202403 HRRR.time time array increments are 1.0 hours\n",
280       "2024-10-21 11:27:39,426 - INFO - TR390 RAWS.time_raws time array increments are 1.0 hours\n",
281       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
282       "2024-10-21 11:27:39,492 - INFO - TS001_202403 HRRR.time time array increments are 1.0 hours\n",
283       "2024-10-21 11:27:39,506 - INFO - TS001 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
284       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
285       "2024-10-21 11:27:39,583 - INFO - HSYN1_202403 HRRR.time time array increments are 1.0 hours\n",
286       "2024-10-21 11:27:39,611 - INFO - HSYN1 RAWS.time_raws time array increments are min 1.0 max 19.0\n",
287       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
288       "2024-10-21 11:27:39,703 - INFO - HRSN1_202403 HRRR.time time array increments are 1.0 hours\n",
289       "2024-10-21 11:27:39,730 - INFO - HRSN1 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
290       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
291       "2024-10-21 11:27:39,819 - INFO - SBFN1_202403 HRRR.time time array increments are 1.0 hours\n",
292       "2024-10-21 11:27:39,846 - INFO - SBFN1 RAWS.time_raws time array increments are min 1.0 max 6.0\n",
293       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
294       "2024-10-21 11:27:39,934 - INFO - DOHS2_202403 HRRR.time time array increments are 1.0 hours\n",
295       "2024-10-21 11:27:39,960 - INFO - DOHS2 RAWS.time_raws time array increments are min 1.0 max 3.0\n",
296       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
297       "2024-10-21 11:27:40,051 - INFO - BKFS2_202403 HRRR.time time array increments are 1.0 hours\n",
298       "2024-10-21 11:27:40,081 - INFO - BKFS2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
299       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
300       "2024-10-21 11:27:40,169 - INFO - CRRS2_202403 HRRR.time time array increments are 1.0 hours\n",
301       "2024-10-21 11:27:40,197 - INFO - CRRS2 RAWS.time_raws time array increments are min 1.0 max 3.0\n",
302       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
303       "2024-10-21 11:27:40,283 - INFO - NMOS2_202403 HRRR.time time array increments are 1.0 hours\n",
304       "2024-10-21 11:27:40,312 - INFO - NMOS2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
305       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
306       "2024-10-21 11:27:40,398 - INFO - RDCS2_202403 HRRR.time time array increments are 1.0 hours\n",
307       "2024-10-21 11:27:40,429 - INFO - RDCS2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
308       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
309       "2024-10-21 11:27:40,516 - INFO - TGSK1_202403 HRRR.time time array increments are 1.0 hours\n",
310       "2024-10-21 11:27:40,545 - INFO - TGSK1 RAWS.time_raws time array increments are min 1.0 max 3.0\n",
311       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
312       "2024-10-21 11:27:40,640 - INFO - QNRK1_202403 HRRR.time time array increments are 1.0 hours\n",
313       "2024-10-21 11:27:40,668 - INFO - QNRK1 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
314       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
315       "2024-10-21 11:27:40,756 - INFO - RESN1_202403 HRRR.time time array increments are 1.0 hours\n",
316       "2024-10-21 11:27:40,789 - INFO - RESN1 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
317       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
318       "2024-10-21 11:27:40,877 - INFO - VRFN1_202403 HRRR.time time array increments are 1.0 hours\n",
319       "2024-10-21 11:27:40,906 - INFO - VRFN1 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
320       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
321       "2024-10-21 11:27:40,995 - INFO - KSHC2_202403 HRRR.time time array increments are 1.0 hours\n",
322       "2024-10-21 11:27:41,023 - INFO - KSHC2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
323       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
324       "2024-10-21 11:27:41,115 - INFO - TR563_202403 HRRR.time time array increments are 1.0 hours\n",
325       "2024-10-21 11:27:41,142 - INFO - TR563 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
326       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
327       "2024-10-21 11:27:41,228 - INFO - CGLK1_202403 HRRR.time time array increments are 1.0 hours\n",
328       "2024-10-21 11:27:41,256 - INFO - CGLK1 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
329       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
330       "2024-10-21 11:27:41,345 - INFO - MRLS2_202403 HRRR.time time array increments are 1.0 hours\n",
331       "2024-10-21 11:27:41,372 - INFO - MRLS2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
332       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
333       "2024-10-21 11:27:41,462 - INFO - TR755_202403 HRRR.time time array increments are 1.0 hours\n",
334       "2024-10-21 11:27:41,467 - INFO - TR755 RAWS.time_raws time array increments are 1.0 hours\n",
335       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
336       "2024-10-21 11:27:41,535 - INFO - DEOI4_202403 HRRR.time time array increments are 1.0 hours\n",
337       "2024-10-21 11:27:41,561 - INFO - DEOI4 RAWS.time_raws time array increments are min 1.0 max 20.0\n",
338       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
339       "2024-10-21 11:27:41,650 - INFO - CCYC2_202403 HRRR.time time array increments are 1.0 hours\n",
340       "2024-10-21 11:27:41,677 - INFO - CCYC2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
341       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
342       "2024-10-21 11:27:41,766 - INFO - HBOM8_202403 HRRR.time time array increments are 1.0 hours\n",
343       "2024-10-21 11:27:41,793 - INFO - HBOM8 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
344       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
345       "2024-10-21 11:27:41,882 - INFO - TR937_202403 HRRR.time time array increments are 1.0 hours\n",
346       "2024-10-21 11:27:41,892 - INFO - TR937 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
347       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
348       "2024-10-21 11:27:41,967 - INFO - TR956_202403 HRRR.time time array increments are 1.0 hours\n",
349       "2024-10-21 11:27:41,983 - INFO - TR956 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
350       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
351       "2024-10-21 11:27:42,060 - INFO - PINS2_202403 HRRR.time time array increments are 1.0 hours\n",
352       "2024-10-21 11:27:42,088 - INFO - PINS2 RAWS.time_raws time array increments are min 1.0 max 25.0\n",
353       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
354       "2024-10-21 11:27:42,175 - INFO - DVLW4_202403 HRRR.time time array increments are 1.0 hours\n",
355       "2024-10-21 11:27:42,202 - INFO - DVLW4 RAWS.time_raws time array increments are 1.0 hours\n",
356       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
357       "2024-10-21 11:27:42,295 - INFO - TS040_202403 HRRR.time time array increments are 1.0 hours\n",
358       "2024-10-21 11:27:42,312 - INFO - TS040 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
359       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
360       "2024-10-21 11:27:42,390 - INFO - RLAS2_202403 HRRR.time time array increments are 1.0 hours\n",
361       "2024-10-21 11:27:42,417 - INFO - RLAS2 RAWS.time_raws time array increments are 1.0 hours\n",
362       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
363       "2024-10-21 11:27:42,506 - INFO - RHUS2_202403 HRRR.time time array increments are 1.0 hours\n",
364       "2024-10-21 11:27:42,530 - INFO - RHUS2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
365       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
366       "2024-10-21 11:27:42,617 - INFO - JNSC2_202403 HRRR.time time array increments are 1.0 hours\n",
367       "2024-10-21 11:27:42,645 - INFO - JNSC2 RAWS.time_raws time array increments are 1.0 hours\n",
368       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
369       "2024-10-21 11:27:42,733 - INFO - LSHI4_202403 HRRR.time time array increments are 1.0 hours\n",
370       "2024-10-21 11:27:42,760 - INFO - LSHI4 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
371       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
372       "2024-10-21 11:27:42,850 - INFO - TS305_202403 HRRR.time time array increments are 1.0 hours\n",
373       "2024-10-21 11:27:42,853 - INFO - TS305 RAWS.time_raws time array increments are min 1.0 max 1496.0\n",
374       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
375       "2024-10-21 11:27:42,924 - INFO - TS343_202403 HRRR.time time array increments are 1.0 hours\n",
376       "2024-10-21 11:27:42,925 - INFO - TS343 RAWS.time_raws time array increments are 1.0 hours\n",
377       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
378       "2024-10-21 11:27:42,991 - INFO - LLKS2_202403 HRRR.time time array increments are 1.0 hours\n",
379       "2024-10-21 11:27:43,019 - INFO - LLKS2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
380       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
381       "2024-10-21 11:27:43,108 - INFO - AGTN1_202403 HRRR.time time array increments are 1.0 hours\n",
382       "2024-10-21 11:27:43,138 - INFO - AGTN1 RAWS.time_raws time array increments are min 1.0 max 3.0\n",
383       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
384       "2024-10-21 11:27:43,227 - INFO - WCAS2_202403 HRRR.time time array increments are 1.0 hours\n",
385       "2024-10-21 11:27:43,253 - INFO - WCAS2 RAWS.time_raws time array increments are 1.0 hours\n",
386       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
387       "2024-10-21 11:27:43,347 - INFO - RHRS2_202403 HRRR.time time array increments are 1.0 hours\n",
388       "2024-10-21 11:27:43,375 - INFO - RHRS2 RAWS.time_raws time array increments are 1.0 hours\n",
389       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
390       "2024-10-21 11:27:43,468 - INFO - TS485_202403 HRRR.time time array increments are 1.0 hours\n",
391       "2024-10-21 11:27:43,500 - INFO - TS485 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
392       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
393       "2024-10-21 11:27:43,601 - INFO - TS578_202403 HRRR.time time array increments are 1.0 hours\n",
394       "2024-10-21 11:27:43,634 - INFO - TS578 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
395       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
396       "2024-10-21 11:27:43,721 - INFO - TS582_202403 HRRR.time time array increments are 1.0 hours\n",
397       "2024-10-21 11:27:43,736 - INFO - TS582 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
398       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
399       "2024-10-21 11:27:43,812 - INFO - HITI4_202403 HRRR.time time array increments are 1.0 hours\n",
400       "2024-10-21 11:27:43,839 - INFO - HITI4 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
401       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
402       "2024-10-21 11:27:43,925 - INFO - KRNK1_202403 HRRR.time time array increments are 1.0 hours\n",
403       "2024-10-21 11:27:43,951 - INFO - KRNK1 RAWS.time_raws time array increments are 1.0 hours\n",
404       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
405       "2024-10-21 11:27:44,041 - INFO - AENC2_202403 HRRR.time time array increments are 1.0 hours\n",
406       "2024-10-21 11:27:44,066 - INFO - AENC2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
407       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
408       "2024-10-21 11:27:44,154 - INFO - LSTC2_202403 HRRR.time time array increments are 1.0 hours\n",
409       "2024-10-21 11:27:44,182 - INFO - LSTC2 RAWS.time_raws time array increments are 1.0 hours\n",
410       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
411       "2024-10-21 11:27:44,268 - INFO - LPFC2_202403 HRRR.time time array increments are 1.0 hours\n",
412       "2024-10-21 11:27:44,295 - INFO - LPFC2 RAWS.time_raws time array increments are 1.0 hours\n",
413       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
414       "2024-10-21 11:27:44,382 - INFO - LOOC2_202403 HRRR.time time array increments are 1.0 hours\n",
415       "2024-10-21 11:27:44,395 - INFO - LOOC2 RAWS.time_raws time array increments are min 1.0 max 3.0\n",
416       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
417       "2024-10-21 11:27:44,469 - INFO - TS661_202403 HRRR.time time array increments are 1.0 hours\n",
418       "2024-10-21 11:27:44,480 - INFO - TS661 RAWS.time_raws time array increments are 1.0 hours\n",
419       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
420       "2024-10-21 11:27:44,552 - INFO - TS872_202403 HRRR.time time array increments are 1.0 hours\n",
421       "2024-10-21 11:27:44,578 - INFO - TS872 RAWS.time_raws time array increments are min 1.0 max 3.0\n",
422       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
423       "2024-10-21 11:27:44,666 - INFO - TS897_202403 HRRR.time time array increments are 1.0 hours\n",
424       "2024-10-21 11:27:44,692 - INFO - TS897 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
425       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
426       "2024-10-21 11:27:44,779 - INFO - RRAC2_202403 HRRR.time time array increments are 1.0 hours\n",
427       "2024-10-21 11:27:44,808 - INFO - RRAC2 RAWS.time_raws time array increments are min 1.0 max 15.0\n",
428       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
429       "2024-10-21 11:27:44,897 - INFO - FKTC2_202403 HRRR.time time array increments are 1.0 hours\n",
430       "2024-10-21 11:27:44,923 - INFO - FKTC2 RAWS.time_raws time array increments are min 1.0 max 15.0\n",
431       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
432       "2024-10-21 11:27:45,015 - INFO - DMTC2_202403 HRRR.time time array increments are 1.0 hours\n",
433       "2024-10-21 11:27:45,021 - INFO - DMTC2 RAWS.time_raws time array increments are 1.0 hours\n",
434       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
435       "2024-10-21 11:27:45,087 - INFO - WPKS2_202403 HRRR.time time array increments are 1.0 hours\n",
436       "2024-10-21 11:27:45,113 - INFO - WPKS2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
437       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
438       "2024-10-21 11:27:45,205 - INFO - KSEC2_202403 HRRR.time time array increments are 1.0 hours\n",
439       "2024-10-21 11:27:45,234 - INFO - KSEC2 RAWS.time_raws time array increments are 1.0 hours\n",
440       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
441       "2024-10-21 11:27:45,323 - INFO - TS946_202403 HRRR.time time array increments are 1.0 hours\n",
442       "2024-10-21 11:27:45,339 - INFO - TS946 RAWS.time_raws time array increments are min 1.0 max 364.0\n",
443       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
444       "2024-10-21 11:27:45,415 - INFO - TS954_202403 HRRR.time time array increments are 1.0 hours\n",
445       "2024-10-21 11:27:45,440 - INFO - TS954 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
446       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
447       "2024-10-21 11:27:45,526 - INFO - TS964_202403 HRRR.time time array increments are 1.0 hours\n",
448       "2024-10-21 11:27:45,541 - INFO - TS964 RAWS.time_raws time array increments are min 1.0 max 3.0\n",
449       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
450       "2024-10-21 11:27:45,617 - INFO - TT065_202403 HRRR.time time array increments are 1.0 hours\n",
451       "2024-10-21 11:27:45,644 - INFO - TT065 RAWS.time_raws time array increments are min 1.0 max 56.0\n",
452       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
453       "2024-10-21 11:27:45,729 - INFO - TT081_202403 HRRR.time time array increments are 1.0 hours\n",
454       "2024-10-21 11:27:45,731 - INFO - TT081 RAWS.time_raws time array increments are 0.25 hours\n",
455       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
456       "2024-10-21 11:27:45,796 - INFO - CSPS2_202403 HRRR.time time array increments are 1.0 hours\n",
457       "2024-10-21 11:27:45,822 - INFO - CSPS2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
458       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
459       "2024-10-21 11:27:45,917 - INFO - SDSS2_202403 HRRR.time time array increments are 1.0 hours\n",
460       "2024-10-21 11:27:45,943 - INFO - SDSS2 RAWS.time_raws time array increments are 1.0 hours\n",
461       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
462       "2024-10-21 11:27:46,033 - INFO - SHDS2_202403 HRRR.time time array increments are 1.0 hours\n",
463       "2024-10-21 11:27:46,060 - INFO - SHDS2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
464       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
465       "2024-10-21 11:27:46,148 - INFO - RWES2_202403 HRRR.time time array increments are 1.0 hours\n",
466       "2024-10-21 11:27:46,176 - INFO - RWES2 RAWS.time_raws time array increments are min 1.0 max 3.0\n",
467       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
468       "2024-10-21 11:27:46,268 - INFO - TT283_202403 HRRR.time time array increments are 1.0 hours\n",
469       "2024-10-21 11:27:46,278 - INFO - TT283 RAWS.time_raws time array increments are 1.0 hours\n",
470       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
471       "2024-10-21 11:27:46,348 - INFO - PMTW4_202403 HRRR.time time array increments are 1.0 hours\n",
472       "2024-10-21 11:27:46,377 - INFO - PMTW4 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
473       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
474       "2024-10-21 11:27:46,463 - INFO - TT364_202403 HRRR.time time array increments are 1.0 hours\n",
475       "2024-10-21 11:27:46,468 - INFO - TT364 RAWS.time_raws time array increments are 1.0 hours\n",
476       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
477       "2024-10-21 11:27:46,532 - INFO - BEYC2_202403 HRRR.time time array increments are 1.0 hours\n",
478       "2024-10-21 11:27:46,561 - INFO - BEYC2 RAWS.time_raws time array increments are 1.0 hours\n",
479       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
480       "2024-10-21 11:27:46,650 - INFO - TT456_202403 HRRR.time time array increments are 1.0 hours\n",
481       "2024-10-21 11:27:46,670 - INFO - TT456 RAWS.time_raws time array increments are 1.0 hours\n",
482       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
483       "2024-10-21 11:27:46,752 - INFO - MTRN1_202403 HRRR.time time array increments are 1.0 hours\n",
484       "2024-10-21 11:27:46,779 - INFO - MTRN1 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
485       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
486       "2024-10-21 11:27:46,866 - INFO - MKVN1_202403 HRRR.time time array increments are 1.0 hours\n",
487       "2024-10-21 11:27:46,893 - INFO - MKVN1 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
488       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
489       "2024-10-21 11:27:46,984 - INFO - TT561_202403 HRRR.time time array increments are 1.0 hours\n",
490       "2024-10-21 11:27:47,012 - INFO - TT561 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
491       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
492       "2024-10-21 11:27:47,099 - INFO - TT562_202403 HRRR.time time array increments are 1.0 hours\n",
493       "2024-10-21 11:27:47,127 - INFO - TT562 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
494       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
495       "2024-10-21 11:27:47,212 - INFO - TT563_202403 HRRR.time time array increments are 1.0 hours\n",
496       "2024-10-21 11:27:47,241 - INFO - TT563 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
497       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
498       "2024-10-21 11:27:47,327 - INFO - TT564_202403 HRRR.time time array increments are 1.0 hours\n",
499       "2024-10-21 11:27:47,354 - INFO - TT564 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
500       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
501       "2024-10-21 11:27:47,443 - INFO - TT565_202403 HRRR.time time array increments are 1.0 hours\n",
502       "2024-10-21 11:27:47,476 - INFO - TT565 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
503       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
504       "2024-10-21 11:27:47,566 - INFO - TT566_202403 HRRR.time time array increments are 1.0 hours\n",
505       "2024-10-21 11:27:47,595 - INFO - TT566 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
506       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
507       "2024-10-21 11:27:47,692 - INFO - TT567_202403 HRRR.time time array increments are 1.0 hours\n",
508       "2024-10-21 11:27:47,719 - INFO - TT567 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
509       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
510       "2024-10-21 11:27:47,808 - INFO - TT568_202403 HRRR.time time array increments are 1.0 hours\n",
511       "2024-10-21 11:27:47,835 - INFO - TT568 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
512       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
513       "2024-10-21 11:27:47,924 - INFO - TT574_202403 HRRR.time time array increments are 1.0 hours\n",
514       "2024-10-21 11:27:47,942 - INFO - TT574 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
515       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
516       "2024-10-21 11:27:48,019 - INFO - SFRS2_202403 HRRR.time time array increments are 1.0 hours\n",
517       "2024-10-21 11:27:48,046 - INFO - SFRS2 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
518       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
519       "2024-10-21 11:27:48,133 - INFO - TT590_202403 HRRR.time time array increments are 1.0 hours\n",
520       "2024-10-21 11:27:48,143 - INFO - TT590 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
521       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
522       "2024-10-21 11:27:48,214 - INFO - TT591_202403 HRRR.time time array increments are 1.0 hours\n",
523       "2024-10-21 11:27:48,241 - INFO - TT591 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
524       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
525       "2024-10-21 11:27:48,336 - INFO - TT610_202403 HRRR.time time array increments are 1.0 hours\n",
526       "2024-10-21 11:27:48,363 - INFO - TT610 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
527       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
528       "2024-10-21 11:27:48,464 - INFO - TT681_202403 HRRR.time time array increments are 1.0 hours\n",
529       "2024-10-21 11:27:48,473 - INFO - TT681 RAWS.time_raws time array increments are min 1.0 max 918.0\n",
530       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
531       "2024-10-21 11:27:48,543 - INFO - TT689_202403 HRRR.time time array increments are 1.0 hours\n",
532       "2024-10-21 11:27:48,569 - INFO - TT689 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
533       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
534       "2024-10-21 11:27:48,656 - INFO - TT695_202403 HRRR.time time array increments are 1.0 hours\n",
535       "2024-10-21 11:27:48,682 - INFO - TT695 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
536       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
537       "2024-10-21 11:27:48,773 - INFO - TT696_202403 HRRR.time time array increments are 1.0 hours\n",
538       "2024-10-21 11:27:48,799 - INFO - TT696 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
539       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
540       "2024-10-21 11:27:48,888 - INFO - C3SKI_202403 HRRR.time time array increments are 1.0 hours\n",
541       "2024-10-21 11:27:48,914 - INFO - C3SKI RAWS.time_raws time array increments are min 1.0 max 19.0\n",
542       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
543       "2024-10-21 11:27:49,000 - INFO - TT784_202403 HRRR.time time array increments are 1.0 hours\n",
544       "2024-10-21 11:27:49,010 - INFO - TT784 RAWS.time_raws time array increments are min 1.0 max 2.0\n",
545       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
546       "2024-10-21 11:27:49,082 - INFO - TT787_202403 HRRR.time time array increments are 1.0 hours\n",
547       "2024-10-21 11:27:49,108 - INFO - TT787 RAWS.time_raws time array increments are 1.0 hours\n",
548       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
549       "2024-10-21 11:27:49,195 - INFO - TT788_202403 HRRR.time time array increments are 1.0 hours\n",
550       "2024-10-21 11:27:49,221 - INFO - TT788 RAWS.time_raws time array increments are 1.0 hours\n",
551       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
552       "2024-10-21 11:27:49,311 - INFO - TT789_202403 HRRR.time time array increments are 1.0 hours\n",
553       "2024-10-21 11:27:49,340 - INFO - TT789 RAWS.time_raws time array increments are 1.0 hours\n",
554       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
555       "2024-10-21 11:27:49,426 - INFO - TT813_202403 HRRR.time time array increments are 1.0 hours\n",
556       "2024-10-21 11:27:49,441 - INFO - TT813 RAWS.time_raws time array increments are 1.0 hours\n",
557       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
558       "2024-10-21 11:27:49,517 - INFO - TT815_202403 HRRR.time time array increments are 1.0 hours\n",
559       "2024-10-21 11:27:49,527 - INFO - TT815 RAWS.time_raws time array increments are min 1.0 max 7.0\n",
560       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
561       "2024-10-21 11:27:49,596 - INFO - TT816_202403 HRRR.time time array increments are 1.0 hours\n",
562       "2024-10-21 11:27:49,607 - INFO - TT816 RAWS.time_raws time array increments are 1.0 hours\n",
563       "Shifted time based on forecast step 3. Dropping NA at beginning of feature data and corresponding times of output data\n",
564       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
565       "Case: CPTC2_202403\n",
566       "Flagging case CPTC2_202403 for zero lag stretches greater than param 10\n",
567       "Flagging case CPTC2_202403 for constant linear stretches greater than param 10\n",
568       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
569       "Case: CHAC2_202403\n",
570       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
571       "Case: CHRC2_202403\n",
572       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
573       "Case: DYKC2_202403\n",
574       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
575       "Case: LKGC2_202403\n",
576       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
577       "Case: CCEC2_202403\n",
578       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
579       "Case: RDKC2_202403\n",
580       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
581       "Case: RFRC2_202403\n",
582       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
583       "Case: SAWC2_202403\n",
584       "Flagging case SAWC2_202403 for zero lag stretches greater than param 10\n",
585       "Flagging case SAWC2_202403 for constant linear stretches greater than param 10\n",
586       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
587       "Case: WLCC2_202403\n",
588       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
589       "Case: CCRU1_202403\n",
590       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
591       "Case: HSRU1_202403\n",
592       "Flagging case HSRU1_202403 for zero lag stretches greater than param 10\n",
593       "Flagging case HSRU1_202403 for constant linear stretches greater than param 10\n",
594       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
595       "Case: YLSU1_202403\n",
596       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
597       "Case: BRLW4_202403\n",
598       "Flagging case BRLW4_202403 for constant linear stretches greater than param 10\n",
599       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
600       "Case: GTGW4_202403\n",
601       "Flagging case GTGW4_202403 for zero lag stretches greater than param 10\n",
602       "Flagging case GTGW4_202403 for constant linear stretches greater than param 10\n",
603       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
604       "Case: SAWW4_202403\n",
605       "Flagging case SAWW4_202403 for zero lag stretches greater than param 10\n",
606       "Flagging case SAWW4_202403 for constant linear stretches greater than param 10\n",
607       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
608       "Case: SPKW4_202403\n",
609       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
610       "Case: ESPC2_202403\n",
611       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
612       "Case: MRFC2_202403\n",
613       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
614       "Case: PKLC2_202403\n",
615       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
616       "Case: BRAU1_202403\n",
617       "Flagging case BRAU1_202403 for zero lag stretches greater than param 10\n",
618       "Flagging case BRAU1_202403 for constant linear stretches greater than param 10\n",
619       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
620       "Case: NLPU1_202403\n",
621       "Flagging case NLPU1_202403 for zero lag stretches greater than param 10\n",
622       "Flagging case NLPU1_202403 for constant linear stretches greater than param 10\n",
623       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
624       "Case: TS010_202403\n",
625       "Flagging case TS010_202403 for zero lag stretches greater than param 10\n",
626       "Flagging case TS010_202403 for constant linear stretches greater than param 10\n",
627       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
628       "Case: CUHC2_202403\n",
629       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
630       "Case: BAWC2_202403\n",
631       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
632       "Case: BTAC2_202403\n",
633       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
634       "Case: SOPC2_202403\n",
635       "Flagging case SOPC2_202403 for zero lag stretches greater than param 10\n",
636       "Flagging case SOPC2_202403 for constant linear stretches greater than param 10\n",
637       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
638       "Case: BMOC2_202403\n",
639       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
640       "Case: CYNC2_202403\n",
641       "Flagging case CYNC2_202403 for zero lag stretches greater than param 10\n",
642       "Flagging case CYNC2_202403 for constant linear stretches greater than param 10\n",
643       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
644       "Case: TR223_202403\n",
645       "Flagging case TR223_202403 for zero lag stretches greater than param 10\n",
646       "Flagging case TR223_202403 for constant linear stretches greater than param 10\n",
647       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
648       "Case: TCTM8_202403\n",
649       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
650       "Case: TR337_202403\n",
651       "Flagging case TR337_202403 for zero lag stretches greater than param 10\n",
652       "Flagging case TR337_202403 for constant linear stretches greater than param 10\n",
653       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
654       "Case: VLRW4_202403\n",
655       "Flagging case VLRW4_202403 for zero lag stretches greater than param 10\n",
656       "Flagging case VLRW4_202403 for constant linear stretches greater than param 10\n",
657       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
658       "Case: TR383_202403\n",
659       "Flagging case TR383_202403 for zero lag stretches greater than param 10\n",
660       "Flagging case TR383_202403 for constant linear stretches greater than param 10\n",
661       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
662       "Case: LEIW4_202403\n",
663       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
664       "Case: TR390_202403\n",
665       "Flagging case TR390_202403 for zero lag stretches greater than param 10\n",
666       "Flagging case TR390_202403 for constant linear stretches greater than param 10\n",
667       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
668       "Case: TS001_202403\n",
669       "Flagging case TS001_202403 for zero lag stretches greater than param 10\n",
670       "Flagging case TS001_202403 for constant linear stretches greater than param 10\n",
671       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
672       "Case: HSYN1_202403\n",
673       "Flagging case HSYN1_202403 for constant linear stretches greater than param 10\n",
674       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
675       "Case: HRSN1_202403\n",
676       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
677       "Case: SBFN1_202403\n",
678       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
679       "Case: DOHS2_202403\n",
680       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
681       "Case: BKFS2_202403\n",
682       "Flagging case BKFS2_202403 for zero lag stretches greater than param 10\n",
683       "Flagging case BKFS2_202403 for constant linear stretches greater than param 10\n",
684       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
685       "Case: CRRS2_202403\n",
686       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
687       "Case: NMOS2_202403\n",
688       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
689       "Case: RDCS2_202403\n",
690       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
691       "Case: TGSK1_202403\n",
692       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
693       "Case: QNRK1_202403\n",
694       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
695       "Case: RESN1_202403\n",
696       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
697       "Case: VRFN1_202403\n",
698       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
699       "Case: KSHC2_202403\n",
700       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
701       "Case: TR563_202403\n",
702       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
703       "Case: CGLK1_202403\n",
704       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
705       "Case: MRLS2_202403\n",
706       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
707       "Case: TR755_202403\n",
708       "Flagging case TR755_202403 for zero lag stretches greater than param 10\n",
709       "Flagging case TR755_202403 for constant linear stretches greater than param 10\n",
710       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
711       "Case: DEOI4_202403\n",
712       "Flagging case DEOI4_202403 for constant linear stretches greater than param 10\n",
713       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
714       "Case: CCYC2_202403\n",
715       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
716       "Case: HBOM8_202403\n",
717       "Flagging case HBOM8_202403 for zero lag stretches greater than param 10\n",
718       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
719       "Case: TR937_202403\n",
720       "Flagging case TR937_202403 for zero lag stretches greater than param 10\n",
721       "Flagging case TR937_202403 for constant linear stretches greater than param 10\n",
722       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
723       "Case: TR956_202403\n",
724       "Flagging case TR956_202403 for zero lag stretches greater than param 10\n",
725       "Flagging case TR956_202403 for constant linear stretches greater than param 10\n",
726       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
727       "Case: PINS2_202403\n",
728       "Flagging case PINS2_202403 for constant linear stretches greater than param 10\n",
729       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
730       "Case: DVLW4_202403\n",
731       "Flagging case DVLW4_202403 for zero lag stretches greater than param 10\n",
732       "Flagging case DVLW4_202403 for constant linear stretches greater than param 10\n",
733       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
734       "Case: TS040_202403\n",
735       "Flagging case TS040_202403 for zero lag stretches greater than param 10\n",
736       "Flagging case TS040_202403 for constant linear stretches greater than param 10\n",
737       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
738       "Case: RLAS2_202403\n",
739       "Flagging case RLAS2_202403 for zero lag stretches greater than param 10\n",
740       "Flagging case RLAS2_202403 for constant linear stretches greater than param 10\n",
741       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
742       "Case: RHUS2_202403\n",
743       "Flagging case RHUS2_202403 for zero lag stretches greater than param 10\n",
744       "Flagging case RHUS2_202403 for constant linear stretches greater than param 10\n",
745       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
746       "Case: JNSC2_202403\n",
747       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
748       "Case: LSHI4_202403\n",
749       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
750       "Case: TS305_202403\n",
751       "Flagging case TS305_202403 for zero lag stretches greater than param 10\n",
752       "Flagging case TS305_202403 for constant linear stretches greater than param 10\n",
753       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
754       "Case: TS343_202403\n",
755       "Flagging case TS343_202403 for zero lag stretches greater than param 10\n",
756       "Flagging case TS343_202403 for constant linear stretches greater than param 10\n",
757       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
758       "Case: LLKS2_202403\n",
759       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
760       "Case: AGTN1_202403\n",
761       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
762       "Case: WCAS2_202403\n",
763       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
764       "Case: RHRS2_202403\n",
765       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
766       "Case: TS485_202403\n",
767       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
768       "Case: TS578_202403\n",
769       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
770       "Case: TS582_202403\n",
771       "Flagging case TS582_202403 for zero lag stretches greater than param 10\n",
772       "Flagging case TS582_202403 for constant linear stretches greater than param 10\n",
773       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
774       "Case: HITI4_202403\n",
775       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
776       "Case: KRNK1_202403\n",
777       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
778       "Case: AENC2_202403\n",
779       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
780       "Case: LSTC2_202403\n",
781       "Flagging case LSTC2_202403 for zero lag stretches greater than param 10\n",
782       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
783       "Case: LPFC2_202403\n",
784       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
785       "Case: LOOC2_202403\n",
786       "Flagging case LOOC2_202403 for zero lag stretches greater than param 10\n",
787       "Flagging case LOOC2_202403 for constant linear stretches greater than param 10\n",
788       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
789       "Case: TS661_202403\n",
790       "Flagging case TS661_202403 for zero lag stretches greater than param 10\n",
791       "Flagging case TS661_202403 for constant linear stretches greater than param 10\n",
792       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
793       "Case: TS872_202403\n",
794       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
795       "Case: TS897_202403\n",
796       "Flagging case TS897_202403 for constant linear stretches greater than param 10\n",
797       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
798       "Case: RRAC2_202403\n",
799       "Flagging case RRAC2_202403 for constant linear stretches greater than param 10\n",
800       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
801       "Case: FKTC2_202403\n",
802       "Flagging case FKTC2_202403 for constant linear stretches greater than param 10\n",
803       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
804       "Case: DMTC2_202403\n",
805       "Flagging case DMTC2_202403 for zero lag stretches greater than param 10\n",
806       "Flagging case DMTC2_202403 for constant linear stretches greater than param 10\n",
807       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
808       "Case: WPKS2_202403\n",
809       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
810       "Case: KSEC2_202403\n",
811       "Flagging case KSEC2_202403 for zero lag stretches greater than param 10\n",
812       "Flagging case KSEC2_202403 for constant linear stretches greater than param 10\n",
813       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
814       "Case: TS946_202403\n",
815       "Flagging case TS946_202403 for zero lag stretches greater than param 10\n",
816       "Flagging case TS946_202403 for constant linear stretches greater than param 10\n",
817       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
818       "Case: TS954_202403\n",
819       "Flagging case TS954_202403 for zero lag stretches greater than param 10\n",
820       "Flagging case TS954_202403 for constant linear stretches greater than param 10\n",
821       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
822       "Case: TS964_202403\n",
823       "Flagging case TS964_202403 for zero lag stretches greater than param 10\n",
824       "Flagging case TS964_202403 for constant linear stretches greater than param 10\n",
825       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
826       "Case: TT065_202403\n",
827       "Flagging case TT065_202403 for constant linear stretches greater than param 10\n",
828       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
829       "Case: TT081_202403\n",
830       "Flagging case TT081_202403 for zero lag stretches greater than param 10\n",
831       "Flagging case TT081_202403 for constant linear stretches greater than param 10\n",
832       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
833       "Case: CSPS2_202403\n",
834       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
835       "Case: SDSS2_202403\n",
836       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
837       "Case: SHDS2_202403\n",
838       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
839       "Case: RWES2_202403\n",
840       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
841       "Case: TT283_202403\n",
842       "Flagging case TT283_202403 for zero lag stretches greater than param 10\n",
843       "Flagging case TT283_202403 for constant linear stretches greater than param 10\n",
844       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
845       "Case: PMTW4_202403\n",
846       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
847       "Case: TT364_202403\n",
848       "Flagging case TT364_202403 for zero lag stretches greater than param 10\n",
849       "Flagging case TT364_202403 for constant linear stretches greater than param 10\n",
850       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
851       "Case: BEYC2_202403\n",
852       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
853       "Case: TT456_202403\n",
854       "Flagging case TT456_202403 for zero lag stretches greater than param 10\n",
855       "Flagging case TT456_202403 for constant linear stretches greater than param 10\n",
856       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
857       "Case: MTRN1_202403\n",
858       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
859       "Case: MKVN1_202403\n",
860       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
861       "Case: TT561_202403\n",
862       "Flagging case TT561_202403 for zero lag stretches greater than param 10\n",
863       "Flagging case TT561_202403 for constant linear stretches greater than param 10\n",
864       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
865       "Case: TT562_202403\n",
866       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
867       "Case: TT563_202403\n",
868       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
869       "Case: TT564_202403\n",
870       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
871       "Case: TT565_202403\n",
872       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
873       "Case: TT566_202403\n",
874       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
875       "Case: TT567_202403\n",
876       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
877       "Case: TT568_202403\n",
878       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
879       "Case: TT574_202403\n",
880       "Flagging case TT574_202403 for zero lag stretches greater than param 10\n",
881       "Flagging case TT574_202403 for constant linear stretches greater than param 10\n",
882       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
883       "Case: SFRS2_202403\n",
884       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
885       "Case: TT590_202403\n",
886       "Flagging case TT590_202403 for zero lag stretches greater than param 10\n",
887       "Flagging case TT590_202403 for constant linear stretches greater than param 10\n",
888       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
889       "Case: TT591_202403\n",
890       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
891       "Case: TT610_202403\n",
892       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
893       "Case: TT681_202403\n",
894       "Flagging case TT681_202403 for zero lag stretches greater than param 10\n",
895       "Flagging case TT681_202403 for constant linear stretches greater than param 10\n",
896       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
897       "Case: TT689_202403\n",
898       "Flagging case TT689_202403 for zero lag stretches greater than param 10\n",
899       "Flagging case TT689_202403 for constant linear stretches greater than param 10\n",
900       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
901       "Case: TT695_202403\n",
902       "Flagging case TT695_202403 for zero lag stretches greater than param 10\n",
903       "Flagging case TT695_202403 for constant linear stretches greater than param 10\n",
904       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
905       "Case: TT696_202403\n",
906       "Flagging case TT696_202403 for zero lag stretches greater than param 10\n",
907       "Flagging case TT696_202403 for constant linear stretches greater than param 10\n",
908       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
909       "Case: C3SKI_202403\n",
910       "Flagging case C3SKI_202403 for zero lag stretches greater than param 10\n",
911       "Flagging case C3SKI_202403 for constant linear stretches greater than param 10\n",
912       "Flagging case C3SKI_202403 for FMC outside param range (1, 90). FMC range for C3SKI_202403: (4.2, 100.0)\n",
913       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
914       "Case: TT784_202403\n",
915       "Flagging case TT784_202403 for zero lag stretches greater than param 10\n",
916       "Flagging case TT784_202403 for constant linear stretches greater than param 10\n",
917       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
918       "Case: TT787_202403\n",
919       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
920       "Case: TT788_202403\n",
921       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
922       "Case: TT789_202403\n",
923       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
924       "Case: TT813_202403\n",
925       "Flagging case TT813_202403 for zero lag stretches greater than param 10\n",
926       "Flagging case TT813_202403 for constant linear stretches greater than param 10\n",
927       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
928       "Case: TT815_202403\n",
929       "Flagging case TT815_202403 for zero lag stretches greater than param 10\n",
930       "Flagging case TT815_202403 for constant linear stretches greater than param 10\n",
931       "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n",
932       "Case: TT816_202403\n",
933       "Flagging case TT816_202403 for zero lag stretches greater than param 10\n",
934       "Flagging case TT816_202403 for constant linear stretches greater than param 10\n",
935       "Removing key CPTC2_202403 due to data flags\n",
936       "Removing key SAWC2_202403 due to data flags\n",
937       "Removing key HSRU1_202403 due to data flags\n",
938       "Removing key BRLW4_202403 due to data flags\n",
939       "Removing key GTGW4_202403 due to data flags\n",
940       "Removing key SAWW4_202403 due to data flags\n",
941       "Removing key BRAU1_202403 due to data flags\n",
942       "Removing key NLPU1_202403 due to data flags\n",
943       "Removing key TS010_202403 due to data flags\n",
944       "Removing key SOPC2_202403 due to data flags\n",
945       "Removing key CYNC2_202403 due to data flags\n",
946       "Removing key TR223_202403 due to data flags\n",
947       "Removing key TR337_202403 due to data flags\n",
948       "Removing key VLRW4_202403 due to data flags\n",
949       "Removing key TR383_202403 due to data flags\n",
950       "Removing key TR390_202403 due to data flags\n",
951       "Removing key TS001_202403 due to data flags\n",
952       "Removing key HSYN1_202403 due to data flags\n",
953       "Removing key BKFS2_202403 due to data flags\n",
954       "Removing key TR755_202403 due to data flags\n",
955       "Removing key DEOI4_202403 due to data flags\n",
956       "Removing key HBOM8_202403 due to data flags\n",
957       "Removing key TR937_202403 due to data flags\n",
958       "Removing key TR956_202403 due to data flags\n",
959       "Removing key PINS2_202403 due to data flags\n",
960       "Removing key DVLW4_202403 due to data flags\n",
961       "Removing key TS040_202403 due to data flags\n",
962       "Removing key RLAS2_202403 due to data flags\n",
963       "Removing key RHUS2_202403 due to data flags\n",
964       "Removing key TS305_202403 due to data flags\n",
965       "Removing key TS343_202403 due to data flags\n",
966       "Removing key TS582_202403 due to data flags\n",
967       "Removing key LSTC2_202403 due to data flags\n",
968       "Removing key LOOC2_202403 due to data flags\n",
969       "Removing key TS661_202403 due to data flags\n",
970       "Removing key TS897_202403 due to data flags\n",
971       "Removing key RRAC2_202403 due to data flags\n",
972       "Removing key FKTC2_202403 due to data flags\n",
973       "Removing key DMTC2_202403 due to data flags\n",
974       "Removing key KSEC2_202403 due to data flags\n",
975       "Removing key TS946_202403 due to data flags\n",
976       "Removing key TS954_202403 due to data flags\n",
977       "Removing key TS964_202403 due to data flags\n",
978       "Removing key TT065_202403 due to data flags\n",
979       "Removing key TT081_202403 due to data flags\n",
980       "Removing key TT283_202403 due to data flags\n",
981       "Removing key TT364_202403 due to data flags\n",
982       "Removing key TT456_202403 due to data flags\n",
983       "Removing key TT561_202403 due to data flags\n",
984       "Removing key TT574_202403 due to data flags\n",
985       "Removing key TT590_202403 due to data flags\n",
986       "Removing key TT681_202403 due to data flags\n",
987       "Removing key TT689_202403 due to data flags\n",
988       "Removing key TT695_202403 due to data flags\n",
989       "Removing key TT696_202403 due to data flags\n",
990       "Removing key C3SKI_202403 due to data flags\n",
991       "Removing key TT784_202403 due to data flags\n",
992       "Removing key TT813_202403 due to data flags\n",
993       "Removing key TT815_202403 due to data flags\n",
994       "Removing key TT816_202403 due to data flags\n"
995      ]
996     }
997    ],
998    "source": [
999     "train3 = build_train_dict(file_paths, params_data, spatial=False, forecast_step=3, drop_na=True)\n"
1000    ]
1001   },
1002   {
1003    "cell_type": "code",
1004    "execution_count": null,
1005    "id": "3c4548ae-caa4-4bc4-9122-9f24e7e59ef7",
1006    "metadata": {},
1007    "outputs": [],
1008    "source": []
1009   },
1010   {
1011    "cell_type": "code",
1012    "execution_count": null,
1013    "id": "3dbb6f24-4435-47b3-90c6-6176582b0d4c",
1014    "metadata": {},
1015    "outputs": [],
1016    "source": []
1017   },
1018   {
1019    "cell_type": "markdown",
1020    "id": "6322f0bc-107d-40a5-96dc-804495085a99",
1021    "metadata": {
1022     "jp-MarkdownHeadingCollapsed": true
1023    },
1024    "source": [
1025     "## Test Other ML"
1026    ]
1027   },
1028   {
1029    "cell_type": "code",
1030    "execution_count": null,
1031    "id": "12992b9a-407f-4131-ac61-e1dc338386bf",
1032    "metadata": {},
1033    "outputs": [],
1034    "source": [
1035     "params = read_yml(\"params.yaml\", subkey='xgb')\n",
1036     "params"
1037    ]
1038   },
1039   {
1040    "cell_type": "code",
1041    "execution_count": null,
1042    "id": "f214fdf8-bb76-4912-8f8c-5d0c8c1230c2",
1043    "metadata": {},
1044    "outputs": [],
1045    "source": [
1046     "dat = read_pkl(\"data/train.pkl\")"
1047    ]
1048   },
1049   {
1050    "cell_type": "code",
1051    "execution_count": null,
1052    "id": "888b7805-15f6-4c09-a05b-7aed7d253f6e",
1053    "metadata": {},
1054    "outputs": [],
1055    "source": [
1056     "cases = [*dat.keys()]"
1057    ]
1058   },
1059   {
1060    "cell_type": "code",
1061    "execution_count": null,
1062    "id": "375055d8-c070-4639-9561-e47d3f21f1f8",
1063    "metadata": {},
1064    "outputs": [],
1065    "source": [
1066     "rnn_dat = RNNData(dat[cases[10]], params['scaler'], params['features_list'])\n",
1067     "rnn_dat.train_test_split(\n",
1068     "    time_fracs = [.8, .1, .1]\n",
1069     ")\n",
1070     "rnn_dat.scale_data()"
1071    ]
1072   },
1073   {
1074    "cell_type": "code",
1075    "execution_count": null,
1076    "id": "e79f8dc8-5cf8-4190-b4ff-e640f61bd78b",
1077    "metadata": {},
1078    "outputs": [],
1079    "source": [
1080     "from moisture_models import XGB, RF, LM"
1081    ]
1082   },
1083   {
1084    "cell_type": "code",
1085    "execution_count": null,
1086    "id": "b3aeb47f-261e-4e29-9eeb-67215e5628f6",
1087    "metadata": {},
1088    "outputs": [],
1089    "source": [
1090     "mod = XGB(params)"
1091    ]
1092   },
1093   {
1094    "cell_type": "code",
1095    "execution_count": null,
1096    "id": "cae9a20d-1caf-45aa-a9c4-aef21b65d9c8",
1097    "metadata": {},
1098    "outputs": [],
1099    "source": [
1100     "mod.params"
1101    ]
1102   },
1103   {
1104    "cell_type": "code",
1105    "execution_count": null,
1106    "id": "68a07b25-c586-4fc4-a3d5-c857354e7a2c",
1107    "metadata": {},
1108    "outputs": [],
1109    "source": [
1110     "mod.fit(rnn_dat.X_train, rnn_dat.y_train)"
1111    ]
1112   },
1113   {
1114    "cell_type": "code",
1115    "execution_count": null,
1116    "id": "c8f88819-0a7a-4420-abb9-56a47015a4de",
1117    "metadata": {},
1118    "outputs": [],
1119    "source": [
1120     "preds = mod.predict(rnn_dat.X_test)"
1121    ]
1122   },
1123   {
1124    "cell_type": "code",
1125    "execution_count": null,
1126    "id": "cb7cdf14-74d6-45e4-bc1b-7d4d47dd41ac",
1127    "metadata": {},
1128    "outputs": [],
1129    "source": [
1130     "rmse(preds, rnn_dat.y_test)"
1131    ]
1132   },
1133   {
1134    "cell_type": "code",
1135    "execution_count": null,
1136    "id": "74d478c7-8c01-448e-9a00-dd0e1ee8e325",
1137    "metadata": {},
1138    "outputs": [],
1139    "source": [
1140     "plt.plot(rnn_dat.y_test)\n",
1141     "plt.plot(preds)"
1142    ]
1143   },
1144   {
1145    "cell_type": "code",
1146    "execution_count": null,
1147    "id": "c5441014-c39a-4414-a779-95b81e1ed6a8",
1148    "metadata": {},
1149    "outputs": [],
1150    "source": [
1151     "params = read_yml(\"params.yaml\", subkey='rf')\n",
1152     "rnn_dat = RNNData(dat[cases[10]], features_list = ['Ed', 'Ew', 'solar', 'wind', 'rain'])\n",
1153     "rnn_dat.train_test_split(\n",
1154     "    time_fracs = [.8, .1, .1]\n",
1155     ")"
1156    ]
1157   },
1158   {
1159    "cell_type": "code",
1160    "execution_count": null,
1161    "id": "cafe711a-20cb-4bd3-a4bc-4995a843a021",
1162    "metadata": {},
1163    "outputs": [],
1164    "source": [
1165     "import importlib\n",
1166     "import moisture_models\n",
1167     "importlib.reload(moisture_models)"
1168    ]
1169   },
1170   {
1171    "cell_type": "code",
1172    "execution_count": null,
1173    "id": "ee45f7d6-f57f-4ff6-995a-527565565f94",
1174    "metadata": {},
1175    "outputs": [],
1176    "source": [
1177     "params"
1178    ]
1179   },
1180   {
1181    "cell_type": "code",
1182    "execution_count": null,
1183    "id": "fafe76e5-0212-4bd1-a058-535935a08780",
1184    "metadata": {},
1185    "outputs": [],
1186    "source": [
1187     "mod2 = RF(params)\n",
1188     "mod2.fit(rnn_dat.X_train, rnn_dat.y_train.flatten())\n",
1189     "preds2 = mod2.predict(rnn_dat.X_test)\n",
1190     "print(rmse(preds2, rnn_dat.y_test.flatten()))\n",
1191     "plt.plot(rnn_dat.y_test)\n",
1192     "plt.plot(preds2)"
1193    ]
1194   },
1195   {
1196    "cell_type": "code",
1197    "execution_count": null,
1198    "id": "c0ab4244-996c-49af-bf4a-8b0c47b0b6db",
1199    "metadata": {},
1200    "outputs": [],
1201    "source": [
1202     "from moisture_models import RF\n",
1203     "mod2 = RF(params)"
1204    ]
1205   },
1206   {
1207    "cell_type": "code",
1208    "execution_count": null,
1209    "id": "aa6c33fd-db35-4c77-9eee-fdb39a934959",
1210    "metadata": {},
1211    "outputs": [],
1212    "source": []
1213   },
1214   {
1215    "cell_type": "code",
1216    "execution_count": null,
1217    "id": "c5598bfe-2d87-4d23-869e-aff127782462",
1218    "metadata": {},
1219    "outputs": [],
1220    "source": [
1221     "params = read_yml(\"params.yaml\", subkey='lm')\n",
1222     "rnn_dat = RNNData(dat[cases[10]], features_list = ['Ed', 'Ew', 'solar', 'wind', 'rain'])\n",
1223     "rnn_dat.train_test_split(\n",
1224     "    time_fracs = [.8, .1, .1]\n",
1225     ")\n",
1226     "mod = LM(params)"
1227    ]
1228   },
1229   {
1230    "cell_type": "code",
1231    "execution_count": null,
1232    "id": "d828c15c-4078-4967-abff-c1fd15d4696d",
1233    "metadata": {},
1234    "outputs": [],
1235    "source": [
1236     "mod.fit(rnn_dat.X_train, rnn_dat.y_train)\n",
1237     "preds = mod.predict(rnn_dat.X_test)\n",
1238     "print(rmse(preds2, rnn_dat.y_test.flatten()))"
1239    ]
1240   },
1241   {
1242    "cell_type": "code",
1243    "execution_count": null,
1244    "id": "8496a32a-8269-4d6b-953e-7f33fe626789",
1245    "metadata": {},
1246    "outputs": [],
1247    "source": []
1248   },
1249   {
1250    "cell_type": "code",
1251    "execution_count": null,
1252    "id": "75ce8bf3-6efb-4dc7-b895-def92f6ce6b4",
1253    "metadata": {},
1254    "outputs": [],
1255    "source": []
1256   },
1257   {
1258    "cell_type": "markdown",
1259    "id": "d6e089d9-e466-45bb-80f2-15c563ae21ad",
1260    "metadata": {},
1261    "source": [
1262     "## Class RNN "
1263    ]
1264   },
1265   {
1266    "cell_type": "code",
1267    "execution_count": 17,
1268    "id": "3d5792a1-53e3-4099-8630-1bd5e3f52dcc",
1269    "metadata": {},
1270    "outputs": [],
1271    "source": [
1272     "from tensorflow.keras import layers,models"
1273    ]
1274   },
1275   {
1276    "cell_type": "code",
1277    "execution_count": 18,
1278    "id": "0962428e-1124-4e1f-8500-d02b26640204",
1279    "metadata": {},
1280    "outputs": [],
1281    "source": [
1282     "import importlib\n",
1283     "import moisture_rnn\n",
1284     "importlib.reload(moisture_rnn)\n",
1285     "from moisture_rnn import RNN, RNNParams"
1286    ]
1287   },
1288   {
1289    "cell_type": "code",
1290    "execution_count": 19,
1291    "id": "08733f57-493a-45e7-ac07-991d92073fb6",
1292    "metadata": {},
1293    "outputs": [],
1294    "source": [
1295     "from tensorflow.keras.callbacks import Callback, EarlyStopping, TerminateOnNaN"
1296    ]
1297   },
1298   {
1299    "cell_type": "code",
1300    "execution_count": null,
1301    "id": "3f3d377d-da64-4854-a831-a909208013ea",
1302    "metadata": {},
1303    "outputs": [],
1304    "source": []
1305   },
1306   {
1307    "cell_type": "code",
1308    "execution_count": null,
1309    "id": "83c45b38-35d0-4c41-b815-23dad89fc055",
1310    "metadata": {},
1311    "outputs": [],
1312    "source": []
1313   },
1314   {
1315    "cell_type": "code",
1316    "execution_count": null,
1317    "id": "e31ca700-7871-4fb5-b5d2-9b63b85f6688",
1318    "metadata": {},
1319    "outputs": [],
1320    "source": []
1321   },
1322   {
1323    "cell_type": "code",
1324    "execution_count": 66,
1325    "id": "42459583-a634-4dd9-a94b-4535302f481d",
1326    "metadata": {},
1327    "outputs": [],
1328    "source": [
1329     "params_test = {\n",
1330     "    'n_features': 8,\n",
1331     "    'timesteps': 12,\n",
1332     "    'batch_size': 32,\n",
1333     "    'hidden_layers': ['dense', 'lstm', 'dense', 'dense'],\n",
1334     "    'hidden_units': [64, 32, 32, 16],\n",
1335     "    'hidden_activation': ['relu', 'tanh', 'relu', 'relu'],\n",
1336     "    'dropout': 0.2,\n",
1337     "    'recurrent_dropout': 0.2,\n",
1338     "    'output_layer': 'dense',\n",
1339     "    'output_activation': 'linear',\n",
1340     "    'output_dimension': 1,\n",
1341     "    'learning_rate': 0.001,\n",
1342     "    'early_stopping_patience': 5,\n",
1343     "    'epochs': 30,\n",
1344     "    'reset_states': True,\n",
1345     "    'bmin': 10,\n",
1346     "    'bmax': 200,\n",
1347     "    'batch_schedule_type': 'step',\n",
1348     "    'estep': 5,\n",
1349     "    'features_list': ['Ed', 'Ew', 'solar', 'wind', 'rain', 'lon', 'lat', 'elev'],\n",
1350     "    'scaler': 'standard',\n",
1351     "    'time_fracs': [.8, .1, .1],\n",
1352     "    'space_fracs': [.8, .1, .1],\n",
1353     "    'stateful': True,\n",
1354     "    'verbose_fit': True,\n",
1355     "    'verbose_weights': True,\n",
1356     "    'return_sequences': True # whether or not the LAST recurrent layer should return sequences. If multiple, all previous need to be True\n",
1357     "}"
1358    ]
1359   },
1360   {
1361    "cell_type": "code",
1362    "execution_count": 67,
1363    "id": "a14f9c76-93eb-4b13-a11d-6ccb38285335",
1364    "metadata": {},
1365    "outputs": [],
1366    "source": [
1367     "params2 = read_yml(\"params.yaml\", subkey='rnn')"
1368    ]
1369   },
1370   {
1371    "cell_type": "code",
1372    "execution_count": 68,
1373    "id": "c316cfa8-4b96-433a-a115-0046b2af8198",
1374    "metadata": {},
1375    "outputs": [
1376     {
1377      "data": {
1378       "text/plain": [
1379        "'dense'"
1380       ]
1381      },
1382      "execution_count": 68,
1383      "metadata": {},
1384      "output_type": "execute_result"
1385     }
1386    ],
1387    "source": [
1388     "params2['output_layer']"
1389    ]
1390   },
1391   {
1392    "cell_type": "code",
1393    "execution_count": 69,
1394    "id": "90c8d0da-705d-4b7c-ab75-09d23108bb99",
1395    "metadata": {},
1396    "outputs": [],
1397    "source": [
1398     "import importlib\n",
1399     "import moisture_rnn\n",
1400     "importlib.reload(moisture_rnn)\n",
1401     "from moisture_rnn import RNNParams"
1402    ]
1403   },
1404   {
1405    "cell_type": "code",
1406    "execution_count": 70,
1407    "id": "7a7778d4-a71e-4d4a-9121-873552411af4",
1408    "metadata": {},
1409    "outputs": [
1410     {
1411      "name": "stdout",
1412      "output_type": "stream",
1413      "text": [
1414       "Checking params...\n",
1415       "Input dictionary passed all checks.\n",
1416       "Calculating shape params based on features list, timesteps, and batch size\n",
1417       "Input Feature List: ['Ed', 'Ew', 'solar', 'wind', 'rain', 'lon', 'lat', 'elev']\n",
1418       "Input Timesteps: 12\n",
1419       "Input Batch Size: 32\n",
1420       "Calculated params:\n",
1421       "Number of features: 8\n",
1422       "Batch Shape: (32, 12, 8)\n",
1423       "{'n_features': 8, 'timesteps': 12, 'batch_size': 32, 'hidden_layers': ['dense', 'lstm', 'dense', 'dense'], 'hidden_units': [64, 32, 32, 16], 'hidden_activation': ['relu', 'tanh', 'relu', 'relu'], 'dropout': 0.2, 'recurrent_dropout': 0.2, 'output_layer': 'dense', 'output_activation': 'linear', 'output_dimension': 1, 'learning_rate': 0.001, 'early_stopping_patience': 5, 'epochs': 30, 'reset_states': True, 'bmin': 10, 'bmax': 200, 'batch_schedule_type': 'step', 'estep': 5, 'features_list': ['Ed', 'Ew', 'solar', 'wind', 'rain', 'lon', 'lat', 'elev'], 'scaler': 'standard', 'time_fracs': [0.8, 0.1, 0.1], 'space_fracs': [0.8, 0.1, 0.1], 'stateful': True, 'verbose_fit': True, 'verbose_weights': True, 'return_sequences': True, 'batch_shape': (32, 12, 8)}\n"
1424      ]
1425     }
1426    ],
1427    "source": [
1428     "params = RNNParams(params_test)"
1429    ]
1430   },
1431   {
1432    "cell_type": "code",
1433    "execution_count": null,
1434    "id": "614174e8-3366-41fd-8b3a-a7026d94b3ab",
1435    "metadata": {},
1436    "outputs": [],
1437    "source": []
1438   },
1439   {
1440    "cell_type": "code",
1441    "execution_count": 47,
1442    "id": "343241d1-6a7b-44dc-9f52-3bb02c1e8e31",
1443    "metadata": {},
1444    "outputs": [
1445     {
1446      "data": {
1447       "text/plain": [
1448        "(32, 12, 8)"
1449       ]
1450      },
1451      "execution_count": 47,
1452      "metadata": {},
1453      "output_type": "execute_result"
1454     }
1455    ],
1456    "source": [
1457     "params['batch_shape']"
1458    ]
1459   },
1460   {
1461    "cell_type": "code",
1462    "execution_count": 48,
1463    "id": "c9287b15-3fe9-4d53-bf5e-a31da5eb13c7",
1464    "metadata": {},
1465    "outputs": [
1466     {
1467      "data": {
1468       "text/plain": [
1469        "8"
1470       ]
1471      },
1472      "execution_count": 48,
1473      "metadata": {},
1474      "output_type": "execute_result"
1475     }
1476    ],
1477    "source": [
1478     "params['n_features']"
1479    ]
1480   },
1481   {
1482    "cell_type": "code",
1483    "execution_count": null,
1484    "id": "ed3dd798-6a40-4e90-b40b-accabe49fb35",
1485    "metadata": {},
1486    "outputs": [],
1487    "source": []
1488   },
1489   {
1490    "cell_type": "code",
1491    "execution_count": 49,
1492    "id": "e559d0d7-5847-4fd0-81e4-7d3ca92147dd",
1493    "metadata": {},
1494    "outputs": [],
1495    "source": [
1496     "import importlib\n",
1497     "import moisture_rnn\n",
1498     "importlib.reload(moisture_rnn)\n",
1499     "from moisture_rnn import RNN, rnn_data_wrap"
1500    ]
1501   },
1502   {
1503    "cell_type": "code",
1504    "execution_count": 50,
1505    "id": "7c1627f9-f011-4159-98a2-1b5973929e71",
1506    "metadata": {},
1507    "outputs": [
1508     {
1509      "name": "stdout",
1510      "output_type": "stream",
1511      "text": [
1512       "resetting random seeds to 123\n",
1513       "Initial Weights Hash: 0208fb1e8e541de4491e3008c8d6443c\n"
1514      ]
1515     }
1516    ],
1517    "source": [
1518     "reproducibility.set_seed()\n",
1519     "mod = RNN(params)"
1520    ]
1521   },
1522   {
1523    "cell_type": "code",
1524    "execution_count": 51,
1525    "id": "5dbc66c0-ccb5-46c2-a073-1fa7a5be750a",
1526    "metadata": {},
1527    "outputs": [
1528     {
1529      "data": {
1530       "text/html": [
1531        "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"functional_2\"</span>\n",
1532        "</pre>\n"
1533       ],
1534       "text/plain": [
1535        "\u001b[1mModel: \"functional_2\"\u001b[0m\n"
1536       ]
1537      },
1538      "metadata": {},
1539      "output_type": "display_data"
1540     },
1541     {
1542      "data": {
1543       "text/html": [
1544        "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
1545        "┃<span style=\"font-weight: bold\"> Layer (type)                         </span>┃<span style=\"font-weight: bold\"> Output Shape                </span>┃<span style=\"font-weight: bold\">         Param # </span>┃\n",
1546        "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
1547        "│ input_layer_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">InputLayer</span>)           │ (<span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">12</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)                 │               <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
1548        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1549        "│ dense_8 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                      │ (<span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">12</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>)                │             <span style=\"color: #00af00; text-decoration-color: #00af00\">576</span> │\n",
1550        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1551        "│ lstm_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">LSTM</span>)                        │ (<span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">12</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>)                │          <span style=\"color: #00af00; text-decoration-color: #00af00\">12,416</span> │\n",
1552        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1553        "│ dense_9 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                      │ (<span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">12</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>)                │           <span style=\"color: #00af00; text-decoration-color: #00af00\">1,056</span> │\n",
1554        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1555        "│ dense_10 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                     │ (<span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">12</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>)                │             <span style=\"color: #00af00; text-decoration-color: #00af00\">528</span> │\n",
1556        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1557        "│ dense_11 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                     │ (<span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">12</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>)                 │              <span style=\"color: #00af00; text-decoration-color: #00af00\">17</span> │\n",
1558        "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n",
1559        "</pre>\n"
1560       ],
1561       "text/plain": [
1562        "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
1563        "┃\u001b[1m \u001b[0m\u001b[1mLayer (type)                        \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape               \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m        Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
1564        "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
1565        "│ input_layer_2 (\u001b[38;5;33mInputLayer\u001b[0m)           │ (\u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m8\u001b[0m)                 │               \u001b[38;5;34m0\u001b[0m │\n",
1566        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1567        "│ dense_8 (\u001b[38;5;33mDense\u001b[0m)                      │ (\u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m64\u001b[0m)                │             \u001b[38;5;34m576\u001b[0m │\n",
1568        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1569        "│ lstm_2 (\u001b[38;5;33mLSTM\u001b[0m)                        │ (\u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m32\u001b[0m)                │          \u001b[38;5;34m12,416\u001b[0m │\n",
1570        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1571        "│ dense_9 (\u001b[38;5;33mDense\u001b[0m)                      │ (\u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m32\u001b[0m)                │           \u001b[38;5;34m1,056\u001b[0m │\n",
1572        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1573        "│ dense_10 (\u001b[38;5;33mDense\u001b[0m)                     │ (\u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m16\u001b[0m)                │             \u001b[38;5;34m528\u001b[0m │\n",
1574        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1575        "│ dense_11 (\u001b[38;5;33mDense\u001b[0m)                     │ (\u001b[38;5;34m32\u001b[0m, \u001b[38;5;34m12\u001b[0m, \u001b[38;5;34m1\u001b[0m)                 │              \u001b[38;5;34m17\u001b[0m │\n",
1576        "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n"
1577       ]
1578      },
1579      "metadata": {},
1580      "output_type": "display_data"
1581     },
1582     {
1583      "data": {
1584       "text/html": [
1585        "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">14,593</span> (57.00 KB)\n",
1586        "</pre>\n"
1587       ],
1588       "text/plain": [
1589        "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m14,593\u001b[0m (57.00 KB)\n"
1590       ]
1591      },
1592      "metadata": {},
1593      "output_type": "display_data"
1594     },
1595     {
1596      "data": {
1597       "text/html": [
1598        "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">14,593</span> (57.00 KB)\n",
1599        "</pre>\n"
1600       ],
1601       "text/plain": [
1602        "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m14,593\u001b[0m (57.00 KB)\n"
1603       ]
1604      },
1605      "metadata": {},
1606      "output_type": "display_data"
1607     },
1608     {
1609      "data": {
1610       "text/html": [
1611        "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
1612        "</pre>\n"
1613       ],
1614       "text/plain": [
1615        "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
1616       ]
1617      },
1618      "metadata": {},
1619      "output_type": "display_data"
1620     }
1621    ],
1622    "source": [
1623     "mod.model_train.summary()"
1624    ]
1625   },
1626   {
1627    "cell_type": "code",
1628    "execution_count": 52,
1629    "id": "882c5872-a017-4d9c-90be-88e692dd33e8",
1630    "metadata": {},
1631    "outputs": [
1632     {
1633      "data": {
1634       "text/html": [
1635        "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"functional_3\"</span>\n",
1636        "</pre>\n"
1637       ],
1638       "text/plain": [
1639        "\u001b[1mModel: \"functional_3\"\u001b[0m\n"
1640       ]
1641      },
1642      "metadata": {},
1643      "output_type": "display_data"
1644     },
1645     {
1646      "data": {
1647       "text/html": [
1648        "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
1649        "┃<span style=\"font-weight: bold\"> Layer (type)                         </span>┃<span style=\"font-weight: bold\"> Output Shape                </span>┃<span style=\"font-weight: bold\">         Param # </span>┃\n",
1650        "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
1651        "│ input_layer_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">InputLayer</span>)           │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">8</span>)             │               <span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> │\n",
1652        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1653        "│ dense_12 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">64</span>)            │             <span style=\"color: #00af00; text-decoration-color: #00af00\">576</span> │\n",
1654        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1655        "│ lstm_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">LSTM</span>)                        │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>)            │          <span style=\"color: #00af00; text-decoration-color: #00af00\">12,416</span> │\n",
1656        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1657        "│ dense_13 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">32</span>)            │           <span style=\"color: #00af00; text-decoration-color: #00af00\">1,056</span> │\n",
1658        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1659        "│ dense_14 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">16</span>)            │             <span style=\"color: #00af00; text-decoration-color: #00af00\">528</span> │\n",
1660        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1661        "│ dense_15 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>)                     │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1</span>)             │              <span style=\"color: #00af00; text-decoration-color: #00af00\">17</span> │\n",
1662        "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n",
1663        "</pre>\n"
1664       ],
1665       "text/plain": [
1666        "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓\n",
1667        "┃\u001b[1m \u001b[0m\u001b[1mLayer (type)                        \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape               \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m        Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
1668        "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩\n",
1669        "│ input_layer_3 (\u001b[38;5;33mInputLayer\u001b[0m)           │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m8\u001b[0m)             │               \u001b[38;5;34m0\u001b[0m │\n",
1670        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1671        "│ dense_12 (\u001b[38;5;33mDense\u001b[0m)                     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m)            │             \u001b[38;5;34m576\u001b[0m │\n",
1672        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1673        "│ lstm_3 (\u001b[38;5;33mLSTM\u001b[0m)                        │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m)            │          \u001b[38;5;34m12,416\u001b[0m │\n",
1674        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1675        "│ dense_13 (\u001b[38;5;33mDense\u001b[0m)                     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m)            │           \u001b[38;5;34m1,056\u001b[0m │\n",
1676        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1677        "│ dense_14 (\u001b[38;5;33mDense\u001b[0m)                     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m16\u001b[0m)            │             \u001b[38;5;34m528\u001b[0m │\n",
1678        "├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤\n",
1679        "│ dense_15 (\u001b[38;5;33mDense\u001b[0m)                     │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m)             │              \u001b[38;5;34m17\u001b[0m │\n",
1680        "└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘\n"
1681       ]
1682      },
1683      "metadata": {},
1684      "output_type": "display_data"
1685     },
1686     {
1687      "data": {
1688       "text/html": [
1689        "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">14,593</span> (57.00 KB)\n",
1690        "</pre>\n"
1691       ],
1692       "text/plain": [
1693        "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m14,593\u001b[0m (57.00 KB)\n"
1694       ]
1695      },
1696      "metadata": {},
1697      "output_type": "display_data"
1698     },
1699     {
1700      "data": {
1701       "text/html": [
1702        "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">14,593</span> (57.00 KB)\n",
1703        "</pre>\n"
1704       ],
1705       "text/plain": [
1706        "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m14,593\u001b[0m (57.00 KB)\n"
1707       ]
1708      },
1709      "metadata": {},
1710      "output_type": "display_data"
1711     },
1712     {
1713      "data": {
1714       "text/html": [
1715        "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
1716        "</pre>\n"
1717       ],
1718       "text/plain": [
1719        "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
1720       ]
1721      },
1722      "metadata": {},
1723      "output_type": "display_data"
1724     }
1725    ],
1726    "source": [
1727     "mod.model_predict.summary()"
1728    ]
1729   },
1730   {
1731    "cell_type": "code",
1732    "execution_count": 53,
1733    "id": "30498201-3798-484d-922f-974909b195af",
1734    "metadata": {},
1735    "outputs": [
1736     {
1737      "name": "stdout",
1738      "output_type": "stream",
1739      "text": [
1740       "Input data from multiple timeseries.\n",
1741       "Setting data scaler: standard\n",
1742       "Setting features_list to ['Ed', 'Ew', 'solar', 'wind', 'rain', 'lon', 'lat', 'elev']. \n",
1743       "  NOTE: not subsetting features yet. That happens in train_test_split.\n",
1744       "Subsetting input data to features_list: ['Ed', 'Ew', 'solar', 'wind', 'rain', 'lon', 'lat', 'elev']\n",
1745       "Train index: 0 to 1764\n",
1746       "Validation index: 1764 to 1984\n",
1747       "Test index: 1984 to 2205\n",
1748       "Subsetting locations into train/val/test\n",
1749       "Total Locations: 70\n",
1750       "Train Locations: 56\n",
1751       "Val. Locations: 7\n",
1752       "Test Locations: 7\n",
1753       "X_train[0] shape: (1764, 8), y_train[0] shape: (1764, 1)\n",
1754       "X_val[0] shape: (220, 8), y_val[0] shape: (220, 1)\n",
1755       "X_test[0] shape: (221, 8), y_test[0] shape: (221, 1)\n",
1756       "Scaling training data with scaler StandardScaler(), fitting on X_train\n",
1757       "Reshaping spatial training data using batch size: 32 and timesteps: 12\n",
1758       "Setting total hours to minimum length of y in provided dictionary\n",
1759       "Reshaping validation data using batch size: 32 and timesteps: 12\n",
1760       "Setting total hours to minimum length of y in provided dictionary\n",
1761       "Reshaping test data by stacking. Output dimension will be (n_locs, test_hours, features)\n",
1762       "X_test shape: (7, 221, 8)\n",
1763       "y_test shape: (7, 221, 1)\n"
1764      ]
1765     }
1766    ],
1767    "source": [
1768     "rnn_dat = rnn_data_wrap(combine_nested(train3), params_test)"
1769    ]
1770   },
1771   {
1772    "cell_type": "code",
1773    "execution_count": 54,
1774    "id": "e213ffd7-d26c-41ce-8e2b-b17368fdd7a8",
1775    "metadata": {},
1776    "outputs": [],
1777    "source": [
1778     "params.update({\n",
1779     "    'loc_batch_reset': rnn_dat.n_seqs # Used to reset hidden state when location changes for a given batch\n",
1780     "})"
1781    ]
1782   },
1783   {
1784    "cell_type": "code",
1785    "execution_count": 55,
1786    "id": "74e599b6-7f4d-4175-a5f1-de892e72ebd4",
1787    "metadata": {},
1788    "outputs": [
1789     {
1790      "name": "stdout",
1791      "output_type": "stream",
1792      "text": [
1793       "Running Spatial Training Set\n",
1794       "Using ResetStatesCallback.\n",
1795       "Using ResetStatesCallback with Batch Reset Schedule: step\n",
1796       "batch_reset_intervals: [ 10  10  10  10  10 200 200 200 200 200 200 200 200 200 200 200 200 200\n",
1797       " 200 200 200 200 200 200 200 200 200 200 200 200]\n",
1798       "Using EarlyStoppingCallback\n",
1799       "Epoch 1/30\n",
1800       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m4s\u001b[0m 6ms/step - loss: 78.6294 - val_loss: 20.0259\n",
1801       "Epoch 2/30\n",
1802       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 5ms/step - loss: 15.1678 - val_loss: 19.1339\n",
1803       "Epoch 3/30\n",
1804       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 5ms/step - loss: 14.7257 - val_loss: 18.6771\n",
1805       "Epoch 4/30\n",
1806       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 5ms/step - loss: 14.2976 - val_loss: 18.2750\n",
1807       "Epoch 5/30\n",
1808       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step - loss: 14.3008 - val_loss: 18.1770\n",
1809       "Epoch 6/30\n",
1810       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step - loss: 14.2046 - val_loss: 17.7136\n",
1811       "Epoch 7/30\n",
1812       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step - loss: 14.0689 - val_loss: 18.2094\n",
1813       "Epoch 8/30\n",
1814       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step - loss: 13.9889 - val_loss: 17.7251\n",
1815       "Epoch 9/30\n",
1816       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step - loss: 13.9380 - val_loss: 17.6521\n",
1817       "Epoch 10/30\n",
1818       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step - loss: 13.8554 - val_loss: 17.6807\n",
1819       "Epoch 11/30\n",
1820       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step - loss: 13.8041 - val_loss: 18.1714\n",
1821       "Epoch 12/30\n",
1822       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step - loss: 13.7119 - val_loss: 17.4972\n",
1823       "Epoch 13/30\n",
1824       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step - loss: 13.7099 - val_loss: 17.5657\n",
1825       "Epoch 14/30\n",
1826       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step - loss: 13.6393 - val_loss: 18.0135\n",
1827       "Epoch 15/30\n",
1828       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step - loss: 13.6413 - val_loss: 17.8737\n",
1829       "Epoch 16/30\n",
1830       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step - loss: 13.6240 - val_loss: 17.8780\n",
1831       "Epoch 17/30\n",
1832       "\u001b[1m294/294\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 4ms/step - loss: 13.5768 - val_loss: 17.5481\n",
1833       "Epoch 17: early stopping\n",
1834       "Restoring model weights from the end of the best epoch: 12.\n"
1835      ]
1836     },
1837     {
1838      "data": {
1839       "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2gAAAIjCAYAAAB2/jgmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAByyklEQVR4nO3dd3hUZd7/8c+UTCY9oaUACUW6EJC2iCIgCqgouFZcBXT12UdQlLX8XB8Fe13Ftui6CnZZC66rKAIiKkWaIApiw9BCJwlJSJs5vz9OZpJJAuk5k+T9uq5zJXPmzJzvDKPJJ/d9f4/NMAxDAAAAAADL2a0uAAAAAABgIqABAAAAQJAgoAEAAABAkCCgAQAAAECQIKABAAAAQJAgoAEAAABAkCCgAQAAAECQIKABAAAAQJAgoAEAAABAkCCgAQAkScOHD9fw4cNr9FibzaZZs2bVaT01MW/ePNlsNv3+++/VfuwXX3whm82mL774os7rwvHNmjVLNputRo+dPHmyOnToUOlxtflsA0BDI6ABgAU2b96siy66SCkpKXK73Wrbtq3OOussPfPMM/V63i1btmjWrFk1CjC1MXz4cNlstkq3YAh5Vqnrz8Sbb76p2bNnV/n4Dh06yGazadSoURXe/+KLL/r/ndatW1ejmgAAlXNaXQAANDcrV67UiBEjlJycrGuvvVYJCQnauXOnVq9eraeeeko33HBDvZ17y5YtuueeezR8+PByIw+fffZZvZ33zjvv1J///Gf/7bVr1+rpp5/W3/72N/Xo0cO/v0+fPrU6z5VXXqnLLrtMoaGh1X7ssGHDdOzYMblcrlrVUBP18Zl488039f333+umm26q8mPcbreWLVumvXv3KiEhIeC+N954Q263W3l5edWuBQBQdQQ0AGhgDzzwgGJiYrR27VrFxsYG3Ld//35ripLqNZicddZZAbfdbreefvppnXXWWSecepaTk6OIiIgqn8fhcMjhcNSoRrvdLrfbXaPH1lawfCaGDh2qtWvXav78+Zo+fbp//65du/TVV19pwoQJeu+99xqsHgBojpjiCAAN7Ndff1WvXr3K/SIuSW3atAm4bbPZNG3aNL3xxhvq1q2b3G63+vfvry+//DLguLS0NF1//fXq1q2bwsLC1LJlS1188cUBUxnnzZuniy++WJI0YsQI/3Q135qrsut0CgoKdPfdd6t///6KiYlRRESETj/9dC1btqxO3oeyfGuRtmzZookTJyouLk6nnXaaJOm7777T5MmT1alTJ7ndbiUkJOjqq6/WoUOHAp6jojVoHTp00Hnnnaevv/5agwYNktvtVqdOnfTqq68GPLaiNWjDhw/XySefrC1btmjEiBEKDw9X27Zt9eijj5arPy0tTeeff74iIiLUpk0b3XzzzVq0aFGV1rVV5zMhSa+//rr69++vsLAwtWjRQpdddpl27twZUPfHH3+stLQ0/79zVdZqud1uXXjhhXrzzTcD9r/11luKi4vT6NGjK3zc559/rtNPP10RERGKjY3VBRdcoK1bt5Y77uuvv9bAgQPldrvVuXNnvfDCC8etpbLXWFv79+/XNddco/j4eLndbqWmpuqVV14pd9zbb7+t/v37KyoqStHR0erdu7eeeuop//2FhYW655571KVLF7ndbrVs2VKnnXaaFi9eXGe1AmheGEEDgAaWkpKiVatW6fvvv9fJJ59c6fHLly/X/PnzdeONNyo0NFT/+Mc/NGbMGK1Zs8b/+LVr12rlypW67LLL1K5dO/3++++aM2eOhg8fri1btig8PFzDhg3TjTfeWG5qYekphqVlZWXpX//6ly6//HJde+21Onr0qF566SWNHj1aa9asUd++fevsPSnt4osvVpcuXfTggw/KMAxJ0uLFi/Xbb79pypQpSkhI0A8//KB//vOf+uGHH7R69epKm0z88ssvuuiii3TNNddo0qRJevnllzV58mT1799fvXr1OuFjjxw5ojFjxujCCy/UJZdconfffVe33367evfurbFjx0oyR/pGjhyp9PR0TZ8+XQkJCXrzzTerHGar85l44IEHdNddd+mSSy7Rn//8Zx04cEDPPPOMhg0bpm+//VaxsbG68847lZmZqV27dunJJ5+UJEVGRlaplokTJ+rss8/Wr7/+qs6dO0syp0tedNFFCgkJKXf8kiVLNHbsWHXq1EmzZs3SsWPH9Mwzz2jo0KHasGGDPxhu3rxZZ599tlq3bq1Zs2apqKhIM2fOVHx8fI1eY20cO3ZMw4cP1y+//KJp06apY8eOeueddzR58mRlZGT4Rw8XL16syy+/XGeeeaYeeeQRSdLWrVu1YsUK/zGzZs3SQw89pD//+c8aNGiQsrKytG7dOm3YsKHcyDEAVIkBAGhQn332meFwOAyH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lVcCPlPff/+9PvvsM51zzjmSzH/D0aNH64MPPtCOHTv8x23dulWLFi0KeM7qvMaaOuecc7R3717Nnz/fv6+oqEjPPPOMIiMjdcYZZ0hSuXPZ7Xb/xdTz8/MrPCYyMlInnXSS/34AqC5G0ACggd1www3Kzc3VhAkT1L17dxUUFGjlypWaP3++OnTooClTpgQcf/LJJ2v06NEBbfYl6Z577vEfc9555+m1115TTEyMevbsqVWrVmnJkiVq2bJlwHP17dtXDodDjzzyiDIzMxUaGqqRI0dWeK2t8847T++//74mTJigc889V9u3b9fzzz+vnj17Kjs7ux7emYpFR0dr2LBhevTRR1VYWKi2bdvqs88+0/bt2xushsr8z//8j5599lldfvnlmj59uhITE/XGG2/4L3xd2WhWVT8TnTt31v3336877rhDv//+u8aPH6+oqCht375dCxYs0HXXXadbbrlFktS/f3/Nnz9fM2bM0MCBAxUZGalx48ZV+TWlpKRo1qxZlR732GOPaezYsRoyZIiuueYaf5v9mJiYgMffc889+vTTT3X66afr+uuv9weiXr16BazZqs5rrKnrrrtOL7zwgiZPnqz169erQ4cOevfdd7VixQrNnj1bUVFRksyQevjwYY0cOVLt2rVTWlqannnmGfXt29e/Xq1nz54aPny4+vfvrxYtWmjdunV69913NW3atFrVCKAZa/jGkQDQvH3yySfG1VdfbXTv3t2IjIw0XC6XcdJJJxk33HCDsW/fvoBjJRlTp041Xn/9daNLly5GaGio0a9fv3Jt248cOWJMmTLFaNWqlREZGWmMHj3a+PHHH42UlBRj0qRJAce++OKLRqdOnfztzX3PVbYVudfrNR588EEjJSXFf96PPvqowtbmqsM2+wcOHCh3/K5du4wJEyYYsbGxRkxMjHHxxRcbe/bsKXfe47XZr6gNetnXe7w2+7169Sr32Ireg99++80499xzjbCwMKN169bGX//6V+O9994zJBmrV68+4ftRnc+EYRjGe++9Z5x22mlGRESEERERYXTv3t2YOnWqsW3bNv8x2dnZxsSJE43Y2FhDUqXt6I/3PpVWUZt9wzCMJUuWGEOHDjXCwsKM6OhoY9y4ccaWLVvKPX758uVG//79DZfLZXTq1Ml4/vnn/f/uNXmNNW2zbxiGsW/fPv9/My6Xy+jdu7cxd+7cgGPeffdd4+yzzzbatGljuFwuIzk52fif//kfIz093X/M/fffbwwaNMiIjY01wsLCjO7duxsPPPBAhZfNAICqsBlGPa1yBgDUms1m09SpU/Xss89aXQpqYPbs2br55pu1a9cutW3b1upyAACNAGvQAACoA8eOHQu4nZeXpxdeeEFdunQhnAEAqow1aAAA1IELL7xQycnJ6tu3rzIzM/X666/rxx9/1BtvvGF1aQCARoSABgBAHRg9erT+9a9/6Y033pDH41HPnj319ttv69JLL7W6NABAI8IaNAAAAAAIEqxBAwAAAIAgQUADAAAAgCDBGrR65PV6tWfPHkVFRVV6kVIAAAAATZdhGDp69KiSkpJktx9/nIyAVo/27Nmj9u3bW10GAAAAgCCxc+dOtWvX7rj3E9DqUVRUlCTzHyE6OtriagAAAABYJSsrS+3bt/dnhOMhoNUj37TG6OhoAhoAAACASpc+0SQEAAAAAIIEAQ0AAAAAggQBDQAAAACCBGvQLGYYhoqKiuTxeKwuBY2cw+GQ0+nkkg4AAACNGAHNQgUFBUpPT1dubq7VpaCJCA8PV2Jiolwul9WlAAAAoAYIaBbxer3avn27HA6HkpKS5HK5GPlAjRmGoYKCAh04cEDbt29Xly5dTngBRAAAAAQnAppFCgoK5PV61b59e4WHh1tdDpqAsLAwhYSEKC0tTQUFBXK73VaXBAAAgGriT+wWY5QDdYnPEwAAQOPGb3MAAAAAECQIaAAAAAAQJAhosFyHDh00e/bsKh//xRdfyGazKSMjo95qkqR58+YpNja2Xs8BAAAAlEZAQ5XZbLYTbrNmzarR865du1bXXXddlY8/9dRTlZ6erpiYmBqdDwAAAAhWdHFElaWnp/u/nz9/vu6++25t27bNvy8yMtL/vWEY8ng8cjor/4i1bt26WnW4XC4lJCRU6zEAAABAY8AIWjVMmDBBcXFxuuiii+r8uQ3DUG5BkSWbYRhVqjEhIcG/xcTEyGaz+W//+OOPioqK0ieffKL+/fsrNDRUX3/9tX799VddcMEFio+PV2RkpAYOHKglS5YEPG/ZKY42m03/+te/NGHCBIWHh6tLly768MMP/feXneLom4q4aNEi9ejRQ5GRkRozZkxAoCwqKtKNN96o2NhYtWzZUrfffrsmTZqk8ePHV+vfac6cOercubNcLpe6deum1157LeDfcNasWUpOTlZoaKiSkpJ04403+u//xz/+oS5dusjtdis+Pr5ePkcAAABo3BhBq4bp06fr6quv1iuvvFLnz32s0KOedy+q8+etii33jla4q24+Cv/v//0/Pf744+rUqZPi4uK0c+dOnXPOOXrggQcUGhqqV199VePGjdO2bduUnJx83Oe555579Oijj+qxxx7TM888oyuuuEJpaWlq0aJFhcfn5ubq8ccf12uvvSa73a4//elPuuWWW/TGG29Ikh555BG98cYbmjt3rnr06KGnnnpKH3zwgUaMGFHl17ZgwQJNnz5ds2fP1qhRo/TRRx9pypQpateunUaMGKH33ntPTz75pN5++2316tVLe/fu1aZNmyRJ69at04033qjXXntNp556qg4fPqyvvvqqGu8sAAAAmgMCWjUMHz5cX3zxhdVlBLV7771XZ511lv92ixYtlJqa6r993333acGCBfrwww81bdq04z7P5MmTdfnll0uSHnzwQT399NNas2aNxowZU+HxhYWFev7559W5c2dJ0rRp03Tvvff673/mmWd0xx13aMKECZKkZ599VgsXLqzWa3v88cc1efJkXX/99ZKkGTNmaPXq1Xr88cc1YsQI7dixQwkJCRo1apRCQkKUnJysQYMGSZJ27NihiIgInXfeeYqKilJKSor69etXrfMDAACg6QuqgPbwww/rjjvu8I9S1JUvv/xSjz32mNavX6/09HQtWLCgwqltzz33nB577DHt3btXqampeuaZZ/y/YNe3sBCHttw7ut6ePzu/SEVFhqLCHHKUuZhxWIijzs4zYMCAwPNmZ2vWrFn6+OOPlZ6erqKiIh07dkw7duw44fP06dPH/31ERISio6O1f//+4x4fHh7uD2eSlJiY6D8+MzNT+/btC/i3dDgc6t+/v7xeb5Vf29atW8s1Mxk6dKieeuopSdLFF1+s2bNnq1OnThozZozOOeccjRs3Tk6nU2eddZZSUlL8940ZM8Y/hRMAAADwCZo1aGvXrtULL7wQ8It5RVasWKHCwsJy+7ds2aJ9+/ZV+JicnBylpqbqueeeO+7zzp8/XzNmzNDMmTO1YcMGpaamavTo0ScMBXXJZrMp3OWst+1QdoEO5uTLYbeXu89ms9XZ64iIiAi4fcstt2jBggV68MEH9dVXX2njxo3q3bu3CgoKTvg8ISEh5d6fE4Wpio6v6tq6utK+fXtt27ZN//jHPxQWFqbrr79ew4YNU2FhoaKiorRhwwa99dZbSkxM1N13363U1NR6v1QAAAAAGpegCGjZ2dm64oor9OKLLyouLu64x3m9Xk2dOlUTJ06Ux+Px79+2bZtGjhx53LVhY8eO1f333++f3laRJ554Qtdee62mTJminj176vnnn1d4eLhefvnlar+e5557Tj179tTAgQOr/dj6EuIw/6kLi6o+YlQXVqxYocmTJ2vChAnq3bu3EhIS9PvvvzdoDTExMYqPj9fatWv9+zwejzZs2FCt5+nRo4dWrFgRsG/FihXq2bOn/3ZYWJjGjRunp59+Wl988YVWrVqlzZs3S5KcTqdGjRqlRx99VN99951+//13ff7557V4ZQAAAGhqgmKK49SpU3Xuuedq1KhRuv/++497nN1u18KFCzVs2DBdddVVeu2117R9+3aNHDlS48eP12233Vaj8xcUFGj9+vW64447As41atQorVq1qkavZ+rUqcrKygqaa3WFOMxRsgJPw44qdenSRe+//77GjRsnm82mu+66q1rTCuvKDTfcoIceekgnnXSSunfvrmeeeUZHjhyp1ujhrbfeqksuuUT9+vXTqFGj9N///lfvv/++vyvlvHnz5PF4NHjwYIWHh+v1119XWFiYUlJS9NFHH+m3337TsGHDFBcXp4ULF8rr9apbt2719ZIBAADQCFke0N5++21t2LAhYHTjRJKSkvT555/r9NNP18SJE7Vq1SqNGjVKc+bMqXENBw8elMfjUXx8fMD++Ph4/fjjj/7bo0aN0qZNm5STk6N27drpnXfe0ZAhQ2p83obkchaPoHkaNhw98cQTuvrqq3XqqaeqVatWuv3225WVldWgNUjS7bffrr179+qqq66Sw+HQddddp9GjR8vhqPr6u/Hjx+upp57S448/runTp6tjx46aO3euhg8fLkmKjY3Vww8/rBkzZsjj8ah3797673//q5YtWyo2Nlbvv/++Zs2apby8PHXp0kVvvfWWevXqVU+vGAAAAI2RzWjohTql7Ny5UwMGDNDixYv9a8+GDx+uvn37Vtok5Msvv9QZZ5yhTp06adu2bVW6ILJkrk0q2yRkz549atu2rVauXBkQuG677TYtX75c33zzTbVfmyT/CFpmZqaio6MD7svLy9P27dvVsWNHud3uGj1/dRzMzteejGOKCQtRSsuIyh/QxHm9XvXo0UOXXHKJ7rvvPqvLqTMN/bkCAABA1ZwoG5Rm6Rq09evXa//+/TrllFPkdDrldDq1fPlyPf3003I6nQHrzErbt2+frrvuOo0bN065ubm6+eaba1VHq1at5HA4yjUZ2bdvnxISEmr13MHCvwatgUfQgkVaWppefPFF/fTTT9q8ebP+93//V9u3b9fEiROtLg0AAADwszSgnXnmmdq8ebM2btzo3wYMGKArrrhCGzdurHD62cGDB3XmmWeqR48eev/997V06VLNnz9ft9xyS43rcLlc6t+/v5YuXerf5/V6tXTp0kYzhbEyLt8atCLLBkwtZbfbNW/ePA0cOFBDhw7V5s2btWTJEvXo0cPq0gAAAAA/S9egRUVF6eSTTw7YFxERoZYtW5bbL5mhaezYsUpJSdH8+fPldDrVs2dPLV68WCNHjlTbtm0rHE3Lzs7WL7/84r+9fft2bdy4US1atFBycrIk86LDkyZN0oABAzRo0CDNnj1bOTk5mjJlSh2/amv4RtCKvF55DUP2Omyt3xi0b9++XAdGAAAAINhY3iSkOux2ux588EGdfvrpcrlc/v2pqalasmSJWrduXeHj1q1bpxEjRvhvz5gxQ5I0adIkzZs3T5J06aWX6sCBA7r77ru1d+9e9e3bV59++mm5xiGNlcNuk91mk9cwVOjxKtRZdxenBgAAAFA3LG0S0tQFU5MQSdq296jyizzq1CpCke6Qyh+ARocmIQAAAMGpUTQJQcOy6lpoAAAAAKqGgNaMuJp5J0cAAAAg2BHQmpEQiy5WDQAAAKBqCGjNSMm10JjiCAAAAAQjAloz4luDVlhk7Qja8OHDddNNN/lvd+jQQbNnzz7hY2w2mz744INan7uunudEZs2apb59+9brOQAAANA0EdCaEd8atAKPVzVp3jlu3DiNGTOmwvu++uor2Ww2fffdd9V+3rVr1+q6666r9uNO5HghKT09XWPHjq3TcwEAAAB1hYDWjPimOHoNQx5v9QPaNddco8WLF2vXrl3l7ps7d64GDBigPn36VPt5W7durfDw8Go/riYSEhIUGhraIOcCAAAAqouAFiwMQyrIqdfNXpSrEE+ebIW5KjyWXXJfFUfTzjvvPLVu3dp/cW+f7OxsvfPOO7rmmmt06NAhXX755Wrbtq3Cw8PVu3dvvfXWWyd83rJTHH/++WcNGzZMbrdbPXv21OLFi8s95vbbb1fXrl0VHh6uTp066a677lJhYaEkad68ebrnnnu0adMm2Ww22Ww2f81lpzhu3rxZI0eOVFhYmFq2bKnrrrtO2dnZ/vsnT56s8ePH6/HHH1diYqJatmypqVOn+s9VFV6vV/fee6/atWun0NBQ/0XQfQoKCjRt2jQlJibK7XYrJSVFDz30kCTJMAzNmjVLycnJCg0NVVJSkm688cYqnxsAAACNi9PqAlCsMFd6MKneT9Ojop1/2yO5Iip9rNPp1FVXXaV58+bpzjvvlM1mrml755135PF4dPnllys7O1v9+/fX7bffrujoaH388ce68sor1blzZw0aNKjSc3i9Xl144YWKj4/XN998o8zMzID1aj5RUVGaN2+ekpKStHnzZl177bWKiorSbbfdpksvvVTff/+9Pv30Uy1ZskSSFBMTU+45cnJyNHr0aA0ZMkRr167V/v379ec//1nTpk0LCKHLli1TYmKili1bpl9++UWXXnqp+vbtq2uvvbbS1yNJTz31lP7+97/rhRdeUL9+/fTyyy/r/PPP1w8//KAuXbro6aef1ocffqh///vfSk5O1s6dO7Vz505J0nvvvacnn3xSb7/9tnr16qW9e/dq06ZNVTovAAAAGh8CGqrl6quv1mOPPably5dr+PDhkszpjX/84x8VExOjmJgY3XLLLf7jb7jhBi1atEj//ve/qxTQlixZoh9//FGLFi1SUpIZWB988MFy68b+7//+z/99hw4ddMstt+jtt9/WbbfdprCwMEVGRsrpdCohIeG453rzzTeVl5enV199VRERZkB99tlnNW7cOD3yyCOKj4+XJMXFxenZZ5+Vw+FQ9+7dde6552rp0qVVDmiPP/64br/9dl122WWSpEceeUTLli3T7Nmz9dxzz2nHjh3q0qWLTjvtNNlsNqWkpPgfu2PHDiUkJGjUqFEKCQlRcnJyld5HAAAANE4EtGAREm6OZNWz9MxjOphdoNZRLiVEh5Wcu4q6d++uU089VS+//LKGDx+uX375RV999ZXuvfdeSZLH49GDDz6of//739q9e7cKCgqUn59f5TVmW7duVfv27f3hTJKGDBlS7rj58+fr6aef1q+//qrs7GwVFRUpOjq6yq/Dd67U1FR/OJOkoUOHyuv1atu2bf6A1qtXLzkcDv8xiYmJ2rx5c5XOkZWVpT179mjo0KEB+4cOHeofCZs8ebLOOussdevWTWPGjNF5552ns88+W5J08cUXa/bs2erUqZPGjBmjc845R+PGjZPTyX+6AAAATRFr0IKFzWZOM6znzemOlBESrgJbeMn+4qmKVXXNNdfovffe09GjRzV37lx17txZZ5xxhiTpscce01NPPaXbb79dy5Yt08aNGzV69GgVFBTU2Vu1atUqXXHFFTrnnHP00Ucf6dtvv9Wdd95Zp+coLSQkJOC2zWaT11t3lyo45ZRTtH37dt133306duyYLrnkEl100UWSpPbt22vbtm36xz/+obCwMF1//fUaNmxYtdbAAQAAoPEgoDUzJRerrnnAuOSSS2S32/Xmm2/q1Vdf1dVXX+1fj7ZixQpdcMEF+tOf/qTU1FR16tRJP/30U5Wfu0ePHtq5c6fS09P9+1avXh1wzMqVK5WSkqI777xTAwYMUJcuXZSWlhZwjMvlksfjqfRcmzZtUk5Ojn/fihUrZLfb1a1btyrXfCLR0dFKSkrSihUrAvavWLFCPXv2DDju0ksv1Ysvvqj58+frvffe0+HDhyVJYWFhGjdunJ5++ml98cUXWrVqVZVH8AAAANC4ME+qmamLgBYZGalLL71Ud9xxh7KysjR58mT/fV26dNG7776rlStXKi4uTk888YT27dsXEEZOZNSoUeratasmTZqkxx57TFlZWbrzzjsDjunSpYt27Niht99+WwMHDtTHH3+sBQsWBBzToUMHbd++XRs3blS7du0UFRVVrr3+FVdcoZkzZ2rSpEmaNWuWDhw4oBtuuEFXXnmlf3pjXbj11ls1c+ZMde7cWX379tXcuXO1ceNGvfHGG5KkJ554QomJierXr5/sdrveeecdJSQkKDY2VvPmzZPH49HgwYMVHh6u119/XWFhYQHr1AAAANB0MILWzLj8Ac2o0cWqfa655hodOXJEo0ePDlgv9n//93865ZRTNHr0aA0fPlwJCQkaP358lZ/XbrdrwYIFOnbsmAYNGqQ///nPeuCBBwKOOf/883XzzTdr2rRp6tu3r1auXKm77ror4Jg//vGPGjNmjEaMGKHWrVtX2Oo/PDxcixYt0uHDhzVw4EBddNFFOvPMM/Xss89W782oxI033qgZM2bor3/9q3r37q1PP/1UH374obp0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c85Rly5d1LVrVz3wwAOKjIzU6tWryx3r9Xo1depUTZw4UR6Px79/27ZtGjlypF555ZUKzzF27Fjdf//9mjBhwnHreOKJJ3TttddqypQp6tmzp55//nmFh4fr5Zdfrv2LbIRCHHbFR/s6OTLNEQAAAGgIlge00jwej95++23l5ORoyJAh5e632+1auHChvv32W1111VXyer369ddfNXLkSI0fP1633XZbjc5bUFCg9evXa9SoUQHnGjVqlFatWlXt53vuuefUs2dPDRw4sEb1BAvfNEcahQAAAAANIygC2ubNmxUZGanQ0FD95S9/0YIFC9SzZ88Kj01KStLnn3+ur7/+WhMnTtTIkSM1atQozZkzp8bnP3jwoDwej+Lj4wP2x8fHa+/evf7bo0aN0sUXX6yFCxeqXbt2xw1vU6dO1ZYtW7R27doa1xQMkujkCAAAADQop9UFSFK3bt20ceNGZWZm6t1339WkSZO0fPny44a05ORkvfbaazrjjDPUqVMnvfTSS7LZbPVe55IlS+r9HMGkLZ0cAQAAgAYVFCNoLpdLJ510kvr376+HHnpIqampeuqpp457/L59+3Tddddp3Lhxys3N1c0331yr87dq1UoOh6Nck5F9+/YpISGhVs/dmDGCBgAAADSsoAhoZXm9XuXnV9w58ODBgzrzzDPVo0cPvf/++1q6dKnmz5+vW265pcbnc7lc6t+/v5YuXRpQw9KlSytcC9dc+NegZRLQAAAAgIZg+RTHO+64Q2PHjlVycrKOHj2qN998U1988YUWLVpU7liv16uxY8cqJSVF8+fPl9PpVM+ePbV48WKNHDlSbdu2rXA0LTs7W7/88ov/9vbt27Vx40a1aNFCycnJkqQZM2Zo0qRJGjBggAYNGqTZs2crJydHU6ZMqb8XH+S4WDUAAADQsCwPaPv379dVV12l9PR0xcTEqE+fPlq0aJHOOuuscsfa7XY9+OCDOv300+Vyufz7U1NTtWTJErVu3brCc6xbt04jRozw354xY4YkadKkSZo3b54k6dJLL9WBAwd09913a+/everbt68+/fTTco1DmhPfGrSD2fnKK/TIHeKwuCIAAACgabMZhmFYXURTlZWVpZiYGGVmZio6OtrqcqrNMAz1uPtT5RV69cUtw9WhVYTVJQEAAACNUlWzQVCuQUNwsNlsNAoBAAAAGhABDSfk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0FDjrbfesqDCxq3s+1uRNWvWGJKMtLS0himqCTne+7tr1y6jbdu2xvfff2+kpKQYTz75ZIPX1hRU9P5eeumlxp/+9CdrCqoBRtCauIKCAq1fv16jRo3y77Pb7Ro1apRWrVplYWVNU2ZmpiSpRYsWFlfStEydOlXnnntuwOcYtffhhx9qwIABuvjii9WmTRv169dPL774otVlNRmnnnqqli5dqp9++kmStGnTJn399dcaO3asxZU1Pdu3b9fevXsD/h8RExOjwYMH87OunmRmZspmsyk2NtbqUpoEr9erK6+8Urfeeqt69epldTlNitfr1ccff6yuXbtq9OjRatOmjQYPHnzCaaZWI6A1cQcPHpTH41F8fHzA/vj4eO3du9eiqpomr9erm266SUOHDtXJJ59sdTlNxttvv60NGzbooYcesrqUJue3337TnDlz1KVLFy1atEj/+7//qxtvvFGvvPKK1aU1Cf/v//0/XXbZZerevbtCQkLUr18/3XTTTbriiiusLq3J8f0842ddw8jLy9Ptt9+uyy+/XNHR0VaX0yQ88sgjcjqduvHGG60upcnZv3+/srOz9fDDD2vMmDH67LPPNGHCBF144YVavny51eVVyGl1AUBTMXXqVH3//ff6+uuvrS6lydi5c6emT5+uxYsXB+888UbM6/VqwIABevDBByVJ/fr10/fff6/nn39ekyZNsri6xu/f//633njjDb355pvq1auXNm7cqJtuuklJSUm8v2i0CgsLdckll8gwDM2ZM8fqcpqE9evX66mnntKGDRtks9msLqfJ8Xq9kqQLLrhAN998sySpb9++WrlypZ5//nmdccYZVpZXIUbQmrhWrVrJ4XBo3759Afv37dunhIQEi6pqeqZNm6aPPvpIy5YtU7t27awup8lYv3699u/fr1NOOUVOp1NOp1PLly/X008/LafTKY/HY3WJjVpiYqJ69uwZsK9Hjx5B29Wqsbn11lv9o2i9e/fWlVdeqZtvvpnR4Hrg+3nGz7r65QtnaWlpWrx4MaNndeSrr77S/v37lZyc7P9Zl5aWpr/+9a/q0KGD1eU1eq1atZLT6WxUP+8IaE2cy+VS//79tXTpUv8+r9erpUuXasiQIRZW1jQYhqFp06ZpwYIF+vzzz9WxY0erS2pSzjzzTG3evFkbN270bwMGDNAVV1yhjRs3yuFwWF1i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",
1840       "text/plain": [
1841        "<Figure size 1000x600 with 1 Axes>"
1842       ]
1843      },
1844      "metadata": {},
1845      "output_type": "display_data"
1846     },
1847     {
1848      "name": "stdout",
1849      "output_type": "stream",
1850      "text": [
1851       "Predicting test data\n",
1852       "\u001b[1m1/1\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 216ms/step\n"
1853      ]
1854     }
1855    ],
1856    "source": [
1857     "m, errs = mod.run_model(rnn_dat)"
1858    ]
1859   },
1860   {
1861    "cell_type": "code",
1862    "execution_count": 56,
1863    "id": "f894d203-d277-48f3-bb57-a610f162361f",
1864    "metadata": {},
1865    "outputs": [
1866     {
1867      "data": {
1868       "text/plain": [
1869        "2.9371844100586535"
1870       ]
1871      },
1872      "execution_count": 56,
1873      "metadata": {},
1874      "output_type": "execute_result"
1875     }
1876    ],
1877    "source": [
1878     "errs.mean()"
1879    ]
1880   },
1881   {
1882    "cell_type": "code",
1883    "execution_count": 57,
1884    "id": "b875ea70-41f9-4550-982b-88380ad1b5a0",
1885    "metadata": {},
1886    "outputs": [
1887     {
1888      "data": {
1889       "text/plain": [
1890        "{'n_features': 8,\n",
1891        " 'timesteps': 12,\n",
1892        " 'batch_size': 32,\n",
1893        " 'hidden_layers': ['dense', 'lstm', 'dense', 'dense'],\n",
1894        " 'hidden_units': [64, 32, 32, 16],\n",
1895        " 'hidden_activation': ['relu', 'tanh', 'relu', 'relu'],\n",
1896        " 'dropout': 0.2,\n",
1897        " 'recurrent_dropout': 0.2,\n",
1898        " 'output_layer': 'dense',\n",
1899        " 'output_activation': 'linear',\n",
1900        " 'output_dimension': 1,\n",
1901        " 'learning_rate': 0.001,\n",
1902        " 'early_stopping_patience': 5,\n",
1903        " 'epochs': 30,\n",
1904        " 'reset_states': True,\n",
1905        " 'bmin': 10,\n",
1906        " 'bmax': 200,\n",
1907        " 'batch_schedule_type': 'step',\n",
1908        " 'estep': 5,\n",
1909        " 'features_list': ['Ed', 'Ew', 'solar', 'wind', 'rain', 'lon', 'lat', 'elev'],\n",
1910        " 'scaler': 'standard',\n",
1911        " 'time_fracs': [0.8, 0.1, 0.1],\n",
1912        " 'space_fracs': [0.8, 0.1, 0.1],\n",
1913        " 'stateful': True,\n",
1914        " 'verbose_fit': True,\n",
1915        " 'verbose_weights': True,\n",
1916        " 'return_sequences': True,\n",
1917        " 'batch_shape': (32, 12, 8),\n",
1918        " 'loc_batch_reset': 147}"
1919       ]
1920      },
1921      "execution_count": 57,
1922      "metadata": {},
1923      "output_type": "execute_result"
1924     }
1925    ],
1926    "source": [
1927     "params"
1928    ]
1929   },
1930   {
1931    "cell_type": "markdown",
1932    "id": "282cb651-b21f-401d-94c5-9e07530a9ba8",
1933    "metadata": {},
1934    "source": [
1935     "## RNN"
1936    ]
1937   },
1938   {
1939    "cell_type": "code",
1940    "execution_count": null,
1941    "id": "8c1894e3-5283-4e5e-83ae-9c386836a990",
1942    "metadata": {},
1943    "outputs": [],
1944    "source": [
1945     "import importlib \n",
1946     "import moisture_rnn\n",
1947     "importlib.reload(moisture_rnn)\n",
1948     "from moisture_rnn import RNN"
1949    ]
1950   },
1951   {
1952    "cell_type": "code",
1953    "execution_count": null,
1954    "id": "aa1b690f-edaa-4c97-893c-ec9a3a615ce1",
1955    "metadata": {},
1956    "outputs": [],
1957    "source": [
1958     "params = read_yml(\"params.yaml\", subkey=\"lstm\")\n",
1959     "params = RNNParams(params)\n",
1960     "params.update({\n",
1961     "    'dense_layers': 2,\n",
1962     "    'dense_units': 32\n",
1963     "})"
1964    ]
1965   },
1966   {
1967    "cell_type": "code",
1968    "execution_count": null,
1969    "id": "054ab015-4e41-4255-8b1a-843b61e3d21d",
1970    "metadata": {},
1971    "outputs": [],
1972    "source": [
1973     "params.update({'batch_schedule_type': 'step'})"
1974    ]
1975   },
1976   {
1977    "cell_type": "code",
1978    "execution_count": null,
1979    "id": "fa38f35a-d367-4df8-b2d3-7691ff4b0cf4",
1980    "metadata": {},
1981    "outputs": [],
1982    "source": [
1983     "rnn_dat = rnn_data_wrap(combine_nested(train3), params)\n",
1984     "reproducibility.set_seed(123)\n",
1985     "rnn = RNN(params)"
1986    ]
1987   },
1988   {
1989    "cell_type": "code",
1990    "execution_count": null,
1991    "id": "27d11b75-89e9-43a9-8801-7be7fb845b09",
1992    "metadata": {},
1993    "outputs": [],
1994    "source": [
1995     "rnn.model_train.summary()"
1996    ]
1997   },
1998   {
1999    "cell_type": "code",
2000    "execution_count": null,
2001    "id": "b9a0b3fb-aaab-4948-b6e6-824e9dcb92a7",
2002    "metadata": {},
2003    "outputs": [],
2004    "source": [
2005     "rnn.model_predict.summary()"
2006    ]
2007   },
2008   {
2009    "cell_type": "code",
2010    "execution_count": null,
2011    "id": "ade176b9-2844-43b6-b85e-5bb30414aa35",
2012    "metadata": {},
2013    "outputs": [],
2014    "source": [
2015     "rnn.params"
2016    ]
2017   },
2018   {
2019    "cell_type": "code",
2020    "execution_count": null,
2021    "id": "5945e6c1-6b3a-4b7d-ade2-b5788860ef18",
2022    "metadata": {},
2023    "outputs": [],
2024    "source": [
2025     "rnn.model_train.fit(rnn_dat.X_train, rnn_dat.y_train, validation_data=(rnn_dat.X_val, rnn_dat.y_val), \n",
2026     "                    verbose=True, epochs=20)"
2027    ]
2028   },
2029   {
2030    "cell_type": "code",
2031    "execution_count": null,
2032    "id": "2d123b2b-047e-4a04-b49e-6629cc22edc6",
2033    "metadata": {},
2034    "outputs": [],
2035    "source": [
2036     "rnn.model_predict.set_weights(rnn.model_train.get_weights())"
2037    ]
2038   },
2039   {
2040    "cell_type": "code",
2041    "execution_count": null,
2042    "id": "db57df64-d2ac-4b91-bbfc-71a5834ddf41",
2043    "metadata": {},
2044    "outputs": [],
2045    "source": [
2046     "rnn.model_predict.summary()"
2047    ]
2048   },
2049   {
2050    "cell_type": "code",
2051    "execution_count": null,
2052    "id": "0466887f-9833-4a6a-a0c7-a4d56f207d33",
2053    "metadata": {},
2054    "outputs": [],
2055    "source": [
2056     "rnn_dat.X_test.shape"
2057    ]
2058   },
2059   {
2060    "cell_type": "code",
2061    "execution_count": null,
2062    "id": "1d3e630c-db69-4603-962e-95c576b45ac9",
2063    "metadata": {},
2064    "outputs": [],
2065    "source": [
2066     "preds = rnn.model_predict.predict(rnn_dat.X_test)"
2067    ]
2068   },
2069   {
2070    "cell_type": "code",
2071    "execution_count": null,
2072    "id": "8b8228a9-5b6d-4de1-8968-d40277edacd2",
2073    "metadata": {},
2074    "outputs": [],
2075    "source": [
2076     "preds.shape"
2077    ]
2078   },
2079   {
2080    "cell_type": "code",
2081    "execution_count": null,
2082    "id": "8b001dd8-ffd7-4fd1-bf11-413515ddc488",
2083    "metadata": {},
2084    "outputs": [],
2085    "source": [
2086     "rnn_dat.X_test.shape"
2087    ]
2088   },
2089   {
2090    "cell_type": "code",
2091    "execution_count": null,
2092    "id": "f96c6dbf-6ca8-451e-abc4-b68b8116871b",
2093    "metadata": {},
2094    "outputs": [],
2095    "source": [
2096     "squared_diff = np.square(preds - rnn_dat.y_test)\n",
2097     "mse = np.mean(squared_diff, axis=(1, 2))\n",
2098     "errs = np.sqrt(mse)\n",
2099     "errs.mean()"
2100    ]
2101   },
2102   {
2103    "cell_type": "markdown",
2104    "id": "5ef092ff-8af1-491a-b0bf-cc3e674330e0",
2105    "metadata": {},
2106    "source": [
2107     "## Phys Initialized"
2108    ]
2109   },
2110   {
2111    "cell_type": "code",
2112    "execution_count": null,
2113    "id": "5488628e-4552-4909-83e9-413fd6878bdd",
2114    "metadata": {},
2115    "outputs": [],
2116    "source": [
2117     "params.update({\n",
2118     "    'epochs':100,\n",
2119     "    'dense_layers': 0,\n",
2120     "    'activation': ['relu', 'relu'],\n",
2121     "    'phys_initialize': False,\n",
2122     "    'dropout': [0,0],\n",
2123     "    'space_fracs': [.8, .1, .1],\n",
2124     "    'scaler': None\n",
2125     "})"
2126    ]
2127   },
2128   {
2129    "cell_type": "code",
2130    "execution_count": null,
2131    "id": "ab7db7d6-949e-457d-90b9-22d9c5aa4739",
2132    "metadata": {},
2133    "outputs": [],
2134    "source": [
2135     "import importlib\n",
2136     "import moisture_rnn\n",
2137     "importlib.reload(moisture_rnn)\n",
2138     "from moisture_rnn import rnn_data_wrap"
2139    ]
2140   },
2141   {
2142    "cell_type": "code",
2143    "execution_count": null,
2144    "id": "d26cf1b2-2fad-409d-888f-4921b0ae4ba8",
2145    "metadata": {},
2146    "outputs": [],
2147    "source": [
2148     "params['scaler'] is None"
2149    ]
2150   },
2151   {
2152    "cell_type": "code",
2153    "execution_count": null,
2154    "id": "1c4627bc-0f90-44e6-9103-2efe5c5f439d",
2155    "metadata": {},
2156    "outputs": [],
2157    "source": [
2158     "rnn_dat = rnn_data_wrap(combine_nested(train3), params)"
2159    ]
2160   },
2161   {
2162    "cell_type": "code",
2163    "execution_count": null,
2164    "id": "56bdf26c-07e7-4e4a-a567-af7dd0f564d9",
2165    "metadata": {},
2166    "outputs": [],
2167    "source": [
2168     "reproducibility.set_seed()\n",
2169     "rnn = RNN(params)\n",
2170     "m, errs = rnn.run_model(rnn_dat)"
2171    ]
2172   },
2173   {
2174    "cell_type": "code",
2175    "execution_count": null,
2176    "id": "01227b79-98f3-4931-bdfc-ff08afa8be5f",
2177    "metadata": {},
2178    "outputs": [],
2179    "source": [
2180     "rnn.model_train.summary()"
2181    ]
2182   },
2183   {
2184    "cell_type": "code",
2185    "execution_count": null,
2186    "id": "918a8bf0-638b-4b4b-82fe-c6a1965a72dd",
2187    "metadata": {},
2188    "outputs": [],
2189    "source": [
2190     "errs.mean()"
2191    ]
2192   },
2193   {
2194    "cell_type": "code",
2195    "execution_count": null,
2196    "id": "37fdbb3a-3e83-4541-93b2-982b6d4cbe93",
2197    "metadata": {
2198     "scrolled": true
2199    },
2200    "outputs": [],
2201    "source": [
2202     "rnn_dat.X_train[:,:,0].mean()"
2203    ]
2204   },
2205   {
2206    "cell_type": "code",
2207    "execution_count": null,
2208    "id": "7ca41db1-72aa-44b6-b9dd-058735336ab3",
2209    "metadata": {},
2210    "outputs": [],
2211    "source": []
2212   },
2213   {
2214    "cell_type": "code",
2215    "execution_count": null,
2216    "id": "a592a4c9-cb3b-4174-8eaa-02afd00a1897",
2217    "metadata": {},
2218    "outputs": [],
2219    "source": [
2220     "rnn_dat['features_list']"
2221    ]
2222   },
2223   {
2224    "cell_type": "code",
2225    "execution_count": null,
2226    "id": "3832fb05-417c-4648-8e2e-7748c06b3768",
2227    "metadata": {},
2228    "outputs": [],
2229    "source": []
2230   },
2231   {
2232    "cell_type": "markdown",
2233    "id": "d2360aef-e9c4-4a71-922d-336e53b82537",
2234    "metadata": {},
2235    "source": [
2236     "## LSTM"
2237    ]
2238   },
2239   {
2240    "cell_type": "code",
2241    "execution_count": null,
2242    "id": "71d4e441-9bf1-4d57-bb37-091553e23212",
2243    "metadata": {},
2244    "outputs": [],
2245    "source": [
2246     "import importlib \n",
2247     "import moisture_rnn\n",
2248     "importlib.reload(moisture_rnn)\n",
2249     "from moisture_rnn import RNN_LSTM"
2250    ]
2251   },
2252   {
2253    "cell_type": "code",
2254    "execution_count": null,
2255    "id": "0f6ba896-e3be-4a9f-8a42-3df64aff7d63",
2256    "metadata": {},
2257    "outputs": [],
2258    "source": [
2259     "params = read_yml(\"params.yaml\", subkey=\"lstm\")\n",
2260     "params = RNNParams(params)"
2261    ]
2262   },
2263   {
2264    "cell_type": "code",
2265    "execution_count": null,
2266    "id": "a4cf567e-d623-4e14-b578-eed88b80d04e",
2267    "metadata": {},
2268    "outputs": [],
2269    "source": [
2270     "rnn_dat = rnn_data_wrap(combine_nested(train3), params)"
2271    ]
2272   },
2273   {
2274    "cell_type": "code",
2275    "execution_count": null,
2276    "id": "57bb5708-7be9-4474-abb4-3b7ff4bf79df",
2277    "metadata": {},
2278    "outputs": [],
2279    "source": [
2280     "params.update({\n",
2281     "    'loc_batch_reset': rnn_dat.n_seqs # Used to reset hidden state when location changes for a given batch\n",
2282     "})"
2283    ]
2284   },
2285   {
2286    "cell_type": "code",
2287    "execution_count": null,
2288    "id": "0157a6bc-3a99-4b87-a42c-ab770d19ae37",
2289    "metadata": {},
2290    "outputs": [],
2291    "source": [
2292     "from moisture_rnn import ResetStatesCallback, EarlyStoppingCallback\n",
2293     "params.update({'epochs': 50, 'learning_rate': 0.001, 'verbose_fit': True, 'rnn_layers': 2, 'rnn_units': 20, 'dense_layers': 1, 'dense_units': 10,\n",
2294     "              'activation': ['tanh', 'tanh'], 'features_list': rnn_dat.features_list,\n",
2295     "              'batch_schedule_type':'step', 'bmin': 10, 'bmax':rnn_dat.hours})\n",
2296     "reproducibility.set_seed(123)\n",
2297     "lstm = RNN_LSTM(params)\n",
2298     "\n",
2299     "history = lstm.model_train.fit(rnn_dat.X_train, rnn_dat.y_train, \n",
2300     "                    batch_size = params['batch_size'], epochs=params['epochs'], \n",
2301     "                    callbacks = [ResetStatesCallback(params),\n",
2302     "                                EarlyStoppingCallback(patience = 15)],\n",
2303     "                   validation_data = (rnn_dat.X_val, rnn_dat.y_val))\n",
2304     "              "
2305    ]
2306   },
2307   {
2308    "cell_type": "code",
2309    "execution_count": null,
2310    "id": "9b3c8d8d-ea50-44ea-8c0c-414e07cd01ac",
2311    "metadata": {},
2312    "outputs": [],
2313    "source": []
2314   },
2315   {
2316    "cell_type": "code",
2317    "execution_count": null,
2318    "id": "03063e3c-e8f4-451d-b0cf-25bd965cd9d6",
2319    "metadata": {},
2320    "outputs": [],
2321    "source": [
2322     "params = RNNParams(read_yml(\"params.yaml\", subkey=\"lstm\"))\n",
2323     "params.update({'epochs': 50, 'learning_rate': 0.001, 'verbose_fit': True, 'rnn_layers': 2, 'rnn_units': 20, 'dense_layers': 1, 'dense_units': 10,\n",
2324     "              'activation': ['tanh', 'tanh'], 'features_list': rnn_dat.features_list,\n",
2325     "              'batch_schedule_type':'step', 'bmin': 10, 'bmax':rnn_dat.hours})\n",
2326     "rnn_dat = rnn_data_wrap(combine_nested(train3), params)\n",
2327     "params.update({\n",
2328     "    'loc_batch_reset': rnn_dat.n_seqs # Used to reset hidden state when location changes for a given batch\n",
2329     "})\n",
2330     "reproducibility.set_seed(123)\n",
2331     "lstm = RNN_LSTM(params)\n",
2332     "m, errs = lstm.run_model(rnn_dat)"
2333    ]
2334   },
2335   {
2336    "cell_type": "code",
2337    "execution_count": null,
2338    "id": "be46a2dc-bf5c-4893-a1ee-a1682566f7a2",
2339    "metadata": {},
2340    "outputs": [],
2341    "source": [
2342     "errs.mean()"
2343    ]
2344   },
2345   {
2346    "cell_type": "code",
2347    "execution_count": null,
2348    "id": "0f319f37-7d13-41fd-95fa-66dbdfeab588",
2349    "metadata": {},
2350    "outputs": [],
2351    "source": []
2352   },
2353   {
2354    "cell_type": "code",
2355    "execution_count": null,
2356    "id": "b1252b08-62b9-4d24-add2-0f87d15b0ff2",
2357    "metadata": {},
2358    "outputs": [],
2359    "source": [
2360     "params = RNNParams(read_yml(\"params.yaml\", subkey=\"rnn\"))\n",
2361     "rnn_dat = rnn_data_wrap(combine_nested(train3), params)"
2362    ]
2363   },
2364   {
2365    "cell_type": "code",
2366    "execution_count": null,
2367    "id": "9281540b-eb26-4923-883b-1b31d8347634",
2368    "metadata": {},
2369    "outputs": [],
2370    "source": [
2371     "reproducibility.set_seed(123)\n",
2372     "rnn = RNN(params)\n",
2373     "m, errs = rnn.run_model(rnn_dat)"
2374    ]
2375   },
2376   {
2377    "cell_type": "code",
2378    "execution_count": null,
2379    "id": "8a0269b4-d6b7-4f20-8386-69814d7acaa3",
2380    "metadata": {},
2381    "outputs": [],
2382    "source": [
2383     "errs.mean()"
2384    ]
2385   },
2386   {
2387    "cell_type": "code",
2388    "execution_count": null,
2389    "id": "10b44de3-a0e9-49e4-9e03-873d69580c07",
2390    "metadata": {},
2391    "outputs": [],
2392    "source": []
2393   },
2394   {
2395    "cell_type": "code",
2396    "execution_count": null,
2397    "id": "27f4fee4-7fce-49c5-a455-97a90b754c13",
2398    "metadata": {},
2399    "outputs": [],
2400    "source": []
2401   },
2402   {
2403    "cell_type": "code",
2404    "execution_count": null,
2405    "id": "739d4b26-641e-47b2-a90a-67cd32215d05",
2406    "metadata": {},
2407    "outputs": [],
2408    "source": []
2409   }
2410  ],
2411  "metadata": {
2412   "kernelspec": {
2413    "display_name": "Python 3 (ipykernel)",
2414    "language": "python",
2415    "name": "python3"
2416   },
2417   "language_info": {
2418    "codemirror_mode": {
2419     "name": "ipython",
2420     "version": 3
2421    },
2422    "file_extension": ".py",
2423    "mimetype": "text/x-python",
2424    "name": "python",
2425    "nbconvert_exporter": "python",
2426    "pygments_lexer": "ipython3",
2427    "version": "3.12.5"
2428   }
2429  },
2430  "nbformat": 4,
2431  "nbformat_minor": 5