{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# K-mean clustering" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Imports:" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "# import pytz\n", "# import matplotlib.ticker as mpticker\n", "from sklearn.cluster import KMeans\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import mplfinance as mpf\n", "from mplfinance.original_flavor import candlestick_ohlc\n", "import finnhub\n", "import matplotlib.dates as mpl_dates\n", "import numpy as np\n", "from datetime import * " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Access stock data" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [], "source": [ "# Setup client\n", "finnhub_client = finnhub.Client(api_key = \"bt3efpf48v6tfcs816eg\")\n", "\n", "# Stock candles\n", "ticker = 'SPY'\n", "start_time = int(datetime(2021, 5, 21, 0, 0).replace(tzinfo = timezone.utc).timestamp())\n", "end_time = int(datetime(2021, 6, 22, 0, 0).replace(tzinfo = timezone.utc).timestamp())\n", "res = finnhub_client.stock_candles(ticker, 'D', start_time, end_time)\n", "\n", "stock = pd.DataFrame(res)\n", "stock = stock.rename(columns = {'t':'Date', 'o':'Open', 'h':'High', 'l':'Low', 'c':'Close', 's':'status', 'v':'volumn'})\n", "stock['Date'] = pd.to_datetime(stock['Date'], unit = 's')\n", "stock = stock.set_index('Date')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Define functions" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CloseHighLowOpenstatusvolumn
Date
2021-05-21414.94418.2000414.4500416.87ok76578662
2021-05-24419.17420.3200417.0800417.34ok51376702
2021-05-25418.24420.7100417.6200420.33ok57451396
2021-05-26419.07419.6100417.7600418.87ok43088618
2021-05-27419.29420.7200418.9851420.17ok56707677
2021-05-28420.04421.2500419.7900420.97ok58520164
2021-06-01419.67422.7200419.2000422.57ok54216625
2021-06-02420.33421.2300419.2900420.37ok49097061
2021-06-03418.77419.9900416.2800417.85ok58138763
2021-06-04422.60422.9200418.8422420.75ok55938789
2021-06-07422.19422.7800421.1900422.59ok51555032
2021-06-08422.28423.2100420.3200423.11ok47134279
2021-06-09421.65423.2600421.4100423.18ok48436342
2021-06-10423.61424.6300421.5500422.96ok51020147
2021-06-11424.31424.4300422.8200424.20ok45570828
2021-06-14425.26425.3700423.1000424.43ok42358478
2021-06-15424.48425.4600423.5400425.42ok51508508
2021-06-16422.11424.8700419.9200424.63ok80386082
2021-06-17421.97423.0200419.3200421.67ok90949659
2021-06-18414.92417.8281414.7000417.09ok118676302
2021-06-21420.86421.0600415.9300416.80ok72822028
2021-06-22423.11424.0000420.0800420.85ok57700303
\n", "
" ], "text/plain": [ " Close High Low Open status volumn\n", "Date \n", "2021-05-21 414.94 418.2000 414.4500 416.87 ok 76578662\n", "2021-05-24 419.17 420.3200 417.0800 417.34 ok 51376702\n", "2021-05-25 418.24 420.7100 417.6200 420.33 ok 57451396\n", "2021-05-26 419.07 419.6100 417.7600 418.87 ok 43088618\n", "2021-05-27 419.29 420.7200 418.9851 420.17 ok 56707677\n", "2021-05-28 420.04 421.2500 419.7900 420.97 ok 58520164\n", "2021-06-01 419.67 422.7200 419.2000 422.57 ok 54216625\n", "2021-06-02 420.33 421.2300 419.2900 420.37 ok 49097061\n", "2021-06-03 418.77 419.9900 416.2800 417.85 ok 58138763\n", "2021-06-04 422.60 422.9200 418.8422 420.75 ok 55938789\n", "2021-06-07 422.19 422.7800 421.1900 422.59 ok 51555032\n", "2021-06-08 422.28 423.2100 420.3200 423.11 ok 47134279\n", "2021-06-09 421.65 423.2600 421.4100 423.18 ok 48436342\n", "2021-06-10 423.61 424.6300 421.5500 422.96 ok 51020147\n", "2021-06-11 424.31 424.4300 422.8200 424.20 ok 45570828\n", "2021-06-14 425.26 425.3700 423.1000 424.43 ok 42358478\n", "2021-06-15 424.48 425.4600 423.5400 425.42 ok 51508508\n", "2021-06-16 422.11 424.8700 419.9200 424.63 ok 80386082\n", "2021-06-17 421.97 423.0200 419.3200 421.67 ok 90949659\n", "2021-06-18 414.92 417.8281 414.7000 417.09 ok 118676302\n", "2021-06-21 420.86 421.0600 415.9300 416.80 ok 72822028\n", "2021-06-22 423.11 424.0000 420.0800 420.85 ok 57700303" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stock" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [], "source": [ "def get_optimum_clusters(df, saturation_point = 0.05):\n", " '''\n", " :param df: dataframe\n", " :param saturation_point: The amount of difference we are willing to detect\n", " :return: clusters with optimum K centers\n", " This method uses elbow method to find the optimum number of K clusters\n", " We initialize different K-means with 1..10 centers and compare the inertias\n", " If the difference is no more than saturation_point, we choose that as K and move on\n", " '''\n", "\n", " wcss = []\n", " k_models = []\n", " labels = []\n", "\n", " size = min(7, df.shape[0])\n", " for i in range(1, size):\n", " # kmeans = KMeans(n_clusters = i, init='k-means++', max_iter=300, n_init=10, random_state=0)\n", " kmeans = KMeans(n_clusters = i, init='random', max_iter=300, n_init=7)\n", " kmeans.fit(df)\n", " wcss.append(kmeans.inertia_) # Sum of squared distances of samples to their Closest cluster center\n", " k_models.append(kmeans)\n", " labels.append(kmeans.labels_)\n", "\n", " # Compare differences in inertias until it's no more than saturation_point\n", " optimum_k = len(wcss)-1\n", " for i in range(0, len(wcss)-1):\n", " diff = abs(wcss[i+1] - wcss[i])\n", " if diff < saturation_point:\n", " optimum_k = i\n", " break\n", "\n", " # print(\"Optimum K is \" + str(optimum_k + 1))\n", " optimum_clusters = k_models[optimum_k]\n", " labels = labels[optimum_k]\n", "\n", " return (optimum_clusters.cluster_centers_, labels)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Find R&S and Plot" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\jizha\\Anaconda3\\lib\\site-packages\\sklearn\\cluster\\_kmeans.py:881: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n", " warnings.warn(\n", "C:\\Users\\jizha\\Anaconda3\\lib\\site-packages\\sklearn\\cluster\\_kmeans.py:881: UserWarning: KMeans is known to have a memory leak on Windows with MKL, when there are less chunks than available threads. You can avoid it by setting the environment variable OMP_NUM_THREADS=1.\n", " warnings.warn(\n" ] } ], "source": [ "Lows = pd.DataFrame(data = stock, index = stock.index, columns = ['Low'])\n", "Highs = pd.DataFrame(data = stock, index = stock.index, columns = ['High'])\n", "Low_centers, low_labels = get_optimum_clusters(Lows)\n", "High_centers, high_labels = get_optimum_clusters(Highs)\n", "Low_centers = Low_centers.flatten()\n", "High_centers = High_centers.flatten()\n", "Lows['labels'] = pd.Series(low_labels, index = Lows.index)\n", "Highs['labels'] = pd.Series(high_labels, index = Highs.index)\n", "res = [max(Highs.loc[Highs.labels == i, 'High']) for i in np.unique(high_labels)]\n", "sup = [min(Lows.loc[Lows.labels == i, 'Low']) for i in np.unique(low_labels)]" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [], "source": [ "#stock['lose']" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "image/png": "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r7oAAAAAULdi6m5nZuPlPefg8hjytpTX3W5RoB916bMefivv+RXvyXvy9mIzG+ic+0+UcibIG3ZViYmJA3v37h1LVQEAAACgSqtXr853znWOtqzKIMl/6vJUSac75/ZWkTdB0lPynqMQfHp0aYvVbOfcn/2/3/OHKv6VpF9HluWcmyOv9Uqpqalu1apVkVkAAAAAoEbM7H8VLYulJelUSZ0kbTAre9B0C0lnmNmvJCU65/b4AdKzkvrJe8ja14EytvmvkU8m3yjvQXcAAAAA0CDEEiTNl/cU86C58p4uPVXSXjM7WNJz8karG+Kcy4vInyPvadW9ItKPlbS+elUGAAAAgLpT5cANzrkC59yG4CSpWNI3/t8tJP1N0imSxkhyZtbFn9r4ZTh5Q3//n5ldbGY9zGySv87sOto3AADqzNSpU2VmuvZab6DXkpIS3Xbbberfv78SExPVtWtXXXrppdq6dWvU9Z1zOvvss2Vmev7556vc3vbt2/V///d/+t73vqdWrVqpR48e+utf/1q2/LHHHlP//v3Vrl07tWvXTqeeeqr+8Y9/1M7OAkAzU63nJFUgRdKF/t+rI5aNk5QlSc65PwQGdegob4jwc6IN2gAAQEO2YsUKZWZmqn///mVpO3fu1Jo1azR58mQNGDBAhYWFuummm3T22Wdr3bp1SkgI/5f7u9/9Ti1atIhpeyUlJRoxYoTat2+vv/71r0pJSVFubq5atWpVliclJUX333+/evbsqf379+uJJ57QRRddpNWrV4fVEwBQtRoFSc65IYG/cyRZhZnD13tAPL0ZANCIFRYWauzYsXr88cd11113laUnJSVpyZIlYXlnz56tPn36aOPGjerXr19Z+qpVqzR9+nStXr1ahx9+eJXbnDt3rr788ku9+eabatmypSSpe/fuYXkuvPDCsPl7771XM2fO1PLlywmSAKCaqvOcJAAAmr0JEyZo5MiROvPMM6vMu337dklS+/bty9J27NihMWPGaPbs2TrssMNi2ub8+fP1wx/+UNddd526dOmi448/XhkZGSopKYmaf9++fXruuedUVFSkwYMHx7QNAMB3aqO7HQAAzUJmZqY2b96sefPmVZl37969uummm5SWlqaUlJSy9F/96lc6++yzde6558a83U8++UTLli3TpZdeqn/84x/KycnRNddco6KiIj300ENl+davX69TTz1Vu3fvVtu2bfXSSy+FtWABAGJDkAQAQAw2bdqkSZMm6a233irr8laRUCikyy67TAUFBVq4cGFZ+rx58/Sf//xH1X323/79+3XYYYcpMzNTLVq00MCBA/X111/rhhtu0IMPPqjSR3T06tVLa9euVUFBgV544QX9/Oc/V3Z2tvr27Vv9HQaAZozudgAAxGD58uXKz89X3759lZCQoISEBL3xxhuaMWOGEhIStGfPHklegDRmzBitW7dOS5cuVceOHcvKWLp0qT744AO1bdu2rAxJGjVqlE477bQKt921a1cde+yxYQM9HHfccdq5c6fy8/PL0lq2bKkePXooNTVV06ZN04ABA/T73/++tg8FADR5tCQBABCDiy66SKmpqWFp48aNU8+ePTVp0iS1bNlSJSUlGj16tDZs2KDs7Gx16dIlLP+9996rm2++OSytX79+euihh8oNvBD0wx/+UM8884z279+vgw7yft/86KOPdMghh6hTp04Vrrd///6y4A0AEDuCJAAAYpCcnKzk5OSwtMTERHXo0EF9+/ZVKBTSxRdfrJUrV2rRokUyM+Xlec9WT0pKUps2bXTEEUfoiCOOKFd2t27ddMwxx5TNDxs2TIMGDdK0adMkSb/+9a/16KOPauLEibr22muVk5OjO++8U1dffXVZV7vf/OY3Ou+889StWzft2LFDzzzzjLKzs3lWEgDUAEESAAC1IDc3VwsWLJAkDRw4MGzZ3LlzlZ6eHnNZW7ZsUbdu3crmu3Xrpn/+85+68cYbNWDAAHXp0kW/+MUvNGXKlLI8eXl5uuyyy5SXl6ekpCT1799fr7zyis4666wD2zEAaIbMORfvOlQpNTXVVfcmVwAAAACoiJmtds6lRlvGwA0AAAAAEECQBAAAAAABBEkAAAAAEECQBAAAAAABjG4HAACatiFD4l0DNDTZ2fGuARo4WpIAAACaA/+5XQCqRksSAABo2ppjq8HAgVJubnhaUZH07bfl86akSKtX10+9gEaCIAkAAKCpyc2VkpPD00Kh8mmleQGEobsdAABAA5K1NiveVQCaPYIkAACABiSnICfeVQCaPYIkAAAAAAggSAIAAACAAAZuAAAAiIOBcwYqt7D8oAlFe4s0c+XMsLSUpBStnsAIdEB9IUgCAACIg9zCXCW3SS6XHnKhcunRgikAdYfudgAAAAAQQJAEAAAAAAEESQAAAAAQQJAEAAAAAAEESQAAAAAQQJAEAAAAAAEESQAAAAAQQJAEAAAAAAEESQAAAAAQQJAEAAAAAAEESQAAAAAQQJAEAAAAAAEESQAAAAAQQJAEAACAmsvKincNgFpHkAQAAICay8mJdw2AWkeQBAAAAAABBEkAAAAAEECQBAAAAAABBEkAAAAAEECQBAAAAAABBEkAAAAAEJAQ7woAANAoDBkS7xqgocnOjncNANQRgiQAABCzrC55Ss/rEu9qIF4GDpRyc8PTioqkmTPL501JkVavrp96AbWMIAkAgFjQaiBJysnOkIZkxLsaiJfcXCk5OTwtFCqfVpoXaKS4JwkAAAAAAgiSAAAAACCAIAkA0KRNnTpVZqZrr71WklRSUqLbbrtN/fv3V2Jiorp27apLL71UW7duDVtv/Pjx+v73v682bdqoc+fOuvDCC7Vx48ZKt5WZmanTTz9dHTp0UHJysoYOHaq33367XL5t27bp5z//uTp37qzWrVvr+OOP1xtvvFF7Ow0AOCAESQCAJmvFihXKzMxU//79y9J27typNWvWaPLkyVqzZo0WLFigTz/9VGeffbZCoVBZvtTUVGVlZWnjxo1avHixnHMaPny4SkpKKtxedna2Ro0apaVLl+rdd99Vr169dNZZZ+njjz8uy1NQUKAf/vCHcs7pH//4hzZu3KhHHnlEhx12WN0cBDRPKSlSQUH4tHt3+bSCAi8vgDAM3AAAaJIKCws1duxYPf7447rrrrvK0pOSkrRkyZKwvLNnz1afPn20ceNG9evXT5L0y1/+smx59+7ddc899+iEE07QJ598ol69ekXd5tNPPx02P3PmTM2fP1+vvvqqevbsKUl64IEH1LVrVz355JNl+Y4++ugD21kgUrRR5TIyvAlAlWhJAgA0SRMmTNDIkSN15plnVpl3+/btkqT27dtHXV5cXKy5c+fqyCOPVPfu3WOuw969e7V79+6wcufPn6+TTz5Zo0aN0mGHHaYBAwbo0UcflXMu5nKboqy1WfGuQr1LSUpRwa6CctPukt3l0lKSaO0B6hMtSQCAJiczM1ObN2/WvHnzqsy7d+9e3XTTTUpLS1NKRLejGTNm6NZbb1VxcbF69eqlpUuXqlWrVjHXY8qUKWrbtq0uuOCCsrRPPvlEM2bM0A033KDf/OY3Wrt2ra677jpJKrtvqjnKKciJdxXq3eoJ0Z8hlJGdoQyGWQfiiiAJANCkbNq0SZMmTdJbb72lli1bVpo3FArpsssuU0FBgRYuXFhu+dixY/XjH/9Y27Zt00MPPaSLL75Y//rXv3TIIYdUWY/p06dr9uzZeu2119SuXbuy9P379ys1NVXTpk2TJJ144on6+OOP9dhjjzXrIAkAGhK62wEAmpTly5crPz9fffv2VUJCghISEvTGG29oxowZSkhI0J49eyR5AdKYMWO0bt06LV26VB07dixXVlJSknr27KkzzjhDzz//vD766CO98MILVdZh+vTpmjJlil5++WUNGjQobFnXrl11/PHHh6Udd9xx5UbXAwDEDy1JAIAm5aKLLlJqampY2rhx49SzZ09NmjRJLVu2VElJiUaPHq0NGzYoOztbXbp0qbJc55ycc2VBVkUefvhh3XHHHXr55Zd12mmnlVv+wx/+UJs2bQpL++ijj3TUUUfFsHdNw8A5A5VbmBuWVrS3SDNXziyXNyUppcJuaQBQVwiSAABNSnJyspKTk8PSEhMT1aFDB/Xt21ehUEgXX3yxVq5cqUWLFsnMlJeXJ8lrOWrTpo02b96sF154QcOHD1fnzp2Vm5ur++67T61atdL5559fVu6wYcM0aNCgsq5zDz74oCZPnqynnnpKxx57bFm5bdq0UVJSkiTphhtu0ODBg3Xvvfdq1KhReu+99/THP/5RU6dOrYej0zDkFuYquU1yWFrIhcqlleYFgPpGdzsAQLOSm5urBQsW6PPPP9fAgQPVtWvXsukvf/mLJKlVq1bKzs7WOeecox49emjUqFE69NBDtXz58rBWpy1btmjbtm1l84899phKSko0atSosHInTpxYluekk07S/Pnz9de//lV9+/bV5MmTdffdd+vqq6+uv4MAAKgULUkAgCYvOzu77O/u3btXOdx2t27d9Morr1RZbk5OTqXzFTnvvPN03nnnxZQXAFD/aEkCAAAAgABakgAAQL1KSUopd69R6QNUo+UFgPpGkAQAAOpVtNHqeIAqgIaE7nYAAAAAEFDtIMnMJpmZM7NH/fmDzex+M1tnZsVmts3MnjGzIytY38zsVb+MkQe6AwAAAABQm6oVJJnZKZLGS1oXSD5E0g8k3eu/Xiipm6RXzSxad76bJO2rUW0BAAAAoI7FfE+SmSVJelrSlZLuKE13zhVK+nFE3l9Kel/ScZLWB9JTJU2UNFDSFwdScQAAAACoC9VpSZoj6Xnn3LIY8rbzX78tTTCzQyU9K+mXzrkvq7FdAAAAAKg3MQVJZjZeUg9Jt8eQt6Wk30la5JwLju85S9KrzrmXY9zmBDNbZWarvvrqq1hWAQAAABBnWWuz4l2FA1Zldzsz6yVpqqTTnXN7q8ibIOkpScmSLgikXy7pBEmpsVbMOTdHXuuVUlNTK380OgAAAIAGIacgJ95VOGCxtCSdKqmTpA1mFjKzkKQfSbran28llQVIz0rqL2mYc+7rQBnDJB0vqShQhiT9xczerq2dAQAAAIADFcvADfMlrYpImyvpY3ktTHvN7GBJz0nqK2mIcy4vIv9kSQ9FpK2XdLOkBdWsMwAAAADUmSqDJOdcgaSCYJqZFUv6xjm3wW9B+pukkySlSXJm1sXPWuic2+Wc+0zSZxFlSNKnzrlPDnQnAAAAAKC2VPthslGkyHs20vckrZa0LTCNqoXyAQAAAKDexPycpCDn3JDA3zmSrAZlVHsdAAAAAKhrtdGSBAAAAABNBkESAAAAAAQQJAEAAABAAEESAAAAAAQQJAEAAABAAEESAAAAAAQQJAEAAABAQI2ekwQAAJq+gXMGKrcwNyytaG+RZq6cWS5vSlKKVk9YXV9VA4A6RZAEAACiyi3MVXKb5LC0kAuVSyvNCwBNBd3tAAAAACCAIAkAAKA56N493jUAGg2CJAAAgOYgPT3eNQAaDYIkAAAAAAggSAIAAACAAIIkAAAAAAggSAIAAACAAIIkAAAAAAggSAIAAACAAIIkAAAAAAhIiHcFAACoNUOGxLsGTcqLn36rhIN2hKVl9i/R+HW7yuUN7Q9J/xhS8411z5Eysmu+fmWy66hcAE0WLUkAADRFeXnxrgEANFq0JAEAmg5aDL6TkeFNB+CnDx6u5DbJYWn5O/P11tBO5fIW7CrQF7dk13xj2RnSkIyarw8AtYiWJAAA4ikrK941AABEoCUJAIB4ysk5sPUHDpRyc8unFxVJM2eGp6WkSKtXH9j2AKAZIEgCAKAxy82VkpPLp4dC5dOjBVMAgHLobgcAAAAAAbQkAQBQH+gWhxh1T+4e7yoAMRs4Z6ByC8M/24r2Fmnmypnl8qYkpWj1hMbx2UaQBABAfaBbHGKUPiA93lUAYpZbmFtuFMyQC5VLK83bWNDdDgAAAAACCJIAAADQ4GStzYp3FdCMESQBAACgwckpyIl3FdCMcU8SAACIKiUppdw9BLtLdqtgV0HUvADQVBAkAQCAqKKNQpWRnaGMIRn1XxkAqEd0twMAVIh7AgAAzRFBEgCgQtwTAABojgiSAAAAACCAe5IAAIijrGO2K+ukXeGJoZCUNSS2Ai78VkrYUS45fWXJgZVbgZyCHGXnZB9QGfVZbmOUnZ4d7yoAzR4tSQAAIO5aJ7SOdxUAoAwtSQAAxCIrS0pPr/Vi0z9pp/TtncITCwqkOdmxFXDb4VJycvn0/PwDK7cCjG4HoDmgJQkAgFjk5MS7BgCAekKQBACRsrLiXQMAABBHBEkAEIkWAwAAmjWCJAAAAAAIIEgCAAAAgACCJAAAAAAIYAhwAIAGzhmo3MLcculFe4s0c+XMcukpSSlaPWF1fVSt/g0cKOWWPxYqKpJmRhyLlBRpdRM9DgDQjBEkAWjeon0hjvZlWGrSX4hzC3OV3Ca5XHrIhaKmRwuomozc3OjPHQqFyqdHC6YAAI0eQRKA5i3aF+JoX4ZL8wIAgCaPe5LQqE2dOlVmpmuvvVaSVFJSottuu039+/dXYmKiunbtqksvvVRbt24NW2/OnDkaOnSokpOTZWbKiWHI58zMTJ1++unq0KGDkpOTNXToUL399ttheTIyMmRmYVOXLl1qbX8BAABQ9wiS0GitWLFCmZmZ6t+/f1nazp07tWbNGk2ePFlr1qzRggUL9Omnn+rss89WKBQKyzdixAhlZGTEvL3s7GyNGjVKS5cu1bvvvqtevXrprLPO0scffxyWr1evXtq2bVvZtH79+gPeVwAAANQfutuhUSosLNTYsWP1+OOP66677ipLT0pK0pIlS8Lyzp49W3369NHGjRvVr18/SdL1118vSVq1alXM23z66afD5mfOnKn58+fr1VdfVc+ePcvSExISaD0CAABoxGhJQqM0YcIEjRw5UmeeeWaVebdv3y5Jat++fa3WYe/evdq9e3e5cj/55BMdccQROvroozV69Gh98skntbpdAAAA1C1aktDoZGZmavPmzZo3b16Veffu3aubbrpJaWlpSklJqdV6TJkyRW3bttUFF1xQlnbyyScrKytLvXv31pdffql77rlHgwcP1vvvv6+OHTvW6vYBAABQNwiS0Khs2rRJkyZN0ltvvaWWLVtWmjcUCumyyy5TQUGBFi5cWKv1mD59umbPnq3XXntN7dq1K0s/55xzwvKdcsopOuaYY/TEE0/oxhtvrNU6AAAAoG4QJKFRWb58ufLz89W3b9+ytH379unNN9/UrFmzVFxcrFatWikUCmnMmDFav369srOza7UVZ/r06ZoyZYpeeeUVDRo0qNK8bdu2VZ8+fcoN7gAAAICGiyAJjcpFF12k1NTUsLRx48apZ8+emjRpklq2bKmSkhKNHj1aGzZsUHZ2dq0OovDwww/rjjvu0Msvv6zTTjutyvy7d+/Whx9+qKFDh9ZaHQAAAFC3CJLQqCQnJys54iGfiYmJ6tChg/r27atQKKSLL75YK1eu1KJFi2RmysvLk+SNfNemTRtJUl5envLy8vTRRx9Jkj744AMVFBToyCOPVIcOHSRJw4YN06BBgzRt2jRJ0oMPPqjJkyfrqaee0rHHHltWbps2bZSUlCRJuvnmm5WWlqYjjzxSX375pe6++24VFxfr5z//eZ0fGwAAANQOgiQ0Kbm5uVqwYIEkaeDAgWHL5s6dq/T0dEnSrFmz9Nvf/rZs2XnnnVcuz5YtW9StW7eyPI899phKSko0atSosHJ//vOfKysrq2z7Y8aMUX5+vjp37qxTTjlFK1as0FFHHVWbuwmgMUpJkXJzy6fv3i0VFJTPCwCIG4IkNHrZ2dllf3fv3l3OuSrXycjIqPJBsjk5OZXOR/Pcc89VmQdAM7V6dfT0jAxvAgA0GDwnCQAAAAACaEkCACCIbnEA0OwRJAEAEES3OABo9uhuBwAAAAAB1Q6SzGySmTkze9SfP9jM7jezdWZWbGbbzOwZMzsysE4HM3vEzD40s11m9qmZzTSz2nvCJwAAAOpWSorX7TQ4lXZFjZzojopGrFrd7czsFEnjJa0LJB8i6QeS7pW0VlKSpN9JetXM+jvnQpK+J+kISbdK+sD/e4akZyWNOLBdAAAAQL2I1h2VrqhogmIOkswsSdLTkq6UdEdpunOuUNKPI/L+UtL7ko6TtN45t0HSTwNZNpvZLZL+bmbtnHPba74LAAAAAFB7qtPdbo6k551zy2LI285//baKPHsk7axGHQAAAACgTsXUkmRm4yX1kHR5DHlbyutut8g5F2UMVcnMkiXdLSnT744XLc8ESRMk6cgjj4yWBQAAAABqXZVBkpn1kjRV0unOub1V5E2Q9JSkZEkXVJAnUdIiSZ/Ju0cpKufcHHmtV0pNTXVV1RMAAACN08A5A5VbGP7betHeIs1cObNc3pSkFK2eUMFQ/UAtiaUl6VRJnSRtMLPStBaSzjCzX0lKdM7t8QOkZyX1kzTEOfd1ZEFm1lbSy/7s+c653Qe6AwAAAGjccgtzldwmOSwt5ELl0krzAnUtliBpvqRVEWlzJX0sr4Vpr5kdLOk5SX3lBUh5kYWY2aGSXpFkks52zhUdQL0BAAAAoE5UGSQ55wokFQTTzKxY0jfOuQ1+C9LfJJ0kKU2SM7MuftZC59wuP0D6p7zBGi6SlOh3u5NfTqXd+AAAAACgvlTrOUkVSJF0of93ZAfRcZKyJA2UdIqf9lFEnqGSsmuhHgAAAABwwGoUJDnnhgT+zpHXha6y/NlV5QEAAACAhqA6z0kCAAAAgCaPIAkAAAAAAgiSAAAAACCAIAkAAAAAAgiSAAAAACCgNoYABwAAAGosJSlFuYW5YWm7S3arYFdB1LxAXSNIAgCgMUtJkXJzy6fv3i0VFJTPCzRAqydEPmpTysjOUMaQjPqvDCCCJAAAGrfV5b9cSpIyMrwJAFBt3JNUh6ZOnSoz07XXXitJKikp0W233ab+/fsrMTFRXbt21aWXXqqtW7eGrbdnzx5dd9116tSpkxITE3XBBRcoN9qvhAF/+9vflJqaquTkZCUmJmrAgAF64oknwvJMmzZNJ510ktq1a6fOnTsrLS1NGzZsqN2dBgAAABo5gqQ6smLFCmVmZqp///5laTt37tSaNWs0efJkrVmzRgsWLNCnn36qs88+W6FQqCzf9ddfrxdeeEHPPvus3nrrLW3fvl3nn3++9u3bV+H2OnbsqClTpmjFihVat26dxo0bpyuvvFIvv/xyWZ7s7GxdffXVeuedd7Rs2TIlJCRo+PDh+uabb+rmIAAAmpzuyd3jXQUAqHN0t6sDhYWFGjt2rB5//HHdddddZelJSUlasmRJWN7Zs2erT58+2rhxo/r166fCwkI9/vjjmjt3rn784x9LkubNm6ejjjpKr732ms4666yo2zzzzDPD5idOnKgnnnhCb731ls4991xJ0uLFi8PyzJs3T0lJSfrXv/6ltLS0A95vAEDTlz4gPd5VAIA6R0tSHZgwYYJGjhxZLnCJZvv27ZKk9u3bS5JWr16tkpISjRgxoixPt27ddNxxx+mdd96JafvOOS1dulSbNm3SGWecUWG+HTt2aP/+/WXbBgAAAEBLUq3LzMzU5s2bNW/evCrz7t27VzfddJPS0tKU4o84lJeXpxYtWqhTp05heQ8//HDl5eVVWl5hYaGOOOII7dmzRy1atNBjjz2mc845p8L8EydO1IABA3TqqafGsGcAAABA80CQVIs2bdqkSZMm6a233lLLli0rzRsKhXTZZZepoKBACxcurLJs55zMrNI8hx56qNauXauioiItXbpUN954o7p3765hw4aVy3vjjTfq7bff1ttvv60WLVpUuX0AAACguSBIqkXLly9Xfn6++vbtW5a2b98+vfnmm5o1a5aKi4vVqlUrhUIhjRkzRuvXr1d2drY6duxYlr9Lly7at2+f8vPz1blz57L0L7/8stKuc5J00EEHqUePHpKkAQMGaOPGjZo6dWq5IOmGG27Qc889p9dff13HHHNMbew6AAAA0GRwT1Ituuiii7R+/XqtXbu2bEpNTdXo0aO1du1atWzZUiUlJRo1apTWrVun119/XV26dAkrY+DAgTr44IPDBnjIzc3Vxo0bNXjw4GrVZ//+/dqzZ09Y2sSJE/XMM89o2bJl6t27d813FgDQsHXvHu8aAECjRUtSLUpOTlZycnJYWmJiojp06KC+ffsqFArp4osv1sqVK7Vo0SKZWdl9RklJSWrTpo2SkpJ05ZVX6pZbbtFhhx2mjh076sYbb1T//v01fPjwsnKHDRumQYMGadq0aZKke++9VyeffLKOOeYY7dmzRy+//LLmzZunRx55pGyda665RvPmzdP8+fPVvn37sm23bdtWbdu2reOjAwCoV+np8a4BADRaBEn1KDc3VwsWLJDktRgFzZ07V+n+P7Tf//73SkhI0KhRo7Rr1y4NGzZMTz75ZNi9Q1u2bFG3bt3K5ouKivTrX/9aubm5atOmjXr37q0nn3xSY8aMKcszY8YMSSrX/e7OO+9UBk9lBwAAACQRJNW57Ozssr+7d+8u51yV67Ru3VqPPPJIWCtQpJycnLD5adOmlbUqVSSWbQMAAADNHfckAQAAAEAALUloPIYMiXcN0NAEWmoBAABqCy1JQGNUxYOF0YBlZcW7BgAAoAq0JKHxoNXgOxkZ3oTGJ+J+woZu++7t2lWyq1x6aH9IQ7KG1H+F4ih9bY6ysrIbTbl1JTs9O95VAIA6R0sSAAAxyOvUOt5VAADUE1qSAAAVate6nTod0qlcesGugubXopAu/aYuys3JUHp6Rl2UDACoIVqSAAAAACCAIAkAAAAAAgiSAABoQKZOnSoz07XXXitJKikp0W233ab+/fsrMTFRXbt21aWXXqqtW7eWrfPNN9/ouuuuU+/evdWmTRt169ZNv/71r/X1119Xub3p06eXrZeSkqJrrrlGRUVFZcunTZumk046Se3atVPnzp2VlpamDRs21P6OA0ADQpAEAEADsWLFCmVmZqp///5laTt37tSaNWs0efJkrVmzRgsWLNCnn36qs88+W6FQSJL0+eef67PPPtMDDzyg9evX66mnntKbb76pMWPGVLq9Z555RrfeeqsmT56sjRs36sknn9TLL7+siRMnluXJzs7W1VdfrXfeeUfLli1TQkKChg8frm+++aZuDgKAepO1NiveVWiwGLgBAIAGoLCwUGPHjtXjjz+uu+66qyw9KSlJS5YsCcs7e/Zs9enTRxs3blS/fv3Ut29fvfjii2XLe/TooQcffFDnn3++tm/frnbt2kXd5jvvvKNTTjlFl19+uSSpe/fuuuKKK/TCCy+U5Vm8eHHYOvPmzVNSUpL+9a9/KS0t7YD3G0D85BTkxLsKDRYtSQAANAATJkzQyJEjdeaZZ1aZd/v27ZKk9u3bV5qnVatWOuSQQyrMc9ppp2nt2rVasWKFJGnr1q1auHChzj333ArX2bFjh/bv31/ptgGgsaMlCWjIBg6UcnPLpxcVSTNnhqelpEirV9dPvQDUqszMTG3evFnz5s2rMu/evXt10003KS0tTSkpKVHzFBQU6Pbbb9f48eOVkFDxv/rRo0fr66+/1hlnnCHnnEKhkC6//HLdf//9Fa4zceJEDRgwQKeeemrVOwYAjRRBEtCQ5eZKycnl00Oh8unRgikADd6m/HxNeuwxvfXWW2rZsmWleUOhkC677DIVFBRo4cKFUfMUFxcrLS1NRxxxhB544IFKy3vjjTd09913a8aMGTr55JO1efNmTZw4UXfeeWdYl79SN954o95++229/fbbatGiRew7CQCNDEESAABxtDw3V/n5+erbt29Z2r59+/Tmm29q1qxZKi4uVqtWrRQKhTRmzBitX79e2dnZ6tixY7myioqKyrrK/f3vf1fr1q0r3faUKVM0ZswYXXXVVZKkfv36qbi4WFdddZXuuOOOsFaoG264Qc8995xef/11HXPMMbWx6wDQYBEkAQAQRxf17q3Ue+4JSxs3bpx69uypSZMmqWXLliopKdHo0aO1YcMGZWdnq0uXLuXK2bFjh8455xw55/Tqq6+qbdu2VW57586d5VqEWrRoIedcWNrEiRP13HPPKTs7W717967BXgJA40KQBABAHCW3bq3kQCuSJCUmJqpDhw7q27evQqGQLr74Yq1cuVKLFi2SmSkvL0+SN/JdmzZttGPHDo0YMULbt2/X/PnzVVxcrOLiYklShw4dyrrxDRs2TIMGDdK0adMkSWlpaXr44YeVmppa1t3u9ttv1/nnn1/WinTNNddo3rx5mj9/vtq3b1+27bZt28YUiAFoGAbOGajcwvCu+UV7izRz5cxyeVOSUrR6Qmz3OackpZQrd3fJbhXsKoiat7EgSAIAoAHLzc3VggULJEkDBw4MWzZ37lylp6dr9erVZSPUHXvssWF5Xn/9dQ0ZMkSStGXLFnXr1q1s2ZQpU2Rmuv3225Wbm6tOnTopLS1N9957b1meGTNmSPICrKA777xTGRkZtbKPAOpebmGuktskh6WFXKhcWmneWEULpjKyM5QxJKOaNWxYCJIAAGhgsrOzy/7u3r17ue5vkYYMGVJlHknKyckJm09ISNCdd96pO++8s8J1YikXAJoanpMEAAAAAAG0JAEAovYpl5pGv3IAAKqLIAmoS1lZUnp6vGsBVKmiG3SbQr9yAACqi+52aDyysuJdg+qL6P8PAACAho8gCY0HAQcAAADqAUESAAAAAAQQJAEAAABAAEESAAAAAAQQJAEAAABAAEESAAAAAAQQJAEAAABAAEESAAAAAAQQJAEAAABAAEESAAAAAAQQJAEAAABAQEK8KwAATdLAgVJubvn0oiJp5szwtJQUafXq+qkXAACoEkFSbRkyJN41aPpycqTs7HjXonp4XzRfublScnL59FCofHq0YAoAAMQNQRJqXVaXPKXndTmwQlavlvbsCU/bt0/6/PPyeVu18n61BxqSlJTowc/u3VJBQfm8aL66d493DQAAEQiSaktja+GoQznZGdKQjAMr5PDDpe99LzwtP1/q1Kl83oKChnv8MzLiXQPES0Xd5zIyeF8gXHp6vGsAAIjAwA0AAAAAEECQBAAAAAABBEkAAAAAEMA9SUBtYLhnAACAJoMgCagNDPcMAADQZFS7u52ZTTIzZ2aP+vMHm9n9ZrbOzIrNbJuZPWNmR0as18rMHjGzfD/fQjNj3FsAAAAADUq1giQzO0XSeEnrAsmHSPqBpHv91wsldZP0qpkFW6r+IOlnksZIOl1SO0l/N7MWNa08AAAAANS2mLvbmVmSpKclXSnpjtJ051yhpB9H5P2lpPclHSdpvb/ulZLGOeeW+Hkul/Q/ScMlLT6w3QAAAADQEHRP7h7vKhyw6rQkzZH0vHNuWQx52/mv3/qvAyUdLOmfpRmcc59K2ihpcDXqADQvKSnew3Ijp927y6el0HsVAADEX/qA9HhX4YDF1JJkZuMl9ZB0eQx5W0r6naRFzrnSO9S7SNonKT8i+xf+MgDRVDQKXkaGNwEAAKDWVdmSZGa9JE2VNNY5t7eKvAmSnpKULGlcDNs3Sa6CsiaY2SozW/XVV1/FUBQANF9Za7PiXQUAAJqMWLrbnSqpk6QNZhYys5CkH0m62p9vJZUFSM9K6i9pmHPu60AZeZJa+OUEHSavNakc59wc51yqcy61c+fO1dopAGhucgpy4l0FAACajFiCpPmS+kkaEJhWSXrO/3uvmR0s6S/yAqShzrm8iDJWSypRYIAHf/jv4yS9U/PqAwAAAEDtqvKeJOdcgaSCYJqZFUv6xjm3wW9B+pukkySlSXJmVnqfUaFzbpdzrtDMHpf0oJl9KelrSQ/LG0r8tdraGQAAANSz7t3jXQOg1sU8BHglUuQ9G0nyWoyCxknK8v++QVJIXotTG0lLJV3hnNtXC3UAAABAPKSnx7sGQK2rUZDknBsS+DtH3gAMVa2zW9J1/gQAAAAADVJ1npMEAAAAAE1ebXS3A+pF1jHblXXSrvILQiEpa0i91yfMhd9KCTvKJaevLClf51qob/raHGVlZR9QGU1Bdnp2vKsAAACaIFqSgEYor1PreFcBAACgyaIlCY1G+iftlL498lFbkgoKpDnZ9V2dcLcdLiUnl0/Pzy9f59qob7r0mwMrAQAAABWgJQkAAAAAAgiSAAAAACCA7nYAmreUFCk3Nzxt926vW2S0vAAAoMkjSALQvK2OfAa2pIwMbwIAAM0S3e3Q7GWtzYp3FQAAANCAECSh2cspyIl3FQAAANCAECQBAAAAQABBEgAAAAAEECQBAAAAQABBEgAAAAAE1HqQZGaTzMyZ2aOBtJ+a2WIz+8pfNiTKel3MbJ6Z5ZlZsZn9x8zGVratzMxMnX766erQoYOSk5M1dOhQvf3227W9SwCAgKlTp8rMdO2110qSSkpKdNttt6l///5KTExU165ddemll2rr1q1h682ZM0dDhw5VcnKyzEw5OTlVbuv999/XyJEjdcwxx8jMlBFlaPYdO3bo+uuv11FHHaU2bdpo8ODBWrlyZW3sKgCgmarVIMnMTpE0XtK6iEWJkt6RdGMlqz8p6ThJF0rq58/PM7MzKlohOztbo0aN0tKlS/Xuu++qV69eOuuss/Txxx8f0H4AAKJbsWKFMjMz1b9//7K0nTt3as2aNZo8ebLWrFmjBQsW6NNPP9XZZ5+tUCgUlm/EiBFRA52K7Ny5U927d9c999yjo48+Omqeq666SosXL9YTTzyh9evXa8SIERo+fLg+++yzGu8nAKB5q7WHyZpZkqSnJV0p6Y7gMufcPD9Pp0qKGCzpOufcu/7878zs/yQNqmiFp59+Omx+5syZmj9/vl599VX17Nmz+jsBAKhQYWGhxo4dq8cff1x33XVXWXpSUpKWLFkSlnf27Nnq06ePNm7cqH79+kmSrr/+eknSqlWrYt7mSSedpJNOOkmS14IVadeuXXrhhRf0wgsvaMiQIZKkjIwMLVq0SDNnztQ999xTnV0EAEBS7bYkzZH0vHNuWQ3Xf1vSJWbW0cwOMrMLJXWW9FqsBezdu1e7d+9W+/bta1gFAEBFJkyYoJEjR+rMM8+sMu/27dslqc4/j0OhkPbt26fWrVuHpbdp04bu1wCAGquVIMnMxkvqIen2AyjmEklOUr6kPfJapcY459bGWsCUKVPUtm1bXXDBBQdQDQBApMzMTG3evFl33313lXn37t2rm266SWlpaUpJSanTeh166KE69dRTdc899+izzz7Tvn379NRTT2n58uXatm1bnW4bANB0HXCQZGa9JE2VNNY5t/cAirpHUidJwyWlSnpQ0pNmdkIsK0+fPl2zZ8/Wiy++qHbt2h1ANQAAQZs2bdKkSZP09NNPq2XLlpXmDYVCuuyyy1RQUKC5c+fWS/3mzZungw46SCkpKWrVqpX++Mc/asyYMWrRokW9bB9A3eie3D3eVUAzVhv3JJ0qL7jZYGalaS0knWFmv5KU6JzbU1kBZvZ9SddJGuCc+4+f/B8zO91Pr9T06dM1ZcoUvfLKKxo0qMJbmIC6k5Ii5eaWT9+9WyooKJ8XzVf37vGuQbUtX75c+fn56tu3b1navn379Oabb2rWrFkqLi5Wq1atFAqFNGbMGK1fv17Z2dnq2LFjvdTv+9//vt544w0VFxdr+/bt6tq1q0aNGlXhQA8AGof0AenxrgKasdoIkuZLirwLd66kj+W1MMXSunSI/7ovIn2fqmjtevjhh3XHHXfo5Zdf1mmnnRbDpoA6sHp19PSMDG8CSqWnx7sG1XbRRRcpNTU1LG3cuHHq2bOnJk2apJYtW6qkpESjR4/Whg0blJ2drS5dutR7PRMTE5WYmKhvv/1Wixcv1gMPPFDvdQAANA0HHCQ55wokFQTTzKxY0jfOuQ3+fAdJR0pK9rP0MLMCSXnOuTxJH0raLGmGmd0s6WtJF0n6sbwhwcdJ0rBhwzRo0CBNmzZNkvTggw9q8uTJeuqpp3TssccqLy9PknfDblJS0oHuGgBAUnJyspKTk8PSEhMT1aFDB/Xt21ehUEgXX3yxVq5cqUWLFsnMyj6Pk5KS1KZNG0lSXl6e8vLy9NFHH0mSPvjgAxUUFOjII49Uhw4dJJX/nN+7d68++OADSdLu3buVl5entWvXqm3bturRo4ckafHixdq/f7969+6tzZs365ZbblGvXr00bty4Oj82AICmqdYfJluBCyS9J+l1fz7Tn/+VJDnnSiSdK+krSYvkPWfpCknjnHOLSgvZsmVL2I24jz32mEpKSjRq1Ch17dq1bJo4cWJ97BOApqoRdomLp9zcXC1YsECff/65Bg4cGPZ5/Je//KUs36xZs3TiiSdq7FjvOeHnnXeeTjzxRC1cuLAsT+Tn/Oeff64TTzxRJ554orZs2aLZs2frxBNP1FVXXVWWp7CwUNdee6169+6tK664Qqeddpr++c9/6uCDD66HvQcANEW19pykIOfckIj5LElZVazzsaSfVZYn8unssTytHXVn4JyByi0sfx9O0d4izVw5s1x6SlKKVk+ooFsa0JA0wi5x9S07O7vs7+7du8s5V+U6GRkZVT5INvJzPZayL7nkEl1yySVVbh8AgFjVSZCE5iG3MFfJbZLLpYdcKGp6tIAKAAAAaGjqq7sdAAAAADQKBEkAAAAAEEB3OzQr0e6j4h4qAAAABBEkoVmJdh8V91ABAAAgiO52AAAAABBAkATUJZ63AwAA0OgQJAF1ieftAAAANDoESQAAAAAQQJAEAAAAAAEESQAAAAAQwBDgaFZSklLKDe29u2S3CnYVRM2L5mlI1pB4V6HacgpylJ2T3WjKbYyy07PjXQUAQD0hSEKzEu3hsBnZGcoYklH/lQEagdYJreNdBQAA6h1BEgBEaIwtBgT7AADUHoIkAGhEBs4ZWK7LqCQV7S3SzJUzw9JSklKitp4CAIDKESQBQCOSW5ir5DbJ5dJDLlQuPVowBQAAqsbodgAAAAAQQJAEAAAAAAEESQAAAAAQQJAEAAAAAAEESQAAAAAQQJAEAAAAAAEESQAAAAAQQJAEAAAAAAEESQAAAAAQQJAEAAAAAAEESQAAAAAQQJAEAAAAAAEESQAAAAAQQJAEAAAAAAEESQAAAAAQQJAEAAAAAAEESQAAAAAQQJAEAAAAAAEJ8a5AkzFkSLxrUO9e/PRbJRy0o1z6uePbHHjhKSlSbm542u7dUkFB9LwAAABALSFIqi15eVKXLvGuRdOxenX5tIwMbwIAAADqEEFSbRk9utl9gf/pg4cruU1y+QU78+u9LgAAAEBt4Z4kAAAAAAiodpBkZpPMzJnZo4G0n5rZYjP7yl82JMp6XcxsnpnlmVmxmf3HzMYeWPUBAAAAoHZVK0gys1MkjZe0LmJRoqR3JN1YyepPSjpO0oWS+vnz88zsjOrUAQAAAADqUsxBkpklSXpa0pWSvg0uc87Nc879VtIrlRQxWNJjzrl3nXOfOOd+J+lTSYOqX20AAAAAqBvVaUmaI+l559yyGm7rbUmXmFlHMzvIzC6U1FnSazUsD9DUqVNlZrr22mvL0l588UWdddZZ6ty5s8xM2dnZ5dbbsmWLfvKTn6hz586adt40XXLJJfriiy8q3daQIUNkZuWmPn36lOXZsWOHrr/+eh111FFq06aNBg8erJUrV9ba/gIAAKDuxRQkmdl4ST0k3X4A27pEkpOUL2mPvFapMc65tQdQJpqxFStWKDMzU/379w9LLy4u1uDBg/Xwww9HXa+4uFgjRoyQc05Lly7VLx75hfbu3au0tDTt37+/wu29+OKL2rZtW9mUk5OjQw89VJdccklZnquuukqLFy/WE088ofXr12vEiBEaPny4Pvvss9rZaQAAANS5KocAN7NekqZKOt05t/cAtnWPpE6ShssLlC6S9KSZneGc+0+U7U6QNEGSjjzyyAPYLJqiwsJCjR07Vo8//rjuuuuusGWXX365JCk/P/pQ5P/617/03//+V6tWrVL79u11+DeH674n7lP79u21bNkyDR8+POp6HTp0CJt/+umnVVxcrF/84heSpF27dumFF17QCy+8oCH+w4UzMjK0aNEizZw5U/fcc8+B7DIAAADqSSwtSafKC242mFnIzEKSfiTpan++VVUFmNn3JV0nabxzbqlz7j/+PUwr/fRynHNznHOpzrnUzp07x7xDaB4mTJigkSNH6swzz6z2unv27JGZqXXr1mVprVu31kEHHaS333475nIyMzN1zjnnqFu3bpKkUCikffv2hZUrSW3atKlWuQAAAIivWIKk+fJGoxsQmFZJes7/O5bWpUP8130R6ftirANQJjMzU5s3b9bdd99do/VPOeUUtW3bVrfccouKi4u1d9de3Xzzzdq3b5+2bdsWUxkfffSR3njjDY0fP74s7dBDD9Wpp56qe+65R5999pn27dunp556SsuXL4+5XAAAAMRflQGKc67AObchOEkqlvSNP+/MrIOZDZDU11+th5kNMLMu/vyHkjZLmmFmg8zs+2Z2k6QfS3qp9ncLTdWmTZs0adIkPf3002rZsmWNyujcubP+9re/6ZVXXtGhhx6q+86/TwUFBfrBD36gFi1axFRGZmamunbtqvPOOy8sfd68eTrooIOUkpKiVq1a6Y9//KPGjBkTc7kAAACIv9pqxblA0nuSXvfnM/35X0mSc65E0rmSvpK0SN5zlq6QNM45t6iW6oBmYPny5crPz1ffvn2VkJCghIQEvfHGG5oxY4YSEhK0Z8+emMoZMWKEtmzZoi+//FK3LrhV8+bN02effaajjz66ynX37t2rJ554QuPGjVNCQvhtfd///vf1xhtvqKioSJ9++qn+/e9/q6SkJKZyAQAA0DBUOXBDNM65IRHzWZKyqljnY0k/q8n2gFIXXXSRUlNTw9LGjRunnj17atKkSdVuXerUqZNat22tZcuW6csvv9QFF1xQ5TovvfSS8vPzdeWVV1aYJzExUYmJifr222+1ePFiPfDAA9WqF1CRlKQU5RbmlkvfXbJbBbsKyuUFAADVV6MgCYiX5ORkJScnh6UlJiaqQ4cO6tvX6+35zTffaOvWrSooKJAkbd68WcnJyerSpYu6dPF6gM6dO1e9e/fWYYcdpnVL1umRWY/ohhtuUK9evcrKHTZsmAYNGqRp06aFbS8zM1PDhg3TMcccU65+ixcv1v79+9W7d29t3rxZt9xyi3r16qVx48bV4lFAc7Z6wuqo6RnZGcoYklG/lQGAxiorS0pPj3ct0IAxaAKanIULF+rEE0/U0KFDJUnjx4/XiSeeqFmzZpXl2bRpk37yk5/ouOOO0xtPvqHJkyfroYceCitny5Yt5QZc+OSTT7Rs2bKwARuCCgsLde2116p379664oordNppp+mf//ynDj744FreSwAAUGM5OfGuARo4WpLQ6GVnZ4fNp6enK72KX4fuu+8+3XfffZK8X+BvHHJjuTw5UT5AjznmmEofOHvJJZeEPVwWAAAAjQ8tSWj2uid3j3cVAAAA0IAQJKHZSx+QHu8qAAAAoAEhSAIAAACAAIIkAAAAAAggSAIAAACAAIIkNB7du8e7BgAAAGgGCJLQePDQNwAAANQDgiQAAAAACCBIAgAAAIAAgiQAAAAACCBIAgAAAIAAgiQAAAAACCBIAgAAAIAAgiQAAAAACCBIAgAAAICAhHhXAI1XSlKKcgtzy6XvLtmtgl0FUfMDAAAADR1BEmps9YTVUdMzsjOUMSSjfisDAAAA1BK62wEAAABAAEESAAAAAAQQJAEAAABAAEESAAAAAAQQJAEAAABAAEESAAAAAAQQJAEAAABAAM9JqiVZa7OUlZUd72o0CDkFOcrOyY53NRqE7PTseFcBtWTq1KmaPHmyrrnmGj366KOSpBdffFGzZ8/WmjVrlJ+fr9dff11DhgwJWy8vL0+33HKLlixZoh07dqhHjx669dZbNXbs2Eq3N336dM2cOVP/+9//1LFjR1144YW6//771bZt26h1++3k3yr/mvyyupWUlGjKlCl65ZVXtGXLFrVr105Dhw7VfffdpyOPPFKS9M033+jOO+/UkiVL9L///U+dOnXS+eefr3vuuUcdO3ashaMGAHE2cKCUW/7B9yoqkmbODE9LSZFWR38GJJofWpJQ61ontI53FYBatWLFCmVmZqp///5h6cXFxRo8eLAefvjhCte94oortHHjRi1YsEDr16/XFVdcocsvv1xvvvlmhes888wzuvXWWzV58mRt3LhRTz75pF5++WVNnDixwrodfszhYek7d+7UmjVrNHnyZK1Zs0YLFizQp59+qrPPPluhUEiS9Pnnn+uzzz7TAw88oPXr1+upp57Sm2++qTFjxlTn8ABAw5WbKyUnl59aty6fFi2YQrNFS1ItSR+QrvT0jHhXA0AtKyws1NixY/X444/rrrvuClt2+eWXS5Ly8/MrXP+dd97RI488opNPPlmSdNNNN+mPf/yj/v3vf+uMM86ocJ1TTjmlrPzu3bvriiuu0AsvvFBh3X5x4y/CliUlJWnJkiVhabNnz1afPn20ceNG9evXT3379tWLL75YtrxHjx568MEHdf7552v79u1q165dZYcGAIAmi5YkAKjEhAkTNHLkSJ155pk1Wv+0007TX//6V3399dfav3+/FixYoK+++krDhw+vdJ21a9dqxYoVkqStW7dq4cKFOvfccw+obtu3b5cktW/fvtI8rVq10iGHHBJTmQAANEW0JAFABTIzM7V582bNmzevxmX89a9/1ejRo9WpUyclJCSoVatWevbZZzVgwIAK1xk9erS+/vprnXHGGXLOKRQK6fLLL9f9999f47rt3btXN910k9LS0pSSkhI1T0FBgW6//XaNHz9eCQn8ewAANF+0JAFAFJs2bdKkSZP09NNPq2XLljUuZ8qUKcrPz9drr72mVatW6ZZbbtEVV1yh//znPxWu88Ybb+juu+/WjBkztGbNGr344ovKzs7WnXfeWaO6hUIhXXbZZSooKNDcuXOj5ikuLlZaWpqOOOIIPfDAAzXbWQAAmgh+KgSAKJYvX678/Hz17du3LG3fvn168803NWvWLBUXF6tVq1aVlrFlyxY98sgjWrt2rU444QRJ0gknnKC33npLjzzyiP70pz9FXW/KlCkaM2aMrrrqKklSv379VFxcrKuuukp33HFHhXWbsW5GubqFQiGNGTNG69evV3Z2dtRR64qKisq68v39739X69YMvgIAaN4IkgAgiosuukipqalhaePGjVPPnj01adKkmFpwdu7cKUlq0aJFWHqLFi20f//+SteLto5zrsK6nTXyLP3oBz8Kq1tJSYlGjx6tDRs2KDs7W126dCm3rR07duicc86Rc06vvvpq1CHGAQBobgiSaiLamPvRxtuXGHMfaKSSk5OVnJwclpaYmKgOHTqUteB888032rp1qwoKCiRJmzdvVnJysrp06aIuXbqod+/e6tGjh66++mo99NBD6tixo+bPn68lS5ZowYIFZeUOGzZMgwYN0rRp0yRJaWlpevjhh5WamqqTTz5Z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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.rcParams['figure.figsize'] = [12, 7]\n", "plt.rc('font', size=14)\n", "fig, ax = plt.subplots()\n", "\n", "stock['Date'] = pd.to_datetime(stock.index)\n", "stock['Date'] = stock['Date'].apply(mpl_dates.date2num)\n", "stock = stock.loc[:,['Date', 'Open', 'High', 'Low', 'Close']]\n", "\n", "candlestick_ohlc(ax, stock.values, width=0.5,\\\n", " colorup='green', colordown='red', alpha=0.85)\n", "date_format = mpl_dates.DateFormatter('%d %b %Y')\n", "ax.xaxis.set_major_formatter(date_format)\n", "#fig.autofmt_xdate()\n", "fig.tight_layout()\n", "\n", "Highs['Date'] = pd.to_datetime(Highs.index)\n", "Highs['Date'] = Highs['Date'].apply(mpl_dates.date2num)\n", "min_date_high = min(Highs.Date)\n", "max_date_high = max(Highs.Date)\n", "for i in range(len(res)):\n", " mu = Highs[Highs.High == res[i]].Date.values[0]\n", " plt.hlines(res[i], xmin = max(min_date_high, mu - 3), xmax = min(mu + 3, max_date_high), color = 'red')\n", " plt.text(x = mu - 3, y = res[i] + 1, s = str(res[i]))\n", " \n", "Lows['Date'] = pd.to_datetime(Lows.index)\n", "Lows['Date'] = Lows['Date'].apply(mpl_dates.date2num)\n", "min_date_low = min(Lows.Date)\n", "max_date_low = max(Lows.Date)\n", "for i in range(len(res)):\n", " mu = Lows[Lows.Low == sup[i]].Date.values[0]\n", " plt.hlines(sup[i], xmin = max(min_date_low, mu - 3), xmax = min(mu + 3, max_date_low), color = 'green')\n", " plt.text(x = mu - 3, y = sup[i] - 2, s = str(sup[i]))\n", "\n", "plt.title('Supports and Resistances Using K-mean Clustering')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "image/png": "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s9SFT0REREREJEwKoERERERERMKkAEpERERERCRMCqBERERERETCpABKREREREQkTAqgREREREREwqQASkREREREJEwKoERERGqxiRMnYmbccsstAOTn53PXXXfRo0cPYmNjadeuHVdeeSXr168Pub5zjvPPPx8z49VXXy13fzt27OD3v/89RxxxBI0bN6Zz58688sorgeVTpkyhR48etGjRghYtWnDaaafx5ptvVs3BiohEAT1IV0REpJZaunQpaWlp9OjRI5C2e/duli9fztixY+nZsyfbt29n9OjRnH/++XzxxRfExBT/an/00Udp2LBhWPvLz8/n3HPPpWXLlrzyyiu0b9+eDRs20Lhx40Ce9u3b8+CDD9KlSxf279/Ps88+y2WXXcann35arJwiInWVAigREZFaaPv27QwdOpTp06dz7733BtLj4uJYsGBBsbzTpk2jW7durFq1iu7duwfSly1bxuTJk/n00085/PDDy93njBkz2Lx5M4sWLaJRo0YAJCUlFctz6aWXFpufMGECTz/9NEuWLFEAJSL1grrwiYiI1EIjR45k4MCBnH322eXm3bFjBwAtW7YMpO3cuZMhQ4Ywbdo0DjvssLD2OWfOHE4//XR+97vfkZCQwPHHH09qair5+fkh8xcWFjJr1ix27dpF7969w9qHiEi0UwuUiIhILZOWlsaaNWuYOXNmuXn37dvH6NGjGTBgAO3btw+k33jjjZx//vlceOGFYe933bp1vP/++1x55ZW8+eabZGVlcfPNN7Nr1y4eeeSRQL4VK1Zw2mmnsWfPHpo3b87rr79erOVLhPR0GDYs0qUQqRYKoERERGqR1atXM2bMGD788MNAN7rSFBQUcNVVV5Gbm8sbb7wRSJ85cyaff/45y5Ytq9C+9+/fz2GHHUZaWhoNGzbkpJNO4scff+S2227j4YcfxswA6Nq1K5mZmeTm5jJ79myuvfZaMjIySE5OrvgBS92UlRXpEohUG3XhExERqUWWLFnC1q1bSU5OJiYmhpiYGD744AOeeuopYmJi2Lt3L+AFT0OGDOGLL77gvffeo3Xr1oFtvPfee3z11Vc0b948sA2AQYMGccYZZ5S673bt2nHMMccUG3TiuOOOY/fu3WzdujWQ1qhRIzp37kxKSgqTJk2iZ8+e/OUvf6nqUyEiUiupBUpERKQWueyyy0hJSSmWNnz4cLp06cKYMWNo1KgR+fn5DB48mJUrV5KRkUFCQkKx/BMmTOCOO+4olta9e3ceeeSRAwaBCHb66afz4osvsn//fho08H5j/frrr2nWrBlt2rQpdb39+/cHAjsRkbpOAZSIiEgtEh8fT3x8fLG02NhYWrVqRXJyMgUFBVx++eV88sknzJs3DzMjJycH8Eboa9q0KUceeSRHHnnkAdvu0KEDnTp1Csz369ePXr16MWnSJAB++9vf8uSTTzJq1ChuueUWsrKyGD9+PDfddFOg+94f//hHLrroIjp06MDOnTt58cUXycjI0LOgRKTeUAAlIiISRTZs2MDcuXMBOOmkk4otmzFjBsMqcOP+2rVr6dChQ2C+Q4cO/Otf/+L222+nZ8+eJCQk8H//93+MGzcukCcnJ4errrqKnJwc4uLi6NGjB2+//TbnnXfewR2YiEiUUAAlIiJSy2VkZAT+T0pKwjlX4W2EWicrxI3+p556Kh999FGp20lPT6/wvkVE6hIFUCIiIrVJ376RLkHdFxSQiohUlAIoERERqbT0hByG5SSUn1Hqnj59IDs79LLcXJgxI/SyxERYtKjaiiVS3RRAiYiI1CZR1jqSlZEKfVMjXQyJhOxsaNs29LL8/NKXlRZ0iUQJPQdKREREREQkTAqgREREREREwqQASkREREREJEy6B0pERESkLktMLP2+o7w82LIl9DoiEpICKBEREZG6rKwR71JTvUlEwqYASkRERGqd9Mx0hvUcFuli1KjEuESytx/YUpSXn8eW3SFaifx1RKRmKYASERGRWicrNyvSRahxi4aHbilKzUglVUPFi9QaGkRCREREREQkTAqgREREREREwqQufCIiIhIxfWb0CXnfT+6eXGZkzgi5TmJcYqnd3UREqpsCKBEREYmY7O3ZtG3W9oD0/ML8kOlF64iIRIq68ImIiIiIiIRJAZSIiIiIiEiY1IVPREREIkbPPhKRaKMASkRERCJGzz4SkWijLnwiIiIiIiJhqnAAZWZjzMyZ2ZP+/CFm9qCZfWFmeWa2ycxeNLOOpaxvZvaOv42BB3sAIiIiIiIiNaVCAZSZnQqMAL4ISm4G/AKY4P+9FOgAvGNmoboIjgYKK1VaERERERGRCAr7HigziwNeAK4D7ilKd85tB84pkfcG4EvgOGBFUHoKMAo4CfjhYAouIiIiIiJS0yrSAvUM8Kpz7v0w8rbw//5UlGBmhwIvATc45zaXtwEzG2lmy8xs2ZYtoUfhERERERGR6JCemR7pIlSJsAIoMxsBdAbuDiNvI+BRYJ5zbkPQoqnAO865t8LZp3PuGedcinMupW3b0E8iFxERERGR6JCVmxXpIlSJcrvwmVlXYCJwpnNuXzl5Y4DngXjgkqD0q4ETgJSDKayIiIiIiEgkhdMCdRrQBlhpZgVmVgD8ErjJn28MgeDpJaAH0M8592PQNvoBxwO7grYB8LKZLa6qgxEREREREalO4QwiMQdYViJtBvANXsvUPjM7BJgFJAN9nXM5JfKPBR4pkbYCuAOYW8Eyi4iIiIiIRES5AZRzLhfIDU4zszxgm3Nupd/y9A/gZGAA4Mwswc+63Tn3s3Pue+D7EtsA+M45t+5gD0JERERERKQmVPhBuiG0x3v20xHAp8CmoGlQFWxfRERERESkVgj7OVDBnHN9g/7PAqwS26jwOiIiIiIiIpFUFS1QIiIiIiIi9YICKBERERERkTApgBIREREREQmTAigREREREZEwKYASEREREREJkwIoERGRKjBx4kTMjFtuuQWA/Px87rrrLnr06EFsbCzt2rXjyiuvZP369cXWGzFiBEcffTRNmzalbdu2XHrppaxatarMfaWlpXHmmWfSqlUr4uPjOeuss1i8ePEB+TZt2sS1115L27ZtadKkCccffzwffPBBhY+tz4w+JP41MeT0l6V/KXVZnxl9KrwvEZHaTgGUiIjIQVq6dClpaWn06NEjkLZ7926WL1/O2LFjWb58OXPnzuW7777j/PPPp6CgIJAvJSWF9PR0Vq1axfz583HO0b9/f/Lz80vdX0ZGBoMGDeK9997j448/pmvXrpx33nl88803gTy5ubmcfvrpOOd48803WbVqFU888QSHHXZYhY8ve3s2bZu1DTnFHhJb6rLs7dkV3peISG1XqedAiYiIiGf79u0MHTqU6dOnc++99wbS4+LiWLBgQbG806ZNo1u3bqxatYru3bsDcMMNNwSWJyUlcf/993PCCSewbt06unbtGnKfL7zwQrH5p59+mjlz5vDOO+/QpUsXAB566CHatWvHc889F8h31FFHHdzBioiIWqBEREQOxsiRIxk4cCBnn312uXl37NgBQMuWLUMuz8vLY8aMGXTs2JGkpKSwy7Bv3z727NlTbLtz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qOm220pftij0xaqIiBxIAZRIKZYuXUpaWho9evQIpO3evZvly5czduxYli9fzty5c/nuu+84//zzKSgoKJbv3HPPJTU1Nez9ZWRkMGjQIN577z0+/vhjunbtynnnncc333xTLF/Xrl3ZtGlTYFqxYsVBH6uIiIiIhEdd+ERC2L59O0OHDmX69Once++9gfS4uDgWLFhQLO+0adPo1q0bq1atonv37gDceuutACxbtizsfb7wwgvF5p9++mnmzJnDO++8Q5cuXQLpMTExanUSkVojKT4p0kUQEalRaoESCWHkyJEMHDiQs88+u9y8O3bsAKBly5ZVWoZ9+/axZ8+eA7a7bt06jjzySI466igGDx7MunXrqnS/IiIVMaznsEgXQUSkRqkFSqSEtLQ01qxZw8yZM8vNu2/fPkaPHs2AAQNo3759lZZj3LhxNG/enEsuuSSQdsopp5Cens6xxx7L5s2buf/+++nduzdffvklrVu3rtL9i4iIiMiBFECJBFm9ejVjxozhww8/pFGjRmXmLSgo4KqrriI3N5c33nijSssxefJkpk2bxrvvvkuLFi0C6RdccEGxfKeeeiqdOnXi2Wef5fbbb6/SMoiIiIjIgRRAiQRZsmQJW7duJTk5OZBWWFjIokWLmDp1Knl5eTRu3JiCggKGDBnCihUryMjIqNLWn8mTJzNu3DjefvttevXqVWbe5s2b061btwMGmhARERGR6qEASiTIZZddRkpKSrG04cOH06VLF8aMGUOjRo3Iz89n8ODBrFy5koyMjCod0OGxxx7jnnvu4a233uKMM84oN/+ePXv473//y1lnnVVlZRCROiopKdIlEBGpExRAiQSJj48nPj6+WFpsbCytWrUiOTmZgoICLr/8cj755BPmzZuHmZGTkwN4I/Q1bdoUgJycHHJycvj6668B+Oqrr8jNzaVjx460atUKgH79+tGrVy8mTZoEwMMPP8zYsWN5/vnnOeaYYwLbbdq0KXFxcQDccccdDBgwgI4dO7J582buu+8+8vLyuPbaa6v93IhIlBs2LNIlEBGpEzQKn0gFbNiwgblz57Jx40ZOOukk2rVrF5hefvnlQL6pU6dy4oknMnToUAAuuugiTjzxxGL3Sq1du5ZNmzYF5qdMmUJ+fj6DBg0qtt1Ro0YV2/+QIUPo2rUrv/71r2ncuDFLly4lMTGxBo5eRERERNQCJVKOjIyMwP9JSUk458pdJzU1tdyH6GZlZZU5H8qsWbPKzSMiIiIi1UcBlEiRvn0jXYL6ISggFREREYk26sInEs38+6REREREpGaoBUqkSDS2jKSmepNEp/R03djv65veN9JFqJBhmVmkp2dE1bYzhlX9NkVE6iO1QImIREoY971J7ZTTpkmkiyAiIhGiFigREYm4kq0jEydOZOzYsdx88808+eST5OfnBx4wvXbtWlq0aMFZZ53FAw88QMeOHQPrPfPMM7z00kt89tlnbN++nW+//Zakcp5/9OWXXzJ+/HiWL1/Ot99+y/jx4w8YBGbnzp3cfffdvP7662zevJl9J57I5Bse5uSTT66iMxAkK5Vhw1LLzSYiIpGhFigREalVli5dSlpaGj169Aik7d69m+XLlzN27FiWL1/O3Llz+e677zj//PMpKCgolu/cc88tdxTMYLt37yYpKYn777+fo446KmSe66+/nvnz5/Pss8+yYsUKzj33XPr378/3339f6eMUEZHopBYoERGpNbZv387QoUOZPn069957byA9Li6OBQsWFMs7bdo0unXrxqpVq+jevTsAt956KwDLli0Le58nn3xyoCVp4sSJByz/+eefmT17NrNnz6avP1pnamoq8+bN4+mnn+b++++vyCGKiEiUUwuUiIjUGiNHjmTgwIGcffbZ5ebdsWMHAC1btqzWMhUUFFBYWEiTJsXve2ratCmLFy+u1n2LiERCemZ6pItQqymAEhGRWiEtLY01a9Zw3333lZt33759jB49mgEDBtC+fftqLdehhx7Kaaedxv3338/3339PYWEhzz//PEuWLGHTpk3Vum8RkUjIys2KdBFqNQVQIiIScatXr2bMmDG88MILNGrUqMy8BQUFXHXVVeTm5jJjxowaKd/MmTNp0KAB7du3p3Hjxjz++OMMGTKEhg0b1sj+RUSk9tA9UCK1XZ8+kJ0delluLpR2AZmYCIsWVVuxRKrSkiVL2Lp1K8nJyYG0wsJCFi1axNSpU8nLy6Nx48YUFBQwZMgQVqxYQUZGBq1bt66R8h199NF88MEH5OXlsWPHDtq1a8egQYNKHXRCRETqLgVQIrVddja0bRt6WX5+6ctKC7pEaqHLLruMlJSUYmnDhw+nS5cujBkzhkaNGpGfn8/gwYNZuXIlGRkZJCQk1Hg5Y2NjiY2N5aeffmL+/Pk89NBDNV4GERGJLAVQIiIScfHx8cTHxxdLi42NpVWrViQnJ1NQUMDll1/OJ598wrx58zAzcnJyAG+EvqZNmwKQk5NDTk4OX3/9NQBfffUVubm5dOzYkVatWgHQr18/evXqxaRJkwDvfqqvvvoKgD179pCTk0NmZibNmzenc+fOAMyfP5/9+/dz7LHHsmbNGu688066du3K8OHDq/3ciIhI7aIASkREar0NGzYwd+5cAE466aRiy2bMmMGwYcMAmDp1Kn/+858Dyy666KID8qxdu5YOHToE8mzcuJETTzwxML927VqmTZvGL3/5SzIyMgBvePU//elPbNiwgVatWvGb3/yGCRMmcMghh1T1oYqISC2nAEpERGqlouAFICkpCedcueukpqaW+xDdrKysYvPhbPuKK67giiuuKHf/IiLRos+MPmRvD93dP3dPLjMyD7zHOjEukUXDy76/OjEusdTt5uXnsWX3llLXixYKoERERERE6pns7dm0bRb6Pur8wvyQy0oLjIKVFWClZqSS2jc17DLWVhrGXEREREREJEwKoERERERERMKkLnwiIlJMaf3X60rfdRERkYOhAEqiT3o6+KNpRY1oLLPUW6X1X68rfddFREQOhrrwRbGJEydiZtxyyy0A5Ofnc9ddd9GjRw9iY2Np164dV155JevXry+23t69e/nd735HmzZtiI2N5ZJLLmHDhg1l7usf//gHKSkpxMfHExsbS8+ePXn22WeL5Zk0aRInn3wyLVq0oG3btgwYMICVK1dW7UEDlBhBKypEY5lFRERE5AAKoKLU0qVLSUtLo0ePHoG03bt3s3z5csaOHcvy5cuZO3cu3333Heeffz4FBQWBfLfeeiuzZ8/mpZde4sMPP2THjh1cfPHFFBYWlrq/1q1bM27cOJYuXcoXX3zB8OHDue6663jrrbcCeTIyMrjpppv46KOPeP/994mJiaF///5s27atek6CiIiIiEgNUxe+KLR9+3aGDh3K9OnTuffeewPpcXFxLFiwoFjeadOm0a1bN1atWkX37t3Zvn0706dPZ8aMGZxzzjkAzJw5k8TERN59913OO++8kPs8++yzi82PGjWKZ599lg8//JALL7wQgPnz5xfLM3PmTOLi4vj3v//NgAEDDvq4RUREREQiTS1QUWjkyJEMHDjwgKAmlB07dgDQsmVL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DMcffzxffvklADt37uTuu+/m9ddfZ/Pmzew78UQm3/AwJ598cpWdBxEREREpnVqgREqxdOlS0tLS6NGjR7H0vLw8evfuzWOPPRZyvbzCQs79+mucc7zXpQv/PvZY9jnHgDVr2O9CPvYM8AKzTZs2BaasrCwOPfRQrrjiikCe66+/nvnz5/Pss8+yYsUKzj33XPr378/3339fNQctIiIiImVSC5RICNu3b2fo0KFMnz6de++9t9iyq6++GoCtW7eGXPffeXl8u28fy447jpYx3lvs2fh4Wv7wA+/v3En/Fi1CrteqVati8y+88AJ5eXn83//9HwA///wzs2fPZvbs2V6LF5Camsq8efN4+umnuf/++yt9vCIiIiISHrVAiYQwcuRIBg4cyNlnn13hdffu348BTRr87+3VxIwGwOJdu8LeTlpaGhdccAEdOnQAoKCggMLCQpo0KX7fU9OmTVm8eHGFyyklJCZ6XSpLTnl5odO3bPHWERERkXpFLVAiJaSlpbFmzRpmzpxZqfVPjY2leYMG3LlhAw8eeSQAf9yxg0JgU35+WNv4+uuv+eCDD5gzZ04g7dBDD+W0007j/vvvJzk5mYSEBF566SWWLFlC586dK1VWCbJoUej01FRvEhEREUEtUCIB6ZnprF69mjFjxvDCCy/QqFGjSm2n7SGH8I+jj+bt7ds5NDOTuMxMcp3jF82a0dDKHfEf8IK4du3acdFFFxVLnzlzJg0aNKB9+/Y0btyYxx9/nCFDhtCwYcNKlVVEREREKkYtUCK+rNwsyPTubUpOTg6kFxYWsmjRIqZOnUpeXh6NGzcud1vntmjB2u7d2VpQQAwQv3kzCVu2cFTLluWuu2/fPp599llGjBhBTEzxt+jRRx/NBx98QF5eHjt27KBdu3YMGjSIo446qoJHKyIiIiKVoQBKJMhll11GSkpKsbThw4fTpUsXxowZU+FWqTZ+APT+3r1sLijgkvj4ctd5/fXX2bp1K9ddd12peWJjY4mNjeWnn35i/vz5PPTQQxUql4iIiIhUjgIokSDx8fHElwhyYmNjadWqVaBVatu2baxfv57c3FwA1qxZQ3x8PAmFhST468zYupVjmzThsEMOYcmuXYz66SduO+wwugYNANHv66/pZcakEmVIS0ujX79+dOrU6YDyzZ8/n/3793PssceyZs0a7rzzTrp27crw4cOr6AyIiIiISFkUQIlU0BtvvFEsYBkxYgQA41u0IDXBC6FW79nDn77/nm2FhSQ1asTY5s25rX37YttZu3cvHUo8WHfdunW8//77zJo1K+S+t2/fzp/+9Cc2bNhAq1at+M1vfsOECRM4pOQDekVERESkWiiAEilHRkZGsflhw4YxbNiwAzMGDWn9QPv2PBAcMG3cCCUGkMjq3t0bCjtIp06d2L9/f6llueKKK4o9WFdEREREapZG4RMREREREQmTAigREREREZEwKYASEREREREJkwIoEREREYkKSfFJkS6CiAaREKkyiYmQnR16WV7eAQNGBNaR+ispKdIlEBGJKsN6Dot0EUQUQIlUmUWLSl+WmupNIsFCjeYoIiIitZq68ImIiIiIiIRJAZSISFnUzU5ERESCqAufHJQ+M/qQvT30fT+5e3KZkTkj5LLEuEQWDS+jy5tIbaFudiIiIhJEAZQclOzt2bRt1jbksvzC/FKXlRZ0iYiIiIjUZurCJyIiIiIiEiYFUCIiIiIiImFSFz6pd0q7b0v3bImIiIhIeRRASb1T2n1bumdLRERERMqjLnwiNUFDYYuIiIjUCQqgRGqChsIWERERqRMUQImIiIiIiIRJAZSIiIiIiEiYNIiE1DuJcYkhB4XIy89jy+4tpa4jUtX6pvetlu1m5WaRkZURNdutThnDMiJdBBERqWMUQEm9U9pw5KkZqaT2Ta3ZwohEkSYxTSJdBBERkYhTACUiEiElW0cmTpzI2LFjufnmm3nyyScBeO2115g2bRrLly9n69atLFy4kL59+xZbLycnhzvvvJMFCxawc+dODk04lBH3jmDo0KFl7n/y5Mk8/fTTZGdn07p1ay699FIefPBBmjdvfkDeorL1v7l/oGz5+fmMGzeOt99+m7Vr19KiRQvOOussHnjgATp27AjAtm3bGD9+PAsWLCA7O5s2bdpw8cUXc//999O6detKnjkREZHI0T1QIiK1wNKlS0lLS6NHjx7F0vPy8ujduzePPfZYqetec801rFq1irlz57JixQp6nNeDq6++mkWLSn/484svvsgf/vAHxo4dy6pVq3juued46623GDVqVNhl2717N8uXL2fs2LEsX76cuXPn8t1333H++edTUFAAwMaNG/n+++956KGHWLFiBc8//zyLFi1iyJAhFTk9IiIitYZaoEREImz79u0MHTqU6dOnc++99xZbdvXVVwOwdevWYul9ZvQJ3Mv33Qff0fLXLbliyRUA5HbMpUF8Ay599FJaLG9RbL3EuEQWDV/ERx99xKmnnhrYflJSEtdccw2zZ88Ou2xxcXEsWLCgWNq0adPo1q0bq1atonv37iQnJ/Paa68Flnfu3JmHH36Yiy++mB07dtCiRfHyiYiI1HZqgRIRibCRI0cycOBAzj777LDXyd6eTdtmbWnbrC2Hdj6UghUFtNzfkjZN2tBwdUP279pPux7tAnmKpqKg64wzziAzM5OlS5cCsH79et544w0uvPDCgyrbjh07AGjZsmWZeRo3bkyzZs3CPl4REZHaQi1QIiIRlJaWxpo1a5g5c2alt9FpZCfW/W0dn4/+HBqAxRidru9Esw6lByiDBw/mxx9/pE+fPjjnKCgo4Oqrr+bBBx+sdNn27dvH6NGjGTBgAO3btw+ZJzc3l7vvvpsRI0YQE6OvIBERiT5qgRIRiZDVq1czZswYXnjhBRo1alTp7Xw/93sKdhXQ5dYuHDfmOGL7xvLtjG/Z/d3uUtf54IMPuO+++3jqqadYvnw5r732GhkZGYwfP75SZSsoKOCqq64iNzeXGTNmhMyTl5fHgAEDOPLII3nooYcqd7AiIiIRpp//REQiZMmSJWzdupXk5ORAWmFhIYsWLWLq1Knk5eXRuHHjMrexd8tetizcwnHjjgu0OB0afyi23ti8cDNJ1ySFXG/cuHEMGTKE66+/HoDu3buTl5fH9ddfzz333FOhshUUFDBkyBBWrFhBRkZGyNH1du3aFege+M9//pMmTTQkuoiIRCcFUCIiEXLZZZeRkpJSLG348OF06dKFMWPGhNXys3/ffgCsgRVLtwYGrvT1du/eTcOGDYulNWzYEOdchcqWn5/P4MGDWblyJRkZGSQkJBywr507d3LBBRfgnOOdd94JOUy6iIhItIi6LnwTJ07EzLjlllsCaa+99hrnnXcebdu2xczIyMg4YL2cnByuvvpqEhISiI2N5YQTTuCFF14oc19paWmceeaZtGrVivj4eM466ywWL15c1YckIvVUfHw8ycnJxabY2FhatWpFcnIyZsa2bdvIzMxk5cqVAKxZs4bMzEwKdxQC0CShCY0Pa8z6F9eT920ee7fsZVfGLnas2kF8z/jAvr5+7Gu+f/37wPyAAQN45plnmDVrFt9++y0LFizg7rvv5uKLLyYmJiasshUUFHD55ZezdOlSXnrpJcyMnJwccnJy+PnnnwEveDr33HP56aefSE9PJy8vL5Bn3759NXeyRUREqkhUtUCV95yUq666imuuuSbkutdccw3btm1j7ty5tG3bltdff52rr76aDh060KdPn5DrZGRkMGjQIE4//XSaNWvGX/7yF8477zwyMzPp0qVLlR+fiEhJb7zxBsOHDw/MjxgxAoAW57Ug4dcJWEOj8y2d+f7171kzZQ379+6nQesGJF2bRPwJ8YH19m7dS6NWjWiE13I0btw4zIy7776bDRs20KZNGwYMGMCECRPCLtuGDRuYO3cuACeddFKxZTNmzGDYsGF8+umngZH+jjnmmGJ5Qj0UWEREpLaLmgCqMs9JCfbRRx/xxBNPcMoppwAwevRoHn/8cf7zn/+UGkCVbKF6+umnmTNnDu+8844CKBGpFiVb0IcNG8awYcMOyJf418TA/00Ob8LRNx4dmN+4cyOtDy1+H1L3id0B2LJ7CwAxMTGMHz8+MGhEZcqWlJQU6PJXmr59+5abR0REJJpETRe+yjwnJdgZZ5zBK6+8wo8//sj+/fuZO3cuW7ZsoX///mFvY9++fezZs6fM55uIiIiIiEjdFRUtUFu2bME5d1DPSXnllVcYPHgwbdq0ISYmhsaNG/PSSy/Rs2fPsLcxbtw4mjdvziWXXFLpcoiIiIiISPSq9QGUmXWNiYlh/vz5B/WclHHjxrF161beffdd2rRpw5w5c7jmmmtYtGgRJ5xwQrnrT548mWnTpvHuu+/SokWLSpdDRERERESiV60PoIDTCgoKDuo5KWvXruWJJ54gMzMzECydcMIJfPjhhzzxxBP87W9/K3P9yZMnM27cON5++2169ep18EckIiIiIiJRKRrugZpz/PHHk5mZGZhSUlIYPHgwmZmZYbVK7d69GyDkM0/2799f5rqPPfYYY8eO5c033+SMM86o/FGIiIiIiEjUq/UtUM653JSUlGItUMHPIgHYtm0b69evJzc3F/CekxIfH09CQgIJCQkce+yxdO7cmZtuuolHHnmE1q1bM2fOHBYsWBAYghegX79+9OrVi0mTJgHw8MMPM3bsWJ5//nmOOeYYcnJyAGjatClxcXE1dAZERERERKS2iIYWqHK98cYbnHjiiZx11lmA95yUE088kalT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bt9B7meac+7vzrnPnHNjgP8AN4ZawTn3jHMuxTmX0rZt20ruVkREREREpOqEcw/UaUAbYKWZFaU1BPqY2Y1ArHNubznb2OT//apE+iqgY5hlFRERERGRapYUnxTpItRq4QRQc4BlJdJmAN/gtUyF0yqVBWwEupZIPwZYEcb6IiIiIiJSA4b1HBbpItRq5QZQzrlcIDc4zczygG3OuZX+fCu8lqR4P0tnM8sFcpxzOc45Z2YPA382sy+Az4Ar8IYzv6VKjkRERERERKSahT2MeTkuwWuVKpLm//0zkArgnPurmTUCHgVaA18CFzjnPq+iMoiIiIiIiFSrSgVQzrm+JebTgfQw1nsIeKgy+xQREREREYm0ijwHSkREREREpF5TACUiIiIiIhImBVAiIiIiIiJhUgAlIiIiIiISJgVQIiIiIiIiYVIAJSIiIiIiEiYFUCIiIiIiImFSACUiIiIiIhImBVAiIiIiIiJhUgAlIiIiIiISJgVQIiIiIiIiYVIAJSIiIiIiEiYFUCIiIiIiImFSACUiIiIiIhImBVAiIiIiIiJhUgAlIiIiIiISJgVQIiIiIiIiYVIAJSIiIiIiEiYFUCIiIiIiImFSACUiIiIiIhImBVAiIiIiIiJhUgAlIiIiIiISJgVQIiIiIiIiYVIAJSIiIiIiEiYFUCIiIiIiImFSACUiIiIiIhImBVAiIiIiIiJhUgAlIiIiIiISpphIFyAqJSZCdnboZXl5sGVL6euJiIiIiEjUUgBVGYsWlb4sNdWbRERERKR2qcyP4PoBXEpQACUiIiIi9YN+BJcqoHugREREREREwqQASkREREREJEwKoERERERERMKkAEpERERERCRMCqBERERERETCpABKRERERCQpKdIlkCihAEpEREREZNiwSJdAooQCKBERERERkTApgBIREREREQmTAigREREREZEwKYASEREREREJkwIoERERERGRMCmAEhERERERCVNMpAtQ16RnppOenhHpYlRIxrCMSBdBRERERCQqqAWqiuW0aRLpIoiIiIiISDWJuhaoiRMnMnbsWG6++WaefPJJAF577TWmTZvG8uXL2bp1KwsXLqRv374h13fOccEFFzB//nz+8Y9/MHDgwLD2+9JLL3HllVdy0UUX8c9//jOQnpqayp///OdieQ//Zy45OTmVO0AREREREam1oqoFaunSpaSlpdGjR49i6Xl5efTu3ZvHHnus3G08+uijNGzYsEL7XbduHXfeeSdnnnlmyOVdu3Zl06ZNgWnFihUV2r6IiIiIiESHqGmB2r59O0OHDmX69Once++9xZZdffXVAGzdurXMbSxbtozJkyfz6aefcvjhh4e13/z8fIYMGcKECRNYuHBhyH3ExMSQkJAQ5pGIiIiIiEi0ipoWqJEjRzJw4EDOPvvsSq2/c+dOhgwZwrRp0zjssMPCXm/s2LEkJSVx7bXXlppn3bp1HHnkkRx11FEMHjyYdevWVaqMIiIiIiJSu0VFC9SWLVtwzjFz5sxKb+PGG2/k/PPP58ILLwx7nX/961+8/PLLZGZmlprnlFNOIT09nWOPPZbNmzdz//3307t3b7788ktat25d6fKKiIiIiEjtU+sDKDPrGhMTw/z582nUqFGltjFz5kw+//xzli1bFvY6W7duZdiwYbz44ou0bNmy1HwXXHBBsflTTz2VTp068eyzz3L77bdXqrwiIiIiIlI71foACjitoKCA5OTkQEJhYSGLFi1i6tSp5OXl0bhx4zI38N577/HVV1/RvHnzYumDBg3itNNOY/HixQess3LlSjZt2kT//v0Dafv37we8e56+/PJLunbtesB6zZs3p1u3bnzzzTcVOkgREREREan9oiGAmnP88cfPePnllwMJw4cPp0uXLowZMyasVqkJEyZwxx13FEvr3r07jzzyCJdeemnIdU4++eQDRtMbN24cP/30E1OmTOGoo44Kud6ePXv473//y1lnnVVuuUREREREJLrU+gDKOZebkpJSrAUqNjaWVq1aBdK2bdvG+vXryc3NBWDNmjXEx8eTkJBAQkICRx55JEceeeQB2+7QoQOdOnUKzPfr149evXoxadIkYmNji+0TID4+npKtYXfccQcDBgygY8eObN68mfvuu4+8vLwyB50QEREREZHoFDWj8JXljTfe4MQTTwy0+owYMYITTzyRqVOnVmg7a9euZdOmTRVaZ8OGDQwZMoSuXbvy61//msaNG7N06VISExMrtB0REREREan9zDlXsRXMxgATgCnOuVv8tF8DNwC/ANoAZznnMkpZ34C3gfOAy51zr5a3z5SUFFeRASBEREREREQqy8w+dc6lhFpWoRYoMzsVGAF8UWJRLPAREM6wc6OBworsV0REREREpDYI+x4o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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.rcParams['figure.figsize'] = [12, 7]\n", "plt.rc('font', size=14)\n", "fig, ax = plt.subplots()\n", "\n", "stock['Date'] = pd.to_datetime(stock.index)\n", "stock['Date'] = stock['Date'].apply(mpl_dates.date2num)\n", "stock = stock.loc[:,['Date', 'Open', 'High', 'Low', 'Close']]\n", "\n", "candlestick_ohlc(ax, stock.values, width=0.6,\\\n", " colorup='green', colordown='red', alpha=0.8)\n", "date_format = mpl_dates.DateFormatter('%d %b %Y')\n", "ax.xaxis.set_major_formatter(date_format)\n", "fig.autofmt_xdate()\n", "fig.tight_layout()\n", "\n", "Highs['Date'] = pd.to_datetime(Highs.index)\n", "Highs['Date'] = Highs['Date'].apply(mpl_dates.date2num)\n", "min_date_high = min(Highs.Date)\n", "max_date_high = max(Highs.Date)\n", "for i in range(len(res)):\n", " mu = Highs[Highs.High == res[i]].Date.values[0]\n", " plt.hlines(res[i], xmin = max(min_date_high, mu - 2), xmax = min(mu + 2, max_date_high), color = 'red')\n", " plt.text(x = mu - 2, y = res[i] + 0.1, s = str(res[i]))\n", " \n", "Lows['Date'] = pd.to_datetime(Lows.index)\n", "Lows['Date'] = Lows['Date'].apply(mpl_dates.date2num)\n", "min_date_low = min(Lows.Date)\n", "max_date_low = max(Lows.Date)\n", "for i in range(len(res)):\n", " mu = Lows[Lows.Low == sup[i]].Date.values[0]\n", " plt.hlines(sup[i], xmin = max(min_date_low, mu - 2), xmax = min(mu + 2, max_date_low), color = 'green')\n", " plt.text(x = mu - 2, y = sup[i]-0.3, s = str(sup[i]))\n", "\n", "plt.title('Supports and Resistances Using K-mean Clustering')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Test" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [], "source": [ "# Lows = pd.DataFrame(data = stock, index = stock.index, columns = ['Low'])\n", "# Highs = pd.DataFrame(data = stock, index = stock.index, columns = ['High'])\n", "# Low_centers, low_labels = get_optimum_clusters(Lows)\n", "# High_centers, high_labels = get_optimum_clusters(Highs)\n", "# Low_centers = Low_centers.flatten()\n", "# High_centers = High_centers.flatten()\n", "# Lows['labels'] = pd.Series(low_labels, index = Lows.index)\n", "# Highs['labels'] = pd.Series(high_labels, index = Highs.index)\n", "# # res = [max(Highs.loc[Highs.labels == i, 'High']) for i in np.unique(high_labels)]\n", "# # sup = [min(Lows.loc[Lows.labels == i, 'Low']) for i in np.unique(low_labels)]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# plt.rcParams['figure.figsize'] = [12, 7]\n", "# plt.rc('font', size=14)\n", "# fig, ax = plt.subplots()\n", "\n", "# # stock['Date'] = pd.to_datetime(stock.index)\n", "# # stock['Date'] = stock['Date'].apply(mpl_dates.date2num)\n", "# # stock = stock.loc[:,['Date', 'Open', 'High', 'Low', 'Close']]\n", "\n", "# # candlestick_ohlc(ax, stock.values, width=0.6,\\\n", "# # colorup='green', colordown='red', alpha=0.8)\n", "\n", "# stock['Close'].plot(ax = ax)\n", "\n", "# date_format = mpl_dates.DateFormatter('%d %b %Y')\n", "# ax.xaxis.set_major_formatter(date_format)\n", "# fig.autofmt_xdate()\n", "# fig.tight_layout()\n", "\n", "# # Highs['Date'] = pd.to_datetime(Highs.index)\n", "# # Highs['Date'] = Highs['Date'].apply(mpl_dates.date2num)\n", "# # min_date_high = min(Highs.Date)\n", "# # max_date_high = max(Highs.Date)\n", "# # for i in range(len(res)):\n", "# # mu = Highs[Highs.High == res[i]].Date.values[0]\n", "# # plt.hlines(res[i], xmin = max(min_date_high, mu - 10), xmax = min(mu + 10, max_date_high), color = 'red')\n", "# # plt.text(x = mu - 10, y = res[i] + 1, s = str(res[i]))\n", " \n", "# # Lows['Date'] = pd.to_datetime(Lows.index)\n", "# # Lows['Date'] = Lows['Date'].apply(mpl_dates.date2num)\n", "# # min_date_low = min(Lows.Date)\n", "# # max_date_low = max(Lows.Date)\n", "# # for i in range(len(res)):\n", "# # mu = Lows[Lows.Low == sup[i]].Date.values[0]\n", "# # plt.hlines(sup[i], xmin = max(min_date_low, mu - 10), xmax = min(mu + 10, max_date_low), color = 'green')\n", "# # plt.text(x = mu - 10, y = sup[i] - 2, s = str(sup[i]))\n", "\n", "# plt.hlines(Low_centers, xmin = stock.index[0], xmax = stock.index[-1], color = 'green')\n", "\n", "# plt.title('Supports and Resistances Using K-mean Clustering')\n", "# plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.8.8" } }, "nbformat": 4, "nbformat_minor": 4 }