diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..820d3d0f --- /dev/null +++ b/.gitignore @@ -0,0 +1,169 @@ +# Mac OS-specific storage files +.DS_Store + +# vim +*.swp +*.swo + +## https://github.com/github/gitignore/blob/4488915eec0b3a45b5c63ead28f286819c0917de/Python.gitignore + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# MkDocs documentation +docs/site/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..1a298e01 --- /dev/null +++ b/Makefile @@ -0,0 +1,68 @@ +################################################################################# +# GLOBALS # +################################################################################# + +PROJECT_NAME = Lab-ML-platzi +PYTHON_VERSION = 3.10 +PYTHON_INTERPRETER = python + +################################################################################# +# COMMANDS # +################################################################################# + + +## Install Python Dependencies +.PHONY: requirements +requirements: + $(PYTHON_INTERPRETER) -m pip install -U pip + $(PYTHON_INTERPRETER) -m pip install -r requirements.txt + + + + +## Delete all compiled Python files +.PHONY: clean +clean: + find . -type f -name "*.py[co]" -delete + find . -type d -name "__pycache__" -delete + +## Lint using flake8 and black (use `make format` to do formatting) +.PHONY: lint +lint: + flake8 logistic_regression + isort --check --diff --profile black logistic_regression + black --check --config pyproject.toml logistic_regression + +## Format source code with black +.PHONY: format +format: + black --config pyproject.toml logistic_regression + + + + + + +################################################################################# +# PROJECT RULES # +################################################################################# + + + +################################################################################# +# Self Documenting Commands # +################################################################################# + +.DEFAULT_GOAL := help + +define PRINT_HELP_PYSCRIPT +import re, sys; \ +lines = '\n'.join([line for line in sys.stdin]); \ +matches = re.findall(r'\n## (.*)\n[\s\S]+?\n([a-zA-Z_-]+):', lines); \ +print('Available rules:\n'); \ +print('\n'.join(['{:25}{}'.format(*reversed(match)) for match in matches])) +endef +export PRINT_HELP_PYSCRIPT + +help: + @$(PYTHON_INTERPRETER) -c "${PRINT_HELP_PYSCRIPT}" < $(MAKEFILE_LIST) diff --git a/README.md b/README.md index 34e5548a..9104005b 100644 --- a/README.md +++ b/README.md @@ -29,13 +29,14 @@ curl --location --request GET 'http://localhost:3001/query?feats=465,France,Fema Si todo esta bien, deberías de obtener una respuesta así ``` -{"response": [1]} +{"response": [0]} ``` #### Equipo * Juan Perez Nombrefalso * Ricardo Alanís Tamez +* Angel Martínez #### Contribuir diff --git a/app.py b/app.py index c27bed07..56a669cb 100644 --- a/app.py +++ b/app.py @@ -4,15 +4,28 @@ import pandas as pd -FEATURES = pickle.load(open("churn/models/features.pk", "rb")) +# Cargar las características, el modelo y las equivalencias de columnas desde archivos creados con la libreria pickle +FEATURES = pickle.load(open("models/features.pk", "rb")) +model = pickle.load(open("models/model.pk", "rb")) +column_equivalence = pickle.load(open("models/column_equivalence.pk", "rb")) -model = pickle.load(open("churn/models/model.pk", "rb")) -column_equivalence = pickle.load(open("churn/models/column_equivalence.pk", "rb")) -# create the Flask app app = Flask(__name__) def convert_numerical(features): + """ + Función para convertir características en formato numérico. + + Si una característica es categórica, se reemplaza por su código numérico + utilizando el diccionario 'column_equivalence'. Si no es categórica, + se intenta convertir a valor numérico con pandas. Si falla, se coloca un 0. + + Parámetros: + features (list): Lista de características a convertir. + + Retorna: + list: Lista de características convertidas a formato numérico. + """ output = [] for i, feat in enumerate(features): if i in column_equivalence: @@ -26,6 +39,17 @@ def convert_numerical(features): @app.route('/query') def query_example(): + """ + Endpoint que recibe características en la URL, las convierte a formato numérico + y devuelve la predicción del modelo en formato JSON. + + Parámetros (GET): + feats: Cadena de características separadas por comas. + + Retorna: + JSON: Respuesta con la predicción del modelo. + """ + features = convert_numerical(request.args.get('feats').split(',')) response = { 'response': [int(x) for x in model.predict([features])] @@ -33,5 +57,5 @@ def query_example(): return json.dumps(response) if __name__ == '__main__': - # run app in debug mode on port 3001 + # Ejecutamos la aplicación Flask en modo debug en el puerto 3001 app.run(debug=True, port=3001) \ No newline at end of file diff --git a/churn/.DS_Store b/churn/.DS_Store deleted file mode 100644 index e80e53f3..00000000 Binary files a/churn/.DS_Store and /dev/null differ diff --git a/churn/models/column_equivalence.pk b/churn/models/column_equivalence.pk deleted file mode 100644 index ae3467ff..00000000 Binary files a/churn/models/column_equivalence.pk and /dev/null differ diff --git a/churn/models/features.pk b/churn/models/features.pk deleted file mode 100644 index a82fcfcd..00000000 Binary files a/churn/models/features.pk and /dev/null differ diff --git a/churn/models/model.pk b/churn/models/model.pk deleted file mode 100644 index 80c67ef0..00000000 Binary files a/churn/models/model.pk and /dev/null differ diff --git a/data/.DS_Store b/data/.DS_Store deleted file mode 100644 index 162d75b2..00000000 Binary files a/data/.DS_Store and /dev/null differ diff --git a/data/processed/.gitkeep b/data/processed/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/data/raw/.gitkeep b/data/raw/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/data/churn.csv b/data/raw/churn.csv similarity index 100% rename from data/churn.csv rename to data/raw/churn.csv diff --git a/docs/.gitkeep b/docs/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/models/column_equivalence.pk b/models/column_equivalence.pk new file mode 100644 index 00000000..f4379cd6 Binary files /dev/null and b/models/column_equivalence.pk differ diff --git a/models/features.pk b/models/features.pk new file mode 100644 index 00000000..60af949c Binary files /dev/null and b/models/features.pk differ diff --git a/models/model.pk b/models/model.pk new file mode 100644 index 00000000..1da145eb Binary files /dev/null and b/models/model.pk differ diff --git a/notebooks/.ipynb_checkpoints/modelgeneration_27092023_ricalanis-checkpoint.ipynb b/notebooks/.ipynb_checkpoints/modelgeneration_27092023_ricalanis-checkpoint.ipynb deleted file mode 100644 index 16823ad1..00000000 --- a/notebooks/.ipynb_checkpoints/modelgeneration_27092023_ricalanis-checkpoint.ipynb +++ /dev/null @@ -1,360 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 19, - "id": "9de64c0d-889e-483d-9921-25cbe60cedf4", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "ddef4e47-253e-427f-b3c5-0f3f6cdacbac", - "metadata": {}, - "outputs": [], - "source": [ - "# Cambiar directorio\n", - "os.chdir(\"..\")" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "45a2377a-c148-44d4-b936-800d57362bcb", - "metadata": {}, - "outputs": [], - "source": [ - "# Cargar los datos que tenemos disponibles\n", - "data = pd.read_csv(\"data/churn.csv\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "e6e35832-17f4-43b3-adcc-5de303725f8d", - "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", - "
RowNumberCustomerIdSurnameCreditScoreGeographyGenderAgeTenureBalanceNumOfProductsHasCrCardIsActiveMemberEstimatedSalaryExited
0115634602Hargrave619FranceFemale4220.00111101348.881
1215647311Hill608SpainFemale41183807.86101112542.580
2315619304Onio502FranceFemale428159660.80310113931.571
3415701354Boni699FranceFemale3910.0020093826.630
4515737888Mitchell850SpainFemale432125510.8211179084.100
\n", - "
" - ], - "text/plain": [ - " RowNumber CustomerId Surname CreditScore Geography Gender Age \\\n", - "0 1 15634602 Hargrave 619 France Female 42 \n", - "1 2 15647311 Hill 608 Spain Female 41 \n", - "2 3 15619304 Onio 502 France Female 42 \n", - "3 4 15701354 Boni 699 France Female 39 \n", - "4 5 15737888 Mitchell 850 Spain Female 43 \n", - "\n", - " Tenure Balance NumOfProducts HasCrCard IsActiveMember \\\n", - "0 2 0.00 1 1 1 \n", - "1 1 83807.86 1 0 1 \n", - "2 8 159660.80 3 1 0 \n", - "3 1 0.00 2 0 0 \n", - "4 2 125510.82 1 1 1 \n", - "\n", - " EstimatedSalary Exited \n", - "0 101348.88 1 \n", - "1 112542.58 0 \n", - "2 113931.57 1 \n", - "3 93826.63 0 \n", - "4 79084.10 0 " - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data.head(5)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "3da27622-b70d-45bb-9efb-bd94bd4fb0a7", - "metadata": {}, - "outputs": [], - "source": [ - "# Nos deshacemos de las columnas que no contribuyen en mucho\n", - "data = data.drop(data.columns[0:3], axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "id": "c6519a08-642b-4ce3-8800-bfd80be89989", - "metadata": {}, - "outputs": [], - "source": [ - "# Convertimos los datos en formato categorico, para más info: shorturl.at/y0269\n", - "column_equivalence = {}\n", - "features = list(data.columns)\n", - "for i, column in enumerate(list([str(d) for d in data.dtypes])):\n", - " if column == \"object\":\n", - " data[data.columns[i]] = data[data.columns[i]].fillna(data[data.columns[i]].mode())\n", - " categorical_column = data[data.columns[i]].astype(\"category\")\n", - " current_column_equivalence = dict(enumerate(categorical_column.cat.categories))\n", - " column_equivalence[i] = dict((v,k) for k,v in current_column_equivalence.items())\n", - " data[data.columns[i]] = categorical_column.cat.codes\n", - " else:\n", - " data[data.columns[i]] = data[data.columns[i]].fillna(data[data.columns[i]].median())" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "1d48b3b8-f48c-4340-8d77-93e35054ecaf", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{1: {'France': 0, 'Germany': 1, 'Spain': 2}, 2: {'Female': 0, 'Male': 1}}" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "column_equivalence" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "21e4ba90-1206-4ce6-bdc8-6986e6b93ef5", - "metadata": {}, - "outputs": [], - "source": [ - "# Vamos a crear un modelo de regresion logistica\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.linear_model import LogisticRegression\n" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "id": "f45f3df3-bcbe-45f3-820c-82867e36d012", - "metadata": {}, - "outputs": [], - "source": [ - "# Generar los datos para poder separar la variable de respuesta de los datos que tenemos disponibles\n", - "X = data.copy()\n", - "y = X.pop(data.columns[-1])" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "id": "8a6ee78f-7c8b-4810-a763-c8b20155ec28", - "metadata": {}, - "outputs": [], - "source": [ - "# Separar los datos en datos de entrenamiento y testing\n", - "X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.33, random_state=42)" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "id": "409f0391-4500-41fd-85a9-e501ecdd9329", - "metadata": {}, - "outputs": [], - "source": [ - "# Crear el modelo y entrenarlo\n", - "clf_lin = LogisticRegression(random_state=0, solver='lbfgs', multi_class='multinomial').fit(X, y)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "id": "753ab797-0b07-4e27-a497-9518034451a9", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[2599, 58],\n", - " [ 597, 46]])" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Medir los resultados obtenidos\n", - "from sklearn.metrics import confusion_matrix\n", - "confusion_matrix(y_test, clf_lin.predict(X_test))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "id": "20f25624-4ba7-4c0d-a79a-590d1884b7d0", - "metadata": {}, - "outputs": [], - "source": [ - "# Generar el binario del modelo para reutilizarlo, equivalencia de variables categoricas y caracteristicas del modelo\n", - "import pickle\n", - "pickle.dump(clf_lin, open(\"churn/models/model.pk\", \"wb\"))\n", - "pickle.dump(column_equivalence, open(\"churn/models/column_equivalence.pk\", \"wb\"))\n", - "pickle.dump(features, open(\"churn/models/features.pk\", \"wb\"))" - ] - } - ], - "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.7.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/modelgeneration_27092023_ricalanis.ipynb b/notebooks/modelgeneration_27092023_ricalanis.ipynb index 78b5eed4..3d2d3623 100644 --- a/notebooks/modelgeneration_27092023_ricalanis.ipynb +++ b/notebooks/modelgeneration_27092023_ricalanis.ipynb @@ -1,8 +1,16 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "3dbce2b2", + "metadata": {}, + "source": [ + "## Presprocesamiento de los datos" + ] + }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 1, "id": "9de64c0d-889e-483d-9921-25cbe60cedf4", "metadata": {}, "outputs": [], @@ -24,18 +32,18 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 3, "id": "45a2377a-c148-44d4-b936-800d57362bcb", "metadata": {}, "outputs": [], "source": [ "# Cargar los datos que tenemos disponibles\n", - "data = pd.read_csv(\"data/churn.csv\")\n" + "data = pd.read_csv(\"data/raw/churn.csv\")\n" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 4, "id": "e6e35832-17f4-43b3-adcc-5de303725f8d", "metadata": {}, "outputs": [ @@ -189,7 +197,7 @@ "4 79084.10 0 " ] }, - "execution_count": 21, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -200,7 +208,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 5, "id": "3da27622-b70d-45bb-9efb-bd94bd4fb0a7", "metadata": {}, "outputs": [], @@ -211,7 +219,71 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 6, + "id": "b8f22789", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "CreditScore 0\n", + "Geography 0\n", + "Gender 0\n", + "Age 0\n", + "Tenure 0\n", + "Balance 0\n", + "NumOfProducts 0\n", + "HasCrCard 0\n", + "IsActiveMember 0\n", + "EstimatedSalary 0\n", + "Exited 0\n", + "dtype: int64" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.isna().sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e757c386", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "CreditScore int64\n", + "Geography object\n", + "Gender object\n", + "Age int64\n", + "Tenure int64\n", + "Balance float64\n", + "NumOfProducts int64\n", + "HasCrCard int64\n", + "IsActiveMember int64\n", + "EstimatedSalary float64\n", + "Exited int64\n", + "dtype: object" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.dtypes" + ] + }, + { + "cell_type": "code", + "execution_count": 8, "id": "c6519a08-642b-4ce3-8800-bfd80be89989", "metadata": {}, "outputs": [], @@ -219,21 +291,24 @@ "# Convertimos los datos en formato categorico, para más info: shorturl.at/y0269\n", "column_equivalence = {}\n", "features = list(data.columns)\n", + "# Iteramos sobre los tipos de datos de cada columna, convirtiéndolos a string para poder compararlos\n", "for i, column in enumerate(list([str(d) for d in data.dtypes])):\n", + " # Si la columna es de tipo 'object' (categoría o texto)\n", " if column == \"object\":\n", - " data[data.columns[i]] = data[data.columns[i]].fillna(data[data.columns[i]].mode())\n", - " categorical_column = data[data.columns[i]].astype(\"category\")\n", - " current_column_equivalence = dict(enumerate(categorical_column.cat.categories))\n", - " column_equivalence[i] = dict((v,k) for k,v in current_column_equivalence.items())\n", - " data[data.columns[i]] = categorical_column.cat.codes\n", + " data[data.columns[i]] = data[data.columns[i]].fillna(data[data.columns[i]].mode()) # Rellenamos valores nulos con el valor más frecuente (moda)\n", + " categorical_column = data[data.columns[i]].astype(\"category\") # Convertimos la columna a tipo 'category' (categoría de pandas)\n", + " current_column_equivalence = dict(enumerate(categorical_column.cat.categories)) # Diccionario que asocia índices numéricos a cada categoría\n", + " column_equivalence[i] = dict((v,k) for k,v in current_column_equivalence.items()) # Invertimos el diccionario\n", + " data[data.columns[i]] = categorical_column.cat.codes # Reemplazamos las categorías por sus códigos numéricos en la columna\n", + " # Si la columna no es de tipo 'object' (numérica u otro)\n", " else:\n", - " data[data.columns[i]] = data[data.columns[i]].fillna(data[data.columns[i]].median())" + " data[data.columns[i]] = data[data.columns[i]].fillna(data[data.columns[i]].median()) # Rellenamos valores nulos con la mediana de la columna" ] }, { "cell_type": "code", - "execution_count": 33, - "id": "1d48b3b8-f48c-4340-8d77-93e35054ecaf", + "execution_count": 9, + "id": "fe0bc646", "metadata": {}, "outputs": [ { @@ -242,7 +317,7 @@ "{1: {'France': 0, 'Germany': 1, 'Spain': 2}, 2: {'Female': 0, 'Male': 1}}" ] }, - "execution_count": 33, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -253,19 +328,312 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 10, + "id": "fbb5d4f3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAIUCAYAAAD112WDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAADJMElEQVR4nOzdd3gUZff/8c+mJ6QAgUACJPQiTboEFESaoFTpCtgLKKAPIjYsXwUrdhQfBX0siAULIkgRBUSahCadINIFKYHQkpzfH/yysiSbRpJNeb+uKxfstD33PTNnZs7OzjrMzAQAAAAAAAAAANLw8nQAAAAAAAAAAAAUVBTRAQAAAAAAAABwgyI6AAAAAAAAAABuUEQHAAAAAAAAAMANiugAAAAAAAAAALhBER0AAAAAAAAAADcoogMAAAAAAAAA4AZFdAAAAAAAAAAA3KCIDgAAAAAAAACAGz6eDgAAAAAAACA7zp07pxdffFFnz57VsGHDVKZMGU+HBAAowrgTHQAAAAAAFCoPPvigHn74YXl7e1NABwDkOYroAFCAVK5cWQ6HI81fcHCwGjZsqLFjx+rw4cOeDjNHpk6dKofDoaFDh3o6FI9JXb87d+50Gd62bVs5HA4tXLjQI3Eh65544gk5HA498cQTng4l17D9FU07d+6Uw+FQ5cqVPR1KkbBw4UI5HA61bds2z9+L42XW5Xb+Sj3v8nQcyNxXX32lV155RXfccYceffTRHC+H/Q0AkFUU0QGgAGrVqpWGDBmiIUOG6KabbtIVV1yhrVu3asKECWrQoIF27Njh6RA9rigWMwEAAJCxbdu26eabb9Z1112nt956y9PhAACKCZ6JDgAF0G233Zbmjpj9+/erTZs22rJlix588EF98cUXngkOue7DDz9UYmKioqOjPR0KiiG2PwCFFfmreFqzZo0efPBBjRo1St7e3pe0rJ49e+qKK65QWFhYLkUHACiqKKIDQCFRvnx5jR49Wrfffrvmz5/v6XCQi7j4hyex/QEorMhfxVPv3r1zbVlhYWEU0AEAWcLjXACgEClfvrwkKSkpKd3xiYmJmjBhgho3bqyQkBAFBQWpbt26evTRR3XkyBGXab/44gs5HA6VLVtWu3fvTrOsOXPmyNvbW2FhYdq6datz+NChQ+VwODR16lStWbNGvXr1UtmyZRUYGKgGDRro1VdfVXJycrbbtnz5cvXt21dRUVHy8/NTRESErr/+es2dOzfNtA6HQ08++aQk6cknn3R5fnx2nmmZnf7Kqj/++EN9+vRRmTJlFBgYqHr16unFF1/MsE/cPUv177//1muvvaYuXbqoSpUqCgwMVGhoqJo2barnnntOp0+fdrvM9evXq3fv3ipTpoyCgoJUv359vfLKK0pJSXH7bPYLh3/zzTdq166dSpcu7RJbTmO68DmzH330kZo3b67g4GCVLVtWAwYM0K5duyRJZqY33nhDl19+uUqUKKEyZcpo6NChOnjwYJplnjt3Th999JEGDRqk2rVrKzQ0VIGBgapVq5buu+8+7d27123/ZOTUqVN64oknVKNGDfn7+ysyMlJDhgxxxpiRVatWadCgQYqOjpa/v79Kly6tTp06adasWTmKxcz01Vdf6brrrlP58uXl5+en8uXLq3Xr1nruued06tQp57QJCQl699131atXL9WoUUMlSpRQiRIlVL9+fT3yyCM6evRouu+RF9ufOxduYzNmzFDr1q0VGhqqkJAQtW3b1m0//fnnn3ruuefUrl07Z9+WLFlSrVu31jvvvKOUlJQ081z4TPDk5GS9/PLLatSokYKDg12eefzHH39o3LhxatWqlSpUqCA/Pz+Fh4erffv2mj59erbbmOrIkSN66qmn1LRpU4WFhSkwMFBVq1ZV37599cMPP7hMeykxzJw5U23atFFISIjCwsJ05ZVX6ptvvslwnnnz5unee+/V5ZdfrjJlysjf318VK1ZUv379tGLFimy3NbPHa7l7nviFw8+dO6fnnntOdevWVWBgoMLDw9WrVy9t3LgxX9qQ6sMPP1SzZs0UFBSk0qVLq3Pnzlq0aFGm8+3du1f333+/6tSpo6CgIIWEhKhZs2Z644033B6zc+Krr77Sbbfdpnr16qlUqVIKCAhQlSpVdMstt2jz5s3pznPmzBm98MILatKkiUJCQpx5pFmzZnrwwQf1zz//ZPq+R48eVWBgoLy9vbVnzx63091www1yOBx69dVXncPycv/Ny/z17rvvqkmTJipRooRKliypLl266Lfffst0vvTMnz9fvXr1UmRkpPMcp2fPnlq6dGm602/dulW33HKLqlSpIn9/fwUHBysmJkZdu3bVlClTsvy+Od3HsvIbAO6eH58Xx/tUW7Zs0Z133qlq1aopICBAYWFhuuqq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89M5c+ZYSEiISbJy5cpZjx49rE+fPta8eXPz9fV1mefIkSPO/So8PNx69OhhvXv3toiICAsJCXFukxfOs3r1apNkvr6+1qxZM+vbt6/17dvXGjVqZJLM4XDYf//7X7exAwDyF0V0AChAUk++L/7z8/OzmJgY69evX4YXAidPnrTx48fb5ZdfbkFBQRYQEGB16tSxhx9+2P755x/ndMnJydaxY0e3Fw1mZn/++aeVLl3aJNmMGTOcw1OL6FOmTLHff//drr/+egsPDzd/f3+rW7euvfzyy+le3GV0kWJ2/oL8hhtusPLly5uPj4+Fh4db165d7ccff3Tb3l9++cXat29vpUqVchbh3S0/PVntr+xYt26d9erVy0qXLm3+/v5Wp04dGz9+vJ07dy7bRcyUlBR77733rEmTJhYcHGxhYWHWunVrmzZtmpllfKG6Zs0a69mzp5UuXdoCAgLssssusxdeeMHOnDljfn5+5uXlZadOnXKZJytF9JzGlFcX1b/88otdc801VqZMGQsKCrJ69erZM888Y2fOnMnSxXN6Tp48aY899phVq1bN/Pz8rFy5cjZo0CCLj4+3cePGZVicW7dund1xxx1Wo0YNCwgIsKCgIKtatap16tTJXnvttTQfXGQmJSXFPvnkE+vYsaOFh4ebr6+vlS9f3q688kp74YUX0qzDr7/+2mJjY61kyZIWHBxsTZs2tbfeestSUlIy3f4WLlyY5r1zuv25c2EM06dPt5YtW1pwcLCVKFHCrrzySvvuu+/Sne/s2bP2wgsvWP369S0oKMhKly5tHTt2tB9//NHt9pPVIlxCQoI9/PDDVqtWLQsICLCIiAjr0aOHrVy5MksFKHf+/vtve/TRR61+/fpWokQJCwwMtKpVq1q/fv1s9uzZuRbDN998Y61bt7YSJUpYcHCwxcbG2hdffJFh++Pj423QoEEWHR1t/v7+FhMTY3fddZft378/023cnZSUFHvppZesTp065ufnZ6VLl7brr7/eVq1a5bYNl1Lgy4s2mJm9//771qRJEwsICLCwsDBr3769/fTTT5nGeuDAAXvsscescePGFhISYn5+flaxYkWLjY21cePG2dq1a7McQ0bHy7Vr11q3bt0sMjLSAgICrEaNGvbggw/a8ePHXY7PqbZt22ZPPPGEXXPNNRYdHW0BAQFWqlQpa9CggT300EP2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ffaZ5s+fr9q1a+vGG29URESEDh48qPXr18vhcKh8+fI6ffq0AgICtH//fpmZ6tWr55zu119/1T///KOWLVuqTp06OnTokEqWLKnExERPNAdIw8y0+tCHOmEH5N3EW2bm6ZAAIMtSc9ixs7u1+tCHigxqKIfD4emwAABwwfEKQEFDXip42rZt6/z/woUL07yWpN69e+vw4cMKDw/Xl19+mek8PXr00NGjR1WyZEl9/fXX6tKlixITExUUFKRZs2alu8z27dsrKSlJPj4+mjdvnq677jqdOHFCwcHBmjlzpu644w5t27ZN1atX1+TJk9PM/8QTT2jlypVq2rSpnnjiCUnSqFGjtH79etWrV08TJ07UQw89pLi4OF1++eWaMGGCPvvsM/3yyy+66qqr1K9fP/3www9atGiRrrzySl177bX69ddftWzZMrVo0UKxsbGSlGaagwcPas+ePapQoYKzLnvh640bN2rdunWqX7++6tSpk2Z8VuRknotdHEdeyPcievfu3XXs2DFJ0pYtW/Ttt9+qU6dO+vHHHzMsNDocDnXs2NFlug8//FB169bVxo0b1bBhQ5mZ5syZo169euVLWwB39iau1uEz2yRJyWWT9XfyJpVUFQ9HBQBZc2EOO3xmm/YmrlaFEo09HBUAAK44XgEoaMhLBcuFxe+svD58+HC25jl69KjL68TExEyXmZSU5PL6xIkTLq+3bNni8vri+RcuXKirr77apYa6evVql2l+++03l9cbNmzQ22+/7Zzn119/1csvv6xz585Jkr755hvVrVtXR44c0d69e53TvP3220pISFBKSoq8vLzUoUMHzZ071/m6Tp062rBhg/N9Umu0qeMfeOABde3aVRn5/vvv9dJLL2VrnouNHz9ec+bMcb7u1KmTxo4dm61lZEWWi+hnzpzRmTNnnK+PHz+e7Tf77LPPnAX0ypUr688//3QWviXpiiuu0G+//ZZmvtThqdNFRkaqUqVKWr58uTZs2KArrrhCr732mipWrKg33nhDFSpUUKlSpbIdHwqPM2fOKCU5xdNhpMvMFHfoIznkJVOKlCJtPPe9qlvnAvsJdFJSkrZs2eLpMAqtwvwtmNzI7ShaLs5hDnkp7tBHigpqVKByGHkLeY3cDhRsheV4BeSWvMjtW7duVVBQ0CUvpyDLz9pBXuclzn8zd+H5W3YLsf7+/i77WGZ8fX2dRWhJ8vLyUkqK67aW2TK9vb2VnJzsfB0eHq7Dhw+7nb9OnTrauHGjSwG9YsWK2r17t/N11apVtWPHDufr3r1768svv3TOc8stt2jq1Kk6d+6c/Pz8dN9992nSpEnOYriPj48GDx6sDz74QMeOHVODBg30n//8Rx988IHmzJmja665RkOGDNHkyZO1ePFiRUVFacSIEXr11Ve1YcMGtWrVSnfeeaemT5+ul19+Wc2aNXN7d/nBgwf10ksvqUuXLurbt2+W5rnYxo0bNWfOHEVHR2vYsGF68803NWfOHPXo0SPX70jPchF9/PjxevLJJy/pzX755Rfn/5966il98803+vLLL53Drr766nSL6BcPHzlypCIjIzV48GBJUqVKlXTq1Cnt3r1bUVFRGjNmzCXFicLBNyjY0yGk68JPniVJXtLRlF0F+hPohIQE3XHHHZ4Oo9C68KBX2ORGbkfRcnEOM6UUyLtoyFvIa+R2oGArLMcrILfkRW6/99575e3tnavLLIjyq3aQ13mJ89/MuTt/S++RLBe+9vf315w5czJ9jMuFr+fOnevyesGCBWrXrp2zkJ6VZc6fP9/l9cWPkrl4/kmTJunuu+/Wxo0bJZ0voH/00Ucu07z//vvq2LGjzp49Ky8vL917771avHixDhw4oLJly2rw4MFasmSJNm/erIoVK+q6666TJL344ouSpMGDB2vw4MHau3evZs+eLR8fH0VHR6tZs2aaP3++mjdvrujoaFWqVEmSdN1116lFixa67rrrNHnyZMXExCg6Olp9+/bVzJkztWfPHrcF8T179iglJUV9+/bN8jwXW7dunSRp2LBhatGihSRpzJgxWr9+veeK6GPHjtX999/vfH38+HFnh2XVVVdd5fxk4/HHH9eff/7pMv6nn35Kd76Lh7/yyisu7/3XX38pMDBQFStWlJeXl8aPH8+d6EXcuHHjdOxswbsTPc1d6E6OAn1nTEhIiF544QVPh1FoJSYmqlGjRp4OI0dyI7ej6HCXwwri3X3kLeQ1cjtQcBWm4xWQW/Iit7/++utF/k70/Kod5Ede4vw3c+7O3zJ7RMuZM2fUqVOnbM3ToUMHl9cXFtCzusxrrrnG5XXv3r1dXl88/4UFdEnavXu3brzxRpdpbrnlFp09e1aSlJKSotdff10HDhyQJP3999/68MMPtXXrVuf8M2fO1KRJk5zzf/jhh5LOf0ggnf8GxK5du7RixQpJ0vLly1WnTh399ddfkqSZM2eqWrVqmjlzpiTpzz//1K5duzR9+nR5e3urQoUKcqdChQry8vLS9OnTnXeiZzbPxerXry9JevPNN13+rVevXpaXkVVZLqL7+/vL39//kt6sX79++uSTT3Ts2DHt3LnTObxTp06aO3duunehS+ef5ZP67J0ff/xR+/bt0759+ySdf97OihUr1Lx5c6WkpGj48OHOTx5QdPn7+8sr+aynw0gjzV3oTlag74zx8fFRzZo1PR1GoXXy5ElPh5BjuZHbUXS4y2EF8e4+8hbyGrkdKLgK0/EKyC15kdtr1KihEiVK5OoyC5r8qh3kR17i/DdzF56/ff/999l6pEt2HuUiyeVRLpLSPMolK8u8+M75Cx/lkt78qQV0h8PhfDzLhY9ykeTyKBdJzieApM7z/vvvSzr/OJqzZ88670C/8JnoqdOEhYVpw4YNGjx4sLy9vdWpUyfNmzdP8+fPl7e3t+rWrasNGzY4nwhSt25d/fbbb1qyZIm8vb11//33Z3hHeUREhB544AG9/PLLmjlzZpbmuVidOnXUqVMnzZkzxxlHp06d8uTHRfP9h0W/+eYbffbZZ1qwYIFq166tQYMGKSIiQrfeeqvzLvXy5cvr9OnTCggI0P79+yWdXxGp0y1dulT//POPrrjiCtWpU0d//vmnGjZsqFOnTqX5lAbIL6mfPEsOSen9SG7BvhsdQPFGDgMAFAYcrwAUNOSlgiuzR7IsXLhQ0vk7wA8fPqzw8PA0j1RJb54ePXro6NGjKlmypL7++mt16dJFiYmJCgoK0qxZs9JdZvv27ZWUlCQfHx/NmzdP1113nU6cOKHg4GDNnDlTd9xxh7Zt26bq1atr8uTJaeZ/4okntHLlSjVt2lRPPPGEJGnUqFFav3696tWrp4kTJ+qhhx5SXFycLr/8ck2YMEGfffaZFi1apCuvvFL9+vXTDz/8oMWLF6t169a69tpr9euvv2r58uVq3ry5YmNjJSnNNAcPHtSePXtUoUIFZ132wtcbN250xlCnTp0002ema9euatasWbbmudjYsWPVo0cPlzjyQr4X0aXzd6T369fPZVhERES6HXVxwyMiItS9e3eXYWXKlHH+YCngKSmWpJNJh5T+QVOSTCeTDinFkuTt8M3P0AAgU+QwAEBhwPEKQEFDXirYUgvl7l5Lcvm9xqzM8/XXX7u8Ti2cZ7TMefPmubxOffxJqsmTJ2c4f2rh/EITJ050eT1hwgSX1xfXX6+99lpde+21ztexsbHO4rm7aS6u1178uk6dOi61W3f13YzkZJ6LXRxHXvBIER0oiry9fNU1+iWdTv73V9JPHNyruOmTdXnfOxQcEaUA7zB5e3HQBFDwpJfDLkYOAwB4GscrAAUNeQkoHiiiA7mohG9ZlfAt63zt4+0tn8M+KuldSWEBlT0XGABkwcU5DACAgojjFYCChrwEFH1eng4AAAAAAAAAAICCiiI6AAAAAAAAAABuUEQHAAAAAAAAAMANiugAAAAAAAAAALhBER0AAAAAAAAAADcoogMAAAAAAAAA4AZFdAAAAAAAAAAA3KCIDgAAAAAAAACAGxTRAQAAAAAAAABwgyI6AAAAAAAAAABuUEQHAAAAAAAAAMANiugAAAAAAAAAALhBER0AAAAAAAAAADcoogMAAAAAAAAA4AZFdAAAAAAAAAAA3PDxdAC5ISgoSCdOnHD+HwDyEznofLs7d+6sv//+Wz5+AZ4OBwAuGbn9fLsHDhyow6fOyTcg0NPhAMAl8w0IVMur2+vs8SMKCCie56wc31CUsX0jLxWJIrrD4VCJEiU8HQaAYoocdL4PfHx8/v//PRwMAOQCcvv5PvD19ZXPOZOD5A6gCHA4HPL29nb+vzji+IaijO0beYnHuQAAAAAAAAAA4AZFdAAAAAAAAAAA3KCIDgAAAAAAAACAGxTRAQAAAAAAAABwgyI6AAAAAAAAAABuUEQHAAAAAAAAAMANiugAAAAAAAAAALhBER0AAAAAAAAAADcoogMAAAAAAAAA4AZFdAAAAAAAAAAA3KCIDgAAAAAAAACAGxTRAQAAAAAAAABwgyI6AAAAAAAAAABuUEQHAAAAAAAAAMANiugAAAAAAAAAALhBER0AAAAAAAAAADcoogMAAAAAAAAA4IaPpwMAcirx8EH9PPERT4eRoeRzZyVJqz5+U96+fh6OJn2Jhw9KQRU9HQaKkIK8vaNoIG8B+aswnHMBQFadPnbE0yEgn+X2ccwT1/mc/wKeRxEdhVJUVJSnQ8iSpCQvJaSEKaREgHx8CujuFlSx0PQnCrYKFSooMTGxYG/vKBrIW0C+YV8DUNSUjIqUJIWHh3s4EuSHvDiOeeQ6n/NfwOMcZmY5mfH48eMKCwvTsWPHFBoamttxAUCxUZDyaUGKBQAKs4KUTwtSLABQmBWkfFqQYgGAwiyr+ZRnogMAAAAAAAAA4AZFdAAAAAAAAAAA3KCIDgAAAAAAAACAGxTRAQAAAAAAAABwgyI6AAAAAAAAAABuUEQHAAAAAAAAAMANiugAAAAAAAAAALhBER0AAAAAAAAAADd8cjqjmUmSjh8/nmvBAEBxlJpHU/OqJ5HbASB3kNsBoOghtwNA0ZPV3J7jInpCQoIkqVKlSjldBADgAgkJCQoLC/N4DBK5HQByC7kdAIoecjsAFD2Z5XaH5fAj1JSUFO3du1chISFyOBw5DjC/HT9+XJUqVdJff/2l0NBQT4eTb2g37S4OCmu7zUwJCQmKioqSl5dnn7J1Kbm9sPa/p9Fv2UefZR99ljOX0m/k9sKNdtPu4oB2F9/cnhXFdfvIC/Rl7qI/cw99eV5Wc3uO70T38vJSxYoVczq7x4WGhhbLDYR2Fy+0u/Dw9J0sqXIjtxfG/i8I6Lfso8+yjz7LmZz2G7m98KPdxQvtLl7I7VlTXLePvEBf5i76M/fQl1nL7fywKAAAAAAAAAAAblBEBwAAAAAAAADAjWJXRPf399e4cePk7+/v6VDyFe2m3cVBcW13QUH/5wz9ln30WfbRZzlDvxXfPqDdtLs4oN3Fq93ZRT/lHvoyd9GfuYe+zJ4c/7AoAAAAAAAAAABFXbG7Ex0AAAAAAAAAgKyiiA4AAAAAAAAAgBsU0QEAAAAAAAAAcIMiOgAAAAAAAAAAbhTJIvqECRPkcDg0cuRI57DTp09r2LBhCg8PV3BwsHr37q0DBw64zLdr1y517dpVQUFBioiI0OjRo5WUlJTP0WfdE088IYfD4fJXu3Zt5/ii2OZUe/bs0Y033qjw8HAFBgaqfv36WrlypXO8menxxx9XZGSkAgMD1b59e23dutVlGf/8848GDRqk0NBQlSxZUrfeeqtOnDiR303JssqVK6dZ3w6HQ8OGDZNUdNd3cnKyHnvsMVWpUkWBgYGqVq2ann76aV34m8hFcX0XVG+++aYqV66sgIAAtWjRQsuXL89w+s8//1y1a9dWQECA6tevr1mzZuVTpAVLdvpt6tSpafbzgICAfIzW83755Rddf/31ioqKksPh0Ndff53pPAsXLlTjxo3l7++v6tWra+rUqXkeZ0GS3T5buHBhuseU/fv350/ABcD48ePVrFkzhYSEKCIiQj169NDmzZszna8o5rXimtuz0+53331XV155pUqVKqVSpUqpffv2mfZTQZXd9Z1q2rRpcjgc6tGjR94GmEey2+6jR49q2LBhioyMlL+/v2rWrFkot/XstvuVV15RrVq1FBgYqEqVKmnUqFE6ffp0PkV76TiHyJ6sHAuzcp2JtHJal8K/cqPug/Nyq65S7FkRs3z5cqtcubI1aNDARowY4Rx+1113WaVKlWz+/Pm2cuVKu+KKKyw2NtY5PikpyerVq2ft27e31atX26xZs6xMmTI2duxYD7Qia8aNG2d169a1ffv2Of/+/vtv5/ii2GYzs3/++cdiYmJs6NChtmzZMtuxY4fNmTPHtm3b5pxmwoQJFhYWZl9//bWtWbPGunXrZlWqVLFTp045p+ncubM1bNjQfvvtN1u0aJFVr17dBgwY4IkmZcnBgwdd1vXcuXNNkv30009mVnTX9zPPPGPh4eE2c+ZMi4+Pt88//9yCg4Pt1VdfdU5TFNd3QTRt2jTz8/Oz999/3zZs2GC33367lSxZ0g4cOJDu9EuWLDFvb297/vnn7Y8//rBHH33UfH19bd26dfkcuWdlt9+mTJlioaGhLvv7/v378zlqz5o1a5Y98sgj9tVXX5kkmzFjRobT79ixw4KCguz++++3P/74w15//XXz9va22bNn50/ABUB2++ynn34ySbZ582aXbS05OTl/Ai4AOnXqZFOmTLH169dbXFycdenSxaKjo+3EiRNu5ymKea245vbstnvgwIH25ptv2urVq23jxo02dOhQCwsLs927d+dz5Jcmu+1OFR8fbxUqVLArr7zSunfvnj/B5qLstvvMmTPWtGlT69Kliy1evNji4+Nt4cKFFhcXl8+RX5rstvvjjz82f39/+/jjjy0+Pt7mzJljkZGRNmrUqHyOPOc4h8ierBwLM7vORFo5rUvhX7lV98F5uVVXKe6KVBE9ISHBatSoYXPnzrU2bdo4k9XRo0fN19fXPv/8c+e0GzduNEm2dOlSMzt/sPXy8nIpVEyaNMlCQ0PtzJkz+dqOrBo3bpw1bNgw3XFFtc1mZmPGjLHWrVu7HZ+SkmLly5e3F154wTns6NGj5u/vb59++qmZmf3xxx8myVasWOGc5ocffjCHw2F79uzJu+Bz0YgRI6xatWqWkpJSpNd3165d7ZZbbnEZ1qtXLxs0aJCZFZ/1XRA0b97chg0b5nydnJxsUVFRNn78+HSn79u3r3Xt2tVlWIsWLezOO+/M0zgLmuz225QpUywsLCyfoiv4snIB/OCDD1rdunVdhvXr1886deqUh5EVXNkpoh85ciRfYioMDh48aJLs559/djtNUcxrxTW3Z7fdF0tKSrKQkBD74IMP8irEPJGTdiclJVlsbKz997//tSFDhhTKInp22z1p0iSrWrWqnT17Nr9CzBPZbfewYcOsXbt2LsPuv/9+a9WqVZ7GmVc4h8i+i4+FWbnOhKtLqUvhX7lR98G/cqOuArMi9TiXYcOGqWvXrmrfvr3L8FWrVuncuXMuw2vXrq3o6GgtXbpUkrR06VLVr19f5cqVc07TqVMnHT9+XBs2bMifBuTA1q1bFRUVpapVq2rQoEHatWuXpKLd5m+//VZNmzZVnz59FBERoUaNGundd991jo+Pj9f+/ftd2h4WFqYWLVq4tL1kyZJq2rSpc5r27dvLy8tLy5Yty7/G5NDZs2f10Ucf6ZZbbpHD4SjS6zs2Nlbz58/Xli1bJElr1qzR4sWLde2110oqHuu7IDh79qxWrVrl0s9eXl5q3769s58vtnTp0jT5uFOnTm6nL4py0m+SdOLECcXExKhSpUrq3r17gd5HCwK2tZy7/PLLFRkZqQ4dOmjJkiWeDsejjh07JkkqXbq022mK2rZWXHN7TnPzhRITE3Xu3LkMt5eCJqftfuqppxQREaFbb701P8LMdTlp97fffquWLVtq2LBhKleunOrVq6dnn31WycnJ+RX2JctJu2NjY7Vq1SrnI1927NihWbNmqUuXLvkSsycUhZyWmy4+FmblOhOuLqUuhX/lRt0H/8qNugokH08HkFumTZum33//XStWrEgzbv/+/fLz81PJkiVdhpcrV8757M/9+/e7FBdTx6eOK4hatGihqVOnqlatWtq3b5+efPJJXXnllVq/fn2RbbN0/mRu0qRJuv/++/Xwww9rxYoVuu++++Tn56chQ4Y4Y0+vbRe2PSIiwmW8j4+PSpcuXaDbnurrr7/W0aNHNXToUElFdxuXpIceekjHjx9X7dq15e3treTkZD3zzDMaNGiQJBWL9V0QHDp0SMnJyen286ZNm9Kdx902V5z6PCf9VqtWLb3//vtq0KCBjh07phdffFGxsbHasGGDKlasmB9hFzrutrXjx4/r1KlTCgwM9FBkBVdkZKTefvttNW3aVGfOnNF///tftW3bVsuWLVPjxo09HV6+S0lJ0ciRI9WqVSvVq1fP7XRFLa8V19yek3ZfbMyYMYqKikpTJCnIctLuxYsX67333lNcXFw+RJg3ctLuHTt2aMGCBRo0aJBmzZqlbdu26Z577tG5c+c0bty4/Aj7kuWk3QMHDtShQ4fUunVrmZmSkpJ011136eGHH86PkD2Cc4h/pXcszMp1Jv51qXUp/Cs36j74V27UVVBEiuh//fWXRowYoblz5xarH19L/cRIkho0aKAWLVooJiZG06dPL9IH+5SUFDVt2lTPPvusJKlRo0Zav3693n77bQ0ZMsTD0eWP9957T9dee62ioqI8HUqemz59uj7++GN98sknqlu3ruLi4jRy5EhFRUUVm/WN4qVly5Zq2bKl83VsbKzq1Kmjd955R08//bQHI0NRUqtWLdWqVcv5OjY2Vtu3b9fEiRP1v//9z4ORecawYcO0fv16LV682NOhoBCYMGGCpk2bpoULFxbpa4+EhATddNNNevfdd1WmTBlPh5OvUlJSFBERocmTJ8vb21tNmjTRnj179MILLxSaInpOLFy4UM8++6zeeusttWjRQtu2bdOIESP09NNP67HHHvN0eMhjHAsvTXGtS+UV6j65i7pK7igSj3NZtWqVDh48qMaNG8vHx0c+Pj76+eef9dprr8nHx0flypXT2bNndfToUZf5Dhw4oPLly0uSypcvn+ZXkVNfp05T0JUsWVI1a9bUtm3bVL58+SLb5sjISF122WUuw+rUqeN8lE1q7Om17cK2Hzx40GV8UlKS/vnnnwLddkn6888/NW/ePN12223OYUV5fY8ePVoPPfSQ+vfvr/r16+umm27SqFGjNH78eElFf30XFGXKlJG3t3eG/Xwxd9tccerznPTbxXx9fdWoUSNt27YtL0IsEtxta6GhoUX6Q+Xc1rx582K5nQ0fPlwzZ87UTz/9lOm3PYpaXiuuuf1ScvOLL76oCRMm6Mcff1SDBg3yMsxcl912b9++XTt37tT111/vvMb68MMP9e2338rHx0fbt2/Pr9AvSU7Wd2RkpGrWrClvb2/nsDp16mj//v06e/ZsnsabW3LS7scee0w33XSTbrvt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krR06VJ5e3ura9eung4FyBc+ng4ARcPOnTvVqlUrlSxZUi+88ILq16+vc+fOac6cORo2bJg2bdqUZp5z587J19f3kt/b29tb5cuXz3S63r176+zZs/rggw9UtWpVHThwQPPnz9fhw4cvOQZ3zp49Kz8/vzxbPgDkhx07djhz/LPPPqv69evL399f69at0+TJk1WhQgV169bNY/Hl1vEEAJCxgn48yExycrIcDoe8vLiXDAAu1Xvvvad7771X7733nvbu3auoqChPhwTkKc4ekCvuueceORwOLV++XL1791bNmjVVt25d3X///frtt98knX8Ey6RJk9StWzeVKFFCzzzzjCTpm2++UePGjRUQEKCqVavqySefVFJSknPZW7du1VVXXaWAgABddtllmjt3rst7X/g4l507d+rqq6+WJJUqVUoOh0NDhw7V0aNHtWjRIj333HO6+uqrFRMTo+bNm2vs2LEuJ/pHjx7VnXfeqXLlyikgIED16tXTzJkzneO//PJL1a1bV/7+/qpcubJeeukll1gqV66sp59+WoMHD1ZoaKjuuOMOSdLixYt15ZVXKjAwUJUqVdJ9992nkydP5uIaAIC8c88998jHx0crV65U3759VadOHVWtWlXdu3fX999/r+uvv17S+Rx62223qWzZsgoNDVW7du20Zs0al2VNmjRJ1apVk5+fn2rVqqX//e9/LuM3bdqk1q1bO3P+vHnz0n2E12effaY2bdooICBAH3/8sQ4fPqwBAwaoQoUKCgoKUv369fXpp5+6LLtt27YaPny4hg8frrCwMJUpU0aPPfaYzMxlusTERN1yyy0KCQlRdHS0Jk+e7BzXrl07DR8+3GX6v//+W35+fnn+zSsA8LTcOh488cQTuvzyy/W///1PlStXVlhYmPr376+EhATnNCdPntTgwYMVHBysyMjINOfdknTmzBn95z//UYUKFVSiRAm1aNFCCxcudI6fOnWqSpYsqW+//VaXXXaZ/P39tWvXrrzrIAAoJk6cOKHPPvtMd999t7p27aqpU6e6jP/2229Vo0YNBQQE6Oqrr9YHH3yQ5okB1ElQ6BhwiQ4fPmwOh8OeffbZDKeTZBEREfb+++/b9u3b7c8//7RffvnFQkNDberUqbZ9+3b78ccfrXLlyvbEE0+YmVlycrLVq1fPrrnmGouLi7Off/7ZGjVqZJJsxowZZmYWHx9vkmz16tWWlJRkX375pUmyzZs32759++zo0aN27tw5Cw4OtpEjR9rp06fTjS85OdmuuOIKq1u3rv3444+2fft2++6772zWrFlmZrZy5Urz8vKyp556yjZv3mxTpkyxwMBAmzJlinMZMTExFhoaai+++KJt27bN+VeiRAmbOHGibdmyxZYsWWKNGjWyoUOHXnrnA0AeO3TokDkcDhs/fnym07Zv396uv/56W7FihW3ZssUeeOABCw8Pt8OHD5uZ2VdffWW+vr725ptv2ubNm+2ll14yb29vW7BggZmZJSUlWa1ataxDhw4WFxdnixYtsubNm6eb8ytXrmxffvml7dixw/bu3Wu7d++2F154wVavXm3bt2+31157zby9vW3ZsmXO+Nq0aWPBwcE2YsQI27Rpk3300UcWFBRkkydPdk4TExNjpUuXtjfffNO2bt1q48ePNy8vL9u0aZOZmX388cdWqlQpl2PJyy+/bJUrV7aUlJRL7m8AKKhy83gwbtw4Cw4Otl69etm6devsl19+sfLly9vDDz/sXMbdd99t0dHRNm/ePFu7dq1dd911FhISYiNGjHBOc9ttt1lsbKz98ssvtm3bNnvhhRfM39/ftmzZYmZmU6ZMMV9fX4uNjbUlS5bYpk2b7OTJk7nbMQBQDL333nvWtGlTMzP77rvvrFq1as5z4R07dpivr6/95z//sU2bNtmnn35qFSpUMEl25MgRMzPqJCiUKKLjki1btswk2VdffZXhdJJs5MiRLsOuueaaNMX3//3vfxYZGWlmZnPmzDEfHx/bs2ePc/wPP/zgtohuZvbTTz+5JOdUX3zxhZUqVcoCAgIsNjbWxo4da2vWrHGOnzNnjnl5ednmzZvTjX/gwIHWoUMHl2GjR4+2yy67zPk6JibGevTo4TLNrbfeanfccYfLsEWLFpmXl5edOnUq3fcCgILit99+SzfHh4eHW4kSJaxEiRL24IMP2qJFiyw0NDTNB5XVqlWzd955x8zMYmNj7fbbb3cZ36dPH+vSpYuZnc/vPj4+tm/fPuf4uXPnppvzX3nllUxj79q1qz3wwAPO123atLE6deq4FLvHjBljderUcb6OiYmxG2+80fk6JSXFIiIibNKkSWZmdurUKStVqpR99tlnzmkaNGjg/PAXAIqq3DwejBs3zoKCguz48ePO8aNHj7YWLVqYmVlCQoL5+fnZ9OnTneMPHz5sgYGBziL6n3/+ad7e3i7XCWbnry/Gjh1rZueL6JIsLi4udzoBAGBm58/rU8/Hz507Z2XKlLGffvrJzM6fX9erV89l+kceecSlTkOdBIURj3PBJbOLvgafkaZNm7q8XrNmjZ566ikFBwc7/26//Xbt27dPiYmJ2rhxoypVquTybK2WLVvmKM7evXtr7969+vbbb9W5c2ctXLhQjRs3dn7tKC4uThUrVlTNmjXTnX/jxo1q1aqVy7BWrVpp69atSk5OzrCNU6dOdWljp06dlJKSovj4+By1BQA8bfny5YqLi1PdunV15swZrVmzRidOnFB4eLhLvouPj9f27dsluc+jGzdulCRt3rxZlSpVcvmdi+bNm6f7/hfn2uTkZD399NOqX7++SpcureDgYM2ZMyfN1/avuOIKORwO5+uWLVumyeMNGjRw/t/hcKh8+fI6ePCgJCkgIEA33XST3n//fUnS77//rvXr12vo0KFZ6jcAKGpycjyQzj8GMSQkxPk6MjLSmWu3b9+us2fPqkWLFs7xpUuXVq1atZyv161bp+TkZNWsWdPlfX7++WeX9/Hz83PJ6wCAS7N582YtX75cAwYMkCT5+PioX79+eu+995zjmzVr5jLPxef01ElQGPHDorhkNWrUkMPhSPfHQy9WokQJl9cnTpzQk08+qV69eqWZNiAgINdivHCZHTp0UIcOHfTYY4/ptttu07hx4zR06FAFBgbmynuk18Y777xT9913X5ppo6Ojc+U9ASCvVK9eXQ6HQ5s3b3YZXrVqVUly5s4TJ04oMjLS5Vm0qUqWLJnrcV2ca1944QW9+uqreuWVV1S/fn2VKFFCI0eO1NmzZ7O97It/pNThcCglJcX5+rbbbtPll1+u3bt3a8qUKWrXrp1iYmJy1hAAKCRy+3iQWa7NzIkTJ+Tt7a1Vq1bJ29vbZVxwcLDz/4GBgS4fngIALs17772npKQkl5sdzUz+/v564403srQM6iQojCii45KVLl1anTp10ptvvqn77rsvTWHj6NGjbgsojRs31ubNm1W9evV0x9epU0d//fWX9u3bp8jISEly/lCpO35+fpLkclehO5dddpnzx+oaNGig3bt3a8uWLenejV6nTh0tWbLEZdiSJUtUs2bNNCfuF2rcuLH++OMPt20EgIIsPDxcHTp00BtvvKF77703TY5P1bhxY+3fv18+Pj6qXLlyutOk5tEhQ4Y4hy1ZskSXXXaZJKlWrVr666+/dODAAZUrV06StGLFiizFuWTJEnXv3l033nijJCklJUVbtmxxLjvVsmXLXF7/9ttvqlGjRoZ5/GL169dX06ZN9e677+qTTz7J8sUCABRmuXk8yEy1atXk6+urZcuWOYspR44c0ZYtW9SmTRtJUqNGjZScnKyDBw/qyiuvzNH7AACyJykpSR9++KFeeukldezY0WVcjx499Omnn6pWrVqaNWuWy7iLz+mpk6Aw4nEuyBVvvvmmkpOT1bx5c3355ZfaunWrNm7cqNdeey3Dx688/vjj+vDDD/Xkk09qw4YN2rhxo6ZNm6ZHH31UktS+fXvVrFlTQ4YM0Zo1a7Ro0SI98sgjGcYSExMjh8OhmTNn6u+//9aJEyd0+PBhtWvXTh999JHWrl2r+Ph4ff7553r++efVvXt3SVKbNm101VVXqXfv3po7d67i4+P1ww8/aPbs2ZKkBx54QPPnz9fTTz+tLVu26IMPPtAbb7yh//znPxnGM2bMGP36668aPny44uLitHXrVn3zzTcaPnx4droYADzmrbfeUlJSkpo2barPPvtMGzdu1ObNm/XRRx9p06ZN8vb2Vvv27dWyZUv16NFDP/74o3bu3Klff/1VjzzyiFauXClJGj16tKZOnapJkyZp69atevnll/XVV18582iHDh1UrVo1DRkyRGvXrtWSJUucx4PM7iKsUaOG5s6dq19//VUbN27UnXfeqQMHDqSZbteuXbr//vu1efNmffrpp3r99dc1YsSIbPfJbbfdpgkTJsjM1LNnz2zPDwCFUW4dDzITHBysW2+9VaNHj9aCBQucj83y8vr38rVmzZoaNGiQBg8erK+++krx8fFavny5xo8fr++//z6vugAAirWZM2fqyJEjuvXWW1WvXj2Xv969e+u9997TnXfeqU2bNmnMmDHasmWLpk+f7nyMbuo5PXUSFEoefiY7ipC9e/fasGHDLCYmxvz8/KxChQrWrVs3549L6IIfhrvQ7NmzLTY21gIDAy00NNSaN29ukydPdo7fvHmztW7d2vz8/KxmzZo2e/bsDH9Y1MzsqaeesvLly5vD4bAhQ4bY6dOn7aGHHrLGjRtbWFiYBQUFWa1atezRRx+1xMRE53yHDx+2m2++2cLDwy0gIMDq1atnM2fOdI7/4osv7LLLLjNfX1+Ljo62F154waUtMTExNnHixDRtXL58uXXo0MGCg4OtRIkS1qBBA3vmmWey38kA4CF79+614cOHW5UqVczX19eCg4OtefPm9sILL9jJkyfNzOz48eN27733WlRUlPn6+lqlSpVs0KBBtmvXLudy3nrrLatatar5+vpazZo17cMPP3R5n40bN1qrVq3Mz8/Pateubd99951JstmzZ5tZ+jnf7Hz+7t69uwUHB1tERIQ9+uijNnjwYOvevbtzmjZt2tg999xjd911l4WGhlqpUqXs4Ycfdvmh0fTyeMOGDW3cuHEuwxISEiwoKMjuueeeHPYoABROuXE8GDdunDVs2NBluRMnTrSYmBjn64SEBLvxxhstKCjIypUrZ88//7y1adPG+cOiZmZnz561xx9/3CpXrmy+vr4WGRlpPXv2tLVr15rZ+R8WDQsLy8vuAIBi5brrrrMuXbqkO27ZsmUmydasWWPffPONVa9e3fz9/a1t27Y2adIkk+Tyo6HUSVDYOMyy8auQAAAA+WjJkiVq3bq1tm3bpmrVql3Sstq2bavLL79cr7zyyiXHtXPnTlWrVk0rVqxQ48aNL3l5AAAAQFH1zDPP6O2339Zff/3l6VCAHOOZ6AAAoMCYMWOGgoODVaNGDW3btk0jRoxQq1atLrmAnlvOnTunw4cP69FHH9UVV1xBAR0AAAC4yFtvvaVmzZopPDxcS5Ys0QsvvMCjWlDoUUQHAAAFRkJCgsaMGaNdu3apTJkyat++vV566SVPh+W0ZMkSXX311apZs6a++OILT4cDAAAAFDhbt27V//3f/+mff/5RdHS0HnjgAY0dO9bTYQGXhMe5AAAAAAAAAADghlfmkwAAAAAAAAAAUDxRRAcAAAAAAAAAwA2K6AAAAAAAAAAAuEERHQAAAAAAAAAANyiiAwAAAAAAAADgBkV0AAAAAAAAAADcoIgOAAAAAAAAAIAbFNEBAAAAAAAAAHCDIjoAAAAAAAAAAG5QRAcAAAAAAAAAwA2K6AAAAAAAAAAAuEERHQAAAAAAAAAAN3xyOmNKSor27t2rkJAQORyO3IwJAIoVM1NCQoKioqLk5eXZzzbJ7QCQO8jtAFD0kNsBoOjJam7PcRF97969qlSpUk5nBwBc5K+//lLFihU9GgO5HQByF7kdAIoecjsAFD2Z5fYcF9FDQkKcbxAaGprTxQBAsXf8+HFVqlTJmVc9idwOALmD3A4ARQ+5HQCKnqzm9hwX0VO/LhQaGkrCBoBcUBC+hkluB4DcRW4HgKKH3A4ARU9muZ0fFgUAAAAAAAAAwA2K6AAAAAAAAAAAuEERHQAAAAAAAAAANyiiAwAAAAAAAADgBkV0AAAAAAAAAADcoIgOAAAAAAAAAIAbFNEBAAAAAAAAAHDDx9MBIH88/PDD2rt3r6fDQD6KiorSs88+6+kwUIyQZ+Ap5Dsg75DbCzbyH4CcILcDKIry+ryIInoxsXfvXu36a7eCwiM8HUq+SklO1rlTJ+UbWEJe3t6eDiffJB4+6OkQUAwV1zxTXBTUfEq+A/LWrl27tHvPHgWVjihQ+z7IfwByjvN2AEXNyUMHdOTIER0+fFjh4eF58h4U0YuRoPAItRn1jKfDyFfH9uzU4jeeVItbHlBYhcqeDiff/DzxEU+HgGKqOOaZ4qKg5lPyHZC3kpOTJTM1HnBXgdr3Qf4DcGk4bwdQlCx4frSOHTmUp0V0nokOAAAAAAAAAIAbFNEBAAAAAAAAAHCDIjoAAAAAAAAAAG5QRAcAAAAAAAAAwA2K6AAAAAAAAAAAuEERHQAAAAAAAAAANyiiAwAAAAAAAADgBkV0AAAAAAAAAADcoIgOAAAAAAAAAIAbFNEBAAAAAAAAAHCDIjoAAAAAAAAAAG5QRAcAAAAAAAAAwA2K6AAAAAAAAAAAuEERHQAAAAAAAAAANyiiAwAAAAAAAADgBkV0AAAAAAAAAADcoIgOAAAAAAAAAIAbFNEBAAAAAAAAAHDDJ7/f0MyUmJgoSQoKCpLD4cjvEAAgV5HXzvfBuXPnlJSUJDMrln0AoGght5/vg6SkpP//fw8HAxQS5A4UdJy3AyhqzEzJycnO/+eVfL8TPTExUcHBwQoODnaeXABAYUZeO98Hn3zyiebM+FznTp/ydDgAcMnI7ef7YPbs2ZKkpLOnPRwNUDiQO1DQcd4OoKg5d/qUlv40T5J0+nTenbPyOBcAAAAAAAAAANygiA4AAAAAAAAAgBsU0QEAAAAAAAAAcIMiOgAAAAAAAAAAblBEBwAAAAAAAADADYroAAAAAAAAAAC4QREdAAAAAAAAAAA3KKIDAAAAAAAAAOAGRXQAAAAAAAAAANygiA4AAAAAAAAAgBsU0QEAAAAAAAAAcIMiOgAAAAAAAAAAblBEBwAAAAAAAADADYroAAAAAAAAAAC4QREdAAAAAAAAAAA3KKIDAAAAAAAAAOAGRXQAAAAAAAAAANygiI4i7WDyZh3peUQHkzd7OhQAyDN7T8bpm533aO/JOE+HAgCFBrkTAADkFc4zih6K6CiyzEwbz36nlJIp2nj2O5mZp0MCgFxnZlp96EMdO7tbqw99SK4DgCwgdwLFV9u2bZ1/AJAXOM8omiiio8jam7haR1N2SZKOpuzS3sTVHo4IAHLf3sTVOnxmmyTp8Jlt5DoAyAJyJ1A8XVw4p5AOIC9wnlE0+WR1wjNnzujMmTPO18ePH7/kN9+6dauCgoIueTnI3JkzZ5SSnOLpMPKNmSnu0EeSHJJMkkNxhz5SVFAjORwOD0eXP5KSkrRlyxZPh1EsJCYmejqEHMuL3I78k5rrHPKSKUUOeRW7XCeR75A3yO1FV1HKneS/gqcw546izl3BvG3btlq4cGG+xpIT5HagcChK5xlwleUi+vjx4/Xkk0/m6pvfe++98vb2ztVlwj3foGBPh5BvLvzU7zxzfvpXoURjj8WVnxISEnTHHXd4OoxiITk52dMh5Fhe5Hbkn4tznSml2OU6iXyHvEFuL7qKUu4k/xU8hTl3FCcLFy4sdHehk9uBwqEonWfAVZaL6GPHjtX999/vfH38+HFVqlTpkt789ddf5070fDJu3DgdO1s87kS/+FO/VMXt07+QkBC98MILng6jWEhMTFSjRo08HUaO5EVuR/4g1/2LfIe8QG4vmopa7iT/FTyFOXcUJ4WtgC6R24HCoKidZ8BVlovo/v7+8vf3z9U3r1GjhkqUKJGry0T6/P395ZV81tNh5Iu0d6GfV9w+/fPx8VHNmjU9HUaxcPLkSU+HkGN5kduRP8h1/yLfIS+Q24umopY7yX8FT2HOHUWdu7vPC8OjXCRyO1AYFLXzDLjih0VRpLg+Cz0955+Nzi8jAyjMyHUAkH3kTgAXF8wLSwEdQMHHeUbRl+U70YHCIMWSdDLpkM7/mGh6TCeTDinFkuTt8M3P0AAg15DrACD7yJ0AJArnAPIG5xlFH0V0FCneXr7qGv2STief/6XyEwf3Km76ZF3e9w4FR0RJkgK8w+TtRcICUHhdnOvSQ64DAFfkTgAAkFc4zyj6KKKjyCnhW1YlfMtKkny8veVz2EclvSspLKCyZwMDgFx0Ya4DAGQNuRMAAOQVzjOKNp6JDgAAAAAAAACAGxTRAQAAAAAAAABwgyI6AAAAAAAAAABuUEQHAAAAAAAAAMANiugAAAAAAAAAALhBER0AAAAAAAAAADcoogMAAAAAAAAA4AZFdAAAAAAAAAAA3KCIDgAAAAAAAACAGxTRAQAAAAAAAABwgyI6AAAAAAAAAABuUEQHAAAAAAAAAMANiugAAAAAAAAAALhBER0AAAAAAAAAADcoogMAAAAAAAAA4IZPfr9hUFCQTpw44fw/ABR25LXz7R44cKAOnzon34BAT4cDAJeM3H6+3Z07d9bff/8tH78AT4cDFArkDhR0nLcDKGp8AwLV8ur2Onv8iAIC8u6cNd+L6A6HQyVKlMjvtwWAPENeO98Hvr6+8jlncjgcng4HAC4Zuf18H/j4+Pz//3s4GKCQIHegoOO8HUBR43A45O3t7fx/XuFxLgAAAAAAAAAAuEERHQAAAAAAAAAANyiiAwAAAAAAAADgBkV0AAAAAAAAAADcoIgOAAAAAAAAAIAbFNEBAAAAAAAAAHCDIjoAAAAAAAAAAG5QRAcAAAAAAAAAwA2K6AAAAAAAAAAAuEERHQAAAAAAAAAANyiiAwAAAAAAAADgBkV0AAAAAAAAAADcoIgOAAAAAAAAAIAbFNEBAAAAAAAAAHCDIjoAAAAAAAAAAG5QRAcAAAAAAAAAwA2K6AAAAAAAAAAAuEERHQAAAAAAAAAAN3w8HQDyT+Lhg/p54iOeDiNfJZ87K0la9fGb8vb183A0+Sfx8EEpqKKnw0AxVBzzTHFRUPMp+Q7IHwVt3wf5D8Cl4bwdQFFy+tiRPH8PiujFRFRUlKdD8IikJC8lpIQppESAfHyK0eYeVLHYrnN4Dttc0VZg8yn5DshTFSpUUGJiYsHb90H+A5Bj5A4ARU3JqEhJUnh4eJ69h8PMLCczHj9+XGFhYTp27JhCQ0NzOy4AKDYKUj4tSLEAQGFWkPJpQYoFAAqzgpRPC1IsAFCYZTWf8kx0AAAAAAAAAADcoIgOAAAAAAAAAIAbFNEBAAAAAAAAAHCDIjoAAAAAAAAAAG5QRAcAAAAAAAAAwA2K6AAAAAAAAAAAuEERHQAAAAAAAAAAN3xyOqOZSZKOHz+ea8EAQHGUmkdT86onkdsBIHeQ2wGg6CG3A0DRk9XcnuMiekJCgiSpUqVKOV0EAOACCQkJCgsL83gMErkdAHILuR0Aih5yOwAUPZnldofl8CPUlJQU7d27VyEhIXI4HNma9/jx46pUqZL++usvhYaG5uTtCyXaTbuLA9qd/XabmRISEhQVFSUvL88+ZYvcnn20u/i0uzi2WaLdOW03ub1gKkrtKUptkYpWe4pSWyTacyFye+FGu2l3cUC78y635/hOdC8vL1WsWDGns0uSQkNDi9UKTUW7ixfaXbzktN2evpMlFbk952h38VEc2yzR7pwgtxdcRak9RaktUtFqT1Fqi0R7UpHbCz/aXbzQ7uIlL3M7PywKAAAAAAAAAIAbFNEBAAAAAAAAAHDDI0V0f39/jRs3Tv7+/p54e4+h3bS7OKDdxavdFyqufUC7i0+7i2ObJdpd3Np9saLWD0WpPUWpLVLRak9RaotEe4qi4toHtJt2Fwe0O+/aneMfFgUAAAAAAAAAoKjjcS4AAAAAAAAAALhBER0AAAAAAAAAADcoogMAAAAAAAAA4AZFdAAAAAAAAAAA3KCIDgAAAAAAAACAGx4por/55puqXLmyAgIC1KJFCy1fvtwTYeSb8ePHq1mzZgoJCVFERIR69OihzZs3ezqsfDVhwgQ5HA6NHDnS06Hkiz179ujGG29UeHi4AgMDVb9+fa1cudLTYeWZ5ORkPfbYY6pSpYoCAwNVrVo1Pf300zIzT4eWq3755Rddf/31ioqKksPh0Ndff+0y3sz0+OOPKzIyUoGBgWrfvr22bt3qmWA9oLDk9ieeeEIOh8Plr3bt2s7xp0+f1rBhwxQeHq7g4GD17t1bBw4ccFnGrl271LVrVwUFBSkiIkKjR49WUlKSyzQLFy5U48aN5e/vr+rVq2vq1KlpYsnLPsuN7fWff/7RoEGDFBoaqpIlS+rWW2/ViRMnXKZZu3atrrzySgUEBKhSpUp6/vnn08Ty+eefq3bt2goICFD9+vU1a9asbMeSG20eOnRomnXfuXPnQt1mKWvnGQVpu85KLLnR5rZt26ZZ33fddVehbXNeyWy/SU9W+sQTstuWhQsXptlGHA6H9u/fnz8BZyCn1w+Z5R5PyUl7pk6dmmbdBAQE5FPEGZs0aZIaNGig0NBQhYaGqmXLlvrhhx8ynKegrpvstqUgr5eLZfUatKCum0uV3fPMotIP2Wn3u+++qyuvvFKlSpVSqVKl1L59+wJ7DZOZnF5XTJs2TQ6HQz169MjbAPNIdtt99OhRDRs2TJGRkfL391fNmjUL5bae3Xa/8sorqlWrlgIDA1WpUiWNGjVKp0+fzqdoL12BOV+1fDZt2jTz8/Oz999/3zZs2GC33367lSxZ0g4cOJDfoeSbTp062ZQpU2z9+vUWFxdnXbp0sejoaDtx4oSnQ8sXy5cvt8qVK1uDBg1sxIgRng4nz/3zzz8WExNjQ4cOtWXLltmOHTtszpw5tm3bNk+HlmeeeeYZCw8Pt5kzZ1p8fLx9/vnnFhwcbK+++qqnQ8tVs2bNskceecS++uork2QzZsxwGT9hwgQLCwuzr7/+2tasWWPdunWzKlWq2KlTpzwTcD4qTLl93LhxVrduXdu3b5/z7++//3aOv+uuu6xSpUo2f/58W7lypV1xxRUWGxvrHJ+UlGT16tWz9u3b2+rVq23WrFlWpkwZGzt2rHOaHTt2WFBQkN1///32xx9/2Ouvv27e3t42e/Zs5zR53We5sb127tzZGjZsaL/99pstWrTIqlevbgMGDHCOP3bsmJUrV84GDRpk69evt08//dQCAwPtnXfecU6zZMkS8/b2tueff97++OMPe/TRR83X19fWrVuXrVhyo81Dhgyxzp07u6z7f/75x2WawtZms6ydZxSk7TqzWHKrzW3atLHbb7/dZX0fO3as0LY5r2S231wsK33iKdlty08//WSSbPPmzS7bSXJycv4EnIGcXD9kJfd4Sk7aM2XKFAsNDXVZN/v378/HqN379ttv7fvvv7ctW7bY5s2b7eGHHzZfX19bv359utMX5HWT3bYU5PVyoaxegxbkdXMpsnueWVT6IbvtHjhwoL355pu2evVq27hxow0dOtTCwsJs9+7d+Rz5pcnpdUV8fLxVqFDBrrzySuvevXv+BJuLstvuM2fOWNOmTa1Lly62ePFii4+Pt4ULF1pcXFw+R35pstvujz/+2Pz9/e3jjz+2+Ph4mzNnjkVGRtqoUaPyOfKcKyjnq/leRG/evLkNGzbM+To5OdmioqJs/Pjx+R2Kxxw8eNAk2c8//+zpUPJcQkKC1ahRw+bOnWtt2rQpFkX0MWPGWOvWrT0dRr7q2rWr3XLLLS7DevXqZYMGDfJQRHnv4sSdkpJi5cuXtxdeeME57OjRo+bv72+ffvqpByLMX4Upt48bN84aNmyY7rijR4+ar6+vff75585hGzduNEm2dOlSMzt/APfy8nK5YJw0aZKFhobamTNnzMzswQcftLp167osu1+/ftapUyfn6/zss5xsr3/88YdJshUrVjin+eGHH8zhcNiePXvMzOytt96yUqVKOdttdj4H1qpVy/m6b9++1rVrV5d4WrRoYXfeeWeWY8mNNpudL6JndIFQ2Nuc6uLzjIK0XWclltxos5llet5R2NucF7JyUZKVPikIslNEP3LkSL7EdCmycv2QWe4pSLLSnilTplhYWFj+BXWJSpUqZf/973/THVeY1o1Zxm0pDOslO9eghW3dZFV2zzOLSj9c6vl1UlKShYSE2AcffJBXIeaJnLQ7KSnJYmNj7b///W+m58gFVXbbPWnSJKtataqdPXs2v0LME9lt97Bhw6xdu3Yuw+6//35r1apVnsaZVzx5vpqvj3M5e/asVq1apfbt2zuHeXl5qX379lq6dGl+huJRx44dkySVLl3aw5HkvWHDhqlr164u67yo+/bbb9W0aVP16dNHERERatSokd59911Ph5WnYmNjNX/+fG3ZskWStGbNGi1evFjXXnuthyPLP/Hx8dq/f7/Lth4WFqYWLVoU+fxWGHP71q1bFRUVpapVq2rQoEHatWuXJGnVqlU6d+6cS1tq166t6OhoZ1uWLl2q+vXrq1y5cs5pOnXqpOPHj2vDhg3OaS7Oe506dXIuw9N9lpXtdenSpSpZsqSaNm3qnKZ9+/by8vLSsmXLnNNcddVV8vPzc07TqVMnbd68WUeOHHFOk1Ff5Pe+s3DhQkVERKhWrVq6++67dfjwYee4otLmi88zCtJ2nZVYcqPNqT7++GOVKVNG9erV09ixY5WYmOgcV9jb7CmZ9UlhdPnllysyMlIdOnTQkiVLPB1OurJy/VCY1k1Wr4dOnDihmJgYVapUSd27d3fumwVJcnKypk2bppMnT6ply5bpTlNY1k1W2iIV/PWSnWvQwrJusiMn55lFoR9y4/w6MTFR586dK1S1mpy2+6mnnlJERIRuvfXW/Agz1+Wk3d9++61atmypYcOGqVy5cqpXr56effZZJScn51fYlywn7Y6NjdWqVaucj3zZsWOHZs2apS5duuRLzJ6QVznN55LmzqZDhw4pOTnZ5WJFksqVK6dNmzblZygek5KSopEjR6pVq1aqV6+e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GRnp8ntHBVlO2u2uXiOdPz4XRXmW0y7pZ0lzYNq0aebv729Tp061P/74w+644w4rWbKk7d+/P79DyTd33323hYWF2cKFC23fvn3Ov8TERE+Hlq8y+2X0omL58uXm4+NjzzzzjG3dutU+/vhjCwoKso8++sjToeWZIUOGWIUKFWzmzJkWHx9vX331lZUpU8YefPBBT4eWqxISEmz16tW2evVqk2Qvv/yyrV692v78808zM5swYYKVLFnSvvnmG1u7dq11797dqlSpYqdOnfJw5HmvMOX2Bx54wBYuXGjx8fG2ZMkSa9++vZUpU8YOHjxoZmZ33XWXRUdH24IFC2zlypXWsmVLa9mypXP+pKQkq1evnnXs2NHi4uJs9uzZVrZsWRs7dqxzmh07dlhQUJCNHj3aNm7caG+++aZ5e3vb7NmzndPkdZ/lxvbauXNna9SokS1btswWL15sNWrUsAEDBjjHHz161MqVK2c33XSTrV+/3qZNm2ZBQUH2zjvvOKdZsmSJ+fj42IsvvmgbN260cePGma+vr61bt845TW7tOxm1OSEhwf7zn//Y0qVLLT4+3ubNm2eNGze2GjVq2OnTpwttm82ydp5RkLbrzGLJjTZv27bNnnrqKVu5cqXFx8fbN998Y1WrVrWrrrqq0LY5r2SWKx566CG76aabnNNnpU88JbttmThxon399de2detWW7dunY0YMcK8vLxs3rx5nmqCU1b265tuuskeeugh5+us5B5PyUl7nnzySZszZ45t377dVq1aZf3797eAgADbsGGDJ5rg4qGHHrKff/7Z4uPjbe3atfbQQw+Zw+GwH3/80cwK17rJblsK8npJz8XXoIVp3VyKzI5NRbUfstvuCRMmmJ+fn33xxRcuuSkhIcFTTciR7Lb7YkOGDLHu3bvnU7S5J7vt3rVrl4WEhNjw4cNt8+bNNnPmTIuIiLD/+7//81QTciS77R43bpyFhITYp59+ajt27LAff/zRqlWrZn379vVUE7KtoJyv5nsR3czs9ddft+joaPPz87PmzZvbb7/95okw8o2kdP+mTJni6dDyVXEpopuZfffdd1avXj3z9/e32rVr2+TJkz0dUp46fvy4jRgxwqKjoy0gIMCqVq1qjzzyiJ35f+3deXxN1/7/8ffJPAchkhAxRgwRSm8uqvTSJrSq2t6qhhulSnGV6qRmvYZS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srKs6+rXr2/atGljXc7MzDTe3t5mwYIFxhhj+vfvbzNev1aTJk1Mx44drcv+/v5mzpw51uWc8fvmzZuNMcacOXPGdO3a1fj4+Jhjx45Zt0+fPt3muCEhIWbChAk2626//XYzYMAAY4wx7777rgkICDCXLl2ybn/77bdtznXt3xrG2LaZMca0bNnSxMXF2a1fWFiYef31123WRUZGmrFjx9rdBwBKyrXj8ZwfDw8PI8mcOXMmz/3uvfdeM2zYMGOMMZs2bTKSzIEDB3KVO378uJFkXnvttRvGEhYWZh544AGbdU899ZTx8/MreMWuidEYY9q2bWuaNWtmU2b48OGmYcOGNuteeOGF69YdyA+XvBLrQGlx8eJF7d27V3369FHfvn2t6zMzM+Xv729TtkmTJtb/BwcHS5JOnDihiIiIfJ8vMjJSbm5u1uUtW7Zoz5498vX1tSl3+fJlm0cAAAD+56677tLbb78tSTpz5ozeeustdezYUT/99JPCwsL06aef6o033tDevXuVkpKizMxM+fn52T3e8ePHNXLkSCUkJOjEiRPKyspSamqqDh06ZFPu6uuAt7e3/Pz8dOLECUlSUlKS2rRpI1dX11zHL8i1BgBKo1deeUV/+9vfCv09Qo0aNZKT0/9uUq5ataoaN25sXXZ2dlZAQIC1Ty0qrVq1kpOTky5evKjatWvr008/VdWqVa233bdo0cJa9vz58zpy5Ihat25tc4zWrVtry5YtkqTk5GQ1adJEHh4e1u0tW7YscFxJSUk214P8GDx4sJ566iktW7ZMHTp00EMPPWRzXQKAknT1eDxHYmKievToIUnKysrSxIkT9dlnn+mPP/5Qenq60tLS5OXlJUmKiopS+/btFRkZqZiYGN1zzz16+OGHVbFixXx9aejVru7LJckYk68vwL5RjDmaN29us5ycnKzo6GibdYW5FgDXIomOUi0lJUWSNGvWrFydoLOzs83y1YmRnA45OztbkuTk5JSro8/r+bve3t65zt+8eXPNmzcvV9kqVarktxoAUK54e3urbt261uXZs2fL399fs2bN0r333qu4uDiNGzdOMTEx8vf318KFC6/7BULx8fE6ffq0ZsyYobCwMLm7u6tly5a5Hqt1bYLcYrFYrwM5jwnIS0GuNQBQGt15552KiYnR8OHD1atXL+v6/I6B8+o/r9enhoeH69y5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/P777yUc+c0paL1z7N+/31SrVs20adPGdOnSpWSCLUIFrXdaWppp0aKF6dSpk1m3bp3Zv3+/SUhIMElJSSUc+c0paL3nzZtn3N3dzbx588z+/fvN999/b4KDg83QoUNLOPLCW7JkiRkxYoRZtGiRkWQWL1583fL79u0zXl5e5plnnjE7duwwM2fONM7Ozmbp0qUlE7ADFLYfKIvGjBljGjVqZI4ePWr9OXnypHV7//79TWhoqFmxYoX55ZdfzF//+lfTqlUr6/bMzEzTuHFj06FDB7N582azZMkSU7lyZTN8+HBrmfy8hkpzm9/oPTN58mTj7+9vvvzyS7NlyxZz//33m1q1aplLly5Zy8TGxpqoqCjz448/mrVr15q6deua7t27W7efO3fOVK1a1cTFxZnffvvNLFiwwHh6epp3333XWiY/44v8xFJSbtRu8fHxJjY21ua19+eff9qUKU/tFhMTY+bMmWN+++03k5SUZDp16mRq1KhhUlJSrGVK0/vxRrE4CuN2xu2M23Nj3M64/VYetwMACqdYkuh/+ctfzMCBA63LWVlZJiQkxEyaNCnP8o888oi59957bdZFR0ebfv36FUd4xaag9b5WZmam8fX1NR9++GFxhVgsClPvzMxM06pVKzN79mwTHx9fJgfjBa3322+/bWrXrm3S09NLKsRiUdB6Dxw40Pztb3+zWffMM8+Y1q1bF2ucxSU/g/Hnn3/eNGrUyGZdt27dTExMTDFG5lg32/+VJWPGjDFRUVF5bjt79qxxdXU1n3/+uXVdcnKykWQ2btxojLnyx52Tk5M5duyYtczbb79t/Pz8TFpamjEmf6+hstLm175nsrOzTVBQkJk6dap13dmzZ427u7tZsGCBMcaYHTt2GEnm559/tpb57rvvjMViMX/88Ycxxpi33nrLVKxY0dpmxhjzwgsvmPr161uXbzS+yE8sjmIviX6962V5b7cTJ04YSWb16tXWmErL+zE/sTgK4/YrGLczbr8a4/b/YdwOAMAVRf44l/T0dG3atEkdOnSwrnNyclKHDh20cePGPPfZuHGjTXlJiomJsVu+NCpMva+VmpqqjIwMVapUqbjCLHKFrff48eMVGBioPn36lESYRa4w9f7qq6/UsmVLDRw4UFWrVlXjxo01ceJEZWVllVTYN60w9W7VqpU2bdpkvXV03759WrJkiTp1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gLJr7ty5euSRR7RmzRolJiYqOjr6po7n5uamoKCgIoruf4KDg7Vq1Sr9/vvvql69unX9Bx98oBo1ahT5+UqKMUZZWVlyceFtDCBvsbGxmjNnjs06d3f3Qh3L09NTnp6eRRGWw4wbN07vvvuu/v3vf6tFixY6f/68fvnlF505c6ZE40hPT5ebm1uJnhMAisPNXGcqVapUHCEBAAAUC2aiI09ffPGFIiMj5enpqYCAAHXo0EEXL160bjfGaM6cOerZs6cee+wxvf/++7mOsX79erVr105eXl6qWLGiYmJidObMGfXq1UurV6/WjBkzrDNWDhw4YPM4l/Pnz8vT01PfffedzTEXL14sX19fpaamSpIOHz6sRx55RBUqVFClSpXUpUsXHThwwGafwMBA3XPPPfrwww+t6zZs2KBTp07p3nvvzRX37Nmz1aBBA3l4eCgiIkJvvfWWdVvObfyfffaZ2rRpI09PT91+++3atWuXfv75Z7Vo0UI+Pj7q2LGjTp48mevY48aNU5UqVeTn56f+/fsrPT3dui07O1uTJk1SrVq15OnpqaioKH3xxRfW7Tnt891336l58+Zyd3fXunXr7P0KAUDu7u4KCgqy+alYsaKMMRo7dqxq1Kghd3d3hYSEaPDgwZKu3Cl08OBBDR061NpHS7lniI8dO1ZNmza1fiDp4+OjAQMGKCsrS1OmTFFQUJACAwM1YcIEm5hee+01RUZGytvbW6GhoRowYIBSUlIkXennHn/8cZ07d8567rFjx0qS0tLS9Oyzz6patWry9vZWdHS0EhISbI49d+5c1ahRQ15eXuratatOnz5ts/2rr77SgAED9Pe//121atVSVFSU+vTpo2effdZaZunSpbrjjjtUoUIFBQQE6L777tPevXvttnFWVpb69Olj7bvr16+vGTNm2JTJudNrwoQJCgkJUf369TV+/Pg87+Rq2rSpRo0aZfd8AFCa2LvOJCQkyM3NTWvXrrWWnTJligIDA3X8+HFJtnem2rv2SNK6deus4+7Q0FANHjzY5u+SEydOqHPnzvL09FStWrU0b968kqk8AAAoV0iiI5ejR4+qe/fu6t27t5KTk5WQkKAHH3xQxhhrmVWrVik1NVUdOnRQjx49tHDhQpvBbFJSktq3b6+GDRtq48aNWrdunTp37qysrCzNmDFDLVu2VN++fXX06FEdPXpUoaGhNjH4+fnpvvvu0/z5823Wz5s3Tw888IC8vLyUkZGhmJgY+fr6au3atVq/fr18fHwUGxtrk5yWpN69e2vu3LnW5Q8++EBxcXG5ZgLOmzdPo0eP1oQJE5ScnKyJEydq1KhRNgl4SRozZoxGjhypX3/9VS4uLnrsscf0/PPPa8aMGVq7dq327Nmj0aNH2+yzYsUKa3suWLBAixYt0rhx46zbJ02apI8++kjvvPOOtm/frqFDh6pHjx5avXq1zXFefPFFTZ48WcnJyWrSpIm9XyMA2PWf//xHr7/+ut59913t3r1bX375pSIjIyVdub2+evXqGj9+vLWPtmfv3r367rvvtHTpUi1YsEDvv/++7r33Xv3+++9avXq1XnnlFY0cOVKJiYnWfZycnPTGG29o+/bt+vDDD7Vy5Uo9//zzkq481mv69Ony8/OznjsnwT1o0CBt3LhRCxcu1NatW/X3v/9dsbGx2r17tyQpMTFRffr00aBBg5SUlKS77rpL//rXv2ziDQoK0sqVK/P8kDPHxYsX9cwzz+iXX37RihUr5OTkpK5duyo7OzvP8tnZ2apevbo+//xz7dixQ6NHj9ZLL72kzz77zKbcihUrtHPnTi1fvlzffPON9Rr7888/W8ts3rxZW7du1eOPP243PgAoC3IS5D179tS5c+e0efNmjRo1SrNnz1bVqlVzlbd37dm7d69iY2P10EMPaevWrfr000+1bt06DRo0yLpvr169dPjwYa1atUpffPGF3nrrLZ04caLE6goAAMoJA/x/8fHxpkuXLmbTpk1Gkjlw4IDdso899pgZMmSIdTkqKsrMmTPHuty9e3fTunVru/u3bdvWPP300zbrVq1aZSSZM2fOGGOMWbx4sfHx8TEXL140xhhz7tw54+HhYb777jtjjDEff/yxqV+/vsnOzrYeIy0tzXh6eprvv//eGGPMmDFjTFRUlElPTzeBgYFm9erVJiUlxfj6+potW7aYp59+2rRt29a6f506dcz8+fNt4nr55ZdNy5YtjTHG7N+/30gys2fPtm5fsGCBkWRWrFhhXTdp0iRTv35963J8fLypVKmStS7GGPP2228bHx8fk5WVZS5fvmy8vLzMhg0bbM7dp08f0717d5v2+fLLL+22KwDkiI+PN87Ozsbb29vmZ8KECWbatGkmPDzcpKen57lvWFiYef31123WzZkzx/j7+1uXx4wZY7y8vMz58+et62JiYkzNmjVNVlaWdV39+vXNpEmT7Mb5+eefm4CAALvnMcaYgwcPGmdnZ/PHH3/YrG/fvr0ZPny4MebKdadTp04227t162ZzrO3bt5sGDRoYJycnExkZafr162eWLFliNzZjjDl58qSRZLZt22aM+d91YPPmzXb3GThwoHnooYesy/Hx8aZq1aomLS3NplzHjh3NU089ZV3+5z//adq1a3fdeACgtLjedcaYK+Pypk2bmkceecQ0bNjQ9O3b12b/a/8eyOva06dPH/Pkk0/arFu7dq1xcnIyly5dMjt37jSSzE8//WTdnpycbCTlOhYAAMDN4GHKyCUqKkrt27dXZGSkYmJidM899+jhhx9WxYoVJUlnz57VokWLbB4l0qNHD73//vvq1auXpCsz0f/+97/fVBydOnWSq6urvvrqKz366KP6z3/+Iz8/P3Xo0EGStGXLFu3Zs0e+vr42+12+fDnXrfeurq7q0aOH5syZo3379ik8PDzXLO6LFy9q79696tOnj/r27Wtdn5mZmevLTq/eN2c2Tc4szpx1186AiYqKkpeXl3W5ZcuWSklJ0eHDh5WSkqLU1FTdfffdNvukp6erWbNmNutatGiRR2sBQG533XWX3n77bZt1lSpV0sWLFzV9+nTVrl1bsbGx6tSpkzp37lzg71ioWbOmTR9ctWpVOTs7y8nJyWbd1f3hDz/8oEmTJum///2vzp8/r8zMTF2+fFmpqak2feTVtm3bpqysLIWHh9usT0tLU0BAgCQpOTlZXbt2tdnesmVLLV261LrcsGFD/fbbb9q0aZPWr1+vNWvWqHPnzurVq5f1y0V3796t0aNHKzExUadOnbLOQD906JDdL9J+88039cEHH+jQoUO6dOmS0tPT1bRpU5sykZGRue5+6tu3r3r37q3XXntNTk5Omj9/vl5//fU8zwEApZG964x05fuO5s2bpyZNmigsLKxQ/duWLVu0detWm0e0GGOUnZ2t/fv3a9euXXJxcVHz5s2t2yMiIortC6oBAED5RRIduTg7O2v58uXasGGDli1bppkzZ2rEiBFKTExUrVq1NH/+fF2+fNnmi0RzBrO7du1SeHh4kXz5nJubmx5++GHNnz9fjz76qObPn69u3bpZkzwpKSlq3rx5ns89rFKlSq51vXv3VnR0tH77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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import numpy as np\n", + "\n", + "num_cols = data.select_dtypes(include=np.number)# Selecciona todas las columnas numéricas\n", + "num_rows = 6 # Número de filas de la cuadrícula de gráficos\n", + "num_cols_grid = 4 # Número de columnas de la cuadrícula de gráficos\n", + "\n", + "fig, axes = plt.subplots(num_rows, num_cols_grid, figsize=(15, 10))\n", + "\n", + "# Bucle para iterar sobre todas las columnas numéricas y crear un diagrama de caja (boxplot) para cada una\n", + "for i, colname in enumerate(num_cols.columns):\n", + " # Calcula la posición (fila y columna) en la cuadrícula del gráfico actual\n", + " row = i // num_cols_grid # Fila correspondiente en la cuadrícula\n", + " col = i % num_cols_grid # Columna correspondiente en la cuadrícula\n", + " \n", + " # Crea el gráfico de boxplot para la columna 'colname' en la posición (row, col)\n", + " ax = sns.boxplot(x=data[colname], showmeans=True, ax=axes[row, col], \n", + " boxprops={\"facecolor\": \"#8ac6de\", \"linewidth\": 1.2}, # Color y grosor de las cajas\n", + " capprops={\"color\": \"black\", \"linewidth\": 1.5}, # Color y grosor de los bigotes\n", + " flierprops={\"marker\": \"o\", \"markersize\": 3}) # Marcador y tamaño de los valores atípicos\n", + "\n", + "# Eliminando los ejes vacíos si hay menos columnas numéricas que las posiciones de la cuadrícula\n", + "for j in range(i+1, num_rows*num_cols_grid):\n", + " row = j // num_cols_grid # Calcula la fila del gráfico vacío\n", + " col = j % num_cols_grid # Calcula la columna del gráfico vacío\n", + " fig.delaxes(axes[row, col]) # Elimina el gráfico vacío en la posición (row, col)\n", + "\n", + "fig.suptitle('Boxplot o diagrama de caja para cada una de las variables numéricas', fontsize=16)\n", + "plt.tight_layout() # Ajusta la distribución de espacios vacios\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "d8a1140d", + "metadata": {}, + "source": [ + "Visualmente podemos identificar algunos valores atipicos, que tienen sentido y probablemente no se deben a errores en la información. Por lo que no hace falta alterarlos." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cb8dcb36", + "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", + "
CreditScoreGeographyGenderAgeTenureBalanceNumOfProductsHasCrCardIsActiveMemberEstimatedSalaryExited
93550.7781.00.00.2972970.80.0000000.0000001.00.00.8351740.0
42720.5801.00.00.2162160.30.3101930.0000001.01.00.8427470.0
890.5700.50.00.1351350.30.3253260.3333331.01.00.7839740.0
44240.5020.50.00.3918920.10.5691630.0000001.01.00.2877350.0
48150.8500.50.00.7972970.60.5385480.0000001.00.00.1891430.0
45000.8420.51.00.1891890.90.3088390.0000000.00.00.1656730.0
50680.7241.00.00.8243240.50.4307670.0000001.01.00.8706200.0
72820.4621.00.00.3513510.70.7545620.3333331.00.00.2250951.0
1850.3280.01.00.1891890.80.0000000.3333331.00.00.4792740.0
73010.8340.50.00.2027030.10.5769400.0000001.01.00.6624090.0
\n", + "
" + ], + "text/plain": [ + " CreditScore Geography Gender Age Tenure Balance \\\n", + "9355 0.778 1.0 0.0 0.297297 0.8 0.000000 \n", + "4272 0.580 1.0 0.0 0.216216 0.3 0.310193 \n", + "89 0.570 0.5 0.0 0.135135 0.3 0.325326 \n", + "4424 0.502 0.5 0.0 0.391892 0.1 0.569163 \n", + "4815 0.850 0.5 0.0 0.797297 0.6 0.538548 \n", + "4500 0.842 0.5 1.0 0.189189 0.9 0.308839 \n", + "5068 0.724 1.0 0.0 0.824324 0.5 0.430767 \n", + "7282 0.462 1.0 0.0 0.351351 0.7 0.754562 \n", + "185 0.328 0.0 1.0 0.189189 0.8 0.000000 \n", + "7301 0.834 0.5 0.0 0.202703 0.1 0.576940 \n", + "\n", + " NumOfProducts HasCrCard IsActiveMember EstimatedSalary Exited \n", + "9355 0.000000 1.0 0.0 0.835174 0.0 \n", + "4272 0.000000 1.0 1.0 0.842747 0.0 \n", + "89 0.333333 1.0 1.0 0.783974 0.0 \n", + "4424 0.000000 1.0 1.0 0.287735 0.0 \n", + "4815 0.000000 1.0 0.0 0.189143 0.0 \n", + "4500 0.000000 0.0 0.0 0.165673 0.0 \n", + "5068 0.000000 1.0 1.0 0.870620 0.0 \n", + "7282 0.333333 1.0 0.0 0.225095 1.0 \n", + "185 0.333333 1.0 0.0 0.479274 0.0 \n", + "7301 0.000000 1.0 1.0 0.662409 0.0 " + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Normalizando los datos aplicando un scaler \n", + "from sklearn.preprocessing import MinMaxScaler\n", + "\n", + "scaler = MinMaxScaler()\n", + "data = pd.DataFrame(scaler.fit_transform(data), columns=data.columns)\n", + "data.sample(10)" + ] + }, + { + "cell_type": "markdown", + "id": "106c84df", + "metadata": {}, + "source": [ + "## Entrenamiento del modelo" + ] + }, + { + "cell_type": "code", + "execution_count": 12, "id": "21e4ba90-1206-4ce6-bdc8-6986e6b93ef5", "metadata": {}, "outputs": [], "source": [ "# Vamos a crear un modelo de regresion logistica\n", "from sklearn.model_selection import train_test_split\n", - "from sklearn.linear_model import LogisticRegression\n" + "from sklearn.svm import SVC\n", + "seed=42" ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 13, "id": "f45f3df3-bcbe-45f3-820c-82867e36d012", "metadata": {}, "outputs": [], @@ -277,62 +645,312 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 14, + "id": "8721e498", + "metadata": {}, + "outputs": [], + "source": [ + "from imblearn.over_sampling import SMOTE\n", + "\n", + "#Aplicamos balanceo de clases con SMOTE\n", + "oversample = SMOTE()\n", + "X, y = oversample.fit_resample(X, y)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, "id": "8a6ee78f-7c8b-4810-a763-c8b20155ec28", "metadata": {}, "outputs": [], "source": [ "# Separar los datos en datos de entrenamiento y testing\n", - "X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.33, random_state=42)" + "X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.33, random_state=42)\n", + "# Crear el modelo base\n", + "svm = SVC(random_state=seed)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "8cd168ca", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
RandomizedSearchCV(estimator=SVC(random_state=42), n_iter=50, n_jobs=-1,\n",
+       "                   param_distributions=[{'C': [1.0, 2.0, 5.0, 10.0, 25.0, 100.0,\n",
+       "                                               500.0, 1000.0],\n",
+       "                                         'kernel': ['linear'],\n",
+       "                                         'tol': [0.01, 0.001, 0.0001, 1e-05]},\n",
+       "                                        {'C': [1.0, 2.0, 5.0, 10.0, 25.0, 100.0,\n",
+       "                                               500.0, 1000.0],\n",
+       "                                         'gamma': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6,\n",
+       "                                                   0.7, 0.8, 0.9],\n",
+       "                                         'kernel': ['rbf'],\n",
+       "                                         'tol': [0.01, 0.001, 0.0001, 1e-05]},\n",
+       "                                        {'C': [1.0, 2.0, 5.0, 10.0, 25.0, 100.0,\n",
+       "                                               500.0, 1000.0],\n",
+       "                                         'degree': [2, 3, 4, 5, 6],\n",
+       "                                         'gamma': [0.01, 0.02, 0.03, 0.04,\n",
+       "                                                   0.05],\n",
+       "                                         'kernel': ['poly'],\n",
+       "                                         'tol': [0.01, 0.001, 0.0001, 1e-05]}],\n",
+       "                   random_state=42)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "RandomizedSearchCV(estimator=SVC(random_state=42), n_iter=50, n_jobs=-1,\n", + " param_distributions=[{'C': [1.0, 2.0, 5.0, 10.0, 25.0, 100.0,\n", + " 500.0, 1000.0],\n", + " 'kernel': ['linear'],\n", + " 'tol': [0.01, 0.001, 0.0001, 1e-05]},\n", + " {'C': [1.0, 2.0, 5.0, 10.0, 25.0, 100.0,\n", + " 500.0, 1000.0],\n", + " 'gamma': [0.1, 0.2, 0.3, 0.4, 0.5, 0.6,\n", + " 0.7, 0.8, 0.9],\n", + " 'kernel': ['rbf'],\n", + " 'tol': [0.01, 0.001, 0.0001, 1e-05]},\n", + " {'C': [1.0, 2.0, 5.0, 10.0, 25.0, 100.0,\n", + " 500.0, 1000.0],\n", + " 'degree': [2, 3, 4, 5, 6],\n", + " 'gamma': [0.01, 0.02, 0.03, 0.04,\n", + " 0.05],\n", + " 'kernel': ['poly'],\n", + " 'tol': [0.01, 0.001, 0.0001, 1e-05]}],\n", + " random_state=42)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Aproximandonos a los mejores hiperparametros con una busqueda aleatoria\n", + "from sklearn.model_selection import RandomizedSearchCV\n", + "\n", + "# Definir el espacio de búsqueda de hiperparámetros\n", + "param_distribution = [ {'C':[1.0,2.0,5.0,10.0,25.0,100.0,500.0,1000.0], 'kernel':['linear'],'tol':[1e-2,1e-3,1e-4,1e-5]},\n", + " {'C':[1.0,2.0,5.0,10.0,25.0,100.0,500.0,1000.0], 'kernel':['rbf'], 'gamma':[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9],'tol':[1e-2,1e-3,1e-4,1e-5]},\n", + " {'C':[1.0,2.0,5.0,10.0,25.0,100.0,500.0,1000.0], 'kernel':['poly'], 'degree': [2,3,4,5,6] ,'gamma':[0.01,0.02,0.03,0.04,0.05],'tol':[1e-2,1e-3,1e-4,1e-5]}]\n", + "\n", + "#Usamos RandomizedSearchCV teniendo en cuenta que este módelo no explora todas las combinaciones sino solo las que se indiquen en n_iter de forma aleatoria\n", + "random_search = RandomizedSearchCV(estimator=svm,\n", + " param_distributions=param_distribution,\n", + " n_iter=50,\n", + " random_state=seed,\n", + " n_jobs=-1)\n", + "\n", + "# Ejecutar la búsqueda aleatoria\n", + "random_search.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "64b64908", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Las 5 mejores combinaciones de hiperparámetros:\n", + "Combinación 8: {'tol': 0.001, 'kernel': 'rbf', 'gamma': 0.5, 'C': 500.0}, Puntuación: 0.822\n", + "Combinación 1: {'tol': 1e-05, 'kernel': 'rbf', 'gamma': 0.8, 'C': 100.0}, Puntuación: 0.822\n", + "Combinación 10: {'tol': 0.01, 'kernel': 'rbf', 'gamma': 0.4, 'C': 1000.0}, Puntuación: 0.822\n", + "Combinación 9: {'tol': 0.01, 'kernel': 'rbf', 'gamma': 0.7, 'C': 5.0}, Puntuación: 0.796\n", + "Combinación 2: {'tol': 0.001, 'kernel': 'rbf', 'gamma': 0.9, 'C': 2.0}, Puntuación: 0.794\n" + ] + } + ], + "source": [ + "results = random_search.cv_results_\n", + "\n", + "# Crear un DataFrame a partir de los resultados\n", + "results_df = pd.DataFrame(results)\n", + "\n", + "# Filtrar y ordenar los mejores resultados\n", + "top_results = results_df[['params', 'mean_test_score']].sort_values(by='mean_test_score', ascending=False)\n", + "\n", + "# Mostrar las 5 mejores combinaciones\n", + "print(\"Las 5 mejores combinaciones de hiperparámetros:\")\n", + "for index, row in top_results.head(5).iterrows():\n", + " print(f\"Combinación {index + 1}: {row['params']}, Puntuación: {row['mean_test_score']:.3f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "d0ee8400", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fitting 3 folds for each of 63 candidates, totalling 189 fits\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mejores hiperparámetros: {'C': 1000.0, 'gamma': 0.9, 'kernel': 'rbf', 'tol': 0.0001}\n", + "Mejor puntuación: 0.837\n" + ] + } + ], + "source": [ + "from sklearn.model_selection import GridSearchCV\n", + "\n", + "# Definir el espacio de búsqueda de hiperparámetros alrededor de los mejores encontrados\n", + "param_grid = {'C':np.logspace(1, 3, 3),\n", + " 'kernel':['rbf'], \n", + " 'gamma':np.linspace(0.6,0.9,7),\n", + " 'tol':np.logspace(-4, -2, 3)}\n", + "\n", + "# Configurar la búsqueda en cuadrícula\n", + "grid_search = GridSearchCV(estimator=svm, param_grid=param_grid, cv=3, verbose=1, n_jobs=-1)\n", + "\n", + "# Ejecutar la búsqueda en cuadrícula\n", + "grid_search.fit(X_train, y_train)\n", + "\n", + "# Mostrar los mejores hiperparámetros encontrados\n", + "print(f\"Mejores hiperparámetros: {grid_search.best_params_}\")\n", + "print(f\"Mejor puntuación: {grid_search.best_score_:.3f}\")" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 19, "id": "409f0391-4500-41fd-85a9-e501ecdd9329", "metadata": {}, "outputs": [], "source": [ - "# Crear el modelo y entrenarlo\n", - "clf_lin = LogisticRegression(random_state=0, solver='lbfgs', multi_class='multinomial').fit(X, y)\n" + "# Entrenar el modelo con los mejores hiperparametros\n", + "svm = SVC(random_state=42, **grid_search.best_params_).fit(X_train, y_train)" + ] + }, + { + "cell_type": "markdown", + "id": "9dc2f9e7", + "metadata": {}, + "source": [ + "## Evaluación del modelo" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 20, "id": "753ab797-0b07-4e27-a497-9518034451a9", "metadata": {}, "outputs": [ { "data": { + "image/png": "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1Lp1az3yyCMlvob4+Hjl5OTo66+/VpUqVYp93JgxYxQQEKDExEQFBARIkvr166dWrVpp4sSJWrRokc38Vq1aaf78+dbPf/zxh+bPn69XXnnlut917NgxLVmyRA899JAkqVu3bmrYsKEefvhhbdmyRW3btpUkNWrUSOHh4fr000+t1ejevXvr/vvvtzlfnz59FBYWpk8//VSPPvqo6tatq/bt22vOnDnq1q2bOnXqVCSGAwcOaPXq1QoPD79mrHXq1NGMGTP0+OOPa/Hixapfv75effVVPf300+rQocN1rxVA2cEbLu2PyjcAGxkZGZIkHx+fYs3/6quvJEnR0dE2488++6wkFekNb9y4sTXxlqSqVasqNDRUv/766w3H/L8u94p//vnnKigoKNYxx48fV1JSkgYPHmxNvCWpefPm6tatm/U6/+qvlWBJat++vf744w/rPbyWihUr2vzLQGhoqPz9/dWoUSNr4i3J+vNf74+3t7f159zcXP3xxx+qX7++/P39tXPnzmJcbaE6depcN/G+bMSIEQoPD9eoUaP06KOPql69epo6dWqxvwsAUIjkG4ANX19fSbJpc7iWI0eOyM3NTfXr17cZDw4Olr+/v44cOWIzXrNmzSLnqFSpks6cOXODERf14IMP6q677tKwYcMUFBSkgQMH6qOPPrpmIn45ztDQ0CL7GjVqpFOnThXpbf7fa6lUqZIkFetaqlevXqRP3c/PTzVq1Cgy9r/nvHjxoiZMmKAaNWrIbDarSpUqqlq1qs6ePatz585d97svq1OnTrHnStL8+fN14cIF7d+/X3FxcTa/BAAAiofkG4ANX19fhYSEaO/evSU67n8Tyatxd3e/4rjFYrnh78jPz7f57O3trYSEBK1du1aPPvqodu/erQcffFDdunUrMvdm3My1XO3Y4pxz1KhRevnllzVgwAB99NFHWrNmjeLj41W5cuViV/ollTh53rhxo/Uh2j179pToWABlg6MfsuSBSwB/S/fcc48OHjyoxMTE686tVauWCgoKtH//fpvx9PR0nT171rpySWmoVKmSzp49W2T8f6vrkuTm5qYuXbpo5syZ2rdvn15++WWtX79eGzZsuOK5L8eZkpJSZN/PP/+sKlWqOM2DhZ988okiIiI0Y8YM68Or7dq1K3JvivsLUXEcP35co0aNUvfu3XXPPffoueeeu+J9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mXT27NmrzjGZTFqxYkWxzzlp0iS1bNnypuI6fPiwTCaTkpKSbuo8AFyTxVLgNJurIvkGYHeDBw+WyWSSyWSSp6en6tevrylTpigvL8/u3/3ZZ5/ppZdeKtbc4iTMAADcDB64BGCIHj16aOHChcrOztZXX32lyMhIeXh4KCYmpsjcnJwceXp6lsr3BgQElMp5AAAoDVS+ARjCbDYrODhYtWrV0pNPPqmuXbvqiy++kPRnq8jLL7+skJAQhYaGSpJ+++03DRgwQP7+/goICFDfvn11+PBh6znz8/MVHR0tf39/Va5cWWPHji3yauT/bTvJzs7WuHHjVKNGDZnNZtWvX1/z58/X4cOH1blzZ0lSpUqVZDKZNHjwYEmF697GxsaqTp068vb2VosWLfTJJ5/YfM9XX32lBg0ayNvbW507d7aJs7jGjRunBg0aqHz58qpbt67Gjx+v3NzcIvPeeecd1ahRQ+XLl9eAAQN07tw5m/3vv/++GjVqJC8vLzVs2FBvv/12iWMB8PdkKbA4zeaqSL4BOIS3t7dycnKsn9etW6eUlBTFx8dr5cqVys3NVXh4uHx8fPTtt9/qu+++U8WKFdWjRw/rcTNmzFBcXJwWLFigzZs36/Tp01q+fPk1v/exxx7Tf//7X82ZM0c//fST3nnnHVWsWFE1atTQp59+KklKSUnR8ePHNXv2bElSbGysPvjgA82bN0/JycmKiorSI488ok2bNkkq/CWhf//+6tOnj5KSkjRs2DA9//zzJb4nPj4+iouL0759+zR79my99957ev31123mHDhwQB999JG+/PJLrV69Wj/++KOeeuop6/7FixdrwoQJevnll/XTTz9p6tSpGj9+vBYtWlTieAAApY+2EwCGslgsWrdunb755huNGjXKOl6hQgW9//771naT//znPyooKND7778vk8kkSVq4cKH8/f21ceNGde/eXbNmzVJMTIz69+8vSZo3b56++eabq373L7/8oo8++kjx8fHq2rWrJKlu3brW/ZdbVAIDA+Xv7y+psFI+depUrV27VmFhYdZjNm/erHfeeUcdO3bU3LlzVa9ePc2YMUOSFBoaqj179uiVV14p0b158cUXrT/Xrl1bzz33nJYuXaqxY8daxy9duqQPPvhAt9xyiyTpjTfeUO/evTVjxgwFBwdr4sSJmjFjhvWe1KlTR/v27dM777yjiIiIEsUDACh9JN8ADLFy5UpVrFhRubm5Kigo0MMPP6xJkyZZ9zdr1symz3vXrl06cOCAfHx8bM5z6dIlHTx4UOfOndPx48fVtm1b675y5crptttuK9J6cllSUpLc3d3VsWPHYsd94MABXbhwQd26dbMZz8nJUatWrSRJP/30k00ckqyJekksW7ZMc+bM0cGDB5WZmam8vDz5+vrazKlZs6Y18b78PQUFBUpJSZGPj48OHjyooUOHavjw4dY5eXl58vPzK3E8AP5+XLndw1mQfAMwROfOnTV37lx5enoqJCRE5crZ/vFToUIFm8+ZmZlq06aNFi9eXORcVatWvaEYvL29S3xMZmamJGnVqlU2Sa9U2MdeWhITEzVo0CBNnjxZ4eHh8vPz09KlS63V9JLE+t577xX5ZcDd3b3UYgUA3DiSbwCGqFChgurXr1/s+a1bt9ayZcsUGBhYpPp7WbVq1fT999+rQ4cOkgorvDt27FDr1q2vOL9Zs2YqKCjQpk2brG0nf3W58p6fn28da9y4scxms1JTU69aMW/UqJH14dHLtm7dev2L/IstW7aoVq1a+ve//20dO3LkSJF5qampOnbsmEJCQqzf4+bmptDQUAUFBSkkJES//vqrBg0aVKLvBwBJKnDh9bWdBQ9cAnBKgwYNUpUqVdS3b199++23OnTokDZu3KjRo0fr6NGjkqSnn35a06ZN04oVK/Tzzz/rqaeeuuYa3bVr11ZERISGDBmiFStWWM/50UcfSZJq1aolk8mklStX6uTJk8rMzJSPj4+ee+45RUVFadGiRTp48KB27typN954w/oQ4xNPPKH9+/drzJgxSklJ0ZIlSxQXF1ei67311luVmpqqpUuX6uDBg5ozZ84VHx718vJSRESEdu3apW+//VajR4/WgAEDFBwcLEmaPHmyYmNjNWfOHP3yyy/as2ePFi5cqJkzZ5YoHgCAfZB8A3BK5cuXV0JCgmrWrKn+/furUaNGGjp0qC5dumSthD/77LN69NFHFRERobCwMPn4+Oif//znNc87d+5c3X///XrqqafUsGFDDR8+XFlZWZKkW265RZMnT9bzzz+voKAgjRw5UpL00ksvafz48YqNjVWjRo3Uo0cPrVq1SnXq1JFU2If96aefasWKFWrRooXmzZunqVOnluh67733XkVFRWnkyJFq2bKltmzZovHjxxeZV79+ffXv31+9evVS9+7d1bx5c5ulBIcNG6b3339fCxcuVLNmzdSxY0fFxcVZYwUAOJbJcrUnkwAAAPC30v3RHx0dgtWaD1s5OgS7oPINAAAAGITkGwAAADAIq50AAABAkmQpYLUTe6PyDQAAABiEyjcAAAAk8YZLI1D5BgAAAAxC8g0AAAAYhLYTAAAASJIsvF7e7qh8AwAAAAYh+QYAAAAMQtsJAAAAJEkFrHZid1S+AQAAAINQ+QYAAIAk3nBpBCrfAAAAgEFIvgEAAACD0HYCAAAASbxe3ghUvgEAAACDkHwDAAAABqHtBAAAAJJ4vbwRqHwDAAAABiH5BgAAAAxC2wkAAAAksdqJEah8AwAAAAah8g0AAABJvF7eCFS+AQAAAIOQfAMAAAAGMVksFjrrAQAAAANQ+QYAAAAMQvINAAAAGITkGwAAADAIyTcAAABgEJJvAAAAwCAk3wAAAIBBSL4BAAAAg5B8AwAAAAYh+QYAAAAM8v8BPZcgA5GhZuoAAAAASUVORK5CYII=", "text/plain": [ - "array([[2599, 58],\n", - " [ 597, 46]])" + "
" ] }, - "execution_count": 31, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "# Medir los resultados obtenidos\n", + "# Medir los resultados obtenidos usando una matriz de confusión\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", "from sklearn.metrics import confusion_matrix\n", - "confusion_matrix(y_test, clf_lin.predict(X_test))\n" + "cm = confusion_matrix(y_test, svm.predict(X_test))\n", + "\n", + "#Visualizar la matriz de confusión\n", + "plt.figure(figsize=(9,9))\n", + "plt.title('Confusion matrix')\n", + "sns.heatmap(cm, annot=True, fmt='g', linewidths=.5, square=True, cmap='coolwarm')\n", + "plt.ylabel('Actual label')\n", + "plt.xlabel('Predicted label')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "1e21c8b3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Accuracy model: 0.853\n", + "Exited Churn='NO': 0.814\n", + "Exited Churn='YES': 0.892\n", + "F1 Score: 0.857\n" + ] + } + ], + "source": [ + "# Metricas de éxito propuestas para evaluar el modelo, en todas se busca un valor cercano a 1\n", + "from sklearn.metrics import accuracy_score, recall_score, f1_score\n", + "\n", + "# Predecir resultados con los datos de prueba\n", + "prediction_test = svm.predict(X_test)\n", + "\n", + "# Exactitud: proporción de predicciones correctas.\n", + "print(f\"Accuracy model: {accuracy_score(y_test, prediction_test):.3f}\")\n", + "\n", + "# Sensibilidad: capacidad del modelo de identificar todas las muestras positivas para un label.\n", + "print(f\"Exited Churn='NO': {recall_score(y_test, prediction_test, pos_label=0):.3f}\")\n", + "print(f\"Exited Churn='YES': {recall_score(y_test, prediction_test, pos_label=1):.3f}\")\n", + "\n", + "# F1 Score: media armónica entre precisión y sensibilidad, nos da una mejor idea de que tan bien se comporta el modelo de forma global.\n", + "print(f\"F1 Score: {f1_score(y_test, prediction_test):.3f}\")\n", + "# En ocasiones, esta última metrica se usa en competiciones (Kaggle, DataDriven) para comparar modelos.\n" + ] + }, + { + "cell_type": "markdown", + "id": "8f3fabc9", + "metadata": {}, + "source": [ + "## Exportación con pickle" ] }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 23, "id": "20f25624-4ba7-4c0d-a79a-590d1884b7d0", "metadata": {}, "outputs": [], "source": [ "# Generar el binario del modelo para reutilizarlo, equivalencia de variables categoricas y caracteristicas del modelo\n", "import pickle\n", - "pickle.dump(clf_lin, open(\"churn/models/model.pk\", \"wb\"))\n", - "pickle.dump(column_equivalence, open(\"churn/models/column_equivalence.pk\", \"wb\"))\n", - "pickle.dump(features, open(\"churn/models/features.pk\", \"wb\"))" + "#Tener en cuenta esta nota de la documentación de Python\n", + "#\"Warning: The pickle module is not secure. Only unpickle data you trust.\"\n", + "\n", + "pickle.dump(svm, open(\"models/model.pk\", \"wb\"))\n", + "pickle.dump(column_equivalence, open(\"models/column_equivalence.pk\", \"wb\"))\n", + "pickle.dump(features, open(\"models/features.pk\", \"wb\"))" ] } ], @@ -352,7 +970,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.3" + "version": "3.12.1" } }, "nbformat": 4, diff --git a/references/.gitkeep b/references/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/reports/.gitkeep b/reports/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/reports/figures/.gitkeep b/reports/figures/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/requirements.txt b/requirements.txt index d1f71c12..3e995629 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,6 @@ -pandas==2.18.4 -sklearn==1.3.4 +#pandas==2.18.4 +#sklearn==1.3.4 +pandas==2.1.4 +scikit-learn==1.3.0 +flask==2.3.3 +imbalanced-learn==0.11.0 \ No newline at end of file