From af542fc3f3942f32e73ccb1bc3c3390c8ad5b8bf Mon Sep 17 00:00:00 2001 From: wassname Date: Mon, 28 Nov 2022 18:37:30 +0800 Subject: [PATCH] nbs --- exp/exp_main.py | 3 + notebooks/001_001_run-S-Copy1.ipynb | 680 +++++++++++++++++++++ notebooks/001_001_run-S.ipynb | 909 ++++++++++++++++++++++++++-- notebooks/001_001_run_MS2S.ipynb | 854 +++++++++++++++++++++++--- 4 files changed, 2329 insertions(+), 117 deletions(-) create mode 100644 notebooks/001_001_run-S-Copy1.ipynb diff --git a/exp/exp_main.py b/exp/exp_main.py index fc52194..f5a85c4 100644 --- a/exp/exp_main.py +++ b/exp/exp_main.py @@ -163,6 +163,9 @@ class Exp_Main(Exp_Basic): print("Epoch: {0}, Steps: {1} | Train Loss: {2:.7f} Vali Loss: {3:.7f} Test Loss: {4:.7f}".format( epoch + 1, train_steps, train_loss, vali_loss, test_loss)) early_stopping(vali_loss, self.model, path) + + + open(path + '/metrics.csv', 'a').write("{train_loss},{vali_loss},{test_loss}\n") if early_stopping.early_stop: print("Early stopping") break diff --git a/notebooks/001_001_run-S-Copy1.ipynb b/notebooks/001_001_run-S-Copy1.ipynb new file mode 100644 index 0000000..0f745c8 --- /dev/null +++ b/notebooks/001_001_run-S-Copy1.ipynb @@ -0,0 +1,680 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "0c996f31", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T10:34:55.581023Z", + "start_time": "2022-11-28T10:34:55.579242Z" + } + }, + "outputs": [], + "source": [ + "import os\n", + "os.sys.path.append('..')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "23a27691", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T10:34:55.611369Z", + "start_time": "2022-11-28T10:34:55.581779Z" + } + }, + "outputs": [], + "source": [ + "import warnings\n", + "warnings.simplefilter(\"ignore\")\n", + "\n", + "# autoreload import your package\n", + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e60bfdb0", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T10:34:55.633532Z", + "start_time": "2022-11-28T10:34:55.612568Z" + } + }, + "outputs": [], + "source": [ + "from loguru import logger\n", + "logger.remove()\n", + "logger.add(os.sys.stdout, level=\"ERROR\", colorize=True, format=\"{time} | {message}\")\n", + "# import_dir(ta_dir, verbose=False)\n", + "warnings.simplefilter(\"ignore\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "d52338d2", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T10:34:56.339147Z", + "start_time": "2022-11-28T10:34:55.634385Z" + } + }, + "outputs": [], + "source": [ + "import torch\n", + "import pandas as pd\n", + "from matplotlib import pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "id": "20d78524", + "metadata": {}, + "source": [ + "# Args" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "750cdcc3", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T10:34:56.600001Z", + "start_time": "2022-11-28T10:34:56.340104Z" + } + }, + "outputs": [], + "source": [ + "from run import set_seed, get_args, Exp_Main" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b3a40300", + "metadata": { + "ExecuteTime": { + "start_time": "2022-11-28T10:35:02.166Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Args in experiment:\n", + "Namespace(K=0, activation='sigmoid', batch_size=32, c_out=1, checkpoints='./checkpoints/', d_ff=2048, d_layers=2, d_model=512, damping_learning_rate=0, data='custom', data_path='exchange_rate.csv', dec_in=7, des=\"'Exp'\", devices='0,1,2,3', dropout=0.2, e_layers=2, embed='timeF', enc_in=1, features='S', freq='h', gpu=0, itr=1, label_len=0, learning_rate=0.0003, lradj='exponential_with_warmup', min_lr=1e-30, model='ETSformer', model_id='Exchange', n_heads=16, num_workers=0, optim='adam', output_attention=False, patience=5, pred_len=96, root_path='../dataset/exchange_rate/', seq_len=512, smoothing_learning_rate=0, std=0.2, target='OT', train_epochs=15, use_gpu=True, use_multi_gpu=False, warmup_epochs=3)\n", + "Use GPU: cuda:0\n", + ">>>>>>>start training : Exchange_ETSformer_custom_ftS_sl512_pl96_dm512_nh16_el2_dl2_df2048_K0_lr0.0003_'Exp'_0>>>>>>>>>>>>>>>>>>>>>>>>>>\n", + "train 4704\n", + "val 665\n", + "test 1422\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "db46d457567743ffb1475b58fba74214", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/15 [00:00 0.161564). Saving model ...\n", + "Updating learning rate to 7.5e-05\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/147 [00:00 0.144433). Saving model ...\n", + "Updating learning rate to 0.00015\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/147 [00:00 0.143824). Saving model ...\n", + "Updating learning rate to 0.000225\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/147 [00:00 0.138271). Saving model ...\n", + "Updating learning rate to 0.0003\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/147 [00:00>>>>>>start training : {}>>>>>>>>>>>>>>>>>>>>>>>>>>'.format(setting))\n", + "exp.train(setting)\n", + "\n", + "print('>>>>>>>testing : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting))\n", + "exp.test(setting, data='val')\n", + "exp.test(setting, data='test')\n", + "\n", + "torch.cuda.empty_cache()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "563c1c4c", + "metadata": { + "ExecuteTime": { + "start_time": "2022-11-28T10:35:02.332Z" + } + }, + "outputs": [], + "source": [ + "exp.model" + ] + }, + { + "cell_type": "markdown", + "id": "72811788", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T05:28:20.356399Z", + "start_time": "2022-11-28T05:28:20.339961Z" + } + }, + "source": [ + "# Plot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92b67ed7", + "metadata": { + "ExecuteTime": { + "start_time": "2022-11-28T10:35:02.599Z" + } + }, + "outputs": [], + "source": [ + "setting" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ebea79f7", + "metadata": { + "ExecuteTime": { + "start_time": "2022-11-28T10:35:02.716Z" + } + }, + "outputs": [], + "source": [ + "ds, dl = exp._get_data('test')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9833f218", + "metadata": { + "ExecuteTime": { + "start_time": "2022-11-28T10:35:02.866Z" + } + }, + "outputs": [], + "source": [ + "preds, trues = exp.test(setting, data='test')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "658546f2", + "metadata": { + "ExecuteTime": { + "start_time": "2022-11-28T10:35:02.999Z" + } + }, + "outputs": [], + "source": [ + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5c88dbf7", + "metadata": { + "ExecuteTime": { + "start_time": "2022-11-28T10:35:03.149Z" + } + }, + "outputs": [], + "source": [ + "i=990\n", + "(batch_x, batch_y, batch_x_mark, batch_y_mark) = ds[i]\n", + "l1 = batch_x.shape[0]\n", + "l2 = batch_y.shape[0]\n", + "plt.plot(range(l1), batch_x[:, -1], label='past')\n", + "plt.plot(range(l1, l1+l2), batch_y[:, -1], color='blue', ls='--', label='true')\n", + "plt.plot(range(l1, l1+l2), preds[i], label='pred');\n", + "plt.legend(loc='lower left')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0a25923b", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T07:33:57.703528Z", + "start_time": "2022-11-28T07:33:57.689258Z" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "665b98c3", + "metadata": {}, + "source": [ + "# TODO check index" + ] + }, + { + "cell_type": "markdown", + "id": "fc6ff0cd", + "metadata": {}, + "source": [ + "- s_end = index + self.seq_len\n", + "- r_begin = index + self.seq_len - self.label_len\n", + "- r_end = index + self.seq_len + self.pred_len" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f482f601", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T10:34:56.644236Z", + "start_time": "2022-11-28T10:34:56.644230Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "f = ds.root_path + '/' + ds.data_path\n", + "df = pd.read_csv(f).set_index('date', drop=False)\n", + "df = df[ds.cols[1:]]\n", + "# df[:] = ds.scaler.transform(df.values)\n", + "df\n", + "# df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1893beae", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T10:34:56.644919Z", + "start_time": "2022-11-28T10:34:56.644913Z" + } + }, + "outputs": [], + "source": [ + "from data_provider.data_loader import Dataset_Custom\n", + "ds2 = Dataset_Custom(\n", + " ds.root_path,\n", + " flag=\"test\",\n", + "# size=ds.size,\n", + " size=[ds.seq_len, ds.label_len, ds.pred_len],\n", + " features=ds.features,\n", + " data_path=ds.data_path,\n", + " target=ds.target,\n", + " scale=False,\n", + " timeenc=ds.timeenc,\n", + " freq=ds.freq\n", + ")\n", + "\n", + "i=99\n", + "(batch_x, batch_y, batch_x_mark, batch_y_mark) = ds2[i]\n", + "batch_x[-1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f0a63562", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T10:34:56.645465Z", + "start_time": "2022-11-28T10:34:56.645459Z" + } + }, + "outputs": [], + "source": [ + "dt = ds2.index.iloc[i-1]\n", + "df.loc[dt]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "65c56ec5", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T10:34:56.646111Z", + "start_time": "2022-11-28T10:34:56.646104Z" + } + }, + "outputs": [], + "source": [ + "assert df.loc[dt].close == batch_x[-1, 0], 'index should be right'\n", + "'OK'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "692aadfa", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2dd11010", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e4413025", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "deeptime", + "language": "python", + "name": "deeptime" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/001_001_run-S.ipynb b/notebooks/001_001_run-S.ipynb index f21754d..33636ab 100644 --- a/notebooks/001_001_run-S.ipynb +++ b/notebooks/001_001_run-S.ipynb @@ -6,8 +6,8 @@ "id": "0c996f31", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T07:35:38.923189Z", - "start_time": "2022-11-28T07:35:38.921272Z" + "end_time": "2022-11-28T08:05:25.343764Z", + "start_time": "2022-11-28T08:05:25.341915Z" } }, "outputs": [], @@ -22,8 +22,8 @@ "id": "23a27691", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T07:35:38.952520Z", - "start_time": "2022-11-28T07:35:38.923991Z" + "end_time": "2022-11-28T08:05:25.373979Z", + "start_time": "2022-11-28T08:05:25.344792Z" } }, "outputs": [], @@ -42,8 +42,8 @@ "id": "e60bfdb0", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T07:35:38.970942Z", - "start_time": "2022-11-28T07:35:38.953975Z" + "end_time": "2022-11-28T08:05:25.391886Z", + "start_time": "2022-11-28T08:05:25.375700Z" } }, "outputs": [], @@ -61,8 +61,8 @@ "id": "d52338d2", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T07:35:39.765300Z", - "start_time": "2022-11-28T07:35:38.972353Z" + "end_time": "2022-11-28T08:05:26.106212Z", + "start_time": "2022-11-28T08:05:25.392963Z" } }, "outputs": [], @@ -87,8 +87,8 @@ "id": "750cdcc3", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T07:35:40.047980Z", - "start_time": "2022-11-28T07:35:39.766356Z" + "end_time": "2022-11-28T08:05:26.385536Z", + "start_time": "2022-11-28T08:05:26.107218Z" } }, "outputs": [], @@ -98,11 +98,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "b3a40300", "metadata": { "ExecuteTime": { - "start_time": "2022-11-28T07:36:20.551Z" + "end_time": "2022-11-28T08:57:00.631472Z", + "start_time": "2022-11-28T08:07:12.981164Z" } }, "outputs": [ @@ -111,10 +112,10 @@ "output_type": "stream", "text": [ "Args in experiment:\n", - "Namespace(K=0, activation='sigmoid', batch_size=32, c_out=1, checkpoints='./checkpoints/', d_ff=2048, d_layers=2, d_model=512, damping_learning_rate=0, data='custom', data_path='OXY_2019.csv.gz', dec_in=7, des=\"'Exp'\", devices='0,1,2,3', dropout=0.2, e_layers=2, embed='timeF', enc_in=1, features='S', freq='h', gpu=0, itr=1, label_len=0, learning_rate=0.001, lradj='exponential_with_warmup', min_lr=1e-30, model='ETSformer', model_id='Exchange', n_heads=8, num_workers=0, optim='adam', output_attention=False, patience=5, pred_len=48, root_path='../dataset/stocks/', seq_len=128, smoothing_learning_rate=0, std=0.2, target='RSMKs_18_144_72_2ref_2ref', train_epochs=15, use_gpu=True, use_multi_gpu=False, warmup_epochs=3)\n", + "Namespace(K=0, activation='sigmoid', batch_size=32, c_out=1, checkpoints='./checkpoints/', d_ff=2048, d_layers=4, d_model=512, damping_learning_rate=0, data='custom', data_path='OXY_2019.csv.gz', dec_in=7, des=\"'Exp'\", devices='0,1,2,3', dropout=0.2, e_layers=4, embed='timeF', enc_in=1, features='S', freq='h', gpu=0, itr=1, label_len=0, learning_rate=0.0001, lradj='exponential_with_warmup', min_lr=1e-30, model='ETSformer', model_id='Exchange', n_heads=8, num_workers=0, optim='adam', output_attention=False, patience=5, pred_len=48, root_path='../dataset/stocks/', seq_len=256, smoothing_learning_rate=0, std=0.2, target='RSMKs_18_144_72_2ref_2ref', train_epochs=15, use_gpu=True, use_multi_gpu=False, warmup_epochs=3)\n", "Use GPU: cuda:0\n", - ">>>>>>>start training : Exchange_ETSformer_custom_ftS_sl128_pl48_dm512_nh8_el2_dl2_df2048_K0_lr0.001_'Exp'_0>>>>>>>>>>>>>>>>>>>>>>>>>>\n", - "train 37203\n", + ">>>>>>>start training : Exchange_ETSformer_custom_ftS_sl256_pl48_dm512_nh8_el4_dl4_df2048_K0_lr0.0001_'Exp'_0>>>>>>>>>>>>>>>>>>>>>>>>>>\n", + "train 37075\n", "val 5294\n", "test 10632\n" ] @@ -122,7 +123,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "60de03af10a54c008b02a13e686d7a8e", + "model_id": "70a188ffee114abfa0fc2128df82570c", "version_major": 2, "version_minor": 0 }, @@ -141,11 +142,324 @@ "version_minor": 0 }, "text/plain": [ - "train: 0%| | 0/1162 [00:00 0.096589). Saving model ...\n", + "Updating learning rate to 2.5e-05\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/1158 [00:00 0.069827). Saving model ...\n", + "Updating learning rate to 5e-05\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/1158 [00:00 0.058803). Saving model ...\n", + "Updating learning rate to 7.500000000000001e-05\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/1158 [00:00 0.055498). Saving model ...\n", + "Updating learning rate to 0.0001\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/1158 [00:00 0.055370). Saving model ...\n", + "Updating learning rate to 5e-05\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/1158 [00:00 0.053633). Saving model ...\n", + "Updating learning rate to 2.5e-05\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/1158 [00:00 0.051673). Saving model ...\n", + "Updating learning rate to 1.25e-05\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/1158 [00:00>>>>>>testing : Exchange_ETSformer_custom_ftS_sl256_pl48_dm512_nh8_el4_dl4_df2048_K0_lr0.0001_'Exp'_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n", + "val 5294\n", + "loading model\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/165 [00:00" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "i=990\n", "(batch_x, batch_y, batch_x_mark, batch_y_mark) = ds[i]\n", @@ -320,15 +725,316 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "f482f601", "metadata": { "ExecuteTime": { - "start_time": "2022-11-28T07:36:25.268Z" + "end_time": "2022-11-28T10:36:01.084244Z", + "start_time": "2022-11-28T10:36:00.763026Z" }, "scrolled": true }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
closeref_closesec_closeRVOLs_50_12_2ref_2refMACDVs_3_10_9_2ref_2refMACDVs_8_24_9_2ref_2refRRVOLs_50_12_2ref_2refRSMKs_3_24_12_2ref_2refRSMKs_128_8_4_2ref_2refRRSs_12_12_12_2ref_2refVRRSs_5_21_12_2ref_2refRSMKs_18_144_72_2ref_2ref
date
2019-01-02 07:00:0060.7500246.390056.700.6345610.2288220.749770-0.0815720.7549480.0419740.4528820.094300-0.141763
2019-01-02 09:30:0060.2000246.300056.300.619485-0.1382710.516611-0.1595450.6907520.0373100.201226-0.050731-0.127774
2019-01-02 09:35:0059.8500246.520056.360.689500-0.5355640.191501-0.1047520.5533760.027199-0.217425-0.069932-0.117113
2019-01-02 09:40:0060.0600246.900156.700.746596-0.803242-0.130051-0.0707610.4029110.015511-0.473000-0.089949-0.109966
2019-01-02 09:45:0060.2350247.140056.690.701637-0.936439-0.409001-0.1305810.2636640.003868-0.679096-0.096488-0.105561
.......................................
2020-12-31 17:35:0017.3300374.210037.900.706492-0.129955-0.5517040.197178-0.842459-0.216290-3.579407-0.088556-1.118991
2020-12-31 18:30:0017.3200374.400037.960.615936-0.147461-0.5389420.174563-0.803874-0.213881-3.258388-0.075389-1.179880
2020-12-31 19:15:0017.3600374.390037.950.605291-0.105155-0.5081920.226633-0.756699-0.210656-2.735903-0.063731-1.239256
2020-12-31 19:20:0017.3501374.390037.950.592393-0.065321-0.4753750.268617-0.720279-0.207647-2.416748-0.053941-1.297199
2020-12-31 19:55:0017.4000374.390037.950.5048770.054870-0.4086120.198019-0.664792-0.201618-2.009522-0.045287-1.352772
\n", + "

53398 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " close ref_close sec_close RVOLs_50_12_2ref_2ref \\\n", + "date \n", + "2019-01-02 07:00:00 60.7500 246.3900 56.70 0.634561 \n", + "2019-01-02 09:30:00 60.2000 246.3000 56.30 0.619485 \n", + "2019-01-02 09:35:00 59.8500 246.5200 56.36 0.689500 \n", + "2019-01-02 09:40:00 60.0600 246.9001 56.70 0.746596 \n", + "2019-01-02 09:45:00 60.2350 247.1400 56.69 0.701637 \n", + "... ... ... ... ... \n", + "2020-12-31 17:35:00 17.3300 374.2100 37.90 0.706492 \n", + "2020-12-31 18:30:00 17.3200 374.4000 37.96 0.615936 \n", + "2020-12-31 19:15:00 17.3600 374.3900 37.95 0.605291 \n", + "2020-12-31 19:20:00 17.3501 374.3900 37.95 0.592393 \n", + "2020-12-31 19:55:00 17.4000 374.3900 37.95 0.504877 \n", + "\n", + " MACDVs_3_10_9_2ref_2ref MACDVs_8_24_9_2ref_2ref \\\n", + "date \n", + "2019-01-02 07:00:00 0.228822 0.749770 \n", + "2019-01-02 09:30:00 -0.138271 0.516611 \n", + "2019-01-02 09:35:00 -0.535564 0.191501 \n", + "2019-01-02 09:40:00 -0.803242 -0.130051 \n", + "2019-01-02 09:45:00 -0.936439 -0.409001 \n", + "... ... ... \n", + "2020-12-31 17:35:00 -0.129955 -0.551704 \n", + "2020-12-31 18:30:00 -0.147461 -0.538942 \n", + "2020-12-31 19:15:00 -0.105155 -0.508192 \n", + "2020-12-31 19:20:00 -0.065321 -0.475375 \n", + "2020-12-31 19:55:00 0.054870 -0.408612 \n", + "\n", + " RRVOLs_50_12_2ref_2ref RSMKs_3_24_12_2ref_2ref \\\n", + "date \n", + "2019-01-02 07:00:00 -0.081572 0.754948 \n", + "2019-01-02 09:30:00 -0.159545 0.690752 \n", + "2019-01-02 09:35:00 -0.104752 0.553376 \n", + "2019-01-02 09:40:00 -0.070761 0.402911 \n", + "2019-01-02 09:45:00 -0.130581 0.263664 \n", + "... ... ... \n", + "2020-12-31 17:35:00 0.197178 -0.842459 \n", + "2020-12-31 18:30:00 0.174563 -0.803874 \n", + "2020-12-31 19:15:00 0.226633 -0.756699 \n", + "2020-12-31 19:20:00 0.268617 -0.720279 \n", + "2020-12-31 19:55:00 0.198019 -0.664792 \n", + "\n", + " RSMKs_128_8_4_2ref_2ref RRSs_12_12_12_2ref_2ref \\\n", + "date \n", + "2019-01-02 07:00:00 0.041974 0.452882 \n", + "2019-01-02 09:30:00 0.037310 0.201226 \n", + "2019-01-02 09:35:00 0.027199 -0.217425 \n", + "2019-01-02 09:40:00 0.015511 -0.473000 \n", + "2019-01-02 09:45:00 0.003868 -0.679096 \n", + "... ... ... \n", + "2020-12-31 17:35:00 -0.216290 -3.579407 \n", + "2020-12-31 18:30:00 -0.213881 -3.258388 \n", + "2020-12-31 19:15:00 -0.210656 -2.735903 \n", + "2020-12-31 19:20:00 -0.207647 -2.416748 \n", + "2020-12-31 19:55:00 -0.201618 -2.009522 \n", + "\n", + " VRRSs_5_21_12_2ref_2ref RSMKs_18_144_72_2ref_2ref \n", + "date \n", + "2019-01-02 07:00:00 0.094300 -0.141763 \n", + "2019-01-02 09:30:00 -0.050731 -0.127774 \n", + "2019-01-02 09:35:00 -0.069932 -0.117113 \n", + "2019-01-02 09:40:00 -0.089949 -0.109966 \n", + "2019-01-02 09:45:00 -0.096488 -0.105561 \n", + "... ... ... \n", + "2020-12-31 17:35:00 -0.088556 -1.118991 \n", + "2020-12-31 18:30:00 -0.075389 -1.179880 \n", + "2020-12-31 19:15:00 -0.063731 -1.239256 \n", + "2020-12-31 19:20:00 -0.053941 -1.297199 \n", + "2020-12-31 19:55:00 -0.045287 -1.352772 \n", + "\n", + "[53398 rows x 12 columns]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f = ds.root_path + '/' + ds.data_path\n", "df = pd.read_csv(f).set_index('date', drop=False)\n", @@ -340,14 +1046,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "1893beae", "metadata": { "ExecuteTime": { - "start_time": "2022-11-28T07:36:25.268Z" + "end_time": "2022-11-28T10:36:01.752475Z", + "start_time": "2022-11-28T10:36:01.610159Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([-3.5727635])" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from data_provider.data_loader import Dataset_Custom\n", "ds2 = Dataset_Custom(\n", @@ -370,14 +1088,102 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, + "id": "ad5e1a84", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T10:36:10.570813Z", + "start_time": "2022-11-28T10:36:10.553352Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'RSMKs_18_144_72_2ref_2ref'" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds.target" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "c9a56c82", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T10:36:14.702876Z", + "start_time": "2022-11-28T10:36:14.689691Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['date',\n", + " 'close',\n", + " 'ref_close',\n", + " 'sec_close',\n", + " 'RVOLs_50_12_2ref_2ref',\n", + " 'MACDVs_3_10_9_2ref_2ref',\n", + " 'MACDVs_8_24_9_2ref_2ref',\n", + " 'RRVOLs_50_12_2ref_2ref',\n", + " 'RSMKs_3_24_12_2ref_2ref',\n", + " 'RSMKs_128_8_4_2ref_2ref',\n", + " 'RRSs_12_12_12_2ref_2ref',\n", + " 'VRRSs_5_21_12_2ref_2ref',\n", + " 'RSMKs_18_144_72_2ref_2ref']" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds.cols" + ] + }, + { + "cell_type": "code", + "execution_count": 15, "id": "f0a63562", "metadata": { "ExecuteTime": { - "start_time": "2022-11-28T07:36:25.268Z" + "end_time": "2022-11-28T10:36:01.892659Z", + "start_time": "2022-11-28T10:36:01.875741Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "close 12.425000\n", + "ref_close 354.330000\n", + "sec_close 35.270000\n", + "RVOLs_50_12_2ref_2ref 0.624195\n", + "MACDVs_3_10_9_2ref_2ref -0.120630\n", + "MACDVs_8_24_9_2ref_2ref 0.464484\n", + "RRVOLs_50_12_2ref_2ref -0.396678\n", + "RSMKs_3_24_12_2ref_2ref 1.041695\n", + "RSMKs_128_8_4_2ref_2ref -0.028802\n", + "RRSs_12_12_12_2ref_2ref -0.461073\n", + "VRRSs_5_21_12_2ref_2ref -0.009818\n", + "RSMKs_18_144_72_2ref_2ref -3.572763\n", + "Name: 2020-09-02 11:20:00, dtype: float64" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "dt = ds2.index.iloc[i-1]\n", "df.loc[dt]" @@ -385,14 +1191,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "65c56ec5", "metadata": { "ExecuteTime": { - "start_time": "2022-11-28T07:36:25.268Z" + "end_time": "2022-11-28T10:36:02.191462Z", + "start_time": "2022-11-28T10:36:02.167071Z" } }, - "outputs": [], + "outputs": [ + { + "ename": "AssertionError", + "evalue": "index should be right", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn [16], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m df\u001b[38;5;241m.\u001b[39mloc[dt]\u001b[38;5;241m.\u001b[39mclose \u001b[38;5;241m==\u001b[39m batch_x[\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m0\u001b[39m], \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mindex should be right\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mOK\u001b[39m\u001b[38;5;124m'\u001b[39m\n", + "\u001b[0;31mAssertionError\u001b[0m: index should be right" + ] + } + ], "source": [ "assert df.loc[dt].close == batch_x[-1, 0], 'index should be right'\n", "'OK'" diff --git a/notebooks/001_001_run_MS2S.ipynb b/notebooks/001_001_run_MS2S.ipynb index 5fb914f..25bd7d9 100644 --- a/notebooks/001_001_run_MS2S.ipynb +++ b/notebooks/001_001_run_MS2S.ipynb @@ -3,11 +3,11 @@ { "cell_type": "code", "execution_count": 1, - "id": "0658b47c", + "id": "d1559174", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T07:36:13.547954Z", - "start_time": "2022-11-28T07:36:13.546254Z" + "end_time": "2022-11-28T08:06:55.731972Z", + "start_time": "2022-11-28T08:06:55.730182Z" } }, "outputs": [], @@ -19,11 +19,11 @@ { "cell_type": "code", "execution_count": 2, - "id": "6257d783", + "id": "61b1369e", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T07:36:13.578925Z", - "start_time": "2022-11-28T07:36:13.548651Z" + "end_time": "2022-11-28T08:06:55.760248Z", + "start_time": "2022-11-28T08:06:55.733246Z" } }, "outputs": [], @@ -39,11 +39,11 @@ { "cell_type": "code", "execution_count": 3, - "id": "9e215049", + "id": "94cb38fd", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T07:36:13.597024Z", - "start_time": "2022-11-28T07:36:13.580545Z" + "end_time": "2022-11-28T08:06:55.780884Z", + "start_time": "2022-11-28T08:06:55.762049Z" } }, "outputs": [], @@ -58,11 +58,11 @@ { "cell_type": "code", "execution_count": 4, - "id": "d12e975b", + "id": "a58d9d6f", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T07:36:14.269826Z", - "start_time": "2022-11-28T07:36:13.597868Z" + "end_time": "2022-11-28T08:06:56.489497Z", + "start_time": "2022-11-28T08:06:55.781984Z" } }, "outputs": [], @@ -75,7 +75,7 @@ }, { "cell_type": "markdown", - "id": "26c0133f", + "id": "77f600e7", "metadata": {}, "source": [ "# Args" @@ -84,11 +84,11 @@ { "cell_type": "code", "execution_count": 5, - "id": "13445106", + "id": "b46f211d", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T07:36:14.530041Z", - "start_time": "2022-11-28T07:36:14.270844Z" + "end_time": "2022-11-28T08:06:56.762126Z", + "start_time": "2022-11-28T08:06:56.490469Z" } }, "outputs": [], @@ -98,11 +98,12 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "7c9a419a", + "execution_count": 6, + "id": "dcc0f57b", "metadata": { "ExecuteTime": { - "start_time": "2022-11-28T07:36:13.551Z" + "end_time": "2022-11-28T08:48:29.460882Z", + "start_time": "2022-11-28T08:06:56.763160Z" } }, "outputs": [ @@ -111,10 +112,10 @@ "output_type": "stream", "text": [ "Args in experiment:\n", - "Namespace(K=0, activation='sigmoid', batch_size=32, c_out=1, checkpoints='./checkpoints/', d_ff=2048, d_layers=2, d_model=512, damping_learning_rate=0, data='custom', data_path='OXY_2019.csv.gz', dec_in=7, des=\"'Exp'\", devices='0,1,2,3', dropout=0.2, e_layers=2, embed='timeF', enc_in=12, features='M', freq='h', gpu=0, itr=1, label_len=0, learning_rate=0.0001, lradj='exponential_with_warmup', min_lr=1e-30, model='ETSformer', model_id='Exchange', n_heads=8, num_workers=0, optim='adam', output_attention=False, patience=5, pred_len=48, root_path='../dataset/stocks/', seq_len=128, smoothing_learning_rate=0, std=0.2, target='RSMKs_18_144_72_2ref_2ref', train_epochs=15, use_gpu=True, use_multi_gpu=False, warmup_epochs=3)\n", + "Namespace(K=0, activation='sigmoid', batch_size=32, c_out=1, checkpoints='./checkpoints/', d_ff=2048, d_layers=3, d_model=512, damping_learning_rate=0, data='custom', data_path='OXY_2019.csv.gz', dec_in=7, des=\"'Exp'\", devices='0,1,2,3', dropout=0.2, e_layers=3, embed='timeF', enc_in=12, features='M2S', freq='h', gpu=0, itr=1, label_len=0, learning_rate=0.0003, lradj='exponential_with_warmup', min_lr=1e-30, model='ETSformer', model_id='Exchange', n_heads=8, num_workers=0, optim='adam', output_attention=False, patience=5, pred_len=48, root_path='../dataset/stocks/', seq_len=256, smoothing_learning_rate=0, std=0.2, target='RSMKs_18_144_72_2ref_2ref', train_epochs=15, use_gpu=True, use_multi_gpu=False, warmup_epochs=3)\n", "Use GPU: cuda:0\n", - ">>>>>>>start training : Exchange_ETSformer_custom_ftM_sl128_pl48_dm512_nh8_el2_dl2_df2048_K0_lr0.0001_'Exp'_0>>>>>>>>>>>>>>>>>>>>>>>>>>\n", - "train 37203\n", + ">>>>>>>start training : Exchange_ETSformer_custom_ftM2S_sl256_pl48_dm512_nh8_el3_dl3_df2048_K0_lr0.0003_'Exp'_0>>>>>>>>>>>>>>>>>>>>>>>>>>\n", + "train 37075\n", "val 5294\n", "test 10632\n" ] @@ -122,7 +123,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "f7c396e54a674bb5abfb80976d10fe3c", + "model_id": "85f7ec0327cb49e1a18c800612f4382d", "version_major": 2, "version_minor": 0 }, @@ -141,7 +142,7 @@ "version_minor": 0 }, "text/plain": [ - "train: 0%| | 0/1162 [00:00 0.084722). Saving model ...\n", - "Updating learning rate to 2.5e-05\n" + "Epoch: 1, Steps: 1158 | Train Loss: 0.3039489 Vali Loss: 0.0921374 Test Loss: 0.1340459\n", + "Validation loss decreased (inf --> 0.092137). Saving model ...\n", + "Updating learning rate to 7.5e-05\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e7d71c496b224619b4bae1c73e47c68d", + "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "train: 0%| | 0/1162 [00:00 0.041739). Saving model ...\n", + "Updating learning rate to 0.00015\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/1158 [00:00 0.033035). Saving model ...\n", + "Updating learning rate to 0.000225\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/1158 [00:00 0.031572). Saving model ...\n", + "Updating learning rate to 0.0003\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/1158 [00:00 0.025253). Saving model ...\n", + "Updating learning rate to 0.00015\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/1158 [00:00 0.023389). Saving model ...\n", + "Updating learning rate to 7.5e-05\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/1158 [00:00>>>>>>testing : Exchange_ETSformer_custom_ftM2S_sl256_pl48_dm512_nh8_el3_dl3_df2048_K0_lr0.0003_'Exp'_0<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n", + "val 5294\n", + "loading model\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/165 [00:00" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAi8AAAGdCAYAAADaPpOnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAABUBUlEQVR4nO3dd3hUZf7+8fdMeg+BFAIJIbQA0mtAygoKoi6WtSCuoAhYUFHUxd8uuqu7i19X14K9gopdUSzgojRBSOid0AIBQggQ0nvm/P4YiEZaApmcKffruuYymTln5jOPk+TmOU+xGIZhICIiIuIirGYXICIiIlIXCi8iIiLiUhReRERExKUovIiIiIhLUXgRERERl6LwIiIiIi5F4UVERERcisKLiIiIuBRvswuobzabjczMTEJCQrBYLGaXIyIiIrVgGAYFBQXExsZitZ69b8XtwktmZiZxcXFmlyEiIiLnYf/+/TRv3vysx7hdeAkJCQHsbz40NNTkakRERKQ28vPziYuLq/47fjZuF15OXioKDQ1VeBEREXExtRnyoQG7IiIi4lIUXkRERMSlKLyIiIiIS1F4EREREZei8CIiIiIuReFFREREXIrCi4iIiLgUhRcRERFxKQovIiIi4lIUXkRERMSlKLyIiIiIS1F4EREREZfidhszioiIuKLKSsjIgD17YP9+OHIECgrgvvsgMtJ+zLx5sHQpNGkCF10E3brZH6vFXoYYBths9mOtLt51ofAiIiJiouefh9dfh927oaLi1MdvueXX8LJ8OTz1VM3HIyKgZUto0QKeecb+NcD8+fDFF/bn3bMHDh2C8nJ7eGnWDObOtYcfV6TwIiIi0gCOH4dXXoEPP4QffoDmze33FxXB9u32r/38IDER4uMhOhpCQyE8/NfnGDDA3hOTlQXr1sGuXZCTY7+tWWMPQictWABvvXVqHYYBBw5AQsKv9z3/PKxYAWPGwLBh4OVVv++9vim8iIiIOJDNBi+/DI8/bg8wAEuWwOjR9q9vvBF694a2bSEu7uyXdIYNs99OKimBnTth717Ytw+aNv31sX797OGnZUto3dre2xISAmVlkJkJjRr9eux779nD0KefQqtWMG2avcfHWUOMxTAMw+wi6lN+fj5hYWHk5eURGhpqdjkiIuLBDhywh5SlS+3fd+wIDz0E11wDYWHm1vZbq1bB7Nnw/vv2XhyA7t3toatv34apoS5/v118yI6IiIhzWrzYHgCWLoXgYPslow0bYOxY5wouAL162S8dZWTA//2fvb61ayE5GZ5+2uzqTqXwIiIi4gAvv2yfMdS1qz203HWX816GOSkoCB55BNLS7ONfrFYYPNjsqk6l8CIiIuIAb78Njz4Kv/xiH4TrSqKjYeZM2LHDPh7npHfesQcxsym8iIiI1IP9++GJJ+yzecA+WPbf/4aAAHPruhCtWv369c6d9t6jnj3tX5tJs41EREQu0MqVMHIkZGfbpzbfd5/ZFdW/4GC46irw8YE2bcytReFFRETkAsyZAzffDKWl0KWLPcS4o6ZN4fPP7QvdmU2XjURERM7Tm2/Cn/5kDy5XXAHLltlXunVnvr5mV6DwIiIicl6eew4mTLAvQnfHHfDVV/ZLK+J4Ci8iIiJ1tH27fbE5gL/8Bd54A7w1EKPBqKlFRETqKCnJPpU4Pd2+lH5tdnWW+qPwIiIiUkvl5b+O+fjzn82txZPpspGIiEgtfPihfbn/gwfNrkQUXkRERM7hhx/sy+Vv2WJfOVfMpfAiIiJyFqtWwXXXQWUljBoFf/ub2RWJwouIiMgZpKXB5ZdDURFceql9kK5VfzlNp/8FIiIip3H4MAwfDseO2ffz+eIL51igTRReRERETuuuu2DvXvvmhN9/DyEhZlckJzk0vOTk5DB69GhCQ0MJDw9n3LhxFBYWnvX4e++9l3bt2hEQEEB8fDz33XcfeXl5jixTRESkms1mkFNUzowZMHQozJsHkZFmVyW/5dDwMnr0aLZs2cKCBQv49ttvWbp0KRMmTDjj8ZmZmWRmZvLMM8+wefNmZs6cyfz58xk3bpwjyxQREak2a8VeLv3vErbnH2bBAvN3UJZTWQzDMBzxxNu2baNDhw6sWrWKnj17AjB//nxGjBjBgQMHiI2NrdXzfPbZZ9xyyy0UFRXhXYu1l/Pz8wkLCyMvL4/Q0NALeg8iIuJZdhwu4KoZyyirtPHGxYVc9oehENTY7LI8Ql3+fjus52XFihWEh4dXBxeAoUOHYrVaSUlJqfXznHwTZwouZWVl5Ofn17iJiIjUVXmljckfr6es0sa4Ftlcuv4+ePtSyEk3uzT5HYeFl6ysLKKiomrc5+3tTUREBFlZWbV6jqNHj/Lkk0+e9VLT9OnTCQsLq77FxcVdUN0iIuKZ3lq2h62H8mkU6MPdl/fAEhQFObvtAebYbrPLk9+oc3iZOnUqFovlrLft27dfcGH5+flcccUVdOjQgb///e9nPO7RRx8lLy+v+rZ///4Lfm0REfEs+3OKefGnnQBMu7IDjRM6wx0LIKYTFB2B76aAY0ZZyHmo88aMU6ZMYezYsWc9JjExkZiYGLKzs2vcX1lZSU5ODjExMWc9v6CggOHDhxMSEsKcOXPw8fE547F+fn74+fnVun4REZHfMgyDx+duobTCRt/ECK7p1sz+QEgM3PAevNwX9iyC7d9C+6vMLVaA8wgvkZGRRNZizlhycjK5ubmsWbOGHj16ALBw4UJsNht9+vQ543n5+fkMGzYMPz8/5s6di7+/f11LFBERqbUfthxm4fZsfLws/PPqi7BYLL8+GJEI/e+Dpf+B7x+B+H4awOsEHDbmpX379gwfPpzx48eTmprK8uXLmTRpEjfddFP1TKODBw+SlJREamoqYA8ul112GUVFRbz99tvk5+eTlZVFVlYWVVVVjipVREQ8VHF5Jf/4ZgsAEwe2onXUaVaiu/hBaNwGCjLh67t1+cgJOHSdl9mzZ5OUlMSQIUMYMWIEF198MW+88Ub14xUVFaSlpVFcXAzA2rVrSUlJYdOmTbRu3ZqmTZtW3zSWRURE6ttbP6dzKK+U5o0CmHRJ69Mf5BsI178LXn6wYz7MewRstoYtVGpw2DovZtE6LyIiUhtHCsoY/J9FFJVX8eKobvyxyznWH1v/IXx1N2DARX+CK56FgPCGKNUjOMU6LyIiIs7sxZ92UlReRZfmYVzZqem5T+h6M1z9ClissPlzeKUvrHwNSrW+WEOr84BdERERV7f7SCEfpmYAMPXy9litlnOccULXm+2DeL+6274GzPy/wIJp0KI/xPWBqPYQ0RKCYyAwArzOPFtWzp/Ci4iIeJyn52+nymYwJCmK5FZ1nD0U3xfuWm6/jJTyGhzdYZ9KvWfRqcf6BJ64BYCXrz3MWL3tvTdWL8Bi/9pisX8Np/m6Nmp7XD0Jaw7Xvdmwr/kbCi8iIuJR1u/P5Ycth7FaYOrlSef3JD4B0Gsc9Lz9RHhZApnr4NhOyM2wL2xn2KCi2H5zN43N3a1S4UVERDzKCz/uAOCabs1pE32aqdF1YbFAZDv77bdsVVCaZ79VFENlKVSWga3yxK3KHm4Mw/5fjBNTsH8zh+aU+TRONL/GN8jUl1d4ERERj7F+fy6L0o7gZbVw75mmRtcHq5d9zEtghONew4NptpGIiHiM56t7XZqR0MTc3gM5fwovIiLiEdZlHGdxQ/S6iMMpvIiIiEd44cSu0dd2a0aLxup1cWUa8yIi4uRKK6rYkpnH/pwSOjcPIzEy2OySXM6mA3m/6XUxd6aMXDiFFxERJ1VlM/gwNYPnF+zgWFF59f3d4sOZdmUHusc3MrE61/L60t0A/LFLLPGNA02uRi6ULhuJiDih0ooq7pm9lmlfbeZYUTlNgn3pGheOt9XCuoxcrn3lF56aZ19oTc5u37Eivt90CICJgxJNrkbqg3peREScTGWVjfHvrebnnUfx9bLy6IgkbunbAh8vK9kFpTw9P43P1xzgtSW72ZVdwMuju+Pn7WV22U7rrZ/TsRkwuF0kSTHasNcdqOdFRMTJPLtgBz/vPEqgrxczb+/Fbf1b4uNl/3UdFeLPM9d34YWbuuLnbeXHbdk88vlGbOqBOa1jhWV8uno/ABMHtjK5GqkvCi8iIk5k0fZsXl1sH5/x9J86069Vk9MeN7JrM94a0xNvq4Wv12fy4sKdDVmmy5i1Yh9llTa6NA+jb6IWjHMXCi8iIk7iWGEZD3++EYCx/RK4snPsWY8f0CaS6dd2AuDFn3ayam+Ow2t0JcXllby3Yi8AEwe1wlLrTQ7F2Sm8iIg4AcMwmPrlJo4WltE2OrjWGwZe3zOO67o3x2bA5I/XU1hW6eBKXccnq/aTW1xBi8aBDOsYY3Y5Uo8UXkREnMBnqw+wYOthfLwsPH9jN/x9aj8A9x8jOxIfEcjB3BKeX7DDgVW6jooqG2/9nA7A+AGJeFnV6+JOFF5EREyWcayYf3yzBYApl7WjQ2zdZsQE+3nzxMiOALz7y162Hcqv9xpdzXcbD3Ewt4Qmwb78qUdzs8uReqbwIiJioiqbwUOfbaCovIreLSMYP+D81iEZ3C6KEZ1iqLIZ/HXOJo+efWQYBq8tsQ96HpOcUKdeLHENCi8iIiZ6Z1k6qXtzCPL14tnru1zQ5Y3HruxIkK8XazNyq6cHe6LFO46wPauAQF8v/pzcwuxyxAEUXkRETLLzcAH/+V8aAH+7sgNxERe2bH1MmD8PXNoWgKfmbyevuOKCa3RFr52Yaj6qdzzhgb4mVyOOoPAiImKCiiobD366gfJKG4PbRXJTr7h6ed6x/RJoGx1MbnEFryzeVS/P6UrWZRwnJT0Hb6uFcRe3NLsccRCFFxERE7yyaDebDuYRFuDD/13Xud7WIPH2slZPs373l70czC2pl+d1FSfHuozs2ozY8ACTqxFHUXgREWlgmw7kMePEirhPjOxIdKh/vT7/H9pF0TcxgvJKG8+euCzlCXYfKeR/Ww8DcKc2YHRrCi8iIg2otKKKKZ+tp9JmMKJTDH/scvZVdM+HxWLh0cvbAzBn3UG2ZnrG1Ok3luzBMGBo+yjaRIeYXY44kMKLiEgDem7BDnYcLqRJsC//vLqTw5as7xIXzpWdm2IYMH3eNoe8hjM5nF/KnHUHAbhzkDZgdHcKLyIiDWRtxnHe+HkPANOv7UxEkGNnwjw8rB0+XhZ+3nmUX3Yfdehrme2dZemUV9no2aIRPRO0AaO7U3gREWkAlVU2/jpnM4YB13ZrxqUdoh3+mi0aB3FTr3gAnvkhDcNwz4Xr8koqmJ2SAajXxVMovIiINID3Vuxj26F8wgJ8+OsV7Rvsde+9pDX+PlbWZuSyKC27wV63Ic1O2UdhWSVtooK5JCnK7HKkASi8iIg42OH8Uv57YsPEvwxPonGwX4O9dlSoP2OSEwD4zw873G7bgNKKKt5ZtheAiYNaYdUGjB5B4UVExMH++d02Cssq6RIXXm+L0dXFnYNaEeznzbZD+Xy36VCDv74jfbn2IEcLy2ga5u+QmVvinBReREQcaMXuY3yzIROrBf519UWm9Aw0CvKt3vDxuQU7qKyyNXgNjlBlM3hjqX1RunEXt8TXW3/SPIX+T4uIOIhhGDw1fzsAN/eJ56JmYabVMm5ASyKCfNlztIgv1x40rY769MOWLPYeKyYswIdRvePNLkcakMKLiIiDzN+cxYb9uQT6enH/kLam1hLs583dg+0zcZ7/cQdllVWm1nOhDMOo3grg1uQWBPl5m1yRNCSFFxERB6issvGfH+xL898xIJHIkIYbpHsmt/RtQXSoH5l5pXx4Ymqxq1q84wgbD+Th72NlTL8Es8uRBqbwIiLiAJ+uPsCeo0U0DvJl/ADn2N3Y38eL+4a0AeDlRbsoLq80uaLzYxgGz52YvXVrcgJNGnD2ljgHhRcRkXpWUl7F8z/a/7hOuqQ1If4+Jlf0qxt6xhEfEcjRwnLeXb7X7HLOy0/bstl4II9AXy8mDtQGjJ5I4UVEpJ7NTtlHdkEZzRsFcHMf5xpI6uNl5cFL7eNvXl+ym9zicpMrqhvDMHjux197XRpyzRxxHgovIiL1qKyyijdP7F806Q+t8fP2MrmiU13VJZakmBDySyt5dfFus8upk/9tPcyWzHyCfL2YoF4Xj6XwIiJSj75Yc5DD+fZF067t3tzsck7Ly2rhL8OTAHj3l71k5paYXFHtVNl+HetyW/+WDt/YUpyXwouISD2prLJVT98dPyDRqRdNG9wukj4tIyivtFVvXeDsPlu9n+1ZBYT4e3OHkwyCFnM470+WiIiL+WZjJhk5xUQE+Tr9omkWi4VHR9g3iPxi7QG2Z+WbXNHZFZRW8Mz/7FPPJw9tS3igel08mcKLiEg9sNkMXln061L1Ab7ON9bl97rGhTOiUwyGAf+Zn2Z2OWf17P92cLSwnMTIIG5NbmF2OWIyhRcRkXrw0/ZsdmYXEuLvzZ9d6I/rQ5e1w8tq4aft2aTsOWZ2Oae1Zt9xZq3YC8A//tgRHy/96fJ0+gSIiNSDt07MMLq5TzyhTrSuy7kkRgZX73Q9fd52DMMwuaKaSiuq+MsXGzEMuK57cwa0iTS7JHECCi8iIhdo88E8UtJz8LZaGOuCS9XfP7QNAT5erN+fyw9bsswup4Z/fbeNXdmFRIb48bcr2ptdjjgJhRcRkQv0zrJ0AEZ0akrTsACTq6m7qBD/6i0Mnp6fRmWVzeSK7OZtOsT7K/cB8Oz1XWikqdFygsKLiMgFyM4v5ZuNmYB9oK6rGj8wkYggX/YcLeKT1fvNLoetmfk8+OkGAMYPaMnAtrpcJL9SeBERuQDvrdhHRZVBzxaN6BIXbnY55y3E34d7L2kNwHMLdpBXXGFaLfuOFXH7zFWUVFQxoE2T6gX1RE5SeBEROU+lFVXMTrFf1nCHRdNG92lBq8ggjhaW89T87abUsPNwAaPeWElWfimto4J5aVR3vDW7SH5HnwgRkfP0zYZMjhdX0LxRAJd2iDG7nAvm623l39d0AuCj1AxW7G64qdM2m8Gnq/bzx5eWk5lXSqvIID4c34ewQNeZuSUNR+FFROQ8fZiaAdinR3tZLSZXUz/6JDZmVG/71OnJn6zjWGGZQ1/PMAyW7jjCn177hUe+2EhJRRX9WjXmk4nJRIX4O/S1xXV5m12AiIgr2nYon3UZuXhbLVzfI87scurV367oQGp6DruPFDH5k/W8O7ZXvV+6ySuu4Iu1B/goNYOd2YUABPh4ce+Q1kwc2MptwqA4hsKLiMh5+OhEr8tlHaOJDPEzuZr6FeTnzcuju3P1y8v5eedRHp+7hX9efREWy/kFirziCnZmF7Azu5CdhwvZmV1AanoOZZX2KdmBvl7c2CuOiQNbEROm3hY5N4UXEZE6KimvYs7agwDc3Nt1tgKoi6SYUF68qRsTP1jD7JQMmgT78cClbc95ns1msCbjOD9szmJbVj47DhdypOD0l56SYkIY3Seekd2audSqxGI+hRcRkTr6dmMmBWWVxEcE0q9VY7PLcZjLOsbw96s68vjcLbzw0068rBbuvaT1KT0whmGwNiOX7zYe4vtNh8jKLz3luWLD/GkdHUKbqGDaRAVzUbMwOsaGnndvjng2hRcRkTo6OVD3pt5xWN18bMaYfgkUlVfy9Pw0/rtgBzuzCxnbL4GwAG8ycopZvusY8zdncTC3pPqcED9vLu0YTd/ExrSNDqFVZBAh6lmReuTQ8JKTk8O9997LN998g9Vq5brrruOFF14gODj4nOcahsGIESOYP38+c+bM4eqrr3ZkqSIiteLOA3XP5O7BrQny9eaJb7fyzYZMvtmQecoxQb5eDO0QzZWdYxnQpgn+Pl4mVCqewqHhZfTo0Rw6dIgFCxZQUVHBbbfdxoQJE/jwww/Pee7zzz+v7kQRcTruPFD3bMb0S6BDbChv/byH1XuPU1FlIzLEj14JEQxuF8ngdlEKLNJgHBZetm3bxvz581m1ahU9e/YEYMaMGYwYMYJnnnmG2NjYM567fv16nn32WVavXk3Tpk0dVaKISJ14wkDds+mVEEGvhAizyxBx3CJ1K1asIDw8vDq4AAwdOhSr1UpKSsoZzysuLubmm2/m5ZdfJibm3CtWlpWVkZ+fX+MmIuII33jIQF0RZ+ew8JKVlUVUVFSN+7y9vYmIiCArK+uM5z3wwAP069ePkSNH1up1pk+fTlhYWPUtLs4zrkGLSMM7ecloVO94tx+oK+LM6hxepk6disViOett+/bz29Br7ty5LFy4kOeff77W5zz66KPk5eVV3/bvN38rdxFxP78dqPunHs3NLkfEo9V5zMuUKVMYO3bsWY9JTEwkJiaG7OzsGvdXVlaSk5NzxstBCxcuZPfu3YSHh9e4/7rrrmPAgAEsXrz4lHP8/Pzw8/OcQXMiYg5PHagr4ozqHF4iIyOJjIw853HJycnk5uayZs0aevToAdjDic1mo0+fPqc9Z+rUqdxxxx017uvUqRPPPfccV111VV1LFRGpF8XllR49UFfE2ThstlH79u0ZPnw448eP57XXXqOiooJJkyZx0003Vc80OnjwIEOGDOG9996jd+/exMTEnLZXJj4+npYtWzqqVBGRs/p24yEN1BVxIg4bsAswe/ZskpKSGDJkCCNGjODiiy/mjTfeqH68oqKCtLQ0iouLHVmGiMgF0UBdEefi0EXqIiIizrogXUJCAoZhnPU5zvW4iIgjaaCuiPNxaM+LiIirO9nrMqxjjAbqijgJhRcRkTP47UDdUb3jTa5GRE5SeBEROQMN1BVxTgovIiJn8GGKBuqKOCOFFxGR09iamc/6/RqoK+KMFF5ERE5DA3VFnJfCi4jI7xSXV/LVOg3UFXFWCi8iIr/z7Qb7QN0WjTVQV8QZKbyIiPyGYRi8t3IvADf10kBdEWek8CIi8hur9x1n88F8/Lyt3NgrzuxyROQ0FF5ERH7jnWXpAFzTrRkRQb4mVyMip6PwIiJywoHjxfywJQuA2/prJ3sRZ6XwIiJywvsr9mEzoH/rxrSLCTG7HBE5A4UXERHs06NPru1yWz/1uog4M4UXERHgi7UHyS+1T4++JCnK7HJE5CwUXkTE41XZDN7+eQ8AY/slaHq0iJNTeBERj/e/LVnsPVZMWIAPN/TU9GgRZ6fwIiIezTAMXluyG4Bbk1sQ5OdtckUici4KLyLi0VLSc9hwIA9fbytj+iWYXY6I1ILCi4h4tNdP9Lpc36M5TYK1e7SIK1B4ERGPlZZVwKK0I1gsMH5AotnliEgtKbyIiMc62ety+UUxJDQJMrkaEakthRcR8Uj7jhXx9YZMAO4a1NrkakSkLhReRMQjvbZkN1U2g8HtIunUPMzsckSkDhReRMTjZOaW8PmaAwDce4l6XURcjcKLiHicN5buoaLKIDmxMT1aRJhdjojUkcKLiHiU7ILS6g0Y1esi4poUXkTEo7z9czpllTa6x4eT3Kqx2eWIyHlQeBERj3G8qJz3V+4D4N5L2mCxaANGEVek8CIiHuPd5ekUl1fRMTaUwe0izS5HRM6TwouIeIT80gre/WUvYB/rol4XEdel8CIiHuH9FfsoKK2kTVQwl3WIMbscEbkACi8i4vaKyip56+c9AEy6pDVWq3pdRFyZwouIuL3ZKfs4XlxBQuNArujU1OxyROQCKbyIiFsrKqvk9SX2Xpe7B7fG20u/9kRcnX6KRcStzVqxl2NF5bRoHMg13ZuZXY6I1AOFFxFxWwWlFbyx1N7rcv+QNvio10XELegnWUTc1rvL95JbXEFiZBAju6rXRcRdKLyIiFvKK6ngzRMzjCYPbYuXZhiJuA2FFxFxS2//vIeC0kraRgdzpWYYibgVhRcRcTvHi8p5Z/leAB4Y2lbruoi4GYUXEXE7b/68h8KySto3DWVYR62mK+JuFF5ExK0cKyxj5ok9jB68VL0uIu5I4UVE3MrrS/dQXF5F5+ZhDG0fZXY5IuIACi8i4jayC0p5b8VeAB64tK12jhZxUwovIuI2Xl28m9IKG93iwxncNtLsckTEQRReRMQtHMorYXZKBgBTLm2nXhcRN6bwIiJu4ZVFuymvtNE7IYL+rRubXY6IOJDCi4i4vMzcEj5eZe91efAyjXURcXcKLyLi8l5fspuKKoO+iRH0TVSvi4i7U3gREZeWnV/KR6v2A3DfJW1MrkZEGoLCi4i4tNeX7qG80kaPFo1IbqVeFxFPoPAiIi7raGEZs1P2AXDfkDYa6yLiIRReRMRlvfVzOqUVNro0D2NgmyZmlyMiDUThRURc0vGi8urVdO+9RL0uIp5E4UVEXNI7y9MpLq+iQ9NQhmgPIxGPovAiIi4nr6SCmcv3AnDfkNbqdRHxMA4LLzk5OYwePZrQ0FDCw8MZN24chYWF5zxvxYoVXHLJJQQFBREaGsrAgQMpKSlxVJki4oJm/bKXgrJK2kWHcFmHGLPLEZEG5rDwMnr0aLZs2cKCBQv49ttvWbp0KRMmTDjrOStWrGD48OFcdtllpKamsmrVKiZNmoTVqg4iEbErKK3g7WXpANxzSWusVvW6iHgai2EYRn0/6bZt2+jQoQOrVq2iZ8+eAMyfP58RI0Zw4MABYmNjT3te3759ufTSS3nyySfP+7Xz8/MJCwsjLy+P0NDQ834eEXFOryzexdPz00iMDGLBA4PwUngRcQt1+fvtkC6NFStWEB4eXh1cAIYOHYrVaiUlJeW052RnZ5OSkkJUVBT9+vUjOjqaQYMGsWzZMkeUKCIuqLSiird/tve6TPpDawUXEQ/lkPCSlZVFVFTN0f/e3t5ERESQlZV12nP27NkDwN///nfGjx/P/Pnz6d69O0OGDGHnzp1nfK2ysjLy8/Nr3ETEPX225gDHispp3iiAP3Y5fQ+uiLi/OoWXqVOnYrFYznrbvn37eRVis9kAmDhxIrfddhvdunXjueeeo127drzzzjtnPG/69OmEhYVV3+Li4s7r9UXEuVXZDN762f6PnDsubom3l8bCiXgq77ocPGXKFMaOHXvWYxITE4mJiSE7O7vG/ZWVleTk5BATc/qZAU2bNgWgQ4cONe5v3749GRkZZ3y9Rx99lAcffLD6+/z8fAUYETf0w5Ys9h0rJjzQhxt66WdcxJPVKbxERkYSGRl5zuOSk5PJzc1lzZo19OjRA4CFCxdis9no06fPac9JSEggNjaWtLS0Gvfv2LGDyy+//Iyv5efnh5+fXx3ehYi4GsMweH3JbgBu7duCQN86/eoSETfjkH7X9u3bM3z4cMaPH09qairLly9n0qRJ3HTTTdUzjQ4ePEhSUhKpqakAWCwWHn74YV588UU+//xzdu3axbRp09i+fTvjxo1zRJki4iJS0nPYcCAPP28rt/ZLMLscETGZw/75Mnv2bCZNmsSQIUOwWq1cd911vPjii9WPV1RUkJaWRnFxcfV9kydPprS0lAceeICcnBy6dOnCggULaNWqlaPKFBEXcLLX5fqezWkSrJ5WEU/nkHVezKR1XkTcy75jRQz6z2IsFlg0ZTAJTYLMLklEHMD0dV5EROrLhyn2AfsD20QquIgIoPAiIk6srLKKT1fvB+CWvi1MrkZEnIXCi4g4rfmbszheXEHTMH/+0O7cMx1FxDMovIiI0/pg5T4AbuoVr0XpRKSafhuIiFNKyypg1d7jeFkt3NRbi9KJyK8UXkTEKc1Osfe6XNo+muhQf5OrERFnovAiIk6nqKySL9ceBDRQV0ROpfAiIk7nmw2ZFJZVktA4kH6tGptdjog4GYUXEXEqhmHwwYlLRjf3icdqtZhckYg4G4UXEXEqGw/ksflgPr7eVv7UQwN1ReRUCi8i4lROTo++olNTIoJ8Ta5GRJyRwouIOI284gq+2ZgJwC19402uRkSclcKLiDiNL9cdoLTCRlJMCN3jG5ldjog4KYUXEXEKhmEw+8QmjKP7xGOxaKCuiJyewouIOIWU9Bx2ZRcS6OvF1d2amV2OiDgxhRcRcQonB+qO7NqMEH8fk6sREWem8CIipjtSUMYPW7IA+yUjEZGzUXgREdN9tmY/FVUGXePCuahZmNnliIiTU3gREVNV2Qw+/M1AXRGRc1F4ERFTLd15hAPHSwj19+aqLrFmlyMiLkDhRURMNfvEQN0/9YjD38fL5GpExBUovIiIaQ7mlrBwezYAo7WirojUksKLiJjmk9QMbAYkJzamVWSw2eWIiItQeBERU1RU2fh41X5AvS4iUjcKLyJiih+3Hia7oIwmwX5c1iHG7HJExIUovIiIKT5IsQ/UvbFXc3y99atIRGpPvzFEpMHtOVLI8l3HsFhgVG9dMhKRulF4EZEG91GqfVG6P7SLonmjQJOrERFXo/AiIg2qtKKKz9YcALSiroicH4UXEWlQ3286RG5xBc3CAxjcLsrsckTEBSm8iEiD+uDEirqjesfhZbWYXI2IuCKFFxFpMFsz81mbkYu31cINveLMLkdEXJTCi4g0mA9T7b0uwzrGEBXib3I1IuKqFF5EpEEUllUyZ+1BQAN1ReTCKLyISIP4ev1BisqrSGwSRHKrxmaXIyIuTOFFRBzOMAw+WGlf2+XmPvFYLBqoKyLnT+FFRBxu3f5cth3Kx8/byp96NDe7HBFxcQovIuJws0/0ulzZOZbwQF+TqxERV6fwIiIOlVtczrcbMwEY3VcDdUXkwim8iIhDfb7mAGWVNjo0DaVbXLjZ5YiIG1B4ERGHMQyDD1Psl4xG99VAXRGpHwovIuIwK3YfY8/RIoL9vBnZtZnZ5YiIm/A2uwABm83gwPES9uUUUVFlw2qx4GW1EBbgQ0SQL42D/Ajw9TK7TJE6+yDFvqLu1d1iCfbTrxsRqR/6bWISwzBITc/h8zUHWJSWzdHC8rMe3zTMn46xofRNbMywjjHERQQ2UKUi5yczt4QfthwGYHSfFiZXIyLuROGlgR0rLOOLtQf4eNV+9hwpqr7f19tKi4hA/H28sBkGVTaDvJIKjhWWU15l41BeKYfySvlxWzb//G4byYmNmTgokUFtIzWOQJzSByv3UWUz6JsYQfumoWaXIyJuROHFwQzDYN+xYlLTc/jf1iyW7DhCRZUBQKCvF3/sEssfu8TSMyECX+9ThyAZhkF+SSU7sgtYu+84i9OOsDL9GCv22G99Wkbwr2s60ToquKHfmsgZlVZU8VGqfaDu2H4tTa5GRNyNxTAMw+wi6lN+fj5hYWHk5eURGuq4f+0dKShj08FcDh4vwQAsFgtWC3hZLBwvruBQXgkHj5ew4UAeRwvLapzbJS6cUb3iuLLL+Y0DOJhbwrvL0vkgZR+lFTZ8va08dmUHRmvZdXESn67ezyOfb6RZeABLHh6Mt5fmBojI2dXl77d6XuqgtKKKH7cd5tPVB/h55xFqG/t8vCx0ahbGgDaRjOjUlHYxIRdUR7PwAP52ZQfG9Evgr19tZumOI/ztq82s3Xec6dd1ws9bg3vFPIZhMHP5XgBuTW6h4CIi9U7hpZZS9hxjwvtryCupqL6vbXQwCY2D8PayYLNBlWFgsxmEBfgQE+ZP0zB/2sWE0rl5GP4+9R8o4iICmTm2F+8sT2f6vO18ue4gmXklvD2mF0Ga2SEmWbX3OFsP5ePvY+XGXnFmlyMibkh/4WqpXUwIJeVVNA3z57ruzflTj+YkNAkyuyysVgt3DEikbXQId89ey8o9OYybtYp3x/bW9GoxxTvL0gG4pltz7WMkIg6hMS91sDUzn3YxIXhZnXNcyYb9udzyVgoFZZVc2iGa12/pgdVJaxX3tOdIIUP+uwTDgB8mD7zgS6Qi4jnq8vdbF6ProENsqNMGF7APBH73tl74eltZsPUw/12ww+ySxMO8+fMeDAMuSYpScBERh1F4cTM9EyJ46tpOALy0aBdzN2SaXJF4iuz8Ur5YcxCAOwe1MrkaEXFnCi9u6NruzZk4MBGAhz/bwMYDueYWJB7hneV7Ka+y0T0+nF4JjcwuR0TcmMKLm3pkeBJ/aBdJWaWNie+vOWWtGZH6lF9aweyV9n2M7hzUSusNiYhDKby4KS+rhRdGdSOxSRCH8kq5e/ZaKqpsZpclburDlAwKyippHRXM0PbRZpcjIm5O4cWNhfr78MatPQj28yY1PYd/fbfN7JLEDZVWVPH2ienREwYmaoabiDicwoubax0VwnM3dgVg5i97+XLtAXMLErfz2ZoDHCkoIzbMn6u7NjO7HBHxAA4LLzk5OYwePZrQ0FDCw8MZN24chYWFZz0nKyuLP//5z8TExBAUFET37t354osvHFWix7i0QzT3DWkDwN++2szuI2f//yBSWxVVNl5fshuAiYNanXZzURGR+uaw3zSjR49my5YtLFiwgG+//ZalS5cyYcKEs55z6623kpaWxty5c9m0aRPXXnstN9xwA+vWrXNUmR7j/iFtSE5sTHF5Ffd+uI7SiiqzSxI3MHd9JgeOl9Ak2FdbAYhIg3FIeNm2bRvz58/nrbfeok+fPlx88cXMmDGDjz/+mMzMM6878ssvv3DvvffSu3dvEhMT+dvf/kZ4eDhr1qxxRJkexctq4fmbuhIR5MvWQ/k8NW+72SWJi7PZDF5ZvAuAcRcnOmT/LhGR03FIeFmxYgXh4eH07Nmz+r6hQ4ditVpJSUk543n9+vXjk08+IScnB5vNxscff0xpaSmDBw8+4zllZWXk5+fXuMnpRYf68+z1XQD7+JcFWw+bXJG4sh+2ZLH7SBGh/t7c0jfe7HJExIM4JLxkZWURFRVV4z5vb28iIiLIyso643mffvopFRUVNG7cGD8/PyZOnMicOXNo3br1Gc+ZPn06YWFh1be4OHVdn80fkqIYP6AlAH/5YiPZBaUmVySuyDAMXj7R6zK2XwIh/j4mVyQinqRO4WXq1KlYLJaz3rZvP//LEdOmTSM3N5cff/yR1atX8+CDD3LDDTewadOmM57z6KOPkpeXV33bv3//eb++p3hoWDvaNw0lp6icRz7fiJvtzSkNYMmOI2w+mE+Ajxdj+7c0uxwR8TDedTl4ypQpjB079qzHJCYmEhMTQ3Z2do37KysrycnJISYm5rTn7d69m5deeonNmzfTsWNHALp06cLPP//Myy+/zGuvvXba8/z8/PDz86vL2/B4ft5evHBTV66csYzFaUf4YOU+/pycYHZZ4kJeWWSfYTS6TzwRQb4mVyMinqZO4SUyMpLIyMhzHpecnExubi5r1qyhR48eACxcuBCbzUafPn1Oe05xcTEAVmvNziAvLy9sNq0MW9/aRofw6OVJ/OObrfzzu20kt2pM6yjtAiznlpqeQ+reHHy9rIw/sYeWiEhDcsiYl/bt2zN8+HDGjx9Pamoqy5cvZ9KkSdx0003ExsYCcPDgQZKSkkhNTQUgKSmJ1q1bM3HiRFJTU9m9ezfPPvssCxYs4Oqrr3ZEmR5vTHICA9o0oazSxuRP1lNeqZAo5/byIvtYlz/1bE50qL/J1YiIJ3LYOi+zZ88mKSmJIUOGMGLECC6++GLeeOON6scrKipIS0ur7nHx8fHh+++/JzIykquuuorOnTvz3nvvMWvWLEaMGOGoMj2a1Wrhmeu7EB7ow+aD+Tz34w6zSxInt+lAHkt2HMHLauHOga3MLkdEPJTFcLPRmvn5+YSFhZGXl0doaKjZ5biEeZsOcdfstVgsMOu23gxse+5Lg+KZ7vpgDfM2Z3FNt2bV206IiNSHuvz91lrewuWdmjKqdzyGAZM/Wc+hvBKzSxIntPtIIfO32Jc6uGuwel1ExDwKLwLA41d1oGOsffr0pA/XUVGl8S9S05tL92AYMLR9FG2jNbhbRMyj8CIA+Pt48cro7oT4e7Nm33H+T9sHyG9k5ZXyxYkdydXrIiJmU3iRai0aB/HMie0D3lqWzvzNZ14NWTzLO8vTqagy6J0QQY8WEWaXIyIeTuFFahjWMaZ6+4CHP9vA3qNFJlckZssrrmD2yn2Ael1ExDkovMgpHhmeRM8WjSgoq+SO91ZTUFphdkliog9S9lFUXkVSTAiD22kmmoiYT+FFTuHjZeWV0d2JDvVjV3Yh93+8niqbW82ol1oqrajinWXpANw5qBUWi8XkikREFF7kDKJC/Xnz1p74eVtZuD2bp3/QAF5P9Nnq/RwrKqd5owCu7NzU7HJERACFFzmLzs3DefpPnQF4fckevjwx20Q8Q2WVjdeX7gFgwsBEvL3060JEnIN+G8lZjezajHv+YB+kOfXLTazLOG5yRdJQvtt0iAPHS4gI8uX6HnFmlyMiUk3hRc5pyqXtuLRDNOWVNia8v0Yr8HoAwzB4dfFuAG7rl0CAr5fJFYmI/ErhRc7JarXw3I1daRcdwpGCMia8t4aS8iqzyxIHWrzjCNuzCgjy9eLW5ASzyxERqUHhRWol2M+bt8b0JCLIl00H83jki4242Z6e8hsne11u7hNPWKCPydWIiNSk8CK1FhcRyCuju+NttfDNhkxeXrTL7JLEAdbsO05qeg4+XhbGXZxodjkiIqdQeJE66ZvYmCdGXgTAM//bwQ9btIWAu3ltib3X5ZpuzYgJ8ze5GhGRUym8SJ3d3CeeMcktAHjgk/VsO5RvckVSX3YfKWTB1sNYLDBhoLYCEBHnpPAi52XalR3o37oxxeVV3DFrNccKy8wuSerBzOV7ARiSFE3rqGBzixEROQOFFzkv3l5WXr65Oy0aB3Iwt4SJ72sGkqvLK67g8zX2hQhv759gbjEiImeh8CLnLTzQl7fH9CTE35vV+45zz4drqaiymV2WnKdPVmdQUlFFu+gQkls1NrscEZEzUniRC9I6KoR3xvbC38e+B9JDn23Apk0cXU5llY1Zv+wD4Lb+CdqAUUScmsKLXLBeCRG8OroH3lYLX6/P5LG5m7UGjIv5cdthDuaW0CjQh6u7NTO7HBGRs1J4kXrxh6Qonr2hCxYLfLAyg8fnblEPjAt558RA3VG94/H30VYAIuLcFF6k3ozs2oz/u64zFgu8t2If9360ToN4XcD2rHxS03Pwslr484kp8CIizkzhRerVDT3jePb6Lvh4Wfhu0yGuf/0XbeTo5D5KyQDgsg7RNA0LMLkaEZFzU3iRendt9+Z8MK4PEUG+bD6Yzx9fWs7qvTlmlyWnUVJexZfrDgL2S0YiIq5A4UUcok9iY76+p3/1TtQ3vbGSd5alayCvk/lu0yEKSiuJiwjg4tZNzC5HRKRWFF7EYeIiAvny7n5c2bkplTaDJ77dyqSP1lFYVml2aXLCR6n2S0Y39YrHatX0aBFxDQov4lBBft7MGNWNx6/qgLfVwncbDzHypWXsOFxgdmkeLy2rgDX7juNttXB9z+ZmlyMiUmsKL+JwFouF2/q35JOJfYkO9WP3kSKunLGMt37eo+nUJjrZ6zK0fTRRIdo9WkRch8KLNJgeLSL47r4BDGwbSXmljX9+t42b3lzJ/pxis0vzOKUVVXy51r6P0ag+GqgrIq5F4UUaVJNgP2bd1ot/XXMRgb5epKbnMPz5pXyUmqHBvA1o4fZs8ksraRYewAAN1BURF6PwIg3OYrEwuk8L5t0/gF4JjSgqr+LRLzdx28xVHM4vNbs8j/DVienRf+waq4G6IuJyFF7ENC0aB/HxhGT+OqI9vt5WFqcd4dL/LmHOugPqhXGgvOIKFqcdAWBk11iTqxERqTuFFzGVl9XC+IGJfHfvxXRqFkZ+aSUPfLKBie+v4UhBmdnluaV5mw9RXmUjKSaEpJhQs8sREakzhRdxCm2iQ/jy7n5MubQtPl4W/rf1MJc9t4RvN2aaXZrb+Xq9vU3/qF4XEXFRCi/iNHy8rNw7pA1f33Mx7ZuGcry4gkkfruPBT9ZTUFphdnluISuvlJXpxwD4YxeFFxFxTQov4nQ6xIby9T39ufeS1lgt8OW6g1zx4jLWZhw3uzSXN3fDQQwDeiU0onmjQLPLERE5Lwov4pR8va1Muawdn0xMpll4ABk5xVz/2gpeW7JbC9tdgJOXjEZ2bWZyJSIi50/hRZxar4QIvr9/AFd2bkqVzeCpedu5fdYqjhVqMG9d7couYEtmPt5WC1d0amp2OSIi503hRZxeWIAPM0Z1Y/q1nfA7MaV6xIs/k7LnmNmluZSTvS6D2kbSKMjX5GpERM6ft9kFmKWqqoqKCg0CrSsfHx+8vLwa/HUtFgujesfTLT6ce2avZfeRIka9uZLHruzA2P4tG7weV2MYxq+XjLrpkpGIuDaPCy+GYZCVlUVubq7Zpbis8PBwYmJisFgafmXWpJhQvrn3YqZ9tYUv1h7g799spbTSxp2DWjV4La5kbUYuGTnFBPp6MbR9lNnliIhcEI8LLyeDS1RUFIGBgab8AXZVhmFQXFxMdnY2AE2bmjNuItDXm2eu70yzRgG8+NNOnpq3nYhAX27oFWdKPa5g7nr7dgDDOsYQ6OtxP/Yi4mY86rdYVVVVdXBp3Lix2eW4pICAAACys7OJiooy5RIS2C8jPXhpW6psNl5etJv/N2cTzRsF0E+bDJ6iosrGtxsPAdoOQETcg0cN2D05xiUwUOtbXIiT7ecMY4YeuqwdI7vGUmkzuO/j9dpS4DSW7zrKsaJyGgf5crHCnYi4AY8KLyfpUtGFcab2s1gs/N91nWkXHcLRwjIe/HS91oH5nZMDda/s3BRvL4/8kRcRN6PfZOLy/H28mHFzN/x9rPy88yhv/rzH7JKcRnF5JT9syQLgj1qYTkTchMKLuIW20SE8dmVHAP7zQxob9ueaW5CT+HFbNsXlVcRHBNI9PtzsckRE6oXCi7B3714sFgvr1683u5QLMqp3HFd0akqlzeCRzzdSUWUzuyTTfb3OPstoZNdYp7rcJyJyIRRexG1YLBb+efVFRAT5kna4gLd+Tje7JFMdLypnyY4jgGYZiYh7UXhxEYMHD2bSpElMmjSJsLAwmjRpwrRp0zAM++DU999/n549exISEkJMTAw333xz9XosAMePH2f06NFERkYSEBBAmzZtePfddwFo2dK+Qm23bt2wWCwMHjy4wd9ffWkU5Mv/G9EegBd+2uHRs4++23SISptBx9hQWkeFmF2OiEi98ah1Xk7HMAxKKqpMee0AH686deXPmjWLcePGkZqayurVq5kwYQLx8fGMHz+eiooKnnzySdq1a0d2djYPPvggY8eO5fvvvwdg2rRpbN26lXnz5tGkSRN27dpFSUkJAKmpqfTu3Zsff/yRjh074uvr2vveXNe9Ge+v2MuGA3m8t2IvUy5rZ3ZJpvh6/a+XjERE3InHh5eSiio6PPaDKa+99YlhdVrtNC4ujueeew6LxUK7du3YtGkTzz33HOPHj+f222+vPi4xMZEXX3yRXr16UVhYSHBwMBkZGXTr1o2ePXsCkJCQUH18ZGQkAI0bNyYmJqZ+3pyJLBYLdw1uxZ0frOW9Ffu4c1Argvw866N+4Hgxq/Yex2KBq7oovIiIe9FlIxfSt2/fGj01ycnJ7Ny5k6qqKtasWcNVV11FfHw8ISEhDBo0CICMjAwA7rrrLj7++GO6du3KI488wi+//GLKe2gol3aIoWWTIPJKKvh41X6zy2lwczfY13bp0zKCpmEBJlcjIlK/POufo6cR4OPF1ieGmfba9aG0tJRhw4YxbNgwZs+eTWRkJBkZGQwbNozy8nIALr/8cvbt28f333/PggULGDJkCPfccw/PPPNMvdTgbLysFsYPSOT/zdnE2z/v4dbkFvh40AJtc08sTHe11nYRETfk8eHFYrG4zEZ1KSkpNb5fuXIlbdq0Yfv27Rw7doynnnqKuDj75oSrV68+5fzIyEjGjBnDmDFjGDBgAA8//DDPPPNM9RiXqipzxv44yrXdm/HfBWlk5pXyzYZMru3e3OySGsT2rHy2ZxXg62Xl8ovM2TxTRMSRPOefom4gIyODBx98kLS0ND766CNmzJjB/fffT3x8PL6+vsyYMYM9e/Ywd+5cnnzyyRrnPvbYY3z99dfs2rWLLVu28O2339K+vX1WTlRUFAEBAcyfP5/Dhw+Tl5dnxturd/4+XtzW3z6T6vUle6pnZrm7k9sBDG4XSVigj8nViIjUP4UXF3LrrbdSUlJC7969ueeee7j//vuZMGECkZGRzJw5k88++4wOHTrw1FNPnXI5yNfXl0cffZTOnTszcOBAvLy8+PjjjwHw9vbmxRdf5PXXXyc2NpaRI0ea8fYc4pY+LQjy9SLtcEH1mifuzGYzfr1k1E2XjETEPVkMB/1z9F//+hffffcd69evx9fXl9zc3HOeYxgGjz/+OG+++Sa5ubn079+fV199lTZt2tT6dfPz8wkLCyMvL4/Q0NAaj5WWlpKenk7Lli3x9/ev61sy1eDBg+natSvPP/+82aW4XDs+8c1W3lmezsWtm/DBHX3MLsehUtNzuOH1FQT7ebP6b0Pxr6dxVSIijna2v9+/57Cel/Lycq6//nruuuuuWp/z9NNP8+KLL/Laa6+RkpJCUFAQw4YNo7S01FFlige4rX8CVgss23WULZnucUnsTE6u7TL8ohgFFxFxWw4LL//4xz944IEH6NSpU62ONwyD559/nr/97W+MHDmSzp07895775GZmclXX33lqDLFA8RFBDKik33g6ttuvGVAeaWN7zYdAjTLSETcm9OMeUlPTycrK4uhQ4dW3xcWFkafPn1YsWLFGc8rKysjPz+/xs0dLV682CkuGbmqCQMTAfv6J4fySkyuxjF+3nmE3OIKIkP8SG7V2OxyREQcxmnCS1ZWFgDR0dE17o+Ojq5+7HSmT59OWFhY9e3kVGGR3+rcPJw+LSOotBnMXL7X7HIc4qsTA3Wv6hyLl1U7SIuI+6pTeJk6dSoWi+Wst+3btzuq1tN69NFHycvLq77t3+95q6lK7YwfYO99+TAlg4LSCpOrqV+FZZUs2GoP+drLSETcXZ1WZ5syZQpjx4496zGJiYnnVcjJPXUOHz5M06a/Lqx1+PBhunbtesbz/Pz88PPzO6/XFM9ySVIUiZFB7DlSxCer9nPHgPP7rDqjeZsOUVphIzEyiM7Nw8wuR0TEoeoUXiIjI6s38atvLVu2JCYmhp9++qk6rOTn55OSklKnGUsiZ2I9sWXAo19u4t3lexnbLwFvN9ky4Mu19llG13VvXqedykVEXJHDfnNnZGSwfv16MjIyqKqqYv369axfv57CwsLqY5KSkpgzZw5gX6Z/8uTJ/POf/2Tu3Lls2rSJW2+9ldjYWK6++mpHlSke5ppuzWgc5MvB3BK+33zmsVSu5MDxYlbsOQZoYToR8QwO29TnscceY9asWdXfd+vWDYBFixYxePBgANLS0mosRf/II49QVFTEhAkTyM3N5eKLL2b+/PkusRCauAZ/Hy9uTU7guR938MbS3VzVuanL91Sc3A6gb2IEzcK1g7SIuD+HrbBrFnddYdeZuHo75hSVkzz9J8oqbXw0vq9LTys2DIOh/13C7iNFPP2nztzQU7PtRMQ1OcUKu1K/Bg8ezOTJk80uwy1EBPlyfU/7DtNv/rzH5GouzMYDeew+UoS/j5XLL4oxuxwRkQah8OImDMOgsrLS7DJcxriLE7FYYOH2bDYfdN0tA75cewCAYR1jCPHXDtIi4hkUXlzA2LFjWbJkCS+88EL1ejozZ87EYrEwb948evTogZ+fH8uWLWPs2LGnDHCePHly9TgjAJvNxvTp02nZsiUBAQF06dKFzz//vGHflMlaNgliZBf7eijP/C/N5GrOT2lFFXM32Me7XNu9ucnViIg0HIcN2HU1RUVnfszLC347tONsx1qtEBBw7mODgmpf2wsvvMCOHTu46KKLeOKJJwDYsmULYF848JlnniExMZFGjRrV6vmmT5/OBx98wGuvvUabNm1YunQpt9xyC5GRkQwaNKj2hbm4yUPb8s3GQyxOO8KqvTn0Sogwu6Q6mbf5EMeLK4gN86e/C4/bERGpK4WXE4KDz/zYiBHw3Xe/fh8VBcXFpz920CBYvPjX7xMS4OjRU4+ryzDpsLAwfH19CQwMrF7M7+RKxk888QSXXnpprZ+rrKyMf//73/z4448kJycD9oUFly1bxuuvv+5R4SWhSRA39Izjo9QMnvx2K1/d3R+rCy2r/8HKDABG9Y53m/VqRERqQ+HFxfXs2bNOx+/atYvi4uJTAk95eXn1dHZP8uClbfl2QyYbD+Tx6er93NQ73uySamVrZj5r9h3H22rhxt6aYSQinkXh5YTfrJ13Ci+vmt9nZ5/5WOvv/gG8d+95l1QrQb+7/mS1Wvn97PeKil/38Tm5SOB3331Hs2Y1FzTzxG0WIkP8mHxpW578ditPzd/OJUlRRIU6//TvD1L2ATDsohiiQpy/XhGR+qTwckJdxqA46tiz8fX1paqq6pzHRUZGsnnz5hr3rV+/Hh8f+0yUDh064OfnR0ZGhkddIjqbW5Nb8OXaA2zJzOeRLzby7theTr1wXUFpBV+ts28HcEufFiZXIyLS8HSh3EUkJCSQkpLC3r17OXr0KDab7bTHXXLJJaxevZr33nuPnTt38vjjj9cIMyEhITz00EM88MADzJo1i927d7N27VpmzJhRY0VkT+LjZeX5G7vi621lcdoR3l2+1+ySzmrOuoMUl1fROiqYvomuNchYRKQ+KLy4iIceeggvLy86dOhAZGQkGRkZpz1u2LBhTJs2jUceeYRevXpRUFDArbfeWuOYJ598kmnTpjF9+nTat2/P8OHD+e6772jZsmVDvBWn1CY6hL+OaA/Av7/fxpp9OSZXdHo2m8EHK+2XjEb3iXfqHiIREUfR9gBSZ+7ajoZhMOmjdXy38RCRIX58cWc/4hsHml1WDQu2Hmb8e6sJ9vNm+dRLCAvQwnQi4h60PYDIebBYLPzfdZ1JignhSEEZf34nheyCUrPLqmYYBi8t2gXALX1bKLiIiMdSeBH5jWA/b2bd3pu4iAD2HStmzDuryCupOPeJDWD5rmNs2J+Lv4+VOwZ47iU+ERGFF5HfiQ715/3b+9Ak2I9th/IZN3MVRWXm7xv10qKdANzUK54mwZ43rV1E5CSFF5HTSGgSxKzbexHi783qfccZ+26qqQFm9d4cVu7JwcfLwsRBiabVISLiDBReRM6gY2wY74/rQ4i/N6v2mhtgZiy0j3W5rntzmoYFnONoERH3pvAichZd48L54DcB5pa3UzhaWNagNazYfYwlO47gZbVw56BWDfraIiLOSOFF5By6nAgwof7erMvI5eqXl5OWVdAgr22zGfz7+20A3Nw7noQm9bRks4iIC1N4EamFLnHhzLmnPwmNAzlwvIRrX1nOwu2HHf66X647yKaDeQT7eXP/0DYOfz0REVeg8CJSS60ig5lzd3/6JkZQVF7FuFmreX3J7lM2wqwvx4vKq3td7vlDa80wEhE5QeFFTpGQkMDzzz9vdhlOqVGQL+/d3odRveMxDJg+bztTPt1AacW5N82sq+nztpFTVE7b6GCt6yIi8hsKLyJ15Ott5d/XXMQ//tgRL6uFL9cd5KY3VpKdX3+r8f5vSxafrj4AwL+u6YSPl35URURO0m9EN1VeXm52CW7NYrEwpl8C793em7AAH9bvz+WPLy1n44HcC37uw/ml/OWLjQBMGJhIrwTtHC0i8lsKLy5i8ODBTJo0iUmTJhEWFkaTJk2YNm1a9XiLhIQEnnzySW699VZCQ0OZMGECAMuWLWPAgAEEBAQQFxfHfffdR1FRUfXzZmdnc9VVVxEQEEDLli2ZPXu2Ke/PVfVv3YSv7+lPq8ggsvJLuf61FcxZd+C8n6+ssoo7P1jD8eIKOjQNZcplbeuxWhER96DwYhhQXmTOrY4DPWfNmoW3tzepqam88MIL/Pe//+Wtt96qfvyZZ56hS5curFu3jmnTprF7926GDx/Oddddx8aNG/nkk09YtmwZkyZNqj5n7Nix7N+/n0WLFvH555/zyiuvkJ2dXW/N6wkSmgTx1T39GZIURVmljQc+2cC/v99Gla1u/39tNoO/ztnMuoxcQv29eWV0d/y8vRxUtYiI67IYjpoqYZKzbaldWlpKeno6LVu2xN/f335neRH8O9aESoH/lwm+tVu3Y/DgwWRnZ7NlyxYsFgsAU6dOZe7cuWzdupWEhAS6devGnDlzqs+544478PLy4vXXX6++b9myZQwaNIiioiIyMjJo164dqamp9OrVC4Dt27fTvn17nnvuOSZPnnzaWk7bjoLNZvDfBTuqd34e0KYJL43qTljguXd/NgyDx77ewvsr92GxwLtjezG4XZSjSxYRcRpn+/v9e+p5cSF9+/atDi4AycnJ7Ny5k6oq+0yXnj171jh+w4YNzJw5k+Dg4OrbsGHDsNlspKens23bNry9venRo0f1OUlJSYSHhzfI+3E3VquFh4a146WbuxHg48XPO48y/IWlLNp+9p6svJIKJr6/pjq4/OdPXRRcRETOwtvsAkznE2jvATHrtetRUFDNXpzCwkImTpzIfffdd8qx8fHx7Nixo15fX+yu7BxLYpNg7pq9hn3Hirlt5iqu6daMv17RvsZaLVU2g+83HeJf320jK78UXy8r06/txHU9mptYvYiI81N4sVhqfenGbCkpKTW+X7lyJW3atMHL6/TjIrp3787WrVtp3br1aR9PSkqisrKSNWvWVF82SktLIzc3t17r9kQdYkOZf/9Anv1fGm8vT2fOuoN8uzGT/q2b0DTMn/ySSlL35nCkwL5PUovGgcwY1Y3OzcPNLVxExAUovLiQjIwMHnzwQSZOnMjatWuZMWMGzz777BmP/8tf/kLfvn2ZNGkSd9xxB0FBQWzdupUFCxbw0ksv0a5dO4YPH87EiRN59dVX8fb2ZvLkyQQEaNfi+hDg68XfruzAiM5N+cc3W9mwP5fFaUdqHNMo0Icx/RK4c1Ar/H00OFdEpDYUXlzIrbfeSklJCb1798bLy4v777+/ekr06XTu3JklS5bw17/+lQEDBmAYBq1ateLGG2+sPubdd9/ljjvuYNCgQURHR/PPf/6TadOmNcTb8Rjd4xvx9T392XYon9V7czhWVE6ovw+tooJJTmyMr7eGnomI1IVmG7mIwYMH07VrV6dYtt+V21FERJyTZhuJiIiI21J4EREREZeiMS8uYvHixWaXICIi4hTU8yIiIiIuReFFREREXIpHhhebzWZ2CS5N7SciImbyqDEvvr6+WK1WMjMziYyMxNfXt8ZeQXJ2hmFQXl7OkSNHsFqt+Pr6ml2SiIh4II8KL1arlZYtW3Lo0CEyM03az8gNBAYGEh8fj9XqkR13IiJiMo8KL2DvfYmPj6eysrJ6N2apPS8vL7y9vdVjJSIipvG48AJgsVjw8fHBx8fH7FJERESkjtTvLyIiIi5F4UVERERcisKLiIiIuBS3G/NycpPs/Px8kysRERGR2jr5d/vk3/GzcbvwUlBQAEBcXJzJlYiIiEhdFRQUEBYWdtZjLEZtIo4LsdlsZGZmEhISUu/TefPz84mLi2P//v2EhobW63O7E7VT7amtakftVHtqq9pRO9VOQ7aTYRgUFBQQGxt7znXE3K7nxWq10rx5c4e+RmhoqD7staB2qj21Ve2onWpPbVU7aqfaaah2OlePy0kasCsiIiIuReFFREREXIrCSx34+fnx+OOP4+fnZ3YpTk3tVHtqq9pRO9We2qp21E6146zt5HYDdkVERMS9qedFREREXIrCi4iIiLgUhRcRERFxKQovIiIi4lIUXmrp5ZdfJiEhAX9/f/r06UNqaqrZJZnu73//OxaLpcYtKSmp+vHS0lLuueceGjduTHBwMNdddx2HDx82seKGsXTpUq666ipiY2OxWCx89dVXNR43DIPHHnuMpk2bEhAQwNChQ9m5c2eNY3Jychg9ejShoaGEh4czbtw4CgsLG/BdON652mns2LGnfL6GDx9e4xhPaKfp06fTq1cvQkJCiIqK4uqrryYtLa3GMbX5WcvIyOCKK64gMDCQqKgoHn74YSorKxvyrThcbdpq8ODBp3yu7rzzzhrHuHtbvfrqq3Tu3Ll64bnk5GTmzZtX/bgrfJ4UXmrhk08+4cEHH+Txxx9n7dq1dOnShWHDhpGdnW12aabr2LEjhw4dqr4tW7as+rEHHniAb775hs8++4wlS5aQmZnJtddea2K1DaOoqIguXbrw8ssvn/bxp59+mhdffJHXXnuNlJQUgoKCGDZsGKWlpdXHjB49mi1btrBgwQK+/fZbli5dyoQJExrqLTSIc7UTwPDhw2t8vj766KMaj3tCOy1ZsoR77rmHlStXsmDBAioqKrjssssoKiqqPuZcP2tVVVVcccUVlJeX88svvzBr1ixmzpzJY489ZsZbcpjatBXA+PHja3yunn766erHPKGtmjdvzlNPPcWaNWtYvXo1l1xyCSNHjmTLli2Ai3yeDDmn3r17G/fcc0/191VVVUZsbKwxffp0E6sy3+OPP2506dLltI/l5uYaPj4+xmeffVZ937Zt2wzAWLFiRQNVaD7AmDNnTvX3NpvNiImJMf7zn/9U35ebm2v4+fkZH330kWEYhrF161YDMFatWlV9zLx58wyLxWIcPHiwwWpvSL9vJ8MwjDFjxhgjR4484zme2E6GYRjZ2dkGYCxZssQwjNr9rH3//feG1Wo1srKyqo959dVXjdDQUKOsrKxh30AD+n1bGYZhDBo0yLj//vvPeI6ntlWjRo2Mt956y2U+T+p5OYfy8nLWrFnD0KFDq++zWq0MHTqUFStWmFiZc9i5cyexsbEkJiYyevRoMjIyAFizZg0VFRU12i0pKYn4+HiPbrf09HSysrJqtEtYWBh9+vSpbpcVK1YQHh5Oz549q48ZOnQoVquVlJSUBq/ZTIsXLyYqKop27dpx1113cezYserHPLWd8vLyAIiIiABq97O2YsUKOnXqRHR0dPUxw4YNIz8/v/pf2+7o92110uzZs2nSpAkXXXQRjz76KMXFxdWPeVpbVVVV8fHHH1NUVERycrLLfJ7cbmPG+nb06FGqqqpq/E8CiI6OZvv27SZV5Rz69OnDzJkzadeuHYcOHeIf//gHAwYMYPPmzWRlZeHr60t4eHiNc6Kjo8nKyjKnYCdw8r2f7vN08rGsrCyioqJqPO7t7U1ERIRHtd3w4cO59tpradmyJbt37+b//b//x+WXX86KFSvw8vLyyHay2WxMnjyZ/v37c9FFFwHU6mctKyvrtJ+5k4+5o9O1FcDNN99MixYtiI2NZePGjfzlL38hLS2NL7/8EvCcttq0aRPJycmUlpYSHBzMnDlz6NChA+vXr3eJz5PCi5y3yy+/vPrrzp0706dPH1q0aMGnn35KQECAiZWJO7jpppuqv+7UqROdO3emVatWLF68mCFDhphYmXnuueceNm/eXGNsmZzemdrqt2OiOnXqRNOmTRkyZAi7d++mVatWDV2madq1a8f69evJy8vj888/Z8yYMSxZssTssmpNl43OoUmTJnh5eZ0y0vrw4cPExMSYVJVzCg8Pp23btuzatYuYmBjKy8vJzc2tcYynt9vJ9362z1NMTMwpg8ErKyvJycnx6LZLTEykSZMm7Nq1C/C8dpo0aRLffvstixYtonnz5tX31+ZnLSYm5rSfuZOPuZsztdXp9OnTB6DG58oT2srX15fWrVvTo0cPpk+fTpcuXXjhhRdc5vOk8HIOvr6+9OjRg59++qn6PpvNxk8//URycrKJlTmfwsJCdu/eTdOmTenRowc+Pj412i0tLY2MjAyPbreWLVsSExNTo13y8/NJSUmpbpfk5GRyc3NZs2ZN9TELFy7EZrNV/6L1RAcOHODYsWM0bdoU8Jx2MgyDSZMmMWfOHBYuXEjLli1rPF6bn7Xk5GQ2bdpUI+wtWLCA0NBQOnTo0DBvpAGcq61OZ/369QA1Plee0Fa/Z7PZKCsrc53PU4MMC3ZxH3/8seHn52fMnDnT2Lp1qzFhwgQjPDy8xkhrTzRlyhRj8eLFRnp6urF8+XJj6NChRpMmTYzs7GzDMAzjzjvvNOLj442FCxcaq1evNpKTk43k5GSTq3a8goICY926dca6desMwPjvf/9rrFu3zti3b59hGIbx1FNPGeHh4cbXX39tbNy40Rg5cqTRsmVLo6SkpPo5hg8fbnTr1s1ISUkxli1bZrRp08YYNWqUWW/JIc7WTgUFBcZDDz1krFixwkhPTzd+/PFHo3v37kabNm2M0tLS6ufwhHa66667jLCwMGPx4sXGoUOHqm/FxcXVx5zrZ62ystK46KKLjMsuu8xYv369MX/+fCMyMtJ49NFHzXhLDnOuttq1a5fxxBNPGKtXrzbS09ONr7/+2khMTDQGDhxY/Rye0FZTp041lixZYqSnpxsbN240pk6dalgsFuN///ufYRiu8XlSeKmlGTNmGPHx8Yavr6/Ru3dvY+XKlWaXZLobb7zRaNq0qeHr62s0a9bMuPHGG41du3ZVP15SUmLcfffdRqNGjYzAwEDjmmuuMQ4dOmRixQ1j0aJFBnDKbcyYMYZh2KdLT5s2zYiOjjb8/PyMIUOGGGlpaTWe49ixY8aoUaOM4OBgIzQ01LjtttuMgoICE96N45ytnYqLi43LLrvMiIyMNHx8fIwWLVoY48ePP+UfDJ7QTqdrI8B49913q4+pzc/a3r17jcsvv9wICAgwmjRpYkyZMsWoqKho4HfjWOdqq4yMDGPgwIFGRESE4efnZ7Ru3dp4+OGHjby8vBrP4+5tdfvttxstWrQwfH19jcjISGPIkCHVwcUwXOPzZDEMw2iYPh4RERGRC6cxLyIiIuJSFF5ERETEpSi8iIiIiEtReBERERGXovAiIiIiLkXhRURERFyKwouIiIi4FIUXERERcSkKLyIiIuJSFF5ERETEpSi8iIiIiEtReBERERGX8v8BWhKwzqe5KwQAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "i=990\n", "(batch_x, batch_y, batch_x_mark, batch_y_mark) = ds[i]\n", @@ -313,7 +672,7 @@ { "cell_type": "code", "execution_count": null, - "id": "4e501b7a", + "id": "fff9cb48", "metadata": { "ExecuteTime": { "end_time": "2022-11-28T07:33:57.703528Z", @@ -325,7 +684,7 @@ }, { "cell_type": "markdown", - "id": "6e6f02ba", + "id": "a2555d9b", "metadata": {}, "source": [ "# TODO check index" @@ -333,7 +692,7 @@ }, { "cell_type": "markdown", - "id": "54e1b101", + "id": "815cdbe5", "metadata": {}, "source": [ "- s_end = index + self.seq_len\n", @@ -343,15 +702,316 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "8075058e", + "execution_count": 12, + "id": "abc903ba", "metadata": { "ExecuteTime": { - "start_time": "2022-11-28T07:36:13.568Z" + "end_time": "2022-11-28T08:48:53.789777Z", + "start_time": "2022-11-28T08:48:53.648714Z" }, "scrolled": true }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
closeref_closesec_closeRVOLs_50_12_2ref_2refMACDVs_3_10_9_2ref_2refMACDVs_8_24_9_2ref_2refRRVOLs_50_12_2ref_2refRSMKs_3_24_12_2ref_2refRSMKs_128_8_4_2ref_2refRRSs_12_12_12_2ref_2refVRRSs_5_21_12_2ref_2refRSMKs_18_144_72_2ref_2ref
date
2019-01-02 07:00:0060.7500246.390056.700.6345610.2288220.749770-0.0815720.7549480.0419740.4528820.094300-0.141763
2019-01-02 09:30:0060.2000246.300056.300.619485-0.1382710.516611-0.1595450.6907520.0373100.201226-0.050731-0.127774
2019-01-02 09:35:0059.8500246.520056.360.689500-0.5355640.191501-0.1047520.5533760.027199-0.217425-0.069932-0.117113
2019-01-02 09:40:0060.0600246.900156.700.746596-0.803242-0.130051-0.0707610.4029110.015511-0.473000-0.089949-0.109966
2019-01-02 09:45:0060.2350247.140056.690.701637-0.936439-0.409001-0.1305810.2636640.003868-0.679096-0.096488-0.105561
.......................................
2020-12-31 17:35:0017.3300374.210037.900.706492-0.129955-0.5517040.197178-0.842459-0.216290-3.579407-0.088556-1.118991
2020-12-31 18:30:0017.3200374.400037.960.615936-0.147461-0.5389420.174563-0.803874-0.213881-3.258388-0.075389-1.179880
2020-12-31 19:15:0017.3600374.390037.950.605291-0.105155-0.5081920.226633-0.756699-0.210656-2.735903-0.063731-1.239256
2020-12-31 19:20:0017.3501374.390037.950.592393-0.065321-0.4753750.268617-0.720279-0.207647-2.416748-0.053941-1.297199
2020-12-31 19:55:0017.4000374.390037.950.5048770.054870-0.4086120.198019-0.664792-0.201618-2.009522-0.045287-1.352772
\n", + "

53398 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " close ref_close sec_close RVOLs_50_12_2ref_2ref \\\n", + "date \n", + "2019-01-02 07:00:00 60.7500 246.3900 56.70 0.634561 \n", + "2019-01-02 09:30:00 60.2000 246.3000 56.30 0.619485 \n", + "2019-01-02 09:35:00 59.8500 246.5200 56.36 0.689500 \n", + "2019-01-02 09:40:00 60.0600 246.9001 56.70 0.746596 \n", + "2019-01-02 09:45:00 60.2350 247.1400 56.69 0.701637 \n", + "... ... ... ... ... \n", + "2020-12-31 17:35:00 17.3300 374.2100 37.90 0.706492 \n", + "2020-12-31 18:30:00 17.3200 374.4000 37.96 0.615936 \n", + "2020-12-31 19:15:00 17.3600 374.3900 37.95 0.605291 \n", + "2020-12-31 19:20:00 17.3501 374.3900 37.95 0.592393 \n", + "2020-12-31 19:55:00 17.4000 374.3900 37.95 0.504877 \n", + "\n", + " MACDVs_3_10_9_2ref_2ref MACDVs_8_24_9_2ref_2ref \\\n", + "date \n", + "2019-01-02 07:00:00 0.228822 0.749770 \n", + "2019-01-02 09:30:00 -0.138271 0.516611 \n", + "2019-01-02 09:35:00 -0.535564 0.191501 \n", + "2019-01-02 09:40:00 -0.803242 -0.130051 \n", + "2019-01-02 09:45:00 -0.936439 -0.409001 \n", + "... ... ... \n", + "2020-12-31 17:35:00 -0.129955 -0.551704 \n", + "2020-12-31 18:30:00 -0.147461 -0.538942 \n", + "2020-12-31 19:15:00 -0.105155 -0.508192 \n", + "2020-12-31 19:20:00 -0.065321 -0.475375 \n", + "2020-12-31 19:55:00 0.054870 -0.408612 \n", + "\n", + " RRVOLs_50_12_2ref_2ref RSMKs_3_24_12_2ref_2ref \\\n", + "date \n", + "2019-01-02 07:00:00 -0.081572 0.754948 \n", + "2019-01-02 09:30:00 -0.159545 0.690752 \n", + "2019-01-02 09:35:00 -0.104752 0.553376 \n", + "2019-01-02 09:40:00 -0.070761 0.402911 \n", + "2019-01-02 09:45:00 -0.130581 0.263664 \n", + "... ... ... \n", + "2020-12-31 17:35:00 0.197178 -0.842459 \n", + "2020-12-31 18:30:00 0.174563 -0.803874 \n", + "2020-12-31 19:15:00 0.226633 -0.756699 \n", + "2020-12-31 19:20:00 0.268617 -0.720279 \n", + "2020-12-31 19:55:00 0.198019 -0.664792 \n", + "\n", + " RSMKs_128_8_4_2ref_2ref RRSs_12_12_12_2ref_2ref \\\n", + "date \n", + "2019-01-02 07:00:00 0.041974 0.452882 \n", + "2019-01-02 09:30:00 0.037310 0.201226 \n", + "2019-01-02 09:35:00 0.027199 -0.217425 \n", + "2019-01-02 09:40:00 0.015511 -0.473000 \n", + "2019-01-02 09:45:00 0.003868 -0.679096 \n", + "... ... ... \n", + "2020-12-31 17:35:00 -0.216290 -3.579407 \n", + "2020-12-31 18:30:00 -0.213881 -3.258388 \n", + "2020-12-31 19:15:00 -0.210656 -2.735903 \n", + "2020-12-31 19:20:00 -0.207647 -2.416748 \n", + "2020-12-31 19:55:00 -0.201618 -2.009522 \n", + "\n", + " VRRSs_5_21_12_2ref_2ref RSMKs_18_144_72_2ref_2ref \n", + "date \n", + "2019-01-02 07:00:00 0.094300 -0.141763 \n", + "2019-01-02 09:30:00 -0.050731 -0.127774 \n", + "2019-01-02 09:35:00 -0.069932 -0.117113 \n", + "2019-01-02 09:40:00 -0.089949 -0.109966 \n", + "2019-01-02 09:45:00 -0.096488 -0.105561 \n", + "... ... ... \n", + "2020-12-31 17:35:00 -0.088556 -1.118991 \n", + "2020-12-31 18:30:00 -0.075389 -1.179880 \n", + "2020-12-31 19:15:00 -0.063731 -1.239256 \n", + "2020-12-31 19:20:00 -0.053941 -1.297199 \n", + "2020-12-31 19:55:00 -0.045287 -1.352772 \n", + "\n", + "[53398 rows x 12 columns]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f = ds.root_path + '/' + ds.data_path\n", "df = pd.read_csv(f).set_index('date', drop=False)\n", @@ -363,14 +1023,28 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "08f288f6", + "execution_count": 13, + "id": "0dac417e", "metadata": { "ExecuteTime": { - "start_time": "2022-11-28T07:36:13.568Z" + "end_time": "2022-11-28T08:48:53.923652Z", + "start_time": "2022-11-28T08:48:53.790995Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1.24250000e+01, 3.54330000e+02, 3.52700000e+01, 6.24194744e-01,\n", + " -1.20630267e-01, 4.64484086e-01, -3.96678363e-01, 1.04169477e+00,\n", + " -2.88024043e-02, -4.61072831e-01, -9.81798622e-03, -3.57276350e+00])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from data_provider.data_loader import Dataset_Custom\n", "ds2 = Dataset_Custom(\n", @@ -393,14 +1067,38 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "8ea2be5f", + "execution_count": 14, + "id": "a6a5dff7", "metadata": { "ExecuteTime": { - "start_time": "2022-11-28T07:36:13.568Z" + "end_time": "2022-11-28T08:48:53.941224Z", + "start_time": "2022-11-28T08:48:53.924828Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "close 12.425000\n", + "ref_close 354.330000\n", + "sec_close 35.270000\n", + "RVOLs_50_12_2ref_2ref 0.624195\n", + "MACDVs_3_10_9_2ref_2ref -0.120630\n", + "MACDVs_8_24_9_2ref_2ref 0.464484\n", + "RRVOLs_50_12_2ref_2ref -0.396678\n", + "RSMKs_3_24_12_2ref_2ref 1.041695\n", + "RSMKs_128_8_4_2ref_2ref -0.028802\n", + "RRSs_12_12_12_2ref_2ref -0.461073\n", + "VRRSs_5_21_12_2ref_2ref -0.009818\n", + "RSMKs_18_144_72_2ref_2ref -3.572763\n", + "Name: 2020-09-02 11:20:00, dtype: float64" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "dt = ds2.index.iloc[i-1]\n", "df.loc[dt]" @@ -408,14 +1106,26 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "07e898c8", + "execution_count": 15, + "id": "91a28ab0", "metadata": { "ExecuteTime": { - "start_time": "2022-11-28T07:36:13.568Z" + "end_time": "2022-11-28T08:48:53.977072Z", + "start_time": "2022-11-28T08:48:53.942153Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'OK'" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "assert df.loc[dt].close == batch_x[-1, 0], 'index should be right'\n", "'OK'" @@ -424,7 +1134,7 @@ { "cell_type": "code", "execution_count": null, - "id": "bf1b0a6d", + "id": "35053a3c", "metadata": {}, "outputs": [], "source": [] @@ -432,7 +1142,7 @@ { "cell_type": "code", "execution_count": null, - "id": "6039c3f0", + "id": "87fdb36f", "metadata": {}, "outputs": [], "source": [] @@ -440,7 +1150,7 @@ { "cell_type": "code", "execution_count": null, - "id": "368b0ace", + "id": "cf203a63", "metadata": {}, "outputs": [], "source": []