{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Combination" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "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": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "from sklearn.cluster import KMeans\n" ] }, { "cell_type": "code", "execution_count": 24, "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(21, 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)random\n", " kmeans = KMeans(n_clusters = i, init='k-means++', max_iter=300, n_init=10,random_state =0)\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)\n", "\n", "def isSupport(df,i):\n", " support = df['Low'][i] < df['Low'][i-1] and df['Low'][i] < df['Low'][i+1] \\\n", " and df['Low'][i+1] < df['Low'][i+2] and df['Low'][i-1] < df['Low'][i-2]\n", " return support\n", "\n", "def isResistance(df,i):\n", " resistance = df['High'][i] > df['High'][i-1] and df['High'][i] > df['High'][i+1] \\\n", " and df['High'][i+1] > df['High'][i+2] and df['High'][i-1] > df['High'][i-2] \n", " return resistance" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "# Setup client\n", "finnhub_client = finnhub.Client(api_key = \"bt3efpf48v6tfcs816eg\")\n", "\n", "# Stock candles\n", "ticker = 'AAPL'\n", "start_time = int(datetime(2021, 5, 18, 0, 0).replace(tzinfo = timezone.utc).timestamp())\n", "end_time = int(datetime(2021, 6, 18, 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": "code", "execution_count": 26, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CloseHighLowOpenstatusvolumn
Date
2021-05-18124.85126.990124.7800126.560ok63342929
2021-05-19124.69124.915122.8600123.160ok92611989
2021-05-20127.31127.720125.1000125.230ok76857123
2021-05-21125.43128.000125.2100127.820ok79295436
2021-05-24127.10127.940125.9400126.010ok63092945
2021-05-25126.90128.320126.3200127.820ok72009482
2021-05-26126.85127.390126.4200126.955ok56575920
2021-05-27125.28127.640125.0800126.440ok94625601
2021-05-28124.61125.800124.5500125.570ok71311109
2021-06-01124.28125.350123.9400125.080ok67637118
2021-06-02125.06125.240124.0500124.280ok59278862
2021-06-03123.54124.850123.1300124.680ok76229170
2021-06-04125.89126.160123.8500124.070ok75169343
2021-06-07125.90126.320124.8321126.170ok71057550
2021-06-08126.74128.460126.2101126.600ok74403774
2021-06-09127.13127.750126.5200127.210ok56877937
2021-06-10126.11128.190125.9400127.020ok71186421
2021-06-11127.35127.440126.1000126.530ok53522373
2021-06-14130.48130.540127.0700127.820ok96906490
2021-06-15129.64130.600129.3900129.940ok62746332
2021-06-16130.15130.890128.4610130.370ok91815026
2021-06-17131.79132.550129.6500129.800ok96721669
2021-06-18130.46131.510130.2400130.710ok108953309
\n", "
" ], "text/plain": [ " Close High Low Open status volumn\n", "Date \n", "2021-05-18 124.85 126.990 124.7800 126.560 ok 63342929\n", "2021-05-19 124.69 124.915 122.8600 123.160 ok 92611989\n", "2021-05-20 127.31 127.720 125.1000 125.230 ok 76857123\n", "2021-05-21 125.43 128.000 125.2100 127.820 ok 79295436\n", "2021-05-24 127.10 127.940 125.9400 126.010 ok 63092945\n", "2021-05-25 126.90 128.320 126.3200 127.820 ok 72009482\n", "2021-05-26 126.85 127.390 126.4200 126.955 ok 56575920\n", "2021-05-27 125.28 127.640 125.0800 126.440 ok 94625601\n", "2021-05-28 124.61 125.800 124.5500 125.570 ok 71311109\n", "2021-06-01 124.28 125.350 123.9400 125.080 ok 67637118\n", "2021-06-02 125.06 125.240 124.0500 124.280 ok 59278862\n", "2021-06-03 123.54 124.850 123.1300 124.680 ok 76229170\n", "2021-06-04 125.89 126.160 123.8500 124.070 ok 75169343\n", "2021-06-07 125.90 126.320 124.8321 126.170 ok 71057550\n", "2021-06-08 126.74 128.460 126.2101 126.600 ok 74403774\n", "2021-06-09 127.13 127.750 126.5200 127.210 ok 56877937\n", "2021-06-10 126.11 128.190 125.9400 127.020 ok 71186421\n", "2021-06-11 127.35 127.440 126.1000 126.530 ok 53522373\n", "2021-06-14 130.48 130.540 127.0700 127.820 ok 96906490\n", "2021-06-15 129.64 130.600 129.3900 129.940 ok 62746332\n", "2021-06-16 130.15 130.890 128.4610 130.370 ok 91815026\n", "2021-06-17 131.79 132.550 129.6500 129.800 ok 96721669\n", "2021-06-18 130.46 131.510 130.2400 130.710 ok 108953309" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stock" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "__init__() got an unexpected keyword argument 'OMP_NUM_THREADS'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mLows\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstock\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mindex\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstock\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcolumns\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;34m'Low'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mHighs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstock\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mindex\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstock\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcolumns\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;34m'High'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mLow_centers\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlow_labels\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mget_optimum_clusters\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mLows\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[0mHigh_centers\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mhigh_labels\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mget_optimum_clusters\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mHighs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mLow_centers\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mLow_centers\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mflatten\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m\u001b[0m in \u001b[0;36mget_optimum_clusters\u001b[1;34m(df, saturation_point)\u001b[0m\n\u001b[0;32m 16\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msize\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 17\u001b[0m \u001b[1;31m# kmeans = KMeans(n_clusters = i, init='k-means++', max_iter=300, n_init=10, random_state=0)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 18\u001b[1;33m \u001b[0mkmeans\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mKMeans\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mn_clusters\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mi\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0minit\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'random'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmax_iter\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m300\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mn_init\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mOMP_NUM_THREADS\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 19\u001b[0m \u001b[0mkmeans\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 20\u001b[0m \u001b[0mwcss\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkmeans\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minertia_\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# Sum of squared distances of samples to their Closest cluster center\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py\u001b[0m in \u001b[0;36minner_f\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 61\u001b[0m \u001b[0mextra_args\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m-\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mall_args\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 62\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mextra_args\u001b[0m \u001b[1;33m<=\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 63\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 64\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 65\u001b[0m \u001b[1;31m# extra_args > 0\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mTypeError\u001b[0m: __init__() got an unexpected keyword argument 'OMP_NUM_THREADS'" ] } ], "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_km = [max(Highs.loc[Highs.labels == i, 'High']) for i in np.unique(high_labels)]\n", "sup_km = [min(Lows.loc[Lows.labels == i, 'Low']) for i in np.unique(low_labels)]\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", "xmin_res_km = []\n", "xmax_res_km = []\n", "for i in range(len(res_km)):\n", " mu = Highs[Highs.High == res_km[i]].Date.values[0]\n", " xmin_res_km.append(max(min_date_high, mu - 2))\n", " xmax_res_km.append(min(mu + 2, max_date_high))\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", "xmin_sup_km = []\n", "xmax_sup_km = []\n", "for i in range(len(sup_km)):\n", " mu = Lows[Lows.Low == sup_km[i]].Date.values[0]\n", " xmin_sup_km.append(max(min_date_low, mu - 2))\n", " xmax_sup_km.append(min(mu + 2, max_date_low))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "sup_pr = []\n", "res_pr= []\n", "levels = []\n", "for i in range(2, stock.shape[0]-2):\n", " if isSupport(stock,i):\n", " l = stock['Low'][i]\n", " sup_pr.append((i,l))\n", " levels.append((i,l))\n", "\n", " elif isResistance(stock,i):\n", " l = stock['High'][i]\n", " res_pr.append((i,l))\n", " levels.append((i,l))\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", "xmin_sup_pr = []\n", "xmax_sup_pr = []\n", "for support in sup_pr:\n", " xmin_sup_pr.append(stock.Date[max(0, support[0] - 2)])\n", " xmax_sup_pr.append(stock.Date[min(support[0] + 2, stock.shape[0])])\n", "\n", "xmin_res_pr = []\n", "xmax_res_pr = []\n", "for resistance in res_pr:\n", " xmin_res_pr.append(stock.Date[max(0, resistance[0] - 2)])\n", " xmax_res_pr.append(stock.Date[min(resistance[0] + 2, stock.shape[0])])" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[]\n", "[]\n" ] } ], "source": [ "print(res_pr)\n", "print(sup_pr)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "Shape of passed values is (3, 3), indices imply (13, 3)", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\internals\\managers.py\u001b[0m in \u001b[0;36mcreate_block_manager_from_arrays\u001b[1;34m(arrays, names, axes)\u001b[0m\n\u001b[0;32m 1701\u001b[0m \u001b[0mblocks\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_form_blocks\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marrays\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnames\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxes\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1702\u001b[1;33m \u001b[0mmgr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mBlockManager\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mblocks\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxes\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1703\u001b[0m \u001b[0mmgr\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_consolidate_inplace\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\internals\\managers.py\u001b[0m in \u001b[0;36m__init__\u001b[1;34m(self, blocks, axes, do_integrity_check)\u001b[0m\n\u001b[0;32m 142\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mdo_integrity_check\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 143\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_verify_integrity\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 144\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\internals\\managers.py\u001b[0m in \u001b[0;36m_verify_integrity\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 322\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mblock\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0mmgr_shape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 323\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mconstruction_error\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtot_items\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mblock\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 324\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0mtot_items\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mValueError\u001b[0m: Shape of passed values is (3, 3), indices imply (13, 3)", "\nDuring handling of the above exception, another exception occurred:\n", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mres_km\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m{\u001b[0m\u001b[1;34m'res'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mres_km\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'xmin'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mxmin_res_km\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'xmax'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mxmax_res_km\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0msup_km\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m{\u001b[0m\u001b[1;34m'sup'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0msup_km\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'xmin'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mxmin_sup_km\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'xmax'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mxmax_sup_km\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mres_pr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m{\u001b[0m\u001b[1;34m'res'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mres_pr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'xmin'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mxmin_res_pr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'xmax'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mxmax_res_pr\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mres_pr\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[1;36m0\u001b[0m \u001b[1;32melse\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0msup_pr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m{\u001b[0m\u001b[1;34m'sup'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marray\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msup_pr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'xmin'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mxmin_sup_pr\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'xmax'\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mxmax_sup_pr\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msup_pr\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[1;36m0\u001b[0m \u001b[1;32melse\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\frame.py\u001b[0m in \u001b[0;36m__init__\u001b[1;34m(self, data, index, columns, dtype, copy)\u001b[0m\n\u001b[0;32m 527\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 528\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdict\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 529\u001b[1;33m \u001b[0mmgr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0minit_dict\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 530\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mma\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mMaskedArray\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 531\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mma\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmrecords\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mmrecords\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\internals\\construction.py\u001b[0m in \u001b[0;36minit_dict\u001b[1;34m(data, index, columns, dtype)\u001b[0m\n\u001b[0;32m 285\u001b[0m \u001b[0marr\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0mis_datetime64tz_dtype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marr\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32melse\u001b[0m \u001b[0marr\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0marr\u001b[0m \u001b[1;32min\u001b[0m \u001b[0marrays\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 286\u001b[0m ]\n\u001b[1;32m--> 287\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0marrays_to_mgr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marrays\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata_names\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 288\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 289\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\internals\\construction.py\u001b[0m in \u001b[0;36marrays_to_mgr\u001b[1;34m(arrays, arr_names, index, columns, dtype, verify_integrity)\u001b[0m\n\u001b[0;32m 93\u001b[0m \u001b[0maxes\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 94\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 95\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mcreate_block_manager_from_arrays\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marrays\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0marr_names\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxes\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 96\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 97\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\Anaconda3\\lib\\site-packages\\pandas\\core\\internals\\managers.py\u001b[0m in \u001b[0;36mcreate_block_manager_from_arrays\u001b[1;34m(arrays, names, axes)\u001b[0m\n\u001b[0;32m 1704\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mmgr\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1705\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mValueError\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1706\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mconstruction_error\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marrays\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0marrays\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0maxes\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0me\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1707\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1708\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mValueError\u001b[0m: Shape of passed values is (3, 3), indices imply (13, 3)" ] } ], "source": [ "res_km = pd.DataFrame({'res': res_km, 'xmin': xmin_res_km, 'xmax': xmax_res_km})\n", "sup_km = pd.DataFrame({'sup': sup_km, 'xmin': xmin_sup_km, 'xmax': xmax_sup_km})\n", "res_pr = pd.DataFrame({'res': np.array(res_pr)[:,1], 'xmin': xmin_res_pr, 'xmax': xmax_res_pr})if len(res_pr) != 0 else []\n", "sup_pr = pd.DataFrame({'sup': np.array(sup_pr)[:,1], 'xmin': xmin_sup_pr, 'xmax': xmax_sup_pr})if len(sup_pr) != 0 else []" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "res = res_km.append(res_pr)\n", "res = res[~res.duplicated(keep = 'last')].reset_index()\n", "\n", "sup = sup_km.append(sup_pr)\n", "sup = sup[~sup.duplicated(keep = 'last')].reset_index()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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VdVljsoMucDCDVv6lrZwwyXeOy7u0q6rQjSSJCIiIiIiUoiCJBERERERkUIUJImIiIiIiBSiIElERERERKQQBUkiIiIiIiKFKEgSEREREREpREGSiIiIiIhIIQqSREREREREClGQJCIiIiLXlKSkJAYMGEDTpk0xxhAfH++U/8ILL9C2bVu8vLxo0KAB4eHhrFu3zqlMTk4Of/7zn2nUqBFeXl4MGDCAQ4cOXfDeU6dOpW3btnh6etKsWTOefPJJMjMzHfmnT59mzJgxBAYG4unpSa9evdi4cWO59FvKTkGSiIiIiFxTMjMzCQ4OZurUqXh6ehbLb9OmDTNmzCAlJYW1a9cSFBRE//79+eWXXxxlxowZw5IlS1i4cCHffPMNp06d4q677iIvL6/E+37wwQeMHz+e6Ohodu7cyfz581mxYgWjR492lHn44YdZuXIl8+bNIyUlhb59+9KnTx8OHz5cvg9BSmUsy6rsNpSbbt26WZs2barsZoiIiIjIVcLb25u3336bqKioEsucOnUKHx8fvvjiC/r168fJkyfx8/Nj7ty53H///QD8/PPPBAYG8vnnn9OvXz+X9Tz11FOkpKTw9ddfO9JiY2NZsmQJ27Zt48yZM9StW5clS5Zw9913O8p07dqVO+64g5dffvmi+xc4JRC/On4u846cPkJA3QCXecezj3NwzMGLvh8AcXH24ypgjNlsWVa3oukaSRIRERERKcG5c+d47733qFevHiEhIQBs3rwZm81G3759HeWaN29Ou3btir2WV9itt95KcnIyGzZsACA1NZVly5YREREBQG5uLnl5edSuXdvpOk9PT9auXVvOPZPSuFd2A0REREREqppPP/2UIUOGkJ2djb+/P6tWraJx48YApKWl4ebmRqNGjZyuady4MWlpaSXWOWTIEE6cOEHv3r2xLIvc3FweeOAB/va3vwFQt25dbr75Zl5++WWCg4Np0qQJCxcuZP369bRu3briOivFaCRJRERERKSIsLAwkpOTWbduHf3792fQoEEcPXq01Gssy8IYU2L+119/zUsvvcTMmTPZsmULH3/8MYmJicTGxjrKLFiwgBo1atCsWTNq1arFtGnTGDp0KG5ubuXWN7kwBUkiIiIiIkV4eXnRunVrevbsyZw5c6hZsyb/+Mc/AGjSpAl5eXmkp6c7XXPs2DHHaJMrMTExDB06lIcffpiOHTtyzz338Morr/Daa6+Rm5sLwPXXX8/XX39NZmYmP//8M9999x02m42goKCK66wUoyBJREREROQC8vPzycnJAewLKdSsWZNVq1Y58g8dOsTOnTvp1atXiXVkZ2cXGxFyc3PD1UJqXl5e+Pv789tvv7Fy5UqnhRyk4mlOkoiIiIhcUzIzM9m7dy9gD35SU1NJTk7G19eX+vXr89prrxEZGYm/vz/Hjx9nxowZHDp0iEGDBgHg4+PDQw89xLhx47juuuto2LAhzzzzDJ06daJPnz6O+4SHh9O9e3cmT54MQGRkJG+++SbdunWjR48e7N27lxdeeIG77roLd3f7r+UrV64kPz+ftm3bsnfvXsaNG0ebNm0YNWrUFX5K1zYFSSIiIiJyTdm0aRNhYWGO89jYWGJjYxk5ciQzZ85k+/bt/POf/+TEiRM0bNiQm266iaSkJDp16uS45q233sLd3Z3Bgwdz5swZwsPDmT9/vtNI0b59+2jevLnjPCYmBmMML7zwAocOHaJRo0ZERkYyadIkR5mTJ0/y/PPPc+jQIXx9fbn33nuZNGkSNWvWrOCnIoVpnyQRERERkWpK+ySVTvskiYiIiMhVIykpiQEDBtC0aVOMMcTHxzvlv/DCC7Rt2xYvLy8aNGhAeHh4sT2KcnJy+POf/0yjRo3w8vJiwIABHDp06IL3PnXqFP/v//0/AgICqFWrFq1bt+bDDz8sz+5JFafX7URERESkysnMzCQ4OJgRI0YwYsSIYvlt2rRhxowZBAUFcebMGd566y369+/Pnj17HCvMjRkzhoSEBBYuXGifN/T733NX27Zs7toVtxKW6rbl59M3OZkG7u58GBhIsxYtOJSTQ61XX4WZMyu0zxVh0aFf8HD71WXerI45PJZy2mXeuTwbLA29tJuGXuJ1VYiCJBERERGpciIiIoiIiAAgKiqqWP7w4cOdzt98803mzJlDcnIy/fr14+TJk8yZM4e5c+fyhz/8AYAFbdsS+O23fPnbb/Tz9XV537lpaRyz2UgKCcGjhv2lq5a1a5djzy5SWho0aVJ5979GKUgSERERkavauXPneO+996hXrx4hISEAbN68GZvNRt++fR3lmm/YQLsOHVh3zz30mzjRZV1LIyK4pUcP/lynDgkJCfj6+jJo0CCio6MrZ/GEy5zfM+QCc5K29C1tTlLipd30KpmPVBoFSSIiIiJyVfr0008ZMmQI2dnZ+Pv7s2rVKserdmlpabi5udGoUSOnaxo3bkxaWlqJde7fv5+vvvqKYcOG8dlnn3HgwAGefPJJMjMzef311yu0P1J1KEgSERERkatSWFgYycnJpKenM3v2bAYNGsT69evx9/cv8RrLsjAlzEcC+75J1113HbNnz8bNzY2uXbty4sQJnn76af7+97+Xeq1UH1rdTkRERESuSl5eXrRu3ZqePXsyZ84catasyT/+8Q8AmjRpQl5eHunp6U7XHDt2zDHa5Iq/vz833nij035H7dq1Izs7u1hdUn0pSBIRERGRaiE/P5+cnBwAunbtSs2aNVm1apUj/9ChQ+zcuZNevXqVWMctt9zC3r17yc/Pd6Tt3r2bOnXqFHt1T6ovBUkiIiIiUuVkZmaSnJxMcnIy+fn5pKamkpycTGpqKqdOnSImJoZvv/2W1NRUNm/ezIMPPsihQ4cYNGgQAD4+Pjz00EOMGzeOL7/8ku+//54HHniATp060adPH8d9wsPDef755x3njz/+OL/++iujR49m165drFy5ktjYWJ544gm9ancN0ZwkEREREalyNm3aRFhYmOM8NjaW2NhYRo4cycyZM9m+fTv//Oc/OXHiBA0bNuSmm24iKSmJTp06Oa556623cHd3Z/DgwZw5c4bw8HDmz5/v9Crdvn37aN68ueO8efPm/Oc//+GZZ54hJCSEJk2a8OCDDxITE3NlOn416d0bDh4snp6RAXPnur4mMBCSkiq0WeVBQZKIiIiIVDmhoaFYllVi/ieffHLBOmrXrs306dOZPn16iWUOHDhQLK1nz56sW7euTO28ph08CH4ulhe32Vynn7/mKqDX7URERERERArRSJKIiIiIVC2hoZXdgqrjwAFITLzkyxcd+gUPt19d5kU+WveS663uNJIkIiIiInK5StmgVq4+GkkSERERkarlMkZOKk1cnP2oYvUOmRKIX50S5gedPnLJ9VZ3GkkSEREREREpREGSiIiIiFwT4pPjK7sJcpVQkCQiIiIi14QDGQcquwlyldCcJBERERGpNnrP7c3Bk6734sk4m8HcZNebnAb6BJI0qupvcipXhoIkEREREak2Dp48WOJCBbY8W4l5JQVWUorAQNebw2ZlwfHjJV9zFVCQJCIiIiIiFy+phJG3ilrp7wrSnCQRERER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bU1MTLzoa6qacg2SLMtKpPT1Me4pQx1ngT8XHCIiIiIiIldUpe2TJCIiIiIiUhVVhYUbRERERESkAgT6BHLwpOt5UVm2LMdrda6uu5YpSBIRERERqaaSRpW8sl5cYhxxoXFXrjFXEb1uJyIiIiIiUoiCJBERERERkUIUJImIiIiIiBSiIElERERERKQQLdwgIiIiIlIWgYFw0PVKcWRlwXEXK8UFVt1V4lrWb1nZTaiyFCSJiIiIiJRFUskrxREXZz+uIlEhUZXdhCpLr9uJiIiIiIgUoiBJRERERESkEAVJIiIiIiIihShIEhERERERKURBkoiIiIiISCEKkkRERERERApRkCQiIiIiIlKI9kkSERERkSolND70kq/9JfMXfj3zq8u8nNwcTp877TLPlme7rPtGJR8gPj7xkq+/0vUCJEZVTL3VgUaSREREREQuU1qj2pXdBClHxrKsym5DuenWrZu1adOmym6GiIiIiFSSwCmB+NXxc5l35PQRAuoGuMw7nn2cg2MOVmTTLk1cnP2QCmGM2WxZVrei6RpJEhERERERKURBkoiIiIhUOUlJSQwYMICmTZtijCE+Pt6RZ7PZmDBhAp06dcLLywt/f3+GDRtGamqqUx05x3PY984+fhj7A9+P/p7f5v+G7ZSt1Pt+9NFHdOvWjfr16+Pl5UVISAjz5s1zKnP69GnGjBlDYGAgnp6e9OrVi40bN5Zb36XyKUgSERERkSonMzOT4OBgpk6diqenp1NednY2W7ZsITo6mi1btpCQkMDPP/9M//79sfLsU0nycvLYPWU3lmVxw9M30HZ8W6w8i70z9mLllzzdpGHDhsTExLBhwwa2bt3KqFGjeOihh1ixYoWjzMMPP8zKlSuZN28eKSkp9O3blz59+nD48OGKeRhyxWlOkoiIiIhUad7e3rz99ttERUWVWGbHjh106NCBJuOa0LR1U07tOMWeaXvo/EZn3L3sCzofOnaIX178hRtG30C9dvWcri9tTtLvfvc7+vXrx+TJkzlz5gx169ZlyZIl3H333Y4yXbt25Y477uDll1++/A4XpjlJFUpzkkRERESk2jp16hQANerYf73Nt+Xbz2v+79ddU9OAgcy9mWWq07IsVq9eza5du+jduzcAubm55OXlUbu282p2np6erF279rL7IVWDgiQRERERuaqdO3eOsWPHEhkZ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KrsZUkkCpwTiV8fPZd6R00cIqBvgMu949nEOjjlYkU2TKsgYs9myrG5F0zWSJCIiIiIiUoiCJBERERG5ppzefZq9M/aydcJWNj+2mfR16Y48m83GhAkT6NSpE15eXvj7+zNs2DBSU1Od6khLS+OBBx6gSZMmeHl50blzZ95///0yt+H85st33XVXsbyjR48ycuRI/Pz8qF27Nu3bt+frr7925H/88cf069cPPz8/jDEkak5budPCDdVQUlISr7/+Ops3b+bIkSPMnTuXqKgowP6DHxMTw+eff86+ffuoV68eYWFhvPrqq7Ro0cJRR1paGuPGjWPVqlWcPn2a1q1bM378eO6///5S771kyRJeeOEF9u3bx/XXX8+kSZOcdlOvNjSR+crQP/oiIlIB8nPy8QzwpGHPhvw09yenvOzsbLZs2UJ0dDQhISGcPHmSsWPH0r9/f7Zu3Yq7u/3X5xEjRvDrr7+SkJCAn58fn3zyCQ888ADNmzend+/epd5///79jBs3jttuu61YXkZGBrfccgu33norn332GX5+fuzfv5/rrrvOUSYrK4tevXoxfPhwRowYUQ5PRIpSkFQNZWZmEhwczIgRI4r94FTkD/769esZPHgwEydO5I9//CMff/wxAwcO5L///S89evSo8H7LBaSlQZElyEVERK5FPh198OnoA8CBeQec83x8WLVqlVParFmz6NChAzt37qRjx44ArFu3junTpzt+xxk7dizTpk3ju+++KzVIstlsDB06lEmTJrFmzRrS09Od8l977TX8/f2ZP3++Iy0oKMipzAMPPABQ7FopPwqSqqGIiAgiIiIAHCNI51XkD/6UKVMICwsjOjoagOjoaNasWcOUKVNYuHBheXax8l2NIxxxcfZDRERELsqpU6cAaNCggSPt1ltv5cMPP2TAgAE0aNCA5cuXc/z4cfr06VNqXdHR0bRs2ZKRI0eyZs2aYvlLly6lf//+DB48mDVr1hAQEMDDDz/Mk08+iTGmfDsmJdKcJCn1B//EiRPk5+eTkJBwwR/89evX07dvX6e0fv36sW7duoppuIiIiEgFO3fuHGPHjiUyMpJmzZo50j/88EOMMTRq1IhatWpx//33s3DhQkJCQkqs6z//+Q+LFy/m3XffLbHM/v37mTlzJq1atWLlypWMHj2a5557jhkzZpRnt+QCNJJ0jSvtB3/I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TubceCMNLrD3k4i4pp8cKZP45HiiQqIquxkiIlJdJCZWYN1xUBGvVMXF2Y/CvL3hueeg4HU7V05t2AA330yDpUuhWbNi+T/99BOrW7XiwwUL4L77Sm1C9PjxtPT3Z+TixayJioL0dCjyut2jgwdz3y238Pu//Y2/VuSInUg1piBJykR794iIiFy8c+fOMXbsWCIjI2nmIkAC+15NjerU4e67S98S8j//+Q+LFy8mOTm5xDKzZ89m7969LFiw4HKaLXLNU5AkIiIiUgFyc3MZPnw4GRkZLFu2rMQy8fHxRIWEULNmzRLrSk9PJyoqig8++IAGDRq4LLNr1y7+8pe/8M033+Dh4VEufRC5VilIEpGqKz6+1FdYRESqqtzcXIYOHUpKSgqJiYk0bNjQZbnly5dz9OhRHi5hE9zztm3bxtGjR+nTp48j7fweT+7u7mzfvp3169eTnp5OcHCwo0xeXh5JSUm8++67ZGVlUatWrXLonUj1pyBJRKouF5s/iohUdTabjSFDhrBt2zYSExNp0qRJiWVnz57N7bffzo0lBFHn3XTTTaSkpDilxcTE8NtvvzFjxgyCgoJo3Lgx3bp1cyozatQobrjhBv7yl79odEnkIihIEhEREbkImZmZ7N27F7CP5qSmppKcnIyvry8BAQEMHDiQjRs3snz5cowxpBWsiufj44NnodXrUlNTWblyJfPnz4c9e4rdJzw8nO7duzN58mS8vLycRogA6tevT25uriPdw8OD+vXrO5Xx8vLC19e32LUiUjotAS4iIiJyETZt2kSXLl3o0qULZ86cITY2li5duvDiiy9y6NAhEhISOHLkCF27dsXf399xLF682KmeOXPm4OPjw70lvGq3b98+jh49eiW6JCJFaCRJRERE5CKEhoZiWVaJ+aXlFTZx4kQmTpxYYv6BC7xyHF+wgW1pEityqXWRakwjSSIiIiIiIoUoSBIRERERESlEr9uJiIiIlEV8PFTU62sHDlRc3VcjPQupZBpJEhEREanG4pukVXYTRK46GkkSERERKYuoKIiLq5i64+IqrO4DiXEQWjF1i1RXGkkSkctXhhWWRERERK4WCpIqUVJSEgMGDKBp06YYY5yW8rTZbEyYMIFOnTrh5eWFv78/w4YNIzU1tVg93333HX/4wx/w9vambt269OrVi/T09BLva7PZ+Otf/8r1119P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kqJCkoiIiIiISIoKSSIiIiIiIikqJImIiIiIiKSokCQiIiIiIpKiQpKIiIiIiEiKCkkiIiIiIiIpKiSJiIiIiIikqJAkIiIiIiKS0jTXByBbrmurriz5dEmVy0rXl/Lhug+r3U5EpD71ndw314ewxYbNW8zkySW5PowtUjKsJNeHICLSoKiQFKGZp8+sdtmYkjGM6Tum/g5GRKSBWdmuea4PQUREckyFJBERyZooaziGwYhcH4OIiOSUnkkSERERERFJUSFJREREREQkRYUkERHJupkzZ/L973+fHXfcETNj8uTJFcvWr1/PL37xC3r16sV2221Hp06dOPnkk1m6dOlG+zjjjDPYddddadGiBe3bt2fAgAEsXLiwxt/76quvctJJJ9G9e3fMjDFjxmyyzh133EGvXr1o2bIlLVu25Lvf/S7Tpk2ri5ctIiKRUiFJRESybu3atfTo0YNbbrmFFi1abLRs3bp1zJ07l6uuuoq5c+fy6KOP8u6773LcccdRVlZWsV7v3r2ZPHkyCxcu5K9//SvuTr9+/Vi/fn21v3fdunV069aNa6+9ll122aXKdXbaaScmTJjA3LlzmTNnDkceeSQ/+MEPmD9/ft28eBERiY65e66Poc707t3b58yZk+vDyCn1bici+a6oqIjbb7+dYcOGVbvOa6+9xj777MP8+fPp2bNnlevMnz+ffffdl9dff5099thjs7+3R48enHTSSVXWJlXWpk0bxo0bx1lnnbXZdUVEJF5m9pK79648X73biYhI3vnss88AaN26dZXLS0tLmTRpEl26dKFbt2519ns3bNjAQw89xNq1azn44IPrbL8iIhIXNbcTEZG88tVXX3HppZdSXFzMTjvttNGyiRMnUlRURFFREU888QTPPPMMhYWFW/07FyxYQFFREYWFhZx99tn85S9/qbYGS0REGj7VJOVANkegX7x6MSWLS7K2/2yIchwVEcmKsrIyTj31VFavXs1jjz22yfJTTjmFo48+mvfee48bbriBgQMH8txzz7Httttu1e/dY489mDdvHqtXr2bKlCkMHTqUkpISevTosVX7FRGROKmQ1MA0b6qR4kUkTmVlZQwZMoQFCxZQUlJC27ZtN1mnVatWtGrVit13352DDjqI1q1bM2XKFE477bSt+t3NmjVjt912A0IHEbNnz+amm27innvu2ar9iohInFRIygHVnIiIbGz9+vUMHjyYV155hZKSEjp27LjZbdwdd+fLL7+s8+MpLy/Pyn5FRCQOKiSJiEjWrV27lkWLFgGhALJ06VLmzZtHmzZt6Ny5MwMHDmT27Nk8/vjjmBkrV64EQs1RixYtWLRoEVOmTKFfv360b9+eZcuWMX78eAoLC+nfv3/F7znqqKM48MADGTduHBCeb3rttdcA+OKLL1i5ciXz5s2jqKioouZoxIgRnHDCCey8886sWbOG+++/n5KSEo2VJCLSiKkLcBERybqSkhKOOOKITeYPHTqUMWPGVDuG0aRJkxg2bBjvvvsuZ555Ji+99BKrV6+mQ4cOHHbYYYwaNYo999yzYv1u3brRt2/fisFqFy9eXOW+Dz/8cEpKSgAYNmwYzz77LCtXrqRVq1b06tWLyy+/nGOPPXbrX7iIiOS16roAVyEph2bOnMkNN9zASy+9xIoVKyouBiA0PRk5ciRPPPEEb7/9Ni1btuSII45g/PjxdOnSBYCPP/6Y0aNH89RTT7FkyRLatWtH//79ufbaa6tsy592yy23cOedd7JkyRLatm3LgAEDmDBhAkVFRRXrvPfee4wYMYLp06ezZs0aunfvzp133snhhx+etb+JiIiIiEh9qa6QpC7Ac2hrR6BfsWIFy5cv5/rrr2fBggXcd999zJw5kyFDhtT4e++//36uuOIKrrrqKhYuXMi9997L9OnTueiiiyrWWb16NYcccgjuzrRp01i4cCG33XYbO+ywQ93/IURERERE8ohqkvJEXY1AP336dPr378/q1atp2bJlleucf/75LFiwgBkzZlTMGz16NFOmTOGVV14B4Morr2TGjBk899xz3/xFiYiIiIjkMdUkNQCbG4E+s05hYWGNY4YceuihzJs3j1mzZgGwdOlSHnvsMY4//viKdR555BH69OnDoEGD2GGHHdhvv/24/fbbaUiFahERERGRqqh3u0jUNAJ9xurVqxk1ahRnnHEGTZtWH+3gwYNZtWoVhx12GO5OWVkZp512GhMmTKhY55133mHixIlccskljBgxgnnz5nHBBRcAoSZKRERERKShUk1SBNIj0E+aNKnKdUpLSykuLmbHHXfk+uuvr3F/M2bM4JprrmHixInMnTuXhx9+mJKSEkaPHl2xTnl5Ofvvvz/jxo3j29/+NqeffjoXXnghd9xxR52+NhERERGRfKOapDxXmxHo165dW9FUburUqTRv3rzGfY4cOZIhQ4YwfPhwAHr27ElpaSnDhw/n6quvpmnTpnTq1Im99957o+322msvbrnlljp6ZSIiIiIi+UmFpDxWmxHo16xZw/e+9z3cnSeffHKjLryrs27dOgoKCjaaV1BQsNHzRocccghvvPHGRuu8+eabdO3a9Ru+GhERERGROKiQlENbOwL9mjVrOOaYY/jss8945JFHKC0tpbS0FIA2bdrQrFkzYNMR6IuLi7nxxhvp3bs3ffr0YdGiRYwaNYr+/ftXPMt0ySWXcPDBBzN27FgGDRrEyy+/zK233sp1111X338mEREREZF6pS7Ac2hrR6CvbnuAZ599lr59+wKbjkBfVlbG2LFjue+++1i2bBnt2rWjuLiYsWPHbtRz3rRp07jyyit544036NKlC+effz4XXHABZrZ1L1xEREREJA9U1wW4CkkiIiIiItIoaZwkERERERGRWlAhSUREREREJEWFJBERERERkRQVkkRERERERFIaVMcNZvYhsCTXx1EL7YCPcn0QslWUYfyUYfyUYdyUX/yUYfyUIXR19/aVZzaoQlIszGxOVb1oSDyUYfyUYfyUYdyUX/yUYfyUYfXU3E5ERERERCRFhSQREREREZEUFZJy43e5PgDZasowfsowfsowbsovfsowfsqwGnomSUREREREJEU1SSIiIiIiIikqJImIiIiIiKSokCQiIiIiIpKiQlIdMjNLf5X4KMP4KcO4mdl3zKxL8n1Bro9Htozyi58yjJ8yrBsqJNUBM9vTzKYAF+T6WOSbUYbxU4ZxM7OOZvYA8CIwBsDdN+T0oKTWlF/8lGH8lGHdUiFpK1hwLjAd6Av82Mx2dnc3M/1tI6AM46cM42dm7YC7gFbAH4GeZnZMskx3QfOc8oufMoyfMqx7uoDYOgXAIcC9wCWEv+cFAO5ensPjktpThvFThpFz94+AWcCvgRuBlcA5ZtbE3Teo6WR+U37xU4bxU4Z1T+MkfUNmZsmd6p7AMnf/xMyuB44CznP3WWZWoGrO/KUM46cM42RmHYBP3f2L1Lxm7v5V8v15wHBgorvfnXzIq8CbJ5Rf/JRh/JRh9qmQVEtm1g34AfA+8G93f62KdQ4CrgHed/dT6/UAZbOUYfyUYdzMrBNwO7AjYMA04Nfu/nnSNNKSO56dgQlAF2CQu6/UB3zuKb/4KcP4KcP6o+Z2m5E873AD8Crh7vQtwH1mVpwsb5KpwnT3WcDfgB5mNiizPDdHLhnKMH7KMH5mdgowGygHrgT+Dfww+R53L8/U+Ln7CuBRoDlwbmZ5JmM1G6l/yi9+yjB+yrB+6cKhBmZWBPwGOBg42t2LgWOBBcCZUPGGTD8g/jDwFvBTM2sBtDOz/ZP96Q1Zz5Rh/JRh/MysI3Ac8Ht3H+jufyd8aM8AdjOz5ql1M/lMA54HjjGzo8zsZkJbe1xNIOqV8oufMoyfMqx/KiTVrGXydaK7Pw/g7i8Tmvo0M7NmqbvX5cnXt4FHgDbAn4HFwE3JMr0h658yjJ8yjF8BUAJMglCz5+5lQFOgbbpNfVLYNXf/HJgKdACeAgYCM+v7wAVQfg2BMoyfMqxnTXN9APnEzFoDHYG3kwffVgJ3JBdcmTdkObAa2JB5OC61vSUXYOuBbwOrgEvc/bf1+DIaNWUYP2UYtyS/qwh//3nAg+6+HLinitU7A3OT7TK5ZT7gDwauA9oC57r7XfVw+I2e8oufMoyfMswPqklKmNkE4E3C3ed/mNmJSROezIWZ+dcPux1HGKgLM6soaCZvyP8BHiA8VNcxc2GWXk+yQxnGTxnGzcxOABYBPYEDCH//+82sbbI885mTqc3bldBlbVU1fAOAd4AOmQ925Zddyi9+yjB+yjCPuHujn4DLgNeB/wb6A78FPie8uZok61gydQKWA0dUs68ewC6pn5vm+vU1hkkZxj8pw/gnYDLwx+T7FkDvJMPxhOYgpLLsBXwI7Jja/oDU902Un/LTpAwb26QM82dq1DVJFnrEagYcDcxw93+4+1R3Pwt4BrgC6JNZ38O7bHeglKTUbmY/MrMnUuu84u7/MbOCVHtRyRJlGD9lGLfM82BmtgNwOPBCsugrd58DjCL0vnQUbDTA70BCN+7Lzew4M1sETDOzwvR6yi+7lF/8lGH8lGF+anSFpMwbESp6xPoK2I3QxAcLPWEBXEx4LqK/mW2XXJgB9AP+Regt61ngXlJtQVP73pB6E0sdUobxU4ZxM7NtzGxvM2uRycTdPwDWEnKE5JlXd7+B8PzYgExzkcRuwHIz+xPhweL73b2ju3+Z/l3Kr+4pv/gpw/gpwwjkuiqrPidCV4m/JnQb3C01/7fA/NTPBcnX8YSLti7Jz80JfdJ/SXiY7gGgRa5fV2OalGH8kzKMewJ+TmgvPw+YD5ydzN8GuBpYBrRO5hUmXwcRPvh3Sn5uCXxCGOvjQaBdav9qEqL8NCnDBj0pwzimRlGTZGZHmtnbhIuyLsBIwoPhGU8Drc3stOTnzENt44DuwLeSn1sCawjdJ+7r7oM9jHDcNH33WuqeMoyfMoybmXU2swcJ+Y0gNIN8GphoZju4+3rgOeADYHSy2Ybk62OEQu13k5+3I4x9tZ+7/9jdP8rk52oSkhXKL37KMH7KMDK5LqVleyI88PYCoT3nNoQLrz2Az4ChyTpdgT8ArwDbpLbtDPwHOCM1b9fU9wWkHorTpAw1KcOGOhGeGXse6JWa1xJ4Dbgo+XlbQre1q4BDU+sdDCwFDqxiv02Un/LTpAwbw6QM45oaQ03SV8DbwL3uvt5D6fp94FVgBwB3XwL8kXDxdq+ZtU+27Zls/3RmZ/51V8QFrucd6osyjJ8yjN9C4Dp3n5+aV074QP8PgLuvI2T4JDDFzK60ME7HZYQBfd9K7zC541mu/OqF8oufMoyfMoyIJSXQBstCr1l4MuBk8mZyM3sHuMzdH07mNwEOAx4CPiV0RdwPuAP4BWHQyob9x8pTyjB+yrDhMbMCYGdC05AfuPvs1LKmwJ3AvkA7wjNlw9x9ZS6OVTal/OKnDOOnDPNbgykkZS66aljexL/uCrEH8AShXedy+HoALjPbD9iHcPd6SvoNK9mlDOOnDBuHVCH3RGCcu++ZWtbE3cuTAm8zwiCGS9LLcnTYklB+8VOG8VOG+a/BjLq7ubvLld5QRxIeivsgdVHW3N2/cPd5hN5GSOY3qWJ7yQJlGD9lGK9M08XarJvK+fvAi6l99CAM9rsgyeoLYEnSoUaT2u5ftpzyi58yjJ8ybFga1DNJZnaemR1Zw/JMobAvMMvdvzKzTmb2KHBeUu2ZXr+J2nnWL2UYP2UYp8wHr5l1yMzLFE4rs6AFcBDwqJm1MrN7CF3ZHljFvl0f7Nml/OKnDOOnDBuWKAtJVb3hkpL3L4Htq9vO3cuSbbsBU83sUkI/9e2A/6v85tNFWfYow/gpw/ilMzSzU83sTeAJM7vbzFqmmntsJLkDugvQAjiB8DDxt4C93P2e+jl6UX7xU4bxU4YNV5TN7dIXTWahTae7v2Jm64Ddk/nVtdk8CtgPeJzwHMQAd386va+svwBRhg2AMoxf8uHdHXDgLOBGoCPwE0J37CfWUEjtRRjv6iDgdHd/BCoeRC5Xhtmn/OKnDOOnDBuuKAtJZtYcuAF42N3/nsxrBvwT2C+5yKruDbmG0M3iWHf/32RbtfOsZ8owfsowPpULrWa2J2H8qg+Bu939ruTD+QVgupmd4O7Tqim4vgyc7O4PpPZX6/b4suWUX/yUYfyUYeOR983trNLzCYmOQFvgPjO7ECq6Fi4Hmru7V9cGFPg3sFvqwqyp2nlmlzKMnzJsGDIf7Gb2nWTWKkL36l0JAxxm2tTPBO4j3BGtskMOd38j88FuyXNmyi+7lF/8lGH8lGHjkbeFJAsq7iqb2X5mtgeAuy929yHA3cDPzOz3yWaPA0eaWWF1d7Dd/fPk4q0g+bks+6+mcVKG8VOGcauqkGpmw4EXzayTu38IPAy8CwzLbOPunxNqCduZ2SXV7StD+WWH8oufMoyfMmy88rKQlKmS9NDOc18zexH4M/Csmf3OzPokq14HnAccY2b3Ep6DeBE4YHO/QyX17FKG8VOGcavcJCTlCULvSdcnP78G3AKcYmY9Utu8BkwEfmNm/1VdgVeyQ/nFTxnGTxk2bnlTSDKz7c1sUObHZN5JwBRgFqG74MGEB9yuMLPt3P1Ld/8nMJTQj/z1hIEp1yTbW72+iEZOGcZPGcbNzAqSO5yZh4nNzH5lZqcky5u4+3JgHOHD/Lvu/gXhA38WcHNmX0kB9i7gDHdfXc8vpVFSfvFThvFThlLB3XM+EbpAXEt4lqFPav7xwFWpn88FPgeWApdXsZ/bgK+qWqZJGWpShg19AgYk+Z2Y/NwBeBBYXmm97YGpwL+Sn5sAPwRWA0Ny/Toa66T84p+UYfyTMtSUmfKlJqkVYZyU/wC3pub/k1BFubeZzSFcnJ1DaMoz2Mx2ATCzwmT9McCTQCFS35Rh/JRh/GYRupwdB+Du7xOyXG9m10DFXdA1wE1AbzMb5KEJyCyghDD6u+SG8oufMoyfMhQgR83tzGyb5GumC/J3gc7AJKCjmZ2dzF/roQrzCkLbz6PdfTLwKrAPcAmAu39poXesVUBzYNf6ei2NlTKMnzJseJIP8z8ArczsymT2AuD3wEVm1tm/bhP/MfAlMN7Mmrv7CkKTkCH1fuCNVOWmqMovfsowPjoPpTr1WkhK2nneCkw1s9ae9OSRXFT9HWhD6C5xdHKxVW5mXYADgXfc/T0LvWHtRHjD7m9mXZN9lJnZzkA7woNykgXKMH7KMH5VPeeVmvcS8L/AZWbWxt0/BR4D3iA8WJyxM6EJSTPgvwE89NJUXZfvUkfM7BDYuEtg5RcXnYPx03kom1PfNUn9Cb1gHQ1ca2anAphZC8KzECuBR/j64W+A9YRnH/7bzPoD1wI7Ar8AjnH3Jan9Xwd8ANyZ9VfSeCnD+CnDSJnZ/mbWCdg2+bniQi3zQZ80AfkTsIyvHyB+HbgG+JGZTTWzuwnPjk0Furv7U+nf4+p1MCvM7AwzW0m4AbFtepnyi4POwfjpPJRaq88HoAgXVTcTHmq7EFgODEqWjQT+lnx/BeFibbfk58GEN+G7hNGJe6f22QRomnzfoj5fT2OclGH8kzKMbwIOAmYDC4G3gBlA6xrW3wY4C1hXKacfEpqMPAUclc4v16+xIU/AoYQLrOVJdm9uZn3ll2eTzsH4J52HmrZ0siTYemNmRwKTCSMQLwauIoxK/AQwGjgRaAncC3zi7sXJnRoDvuXuryf7Ma/vgxdAGTYEyjAOFgYePItQYP0z4YN5b8JDxH9290usmnE8kiaQvwW2d/dDUvO3cff1yfcGVY8EL1sn+dtuS7iQ2pdwx3k0cBTwO+AEd/93DdsrvzygczBuOg9la9Rbc7tUlfRswvMOIwkXZBcC3wEeInSnWEa4aJsInGBmx3pQnrowK9Cbsf4pw/gpw+hsA5wA/M7dL3f3N9z9L4RR3E9ICqlVDk7ooQnknUAPS8a+SjJbn/relWF2JH/XDYTzaG93H+HuXwJOuAFRY1Mc5Zc3dA5GTOehbI06LSSZ2Ylmdo6ZHWJmRcm8JrBJO88HgPeBO939BeBk4DlgBVCe/MMpAS4iPDy3EVc7z6wxs8PN7AAz61h5mTKMg87DuJlZs8z3yYf5zcA9lVZrDSxxd9/Mw8HPE3K+NNlfRWbKLzsq5feFu5/s7ksy5yDwQvJ1/2T9mgZbVn45lNQQfUno5lnnYIQsdD6k81C+kTopJJnZvmY2j/BhPgh4HPg5hNGKq9hkIaGqerCZHejuy4CfuPvx7v5Zst0Kd7/N3T/azJtX6oCZHWRmLxO6f/4/4AUz61HDJsowz+g8jFuS3xPAH83sJjNrB+DuT7v7BxZkLsC7EzrYqPFD2kMvS3OB7cysZ5ZfQqNWRX5tU8vStQ3bE8Yj6w41N9FRfvXLzPYxs1+a2e7JrMxNpWd0Dsahcoae9N6aofNQtsRWF5KSD/KbCHec9wX6EZrsHGZm21e1TVJN+SThwblfJ/M+Tv4BbXQhlny4qBozSyx0B/1zQlvrJ4HDgOMJVdDnVLedMswvOg/jZmbFhO7XVxAKr6cBfzKz45LlTZO///pkk+8QOtGojWaEDjjeqdODlgrV5PdgJj9Sn7Xu/i7h/+uOybab6yZY+WWZmTU1s18C/wLGAkdaeOZko/95OgfzV3UZVre+zkOpjbqoSdoT+BbwiLuvTkrt84DFSZMeoMrBupYAdxG6FD4lmbdJu05dmNWLbYGL3P2XwAp3fwf4J6Hry2opw7yi8zBug4Gp7v4zdx9DGG9jLaGL2iIP4081SZr29AKKgGcAzGw7M/uhmXWovFMzO5xQmzgVWKfawKzZXH4bzKxJqqnPTKAP1FwLofzqTW/gYEIHDfcD5xL+p25C52DeqnWGOg+ltr5xISn1JtmOMJ7Kgcn8QYSxVbqa2e/M7FCo9iLreeB8whtVciD5x/B7YFryc3lysXwC0NnMzjezljXsQhnmhyJ0HkbJzLYDOgCfZua5+0LCebkdkBnxPfM/91jgraQJ5NnAR4T8vqxi90sIXdReU1XhV7beFuSXburzObDBqnj2sxLlVz9WAHcD/w84G+gCDMrUwldxUaxzMP/UOkOdh1Jbte4C3Mz2Ab5P6PLyrXTzGzO7g9DEpzmha8wJhDfVT4B2wE/dfU5NTXbUnCf7kra0lxLucL4PjEu31zWzQuBXwMWE2gUn3CH9G3Clh2dWatq/MsyyKjIc71/3sjMR6IXOw+iYWQmhGccF7l6azCsi9D74PWCAuy9O5j8A7EbogfBbwMXufm8ODlsStc0vaTZZZmY/IjSHbe/uq3J13FI1MxtB6LBmiLuXpOYXJLWCOgfzXHUZJsuaJDeEdR5KjTZbk1RTW10za5qsdjEwgPAP41R3/x93nwycB6wBDofqm+zowiy7zKyZmd1A6LlsPaF53SjgtuSDPKOMUE3dxd0vcveLCXfHDgNqvNOiDLOrhgxvNbP/Sla7CJ2Hsfoj8GOSh4gB3H0toXavCaEpCUkb+36EHpmecvc2mYuzWrSpl+ypVX6pm1LLgQvdfZWa7uSPzDnk7uOBz4CfpZvQJQWkbYCj0TmYlzaXYbIsU5Ok81BqVJvmdtW288z8w0/uZHcHCgnPQWR8AuxBeKNW28WiLsyyJ/mbnwUcQLibeYa7/5QwWOhQQnOQzAXyBnf/t7u/n/pnv5JQbd20it1XUIbZU4sMC0HnYeQmET6wL0uabwHg7tOBriRN7ZKMhwId3H0UhBtZyTJ1RZs7tcrPvu6Kf5a73558r/MuTySFoMxn3RWE/7GHAZhZWzPbOTkHT0fnYF7aTIZtzKxzal2dh1Kj2hSSNtfOM7OPTwhN7r5tSde1wKmEAbxeBL0JcyH5m38O/COZMpm9CpRSTfeXqTtmgwjjA8ytx8OWlNpmmNB5GKHkzuYlhF7RTrWkm2Ez25Nwo+KT1LrT3P3DpJbfvFIXt1L/apHfx6n1Kujudf5J3fx9lNCB0blmNh6YA5yULHtM52D+2kyGP668vs5DqU6tn0mq2KCKdp6pdrp3EC7IFhDuZu8InJO8USUPZJpUmdkRhJrB7u7+eWp5c0LNYXPgWkK3l2e7+z9zcsCyieoyTLWz1nkYKTO7ldCc7j3CeGXnAusINYif1LSt5J7yaxhS/0vPAe4AVgGj3X1ijg9NakkZSl3Yko4bCjJVyWb2BuEZpcuSpllNMnfIzOyHwO7Ap+5+V2p7Pe+QY5VyuhTo5+7fq5RtS0KvTAcAD7j7Vbk7Yqmshgyb+sadcOg8jFBSA3EcMIzQ2cbL7n5RTg9Kak35NQxm1oLQedFphM5xrkwtq/gfLPlLGUpd2KKapFTPPAMId8lOd/eHLIwsvq2Hwbmq3KbuDlm2RqrWbzrwqrtfnpkPtHT3T8xsL8J4SZ+mt8nhYUvKZjJs5e4fV7GNzsOIJM0pCzO1vDoH46L84pZcYJ8EPO/ubyfz9D80IspQ6sIWN7er2NDsSUJTnhcJbTxvdfebU8szDxrrrnWeMbP2wGvA8e4+28x+QuhWepy7P5BarwAoV4b5p5oMf064Y5bOUOdhxJKLbVd+cVJ+8dPnYPyUoXxTNfZYVpVUNeWjhHaePaiinafejHltP2ARsI2ZvQjsBYxMX1yDeurJc/tRuwx1HkZMTULipvzip8/B+ClD+aa2uJAEFJqZ2nnG7WigD1ACTHL3PpkFemYlGspQREREJEu+SSEJ4GngV5XbeaqAFI33gRmEAUeXw0YZ6uI6DspQREREJEu+8TNJoHaeDUGSoauAGy9lKCIiIlK3tqqQJHFTj0vxU4YiIiIidU+FJBERERERkZQmuT4AERERERGRfKJCkoiIiIiISIoKSSIiIiIiIikqJImIiIiIiKSokCQiIiIiIpKiQpKIiIiIiEiKCkkiIiIiIiIp/x/I4LNsDztpuQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# set plot parameters\n", "plt.rcParams['figure.figsize'] = [12, 7]\n", "plt.rc('font', size=14)\n", "\n", "fig, ax = plt.subplots()\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", "for i in range(len(res)):\n", " plt.hlines(res.res[i], xmin = res.xmin[i], xmax = res.xmax[i], color = 'red')\n", " plt.text(x = res.xmin[i], y = res.res[i] + 0.1, s = str(res.res[i]))\n", " \n", "for i in range(len(sup)):\n", " plt.hlines(sup.sup[i], xmin = sup.xmin[i], xmax = sup.xmax[i], color = 'green')\n", " plt.text(x = sup.xmin[i], y = sup.sup[i] - 0.35, s = str(sup.sup[i]))\n", " \n", "_ = plt.title('Combination_nonfiltered')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# import itertools\n", "\n", "# res_sort = res.sort_values(by = 'res')\n", "# sup_sort = sup.sort_values(by = 'sup')\n", "\n", "# s = np.mean(stock['High'] - stock['Low'])\n", "# def isFarFromLevel(l):\n", "# return np.sum([abs(l-x) < s/60 for x in levels]) == 0\n", "\n", "# res_temp = []\n", "# sup_temp = []\n", "# levels = []\n", "# for i in itertools.zip_longest(res_sort['res'], sup_sort['sup']):\n", "# r = i[0]\n", "# s = i[1]\n", "# if (r != None):\n", "# if isFarFromLevel(r):\n", "# res_temp.append(r)\n", "# levels.append(r)\n", "# if (s != None):\n", "# if (isFarFromLevel(s)):\n", "# sup_temp.append(s)\n", "# levels.append(s)\n", "\n", "# res_test = (res[res['res'].isin(res_temp)]).reset_index()\n", "# sup_test = (sup[sup['sup'].isin(sup_temp)]).reset_index()\n", "\n", "# # set plot parameters\n", "# plt.rcParams['figure.figsize'] = [12, 7]\n", "# plt.rc('font', size=14)\n", "\n", "# fig, ax = plt.subplots()\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", "# for i in range(len(res_test)):\n", "# plt.hlines(res_test.res[i], xmin = res_test.xmin[i], xmax = res_test.xmax[i], color = 'red')\n", "# plt.text(x = res_test.xmin[i], y = res_test.res[i] + 1, s = str(res_test.res[i]))\n", " \n", "# for i in range(len(sup_test)):\n", "# plt.hlines(sup_test.sup[i], xmin = sup_test.xmin[i], xmax = sup_test.xmax[i], color = 'green')\n", "# plt.text(x = sup_test.xmin[i], y = sup_test.sup[i] - 2, s = str(sup_test.sup[i]))\n", " \n", "# _ = plt.title('Combination_nonfiltered')" ] }, { "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 }