{ "cells": [ { "cell_type": "markdown", "id": "79174c04-9201-426a-b729-9250af628fa0", "metadata": {}, "source": [ "# Example Using the `wine` Dataset" ] }, { "cell_type": "code", "execution_count": 1, "id": "191ef836-f727-442f-b8de-9858412a0e92", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.0.1\n" ] } ], "source": [ "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.model_selection import train_test_split, cross_val_score\n", "from sklearn.metrics import f1_score\n", "import featuristic as ft\n", "import numpy as np\n", "\n", "np.random.seed(8888)\n", "\n", "print(ft.__version__)" ] }, { "cell_type": "markdown", "id": "01860140-95f3-4975-b304-d39736b9ed60", "metadata": {}, "source": [ "### Load the Data" ] }, { "cell_type": "code", "execution_count": 2, "id": "01653695-ffbe-4d65-9e76-09be97382932", "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", "
alcoholmalicacidashalcalinity_of_ashmagnesiumtotal_phenolsflavanoidsnonflavanoid_phenolsproanthocyaninscolor_intensityhue0d280_0d315_of_diluted_winesproline
014.231.712.4315.61272.803.060.282.295.641.043.921065
113.201.782.1411.21002.652.760.261.284.381.053.401050
213.162.362.6718.61012.803.240.302.815.681.033.171185
314.371.952.5016.81133.853.490.242.187.800.863.451480
413.242.592.8721.01182.802.690.391.824.321.042.93735
\n", "
" ], "text/plain": [ " alcohol malicacid ash alcalinity_of_ash magnesium total_phenols \\\n", "0 14.23 1.71 2.43 15.6 127 2.80 \n", "1 13.20 1.78 2.14 11.2 100 2.65 \n", "2 13.16 2.36 2.67 18.6 101 2.80 \n", "3 14.37 1.95 2.50 16.8 113 3.85 \n", "4 13.24 2.59 2.87 21.0 118 2.80 \n", "\n", " flavanoids nonflavanoid_phenols proanthocyanins color_intensity hue \\\n", "0 3.06 0.28 2.29 5.64 1.04 \n", "1 2.76 0.26 1.28 4.38 1.05 \n", "2 3.24 0.30 2.81 5.68 1.03 \n", "3 3.49 0.24 2.18 7.80 0.86 \n", "4 2.69 0.39 1.82 4.32 1.04 \n", "\n", " 0d280_0d315_of_diluted_wines proline \n", "0 3.92 1065 \n", "1 3.40 1050 \n", "2 3.17 1185 \n", "3 3.45 1480 \n", "4 2.93 735 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X, y = ft.fetch_wine_dataset()\n", "\n", "X.head()" ] }, { "cell_type": "code", "execution_count": 3, "id": "67d3f86f-9cd0-43e6-8ce4-f38f86dcf69c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1\n", "1 1\n", "2 1\n", "3 1\n", "4 1\n", "Name: class, dtype: int64" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y.head()" ] }, { "cell_type": "markdown", "id": "54e8c3ce-24a9-4384-8986-a3e1748d84e1", "metadata": {}, "source": [ "### Genetic Feature Synthesis" ] }, { "cell_type": "code", "execution_count": 4, "id": "d386aa48-e8bd-459a-ae42-187432c34cbf", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Creating new features...: 29%|████▋ | 29/100 [00:04<00:13, 5.27it/s]\n", "Pruning feature space...: 100%|██████████████████| 5/5 [00:00<00:00, 551.52it/s]\u001b[A\n", "Creating new features...: 29%|████▋ | 29/100 [00:05<00:12, 5.74it/s]\n" ] } ], "source": [ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)\n", "\n", "synth = ft.GeneticFeatureSynthesis(\n", " num_features=5,\n", " population_size=200,\n", " max_generations=100,\n", " early_termination_iters=25,\n", " parsimony_coefficient=0.05,\n", " n_jobs=1,\n", ")\n", "synth.fit(X_train, y_train)\n", "\n", "None" ] }, { "cell_type": "markdown", "id": "3dc58193-99f3-44ba-943f-6490e99dc410", "metadata": {}, "source": [ "### View the Synthesised Features and Their Formulas" ] }, { "cell_type": "code", "execution_count": 5, "id": "98a7e304-2d16-4288-b6d9-eb8a22eb022e", "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", "
alcoholmalicacidashalcalinity_of_ashmagnesiumtotal_phenolsflavanoidsnonflavanoid_phenolsproanthocyaninscolor_intensityhue0d280_0d315_of_diluted_winesprolinefeature_24feature_3feature_0feature_1feature_10
012.171.452.5319.01041.891.750.451.032.951.452.23355-0.243548-19.0299670.2117630.249479-18.931961
113.871.902.8019.41072.952.970.371.764.501.253.409150.008763-105.6155750.0168270.016909-89.365658
212.511.731.9820.5852.201.920.321.482.941.043.57672-0.134808-29.1732680.1175130.136657-28.609145
313.881.892.5915.01013.253.560.171.705.430.883.5610950.056938-92.415946-0.031179-0.032054-80.099472
413.403.912.4823.01021.800.750.431.417.300.701.56750-0.56435974.4728430.5128650.55019567.989552
\n", "
" ], "text/plain": [ " alcohol malicacid ash alcalinity_of_ash magnesium total_phenols \\\n", "0 12.17 1.45 2.53 19.0 104 1.89 \n", "1 13.87 1.90 2.80 19.4 107 2.95 \n", "2 12.51 1.73 1.98 20.5 85 2.20 \n", "3 13.88 1.89 2.59 15.0 101 3.25 \n", "4 13.40 3.91 2.48 23.0 102 1.80 \n", "\n", " flavanoids nonflavanoid_phenols proanthocyanins color_intensity hue \\\n", "0 1.75 0.45 1.03 2.95 1.45 \n", "1 2.97 0.37 1.76 4.50 1.25 \n", "2 1.92 0.32 1.48 2.94 1.04 \n", "3 3.56 0.17 1.70 5.43 0.88 \n", "4 0.75 0.43 1.41 7.30 0.70 \n", "\n", " 0d280_0d315_of_diluted_wines proline feature_24 feature_3 feature_0 \\\n", "0 2.23 355 -0.243548 -19.029967 0.211763 \n", "1 3.40 915 0.008763 -105.615575 0.016827 \n", "2 3.57 672 -0.134808 -29.173268 0.117513 \n", "3 3.56 1095 0.056938 -92.415946 -0.031179 \n", "4 1.56 750 -0.564359 74.472843 0.512865 \n", "\n", " feature_1 feature_10 \n", "0 0.249479 -18.931961 \n", "1 0.016909 -89.365658 \n", "2 0.136657 -28.609145 \n", "3 -0.032054 -80.099472 \n", "4 0.550195 67.989552 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "generated_features = synth.transform(X_train)\n", "\n", "generated_features.head()" ] }, { "cell_type": "code", "execution_count": 6, "id": "141197ac-0545-415e-b93c-f284c6369be4", "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", "
nameformulafitness
0feature_24sin((sin((-(flavanoids) / cos((square(ash) / a...-0.808449
1feature_3((cos(flavanoids) + magnesium) - sin(abs(cos(p...-0.821675
2feature_0sin((sin(sin(abs(-(flavanoids)))) / (flavanoid...-0.822068
3feature_1sin((sin(flavanoids) / (flavanoids + 0d280_0d3...-0.821911
4feature_10((sin(cos(flavanoids)) + magnesium) - sin(abs(...-0.819321
\n", "
" ], "text/plain": [ " name formula fitness\n", "0 feature_24 sin((sin((-(flavanoids) / cos((square(ash) / a... -0.808449\n", "1 feature_3 ((cos(flavanoids) + magnesium) - sin(abs(cos(p... -0.821675\n", "2 feature_0 sin((sin(sin(abs(-(flavanoids)))) / (flavanoid... -0.822068\n", "3 feature_1 sin((sin(flavanoids) / (flavanoids + 0d280_0d3... -0.821911\n", "4 feature_10 ((sin(cos(flavanoids)) + magnesium) - sin(abs(... -0.819321" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "info = synth.get_feature_info()\n", "info" ] }, { "cell_type": "markdown", "id": "49f862d2-64d5-4bfb-b72f-49f5686dc750", "metadata": {}, "source": [ "### Feature Selection" ] }, { "cell_type": "code", "execution_count": 7, "id": "592def8e-f256-4c5e-a234-c731c41d047c", "metadata": {}, "outputs": [], "source": [ "def objective_function(X, y):\n", " model = KNeighborsClassifier()\n", " scores = cross_val_score(model, X, y, cv=3, scoring=\"f1_weighted\")\n", " return scores.mean() * -1" ] }, { "cell_type": "code", "execution_count": 8, "id": "106f30b9-a268-406e-b416-b8804d3ce506", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Optimising feature selection...: 24%|██▏ | 24/100 [00:09<00:29, 2.56it/s]\n" ] } ], "source": [ "selector = ft.GeneticFeatureSelector(\n", " objective_function,\n", " population_size=200,\n", " max_generations=100,\n", " early_termination_iters=25,\n", " n_jobs=-1,\n", ")\n", "\n", "selector.fit(generated_features, y_train)\n", "\n", "selected_features = selector.transform(generated_features)" ] }, { "cell_type": "markdown", "id": "b9f8284b-ef97-4b71-a3bf-38df295259b1", "metadata": {}, "source": [ "### View the Selected Features" ] }, { "cell_type": "code", "execution_count": 9, "id": "87b65a1c-eef8-4812-940c-c9fef4f06be4", "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", "
alcoholmalicacidashtotal_phenolsflavanoidsproanthocyanins0d280_0d315_of_diluted_winesfeature_24feature_1
012.171.452.531.891.751.032.23-0.2435480.249479
113.871.902.802.952.971.763.400.0087630.016909
212.511.731.982.201.921.483.57-0.1348080.136657
313.881.892.593.253.561.703.560.056938-0.032054
413.403.912.481.800.751.411.56-0.5643590.550195
\n", "
" ], "text/plain": [ " alcohol malicacid ash total_phenols flavanoids proanthocyanins \\\n", "0 12.17 1.45 2.53 1.89 1.75 1.03 \n", "1 13.87 1.90 2.80 2.95 2.97 1.76 \n", "2 12.51 1.73 1.98 2.20 1.92 1.48 \n", "3 13.88 1.89 2.59 3.25 3.56 1.70 \n", "4 13.40 3.91 2.48 1.80 0.75 1.41 \n", "\n", " 0d280_0d315_of_diluted_wines feature_24 feature_1 \n", "0 2.23 -0.243548 0.249479 \n", "1 3.40 0.008763 0.016909 \n", "2 3.57 -0.134808 0.136657 \n", "3 3.56 0.056938 -0.032054 \n", "4 1.56 -0.564359 0.550195 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "selected_features.head()" ] }, { "cell_type": "markdown", "id": "8bb86d6d-32bb-4173-8b3d-ecdcbee931d0", "metadata": {}, "source": [ "### Compare New Features to Original Features" ] }, { "cell_type": "code", "execution_count": 10, "id": "0947e3ae-a543-40b0-ba1d-ffc03e9165bf", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.7013084602631234" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = KNeighborsClassifier()\n", "model.fit(X_train, y_train)\n", "preds = model.predict(X_test)\n", "original_f1 = f1_score(y_test, preds, average=\"weighted\")\n", "original_f1" ] }, { "cell_type": "code", "execution_count": 11, "id": "eb747ae1-21f0-419e-bfa3-d39fee8bf46c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.965358758528083" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = KNeighborsClassifier()\n", "model.fit(selected_features, y_train)\n", "test_features = selector.transform(synth.transform(X_test))\n", "preds = model.predict(test_features)\n", "featuristic_f1 = f1_score(y_test, preds, average=\"weighted\")\n", "featuristic_f1" ] }, { "cell_type": "code", "execution_count": 12, "id": "a8e4df3f-e389-42c8-8f10-bb3df039875f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Original F1: 0.7013084602631234\n", "Featuristic F1: 0.965358758528083\n", "Improvement: 37.7%\n" ] } ], "source": [ "print(f\"Original F1: {original_f1}\")\n", "print(f\"Featuristic F1: {featuristic_f1}\")\n", "print(f\"Improvement: {round(((featuristic_f1 / original_f1) - 1) * 100, 1)}%\")" ] }, { "cell_type": "markdown", "id": "9ab7af33-c470-45cf-9877-d27c02010126", "metadata": {}, "source": [ "### View the History of the Genetic Algorithms" ] }, { "cell_type": "code", "execution_count": 13, "id": "1c9fdc39-5165-488e-aeb7-00f10d99573b", "metadata": {}, "outputs": [ { "data": { "image/png": "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XClJuuOOO7R69Wr961//Unx8vO6880599tlnOuOMM05ag91u1+OPP65+/fpp9+7duvnmm/WrX/1Kf/7zn13rVFVV6eGHH9bf//532e12XX311br99tu1dOnSZn9ffX29LrzwQmVnZ+vFF19UbW2tcnNzZbPZJElvv/22LrroIv3mN7/R888/r9ra2iZDmsyYMUM7duzQm2++qcjISP3617/W1KlTtXXrVgUFBblqe/DBB/X0008rNjZW8fHxmjNnjrZu3aqXXnpJSUlJWrZsmSZPnqwtW7Zo0KBBrfpv1BY2Y1oZaX1cW6bybhVjpPviJEedNHeLFN3b/d8BAD7m6NGj2rNnj/r166cuXY7946220i9CzIQJE9TQ0KC1a9dKcjaFREVF6eKLL9bzzz8vSSoqKlJiYqJycnL0wQcfaO3atXrvvfdc+/jmm2+UnJys/Px8JSUlKTY2Vv/4xz906aWXSpJKSkrUq1cvzZo1y3X1pW/fvpo7d26Tm31/6LXXXtONN97ousLz7LPP6rrrrtPOnTs1YMAASdKf//xn3XvvvSoqKmr2N5aUlCg2NlarVq3S+PHjj/t87Nix6t+/v/7xj38c99mOHTs0ePBgrVu3TmPHjpUkff/990pOTtZzzz2nSy+91FXb5s2bNWLECEnOyS779++vgoKCJnNCZWZmasyYMbr//vuP+64TnkfHtOXvN1diWstmc16NKT8gVRwixADovILCnIHCiu9tpeHDh7uWAwICFBsbq2HDhrne69HD2WmjuLhYn3/+uT766CNFREQct59du3apurpatbW1TeYBjImJ0ZAhQ5qt4YMPPtDChQu1fft2lZeXq76+XkePHlVVVZXCwpy/KSwszBVgJCkxMfG4yZRPJCYmRjNmzNCkSZP04x//WJmZmbrsssuUmOic42/z5s3Kzs4+4bbbtm1TYGBgk98TGxurIUOGaNu2ba73goODmxzHLVu2qKGhQYMHD26yv5qaGsXGxp6yZncgxLSFK8Rwcy+ATsxma3WzjlUam0Qa2Wy2Ju81Nrs4HA5VVFToggsu0IMPPnjcfhITE7Vz585Wf//evXv105/+VDfddJP+93//VzExMfr44481c+ZM1dbWukLMiepsaYPJkiVL9Itf/ELLly/Xyy+/rN/+9rdasWKFzj77bIWGhra65v8WGhrqOk6SVFFRoYCA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/+z6bO/evbLZbHr55Zc1fvx4denSRUuXLtX333+vK6+8Uj179lRYWJiGDRumF1980bXdjBkztHr1av3xj3+UzWaTzWbT3r17T9ic9Prrr+u0005TSEiI+vbtq0WLFjWpr2/fvrr//vv185//XF27dlXv3r311FNPue9AA2g9d81YCaBjuv76602fPn3MBx98YLZs2WIuuugi07VrV3Prrbe6Ph87dqxZs2aN2blzp3nooYdMSEiI+frrr40xxixZssQEBQWZzMxMs2HDBpOXl2dSU1PNVVdd5fqOf/zjHyYxMdG8/vrrZvfu3eb11183MTEx5tlnnzXGGLNnzx4jyfTt29e1zsGDB80333xjHnroIbNp0yaza9cu8/jjj5uAgACzfv16Y4wxpaWlJj093WRnZ5vCwkJTWFho6uvrXbNgHz582BhjzMaNG43dbjf33nuvyc/PN0uWLDGhoaFNZnju06ePiYmJMU888YTZsWOHWbhwobHb7Wb79u2e/48A4IQIMQBOqry83AQFBZlXX33V9V5paakJCwszt956q9m3b58JCAgwBw4caLJdRkaGWbBggTHGGWIkmZ07d7o+f+KJJ0yPHj1crwcMGGBeeOGFJvu47777THp6ujHmPyHmscceO2XNP/nJT8y8efNcr8ePH+8KXI3+O8RcddVV5sc//nGTde644w4zdOhQ1+s+ffqYq6++2vXa4XCY+Ph485e//OWUNQHwjEBLLwMB8Gm7d+9WXV2dxowZ43ovKipKQ4YMkSRt2bJFDQ0NGjx4cJPtampqFBsb63odFhamAQMGuF4nJiaquLhYklRZWaldu3Zp5syZys7Odq1TX1+vqKioJvsdPXp0k9cNDQ26//779corr+jAgQOqra1VTU2NwsLCWvU7t23bpmnTpjV575xzztFjjz2mhoYGBQQESJKGDx/u+txmsykhIcH1OwB4HyEGQJtVVFQoICBAeXl5rj/0jSIiIlzLQUFBTT6z2WwyxzpGVlRUSJL++te/Ki0trcl6/73P8PDwJq8feugh/fGPf9Rjjz2mYcOGKTw8XHPnzlVtbW37fthJnOh3OBwOj3wXgFMjxAA4qf79+ysoKEgbNmxQ7969JUllZWX6+uuvdd555+nMM89UQ0ODiouLde6557bpO3r06KGkpCTt3r1bWVlZrdp23bp1mjZtmq6++mpJksPh0Ndff62hQ4e61gkODlZDQ0Oz+0lNTdW6deuO2/fgwYOPC1IAfAchBsBJde3aVddee63uuOMOxcTEKD4+XnfddZfsdrtsNpsGDx6srKwsTZ8+XYsWLdKZZ56pQ4cO6cMPP9Tw4cP1k5/8pEXfc8899+gXv/iFoqKiNHnyZNXU1Gjjxo06fPiwbrvttpNuN2jQIL322mv65JNP1K1bNz3yyCP69ttvm4SYvn37av369dq7d68iIiIUExNz3H7mzZuns846S/fdd58uv/xy5eTk6E9/+lOTHlIAfA9drAE065FHHlF6erp++tOfKjMzU+ecc46rK7QkLVmyRNOnT9e8efM0ZMgQXXjhhU2u3LTE9ddfr6efflpLlizRsGHDNH78eD377LPq169fs9v99re/1ciRIzVp0iRNmDBBCQkJuvDCC5usc/vttysgIEBDhw5VXFycCgoKjtvPyJEj9corr+ill17S6aefrt///ve69957NWPGjBb/BgDex4i9AFqlsrJSPXv21KJFizRz5kyrywHQidGcBKBZmzZt0vbt2zVmzBiVlZXp3nvvlaTjevMAgLcRYgCc0sMPP6z8/HwFBwdr1KhRWrt2rbp37251WQA6OZqTAACAX+LGXgAA4JcIMQAAwC8RYgAAgF8ixAAAAL9EiAEAAH6JEAMAAPwSIQYAAPglQgwAAPBL/x9YVDDT4SXixAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "synth.plot_history()" ] }, { "cell_type": "code", "execution_count": 14, "id": "3203f164-a838-4bfe-b0e3-662a8981ed9a", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAGwCAYAAACkfh/eAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA/EklEQVR4nO3dfVwVdd7/8fc53Ckgt4KAooi3aGqpSVZ75Sar6GZp/rRa0uwy7EbcTK00a622zW3LbrQbd7fHZbpZmpltWpkUeZuJknlpKilpeIdkCAgod2d+f7CcK1JUlMMchtfz8ZhH58zMd+YzHM/jvJv5zndshmEYAgAAsBC72QUAAADUNwIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHAIOAACwHE+zCzCDw+HQ0aNH1aJFC9lsNrPLAQAAF8EwDJ06dUpRUVGy289/jqZJBpyjR48qOjra7DIAAMAlOHTokNq0aXPedZpkwGnRooWkqj9QQECAydUAAICLUVhYqOjoaOfv+Pk0yYBTfVkqICCAgAMAQCNzMd1L6GQMAAAsh4ADAAAsh4ADAAAsp0n2wQEAuFZlZaXKy8vNLgONjJeXlzw8POplWwQcAEC9MQxDOTk5ys/PN7sUNFJBQUGKiIi47HHqCDgAgHpTHW7Cw8Pl6+vLYKq4aIZhqKSkRLm5uZKkyMjIy9oeAQcAUC8qKyud4SY0NNTsctAINW/eXJKUm5ur8PDwy7pcRSdjAEC9qO5z4+vra3IlaMyq//1cbh8uAg4AoF5xWQqXo77+/RBwAACA5RBwAACA5RBwAABN3oABAzR58mSzy0A9IuDUJ8OQTuVIP2eZXQkAwE2sXbtWNpuNsYEaGAGnPu1aLs3pIv17otmVAABwUcrKyswuwSUIOPUpuH3Vf/MOmFsHALgBwzBUUlZhymQYRp3rraioUEpKigIDA9WyZUs98cQTzu2UlpZq2rRpat26tfz8/BQfH6+1a9c62/74448aNmyYgoOD5efnp+7du+uTTz7RwYMH9dvf/laSFBwcLJvNpnHjxl2wlvfff189evRQ8+bNFRoaqoSEBBUXFzuX/8///I+6d+8uHx8fRUZGKiUlxbksOztbt9xyi/z9/RUQEKDRo0fr+PHjzuVPPvmkrrzySr355ptq3769mjVrJknKz8/XPffco7CwMAUEBOjGG2/Ujh076vx3dBcM9FefQv4TcIpypLISyZuxIAA0XafLK9XtT5+Zsu/dTw+Wr3fdfuIWLlyo8ePHKz09Xdu2bdOECRPUtm1bJScnKyUlRbt379aSJUsUFRWlFStWKDExUTt37lSnTp00ceJElZWVaf369fLz89Pu3bvl7++v6OhoLV++XCNHjlRmZqYCAgKcg9nV5tixY7rjjjv0t7/9TSNGjNCpU6e0YcMGZ9h64403NGXKFP31r3/VkCFDVFBQoE2bNkmSHA6HM9ysW7dOFRUVmjhxom677bYagWz//v1avny5PvjgA+dgeqNGjVLz5s316aefKjAwUH//+981cOBAff/99woJCanT39IdEHDqU/NgySdQKi2Q8n+UwuPMrggAcJGio6P10ksvyWazqUuXLtq5c6deeuklDR48WAsWLFB2draioqIkSdOmTdPq1au1YMECPfvss8rOztbIkSPVo0cPSVJsbKxzu9XhIDw8XEFBQRes49ixY6qoqNCtt96qdu3aSZJzu5L0zDPPaOrUqXrwwQed866++mpJ0hdffKGdO3fqwIEDio6OliQtWrRI3bt319atW53rlZWVadGiRQoLC5Mkbdy4Uenp6crNzZWPj48k6YUXXtCHH36o999/XxMmTKj7H9RkLg04eXl5mjRpklauXCm73a6RI0fqlVdekb+/f61tcnJy9PDDDys1NVWnTp1Sly5dNHPmTI0cOfKsdUtLSxUfH68dO3Zo+/btuvLKK114NBfBZpNCYqRjO6ouUxFwADRhzb08tPvpwabtu66uueaaGoPM9e/fX3PmzNHOnTtVWVmpzp0711i/tLTU+UiKP/7xj7r//vu1Zs0aJSQkaOTIkerZs+cl1d6rVy8NHDhQPXr00ODBgzVo0CD9v//3/xQcHKzc3FwdPXpUAwcOPGfbPXv2KDo62hluJKlbt24KCgrSnj17nAGnXbt2znAjSTt27FBRUdFZj9g4ffq0srIa540zLg04SUlJOnbsmFJTU1VeXq67775bEyZM0DvvvFNrm7Fjxyo/P18fffSRWrZsqXfeeUejR4/Wtm3bdNVVV9VY95FHHlFUVJR7XSMMjqkKOCfphwOgabPZbHW+TOSOioqK5OHhoYyMjLOejVT9P+z33HOPBg8erI8//lhr1qzR7NmzNWfOHE2aNKnO+/Pw8FBqaqq++uorrVmzRvPmzdPMmTO1ZcsWtWzZsl6Oyc/Pr8b7oqIiRUZG1riMVe1izjq5I5d1Mt6zZ49Wr16tN998U/Hx8br++us1b948LVmyREePHq213VdffaVJkyapX79+io2N1eOPP66goCBlZGTUWO/TTz/VmjVr9MILL1ywltLSUhUWFtaYXIaOxgDQKG3ZsqXG+6+//lqdOnXSVVddpcrKSuXm5qpjx441poiICOf60dHRuu+++/TBBx9o6tSp+uc//ylJ8vb2llT1MNKLZbPZdN111+mpp57S9u3b5e3trRUrVqhFixaKiYnRF198cc52cXFxOnTokA4dOuSct3v3buXn56tbt2617q93797KycmRp6fnWcdYX6Gqobks4GzevFlBQUHq27evc15CQoLsdvtZ/4h+6dprr9XSpUuVl5cnh8OhJUuW6MyZMxowYIBznePHjys5OVn/+te/LuqhbrNnz1ZgYKBz+uWpu3pX3dH45EHX7QMAUO+ys7M1ZcoUZWZm6t1339W8efP04IMPqnPnzkpKStLYsWP1wQcf6MCBA0pPT9fs2bP18ccfS5ImT56szz77TAcOHNA333yjL7/8UnFxVd0U2rVrJ5vNplWrVumnn35SUVHReevYsmWLnn32WW3btk3Z2dn64IMP9NNPPzm39+STT2rOnDmaO3eu9u3bp2+++Ubz5s2TVPU726NHDyUlJembb75Renq6xo4dqxtuuKHG7/GvJSQkqH///ho+fLjWrFmjgwcP6quvvtLMmTO1bdu2+vjzNjzDRf7yl78YnTt3Pmt+WFiY8frrr9fa7uTJk8agQYMMSYanp6cREBBgfPbZZ87lDofDSExMNP785z8bhmEYBw4cMCQZ27dvr3WbZ86cMQoKCpzToUOHDElGQUHBpR9gbbLWGsasAMOY27v+tw0Abuz06dPG7t27jdOnT5tdSp3dcMMNxgMPPGDcd999RkBAgBEcHGw89thjhsPhMAzDMMrKyow//elPRkxMjOHl5WVERkYaI0aMMP73f//XMAzDSElJMTp06GD4+PgYYWFhxpgxY4wTJ044t//0008bERERhs1mM+66667z1rJ7925j8ODBRlhYmOHj42N07tzZmDdvXo115s+fb3Tp0sVZy6RJk5zLfvzxR+Pmm282/Pz8jBYtWhijRo0ycnJynMtnzZpl9OrV66z9FhYWGpMmTTKioqIMLy8vIzo62khKSjKys7Pr+ue8LOf7d1RQUHDRv982w6jbYAHTp0/Xc889d9519uzZow8++EALFy5UZmZmjWXh4eF66qmndP/995+z7aRJk5Senq5nn31WLVu21IcffqiXXnpJGzZsUI8ePTR37ly99957WrdunTw8PHTw4EG1b9++Tp2MCwsLFRgYqIKCAgUEBFxUm4t28kfplZ6S3Ut6/Lhkr3tHNwBojM6cOaMDBw7UGFsFqKvz/Tuqy+93nXt/TZ069YKDFMXGxioiIkK5ubk15ldUVCgvL6/GNctfysrK0quvvqpdu3ape/fukqp6k2/YsEGvvfaa5s+fr7S0NG3evNl5G1u1vn37KikpSQsXLqzrIdWvwDZV4cZRLhUekYLamlsPAABNUJ0DTlhYWI1by2rTv39/5efnKyMjQ3369JEkpaWlyeFwKD4+/pxtSkpKJEl2e82uQR4eHnI4HJKkuXPn6plnnnEuO3r0qAYPHqylS5fWut0GZfeoCjV5WVUdjQk4AIBfyM7OPm+H3927d6ttW347LpfL7t+Li4tTYmKikpOTNX/+fJWXlyslJUW33367c6CkI0eOaODAgVq0aJH69eunrl27qmPHjrr33nv1wgsvKDQ0VB9++KFSU1O1atUqSTrrQ6++Ra9Dhw5q06aNqw6nbkLaVwWckwcl3WB2NQAANxIVFaVvv/32vMtx+Vw6QMHixYuVkpKigQMHOgf6mzt3rnN5eXm5MjMznWduvLy89Mknn2j69OkaNmyYioqK1LFjRy1cuFBDhw51Zan1q/pWccbCAQD8SvWt2HAtlwackJCQ8w7qFxMTc9YD0Tp16qTly5df9D7OtQ3TBcdU/ZexcAAAMAVPE3eFEM7gAABgJgKOKwQz2B8AAGYi4LhC9SWqMwVSSZ6ppQAA0BQRcFzB21fyb1X1mstUAAA0OAKOq/DQTQDArwwYMECTJ092vo+JidHLL79sWj1W1vifY++uQtpLh77mDA4AoFZbt26Vn5+f2WVYEgHHVehoDAC4gIt5MkBjVVlZKZvNdtbTCRoKl6hcpfpW8byDppYBAKYxDKms2JypjuOjDRgwQJMmTdLkyZMVHBysVq1a6Z///KeKi4t19913q0WLFurYsaM+/fRTZ5tdu3ZpyJAh8vf3V6tWrTRmzBidOHHCuby4uFhjx46Vv7+/IiMjNWfOnLP2++tLVC+++KJ69OghPz8/RUdH64EHHlBRUZFz+VtvvaWgoCB99tlniouLk7+/vxITE3Xs2LGLOs61a9eqX79+8vPzU1BQkK677jr9+OOPzuUrV67U1VdfrWbNmqlly5YaMWKEc9nJkyc1duxYBQcHy9fXV0OGDNG+ffvOqu2jjz5St27d5OPjo+zsbJWWlmratGlq3bq1/Pz8FB8fr7Vr115UvZeDMziuUn0nFZeoADRV5SXSsyY9duCxo5J33S79LFy4UI888ojS09O1dOlS3X///VqxYoVGjBihxx57TC+99JLGjBmj7OxslZWV6cYbb9Q999yjl156SadPn9ajjz6q0aNHKy0tTZL08MMPa926dfr3v/+t8PBwPfbYY/rmm2905ZVX1lqD3W7X3Llz1b59e/3www964IEH9Mgjj+j11193rlNSUqIXXnhB//rXv2S323XnnXdq2rRpWrx48XmPr6KiQsOHD1dycrLeffddlZWVKT09XTabTZL08ccfa8SIEZo5c6YWLVqksrIyffLJJ87248aN0759+/TRRx8pICBAjz76qIYOHardu3fLy8vLWdtzzz2nN998U6GhoQoPD1dKSop2796tJUuWKCoqSitWrFBiYqJ27typTp061ekzqgub4XbDALteXR63fsmKfpJe6CjJJs3MkbyaXbAJADRmZ86c0YEDB9S+fXs1a9as6kxKIwk4AwYMUGVlpTZs2CCp6vJKYGCgbr31Vi1atEiSlJOTo8jISG3evFmff/65NmzYoM8++8y5jcOHDys6OlqZmZmKiopSaGio3n77bY0aNUqSlJeXpzZt2mjChAnOszYxMTGaPHlyjY7Hv/T+++/rvvvuc54Zeuutt3T33Xdr//796tChgyTp9ddf19NPP62cnJzzHmNeXp5CQ0O1du1a3XDD2c9JvPbaaxUbG6u33377rGX79u1T586dtWnTJl177bWSpJ9//lnR0dFauHChRo0a5azt22+/Va9evSRVPVg0NjZW2dnZNZ6xlZCQoH79+unZZ589a19n/Tv6hbr8fnMGx1X8Wkre/lJZkZSfLYV1NrsiAGhYXr5VQcOsfddRz549na89PDwUGhqqHj16OOe1alU1/Edubq527NihL7/80vnA51/KysrS6dOnVVZWpvj4eOf8kJAQdenS5bw1fP7555o9e7b27t2rwsJCVVRU6MyZMyopKZGvb9Ux+fr6OsONJEVGRio3N/eCxxcSEqJx48Zp8ODB+t3vfqeEhASNHj1akZGRkqRvv/1WycnJ52y7Z88eeXp61jie0NBQdenSRXv27HHO8/b2rvF33LlzpyorK9W5c83fwNLSUoWGhl6w5stBwHEVm62qo/HxnVWXqQg4AJoam63Ol4nMVH2ZpZrNZqsxr/pSjsPhUFFRkYYNG6bnnnvurO1ERkZq//79dd7/wYMHddNNN+n+++/XX/7yF4WEhGjjxo0aP368ysrKnAHnXHVe7MWYBQsW6I9//KNWr16tpUuX6vHHH1dqaqquueYaNW/evM41/1rz5s2dfydJKioqkoeHhzIyMuTh4VFj3XOFw/pEJ2NXCm5X9V/GwgEAS+ndu7e+++47xcTEqGPHjjUmPz8/dejQQV5eXtqyZYuzzcmTJ/X999/Xus2MjAw5HA7NmTNH11xzjTp37qyjR+v/DNhVV12lGTNm6KuvvtIVV1zhfCh2z5499cUXX5yzTVxcnCoqKmocz88//6zMzEx169btvPuqrKxUbm7uWX+niIiI+j2wXyHguBIP3QQAS5o4caLy8vJ0xx13aOvWrcrKytJnn32mu+++W5WVlfL399f48eP18MMPKy0tTbt27dK4cePOe8t0x44dVV5ernnz5umHH37Qv/71L82fP7/eaj5w4IBmzJihzZs368cff9SaNWu0b98+xcXFSZJmzZqld999V7NmzdKePXu0c+dO5xmqTp066ZZbblFycrI2btyoHTt26M4771Tr1q11yy231LrPzp07KykpSWPHjtUHH3ygAwcOKD09XbNnz9bHH39cb8d2LgQcV2I0YwCwpKioKG3atEmVlZUaNGiQevToocmTJysoKMgZYp5//nn95je/0bBhw5SQkKDrr79effr0qXWbvXr10osvvqjnnntOV1xxhRYvXqzZs2fXW82+vr7au3evRo4cqc6dO2vChAmaOHGi7r33XklVHa2XLVumjz76SFdeeaVuvPFGpaenO9svWLBAffr00U033aT+/fvLMAx98sknZ10y+7UFCxZo7Nixmjp1qrp06aLhw4dr69atatu2bb0d27lwF5Wr7qKSpKw06V8jpJZdpJT0C68PAI3Y+e5+AS5Wfd1FxRkcV/rlaMYOh6mlAADQlBBwXCmw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AKBpsRmGYbhiw3v27FG3bt20detW9e3bV5K0evVqDR06VIcPH1ZUVNRZbdasWaMhQ4bo5MmTCggIkCQVFBQoODhYa9asUUJCwiVt99cKCwsVGBiogoIC534AAIB7q8vvt8vO4GzevFlBQUHOECJJCQkJstvt2rJlyznblJaWymazycfHxzmvWbNmstvt2rhx42Vtt7CwsMYEAACsy2UBJycnR+Hh4TXmeXp6KiQkRDk5Oedsc80118jPz0+PPvqoSkpKVFxcrGnTpqmyslLHjh275O3Onj1bgYGBzik6OroejhAAALirOgec6dOny2aznXfau3fvJRUTFhamZcuWaeXKlfL391dgYKDy8/PVu3dv2e2XnsVmzJihgoIC53To0KFL3hYAAHB/nnVtMHXqVI0bN+6868TGxioiIkK5ubk15ldUVCgvL08RERG1th00aJCysrJ04sQJeXp6KigoSBEREYqNjZWkS9quj49PjcteAADA2uoccMLCwhQWFnbB9fr376/8/HxlZGSoT58+kqS0tDQ5HA7Fx8dfsH3Lli2dbXJzc3XzzTfXy3YBAID1uawPTlxcnBITE5WcnKz09HRt2rRJKSkpuv322513Oh05ckRdu3ZVenq6s92CBQv09ddfKysrS2+//bZGjRqlhx56SF26dLno7QIAgKatzmdw6mLx4sVKSUnRwIEDZbfbNXLkSM2dO9e5vLy8XJmZmSopKXHOy8zM1IwZM5SXl6eYmBjNnDlTDz30UJ22CwAAmjaXjYPjzhgHBwCAxsctxsEBAAAwCwEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYDgEHAABYjksDTl5enpKSkhQQEKCgoCCNHz9eRUVF522TlZWlESNGKCwsTAEBARo9erSOHz/uXH7w4EGNHz9e7du3V/PmzdWhQwfNmjVLZWVlrjwUAADQiLg04CQlJem7775TamqqVq1apfXr12vChAm1rl9cXKxBgwbJZrMpLS1NmzZtUllZmYYNGyaHwyFJ2rt3rxwOh/7+97/ru+++00svvaT58+frsccec+WhAACARsRmGIbhig3v2bNH3bp109atW9W3b19J0urVqzV06FAdPnxYUVFRZ7VZs2aNhgwZopMnTyogIECSVFBQoODgYK1Zs0YJCQnn3Nfzzz+vN954Qz/88MM5l5eWlqq0tNT5vrCwUNHR0SooKHDuBwAAuLfCwkIFBgZe1O+3y87gbN68WUFBQc5wI0kJCQmy2+3asmXLOduUlpbKZrPJx8fHOa9Zs2ay2+3auHFjrfsqKChQSEhIrctnz56twMBA5xQdHX0JRwQAABoLlwWcnJwchYeH15jn6empkJAQ5eTknLPNNddcIz8/Pz366KMqKSlRcXGxpk2bpsrKSh07duycbfbv36958+bp3nvvrbWWGTNmqKCgwDkdOnTo0g8MAAC4vToHnOnTp8tms5132rt37yUVExYWpmXLlmnlypXy9/dXYGCg8vPz1bt3b9ntZ5d65MgRJSYmatSoUUpOTq51uz4+PgoICKgxAQAA6/Ksa4OpU6dq3Lhx510nNjZWERERys3NrTG/oqJCeXl5ioiIqLXtoEGDlJWVpRMnTsjT01NBQUGKiIhQbGxsjfWOHj2q3/72t7r22mv1j3/8o66HAQAALKzOAScsLExhYWEXXK9///7Kz89XRkaG+vTpI0lKS0uTw+FQfHz8Bdu3bNnS2SY3N1c333yzc9mRI0f029/+Vn369NGCBQvOeXYHAAA0XS5LBnFxcUpMTFRycrLS09O1adMmpaSk6Pbbb3feQXXkyBF17dpV6enpznYLFizQ119/raysLL399tsaNWqUHnroIXXp0sXZZsCAAWrbtq1eeOEF/fTTT8rJyam1Xw8AAGh66nwGpy4WL16slJQUDRw4UHa7XSNHjtTcuXOdy8vLy5WZmamSkhLnvMzMTM2YMUN5eXmKiYnRzJkz9dBDDzmXp6amav/+/dq/f7/atGlTY38uuuMdAAA0Mi4bB8ed1eU+egAA4B7cYhwcAAAAsxBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5RBwAACA5XiaXYCVGIah0+WVZpcBAIBbaO7lIZvNZsq+XRpw8vLyNGnSJK1cuVJ2u10jR47UK6+8In9//1rbZGVladq0adq4caNKS0uVmJioefPmqVWrVmetW1paqvj4eO3YsUPbt2/XlVde6cKjubDT5ZXq9qfPTK0BAAB3sfvpwfL1NudciksvUSUlJem7775TamqqVq1apfXr12vChAm1rl9cXKxBgwbJZrMpLS1NmzZtUllZmYYNGyaHw3HW+o888oiioqJceQgAAKARshmGYbhiw3v27FG3bt20detW9e3bV5K0evVqDR06VIcPHz5nMFmzZo2GDBmikydPKiAgQJJUUFCg4OBgrVmzRgkJCc51P/30U02ZMkXLly9X9+7d63QGp7CwUIGBgSooKHDupz5wiQoAgP9T35eo6vL77bLzRps3b1ZQUJAz3EhSQkKC7Ha7tmzZohEjRpzVprS0VDabTT4+Ps55zZo1k91u18aNG50B5/jx40pOTtaHH34oX1/fC9ZSWlqq0tJS5/vCwsLLObRa2Ww2007FAQCA/+OyS1Q5OTkKDw+vMc/T01MhISHKyck5Z5trrrlGfn5+evTRR1VSUqLi4mJNmzZNlZWVOnbsmKSqsyTjxo3TfffdVyM8nc/s2bMVGBjonKKjoy/v4AAAgFurc8CZPn26bDbbeae9e/deUjFhYWFatmyZVq5cKX9/fwUGBio/P1+9e/eW3V5V6rx583Tq1CnNmDHjorc7Y8YMFRQUOKdDhw5dUn0AAKBxqPP1lKlTp2rcuHHnXSc2NlYRERHKzc2tMb+iokJ5eXmKiIiote2gQYOUlZWlEydOyNPTU0FBQYqIiFBsbKwkKS0tTZs3b65xGUuS+vbtq6SkJC1cuPCsbfr4+Jy1PgAAsK46B5ywsDCFhYVdcL3+/fsrPz9fGRkZ6tOnj6SqcOJwOBQfH3/B9i1btnS2yc3N1c033yxJmjt3rp555hnnekePHtXgwYO1dOnSi9ouAACwPpf1iI2Li1NiYqKSk5M1f/58lZeXKyUlRbfffrvzDqojR45o4MCBWrRokfr16ydJWrBggeLi4hQWFqbNmzfrwQcf1EMPPaQuXbpIktq2bVtjP9Vj6nTo0EFt2rRx1eEAAIBGxKW3/CxevFgpKSkaOHCgc6C/uXPnOpeXl5crMzNTJSUlznmZmZmaMWOG8vLyFBMTo5kzZ+qhhx5yZZkAAMBiXDYOjjtz1Tg4AADAdery+83DNgEAgOUQcAAAgOUQcAAAgOUQcAAAgOUQcAAAgOUQcAAAgOU0yUdfV98Z76qnigMAgPpX/bt9MSPcNMmAc+rUKUniqeIAADRCp06dUmBg4HnXaZID/TkcDh09elQtWrSQzWar120XFhYqOjpahw4dYhBBE/E5uAc+B/fA5+Ae+Bwun2EYOnXqlKKiomS3n7+XTZM8g2O3213+3KqAgAD+AbsBPgf3wOfgHvgc3AOfw+W50JmbanQyBgAAlkPAAQAAlkPAqWc+Pj6aNWuWfHx8zC6lSeNzcA98Du6Bz8E98Dk0rCbZyRgAAFgbZ3AAAIDlEHAAAIDlEHAAAIDlEHAAAIDlEHDq0WuvvaaYmBg1a9ZM8fHxSk9PN7ukJuXJJ5+UzWarMXXt2tXsspqE9evXa9iwYYqKipLNZtOHH35YY7lhGPrTn/6kyMhINW/eXAkJCdq3b585xVrYhT6HcePGnfUdSUxMNKdYi5o9e7auvvpqtWjRQuHh4Ro+fLgyMzNrrHPmzBlNnDhRoaGh8vf318iRI3X8+HGTKrYuAk49Wbp0qaZMmaJZs2bpm2++Ua9evTR48GDl5uaaXVqT0r17dx07dsw5bdy40eySmoTi4mL16tVLr7322jmX/+1vf9PcuXM1f/58bdmyRX5+fho8eLDOnDnTwJVa24U+B0lKTEys8R159913G7BC61u3bp0mTpyor7/+WqmpqSovL9egQYNUXFzsXOehhx7SypUrtWzZMq1bt05Hjx7VrbfeamLVFmWgXvTr18+YOHGi831lZaURFRVlzJ4928SqmpZZs2YZvXr1MruMJk+SsWLFCud7h8NhREREGM8//7xzXn5+vuHj42O8++67JlTYNPz6czAMw7jrrruMW265xZR6mqrc3FxDkrFu3TrDMKr+7Xt5eRnLli1zrrNnzx5DkrF582azyrQkzuDUg7KyMmVkZCghIcE5z263KyEhQZs3bzaxsqZn3759ioqKUmxsrJKSkpSdnW12SU3egQMHlJOTU+P7ERgYqPj4eL4fJli7dq3Cw8PVpUsX3X///fr555/NLsnSCgoKJEkhISGSpIyMDJWXl9f4PnTt2lVt27bl+1DPCDj14MSJE6qsrFSrVq1qzG/VqpVycnJMqqrpiY+P11tvvaXVq1frjTfe0IEDB/Sb3/xGp06dMru0Jq36O8D3w3yJiYlatGiRvvjiCz333HNat26dhgwZosrKSrNLsySHw6HJkyfruuuu0xVXXCGp6vvg7e2toKCgGuvyfah/TfJp4rCmIUOGOF/37NlT8fHxateund577z2NHz/exMoA93D77bc7X/fo0UM9e/ZUhw4dtHbtWg0cONDEyqxp4sSJ2rVrF30BTcIZnHrQsmVLeXh4nNUL/vjx44qIiDCpKgQFBalz587av3+/2aU0adXfAb4f7ic2NlYtW7bkO+ICKSkpWrVqlb788ku1adPGOT8iIkJlZWXKz8+vsT7fh/pHwKkH3t7e6tOnj7744gvnPIfDoS+++EL9+/c3sbKmraioSFlZWYqMjDS7lCatffv2ioiIqPH9KCws1JYtW/h+mOzw4cP6+eef+Y7UI8MwlJKSohUrVigtLU3t27evsbxPnz7y8vKq8X3IzMxUdnY234d6xiWqejJlyhTddddd6tu3r/r166eXX35ZxcXFuvvuu80urcmYNm2ahg0bpnbt2uno0aOaNWuWPDw8dMcdd5hdmuUVFRXVOAtw4MABffvttwoJCVHbtm01efJkPfPMM+rUqZPat2+vJ554QlFRURo+fLh5RVvQ+T6HkJAQPfXUUxo5cqQiIiKUlZWlRx55RB07dtTgwYNNrNpaJk6cqHfeeUf//ve/1aJFC2e/msDAQDVv3lyBgYEaP368pkyZopCQEAUEBGjSpEnq37+/rrnmGpOrtxizb+Oyknnz5hlt27Y1vL29jX79+hlff/212SU1KbfddpsRGRlpeHt7G61btzZuu+02Y//+/WaX1SR8+eWXhqSzprvuusswjKpbxZ944gmjVatWho+PjzFw4EAjMzPT3KIt6HyfQ0lJiTFo0CAjLCzM8PLyMtq1a2ckJycbOTk5ZpdtKef6+0syFixY4Fzn9OnTxgMPPGAEBwcbvr6+xogRI4xjx46ZV7RF2QzDMBo+VgEAALgOfXAAAIDlEHAAAIDlEHAAAIDlEHAAAIDlEHAAAIDlEHAAAIDlEHAAAIDlEHAAAIDlEHAA4BzWrl0rm8121kMRATQOjGQMoMkbMGCArrzySr388svOeWVlZcrLy1OrVq1ks9nMKw7AJeEMDgDLKi8vv+S23t7eioiIINwAjRQBB8BlO3XqlJKSkuTn56fIyEi99NJLGjBggCZPnixJKi0t1bRp09S6dWv5+fkpPj5ea9eudbZ/6623FBQUpM8++0xxcXHy9/dXYmKijh07VmM/b775puLi4tSsWTN17dpVr7/+unPZwYMHZbPZtHTpUt1www1q1qyZFi9erJ9//ll33HGHWrduLV9fX/Xo0UPvvvuus924ceO0bt06vfLKK7LZbLLZbDp48OA5L1EtX75c3bt3l4+Pj2JiYjRnzpwa9cXExOjZZ5/Vf//3f6tFixZq27at/vGPf9TfHxrAxTP3WZ8ArOCee+4x2rVrZ3z++efGzp07jREjRhgtWrQwHnzwQefya6+91li/fr2xf/9+4/nnnzd8fHyM77//3jAMw1iwYIHh5eVlJCQkGFu3bjUyMjKMuLg44w9/+INzH2+//bYRGRlpLF++3Pjhhx+M5cuXGyEhIcZbb71lGIZhHDhwwJBkxMTEONc5evSocfjwYeP55583tm/fbmRlZRlz5841PDw8jC1bthiGYRj5+flG//79jeTkZOPYsWPGsWPHjIqKCueTuU+ePGkYhmFs27bNsNvtxtNPP21kZmYaCxYsMJo3b17jKdHt2rUzQkJCjNdee83Yt2+fMXv2bMNutxt79+51/YcAoAYCDoDLUlhYaHh5eRnLli1zzsvPzzd8fX2NBx980Pjxxx8NDw8P48iRIzXaDRw40JgxY4ZhGFUBR5Kxf/9+5/LXXnvNaNWqlfN9hw4djHfeeafGNv785z8b/fv3Nwzj/wLOyy+/fMGaf//73xtTp051vr/hhhucYazarwPOH/7wB+N3v/tdjXUefvhho1u3bs737dq1M+68807ne4fDYYSHhxtvvPHGBWsCUL88TT19BKDR++GHH1ReXq5+/fo55wUGBqpLly6SpJ07d6qyslKdO3eu0a60tFShoaHO976+vurQoYPzfWRkpHJzcyVJxcXFysrK0vjx45WcnOxcp6KiQoGBgTW227dv3xrvKysr9eyzz+q9997TkSNHVFZWptLSUvn6+tbpOPfs2aNbbrmlxrzrrrtOL7/8siorK+Xh4SFJ6tmzp3O5zWZTRESE8zgANBwCDgCXKioqkoeHhzIyMpwhoJq/v7/ztZeXV41lNptNxn9u8iwqKpIk/fOf/1R8fHyN9X69TT8/vxrvn3/+eb3yyit6+eWX1aNHD/n5+Wny5MkqKyu7vAOrxbmOw+FwuGRfAGpHwAFwWWJjY+Xl5aWtW7eqbdu2kqSCggJ9//33+q//+i9dddVVqqysVG5urn7zm99c0j5atWqlqKgo/fDDD0pKSqpT202bNumWW27RnXfeKUlyOBz6/vvv1a1bN+c63t7eqqysPO924uLitGnTprO23blz57NCFgDzEXAAXJYWLVrorrvu0sMPP6yQkBCFh4dr1qxZstvtstls6ty5s5KSkjR27FjNmTNHV111lX766Sd98cUX6tmzp37/+99f1H6eeuop/fGPf1RgYKASExNVWlqqbdu26eTJk5oyZUqt7Tp16qT3339fX331lYKDg/Xiiy/q+PHjNQJOTEyMtmzZooMHD8rf318hISFnbWfq1Km6+uqr9ec//1m33XabNm/erFdffbXGnVwA3Ae3iQO4bC+++KL69++vm266SQkJCbruuuuct3NL0oIFCzR27FhNnTpVXbp00fDhw2uc8bkY99xzj958800tWLBAPXr00A033KC33npL7du3P2+7xx9/XL1799bgwYM1YMAARUREaPjw4TXWmTZtmjw8PNStWzeFhYUpOzv7rO307t1b7733npYsWaIrrrhCf/rTn/T0009r3LhxF30MABoOIxkDqHfFxcVq3bq15syZo/Hjx5tdDoAmiEtUAC7b9u3btXfvXvXr108FBQV6+umnJemsu44AoKEQcADUixdeeEGZmZny9vZWnz59tGHDBrVs2dLssgA0UVyiAgAAlkMnYwAAYDkEHAAAYDkEHAAAYDkEHAAAYDkEHAAAYDkEHAAAYDkEHAAAYDkEHAAAYDn/H/pUYVUxEVcXAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "selector.plot_history()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.6" } }, "nbformat": 4, "nbformat_minor": 5 }