jupyter_gpu/tensorflow/notebooks/leo/LSTM_All_Crypto_01.ipynb
2024-06-13 20:17:22 +00:00

685 lines
68 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 164,
"id": "1023f2c1-e45f-4e1c-9a1b-66f59f128196",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Panda Version: 2.2.2\n",
"Today date is: 2024-06-13\n"
]
}
],
"source": [
"import sqlite3\n",
"\n",
"import os\n",
"import re\n",
"\n",
"import numpy as np\n",
"# It is apparently officially accepted to explicitly\n",
"# list all the functions you need from numpy:\n",
"from numpy import array, zeros, exp, random, dot\n",
"from numpy import shape, reshape, meshgrid, linspace\n",
"from numpy import hstack, vstack\n",
"\n",
"import pandas as pd\n",
"print('Panda Version:', pd.__version__)\n",
"\n",
"# Set ipython's max row display\n",
"pd.set_option('display.max_row', 100, 'display.max_columns', 25)\n",
"\n",
"import matplotlib.pyplot as plt # for plotting\n",
"import matplotlib\n",
"matplotlib.rcParams['figure.dpi'] = 100 # highres display\n",
"\n",
"import tensorflow as tf\n",
"from tensorflow import Variable\n",
"\n",
"from tensorflow.keras import Sequential\n",
"from tensorflow.keras import Model\n",
"from tensorflow.keras.layers import Dense\n",
"from tensorflow.keras.layers import Dropout\n",
"from tensorflow.keras.layers import TimeDistributed, RepeatVector\n",
"\n",
"from keras.optimizers import SGD\n",
"\n",
"from keras.models import load_model\n",
"from keras.callbacks import EarlyStopping\n",
"from keras.callbacks import ModelCheckpoint\n",
"\n",
"from keras.layers import LSTM, Dense, Concatenate\n",
"\n",
"from keras.optimizers import SGD\n",
"\n",
"import collections\n",
"from collections import Counter\n",
"\n",
"# Import date class from datetime module\n",
"import time\n",
"import datetime\n",
"# import datetime as dt\n",
"from datetime import date\n",
"print(\"Today date is: \", date.today())"
]
},
{
"cell_type": "code",
"execution_count": 165,
"id": "c09a37a6-f0d9-48e3-a1d1-65ddaf2c489c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/workspace/leo\n",
"total 16400\n",
"drwxrwxr-x 1 1000 1000 648 Jun 13 10:01 .\n",
"drwxrwxr-x 1 1000 1000 18 Jun 3 23:40 ..\n",
"-rw------- 1 1000 1000 1449984 Jun 4 00:49 20240601.mktdata.ohlcv.db\n",
"-rw------- 1 1000 1000 1445888 Jun 3 23:44 20240602.mktdata.ohlcv.db\n",
"-rw------- 1 1000 1000 1437696 Jun 4 16:45 20240603.mktdata.ohlcv.db\n",
"-rw------- 1 1000 1000 1269760 Jun 5 10:00 20240604.mktdata.ohlcv.db\n",
"-rw------- 1 1000 1000 1081344 Jun 6 10:00 20240605.mktdata.ohlcv.db\n",
"-rw------- 1 1000 1000 1441792 Jun 7 10:00 20240606.mktdata.ohlcv.db\n",
"-rw------- 1 1000 1000 1445888 Jun 8 10:00 20240607.mktdata.ohlcv.db\n",
"-rw------- 1 1000 1000 1449984 Jun 9 10:00 20240608.mktdata.ohlcv.db\n",
"-rw------- 1 1000 1000 1437696 Jun 10 10:00 20240609.mktdata.ohlcv.db\n",
"-rw-r--r-- 1 1000 1000 0 Jun 12 15:29 20240609.mktdata.ohlcvdb\n",
"-rw------- 1 1000 1000 1437696 Jun 11 10:00 20240610.mktdata.ohlcv.db\n",
"-rw------- 1 1000 1000 1449984 Jun 12 10:01 20240611.mktdata.ohlcv.db\n",
"-rw------- 1 1000 1000 1445888 Jun 13 10:01 20240612.mktdata.ohlcv.db\n"
]
}
],
"source": [
"!pwd\n",
"\n",
"!ls -la /workspace/data/crypto_md/"
]
},
{
"cell_type": "code",
"execution_count": 82,
"id": "8d72d849-e8df-4564-a006-03ab646b9330",
"metadata": {},
"outputs": [],
"source": [
"# db_conn = sqlite3.connect(mktdata_db_file)\n",
"# tables_df = pd.read_sql_query(\"select * from sqlite_master where type = 'table'\", db_conn)\n",
"# print (tables_df_20240601.head())"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4df4b0d4-e92e-42a9-8747-ff60669a4e10",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 167,
"id": "5d2aed0b-8c9d-4f5a-9166-785da4811390",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"66803\n"
]
}
],
"source": [
"directory = \"/workspace/data/crypto_md\"\n",
"\n",
"# List of dates\n",
"dates = ['20240601', \n",
" '20240602', \n",
" '20240603', \n",
" '20240604', \n",
" '20240605', \n",
" '20240606', \n",
" '20240607', \n",
" '20240608', \n",
" '20240609',\n",
" '20240610',\n",
" '20240611',\n",
" '20240612'] \n",
"\n",
"# Create an entirely empty DataFrame\n",
"df_concat = pd.DataFrame()\n",
"\n",
"for date in dates:\n",
" # Construct the filename\n",
" filename = f\"{directory}/{date}.mktdata.ohlcv.db\"\n",
" \n",
" # Create the SQLite connection\n",
" conn = sqlite3.connect(filename)\n",
" \n",
" # Read the data into a DataFrame\n",
" df = pd.read_sql_query(\"select * from coinbase_ohlcv_1min\", conn)\n",
"\n",
" df_concat = pd.concat([df_concat, df], axis = 0,ignore_index = True)\n",
" # Print the combined DataFrame\n",
" # print(df_concat.shape[0])\n",
" # print(df_concat.shape[1])\n",
" conn.close()\n",
"print(df_concat.shape[0])\n",
"# print(df_concat.head(2))\n",
"# print(df_concat.tail(2))"
]
},
{
"cell_type": "code",
"execution_count": 174,
"id": "cd83027c-eaa1-44d9-98ad-8506099c323d",
"metadata": {},
"outputs": [],
"source": [
"df_concat['tstamp'] = pd.to_datetime(df_concat['tstamp'])\n",
"# Extract individual components\n",
"df_concat['year'] = df_concat['tstamp'].dt.year\n",
"df_concat['month'] = df_concat['tstamp'].dt.month\n",
"df_concat['day'] = df_concat['tstamp'].dt.day\n",
"df_concat['hour'] = df_concat['tstamp'].dt.hour\n",
"df_concat['minute'] = df_concat['tstamp'].dt.minute\n",
"df_concat['second'] = df_concat['tstamp'].dt.second\n",
"\n",
"df_concat['date'] = df_concat['day'].astype(str) + '-' + df_concat['hour'].astype(str) + '-' + df_concat['minute'].astype(str)\n",
"df_concat = df_concat.sort_values(by = ['day', 'hour', 'minute'])\n",
"\n",
"selected_columns = ['date', 'instrument_id', 'close', 'volume', 'vwap']\n",
"df_concat = df_concat[selected_columns]\n",
"\n",
"# instrument_list = df_concat['instrument_id'].unique().tolist()\n",
"# print(\"Distinct values in column 'instrument_id':\", instrument_list)\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 179,
"id": "316c0cfb-c73d-4dad-9d49-eb80daa229ec",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"========================================\n",
" date close_xrp volume_xrp vwap_xrp close_eth volume_eth vwap_eth \\\n",
"0 1-0-0 0.5173 28809.165339 0.517217 0.376204 37.497964 0.376108 \n",
"1 1-0-1 0.5170 10184.511212 0.517060 0.375942 11.703305 0.376013 \n",
"2 1-0-10 0.5176 15515.348778 0.517601 0.375938 11.922897 0.375935 \n",
"\n",
" close_ltc volume_ltc vwap_ltc close_btc volume_btc vwap_btc \n",
"0 0.8317 110.056253 0.831662 0.675060 2.045049 0.674969 \n",
"1 0.8312 176.868598 0.831441 0.674947 0.646759 0.675009 \n",
"2 0.8311 58.951033 0.831037 0.675507 1.201335 0.675478 \n",
"test sample size: 16698\n"
]
}
],
"source": [
"# BTC\n",
"df_concat_btc = df_concat[df_concat['instrument_id'] == 'PAIR-BTC-USD']\n",
"\n",
"# Reset Index\n",
"df_concat_btc = df_concat_btc.reset_index(drop = True)\n",
"\n",
"# Rename Vars\n",
"df_concat_btc['close_btc'] = df_concat_btc['close']/100000.00\n",
"df_concat_btc['volume_btc'] = df_concat_btc['volume']\n",
"df_concat_btc['vwap_btc'] = df_concat_btc['vwap']/100000.00\n",
"\n",
"df_concat_btc = df_concat_btc.drop('close', axis = 1)\n",
"df_concat_btc = df_concat_btc.drop('volume', axis = 1)\n",
"df_concat_btc = df_concat_btc.drop('vwap', axis = 1)\n",
"df_concat_btc = df_concat_btc.drop('instrument_id', axis = 1)\n",
"\n",
"# print (df_concat_btc.head(3))\n",
"\n",
"# LTC\n",
"df_concat_ltc = df_concat[df_concat['instrument_id'] == 'PAIR-LTC-USD']\n",
"\n",
"# Reset Index\n",
"df_concat_ltc = df_concat_ltc.reset_index(drop = True)\n",
"\n",
"# Rename Vars\n",
"df_concat_ltc['close_ltc'] = df_concat_ltc['close']/100.00\n",
"df_concat_ltc['volume_ltc'] = df_concat_ltc['volume']\n",
"df_concat_ltc['vwap_ltc'] = df_concat_ltc['vwap']/100.00\n",
"\n",
"df_concat_ltc = df_concat_ltc.drop('close', axis = 1)\n",
"df_concat_ltc = df_concat_ltc.drop('volume', axis = 1)\n",
"df_concat_ltc = df_concat_ltc.drop('vwap', axis = 1)\n",
"df_concat_ltc = df_concat_ltc.drop('instrument_id', axis = 1)\n",
"\n",
"# print (df_concat_ltc.head(3))\n",
"\n",
"# ETH\n",
"df_concat_eth = df_concat[df_concat['instrument_id'] == 'PAIR-ETH-USD']\n",
"\n",
"# Reset Index\n",
"df_concat_eth = df_concat_eth.reset_index(drop = True)\n",
"\n",
"# Rename Vars\n",
"df_concat_eth['close_eth'] = df_concat_eth['close']/10000.00\n",
"df_concat_eth['volume_eth'] = df_concat_eth['volume']\n",
"df_concat_eth['vwap_eth'] = df_concat_eth['vwap']/10000.00\n",
"\n",
"df_concat_eth = df_concat_eth.drop('close', axis = 1)\n",
"df_concat_eth = df_concat_eth.drop('volume', axis = 1)\n",
"df_concat_eth = df_concat_eth.drop('vwap', axis = 1)\n",
"df_concat_eth = df_concat_eth.drop('instrument_id', axis = 1)\n",
"\n",
"# print (df_concat_eth.head(3))\n",
"\n",
"# XRP\n",
"df_concat_xrp = df_concat[df_concat['instrument_id'] == 'PAIR-XRP-USD']\n",
"\n",
"# Reset Index\n",
"df_concat_xrp = df_concat_xrp.reset_index(drop = True)\n",
"\n",
"# Rename Vars\n",
"df_concat_xrp['close_xrp'] = df_concat_xrp['close']\n",
"df_concat_xrp['volume_xrp'] = df_concat_xrp['volume']\n",
"df_concat_xrp['vwap_xrp'] = df_concat_xrp['vwap']\n",
"\n",
"df_concat_xrp = df_concat_xrp.drop('close', axis = 1)\n",
"df_concat_xrp = df_concat_xrp.drop('volume', axis = 1)\n",
"df_concat_xrp = df_concat_xrp.drop('vwap', axis = 1)\n",
"df_concat_xrp = df_concat_xrp.drop('instrument_id', axis = 1)\n",
"\n",
"# print (df_concat_xrp.head(3))\n",
"\n",
"df_M1 = pd.merge(df_concat_xrp, df_concat_eth, on = 'date', how = 'outer')\n",
"# print (df_M1.head(3))\n",
"# print (\"M1: \", df_M1.shape[0])\n",
"df_M2 = pd.merge(df_M1, df_concat_ltc, on = 'date', how = 'outer')\n",
"# print (df_M2.head(3))\n",
"# print (\"M2: \", df_M2.shape[0])\n",
"df_M3 = pd.merge(df_M2, df_concat_btc, on = 'date', how = 'outer')\n",
"# print (df_M3.head(3))\n",
"# print (\"M3: \", df_M3.shape[0])\n",
"\n",
"# Drop rows with any NaN value and assign it to a new DataFrame\n",
"# sample = df_M3.dropna(axis = 0).reset_index(drop = True)\n",
"print (\"========================================\")\n",
"print (sample.head(3))\n",
"sample_size = sample.shape[0]\n",
"print (\"test sample size: \", sample_size)"
]
},
{
"cell_type": "code",
"execution_count": 177,
"id": "92700c76-8eac-4ebb-86d3-27066486c437",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkgAAAGzCAYAAADUo+joAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAACDEklEQVR4nO3dd3hTVR8H8G9aOoGW2QEUyt4ULFDZoEVERECZiiAOEBCRqkAFisiSKTKkgmzZyF4CZchSNoLsXUYLZbRQoPO+f9w34yY3aZKmuUn7/TxPnt6ce+65J9Amv5ypEgRBABERERFpuChdASIiIiJHwwCJiIiISA8DJCIiIiI9DJCIiIiI9DBAIiIiItLDAImIiIhIDwMkIiIiIj0MkIiIiIj0MEAiIiIi0sMAiYiIiEgPAySiPG7hwoVQqVSah6enJypVqoQvvvgC8fHxkrxbt26FSqVCiRIlkJmZKVtecHAw3n77bUmabvkqlQo+Pj5o1qwZtmzZYlYdmzdvLrne3d0dZcuWRe/evREbG2v0PsYee/fuBQAkJSVh1KhRCAkJQYECBeDl5YUaNWpgyJAhuHv3bpb1knutaseOHYNKpcLChQsl6QcOHEDr1q1RsmRJeHp6onTp0mjbti2WLVtm9N8sX758KFKkCEJDQzFw4ECcO3fO5L+Pscf333+f9T82EQEA8ildASJyDD/88APKli2Lly9f4sCBA5g9eza2bt2Ks2fPwtvbGwCwdOlSBAcH48aNG9i9ezfCw8PNLr9ly5bo0aMHBEHAzZs3MXv2bLRt2xbbtm1Dq1atsry+VKlSGD9+PAAgNTUV586dQ3R0NP7880+cP38e3t7eWLJkieSaxYsXY+fOnQbpVatWxbVr1xAeHo5bt26hU6dO6N27N9zd3fHvv/9i3rx5WLduHS5dumT26zPH6tWr0aVLF9SuXRsDBw5E4cKFcf36dfz111+YO3cu3n//fUl+3X+zxMREnD59GosWLcIvv/yCCRMmICIiAgAwbNgwfPrpp5rrjh49iunTp+O7775D1apVNem1atWy6eshytUEIsrTFixYIAAQjh49KkmPiIgQAAjLli0TBEEQnj17JuTPn1+YPn26UKdOHeGjjz6SLa9MmTJCmzZtJGkAhP79+0vSzp07JwAQWrdunWUdmzVrJlSvXt0gfebMmQIAYceOHbLX9e/fX5B7m0tLSxNCQkIEb29vYf/+/QbnExMThe+++y7Lesm9VrWjR48KAIQFCxZo0qpVqyZUr15dSElJMcgfHx8veS73byYIgpCQkCA0aNBAACBs2bJF9t6rV68WAAh79uzJ8jUQkTx2sRGRrNdeew0AcP36dQDAunXr8OLFC3Tq1Aldu3bF2rVr8fLlS6vLr1q1KooVK4arV69aXUZAQAAAIF8+yxrD//jjD5w+fRrDhg1D48aNDc77+Phg7NixVtfLmKtXr6JevXpwd3c3OOfn52dWGUWLFsWKFSuQL1++HKkjEYkYIBGRLHXgUrRoUQBi91qLFi0QEBCArl274unTp9i0aZPV5ScmJuLx48coXLiwWfkzMjKQkJCAhIQE3Lt3D7t378bIkSNRoUIFNGrUyKJ7b9y4EQDw4YcfWlzv7ChTpgxiYmJw+/btbJVTunRpNGvWDH///TeSkpJsVDsi0sUAiYgAiAFLQkICbt++jZUrV+KHH36Al5cX3n77bdy/fx+7du1C165dAYgf0A0aNMDSpUvNLv/ly5dISEjAgwcPcPz4cXTt2hUZGRno2LGjWddfuHABxYsXR/HixVGiRAm8/vrryMzMxI4dO2RbZEw5f/48fH19ERQUZNF12TVkyBDExsaifPnyeO211xAVFYUDBw4YHfBuSo0aNZCZmYkbN27YvqJExACJiETh4eEoXrw4goKC0LVrVxQoUADr1q1DyZIlsWLFCri4uOC9997T5O/WrRu2bduGx48fm1X+vHnzULx4cfj5+aFu3bqIiYnB4MGDNQONsxIcHIydO3di586d2LZtG6ZNm4bExES0bt0aDx48sOi1JiUloWDBghZdYwsff/wxtm/fjubNm+PAgQMYPXo0mjRpgooVK+LQoUMWlVWgQAEAwNOnT3OiqkR5HmexEREAYNasWahUqRLy5csHf39/VK5cGS4u4neo33//HfXr18fDhw/x8OFDAECdOnWQmpqK1atXo3fv3lmW365dO3zxxRdITU3F0aNHMW7cODx//lxzDwB48OABMjIyNM8LFCigCQTy588vmTX35ptvonHjxqhbty5+/PFHTJkyxezX6uPjg2vXrpmV99mzZ3j27JnmuaurK4oXL272vVQqleR5q1at0KpVKzx//hzHjx/HypUrER0djbfffhsXLlwweyySuk5KBHpEeQEDJCICANSvXx9169Y1SL98+TKOHj0KAKhYsaLB+aVLl5oVIJUqVUoT4Lz11lsoVqwYvvjiC7Ro0QLvvvsuAKBevXq4efOm5pqRI0eaXLsnNDQUvr6++Ouvv7K8v64qVarg5MmTiI2NzbKbbfLkyRg1apTmeZkyZTTdWp6ennjx4oXsdc+fP9fkkePt7Y0mTZqgSZMmKFasGEaNGoVt27ahZ8+eZr2Gs2fPwtXVFWXLljUrPxFZhgESEZm0dOlSuLm5YcmSJXB1dZWcO3DgAKZPn45bt26hdOnSFpXbp08f/PTTTxg+fDg6dOgAlUqFpUuXSgKOcuXKZVlORkaGpIXHHG3btsXy5cvx+++/IzIy0mTeHj16SGa6eXl5aY7LlCljsGij2sWLFzV5sqIOTO/du5dlXgC4desW9u3bhwYNGrAFiSiHMEAiIpOWLl2KJk2aoEuXLgbnGjRogOnTp2P58uUYMmSIReXmy5cPX3/9Nfr164cNGzagffv2Fs9G27NnD549e4aQkBCLruvYsSPGjx+PsWPHonnz5mjQoIHk/NOnT/Hjjz9i7NixKFeunNFA7a233sKOHTuwfv16tG/fXpOekpKC3377DX5+fnjllVc06TExMXj99dcNytm6dSsAoHLlylnW/dGjR+jWrRsyMjIwbNgwc14uEVmBARIRGfXPP//gypUr+OKLL2TPlyxZEq+88gqWLl1qcYAEAB999BGioqIwYcIESYAhJzExEb///jsAID09HRcvXsTs2bPh5eWFoUOHWnRfNzc3rF27FuHh4WjatCk6d+6MRo0awc3NDf/99x+WLVuGwoULZ7nOUO/evTF//nx06tQJH3/8MerUqYOHDx9i5cqVOHv2LBYvXiyZYdeuXTuULVsWbdu2Rfny5ZGcnIxdu3Zh06ZNqFevHtq2bSsp/9KlS/j9998hCAKSkpJw+vRprF69Gs+ePcPUqVPx5ptvWvS6ich8DJCIyCj1NH79D25dbdu2xffff49///3X4q0svLy88MUXX+D777/H3r170bx5c6N5b9++rVm3SKVSoXDhwmjWrBlGjhyJ2rVrW3RfAKhQoQJOnTqFn376CevWrcP69euRmZmJChUq4NNPP8WXX35pVv337duHH374AevXr8eCBQvg5eWF0NBQbN261SCA+e2337BhwwasWrUKd+/ehSAIKFeuHIYNG4YhQ4YYLHipnrXn4uICHx8flC1bFj179kTv3r1RrVo1i18zEZlPJQiCoHQliIiIiBwJ10EiIiIi0sMAiYiIiEgPAyQiIiIiPQyQiIiIiPQwQCIiIiLSwwCJiIiISA/XQZKRmZmJu3fvomDBggYbTRIREZFjEgQBT58+RYkSJSQbYVuDAZKMu3fvZrmBJRERETmm2NhYlCpVKltlOESANGvWLEyaNAlxcXEICQnBjBkzUL9+fdm8zZs3x759+wzS33rrLWzZsgVpaWkYPnw4tm7dimvXrsHX1xfh4eH48ccfUaJECbPqo978MTY2Fj4+Pta/MCIiIrKbpKQkBAUF2WQTZ8UDpJUrVyIiIgLR0dEICwvDtGnT0KpVK1y8eBF+fn4G+deuXYvU1FTN84cPHyIkJASdOnUCADx//hwnTpzAiBEjEBISgsePH2PgwIF45513cOzYMbPqpO5W8/HxYYBERETkZGwxPEbxrUbCwsJQr149zJw5E4A4/icoKAgDBgwwawPKadOmISoqCvfu3UP+/Pll8xw9ehT169fHzZs3Ubp06SzLTEpKgq+vLxITExkgEREROQlbfn4rOostNTUVx48fR3h4uCbNxcUF4eHhOHz4sFllzJs3D127djUaHAHiLuAqlQqFChWSPZ+SkoKkpCTJg4iIiPIuRQOkhIQEZGRkwN/fX5Lu7++PuLi4LK8/cuQIzp49i08//dRonpcvX2LIkCHo1q2b0Why/Pjx8PX11Tw4QJuIiChvc+p1kObNm4eaNWsaHdCdlpaGzp07QxAEzJ4922g5kZGRSExM1DxiY2NzqspE5GRSUoCqVYFff1W6JkRkT4oGSMWKFYOrqyvi4+Ml6fHx8QgICDB5bXJyMlasWIFPPvlE9rw6OLp58yZ27txpsi/Sw8NDMyCbA7OJSJenJ3DhAvD558DLl0rXhojsRdEAyd3dHaGhoYiJidGkZWZmIiYmBg0aNDB57erVq5GSkoLu3bsbnFMHR5cvX8auXbtQtGhRm9ediPKeU6eUrgER2Yvi0/wjIiLQs2dP1K1bF/Xr18e0adOQnJyMXr16AQB69OiBkiVLYvz48ZLr5s2bh/bt2xsEP2lpaejYsSNOnDiBzZs3IyMjQzOeqUiRInB3d7fPCyOiXCebC/MSkRNRPEDq0qULHjx4gKioKMTFxaF27drYvn27ZuD2rVu3DJYLv3jxIg4cOIAdO3YYlHfnzh1s3LgRAFC7dm3JuT179qB58+Y58jqInNmSJcCYMcCGDUDlysCLF4C3t9K1cjzceYgo71B8HSRHxHWQKK9Rf/CXLw9cvSoe79kD8PuENCg6dgwIDVWuLkRkWq5ZB4mIlLd0qfZYHRwBQIsW9q+Lo2MXG1HewT93ojxu4ECla+A8vLyUrgER2QsDJKI87uFD+fTChe1bDzlbtgCTJwOOMhBg+3age3eAi+0T5X6KD9ImIsfkCC1Lb78t/gwLA5o0sf/99dc9GjRI/FmyJDBhgv3rQ0T2wxYkIpKVmal0DbTu3VPmviNHyqffumXfehCR/TFAIiJZP/ygzH2HDgWqVQP279emHTumTF0mTpRP//tvx+n2I6KcwWn+MjjNn/ISY2v7VK4MHD8OHD0KNG4M5LNTh7yx+uTEO1V6uunXZWrdo3btgPXrbV4lIsoGTvMnohzXqBHw3nvidP8ff1S6NrYXGQkUKwZcu2Y8T/v2xs9t2MBWJKLcjAESEclKSwP+/FM8njYt5+93+DCwd6/8uXLlbH+/H38EEhOBb7+VP//vv1m3ED1/bvNqEZGDYIBElIukpYktG48emZff1EDstDTt8cOHwJMn2aqaSenpQMOGxhenvH/ftvfTbfn5+2/D848eASEhWZfz/12NiCgXYoBElIuMHCl2C+nt4WzUtm3Gz61YIX2u24r06JFtZ7ll1RLz7Jlt1x5avlx7fPcucO6c9Ly5/35BQbarExE5FgZIRLnI+PGW5dedPl+kiOm8o0YBs2YBhQqJAUT37hZXz6jk5KzzvHhhu/t98IH0efXqwHffWV6Ose45InJ+DJCI8jDdbrR//gE2bzY9q+uLL8RxO4C0Feb8eXHGl7W73T99mnWelBTrytan31qkNn682CpmyX3kuueIKHdggESUS1y/Ln2ekZH1NbpdSRUqAG3aWDZ1XaUC5s4V1y3STTtwwPwyAGD+fPn0QoW0x2+9JZZ95YplZeu6d09sLTLm5Utg3z5p2qefmi6TM9mIcicGSES5hP5Mr5s35fOlpgLvvgvMnAmULm14/tkzy+7bu7dhWlbbgvz9NxAbq31ubNuOJ08AT0/x+L//xJ8VK1oflMjVVdcbbwCtWknThg0zfY2LC/D559bVh4gcFwMkolyqfHn59GXLgHXrgAEDxNljgBh0qFnbTabvnXeApUsN08+eBRo0kA/O5OjvhwYAXl7i4GpLbd4sfb5kifT5wYPS556eQIkSWZf766+W14WIHBsDJCInk5oqruFz6pQ2zZwxPDduiNPSe/XSpqm74VxdtWnBwdLrdM9ZYtMmcSC3/mw33YHkgmB6oHPfvvLpKSnihrGWKlVKe+zqKtZPtyVLX0IC4O5u+X2IyPkxQCJyEidPiospTp4srgJdp472nLHVoMeO1XZHlS0rbo+hq3lz8afuDLH69aV5XF2B2bPNq+P27YZpixcDFy6I9Vi8WNoitHu3+HqMqVDBvPuaq1kz7bF6Bp9u0KTrzz+B/PkN080JRonI+dlpdyUiyo6tW8UB1EDW43t0DR8OVKkibhliirHxSoDYYqW7aKKx/ct69QJatpRPB8TB3z17Ss+Fh5uul24QmF0vX2q7/H77DSheXHtOpTIc12Rs0coCBWxXJyJyXGxBInIC6uAIAA4d0h6npoo/a9fWpk2dKr22Y0cgLs6y+xUsKH3eoAHw++/A/v3Gu9wmTBAHLBtjal8zY7LaB86SKfkdOmiPfX2l53SXO1BzczNe1tdfm39fInJODJCInIzu9P3duw3PDxpkmBYaatk95IKgDz4AGjc2fo06qOrWzbJ76d8DEAOj+HjxuFIl4/n1Z6Xt3i0GQg8fGubV7f5Tz4xTc3UFjh4FVq4Efvop661N5Lr+zFlWgYich0oQuIqHvqSkJPj6+iIxMRE+Pj5KV4fI5MwyQZCe139uLt13gnr1gGPH5M/p1sfTUzumSJ3nxQvA29vy+3/5JfDzz4bpP/0ERESYV291verUAU6cEM9t2yaOv9Jdqyk93bLB5/r/vmlphoO3X7wwDLyIyL5s+fnNFiQiJ/Pmm8bPvfGGbe6huw+bl5fxfGPGAJ06SQdae3lZvk5RwYLieCk5prq61NRdjWonT4pBjYuL2D2pGxwB1s/MM1WnlSuzVyYRORYGSERORm6mmNqCBeLPCxeyd4/y5YGoKHFsk7qry1i+Vavkx+RMmSJ/zfr1wOrVYjfY+vXA7dviRrS6g6Z16a6mDRiOZVq1CvDwML/VbNcu8/JZauHCnCmXiJTBLjYZ7GIjR2NuF1tcHODvr003NWharhxzrVsndsGNGWO8bqmpYuCiKyFBur2JOVJSpF1XgiC2No0da1k5aidPSge1m0O/iw0Qyzh9WpqP76ZEymIXG1Ee8+qr8un60+B1P8hVKnGrDnNY2vrRoYMYoJgK3NzdxYBo9Wrgjz/EulgaHAFikLVnj3j88cfiz0aNxJ/WLAOg3yJlCd2uur17TbfmEZFz4zpIRE5AvSWIvqwWUvT1FQMCU4FSr16G6xPZStGi4jID2dW8ubR1Rt0ydvKk5WUZ68qzVKFChvu2EVHuwQCJyAnoD0JWW70aSE7WPpdr0XnwQFzc0NiaQWXKZL9+9mZqjNVHH4ljmkqUEDfk1RUUJL86trn8/Ky/loicC7vYiBxcSgrw77/Gz3/3nenr8+UTp+IbGx+TnYBBKaaWEQgNFbv0ZswAypWTntPfrNZc69eL3Xrz5xueK1zYujKJyLExQCJycEePmj4/fbr2OKuZXJs2iUHDu+9q05wxQGra1DBt1ixxLaU+fbRply6JweX9++JxrVrW3a9dO+DAAXE9JX3R0eJPU4toEpHzYRcbkYO7dct2Zb39tviIjwfWrhXTrFnUUWmVKxum9etnmObqCtSsKR7bauyRPvU6UZZse0JEjo8tSEQObvBg0+d1d6M3dy0g3cUfzVmI0dHl1NpG5nj8WPyZVUsfETkXBkhEDu7OHdPnb9+2vEzdbTLy5YJ25NdeU+7e6sU5iSh3YYBE5OAs2VfN3Ly6AZKpAeDOwpq952xFdwxYZqZy9SAi22KAROTgIiPl01u3tr5M3RW2nz2zvhySTv3/4w/l6kFEtsUAicjBqaeR6y9KWKyYYV5rVtYPC7P8GtLSbY376y/l6kFEtsUAicjBqWdHlSoFXL0KvPcekJgov8+aJeOJli4FPv8c6NzZNvXMq3QDJCLKPRggUZ6VmSkGHI5OHSB5eIhrGK1ZI7YUZXf22fvvA7Nni1PhyXq6G/Jys1qi3IMBEuVZH38s7mU2Z47SNTFNN0DSlZYmfd69u33qQ1K6rXazZilXDyKyLQZIlGctWiT+1F152RE9eCD+1O9S0w+QJkywT30cTUCA0jUgotyIARKRA0tN1a6zM2WK9Jz+lPLAQPvUydGwi5Bs5cEDdpOSFgMkIge2eLHxc7oBUpcuyq4FpKSQEKVrQLnB/Pnikg3qltrkZGDdOi6DkZc5RIA0a9YsBAcHw9PTE2FhYThy5IjRvM2bN4dKpTJ4tGnTRpNHEARERUUhMDAQXl5eCA8Px+XLl+3xUohsytQq2RkZ2uMVK3K+Lo7m+HGgd2/xg01pvr5K14Cy65NPpM9ff13c1Ll8eWXqQ8pTPEBauXIlIiIiMHLkSJw4cQIhISFo1aoV7t+/L5t/7dq1uHfvnuZx9uxZuLq6olOnTpo8EydOxPTp0xEdHY1//vkH+fPnR6tWrfDy5Ut7vSxyMg8fKl0DQ+PHA6NGGT//+efiT7md7fOCV14Bfv0V8PdXuibA7t3izwIFlK0HWS9/funzf/4Rfxr5KKI8QPEAaerUqfjss8/Qq1cvVKtWDdHR0fD29sZ8I18LixQpgoCAAM1j586d8Pb21gRIgiBg2rRpGD58ONq1a4datWph8eLFuHv3LtavX2/HV0bO5Nw5pWsglZkJfPedNO3LL6XPw8OBa9eU3aiVROq1kHQ3ASbnUrOm9pgLfprnxQula5CzFA2QUlNTcfz4cYSHh2vSXFxcEB4ejsOHD5tVxrx589C1a1fk/3/4f/36dcTFxUnK9PX1RVhYmNEyU1JSkJSUJHkQKUm3+0ytVi3DtLJls78eEmWfetwK92JzXn//rT1u1ky5ejiLMWMAb+/cPfZR0QApISEBGRkZ8NdrI/f390dcXFyW1x85cgRnz57Fp59+qklTX2dJmePHj4evr6/mERQUZOlLISfnaH/kiYmGaVznyHGpZ9LJBbbk+NgKa7kRI7THZrZnOB3Fu9iyY968eahZsybq16+frXIiIyORmJioecTGxtqohuSoHP2b/vLlhmn6C0WS42CA5Nz27zd9ftIk+9TDWY0bp3QNcoaiAVKxYsXg6uqK+Ph4SXp8fDwCslj9LTk5GStWrMAnelMP1NdZUqaHhwd8fHwkD8rdnjyRPne0tU8cfXVvkmIXW/Zdvw4cOKDMvbP6+x882D71cFabN4s/MzOBIUOAP/5Qtj62omiA5O7ujtDQUMTExGjSMjMzERMTgwYNGpi8dvXq1UhJSUF3vX6HsmXLIiAgQFJmUlIS/vnnnyzLpLxD/5v+wYPK1MOYs2eVrgFZgi1I1ktPB44cEfcZbNIE+O8/Mf3qVeDKFfvU4elT+9wntzD2RWD9emDiRKBjR7tWJ8co3sUWERGBuXPnYtGiRTh//jz69u2L5ORk9OrVCwDQo0cPREZGGlw3b948tG/fHkWLFpWkq1QqfPXVVxgzZgw2btyIM2fOoEePHihRogTat29vj5dETiA1Vfpc5leMyGwMkKz30UdAWJj2eY8ewMuX4j6JFSuKx/oePAAKFwYWLrRNHV591Tbl5BVyv+fffWd63TZnpHiA1KVLF0yePBlRUVGoXbs2Tp06he3bt2sGWd+6dQv37t2TXHPx4kUcOHDAoHtNbfDgwRgwYAB69+6NevXq4dmzZ9i+fTs8PT1z/PWQ47t4EShVSulaUG6i7mJjgCR18qQ4AWLmTON5li6VPj9xQmyFUHvrLcNr/PzEbvJevYCuXbNfT3O62G/cyP59cgu9j2QA4rpt+vtDOjuVIDja6AvlJSUlwdfXF4mJiRyPlAtVqSIGSfq2bwd8fABH6InVn1XXrRuwbJkydaGsxcdrN83lO6qW7u+x3L9LWpp2DSlTnj2TTinX//s4fVp+GQxzlS4N6M/NiY83XISU/7eif//Neosfpf6tbPn5rXgLEpG9yQVHAPDmm0DDhvati7nkZrWR49DdMJcDtc2zdq15wREgrlDu4iL+206bZng+JASIijLsOjeXbnDUqxewcaPYSqVeIV1txgygRQtxn7a8Kj3d/P83Z8cWJBlsQcrd5NY8ql9fHCgKiG/CSq+LJHd//qU6rkePAPVwyNRULt6ppvt7nJ6uDSS3bwdat7a8vEKFDGeg6urSxfJ9Ce/eBUqWFI99fKRrkOme0xUSApw6Zdl9coPUVKB6dXFrpsePxX+bO3fk87IFiSiX0P1jdsQWgHz5lK4BmcIWJHmVK2uPY2PFqfyRkfLBkd7KLLJMBUcAsHIl0KEDcOuW+XX85hvtsYveJ6KxlpLTp80vPzc5dUqcWfj4sfjc21vR6uQ4BkhEkA4uTE9Xrh7GVKumdA3IFN0AydYDtVNTgfnzLfvQdxSFC2uPN2wQp/L/+KNhvnz5xC4tS6bbBwfLBzDr10uDnqxcvqw91l9/TD9g0qUePL5/v9gllxfoB0QMkIxYsmQJGjVqhBIlSuDmzZsAgGnTpmHDhg02qxyRvegGSI44EyO3vxE5O90PUlsHSB4ewCefAGXKSNOt6cLIzLRv14duwPPVV8bzqafyFygAHD0qjk9KTxfr+uab8tccPWp84sLq1cbv9c03QO/e2pa+58+156pUkebVDfD0bdsGVK0KNG0KtGsHDBpkPG9uoftFAADy55fvgswtrAqQZs+ejYiICLz11lt48uQJMv7/jlCoUCFMkxtBR+RAdKcNR0SIP3W7ReTWXRk9WpzGag9yeyWPGmWfe5N1zGlBmjJFDBLkApRly8TxOn36SNPl8r58KU40cHERrzl/Xnq+Th0xXaUSu7Tu3NE+d3XVXnfsmEUv0SrqRR+NOXFCfI26/35164rdZOq0bdsMW2jefx8oVgx4911xULWc/v21r1v97/jypfj/MHeuWL67O3DunPaa6tWlZahUpnesv3BBezxtGpCQYPLlOr3Zs6XP8+UznP2nlivGTApWqFq1qrBu3TpBEAShQIECwtWrVwVBEIQzZ84IRYsWtaZIh5KYmCgAEBITE5WuCuUA8U9XEDp0EISffhKPy5XTpm/ZIuY7cEAQKlUShKNHteeePs35+o0bp72f+kGOLS1N+391547h+efPtefnzRN/BgeLPxcvNv5/vX274e+C3EPuPuZel5Fh3WveulUQpk83fj493fS9u3c3/176ZcnVOSbG9P08PATh8mXj55s2NX5/S/5Nb940/3U5G/3XWrCgmO7hYXhu0yZl6mjLz2+rWpCuX7+OOnXqGKR7eHggOS/PfySnsm6d9luqbjN7mzbiN8HGjYFLl4B69bTn7PENkduMOB/dFpAXL8Sdzrdu1abpLqynXt9WvfBgjx7Ssho31h4b617Sd+WKuB+WpV2x6lalGTMsuy4jQ2yJ/fJL4JdfxLTHj4HoaHFGX3o6sGaN8etffx1YssT8+7m6SpfgkBsb9NprQOfOxstISRFX5jbG3IkQZ86YPq/fFZqbqbtQU1IMz+WGjSusCpDKli2LUzJzHLdv346qVatmt05EdqN+U9QNkACgeHH5/OasphsfD1y7Zn2duCCk89Gdzr58OTBmjBhoA+KHx59/ml+Wel9AS5aaqFYNaNvWvLx6uzMBEAMdQch6/FRmJvDee9Jgon9/cXPSIkWAvn3F8t3cTK9wvXateXXVtX07EBQkTuU3Zt48y8tVM3fafo0a4r8BmZYbVpW3KkCKiIhA//79sXLlSgiCgCNHjmDs2LGIjIzEYG57TA5iwwbDN2L9P1r1N3+5cT9yBg7MOk9AAFC+vG1amz79NG+ut+LMRozQHnfsCHh6Av36WVaGqUHGcsyZWLBhgxgEGQvyXVzEwMfHRxzI/Oqr2hYCQQD27RODPrngxpLNSevWFe9hqYIFxTFVphZNNTXrLCuWBG3ZCcTIiVjbN/f7778LFSpUEFQqlaBSqYSSJUsKv/32W7b7/BwBxyA5v7t3tX3h/x8iJwiCICQmatOLFhWE336zbHxBVn8xy5dr861YYV3dAwI49sgZWfp7pH74+QnCX38JwsqVxvO8/774uzVnjnlltmsnfb5ypSBkZlpX19RU61+b3OPAgZz7P0hJsb5ef/5pvNxLl8Q8HTtK09PSxJ/37pn/HuHMjL0fGvs3ff7c/nW05ed3tv8rk5OThfj4+GxXxJEwQHJ+f/yh/SNdtUpMe/ZMEBYt0qZPny4ICxda9iZqaiBn796GH1KhoYKQlGRZ3YsXz/1vtLmRtR/MahkZxvO8eKHNl5YmCKNHC0J8vPH8t24Jwrffisf//WdY1+PHBcHbWxD697dd4BMeLgYShQoJQpEi4pcPQRCEXr20eYYNkwZqOeHQIUF47TX5Op4/LwjvvSc/ESKrj7GUFNPnL1wQyylc2HavxdHo/5up/4+XLxcEd3fpF0RAfsJCTlM8QHr+/LmQnJyseX7jxg3hp59+Ev40FYI7EQZIzu/QIcNvhmXLSv94MzMFYdky6z/Q9BnL/957ltU9L3wTzY3M+d1JShIEHx8xMHntNUH47jtpGeHhhtesX2/8nuoZcbqPzZstq/e2bYIwdqwgLFhg/t/A4MHitRcvigHBX38ZLz85WfySYs+304wMQejRQxCWLtXWWT3jSk339TRrlv17qluZfH2zX5aj0v890A1209IMWxtDQsQZiPakeIDUsmVLYfbs2YIgCMLjx48FPz8/oVSpUoKnp6fwyy+/ZLtSSmOA5Lx+/VV8s965U/tH+u67hlOpS5US848ebXmA9N13gvDkieG9rQmq5DBAck7ZCa7V7t+X5j91KutrMjNt9ztz9678lG31o1w5QahfP+dbgWzp2DExWEpNlaYfOWLbv7MrV+QDsdwkq99nuVbQ3bvtW0fFp/mfOHECTZo0AQCsWbMGAQEBuHnzJhYvXozp06fbZGwUkaX++ktcaK9pU+DZM2362rWGU6lv3xZ/ZrWQnZxx44BataSLS+pO45YTF6c93rgR+PBDaR3VdGe/ffut5XUj51a8uDiL7aOPgF27xE1Rs6JSiYspAtnfIywwUFxMURCAAwek55YsAa5eBf75R/nNnC0RGgosWmS4gXC9euLsQltNglAPEM8Ns7esJfd74cx7E1q1Bebz589RsGBBAMCOHTvw7rvvwsXFBa+++qpm2xEie9Ndn6RDB/OusXYLj1u3xBlwgiA+L1HCdP7AQG3edu3En7//rk1TK19ee8wVM3KP4GDzZz41bChd88ccb75p+LuUXQ0bAg0aAIcPA5MmAR98YNvyHcEbb9iuLHWA5MwBQXbJBUjOvNG2VS1IFSpUwPr16xEbG4s///wTb/z/t+z+/fvwsWb+JpENDBhg+TXqrUbkHD2a9fWpqYbbE5iiv2N5aqrxvM78xkJakZHi9PTXXlO6JpZRqYBDh8TA65tvnKvVSAnqJUPySoDUsqV5+Zz5fcyqACkqKgrffPMNgoODUb9+fTRo0ACA2Jokt8I2kT1Y8g1avXGmn5/xPDVqZF3O8OHSvZzUunY1LHvaNHGNJF3qrj4AGDZMes6a7j9yPOqVsyl3ywstSOoW99mzzV83ypkDJKuq3rFjRzRu3Bj37t1DiE4n+euvv44O5vZtEClI/e3H1JuZm5sYtIwdazzPpEmGaepA7dkzcXE7Nbndvh89AsqVAxYuFMc26XryxPh9yXkUKKB0Dcge8kKApH5ve/NN83+v9cd+OROr1x0NCAhAnTp1cPfuXdz+/9fg+vXro0qVKjarHFFOqVxZ/Cm37YKaqyswerR4/Prr5pWr3pcKAPLnzzr/48fAw4fyO5JnNa6JnINukEy5V14KkCzpbs3O6uZKs6rqmZmZ+OGHH+Dr64syZcqgTJkyKFSoEEaPHo3M3PzbQQ6tVSvz8sXEaAdDZ9X8q1KJbwq7dpnX5/7559Jr5883nf/FC6BYMflz6m5Acl5Nm1o/EYCci24gYOsB847CmgDJmUMCqwKkYcOGYebMmfjxxx9x8uRJnDx5EuPGjcOMGTMwQncjIiI7MhZo6GvRQj69VStgyhTj18l1p+kqW9bwjaNXL9P7VP3zj/FznO/g3EaNAvbuVboWZC+6AZIzBwWmmBMg6X8pdOZ/C6sCpEWLFuG3335D3759UatWLdSqVQv9+vXD3LlzsXDhQhtXkcg8S5capi1YALRuLR1HZOyPu1IlcWNRY0JCpF1o+vbvl0///5JhsvTHHVHu4eXFmV95iW6AdOuWcvXISeYESPrDBfJcgPTo0SPZsUZVqlTBo0ePsl0pIlv56CNg61ZxqnVEBBAdbTyvqyvg7m66vM6djZ8rWVI+XXen9UOHst6pvW5dYPt203nI8Tnz7B2ynG6AZO4ML2djTRebMy+caVWAFBISgpkzZxqkz5w5UzKrjSgnHD4MfPll1t9MxozRHqtUYvdZnz7G87u4AG+/LR4bm+JfpIg4YNtUq5A+Dw/tcd26xrvcNm8WV0I+etT88VTkuNTr4lDeoBsgOXNQYEpeC5Cs+o4zceJEtGnTBrt27dKsgXT48GHExsZi69atNq0gkT71KsO3bgHr14vHUVHa86+/Dnz3neUL87m6iusUPX5sfAaaSgXs3Ckemzs7o00bccB13bqmp7y2aWNRdcnB1aypdA3InnTfD3RbjXMTawKk9PScqYs9WNWC1KxZM1y6dAkdOnTAkydP8OTJE7z77ru4ePGiZo82opygOztkwwbtsXo6PiAOErRm1WL1G1yhQqYDGZVKfPz7r3nlli0rBnO7d2vTihSxvH7kPJYsMT4ZgHIn3QApJUW5euSkvBYgWd1LXqJECYw1tYIeUQ5YvjzrPIUKWVe2bleYOWrWFMc1TZ0KzJplOq/+mkZ//SXtxpNbjZucU+XKQPfuSteC7E03QDp2TLl65CRrAiRnbk0zO0D619yvywBq1aplVWWIsjJ8uPZYPVtCv4/b2unx1qxXM2kS0LevdJNZc+i3UAUFWX5vcky5dQ0cMk13zNm2bcrVwx6yCpB8fYHERPFY3YI0Y4b4JbR375ytmy2ZHSDVrl0bKpUKQhZ//SqVChnOPCqLHJqXl/bY11f8+ddf2Stz4EBg40bTA7iNcXEBKlSw/Dr9AeaWtl6R42KAlDfptiC1bq1cPXKK7u91VgHSqVPi0AJAbEG6fVucWAOIM4GtbeW3N7MDpOvXr+dkPYjM8t132u4LddOt7ngjCxo6NaZNA376yb5r1lSuLD4uXhSfO/N+RSTF/8u8Sff9Izf+DlgSIAUHA82aAfv2iS1IcXHac1evAqGhOVJFmzN7kLZ6S5EyZcpg2bJliImJkaSVKVMGMTExWLFiRU7Wl/I43TeeWbOAhATpeWtnDtl7QT+VCrhwQVwocs0a+96bcsaiRWJXqdyCpZS3pKYqXQPbsyRAAsTZwABw7Zp04+26dW1arRxl1Sy2X3/9VXahyOrVqyPa1Ep8RNm0b5/0efHiytTDViIjgffeU7oWZAs9eoizFWvXVrompLTt28WZjA8eKF0T27E0QFK35kdGalvKnY1VAVJcXBwCAwMN0osXL4579+5lu1KU++zYIXZjZXd8hqmtPoiIHEWPHoCfH3D8uNI1sQ1LAyRdd+/ati72YlWAFBQUhIMHDxqkHzx4ECX05zMTQVwZOiIC2LNH6ZoQEeWMtm0N0777zv71yAnZCZB27bJtXezFqgDps88+w1dffYUFCxbg5s2buHnzJubPn49Bgwbhs88+s3UdKRe5di3nyp40KefKJiLKSqNGhmmmNsB2JtkJkN54Q/r89dezXx97sGqhyG+//RYPHz5Ev379kPr/0Wienp4YMmQIIiMjbVpByl2ys6pqVt1zERHWl01ElF1ygYMz72avy9IA6Y03xKEVNWuK+0vq2r0bePFCumyLI7KqBUmlUmHChAl48OAB/v77b5w+fRqPHj1ClO6GWJSnCYL2D0p3WazsLJE1Y4bp8+bujUZEZC+bNytdA9uwNEBStxKdOQP8+afheW9vYMsW29Qtp2TrI6VAgQKoV68eatSoAQ+udEf/JwjidPzixcVvTy9fas8dOWJ9uQMHGj9Xp4715RIR2YL+LNvcxNIAyZy1oN5+2/r62AO/c5PNnTghthQ9fAjcuQMkJWnPLV5s+5WGo6KAv/+2bZlERJbautUwzd3d/vXICZYGSPms3unVcTBAIpv77z/tsYuLuFK1LldXYOHC7N1D/e1k40Zg1Kjc8yZERLmL7kr/zswWLUjt2kmfP3yYvTrlNMUDpFmzZiE4OBienp4ICwvDkSz6YJ48eYL+/fsjMDAQHh4eqFSpErbqhO0ZGRkYMWIEypYtCy8vL5QvXx6jR4/Ocg85sh3dvcnu3QMmTpSeFwTtRrPW+vprsZVKblotEZGj2L5d6RrYhi0CpMWLpc+LFMlenXKaogHSypUrERERgZEjR+LEiRMICQlBq1atcP/+fdn8qampaNmyJW7cuIE1a9bg4sWLmDt3LkqWLKnJM2HCBMyePRszZ87E+fPnMWHCBEycOBEzshrhSzajOxC7Xj3j+bKzvceQIRyUTUTOITd8kbNFF5uPj3ZgtjPsSqZoL+HUqVPx2Wefodf/mxOio6OxZcsWzJ8/H0OHDjXIP3/+fDx69AiHDh2C2//D0+DgYEmeQ4cOoV27dmjTpo3m/PLly7NsmSLbUW8ia47Ro4Hhw837g3vzTfHb2PffO89u0EREmzeLAYa993y0BUEQx5IWLKhNy84g7bfesv041Jyi2Hfw1NRUHD9+HOHh4drKuLggPDwchw8flr1m48aNaNCgAfr37w9/f3/UqFED48aNQ4ZOk0XDhg0RExODS5cuAQBOnz6NAwcOoHXr1kbrkpKSgqSkJMmDrGdJgBQVBfz4o3l5vb3Fn35+lteJiEhJzrjlyNKlYkt9UBDw7bfadGtakP74w7Z1swfFAqSEhARkZGTA399fku7v74+4uDjZa65du4Y1a9YgIyMDW7duxYgRIzBlyhSMGTNGk2fo0KHo2rUrqlSpAjc3N9SpUwdfffUVPvjgA6N1GT9+PHx9fTWPoKAg27zIPMqSAAkwvhT/e++Jf4jVq4vP1QuusWuNiJzN6tXA/9dVdgqCAHTvrn0+d6722JwASXd5F0DcbsrZONVHTWZmJvz8/DBnzhyEhoaiS5cuGDZsGKKjozV5Vq1ahaVLl2LZsmU4ceIEFi1ahMmTJ2PRokVGy42MjERiYqLmERsba4+Xk2sZWy37yBFxbSR9YWGGaQ8eAGvXisfnzolBl7pZlgESETm63bulzydOBJxpuUBTX3TNeQ/Wff0qleOvmi1HsY+aYsWKwdXVFfHx8ZL0+Ph4BAQEyF4TGBiISpUqwdXVVZNWtWpVxMXFabY8+fbbbzWtSDVr1sSHH36IQYMGYfz48Ubr4uHhAR8fH8kjrzp+PPtNwXJ/WIULiwO279833DPtn3+0xxkZ4pYhDRtK8zx4AGzYIB7fu5e9+hER5QT1itGdOgHNmilbl+zKboDUtav2WBCc84utYlV2d3dHaGgoYmJiNGmZmZmIiYlBgwYNZK9p1KgRrly5gkydzW0uXbqEwMBAuP9/IZznz5/DRe9/wtXVVXINyUtNBerWFR9yY9ozMswbXCf3h3Xhgvb4m2/EgEnOokXATz8BV65I03UmKuLXX7OuAxGRvb3xhrjH2KpVxruhUlLsWydrmaqnOV1sztRaZoyiMV1ERATmzp2LRYsW4fz58+jbty+Sk5M1s9p69Ogh2fy2b9++ePToEQYOHIhLly5hy5YtGDduHPr376/J07ZtW4wdOxZbtmzBjRs3sG7dOkydOhUdOnSw++uzB0EALl4Ezp4Vl7mvV0+6cnVWVCrxkZkp7R8PCwMSErTPe/cWB92pY8/168UVs+XIBUj6A6tHj5a/9pdfsq7zzz9nnYeISAmenuJPY0GEpydQtqz96mOt58+zd70zztgzIChsxowZQunSpQV3d3ehfv36wt9//60516xZM6Fnz56S/IcOHRLCwsIEDw8PoVy5csLYsWOF9PR0zfmkpCRh4MCBQunSpQVPT0+hXLlywrBhw4SUlBSz65SYmCgAEBITE7P9+nLasGHqbWGlj99+E89nZAhCjRqC8NVX2msyMwVh1SrDa+rXN0z79lv58tWPu3cFoVo1QfjzT235c+ca5tOXmak9V7q0IKSnC8Inn5i+l/px9WrO/psSEdmCqfexY8eUrp1ply4Zr7s59u2z/BpbsOXnt0oQnGVFAvtJSkqCr68vEhMT7TYeaft2YN06YMoUcQxOWhowf37WUbip86NHA7VqGS7vnlMePRK7zmbPBvr1E9e7SE0FWrYEBg82zD9sGDBunOkyN20yXGRNfR8iIkdm6v153TqgfXu7VcVip08DtWvLnzMnati/H2ja1LJrbMGWn99OOGwqd0lMFP+IWrcG5swRF+OaO1fcq+zaNbH7bOpUIDBQ2x2mUondacnJpsseMcK+Gwa+8Yb4U93FVqAAsHOnfHAEACEhWZf5//U+JXx9rasfEZGjePpU6RqYpu5iK1dOul2U7npIpjjjoGx9ueAlOK8XL0yvCF2hAlClirjvmP7SUM2biwFIVuQCjJxy7Jj4U/3HtGqV6fzGlgMAxMBRvfLsyJHSc7nhD4+I8rYePZSugWnqAMnbGxg4UJs+YYJ51+u2njnruFF+1NhZQoK2Fejdd5Wujejff4GNG4H+/cUuscuXpeebNBHPJSWJK6u+9RZw8qTx8u7cMe++piYW6raMDh9uXnlERI5EEMT3uVdflT+/cKG49Ikj0g2Q3N21o4nMHXyt+0VWvQuCs2GAZEcPHkgXSsyJXZ6DgoC//5Y/N2QI0KiRuEngs2fiNE5BAGrWFMf5zJwp7p9ToYK0v7hTJ/FcwYLA+++Lmw3Wrg0cPQpUq2a8LrqrsMoxd8Vte3YTEhHZkkoFGNk9C716Aa+9lr3yu3cHAgK0K1d//73Yw1CrlvSLrCAAp05pu/a6dRPrpm7516cbIFlDN5D6/yo8TocBkh3t22f6vO7CWpZ49AiIjRUHPJ84AdSvL5/vxx+BAweALl2A/Pmz/qVdskTM+9ln8ufr1gX++w+YNUub9umn2mNj35rUTHWx6Vu8WPxGsnq1+dcQETm6//7L3vVLlwLx8WIvQGwsMGqU+Flz5oz45VZt3jygTh2gSBHxc2DFCjG9Xj1peWfOAHv2iMMcAEBnXWaL6LYg5URjgD1wFpuMnJrF1qGDuH6QvvbtxVaSlSuBYsWAx4/F4EK/Jej8efGXu3hx4MYNIDjYeHPnvn3A1avAJ59o03Lqf/q//4AaNQzT//1XbJ0y5tIloHJlaVqhQuIfepMmhvlfvtSuMUJE5ExMdU1Z+96ckaFtYd+0SVxfSfe9uFgxsefCkvvL5bOmfps3a2cgt2plvyCJs9iclG40r2vdOrFlxMVFbA168UJskk1NFTdqDQkR+7GrVBEXXFSpxD8EU7/wzZoBH38M7NolBlI7duTISwKg3UxWn1zQpKtSJcO0Y8fkgyOAwREROS9ji+Nmx4sX2uNDhwCddZUBSBf7NWXJEvHnqVM2qRYA6YLFzrp7F1uQZORUC5Kx/Whyw/+Atd86PDykK3gnJjrvHxMRkSnGvtRa+xlw/z7g76997uFhuEXIypVA585ZD65++lQcZ6ovIkJcn89Sy5YBH3wgHv/0E/DVV5aXYQ22IDkplUr8FlGlijbNVBeUM1u3zrx8J09KAyIGR0SUW02aBHz0kWG6tQGSbgsSIL9GUZcuwN69WZdlbAysqYk4pjx6pD3+8EPrylAaAyQ7Gz5cHEu0fj3QoIH5gYSzMXf17mrVgOvXxUHj9lyziYjI3r75BliwwDB940brytPfL81Yl9o//2Rd1pYt8unvv29ZndR0NxgvWtS6MpTGCdQKadfOfluA2MPVq0B4OPDkiTi43JKNCosUAR4+dN6poERE2dG+vXWtSPotSNHR8vliYy0vGwBmzAC8vKy7NjdggEQ2Ua6cuDWKJQuJ6fLwsH2diIichTXvnerB1VmZNUvcrurePcNr5bq/Xr4Up/u/8opl9clt2MVGNmVNcERElJe8fGk4Lkh3Y9fffhPfS421CAHAwYPAtGny5y5flk5+AbTB0YkTYjDWvbu4WKS+YsXEL6x162ZvW6fAQOuvdRScxSYjp2axERERqel/oUxPFxdm1E039gltzrpGcnn++0868Fo/T3Q00KeP8bItMWWKuDODPYeTcBYbERFRLhMTk/0yFi7UHsu1QLm5SZ/Xri3+/O8/cfKQrYIjQNxo3ZnH2jJAIiIicgB9+4orUFtj6VIgLg7o2VObprv1k5r+OknHj4stV9WqOXcwkxMYIBERESlg7lzp82vXtNtzqD14YDhbTb0xrdrQoeJ0fN1FIwGxu27OHGlaxYrS5y4u1u+3lttxFhsREZEC9Lu75Pj5iT8zMrSDpnUXYQRML+aoP0OYM4bNxxYkIiIiB1emjPb411+1x598YnoxR7k9L8k8bEEiIiJSQEaG+Xlv39Ye79ypPf7tN9PXqQdhk+XYgkRERKSA9HTrrrNk6w5PT+vuQQyQiIiIFGFJC5KusDDxZ1CQ7epChhggERERKaB4ceuuS04Wf773nnn5X39d/Llvn3X3y6s4BomIiEgB775r3XU//ij+NHcj2V27rLtPXscWJCIiIgVYuteZfpfcyZO2qwsZYgsSERGRE0hKki7qePeucnXJC9iCREREpJBx44D27c3b5qN2bWD3bu3zmjVzqlYEsAWJiIhIMZGR0ue3bgFPngAhIYZ5b90COnTQPs/HT/AcxX9eIiIiB1G6tPgwR/nyOVuXvI5dbERERA7mq6/En926Gc/z9dd2qUqexQCJiIjIwUydCly5AixdCpQsKZ/H29u+dcpr2MVGRETkYFQqdqEpjS1IREREDiwzU+ka5E0MkIiIiByYtXu2UfYwQCIiInJg9+8rXYO8iQESERERkR4GSERERE6mcGGla5D7MUAiIiJyMuPHK12D3I8BEhERkZPx8lK6BrkfAyQiIiIno1IpXYPcjwESERGRk6lRQ+ka5H5cSZuIiMhJHDsG3LkD1KmjdE1yP8VbkGbNmoXg4GB4enoiLCwMR44cMZn/yZMn6N+/PwIDA+Hh4YFKlSph69atkjx37txB9+7dUbRoUXh5eaFmzZo4duxYTr4MIiKiHFWnDhAaCrzzjtI1yRsUDZBWrlyJiIgIjBw5EidOnEBISAhatWqF+0ZWxUpNTUXLli1x48YNrFmzBhcvXsTcuXNRUmcnv8ePH6NRo0Zwc3PDtm3bcO7cOUyZMgWFOSeSiIic0LhxgIsL8MsvStckb1EJgiAodfOwsDDUq1cPM2fOBABkZmYiKCgIAwYMwNChQw3yR0dHY9KkSbhw4QLc3Nxkyxw6dCgOHjyI/fv3W12vpKQk+Pr6IjExET4+PlaXQ0REZAtpaYCRjz3SYcvPb8VakFJTU3H8+HGEh4drK+PigvDwcBw+fFj2mo0bN6JBgwbo378//P39UaNGDYwbNw4ZOhvVbNy4EXXr1kWnTp3g5+eHOnXqYO7cuSbrkpKSgqSkJMmDiIjIUTA4sj/FAqSEhARkZGTA399fku7v74+4uDjZa65du4Y1a9YgIyMDW7duxYgRIzBlyhSMGTNGkmf27NmoWLEi/vzzT/Tt2xdffvklFi1aZLQu48ePh6+vr+YRFBRkmxdJRERETsmpZrFlZmbCz88Pc+bMgaurK0JDQ3Hnzh1MmjQJI0eO1OSpW7cuxo0bBwCoU6cOzp49i+joaPTs2VO23MjISERERGieJyUlMUgiIiLKwxQLkIoVKwZXV1fEx8dL0uPj4xEQECB7TWBgINzc3ODq6qpJq1q1KuLi4pCamgp3d3cEBgaiWrVqkuuqVq2KP/74w2hdPDw84OHhkY1XQ0RERLmJYl1s7u7uCA0NRUxMjCYtMzMTMTExaNCggew1jRo1wpUrV5CZmalJu3TpEgIDA+Hu7q7Jc/HiRcl1ly5dQpkyZXLgVRAREVFupGgXW0REBHr27Im6deuifv36mDZtGpKTk9GrVy8AQI8ePVCyZEmM//+ufH379sXMmTMxcOBADBgwAJcvX8a4cePw5ZdfasocNGgQGjZsiHHjxqFz5844cuQI5syZgzlz5phdL/XEPg7WJiIich7qz22bTNAXFDZjxgyhdOnSgru7u1C/fn3h77//1pxr1qyZ0LNnT0n+Q4cOCWFhYYKHh4dQrlw5YezYsUJ6erokz6ZNm4QaNWoIHh4eQpUqVYQ5c+ZYVKfY2FgBAB988MEHH3zw4YSP2NhYq+MSNUXXQXJUmZmZuHv3LgoWLAiVjXcEDA0NxZUrV2xaJhERkTPavXs3QkNDbVaeIAh4+vQpSpQoAReX7I0icqpZbPbi4uKCUqVK5UjZugPMiYiI8rICBQrYfEFmX19fm5Sj+F5sRERERI6GARIRERGRHgZIdtakSROlq0BERKQ4V1dXBAYGKl0NozhIm4iIiEgPW5CIiIiI9DBAIiIiItLDAImIiIhIDwMkIiIiIj1cKDILtl5Jm4iIiJSxcOFC9OzZ06y8bEEiIiKiPCEkJMTsvAyQsiAIguZBREREzmvcuHFm52WARERERHnCnTt3zM7LAImIiIjyhPj4eLPzciVtC3DANhERkfPy9vZGcnKyWXkZIFmAARIREZFzMzfsYRcbERER5Qlubm5m52WAlIUvvvgCKpWKrUdERERObuTIkWbnZRdbFhgYERER5Q579uxB8+bNzcrLlbSzwPiRiIgo72EXGxEREZEeBkhEREREehggEREREelhgERERESkhwESERERkR4GSERERER6GCARERER6WGARERERKSHARIR5SrNmzfHV199pXQ1iMjJMUAiojxr7969UKlUePLkidJVISIHw61GZGRmZuLu3bsoWLAg92IjcjLp6elISUlBUlJSlnmTk5MBAElJSXBx4fdFImcnCAKePn2KEiVKZPtvmpvVyrh9+zaCgoKUrgYRERFZITY2FqVKlcpWGWxBklGwYEEA4j+wj4+PwrUhIiIicyQlJSEoKEjzOZ4dDhEgzZo1C5MmTUJcXBxCQkIwY8YM1K9fXzZv8+bNsW/fPoP0t956C1u2bEFaWhqGDx+OrVu34tq1a/D19UV4eDh+/PFHlChRwqz6qLvVfHx8GCARERE5GVsMj1G8033lypWIiIjAyJEjceLECYSEhKBVq1a4f/++bP61a9fi3r17msfZs2fh6uqKTp06AQCeP3+OEydOYMSIEThx4gTWrl2Lixcv4p133rHnyyIiIiInpvgYpLCwMNSrVw8zZ84EIA6QDgoKwoABAzB06NAsr582bRqioqJw79495M+fXzbP0aNHUb9+fdy8eROlS5fOssykpCT4+voiMTGRLUhEREROwpaf34q2IKWmpuL48eMIDw/XpLm4uCA8PByHDx82q4x58+aha9euRoMjAEhMTIRKpUKhQoVkz6tnvOg+iIiIKO9SNEBKSEhARkYG/P39Jen+/v6Ii4vL8vojR47g7Nmz+PTTT43mefnyJYYMGYJu3boZjSbHjx8PX19fzYMz2IhI1/O05+CEX6K8RfExSNkxb9481KxZ0+iA7rS0NHTu3BmCIGD27NlGy4mMjERiYqLmERsbm1NVJiInc+PJDeQflx8VZ1RUuipEZEeKzmIrVqwYXF1dER8fL0mPj49HQECAyWuTk5OxYsUK/PDDD7Ln1cHRzZs3sXv3bpN9kR4eHvDw8LD8BRBRrlf257IAgKuPrypcEyKyJ0VbkNzd3REaGoqYmBhNWmZmJmJiYtCgQQOT165evRopKSno3r27wTl1cHT58mXs2rULRYsWtXndiSjveZn+UukqEJGdKN7FFhERgblz52LRokU4f/48+vbti+TkZPTq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UKJgCaWrlesputXIypUrERERgejoaISFhWHatGlo1aoVLl68CD8/P4P8qampaNmyJfz8/LBmzRqULFkSN2/eRKFChTR5Hj9+jEaNGqFFixbYtm0bihcvjsuXL6Nw4cJ2fGVERES2UbdEXdwadEvzvKBHQQVrk3eoBEFQrCMzLCwM9erVw8yZMwEAmZmZCAoKwoABAzB06FCD/NHR0Zg0aRIuXLgANzc32TKHDh2KgwcPYv/+/VbXKykpCb6+vkhMTISPj4/V5RAREZH92PLzW7EuttTUVBw/fhzh4eHayri4IDw8HIcPy68QunHjRjRo0AD9+/eHv78/atSogXHjxiEjI0OSp27duujUqRP8/PxQp04dzJ0712RdUlJSkJSUJHkQERFR3qVYgJSQkICMjAz4+/tL0v39/REXFyd7zbVr17BmzRpkZGRg69atGDFiBKZMmYIxY8ZI8syePRsVK1bEn3/+ib59++LLL7/EokWLjNZl/Pjx8PX11TyCgoJs8yKJiIjIKSk6BslSmZmZ8PPzw5w5c+Dq6orQ0FDcuXMHkyZNwsiRIzV56tati3HjxgEA6tSpg7NnzyI6Oho9e/aULTcyMhIRERGa50lJSQySiIiI8jDFAqRixYrB1dUV8fHxkvT4+HgEBATIXhMYGAg3Nze4urpq0qpWrYq4uDikpqbC3d0dgYGBqFatmuS6qlWr4o8//jBaFw8PD3h4eGieq4dlsauNiIjIeag/t20xvFqxAMnd3R2hoaGIiYlB+/btAYitPzExMfjiiy9kr2nUqBGWLVuGzMxMuLiIvYOXLl1CYGAg3N3dNXkuXrwoue7SpUsoU6aM2XV7+vQpALAViYiIyAk9ffoUvr6+2SpD0S62iIgI9OzZE3Xr1kX9+vUxbdo0JCcno1evXgCAHj16oGTJkhg/fjwAoG/fvpg5cyYGDhyIAQMG4PLlyxg3bhy+/PJLTZmDBg1Cw4YNMW7cOHTu3BlHjhzBnDlzMGfOHLPrVaJECcTGxqJgwYJQqVQ2fc2hoaG4cuWKTcskIiJyRrt370ZoaKjNyhMEAU+fPkWJEjZYJ0pQ2IwZM4TSpUsL7u7uQv369YW///5bc65Zs2ZCz549JfkPHTokhIWFCR4eHkK5cuWEsWPHCunp6ZI8mzZtEmrUqCF4eHgIVapUEebMmWOPl2KWypUrCwD44IMPPvjgI88/jhw5ovTHslGKroOUF1WpUsWgC5CIiCgvOnLkCOrVq6d0NWQpvtUIERERkaNhgGRnTZo0UboKREREinN1dUVgYKDS1TCKXWxEREREetiCRERERKSHARIRERGRHgZIRERERHoYIBERERHpYYBEREREpEfRrUacga23GiEiIiJlLFy4ED179jQrL1uQiIiIKE8ICQkxOy8DpCwIgqB5EBERkfMaN26c2XkZIBEREVGecOfOHbPzMkAiIiKiPCE+Pt7svNxqxAIcsE1EROS8vL29kZycbFZeBkgWYIBERETk3MwNe9jFRkRERHmCm5ub2XkZIGXhiy++gEqlYusRERGRkxs5cqTZednFlgUGRkRERLnDnj170Lx5c7PyciXtLDB+JCIiynvYxUZERESkhwESERERkR4GSERERER6GCARERER6WGARERERKSHARIRERGRHgZIRERERHoYIBERERHpYYBEREREpIcBEhEREZEeBkhEREREev4Hy73hByHbkmMAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 640x480 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Create a figure and axis object\n",
"fig, ax = plt.subplots(2 , 1)\n",
"\n",
"# Plot the data\n",
"ax[0].plot(df_concat_btc['date'], df_concat_btc['close_btc'], 'blue')\n",
"# ax[0].plot(df_concat_btc['date'], df_concat_btc['vwap_btc'], 'green')\n",
"\n",
"# Customize the plot\n",
"ax[0].set_title('PAIR-BTC-USDT')\n",
"ax[0].set_xlabel('date')\n",
"ax[0].set_ylabel('close')\n",
"\n",
"ax[1].plot(df_concat_btc['date'], df_concat_btc['vwap_btc'], 'green')\n",
"# ax[1].plot(df_concat_btc['date'], df_concat_btc['volume_BTC'], 'red')\n",
"\n",
"# Show the plot\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 180,
"id": "3c6d80b3-4a46-432b-9b88-6a264f9b7a7e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"First part of the DataFrame:\n",
" date close_xrp volume_xrp vwap_xrp close_eth volume_eth \\\n",
"13356 7-23-25 0.4995 8673.755143 0.499557 0.368412 53.830657 \n",
"13357 7-23-26 0.4996 34403.036949 0.499605 0.368370 89.163024 \n",
"\n",
" vwap_eth close_ltc volume_ltc vwap_ltc close_btc volume_btc \\\n",
"13356 0.368548 0.8003 74.882298 0.800537 0.69375 1.598973 \n",
"13357 0.368411 0.8002 30.666566 0.800233 0.69381 1.612419 \n",
"\n",
" vwap_btc \n",
"13356 0.693999 \n",
"13357 0.693838 \n",
"\n",
"Second part of the DataFrame:\n",
" date close_xrp volume_xrp vwap_xrp close_eth volume_eth \\\n",
"13358 7-23-27 0.4995 8240.166990 0.499561 0.368369 108.118487 \n",
"13359 7-23-28 0.4995 21256.045405 0.499585 0.367813 229.373936 \n",
"\n",
" vwap_eth close_ltc volume_ltc vwap_ltc close_btc volume_btc \\\n",
"13358 0.368353 0.8002 43.931145 0.800134 0.693709 1.765308 \n",
"13359 0.368127 0.8002 22.408370 0.800188 0.693200 2.643365 \n",
"\n",
" vwap_btc \n",
"13358 0.693748 \n",
"13359 0.693508 \n"
]
}
],
"source": [
"split_index = round(sample.shape[0] * 0.8)\n",
"\n",
"# First part of the DataFrame\n",
"sample_test = sample.iloc[:split_index]\n",
"\n",
"# Second part of the DataFrame\n",
"sample_valid = sample.iloc[split_index:]\n",
"\n",
"print(\"\\nFirst part of the DataFrame:\")\n",
"print (sample_test.tail(2))\n",
"\n",
"print(\"\\nSecond part of the DataFrame:\")\n",
"print (sample_valid.head(2))"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "4edcdbdb-85fb-415e-a6c4-71cc383c4410",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 182,
"id": "71c8bf0d-7762-47ef-a8a1-6d57ee5c8bb7",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"sample_size: 13358\n"
]
}
],
"source": [
"print ('sample_size: ', sample_size)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "0802e693-29a6-4eda-a496-9504f3008c2e",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 211,
"id": "c3dee439-a3e8-4843-8f8b-33572b4170e9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"sample_size: 13358\n",
"[ 1108 13291]\n",
"[[5.18272282e-01 1.68025214e-04 3.77189791e-01 1.45151777e-04\n",
" 8.31595503e-01 3.95645238e-04 6.76253699e-01 2.15301382e-04]\n",
" [5.18303634e-01 1.68025214e-04 3.77154892e-01 1.45151777e-04\n",
" 8.32082769e-01 3.95645238e-04 6.76271128e-01 2.15301382e-04]\n",
" [5.18562378e-01 1.68025214e-04 3.77397110e-01 1.45151777e-04\n",
" 8.30954599e-01 3.95645238e-04 6.76918294e-01 2.15301382e-04]\n",
" [5.18341398e-01 1.68025214e-04 3.77160454e-01 1.45151777e-04\n",
" 8.31766697e-01 3.95645238e-04 6.76294450e-01 2.15301382e-04]\n",
" [5.18497467e-01 1.68025214e-04 3.77261769e-01 1.45151777e-04\n",
" 8.31990904e-01 3.95645238e-04 6.76269889e-01 2.15301382e-04]\n",
" [5.18698229e-01 1.68025214e-04 3.77392003e-01 1.45151777e-04\n",
" 8.31954856e-01 3.95645238e-04 6.76339962e-01 2.15301382e-04]\n",
" [5.18693630e-01 1.68025214e-04 3.77533283e-01 1.45151777e-04\n",
" 8.32184637e-01 3.95645238e-04 6.76516962e-01 2.15301382e-04]\n",
" [5.18672691e-01 1.68025214e-04 3.77517862e-01 1.45151777e-04\n",
" 8.32276407e-01 3.95645238e-04 6.76558233e-01 2.15301382e-04]\n",
" [4.99269291e-01 5.45867382e-04 3.68653612e-01 1.43205019e-04\n",
" 7.99339573e-01 3.86775482e-04 6.92654223e-01 3.72953569e-04]\n",
" [4.99424699e-01 5.45867382e-04 3.68590151e-01 1.43205019e-04\n",
" 7.99839862e-01 3.86775482e-04 6.92737055e-01 3.72953569e-04]\n",
" [4.99437041e-01 5.45867382e-04 3.68505112e-01 1.43205019e-04\n",
" 7.99388893e-01 3.86775482e-04 6.92646980e-01 3.72953569e-04]\n",
" [4.99561765e-01 5.45867382e-04 3.68547552e-01 1.43205019e-04\n",
" 7.99601900e-01 3.86775482e-04 6.92723486e-01 3.72953569e-04]\n",
" [4.99664819e-01 5.45867382e-04 3.68704191e-01 1.43205019e-04\n",
" 7.99877210e-01 3.86775482e-04 6.92928189e-01 3.72953569e-04]\n",
" [4.99833312e-01 5.45867382e-04 3.68823620e-01 1.43205019e-04\n",
" 7.99375187e-01 3.86775482e-04 6.93065604e-01 3.72953569e-04]\n",
" [4.99855255e-01 5.45867382e-04 3.68840191e-01 1.43205019e-04\n",
" 7.99747347e-01 3.86775482e-04 6.93183729e-01 3.72953569e-04]\n",
" [4.98030589e-01 5.45867382e-04 3.68931667e-01 1.43205019e-04\n",
" 7.98594073e-01 3.86775482e-04 6.91868385e-01 3.72953569e-04]]\n",
"XXXX ====== Actual Input ====== XXXX\n",
"(2, 8, 8)\n",
"[[0.51863729 0.37762073 0.83232141 0.6765906 ]\n",
" [0.49999486 0.36888691 0.79994226 0.69325938]]\n",
"(2, 1, 1)\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/tmp/ipykernel_28/500398063.py:15: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" sample_test['Selected'] = 0\n"
]
}
],
"source": [
"# 05.17.2024\n",
"# ============================\n",
"sample_size = sample_test.shape[0]\n",
"print ('sample_size: ', sample_size)\n",
"\n",
"sl = 8 # <--- sequence length\n",
"batch = 2 # <--- batch size\n",
"n_features = 8 # <---- no. of variables\n",
"n_out = 1 # <----- no. of predicted variables\n",
"frwd = 1 # <--- how many to predict\n",
"\n",
"\n",
"# Trimming Indices !!!\n",
"# Marking selected rows\n",
"sample_test['Selected'] = 0\n",
"\n",
"# Selecting m random rows without replacement\n",
"np.random.seed(125)\n",
"selected_indices = np.random.choice(sample_test.index, size = batch, replace = False)\n",
"\n",
"sample_test.loc[selected_indices, 'Selected'] = 1 # print (sample_test[sample_test['Selected'] == 1])\n",
"chosen_idx1 = sample_test[sample_test['Selected'] == 1].index\n",
"chosen_idx2 = chosen_idx1[chosen_idx1 > sl]\n",
"\n",
"thrown_idx1 = chosen_idx1[chosen_idx1 <= sl]\n",
"cnt_thrown_idx1 = len(thrown_idx1)\n",
"\n",
"chosen_idx3 = chosen_idx2[chosen_idx2 < (sample_size - frwd)]\n",
"\n",
"thrown_idx2 = chosen_idx2[chosen_idx2 >= (sample_size - frwd)]\n",
"cnt_thrown_idx2 = len(thrown_idx2)\n",
"\n",
"cnt_thrown_idx = cnt_thrown_idx1 + cnt_thrown_idx2\n",
"\n",
"print (selected_indices)\n",
"\n",
"all_ts_xrp = np.empty((1, )) # final input/output\n",
"all_ts_eth = np.empty((1, )) # final input/output\n",
"all_ts_ltc = np.empty((1, )) # final input/output\n",
"all_ts_btc = np.empty((1, )) # final input/output\n",
"\n",
"stdev_xrp = np.empty((1, )) # final input/output\n",
"stdev_eth = np.empty((1, )) # final input/output\n",
"stdev_ltc = np.empty((1, )) # final input/output\n",
"stdev_btc = np.empty((1, )) # final input/output\n",
"\n",
"aft_ts_xrp = np.empty((1))\n",
"aft_ts_eth = np.empty((1))\n",
"aft_ts_ltc = np.empty((1))\n",
"aft_ts_btc = np.empty((1))\n",
"\n",
"for idx in chosen_idx3:\n",
" selected_rows_before = sample_test.iloc[max(0, idx-sl): idx]\n",
" selected_rows_after = sample_test.iloc[max(0, idx): idx+frwd]\n",
"\n",
" # print ('====================')\n",
" sr_before_vwap_xrp = np.array(selected_rows_before['vwap_xrp'])\n",
" sr_after_vwap_xrp = np.array(selected_rows_after['vwap_xrp']) \n",
" # print (sr_before_vwap_xrp)\n",
"\n",
"# Compute standard deviation\n",
" std_dev_xrp = np.std(sr_before_vwap_xrp)\n",
" std_dev_xrp_arr = np.repeat(std_dev_xrp, sl)\n",
" # print(std_dev_xrp_arr)\n",
"\n",
" sr_before_vwap_eth = np.array(selected_rows_before['vwap_eth'])\n",
" sr_after_vwap_eth = np.array(selected_rows_after['vwap_eth'])\n",
"\n",
"# Compute standard deviation\n",
" std_dev_eth = np.std(sr_before_vwap_eth)\n",
" std_dev_eth_arr = np.repeat(std_dev_eth, sl)\n",
" # print(std_dev_eth_arr)\n",
" \n",
"\n",
" sr_before_vwap_ltc = np.array(selected_rows_before['vwap_ltc'])\n",
" sr_after_vwap_ltc = np.array(selected_rows_after['vwap_ltc'])\n",
"\n",
"# Compute standard deviation\n",
" std_dev_ltc = np.std(sr_before_vwap_ltc)\n",
" std_dev_ltc_arr = np.repeat(std_dev_ltc, sl)\n",
" # print(std_dev_ltc_arr)\n",
" \n",
" sr_before_vwap_btc = np.array(selected_rows_before['vwap_btc'])\n",
" sr_after_vwap_btc = np.array(selected_rows_after['vwap_btc'])\n",
"\n",
"# Compute standard deviation\n",
" std_dev_btc = np.std(sr_before_vwap_btc)\n",
" std_dev_btc_arr = np.repeat(std_dev_btc, sl)\n",
" # print(std_dev_btc_arr)\n",
" \n",
" all_ts_xrp = np.concatenate((all_ts_xrp, sr_before_vwap_xrp))\n",
" stdev_xrp = np.concatenate((stdev_xrp, std_dev_xrp_arr))\n",
" \n",
" all_ts_eth = np.concatenate((all_ts_eth, sr_before_vwap_eth))\n",
" stdev_eth = np.concatenate((stdev_eth, std_dev_eth_arr))\n",
"\n",
" all_ts_ltc = np.concatenate((all_ts_ltc, sr_before_vwap_ltc))\n",
" stdev_ltc = np.concatenate((stdev_ltc, std_dev_ltc_arr))\n",
"\n",
" all_ts_btc = np.concatenate((all_ts_btc, sr_before_vwap_btc))\n",
" stdev_btc = np.concatenate((stdev_btc, std_dev_btc_arr))\n",
"\n",
" aft_ts_xrp = np.concatenate((aft_ts_xrp, sr_after_vwap_xrp))\n",
" aft_ts_eth = np.concatenate((aft_ts_eth, sr_after_vwap_eth))\n",
" aft_ts_ltc = np.concatenate((aft_ts_ltc, sr_after_vwap_ltc))\n",
" aft_ts_btc = np.concatenate((aft_ts_btc, sr_after_vwap_btc))\n",
"\n",
"X_XRP = all_ts_xrp[1:]\n",
"X_XRP_stdev = stdev_xrp[1:]\n",
"\n",
"X_ETH = all_ts_eth[1:]\n",
"X_ETH_stdev = stdev_eth[1:]\n",
"\n",
"X_LTC = all_ts_ltc[1:]\n",
"X_LTC_stdev = stdev_ltc[1:]\n",
"\n",
"X_BTC = all_ts_btc[1:]\n",
"X_BTC_stdev = stdev_btc[1:]\n",
"\n",
"X0 = np.column_stack((X_XRP, X_XRP_stdev, X_ETH, X_ETH_stdev, X_LTC, X_LTC_stdev, X_BTC, X_BTC_stdev))\n",
"print (X0)\n",
"\n",
"# ======== Model Input =========\n",
"X = X0.reshape(batch-cnt_thrown_idx, sl, n_features)\n",
"print ('XXXX ====== Actual Input ====== XXXX')\n",
"print (X.shape)\n",
"\n",
"y_XRP = aft_ts_xrp[1:]\n",
"y_ETH = aft_ts_eth[1:]\n",
"y_LTC = aft_ts_ltc[1:]\n",
"y_BTC = aft_ts_btc[1:]\n",
"\n",
"y = np.column_stack((y_XRP, y_ETH, y_LTC, y_BTC))\n",
"print (y)\n",
"\n",
"y = y_BTC.reshape(batch-cnt_thrown_idx, frwd, n_out)\n",
"# print ('YYYY ====== Actual Input ====== YYYY')\n",
"print (y.shape)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "88e292cc-1244-462a-b311-3e964773c742",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"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.11.0rc1"
}
},
"nbformat": 4,
"nbformat_minor": 5
}