olive-oil-transformer-model/models/solarenergy/.ipynb_checkpoints/solarenergy_model_v1-checkpoint.ipynb

2987 lines
389 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "8adcbe0819b88578",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Hit:1 http://security.ubuntu.com/ubuntu jammy-security InRelease\n",
"Hit:2 http://archive.ubuntu.com/ubuntu jammy InRelease\n",
"Hit:3 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64 InRelease\n",
"Hit:4 http://archive.ubuntu.com/ubuntu jammy-updates InRelease\n",
"Hit:5 http://archive.ubuntu.com/ubuntu jammy-backports InRelease\n",
"Reading package lists... Done\n",
"Reading package lists... Done\n",
"Building dependency tree... Done\n",
"Reading state information... Done\n",
"graphviz is already the newest version (2.42.2-6ubuntu0.1).\n",
"0 upgraded, 0 newly installed, 0 to remove and 121 not upgraded.\n",
"Requirement already satisfied: tensorflow in /usr/local/lib/python3.11/dist-packages (2.14.0)\n",
"Requirement already satisfied: absl-py>=1.0.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (2.0.0)\n",
"Requirement already satisfied: astunparse>=1.6.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (1.6.3)\n",
"Requirement already satisfied: flatbuffers>=23.5.26 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (23.5.26)\n",
"Requirement already satisfied: gast!=0.5.0,!=0.5.1,!=0.5.2,>=0.2.1 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (0.5.4)\n",
"Requirement already satisfied: google-pasta>=0.1.1 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (0.2.0)\n",
"Requirement already satisfied: h5py>=2.9.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (3.9.0)\n",
"Requirement already satisfied: libclang>=13.0.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (16.0.6)\n",
"Requirement already satisfied: ml-dtypes==0.2.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (0.2.0)\n",
"Requirement already satisfied: numpy>=1.23.5 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (1.26.0)\n",
"Requirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (3.3.0)\n",
"Requirement already satisfied: packaging in /usr/local/lib/python3.11/dist-packages (from tensorflow) (23.1)\n",
"Requirement already satisfied: protobuf!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5,<5.0.0dev,>=3.20.3 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (4.24.3)\n",
"Requirement already satisfied: setuptools in /usr/local/lib/python3.11/dist-packages (from tensorflow) (68.2.2)\n",
"Requirement already satisfied: six>=1.12.0 in /usr/lib/python3/dist-packages (from tensorflow) (1.16.0)\n",
"Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (2.3.0)\n",
"Requirement already satisfied: typing-extensions>=3.6.6 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (4.8.0)\n",
"Requirement already satisfied: wrapt<1.15,>=1.11.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (1.14.1)\n",
"Requirement already satisfied: tensorflow-io-gcs-filesystem>=0.23.1 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (0.37.1)\n",
"Requirement already satisfied: grpcio<2.0,>=1.24.3 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (1.58.0)\n",
"Requirement already satisfied: tensorboard<2.15,>=2.14 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (2.14.0)\n",
"Requirement already satisfied: tensorflow-estimator<2.15,>=2.14.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (2.14.0)\n",
"Requirement already satisfied: keras<2.15,>=2.14.0 in /usr/local/lib/python3.11/dist-packages (from tensorflow) (2.14.0)\n",
"Requirement already satisfied: wheel<1.0,>=0.23.0 in /usr/local/lib/python3.11/dist-packages (from astunparse>=1.6.0->tensorflow) (0.41.2)\n",
"Requirement already satisfied: google-auth<3,>=1.6.3 in /usr/local/lib/python3.11/dist-packages (from tensorboard<2.15,>=2.14->tensorflow) (2.23.1)\n",
"Requirement already satisfied: google-auth-oauthlib<1.1,>=0.5 in /usr/local/lib/python3.11/dist-packages (from tensorboard<2.15,>=2.14->tensorflow) (1.0.0)\n",
"Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.11/dist-packages (from tensorboard<2.15,>=2.14->tensorflow) (3.4.4)\n",
"Requirement already satisfied: requests<3,>=2.21.0 in /usr/local/lib/python3.11/dist-packages (from tensorboard<2.15,>=2.14->tensorflow) (2.31.0)\n",
"Requirement already satisfied: tensorboard-data-server<0.8.0,>=0.7.0 in /usr/local/lib/python3.11/dist-packages (from tensorboard<2.15,>=2.14->tensorflow) (0.7.1)\n",
"Requirement already satisfied: werkzeug>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from tensorboard<2.15,>=2.14->tensorflow) (2.3.7)\n",
"Requirement already satisfied: cachetools<6.0,>=2.0.0 in /usr/local/lib/python3.11/dist-packages (from google-auth<3,>=1.6.3->tensorboard<2.15,>=2.14->tensorflow) (5.3.1)\n",
"Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.11/dist-packages (from google-auth<3,>=1.6.3->tensorboard<2.15,>=2.14->tensorflow) (0.3.0)\n",
"Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.11/dist-packages (from google-auth<3,>=1.6.3->tensorboard<2.15,>=2.14->tensorflow) (4.9)\n",
"Requirement already satisfied: urllib3>=2.0.5 in /usr/local/lib/python3.11/dist-packages (from google-auth<3,>=1.6.3->tensorboard<2.15,>=2.14->tensorflow) (2.0.5)\n",
"Requirement already satisfied: requests-oauthlib>=0.7.0 in /usr/local/lib/python3.11/dist-packages (from google-auth-oauthlib<1.1,>=0.5->tensorboard<2.15,>=2.14->tensorflow) (1.3.1)\n",
"Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.21.0->tensorboard<2.15,>=2.14->tensorflow) (3.2.0)\n",
"Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.21.0->tensorboard<2.15,>=2.14->tensorflow) (3.4)\n",
"Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests<3,>=2.21.0->tensorboard<2.15,>=2.14->tensorflow) (2023.7.22)\n",
"Requirement already satisfied: MarkupSafe>=2.1.1 in /usr/local/lib/python3.11/dist-packages (from werkzeug>=1.0.1->tensorboard<2.15,>=2.14->tensorflow) (2.1.3)\n",
"Requirement already satisfied: pyasn1<0.6.0,>=0.4.6 in /usr/local/lib/python3.11/dist-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard<2.15,>=2.14->tensorflow) (0.5.0)\n",
"Requirement already satisfied: oauthlib>=3.0.0 in /usr/lib/python3/dist-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<1.1,>=0.5->tensorboard<2.15,>=2.14->tensorflow) (3.2.0)\n",
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3 -m pip install --upgrade pip\u001b[0m\n",
"Requirement already satisfied: numpy in /usr/local/lib/python3.11/dist-packages (1.26.0)\n",
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3 -m pip install --upgrade pip\u001b[0m\n",
"Requirement already satisfied: pandas in /usr/local/lib/python3.11/dist-packages (2.2.3)\n",
"Requirement already satisfied: numpy>=1.23.2 in /usr/local/lib/python3.11/dist-packages (from pandas) (1.26.0)\n",
"Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/dist-packages (from pandas) (2.8.2)\n",
"Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas) (2024.2)\n",
"Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas) (2024.2)\n",
"Requirement already satisfied: six>=1.5 in /usr/lib/python3/dist-packages (from python-dateutil>=2.8.2->pandas) (1.16.0)\n",
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3 -m pip install --upgrade pip\u001b[0m\n",
"Requirement already satisfied: keras in /usr/local/lib/python3.11/dist-packages (2.14.0)\n",
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3 -m pip install --upgrade pip\u001b[0m\n",
"Requirement already satisfied: scikit-learn in /usr/local/lib/python3.11/dist-packages (1.5.2)\n",
"Requirement already satisfied: numpy>=1.19.5 in /usr/local/lib/python3.11/dist-packages (from scikit-learn) (1.26.0)\n",
"Requirement already satisfied: scipy>=1.6.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn) (1.14.1)\n",
"Requirement already satisfied: joblib>=1.2.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn) (1.4.2)\n",
"Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.11/dist-packages (from scikit-learn) (3.5.0)\n",
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3 -m pip install --upgrade pip\u001b[0m\n",
"Requirement already satisfied: matplotlib in /usr/local/lib/python3.11/dist-packages (3.8.0)\n",
"Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (1.1.1)\n",
"Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (0.11.0)\n",
"Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (4.42.1)\n",
"Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (1.4.5)\n",
"Requirement already satisfied: numpy<2,>=1.21 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (1.26.0)\n",
"Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (23.1)\n",
"Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (10.0.1)\n",
"Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (3.2.0)\n",
"Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.11/dist-packages (from matplotlib) (2.8.2)\n",
"Requirement already satisfied: six>=1.5 in /usr/lib/python3/dist-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n",
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3 -m pip install --upgrade pip\u001b[0m\n",
"Requirement already satisfied: joblib in /usr/local/lib/python3.11/dist-packages (1.4.2)\n",
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3 -m pip install --upgrade pip\u001b[0m\n",
"Requirement already satisfied: pyarrow in /usr/local/lib/python3.11/dist-packages (18.1.0)\n",
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3 -m pip install --upgrade pip\u001b[0m\n",
"Requirement already satisfied: fastparquet in /usr/local/lib/python3.11/dist-packages (2024.11.0)\n",
"Requirement already satisfied: pandas>=1.5.0 in /usr/local/lib/python3.11/dist-packages (from fastparquet) (2.2.3)\n",
"Requirement already satisfied: numpy in /usr/local/lib/python3.11/dist-packages (from fastparquet) (1.26.0)\n",
"Requirement already satisfied: cramjam>=2.3 in /usr/local/lib/python3.11/dist-packages (from fastparquet) (2.9.0)\n",
"Requirement already satisfied: fsspec in /usr/local/lib/python3.11/dist-packages (from fastparquet) (2024.10.0)\n",
"Requirement already satisfied: packaging in /usr/local/lib/python3.11/dist-packages (from fastparquet) (23.1)\n",
"Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.5.0->fastparquet) (2.8.2)\n",
"Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.5.0->fastparquet) (2024.2)\n",
"Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.5.0->fastparquet) (2024.2)\n",
"Requirement already satisfied: six>=1.5 in /usr/lib/python3/dist-packages (from python-dateutil>=2.8.2->pandas>=1.5.0->fastparquet) (1.16.0)\n",
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3 -m pip install --upgrade pip\u001b[0m\n",
"Requirement already satisfied: scipy in /usr/local/lib/python3.11/dist-packages (1.14.1)\n",
"Requirement already satisfied: numpy<2.3,>=1.23.5 in /usr/local/lib/python3.11/dist-packages (from scipy) (1.26.0)\n",
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3 -m pip install --upgrade pip\u001b[0m\n",
"Requirement already satisfied: seaborn in /usr/local/lib/python3.11/dist-packages (0.13.2)\n",
"Requirement already satisfied: numpy!=1.24.0,>=1.20 in /usr/local/lib/python3.11/dist-packages (from seaborn) (1.26.0)\n",
"Requirement already satisfied: pandas>=1.2 in /usr/local/lib/python3.11/dist-packages (from seaborn) (2.2.3)\n",
"Requirement already satisfied: matplotlib!=3.6.1,>=3.4 in /usr/local/lib/python3.11/dist-packages (from seaborn) (3.8.0)\n",
"Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.1.1)\n",
"Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.11/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (0.11.0)\n",
"Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (4.42.1)\n",
"Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (1.4.5)\n",
"Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (23.1)\n",
"Requirement already satisfied: pillow>=6.2.0 in /usr/local/lib/python3.11/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (10.0.1)\n",
"Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.11/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (3.2.0)\n",
"Requirement already satisfied: python-dateutil>=2.7 in /usr/local/lib/python3.11/dist-packages (from matplotlib!=3.6.1,>=3.4->seaborn) (2.8.2)\n",
"Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.2->seaborn) (2024.2)\n",
"Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.11/dist-packages (from pandas>=1.2->seaborn) (2024.2)\n",
"Requirement already satisfied: six>=1.5 in /usr/lib/python3/dist-packages (from python-dateutil>=2.7->matplotlib!=3.6.1,>=3.4->seaborn) (1.16.0)\n",
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3 -m pip install --upgrade pip\u001b[0m\n",
"Requirement already satisfied: tqdm in /usr/local/lib/python3.11/dist-packages (4.67.1)\n",
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3 -m pip install --upgrade pip\u001b[0m\n",
"Requirement already satisfied: pydot in /usr/local/lib/python3.11/dist-packages (3.0.2)\n",
"Requirement already satisfied: pyparsing>=3.0.9 in /usr/local/lib/python3.11/dist-packages (from pydot) (3.2.0)\n",
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3 -m pip install --upgrade pip\u001b[0m\n",
"Requirement already satisfied: tensorflow-io in /usr/local/lib/python3.11/dist-packages (0.37.1)\n",
"Requirement already satisfied: tensorflow-io-gcs-filesystem==0.37.1 in /usr/local/lib/python3.11/dist-packages (from tensorflow-io) (0.37.1)\n",
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3 -m pip install --upgrade pip\u001b[0m\n",
"Requirement already satisfied: tensorflow-addons in /usr/local/lib/python3.11/dist-packages (0.23.0)\n",
"Requirement already satisfied: packaging in /usr/local/lib/python3.11/dist-packages (from tensorflow-addons) (23.1)\n",
"Requirement already satisfied: typeguard<3.0.0,>=2.7 in /usr/local/lib/python3.11/dist-packages (from tensorflow-addons) (2.13.3)\n",
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n",
"\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython3 -m pip install --upgrade pip\u001b[0m\n"
]
}
],
"source": [
"# from opt_einsum.paths import branch_1\n",
"!apt-get update\n",
"!apt-get install graphviz -y\n",
"\n",
"!pip install tensorflow\n",
"!pip install numpy\n",
"!pip install pandas\n",
"\n",
"!pip install keras\n",
"!pip install scikit-learn\n",
"!pip install matplotlib\n",
"!pip install joblib\n",
"!pip install pyarrow\n",
"!pip install fastparquet\n",
"!pip install scipy\n",
"!pip install seaborn\n",
"!pip install tqdm\n",
"!pip install pydot\n",
"!pip install tensorflow-io\n",
"!pip install tensorflow-addons"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "e6fe6bb613168a8a",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"2024-11-27 23:17:43.475455: E tensorflow/compiler/xla/stream_executor/cuda/cuda_dnn.cc:9342] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n",
"2024-11-27 23:17:43.475499: E tensorflow/compiler/xla/stream_executor/cuda/cuda_fft.cc:609] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n",
"2024-11-27 23:17:43.475533: E tensorflow/compiler/xla/stream_executor/cuda/cuda_blas.cc:1518] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n",
"2024-11-27 23:17:43.483362: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
"To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
"/usr/local/lib/python3.11/dist-packages/tensorflow_addons/utils/tfa_eol_msg.py:23: UserWarning: \n",
"\n",
"TensorFlow Addons (TFA) has ended development and introduction of new features.\n",
"TFA has entered a minimal maintenance and release mode until a planned end of life in May 2024.\n",
"Please modify downstream libraries to take dependencies from other repositories in our TensorFlow community (e.g. Keras, Keras-CV, and Keras-NLP). \n",
"\n",
"For more information see: https://github.com/tensorflow/addons/issues/2807 \n",
"\n",
" warnings.warn(\n"
]
}
],
"source": [
"import tensorflow as tf\n",
"from tensorflow.keras.layers import (\n",
" Dense, LSTM, MultiHeadAttention, Dropout, BatchNormalization, \n",
" LayerNormalization, Input, Activation, Lambda, Bidirectional, \n",
" Add, MaxPooling1D, SpatialDropout1D, GlobalAveragePooling1D,\n",
" GlobalMaxPooling1D, Concatenate, ThresholdedReLU, Average,\n",
" Conv1D, Multiply\n",
")\n",
"from tensorflow.keras import regularizers\n",
"from tensorflow.keras.models import Model\n",
"from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau\n",
"from tensorflow.keras.optimizers import AdamW\n",
"from tensorflow.keras.metrics import AUC\n",
"from tensorflow.keras.utils import plot_model\n",
"\n",
"# Data processing and analysis\n",
"import pandas as pd\n",
"import numpy as np\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import RobustScaler\n",
"from sklearn.metrics import (\n",
" mean_absolute_error, mean_squared_error, r2_score, \n",
" confusion_matrix, classification_report, roc_auc_score\n",
")\n",
"\n",
"# Visualization\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"# Additional utilities\n",
"import tensorflow_addons as tfa\n",
"from scipy import stats\n",
"import json\n",
"from datetime import datetime\n",
"import os\n",
"import joblib\n",
"\n",
"folder_name = datetime.now().strftime(\"%Y-%m-%d_%H-%M\")\n",
"\n",
"random_state_value = None"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "3da8b15c7eb9833f",
"metadata": {},
"outputs": [],
"source": [
"def get_season(date):\n",
" month = date.month\n",
" day = date.day\n",
" if (month == 12 and day >= 21) or (month <= 3 and day < 20):\n",
" return 'Winter'\n",
" elif (month == 3 and day >= 20) or (month <= 6 and day < 21):\n",
" return 'Spring'\n",
" elif (month == 6 and day >= 21) or (month <= 9 and day < 23):\n",
" return 'Summer'\n",
" elif (month == 9 and day >= 23) or (month <= 12 and day < 21):\n",
" return 'Autumn'\n",
" else:\n",
" return 'Unknown'\n",
"\n",
"\n",
"def get_time_period(hour):\n",
" if 5 <= hour < 12:\n",
" return 'Morning'\n",
" elif 12 <= hour < 17:\n",
" return 'Afternoon'\n",
" elif 17 <= hour < 21:\n",
" return 'Evening'\n",
" else:\n",
" return 'Night'\n",
"\n",
"\n",
"def add_time_features(df):\n",
" df['datetime'] = pd.to_datetime(df['datetime'])\n",
" df['timestamp'] = df['datetime'].astype(np.int64) // 10 ** 9\n",
" df['year'] = df['datetime'].dt.year\n",
" df['month'] = df['datetime'].dt.month\n",
" df['day'] = df['datetime'].dt.day\n",
" df['hour'] = df['datetime'].dt.hour\n",
" df['minute'] = df['datetime'].dt.minute\n",
" df['hour_sin'] = np.sin(df['hour'] * (2 * np.pi / 24))\n",
" df['hour_cos'] = np.cos(df['hour'] * (2 * np.pi / 24))\n",
" df['day_of_week'] = df['datetime'].dt.dayofweek\n",
" df['day_of_year'] = df['datetime'].dt.dayofyear\n",
" df['week_of_year'] = df['datetime'].dt.isocalendar().week.astype(int)\n",
" df['quarter'] = df['datetime'].dt.quarter\n",
" df['is_month_end'] = df['datetime'].dt.is_month_end.astype(int)\n",
" df['is_quarter_end'] = df['datetime'].dt.is_quarter_end.astype(int)\n",
" df['is_year_end'] = df['datetime'].dt.is_year_end.astype(int)\n",
" df['month_sin'] = np.sin(df['month'] * (2 * np.pi / 12))\n",
" df['month_cos'] = np.cos(df['month'] * (2 * np.pi / 12))\n",
" df['day_of_year_sin'] = np.sin(df['day_of_year'] * (2 * np.pi / 365.25))\n",
" df['day_of_year_cos'] = np.cos(df['day_of_year'] * (2 * np.pi / 365.25))\n",
" df['season'] = df['datetime'].apply(get_season)\n",
" df['time_period'] = df['hour'].apply(get_time_period)\n",
" return df\n",
"\n",
"\n",
"def add_solar_features(df):\n",
" # Features based only on radiation and other available variables\n",
" df['solar_elevation'] = np.sin(df['day_of_year'] * (2 * np.pi / 365.25)) * np.sin(df['hour'] * (2 * np.pi / 24))\n",
"\n",
" # Energy-specific features\n",
" df['radiation_clearsky'] = df['solarradiation'] * (100 - df['cloudcover']) / 100\n",
"\n",
" # Temperature impact on theoretical efficiency\n",
" df['temp_efficiency_factor'] = 1 - 0.004 * (df['temp'] - 25) # Typical temperature coefficient\n",
"\n",
" # Combined features\n",
" df['cloud_impact'] = df['cloudcover'] * df['solarradiation']\n",
" df['visibility_radiation'] = df['visibility'] * df['solarradiation']\n",
" df['clear_sky_index'] = (100 - df['cloudcover']) / 100\n",
" df['temp_effect'] = df['temp'] - df['tempmin']\n",
"\n",
" return df\n",
"\n",
"def add_solar_specific_features(df):\n",
" \"\"\"\n",
" Aggiunge feature specifiche per la predizione della radiazione solare\n",
" combinando caratteristiche astronomiche e meteorologiche\n",
" \"\"\"\n",
" # Caratteristiche astronomiche\n",
" df['day_length'] = 12 + 3 * np.sin(2 * np.pi * (df['day_of_year'] - 81) / 365.25)\n",
" df['solar_noon'] = np.abs(12 - df['hour'])\n",
" df['solar_elevation'] = np.sin(2 * np.pi * df['day_of_year'] / 365.25) * np.cos(2 * np.pi * df['solar_noon'] / 24)\n",
"\n",
" # Angolo solare teorico\n",
" df['solar_angle'] = np.sin(df['hour_sin']) * np.sin(df['day_of_year_sin'])\n",
"\n",
" # Interazioni con condizioni atmosferiche\n",
" df['cloud_elevation'] = df['cloudcover'] * df['solar_elevation']\n",
" df['visibility_elevation'] = df['visibility'] * df['solar_elevation']\n",
" df['uv_cloud_interaction'] = df['uvindex'] * (100 - df['cloudcover']) / 100\n",
"\n",
" # Indici di chiarezza e trasmissione\n",
" df['clearness_index'] = (100 - df['cloudcover']) * df['visibility'] / 10000\n",
" df['atmospheric_attenuation'] = (df['pressure'] / 1013.25) * (1 - (df['humidity'] / 100) * 0.6)\n",
"\n",
" # Radiazione teorica e attenuazione\n",
" df['theoretical_radiation'] = df['solar_angle'].clip(0, 1) * 1000\n",
" df['expected_radiation'] = df['theoretical_radiation'] * df['clearness_index']\n",
"\n",
" # Rolling features\n",
" df['cloud_rolling_12h'] = df['cloudcover'].rolling(window=12).mean()\n",
" df['temp_rolling_12h'] = df['temp'].rolling(window=12).mean()\n",
" df['uv_rolling_12h'] = df['uvindex'].rolling(window=12).mean()\n",
"\n",
" # Interazioni temperatura-radiazione\n",
" df['temp_radiation_potential'] = df['temp'] * df['solar_elevation']\n",
"\n",
" return df\n",
"\n",
"def add_radiation_energy_features(df):\n",
" \"\"\"Adds specific features based on solarenergy and uvindex\"\"\"\n",
"\n",
" # Solar energy to UV ratio (independent from solarradiation)\n",
" df['energy_uv_ratio'] = df['solarenergy'] / (df['uvindex'] + 1e-6)\n",
"\n",
" # Time aggregations\n",
" # Moving averages\n",
" windows = [3, 6, 12, 24] # hours\n",
" for w in windows:\n",
" df[f'energy_rolling_mean_{w}h'] = df['solarenergy'].rolling(window=w).mean()\n",
" df[f'uv_rolling_mean_{w}h'] = df['uvindex'].rolling(window=w).mean()\n",
"\n",
" # Daily aggregations utilizzando datetime\n",
" df['energy_daily_sum'] = df.groupby(df['datetime'].dt.date)['solarenergy'].transform('sum')\n",
" df['uv_daily_max'] = df.groupby(df['datetime'].dt.date)['uvindex'].transform('max')\n",
"\n",
" # Changes\n",
" df['energy_change'] = df['solarenergy'].diff()\n",
" df['uv_change'] = df['uvindex'].diff()\n",
"\n",
" # Lag features\n",
" lags = [1, 2, 3, 6, 12, 24] # hours\n",
" for lag in lags:\n",
" df[f'energy_lag_{lag}h'] = df['solarenergy'].shift(lag)\n",
" df[f'uv_lag_{lag}h'] = df['uvindex'].shift(lag)\n",
"\n",
" # Peak indicators\n",
" df['is_energy_peak'] = (df['solarenergy'] > df['energy_rolling_mean_6h'] * 1.2).astype(int)\n",
" df['is_uv_peak'] = (df['uvindex'] > df['uv_rolling_mean_6h'] * 1.2).astype(int)\n",
"\n",
" # Aggiungiamo alcune metriche di volatilità\n",
" df['energy_volatility'] = df['energy_change'].rolling(window=24).std()\n",
" df['uv_volatility'] = df['uv_change'].rolling(window=24).std()\n",
"\n",
" # Indice di intensità solare composito\n",
" df['solar_intensity_index'] = (df['solarenergy'] * df['uvindex']) / (df['cloudcover'] + 1e-6)\n",
"\n",
" # Interazioni\n",
" df['uv_cloud_interaction'] = df['uvindex'] * (100 - df['cloudcover']) / 100\n",
" df['energy_temp_interaction'] = df['solarenergy'] * df['temp']\n",
"\n",
" return df\n",
"\n",
"def add_atmospheric_features(df):\n",
" # Indice di Massa d'Aria (Air Mass Index)\n",
" # Rappresenta il percorso ottico relativo dei raggi solari attraverso l'atmosfera\n",
" df['air_mass_index'] = 1 / (np.cos(np.radians(90 - df['solar_elevation'])) + 0.50572 *\n",
" (96.07995 - (90 - df['solar_elevation']))**-1.6364)\n",
"\n",
" # Indice di Stabilità Atmosferica\n",
" # Combina temperatura, umidità e pressione\n",
" df['atmospheric_stability'] = (df['temp'] * (100 - df['humidity'])) / df['pressure']\n",
"\n",
" # Vapor Pressure Deficit (VPD)\n",
" # Importante per la radiazione diffusa\n",
" df['saturation_vapor_pressure'] = 0.6108 * np.exp(17.27 * df['temp'] / (df['temp'] + 237.3))\n",
" df['actual_vapor_pressure'] = df['saturation_vapor_pressure'] * (df['humidity'] / 100)\n",
" df['vapor_pressure_deficit'] = df['saturation_vapor_pressure'] - df['actual_vapor_pressure']\n",
"\n",
" return df\n",
"\n",
"def add_diffusion_features(df):\n",
" # Indice di Diffusione\n",
" df['diffusion_index'] = (df['cloudcover'] * df['humidity']) / 10000\n",
"\n",
" # Radiazione Diretta vs Diffusa\n",
" df['direct_radiation'] = df['solarradiation'] * (1 - df['diffusion_index'])\n",
" df['diffuse_radiation'] = df['solarradiation'] * df['diffusion_index']\n",
"\n",
" # Fattore di Trasparenza Atmosferica\n",
" df['atmospheric_transmittance'] = (1 - df['cloudcover']/100) * (df['visibility']/10) * (1 - df['humidity']/200)\n",
"\n",
" return df\n",
"\n",
"def calculate_trend(x):\n",
" try:\n",
" return np.polyfit(np.arange(len(x)), x, 1)[0]\n",
" except:\n",
" return np.nan\n",
"\n",
"def add_persistence_features(df):\n",
" # Create a copy to avoid modifying the original dataframe\n",
" df = df.copy()\n",
"\n",
" # Calculate trends more efficiently\n",
" windows = [3, 6, 12, 24]\n",
" for w in windows:\n",
" # Use numba or vectorized operations if possible\n",
" df[f'radiation_trend_{w}h'] = df['solarradiation'].rolling(\n",
" window=w,\n",
" min_periods=w\n",
" ).apply(calculate_trend, raw=True)\n",
"\n",
" # Optimize volatility calculation by doing it in one pass\n",
" rolling_24 = df['solarradiation'].rolling(24, min_periods=1)\n",
" df['radiation_volatility'] = rolling_24.std() / rolling_24.mean().clip(lower=1e-10)\n",
"\n",
" return df\n",
"\n",
"def add_weather_pattern_features(df):\n",
" # Pattern giornalieri\n",
" df['clear_sky_duration'] = df.groupby(df['datetime'].dt.date)['cloudcover'].transform(\n",
" lambda x: (x < 30).sum()\n",
" )\n",
"\n",
" # Stabilità delle condizioni\n",
" for col in ['temp', 'humidity', 'cloudcover']:\n",
" df[f'{col}_stability'] = df[col].rolling(12).std() / df[col].rolling(12).mean()\n",
"\n",
" # Indice di Variabilità Meteorologica\n",
" df['weather_variability_index'] = (df['temp_stability'] +\n",
" df['humidity_stability'] +\n",
" df['cloudcover_stability']) / 3\n",
"\n",
" return df\n",
"\n",
"def add_efficiency_features(df):\n",
" # Perdite per temperatura\n",
" df['temp_losses'] = 0.004 * (df['temp'] - 25).clip(lower=0) # 0.4% per grado sopra 25°C\n",
"\n",
" # Perdite per polvere/sporco (stima basata su umidità e pressione)\n",
" df['soiling_loss_factor'] = 0.002 * (df['humidity']/100) * (df['pressure']/1013.25)\n",
"\n",
" # Efficienza complessiva stimata\n",
" df['estimated_efficiency'] = (1 - df['temp_losses']) * (1 - df['soiling_loss_factor']) * \\\n",
" df['atmospheric_transmittance']\n",
"\n",
" # Potenziale di produzione\n",
" df['production_potential'] = df['solarradiation'] * df['estimated_efficiency']\n",
"\n",
" return df\n",
"\n",
"def add_advanced_seasonal_features(df):\n",
" # Differenza dalla durata media del giorno\n",
" avg_day_length = 12\n",
" df['day_length_deviation'] = df['day_length'] - avg_day_length\n",
"\n",
" # Intensità stagionale\n",
" df['seasonal_intensity'] = np.sin(2 * np.pi * (df['day_of_year'] - 172) / 365.25)\n",
"\n",
" # Indice di Stagionalità\n",
" df['seasonality_index'] = df['seasonal_intensity'] * df['solar_elevation']\n",
"\n",
" # Correzione per alba/tramonto\n",
" df['daylight_correction'] = np.where(\n",
" (df['hour'] >= df['day_length']) | (df['hour'] <= 24-df['day_length']),\n",
" 0,\n",
" 1\n",
" )\n",
"\n",
" return df\n",
"\n",
"def add_basic_interactions(df):\n",
" \"\"\"\n",
" Aggiunge le interazioni base tra variabili meteorologiche\n",
" \"\"\"\n",
" # Feature esistenti originali\n",
" df['temp_humidity'] = df['temp'] * df['humidity']\n",
" df['temp_cloudcover'] = df['temp'] * df['cloudcover']\n",
" df['visibility_cloudcover'] = df['visibility'] * df['cloudcover']\n",
" df['temp_humidity_interaction'] = df['temp'] * df['humidity'] / 100\n",
"\n",
" # Clear sky e trasparenza atmosferica\n",
" df['clear_sky_factor'] = (100 - df['cloudcover']) / 100\n",
" df['atmospheric_transparency'] = (100 - df['cloudcover']) * (df['visibility'] / 10)\n",
"\n",
" return df\n",
"\n",
"def add_rolling_and_lag_features(df):\n",
" \"\"\"\n",
" Aggiunge feature rolling e lag\n",
" \"\"\"\n",
" # Rolling means esistenti\n",
" df['temp_rolling_mean_6h'] = df['temp'].rolling(window=6).mean()\n",
" df['cloudcover_rolling_mean_6h'] = df['cloudcover'].rolling(window=6).mean()\n",
"\n",
" # Lag features esistenti\n",
" df['temp_1h_lag'] = df['temp'].shift(1)\n",
" df['cloudcover_1h_lag'] = df['cloudcover'].shift(1)\n",
" df['humidity_1h_lag'] = df['humidity'].shift(1)\n",
"\n",
" return df\n",
"\n",
"def add_condition_indicators(df):\n",
" \"\"\"\n",
" Aggiunge indicatori di condizioni particolari\n",
" \"\"\"\n",
" # Extreme conditions indicator esistente\n",
" df['extreme_conditions'] = ((df['temp'] > df['temp'].quantile(0.75)) &\n",
" (df['humidity'] < df['humidity'].quantile(0.25))).astype(int)\n",
"\n",
" return df\n",
"\n",
"def add_physics_based_conversion_features(df):\n",
" \"\"\"\n",
" Aggiunge feature specifiche per la conversione tra radiazione ed energia\n",
" \"\"\"\n",
" # Conversione da kWh a MJ/m²/h (1 W = 1 J/s = 0.0036 MJ/h)\n",
" df['radiation_to_energy'] = df['solarradiation'] * 0.0036\n",
"\n",
" # Efficienza di conversione reale vs teorica\n",
" df['conversion_efficiency_ratio'] = df['solarenergy'] / df['radiation_to_energy'].clip(lower=1e-6)\n",
"\n",
" # Energia accumulata nel tempo (integrazione)\n",
" df['energy_integral'] = df['radiation_to_energy'].rolling(window=24).sum()\n",
"\n",
" # Differenza tra energia teorica e reale\n",
" df['energy_conversion_gap'] = df['radiation_to_energy'] - df['solarenergy']\n",
"\n",
" # Indice di performance del sistema\n",
" df['system_performance_ratio'] = df['solarenergy'] / df['radiation_to_energy'].clip(lower=1e-6)\n",
"\n",
" return df\n",
"\n",
"def add_advanced_features(df):\n",
" \"\"\"\n",
" Add all advanced features to the DataFrame\n",
" \"\"\"\n",
" # Feature esistenti di base\n",
" # 1. Feature temporali di base\n",
" df = add_time_features(df)\n",
"\n",
" # 2. Feature solari e meteorologiche\n",
" df = add_solar_features(df)\n",
" df = add_solar_specific_features(df)\n",
" df = add_radiation_energy_features(df)\n",
"\n",
" # 3. Feature atmosferiche e di diffusione\n",
" df = add_atmospheric_features(df)\n",
" df = add_diffusion_features(df)\n",
"\n",
" # 4. Feature di persistenza e pattern\n",
" df = add_persistence_features(df)\n",
" df = add_weather_pattern_features(df)\n",
"\n",
" # 5. Feature di efficienza e stagionalità\n",
" df = add_efficiency_features(df)\n",
" df = add_advanced_seasonal_features(df)\n",
"\n",
" # 6. Interazioni e feature derivate\n",
" df = add_basic_interactions(df)\n",
" df = add_rolling_and_lag_features(df)\n",
" df = add_condition_indicators(df)\n",
"\n",
" # 7. Nuove feature di conversione fisica\n",
" df = add_physics_based_conversion_features(df)\n",
"\n",
" # 8. One-hot encoding delle feature categoriche\n",
" df = pd.get_dummies(df, columns=['season', 'time_period'])\n",
"\n",
" return df\n",
"\n",
"\n",
"def prepare_advanced_data(df):\n",
" \"\"\"\n",
" Prepare data for advanced modeling with proper datetime handling\n",
" \"\"\"\n",
" # Assicuriamoci che abbiamo una copia del DataFrame\n",
" df = df.copy()\n",
"\n",
" # Apply feature engineering functions\n",
" df = add_advanced_features(df)\n",
"\n",
" #all_columns = list(df.columns)\n",
" #print(all_columns)\n",
"\n",
" features = {\n",
" # Primary Features (strong direct correlation)\n",
" 'primary_features': [\n",
" 'uvindex',\n",
" 'cloudcover',\n",
" 'visibility',\n",
" 'temp',\n",
" 'pressure',\n",
" 'humidity',\n",
" 'solarradiation'\n",
" ],\n",
"\n",
" # Astronomical and Temporal Features\n",
" 'astronomical_features': [\n",
" 'solar_elevation',\n",
" 'solar_angle',\n",
" 'day_length',\n",
" 'hour_sin',\n",
" 'hour_cos',\n",
" 'day_of_year_sin',\n",
" 'day_of_year_cos',\n",
" 'month_sin',\n",
" 'month_cos',\n",
" 'solar_noon',\n",
" 'daylight_correction'\n",
" ],\n",
"\n",
" # Key Indices and Interactions\n",
" 'key_interactions': [\n",
" 'clear_sky_index',\n",
" 'atmospheric_attenuation',\n",
" 'theoretical_radiation',\n",
" 'expected_radiation',\n",
" 'cloud_elevation',\n",
" 'visibility_elevation',\n",
" 'uv_cloud_interaction',\n",
" 'temp_radiation_potential',\n",
" 'air_mass_index',\n",
" 'atmospheric_stability',\n",
" 'vapor_pressure_deficit',\n",
" 'diffusion_index',\n",
" 'atmospheric_transmittance',\n",
" 'temp_humidity_interaction',\n",
" 'clear_sky_factor'\n",
" ],\n",
"\n",
" # Rolling Features (temporal trends)\n",
" 'rolling_features': [\n",
" 'cloud_rolling_12h',\n",
" 'temp_rolling_12h',\n",
" 'uv_rolling_12h',\n",
" 'cloudcover_rolling_mean_6h',\n",
" 'temp_rolling_mean_6h',\n",
" 'energy_rolling_mean_6h',\n",
" 'uv_rolling_mean_6h',\n",
" 'energy_volatility',\n",
" 'uv_volatility'\n",
" ],\n",
"\n",
" # Lag Features\n",
" 'lag_features': [\n",
" 'temp_1h_lag',\n",
" 'cloudcover_1h_lag',\n",
" 'humidity_1h_lag',\n",
" 'energy_lag_1h',\n",
" 'uv_lag_1h'\n",
" ],\n",
"\n",
" # Efficiency and Performance Features\n",
" 'efficiency_features': [\n",
" 'temp_losses',\n",
" 'soiling_loss_factor',\n",
" 'estimated_efficiency',\n",
" 'production_potential',\n",
" 'system_performance_ratio',\n",
" 'conversion_efficiency_ratio'\n",
" ],\n",
"\n",
" # Weather Pattern Features\n",
" 'weather_pattern_features': [\n",
" 'clear_sky_duration',\n",
" 'weather_variability_index',\n",
" 'temp_stability',\n",
" 'humidity_stability',\n",
" 'cloudcover_stability'\n",
" ],\n",
"\n",
" # Categorical Features\n",
" 'categorical_features': [\n",
" 'season_Spring',\n",
" 'season_Summer',\n",
" 'season_Autumn',\n",
" 'season_Winter',\n",
" 'time_period_Morning',\n",
" 'time_period_Afternoon',\n",
" 'time_period_Evening',\n",
" 'time_period_Night'\n",
" ]\n",
" }\n",
"\n",
" final_features = [feature for group in features.values() for feature in group]\n",
"\n",
" if not isinstance(df.index, pd.DatetimeIndex):\n",
" if 'datetime' in df.columns:\n",
" df['datetime'] = pd.to_datetime(df['datetime'])\n",
" df.set_index('datetime', inplace=True)\n",
" else:\n",
" raise ValueError(\"No datetime column or index found in DataFrame\")\n",
"\n",
" # Ordiniamo il DataFrame per datetime\n",
" df = df.sort_index()\n",
"\n",
" # Handle missing values\n",
" target_variables = ['solarradiation', 'solarenergy', 'uvindex']\n",
" for column in final_features + target_variables:\n",
" if column in df.columns:\n",
" if isinstance(df.index, pd.DatetimeIndex):\n",
" df[column] = df[column].interpolate(method='time')\n",
" else:\n",
" df[column] = df[column].interpolate(method='linear')\n",
"\n",
" df.fillna(0, inplace=True)\n",
"\n",
" # Temporal split\n",
" data_after_2010 = df[df['year'] >= 2010].copy()\n",
" data_before_2010 = df[df['year'] < 2010].copy()\n",
"\n",
" X = data_after_2010[final_features]\n",
" y = data_after_2010['solarenergy']\n",
" X_to_predict = data_before_2010[final_features]\n",
"\n",
" # Train-test split\n",
" X_train, X_test, y_train, y_test = train_test_split(\n",
" X, y, test_size=0.13, random_state=random_state_value, shuffle=False\n",
" )\n",
"\n",
" # Scaling\n",
" scaler_X = RobustScaler()\n",
" X_train_scaled = scaler_X.fit_transform(X_train)\n",
" X_test_scaled = scaler_X.transform(X_test)\n",
" X_to_predict_scaled = scaler_X.transform(X_to_predict)\n",
"\n",
" scaler_y = RobustScaler()\n",
" y_train_scaled = scaler_y.fit_transform(y_train.values.reshape(-1, 1))\n",
" y_test_scaled = scaler_y.transform(y_test.values.reshape(-1, 1))\n",
"\n",
" # Print info about selected features\n",
" print(\"\\nSelected features:\")\n",
" print(f\"Number of features: {len(final_features)}\")\n",
" print(\"Features list:\", final_features)\n",
"\n",
" return X_train_scaled, X_test_scaled, y_train_scaled, y_test_scaled, scaler_X, scaler_y, final_features, X_to_predict_scaled\n",
"\n",
"\n",
"def create_sequence_data(X, sequence_length=24):\n",
" \"\"\"\n",
" Converts data into sequences for LSTM input\n",
" sequence_length represents how many previous hours to consider\n",
" \"\"\"\n",
" sequences = []\n",
" for i in range(len(X) - sequence_length + 1):\n",
" sequences.append(X[i:i + sequence_length])\n",
" return np.array(sequences)\n",
"\n",
"\n",
"def prepare_hybrid_data(df):\n",
" X_train_scaled, X_test_scaled, y_train_scaled, y_test_scaled, scaler_X, scaler_y, features, X_to_predict_scaled = prepare_advanced_data(df)\n",
"\n",
" # Convert data into sequences\n",
" sequence_length = 24 # 24 hours of historical data\n",
"\n",
" X_train_seq = create_sequence_data(X_train_scaled, sequence_length)\n",
" X_test_seq = create_sequence_data(X_test_scaled, sequence_length)\n",
"\n",
" # Adjust y by removing the first (sequence_length-1) elements\n",
" y_train = y_train_scaled[sequence_length - 1:]\n",
" y_test = y_test_scaled[sequence_length - 1:]\n",
"\n",
" X_to_predict_seq = create_sequence_data(X_to_predict_scaled, sequence_length)\n",
"\n",
" return X_train_seq, X_test_seq, y_train, y_test, scaler_X, scaler_y, features, X_to_predict_seq"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "570b18f2caa3e0db",
"metadata": {},
"outputs": [],
"source": [
"def create_solarenergy_model(input_shape, folder_name, l2_lambda=0.005, min_output=0, max_output=4.0):\n",
" from tensorflow import keras\n",
" from keras.models import Model\n",
" from keras.layers import (\n",
" Input, Dense, Conv1D, BatchNormalization, Dropout, \n",
" MultiHeadAttention, LayerNormalization, Lambda,\n",
" Concatenate, Activation, Bidirectional, LSTM, Add\n",
" )\n",
" from keras.regularizers import l2\n",
" from keras.optimizers import AdamW\n",
" import tensorflow as tf\n",
" import numpy as np\n",
" import tensorflow_addons as tfa\n",
" from tensorflow.keras.optimizers.schedules import CosineDecayRestarts\n",
" \n",
" # Input layer\n",
" inputs = Input(shape=input_shape)\n",
" \n",
" # Feature groups definition\n",
" feature_dims = {\n",
" 'solar': [6, 7, 8, 9, 16, 18, 19, 20, 21],\n",
" 'weather': [0, 1, 2, 3, 4, 5],\n",
" 'temporal': [10, 11, 12, 13, 14, 15],\n",
" 'derived': [22, 23, 24, 25, 26, 27, 28, 29, 30, 31],\n",
" 'rolling': [33, 34, 35, 36, 37, 38, 39],\n",
" 'lag': [40, 41, 42, 43, 44],\n",
" 'performance': [45, 46, 47, 48, 49, 50]\n",
" }\n",
" \n",
" # Feature extraction\n",
" feature_tensors = {}\n",
" for name, indices in feature_dims.items():\n",
" valid_indices = [i for i in indices if i < input_shape[-1]]\n",
" if valid_indices:\n",
" feature_tensors[name] = Lambda(\n",
" lambda x, idx=valid_indices: tf.gather(x, idx, axis=-1)\n",
" )(inputs)\n",
" \n",
" # Feature processing with residual connections\n",
" def process_feature_group(tensor, units, name):\n",
" x = Conv1D(units, kernel_size=3, padding='same', activation='swish',\n",
" kernel_regularizer=l2(l2_lambda))(tensor)\n",
" x = BatchNormalization()(x)\n",
" x = Dropout(0.2)(x)\n",
" \n",
" residual = Conv1D(units, kernel_size=1, padding='same')(tensor)\n",
" x = Add()([x, residual])\n",
" x = LayerNormalization()(x)\n",
" \n",
" return x\n",
" \n",
" # Process each feature group\n",
" processed_features = {}\n",
" for name, tensor in feature_tensors.items():\n",
" units = 64 if name == 'solar' else 32 if name == 'weather' else 16\n",
" processed_features[name] = process_feature_group(tensor, units, name)\n",
" \n",
" # Enhanced attention mechanism\n",
" def attention_block(x, num_heads=4):\n",
" attention_output = MultiHeadAttention(\n",
" num_heads=num_heads, \n",
" key_dim=x.shape[-1] // num_heads\n",
" )(x, x)\n",
" x = LayerNormalization()(x + attention_output)\n",
" \n",
" ffn = Dense(x.shape[-1] * 2, activation='swish')(x)\n",
" ffn = Dropout(0.1)(ffn)\n",
" ffn = Dense(x.shape[-1])(ffn)\n",
" \n",
" return LayerNormalization()(x + ffn)\n",
" \n",
" # Merge primary features with attention\n",
" primary_features = [\n",
" processed_features['solar'],\n",
" processed_features['weather'],\n",
" processed_features['performance']\n",
" ]\n",
" primary_context = Concatenate(axis=-1)(primary_features)\n",
" primary_context = attention_block(primary_context)\n",
" \n",
" # Merge secondary features\n",
" secondary_features = [\n",
" processed_features[name] for name in ['temporal', 'rolling', 'lag']\n",
" if name in processed_features\n",
" ]\n",
" if secondary_features:\n",
" secondary_context = Concatenate(axis=-1)(secondary_features)\n",
" secondary_context = attention_block(secondary_context)\n",
" else:\n",
" secondary_context = primary_context\n",
" \n",
" # Final feature merge\n",
" combined = Concatenate(axis=-1)([\n",
" primary_context, \n",
" secondary_context,\n",
" processed_features['derived']\n",
" ])\n",
" \n",
" # Sequential processing with residual LSTM\n",
" def residual_lstm_block(x, units):\n",
" lstm_out = Bidirectional(LSTM(units, return_sequences=True))(x)\n",
" residual = Conv1D(units * 2, kernel_size=1, padding='same')(x)\n",
" x = Add()([lstm_out, residual])\n",
" x = LayerNormalization()(x)\n",
" return x\n",
" \n",
" x = residual_lstm_block(combined, 128)\n",
" x = residual_lstm_block(x, 64)\n",
" x = Bidirectional(LSTM(64))(x)\n",
" x = Dropout(0.2)(x)\n",
" \n",
" # Classification branch\n",
" class_x = Dense(128, activation='swish', kernel_regularizer=l2(l2_lambda))(x)\n",
" class_x = BatchNormalization()(class_x)\n",
" class_x = Dropout(0.2)(class_x)\n",
" class_x = Dense(64, activation='swish', kernel_regularizer=l2(l2_lambda))(class_x)\n",
" class_output = Dense(1, activation='sigmoid', name='classification_output')(class_x)\n",
" \n",
" # Enhanced regression branch with multiple pathways\n",
" def create_regression_pathway(x, name):\n",
" x = Dense(128, activation='swish', kernel_regularizer=l2(l2_lambda))(x)\n",
" x = BatchNormalization()(x)\n",
" x = Dropout(0.2)(x)\n",
" \n",
" residual = x\n",
" x = Dense(128, activation='swish', kernel_regularizer=l2(l2_lambda))(x)\n",
" x = BatchNormalization()(x)\n",
" x = Dense(128, activation='swish', kernel_regularizer=l2(l2_lambda))(x)\n",
" x = Add()([x, residual])\n",
" \n",
" x = Dense(64, activation='swish', kernel_regularizer=l2(l2_lambda))(x)\n",
" return Dense(1, name=f'{name}_output')(x)\n",
" \n",
" # Create specialized regression pathways\n",
" low_range = create_regression_pathway(x, 'low_range')\n",
" mid_range = create_regression_pathway(x, 'mid_range')\n",
" high_range = create_regression_pathway(x, 'high_range')\n",
" \n",
" # Create context vector for attention\n",
" context = Dense(64, activation='swish')(x)\n",
" \n",
" # Calculate attention scores\n",
" attention_scores = Dense(3, activation='softmax')(context)\n",
" \n",
" # Combine predictions using attention weights\n",
" reg_output = Lambda(\n",
" lambda x: x[0][:, 0:1] * x[1] + x[0][:, 1:2] * x[2] + x[0][:, 2:3] * x[3],\n",
" name='regression_output'\n",
" )([attention_scores, low_range, mid_range, high_range])\n",
"\n",
" # Final output processing remains the same...\n",
" final_x = Dense(256, activation='swish', kernel_regularizer=l2(l2_lambda))(x)\n",
" final_x = BatchNormalization()(final_x)\n",
" final_x = Dropout(0.2)(final_x)\n",
" \n",
" residual = final_x\n",
" final_x = Dense(256, activation='swish', kernel_regularizer=l2(l2_lambda))(final_x)\n",
" final_x = BatchNormalization()(final_x)\n",
" final_x = Dense(256, activation='swish', kernel_regularizer=l2(l2_lambda))(final_x)\n",
" final_x = Add()([final_x, residual])\n",
" \n",
" final_x = Dense(128, activation='swish', kernel_regularizer=l2(l2_lambda))(final_x)\n",
" final_x = Dense(1)(final_x)\n",
" final_output = Lambda(\n",
" lambda x: tf.clip_by_value(x, min_output, max_output),\n",
" name='final_output'\n",
" )(final_x)\n",
" \n",
" # Build model with all outputs\n",
" model = Model(\n",
" inputs=inputs,\n",
" outputs=[class_output, reg_output, final_output]\n",
" )\n",
" \n",
" # Enhanced loss functions\n",
" def enhanced_regression_loss(y_true, y_pred):\n",
" mae = tf.abs(y_true - y_pred)\n",
" mse = tf.square(y_true - y_pred)\n",
" \n",
" value_ranges = tf.cast(y_true > 2.0, tf.float32) * 1.5 + \\\n",
" tf.cast(tf.logical_and(y_true <= 2.0, y_true > 1.0), tf.float32) * 1.2 + \\\n",
" tf.cast(y_true <= 1.0, tf.float32)\n",
" \n",
" weighted_loss = (0.5 * mae + 0.5 * mse) * value_ranges\n",
" return tf.reduce_mean(weighted_loss)\n",
" \n",
" def final_loss(y_true, y_pred):\n",
" y_true = tf.clip_by_value(y_true, min_output, max_output)\n",
" mae = tf.reduce_mean(tf.abs(y_true - y_pred))\n",
" mse = tf.reduce_mean(tf.square(y_true - y_pred))\n",
" return 0.5 * mae + 0.5 * mse\n",
" \n",
" # Learning rate schedule\n",
" clr = CosineDecayRestarts(\n",
" initial_learning_rate=2e-4,\n",
" first_decay_steps=1000,\n",
" t_mul=2.0,\n",
" m_mul=0.9,\n",
" alpha=1e-7\n",
" )\n",
" \n",
" # Optimizer\n",
" optimizer = AdamW(\n",
" learning_rate=clr,\n",
" weight_decay=0.01,\n",
" clipnorm=1.0\n",
" )\n",
" \n",
" # Compile model\n",
" model.compile(\n",
" optimizer=optimizer,\n",
" loss={\n",
" 'classification_output': 'binary_crossentropy',\n",
" 'regression_output': enhanced_regression_loss,\n",
" 'final_output': final_loss\n",
" },\n",
" loss_weights={\n",
" 'classification_output': 0.2,\n",
" 'regression_output': 0.4,\n",
" 'final_output': 0.4\n",
" }\n",
" )\n",
"\n",
" # Plot model architecture\n",
" try:\n",
" plot_model(\n",
" model,\n",
" to_file=f'{folder_name}_model_architecture.png',\n",
" show_shapes=True,\n",
" show_layer_names=True,\n",
" dpi=150,\n",
" show_layer_activations=True\n",
" )\n",
" except Exception as e:\n",
" print(f\"Warning: Could not plot model architecture: {e}\")\n",
"\n",
" return model\n",
"\n",
"\n",
"def evaluate_solarenergy_predictions(y_true, y_pred, hour=None, folder_name=None):\n",
" \"\"\"\n",
" Comprehensive evaluation of solar energy predictions with detailed analysis and visualizations.\n",
"\n",
" Parameters:\n",
" -----------\n",
" y_true : array-like\n",
" Actual solar energy values (kWh)\n",
" y_pred : array-like\n",
" Predicted solar energy values (kWh)\n",
" hour : array-like, optional\n",
" Array of hours corresponding to predictions, for temporal analysis\n",
" folder_name : str, optional\n",
" Directory to save analysis plots\n",
"\n",
" Returns:\n",
" --------\n",
" dict\n",
" Dictionary containing all calculated metrics\n",
" \"\"\"\n",
"\n",
" # Data preparation\n",
" y_true = np.array(y_true).ravel()\n",
" y_pred = np.array(y_pred).ravel()\n",
" errors = y_pred - y_true\n",
"\n",
" # Basic metrics calculation\n",
" mae_raw = mean_absolute_error(y_true, y_pred)\n",
" rmse_raw = np.sqrt(mean_squared_error(y_true, y_pred))\n",
" r2_raw = r2_score(y_true, y_pred)\n",
"\n",
" # Corrected MAPE calculation\n",
" mask = y_true > 10 # Consider only values above 10 kWh\n",
" if np.any(mask):\n",
" mape = np.mean(np.abs((y_true[mask] - y_pred[mask]) / y_true[mask])) * 100\n",
" else:\n",
" mape = np.nan\n",
"\n",
" # Corrected error margin accuracy\n",
" within_5_percent = np.mean(np.abs(errors) <= 5) * 100 # Within 5 kWh\n",
" within_10_percent = np.mean(np.abs(errors) <= 10) * 100 # Within 10 kWh\n",
" within_20_percent = np.mean(np.abs(errors) <= 20) * 100 # Within 20 kWh\n",
"\n",
" # Energy level classification\n",
" def get_energy_level(value):\n",
" if value <= 0.5:\n",
" return 'Very Low'\n",
" elif value <= 2.0:\n",
" return 'Low'\n",
" elif value <= 4.0:\n",
" return 'Moderate'\n",
" elif value <= 6.0:\n",
" return 'High'\n",
" elif value <= 8.0:\n",
" return 'Very High'\n",
" else:\n",
" return 'Extreme'\n",
"\n",
" # Calculate energy levels\n",
" y_true_levels = [get_energy_level(v) for v in y_true]\n",
" y_pred_levels = [get_energy_level(v) for v in y_pred]\n",
" level_accuracy = np.mean([t == p for t, p in zip(y_true_levels, y_pred_levels)])\n",
"\n",
" unique_levels = sorted(list(set(y_true_levels + y_pred_levels)))\n",
"\n",
" # Print main metrics\n",
" print(\"\\nSolar Energy Prediction Metrics:\")\n",
" print(\"\\nAbsolute Metrics:\")\n",
" print(f\"MAE: {mae_raw:.2f} kWh\")\n",
" print(f\"RMSE: {rmse_raw:.2f} kWh\")\n",
" print(f\"R² Score: {r2_raw:.3f}\")\n",
" print(f\"MAPE: {mape:.2f}%\" if not np.isnan(mape) else \"MAPE: N/A (insufficient data)\")\n",
"\n",
" print(\"\\nAccuracy Metrics:\")\n",
" print(f\"Within ±5 kWh: {within_5_percent:.1f}%\")\n",
" print(f\"Within ±10 kWh: {within_10_percent:.1f}%\")\n",
" print(f\"Within ±20 kWh: {within_20_percent:.1f}%\")\n",
"\n",
" print(\"\\nLevel Accuracy:\")\n",
" print(f\"Level Accuracy: {level_accuracy * 100:.1f}%\")\n",
"\n",
" # Confusion matrix for energy levels\n",
" cm = confusion_matrix(y_true_levels, y_pred_levels, labels=unique_levels)\n",
" print(\"\\nConfusion Matrix for Energy Levels:\")\n",
" cm_df = pd.DataFrame(\n",
" cm,\n",
" columns=unique_levels,\n",
" index=unique_levels\n",
" )\n",
" print(cm_df)\n",
"\n",
" # Time period analysis\n",
" if hour is not None:\n",
" day_periods = {\n",
" 'Morning (5-11)': (5, 11),\n",
" 'Noon (11-13)': (11, 13),\n",
" 'Afternoon (13-17)': (13, 17),\n",
" 'Evening (17-21)': (17, 21),\n",
" 'Night (21-5)': (21, 5)\n",
" }\n",
"\n",
" print(\"\\nAnalysis by Time Period:\")\n",
" for period, (start, end) in day_periods.items():\n",
" if start < end:\n",
" mask = (hour >= start) & (hour < end)\n",
" else:\n",
" mask = (hour >= start) | (hour < end)\n",
"\n",
" if np.any(mask):\n",
" period_mae = mean_absolute_error(y_true[mask], y_pred[mask])\n",
"\n",
" # Corrected period MAPE calculation\n",
" period_mask = mask & (y_true > 10)\n",
" if np.any(period_mask):\n",
" period_mape = np.mean(np.abs((y_true[period_mask] - y_pred[period_mask]) / y_true[period_mask])) * 100\n",
" print(f\"\\n{period}:\")\n",
" print(f\"MAE: {period_mae:.2f} kWh\")\n",
" print(f\"MAPE: {period_mape:.2f}%\")\n",
" else:\n",
" print(f\"\\n{period}:\")\n",
" print(f\"MAE: {period_mae:.2f} kWh\")\n",
" print(\"MAPE: N/A (insufficient data)\")\n",
"\n",
" # Visualizations\n",
" if folder_name is not None:\n",
" try:\n",
" # Figure 1: Main analysis plots\n",
" plt.figure(figsize=(20, 15))\n",
"\n",
" # Plot 1: Scatter plot of actual vs predicted values\n",
" plt.subplot(3, 2, 1)\n",
" plt.scatter(y_true, y_pred, alpha=0.5)\n",
" plt.plot([y_true.min(), y_true.max()], [y_true.min(), y_true.max()], 'r--', lw=2)\n",
" plt.xlabel('Actual Energy (kWh)')\n",
" plt.ylabel('Predicted Energy (kWh)')\n",
" plt.title('Actual vs Predicted Values')\n",
" plt.grid(True)\n",
"\n",
" # Plot 2: Absolute error distribution\n",
" plt.subplot(3, 2, 2)\n",
" plt.hist(errors, bins=50, alpha=0.7)\n",
" plt.xlabel('Prediction Error (kWh)')\n",
" plt.ylabel('Frequency')\n",
" plt.title('Error Distribution')\n",
" plt.grid(True)\n",
"\n",
" # Plot 3: Percentage error distribution (only for values > 0.5 kWh)\n",
" plt.subplot(3, 2, 3)\n",
" mask = y_true > 0.5\n",
" if np.any(mask):\n",
" percentage_errors = ((y_pred[mask] - y_true[mask]) / y_true[mask]) * 100\n",
" plt.hist(np.clip(percentage_errors, -100, 100), bins=50, alpha=0.7)\n",
" plt.xlabel('Percentage Error (%)')\n",
" plt.ylabel('Frequency')\n",
" plt.title('Percentage Error Distribution (for values > 0.5 kWh)')\n",
" plt.grid(True)\n",
"\n",
" # Plot 4: Errors vs actual values\n",
" plt.subplot(3, 2, 4)\n",
" plt.scatter(y_true, errors, alpha=0.5)\n",
" plt.axhline(y=0, color='r', linestyle='--')\n",
" plt.xlabel('Actual Energy (kWh)')\n",
" plt.ylabel('Error (kWh)')\n",
" plt.title('Errors vs Actual Values')\n",
" plt.grid(True)\n",
"\n",
" # Plot 5: Error boxplot by Energy level\n",
" plt.subplot(3, 2, 5)\n",
" sns.boxplot(x=[get_energy_level(v) for v in y_true], y=errors)\n",
" plt.xticks(rotation=45)\n",
" plt.xlabel('Energy Level')\n",
" plt.ylabel('Error (kWh)')\n",
" plt.title('Error Distribution by Level')\n",
"\n",
" # Plot 6: Confusion matrix heatmap\n",
" plt.subplot(3, 2, 6)\n",
" sns.heatmap(cm_df, annot=True, fmt='d', cmap='Blues')\n",
" plt.title('Confusion Matrix')\n",
" plt.xticks(rotation=45)\n",
" plt.yticks(rotation=45)\n",
"\n",
" plt.tight_layout()\n",
" filename = f'{folder_name}_energy_analysis.png'\n",
" plt.savefig(filename, dpi=300, bbox_inches='tight')\n",
" print(f\"\\nPlot saved as: {filename}\")\n",
" plt.close()\n",
"\n",
" except Exception as e:\n",
" print(f\"\\nError saving plots: {str(e)}\")\n",
"\n",
" # Additional error statistics\n",
" print(\"\\nError Statistics:\")\n",
" print(f\"Mean error: {np.mean(errors):.3f}\")\n",
" print(f\"Error standard deviation: {np.std(errors):.3f}\")\n",
" print(f\"Median error: {np.median(errors):.3f}\")\n",
" print(f\"95th percentile absolute error: {np.percentile(np.abs(errors), 95):.3f}\")\n",
"\n",
" # Return structured metrics\n",
" metrics = {\n",
" 'absolute': {\n",
" 'mae': mae_raw,\n",
" 'rmse': rmse_raw,\n",
" 'r2': r2_raw,\n",
" 'mape': float(mape) if not np.isnan(mape) else None\n",
" },\n",
" 'accuracy': {\n",
" 'within_5_wm2': float(within_5_percent),\n",
" 'within_10_wm2': float(within_10_percent),\n",
" 'within_20_wm2': float(within_20_percent)\n",
" },\n",
" 'categorical': {\n",
" 'level_accuracy': float(level_accuracy)\n",
" },\n",
" 'error_stats': {\n",
" 'mean': float(np.mean(errors)),\n",
" 'std': float(np.std(errors)),\n",
" 'median': float(np.median(errors)),\n",
" 'p95_abs': float(np.percentile(np.abs(errors), 95))\n",
" }\n",
" }\n",
"\n",
" return metrics\n",
"\n",
"\n",
"def plot_training_history(history, folder_name=None):\n",
" \"\"\"\n",
" Visualize and save training history for the hybrid model\n",
" \"\"\"\n",
" plt.figure(figsize=(15, 10))\n",
"\n",
" # Loss plots\n",
" plt.subplot(2, 2, 1)\n",
" plt.plot(history.history['classification_output_loss'], label='Class Loss')\n",
" plt.plot(history.history['regression_output_loss'], label='Reg Loss')\n",
" plt.plot(history.history['final_output_loss'], label='Final Loss')\n",
" plt.plot(history.history['val_classification_output_loss'], label='Val Class Loss')\n",
" plt.plot(history.history['val_regression_output_loss'], label='Val Reg Loss')\n",
" plt.plot(history.history['val_final_output_loss'], label='Val Final Loss')\n",
" plt.title('Model Losses')\n",
" plt.xlabel('Epoch')\n",
" plt.ylabel('Loss')\n",
" plt.legend()\n",
" plt.grid(True)\n",
"\n",
" # Classification metrics\n",
" plt.subplot(2, 2, 2)\n",
" plt.plot(history.history['classification_output_accuracy'], label='Class Acc')\n",
" plt.plot(history.history['val_classification_output_accuracy'], label='Val Class Acc')\n",
" plt.plot(history.history['classification_output_auc'], label='Class AUC')\n",
" plt.plot(history.history['val_classification_output_auc'], label='Val Class AUC')\n",
" plt.title('Classification Metrics')\n",
" plt.xlabel('Epoch')\n",
" plt.ylabel('Metric Value')\n",
" plt.legend()\n",
" plt.grid(True)\n",
"\n",
" # Regression metrics\n",
" plt.subplot(2, 2, 3)\n",
" plt.plot(history.history['regression_output_mae'], label='Reg MAE')\n",
" plt.plot(history.history['val_regression_output_mae'], label='Val Reg MAE')\n",
" plt.title('Regression MAE')\n",
" plt.xlabel('Epoch')\n",
" plt.ylabel('MAE')\n",
" plt.legend()\n",
" plt.grid(True)\n",
"\n",
" # Final output metrics\n",
" plt.subplot(2, 2, 4)\n",
" plt.plot(history.history['final_output_mae'], label='Final MAE')\n",
" plt.plot(history.history['val_final_output_mae'], label='Val Final MAE')\n",
" plt.title('Final Output MAE')\n",
" plt.xlabel('Epoch')\n",
" plt.ylabel('MAE')\n",
" plt.legend()\n",
" plt.grid(True)\n",
"\n",
" plt.tight_layout()\n",
"\n",
" if folder_name is not None:\n",
" filename = f'{folder_name}_training_history.png'\n",
" plt.savefig(filename, dpi=300, bbox_inches='tight')\n",
" print(f\"\\nTraining history plot saved as: {filename}\")\n",
"\n",
" # Save history to JSON\n",
" history_dict = history.history\n",
" json_filename = f'{folder_name}_training_history.json'\n",
" with open(json_filename, 'w') as f:\n",
" json.dump(history_dict, f)\n",
" print(f\"Training history saved as: {json_filename}\")\n",
"\n",
" plt.show()\n",
"\n",
"def calculate_metrics(y_true, y_class, y_reg, y_final, min_output, max_output):\n",
" \"\"\"\n",
" Calculates comprehensive metrics for the solar energy prediction model.\n",
" \n",
" Parameters:\n",
" -----------\n",
" y_true : array-like\n",
" Ground truth values\n",
" y_class : array-like\n",
" Classification predictions (probability of non-zero values)\n",
" y_reg : array-like\n",
" Regression predictions (unrestricted values)\n",
" y_final : array-like\n",
" Final clipped predictions\n",
" min_output : float\n",
" Minimum allowed output value\n",
" max_output : float\n",
" Maximum allowed output value\n",
" \n",
" Returns:\n",
" --------\n",
" dict\n",
" Dictionary containing all calculated metrics\n",
" \"\"\"\n",
" from sklearn.metrics import roc_auc_score, classification_report, confusion_matrix\n",
" \n",
" # Ensure proper array formatting and dimensionality\n",
" y_true = np.array(y_true).flatten()\n",
" y_class = np.array(y_class).flatten()\n",
" y_reg = np.array(y_reg).flatten()\n",
" y_final = np.array(y_final).flatten()\n",
" \n",
" # Validate input dimensions\n",
" assert len(y_true) == len(y_class) == len(y_reg) == len(y_final), \\\n",
" \"All input arrays must have the same length\"\n",
" \n",
" # Classification metrics with error handling\n",
" print(\"\\nClassification Metrics:\")\n",
" try:\n",
" y_true_binary = (y_true > 0).astype(int)\n",
" y_pred_binary = (y_class > 0.5).astype(int)\n",
" \n",
" accuracy = np.mean((y_class > 0.5) == (y_true > 0)) * 100\n",
" auc_roc = roc_auc_score(y_true > 0, y_class)\n",
" print(f\"Accuracy: {accuracy:.2f}%\")\n",
" print(f\"AUC-ROC: {auc_roc:.4f}\")\n",
" \n",
" print(\"\\nConfusion Matrix:\")\n",
" conf_matrix = confusion_matrix(y_true_binary, y_pred_binary)\n",
" print(conf_matrix)\n",
" \n",
" print(\"\\nClassification Report:\")\n",
" class_report = classification_report(\n",
" y_true_binary, \n",
" y_pred_binary,\n",
" target_names=['Zero', 'Non-Zero'],\n",
" digits=4\n",
" )\n",
" print(class_report)\n",
" except Exception as e:\n",
" print(f\"Error in classification metrics calculation: {str(e)}\")\n",
" \n",
" # Regression metrics with error handling\n",
" print(\"\\nRegression Metrics (non-zero values):\")\n",
" mask_nonzero = y_true > 0\n",
" if np.any(mask_nonzero):\n",
" try:\n",
" y_true_nonzero = y_true[mask_nonzero]\n",
" y_reg_nonzero = y_reg[mask_nonzero]\n",
" \n",
" # Range validation\n",
" out_of_range = np.sum(\n",
" (y_reg_nonzero < min_output) | \n",
" (y_reg_nonzero > max_output)\n",
" )\n",
" \n",
" # Error metrics with numerical stability\n",
" epsilon = 1e-7\n",
" diff = np.abs((y_true_nonzero - y_reg_nonzero) / \n",
" (y_true_nonzero + epsilon))\n",
" diff = np.clip(diff, 0, 1)\n",
" \n",
" # Calculate metrics\n",
" mape = np.mean(diff) * 100\n",
" within_10_percent = np.mean(diff <= 0.10) * 100\n",
" mae = np.mean(np.abs(y_true_nonzero - y_reg_nonzero))\n",
" rmse = np.sqrt(np.mean(np.square(y_true_nonzero - y_reg_nonzero)))\n",
" \n",
" print(f\"Out of range: {out_of_range} predictions\")\n",
" print(f\"MAPE: {mape:.2f}%\")\n",
" print(f\"Within ±10%: {within_10_percent:.2f}%\")\n",
" print(f\"MAE: {mae:.2f}\")\n",
" print(f\"RMSE: {rmse:.2f}\")\n",
" except Exception as e:\n",
" print(f\"Error in regression metrics calculation: {str(e)}\")\n",
" else:\n",
" print(\"No non-zero values in this batch\")\n",
" \n",
" # Final output metrics with error handling\n",
" print(\"\\nFinal Combined Output Metrics:\")\n",
" try:\n",
" # Ensure outputs are within bounds\n",
" out_of_range = np.sum((y_final < min_output) | (y_final > max_output))\n",
" \n",
" # Calculate metrics with numerical stability\n",
" epsilon = 1e-7\n",
" diff = np.abs((y_true - y_final) / (y_true + epsilon))\n",
" diff = np.clip(diff, 0, 1)\n",
" \n",
" mape = np.mean(diff) * 100\n",
" within_2_percent = np.mean(diff <= 0.02) * 100\n",
" within_5_percent = np.mean(diff <= 0.05) * 100\n",
" within_10_percent = np.mean(diff <= 0.10) * 100\n",
" within_20_percent = np.mean(diff <= 0.20) * 100\n",
" mae = np.mean(np.abs(y_true - y_final))\n",
" rmse = np.sqrt(np.mean(np.square(y_true - y_final)))\n",
" \n",
" print(f\"Out of range: {out_of_range} predictions\")\n",
" print(f\"MAPE: {mape:.2f}%\")\n",
" print(f\"Within ±2%: {within_2_percent:.2f}%\")\n",
" print(f\"Within ±5%: {within_5_percent:.2f}%\")\n",
" print(f\"Within ±10%: {within_10_percent:.2f}%\")\n",
" print(f\"Within ±20%: {within_20_percent:.2f}%\")\n",
" print(f\"MAE: {mae:.2f}\")\n",
" print(f\"RMSE: {rmse:.2f}\")\n",
" except Exception as e:\n",
" print(f\"Error in final output metrics calculation: {str(e)}\")\n",
"\n",
"def train_hybrid_model(model, X_train, y_train, X_test, y_test, epochs=100, batch_size=32, folder_name='solarenergy', min_output=0, max_output=1):\n",
" \"\"\"\n",
" Advanced training function for the hybrid solar energy model\n",
" \"\"\" \n",
" # Prepare binary targets for classification\n",
" y_train_binary = (y_train > 0).astype(float)\n",
" y_test_binary = (y_test > 0).astype(float)\n",
"\n",
" # Training targets dictionary - usando i nomi esatti degli output del modello\n",
" train_targets = {\n",
" 'classification_output': y_train_binary,\n",
" 'regression_output': y_train, # Questo nome corrisponde a quello nel modello\n",
" 'final_output': y_train\n",
" }\n",
"\n",
" # Validation targets dictionary\n",
" test_targets = {\n",
" 'classification_output': y_test_binary,\n",
" 'regression_output': y_test, # Questo nome corrisponde a quello nel modello\n",
" 'final_output': y_test\n",
" }\n",
"\n",
" def evaluate_epoch(epoch, logs):\n",
" if epoch % 20 == 0:\n",
" print(f\"\\nEpoch {epoch + 1} Detailed Metrics:\")\n",
" predictions = model.predict(X_test, verbose=0)\n",
" calculate_metrics(y_test, *predictions, min_output, max_output)\n",
"\n",
" callbacks = [\n",
" tf.keras.callbacks.EarlyStopping(\n",
" monitor='val_final_output_loss',\n",
" patience=35,\n",
" restore_best_weights=True,\n",
" mode='min',\n",
" verbose=1,\n",
" min_delta=1e-5\n",
" ),\n",
" tf.keras.callbacks.ModelCheckpoint(\n",
" filepath=f'{folder_name}_best_model.h5',\n",
" monitor='val_final_output_loss',\n",
" save_best_only=True,\n",
" mode='min',\n",
" save_weights_only=True # Modificato a True per evitare problemi di serializzazione\n",
" ),\n",
" tf.keras.callbacks.TensorBoard(\n",
" log_dir=f'./{folder_name}_logs',\n",
" histogram_freq=1,\n",
" write_graph=True,\n",
" update_freq='epoch'\n",
" ),\n",
" tf.keras.callbacks.LambdaCallback(on_epoch_end=evaluate_epoch),\n",
" tf.keras.callbacks.TerminateOnNaN()\n",
" ]\n",
"\n",
" '''\n",
" tf.keras.callbacks.ReduceLROnPlateau(\n",
" monitor='val_final_output_loss',\n",
" factor=0.8,\n",
" patience=10,\n",
" verbose=1,\n",
" mode='min',\n",
" min_delta=1e-4,\n",
" cooldown=2,\n",
" min_lr=1e-7\n",
" ),\n",
" '''\n",
" try:\n",
" history = model.fit(\n",
" X_train,\n",
" train_targets,\n",
" validation_data=(X_test, test_targets),\n",
" epochs=epochs,\n",
" batch_size=batch_size,\n",
" callbacks=callbacks,\n",
" verbose=1,\n",
" shuffle=False\n",
" )\n",
"\n",
" print(\"\\nTraining completed successfully!\")\n",
"\n",
" # Final evaluation\n",
" predictions = model.predict(X_test, verbose=0)\n",
" calculate_metrics(y_test, *predictions, min_output, max_output)\n",
"\n",
" return history\n",
"\n",
" except Exception as e:\n",
" print(f\"\\nError during training: {str(e)}\")\n",
" print(\"\\nModel output names:\", [output.name for output in model.outputs])\n",
" print(\"Training targets keys:\", train_targets.keys())\n",
" raise\n",
"\n",
" finally:\n",
" tf.keras.backend.clear_session()\n",
"\n",
"\n",
"def integrate_predictions(df, predictions, sequence_length=24):\n",
" \"\"\"\n",
" Integrates solar energy predictions into the original dataset for pre-2010 data.\n",
"\n",
" Parameters:\n",
" -----------\n",
" df : pandas.DataFrame\n",
" Original dataset\n",
" predictions : tuple\n",
" Tuple containing (classification_pred, regression_pred, final_pred)\n",
" - classification_pred: probability of non-zero values\n",
" - regression_pred: predicted values (used for non-zero cases)\n",
" - final_pred: final combined predictions\n",
" sequence_length : int\n",
" Sequence length used for predictions\n",
"\n",
" Returns:\n",
" --------\n",
" pandas.DataFrame\n",
" Updated dataset with solar energy predictions and additional prediction details\n",
" \"\"\"\n",
" # Convert datetime to datetime format if not already\n",
" df['datetime'] = pd.to_datetime(df['datetime'])\n",
"\n",
" # Identify pre-2010 rows\n",
" mask_pre_2010 = df['datetime'].dt.year < 2010\n",
"\n",
" # Unpack predictions\n",
" classification_pred, regression_pred, final_pred = predictions\n",
"\n",
" # Create temporary DataFrame with all predictions\n",
" dates_pre_2010 = df[mask_pre_2010]['datetime'].iloc[sequence_length - 1:]\n",
" predictions_df = pd.DataFrame({\n",
" 'datetime': dates_pre_2010,\n",
" 'solarenergy_predicted': final_pred.flatten(),\n",
" 'solarenergy_classification': classification_pred.flatten(),\n",
" 'solarenergy_regression': regression_pred.flatten()\n",
" })\n",
"\n",
" # Merge with original dataset\n",
" df = df.merge(predictions_df, on='datetime', how='left')\n",
"\n",
" # Update solar energy column where missing\n",
" df['solarenergy'] = df['solarenergy'].fillna(df['solarenergy_predicted'])\n",
"\n",
" # Print detailed statistics\n",
" print(\"\\nPrediction Integration Statistics:\")\n",
" print(f\"Added {len(final_pred)} predictions to dataset\")\n",
" print(f\"Rows with solar energy after integration: {df['solarenergy'].notna().sum()}\")\n",
"\n",
" # Analyze prediction components for the filled values\n",
" mask_filled = df['solarenergy'] == df['solarenergy_predicted']\n",
" if mask_filled.any():\n",
" filled_data = df[mask_filled]\n",
"\n",
" print(\"\\nFilled Values Analysis:\")\n",
" print(f\"Zero predictions (classification < 0.5): {(filled_data['solarenergy_classification'] < 0.5).sum()}\")\n",
" print(f\"Non-zero predictions (classification >= 0.5): {(filled_data['solarenergy_classification'] >= 0.5).sum()}\")\n",
"\n",
" # Distribution of predicted values\n",
" non_zero_pred = filled_data[filled_data['solarenergy_predicted'] > 0]\n",
" if len(non_zero_pred) > 0:\n",
" print(f\"\\nNon-zero predictions statistics:\")\n",
" print(f\"Mean: {non_zero_pred['solarenergy_predicted'].mean():.2f}\")\n",
" print(f\"Median: {non_zero_pred['solarenergy_predicted'].median():.2f}\")\n",
" print(f\"Std: {non_zero_pred['solarenergy_predicted'].std():.2f}\")\n",
"\n",
" # Optionally, you can keep or remove the intermediate prediction columns\n",
" columns_to_drop = ['solarenergy_predicted', 'solarenergy_classification',\n",
" 'solarenergy_regression']\n",
" df = df.drop(columns_to_drop, axis=1)\n",
"\n",
" return df"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "b3b0c2e65ddf484",
"metadata": {},
"outputs": [],
"source": [
"def analyze_distribution(data, solar_column='solarenergy', name = 'Solar Energy'):\n",
" \"\"\"\n",
" Analizza dettagliatamente la distribuzione della variabile solarenergy.\n",
"\n",
" Parameters:\n",
" -----------\n",
" data : pandas.DataFrame\n",
" DataFrame contenente la colonna solarenergy\n",
" solar_column : str, default='solarenergy'\n",
" Nome della colonna da analizzare\n",
"\n",
" Returns:\n",
" --------\n",
" dict\n",
" Dizionario contenente le statistiche principali\n",
" \"\"\"\n",
"\n",
" # Creiamo una figura con più subplot\n",
" fig = plt.figure(figsize=(20, 12))\n",
"\n",
" # 1. Statistiche di base\n",
" stats_dict = {\n",
" 'count': len(data[solar_column]),\n",
" 'missing': data[solar_column].isnull().sum(),\n",
" 'zeros': (data[solar_column] == 0).sum(),\n",
" 'mean': data[solar_column].mean(),\n",
" 'median': data[solar_column].median(),\n",
" 'std': data[solar_column].std(),\n",
" 'min': data[solar_column].min(),\n",
" 'max': data[solar_column].max(),\n",
" 'skewness': stats.skew(data[solar_column].dropna()),\n",
" 'kurtosis': stats.kurtosis(data[solar_column].dropna())\n",
" }\n",
"\n",
" # Calcolo dei percentili\n",
" percentiles = [1, 5, 10, 25, 50, 75, 90, 95, 99]\n",
" for p in percentiles:\n",
" stats_dict[f'percentile_{p}'] = np.percentile(data[solar_column].dropna(), p)\n",
"\n",
" # 2. Visualizzazioni\n",
"\n",
" # 2.1 Distribuzione\n",
" plt.subplot(2, 2, 1)\n",
" sns.histplot(data=data, x=solar_column, kde=True)\n",
" plt.title(f'Distribuzione di {name}')\n",
" plt.xlabel(f'{name}')\n",
" plt.ylabel('Frequenza')\n",
"\n",
" # 2.2 Box Plot\n",
" plt.subplot(2, 2, 2)\n",
" sns.boxplot(y=data[solar_column])\n",
" plt.title(f'Box Plot di {name}')\n",
"\n",
" # 2.3 QQ Plot\n",
" plt.subplot(2, 2, 3)\n",
" stats.probplot(data[solar_column].dropna(), dist=\"norm\", plot=plt)\n",
" plt.title(f'Q-Q Plot di {name}')\n",
"\n",
" # 2.4 Distribuzione Log-trasformata\n",
" plt.subplot(2, 2, 4)\n",
" sns.histplot(data=np.log1p(data[solar_column]), kde=True)\n",
" plt.title(f'Distribuzione Log-trasformata di {name}')\n",
" plt.xlabel(f'Log({name} + 1)')\n",
" plt.ylabel('Frequenza')\n",
"\n",
" plt.tight_layout()\n",
" plt.show()\n",
"\n",
" # 3. Analisi temporale se disponibile\n",
" if 'timestamp' in data.columns or 'datetime' in data.columns:\n",
" time_col = 'timestamp' if 'timestamp' in data.columns else 'datetime'\n",
" if isinstance(data[time_col].iloc[0], (int, float)):\n",
" data['temp_datetime'] = pd.to_datetime(data[time_col], unit='s')\n",
" else:\n",
" data['temp_datetime'] = pd.to_datetime(data[time_col])\n",
"\n",
" # Plot temporale\n",
" plt.figure(figsize=(15, 6))\n",
" plt.plot(data['temp_datetime'], data[solar_column])\n",
" plt.title(f'Serie Temporale di {name}')\n",
" plt.xlabel('Data')\n",
" plt.ylabel(f'{name}')\n",
" plt.xticks(rotation=45)\n",
" plt.tight_layout()\n",
" plt.show()\n",
"\n",
" # Analisi stagionale\n",
" data['month'] = data['temp_datetime'].dt.month\n",
" seasonal_stats = data.groupby('month')[solar_column].agg(['mean', 'std', 'median'])\n",
"\n",
" plt.figure(figsize=(12, 6))\n",
" seasonal_stats['mean'].plot(kind='bar')\n",
" plt.title(f'Media Mensile di {name}')\n",
" plt.xlabel('Mese')\n",
" plt.ylabel(f'{name} Media')\n",
" plt.tight_layout()\n",
" plt.show()\n",
"\n",
" # 4. Stampa delle statistiche principali\n",
" print(f\"\\nStatistiche principali di {name}:\")\n",
" print(\"-\" * 50)\n",
" for key, value in stats_dict.items():\n",
" print(f\"{key:15}: {value:,.4f}\")\n",
"\n",
" # 5. Suggerimenti per la normalizzazione\n",
" print(\"\\nSuggerimenti per la normalizzazione:\")\n",
" print(\"-\" * 50)\n",
"\n",
" skewness = abs(stats_dict['skewness'])\n",
" if skewness > 1:\n",
" print(\"- La distribuzione è fortemente asimmetrica (skewness > 1)\")\n",
" print(\"- Considerare una trasformazione logaritmica: np.log1p(x)\")\n",
"\n",
" range_ratio = stats_dict['max'] / stats_dict['std']\n",
" if range_ratio > 10:\n",
" print(\"- La variabile ha una scala molto ampia\")\n",
" print(\"- Considerare RobustScaler o StandardScaler per la normalizzazione\")\n",
"\n",
" zero_ratio = stats_dict['zeros'] / stats_dict['count']\n",
" if zero_ratio > 0.1:\n",
" print(f\"- Alta presenza di zeri ({zero_ratio:.2%})\")\n",
" print(\"- Considerare un modello in due parti: classificazione degli zeri + regressione sui valori non-zero\")\n",
"\n",
" return stats_dict"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "1b1ee91d1573ec66",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Initializing solar energy model training...\n",
"\n",
"1. Preparing data...\n",
"\n",
"Selected features:\n",
"Number of features: 66\n",
"Features list: ['uvindex', 'cloudcover', 'visibility', 'temp', 'pressure', 'humidity', 'solarradiation', 'solar_elevation', 'solar_angle', 'day_length', 'hour_sin', 'hour_cos', 'day_of_year_sin', 'day_of_year_cos', 'month_sin', 'month_cos', 'solar_noon', 'daylight_correction', 'clear_sky_index', 'atmospheric_attenuation', 'theoretical_radiation', 'expected_radiation', 'cloud_elevation', 'visibility_elevation', 'uv_cloud_interaction', 'temp_radiation_potential', 'air_mass_index', 'atmospheric_stability', 'vapor_pressure_deficit', 'diffusion_index', 'atmospheric_transmittance', 'temp_humidity_interaction', 'clear_sky_factor', 'cloud_rolling_12h', 'temp_rolling_12h', 'uv_rolling_12h', 'cloudcover_rolling_mean_6h', 'temp_rolling_mean_6h', 'energy_rolling_mean_6h', 'uv_rolling_mean_6h', 'energy_volatility', 'uv_volatility', 'temp_1h_lag', 'cloudcover_1h_lag', 'humidity_1h_lag', 'energy_lag_1h', 'uv_lag_1h', 'temp_losses', 'soiling_loss_factor', 'estimated_efficiency', 'production_potential', 'system_performance_ratio', 'conversion_efficiency_ratio', 'clear_sky_duration', 'weather_variability_index', 'temp_stability', 'humidity_stability', 'cloudcover_stability', 'season_Spring', 'season_Summer', 'season_Autumn', 'season_Winter', 'time_period_Morning', 'time_period_Afternoon', 'time_period_Evening', 'time_period_Night']\n",
"Training data shape: (112882, 24, 66)\n",
"Test data shape: (16849, 24, 66)\n",
"Saving scaler X to: 2024-11-27_23-17_scale_X.joblib\n",
"Saving scaler X to: 2024-11-27_23-17_scale_y.joblib\n",
"Saving features to: 2024-11-27_23-17_features.json\n"
]
}
],
"source": [
"df = pd.read_parquet('../../sources/weather_data_solarradiation.parquet')\n",
"\n",
"print(\"Initializing solar energy model training...\")\n",
"\n",
"# Data preparation\n",
"print(\"\\n1. Preparing data...\")\n",
"X_train_seq, X_test_seq, y_train, y_test, scaler_X, scaler_y, features, X_to_predict_seq = prepare_hybrid_data(df)\n",
"\n",
"print(f\"Training data shape: {X_train_seq.shape}\")\n",
"print(f\"Test data shape: {X_test_seq.shape}\")\n",
"\n",
"# Save or load scaler and features\n",
"scaler_X_path = f'{folder_name}_scale_X.joblib'\n",
"scaler_y_path = f'{folder_name}_scale_y.joblib'\n",
"features_path = f'{folder_name}_features.json'\n",
"model_path = f'{folder_name}_best_model.h5'\n",
"history_path = f'{folder_name}_training_history.json'\n",
"\n",
"if os.path.exists(scaler_X_path):\n",
" print(f\"Loading existing scaler X from: {scaler_X_path}\")\n",
" scaler = joblib.load(scaler_X_path)\n",
"else:\n",
" print(f\"Saving scaler X to: {scaler_X_path}\")\n",
" joblib.dump(scaler_X, scaler_X_path)\n",
"\n",
"if os.path.exists(scaler_y_path):\n",
" print(f\"Loading existing scaler X from: {scaler_y_path}\")\n",
" scaler = joblib.load(scaler_y_path)\n",
"else:\n",
" print(f\"Saving scaler X to: {scaler_y_path}\")\n",
" joblib.dump(scaler_y, scaler_y_path)\n",
"\n",
"if os.path.exists(features_path):\n",
" print(f\"Loading existing features from: {features_path}\")\n",
" with open(features_path, 'r') as f:\n",
" features = json.load(f)\n",
"else:\n",
" print(f\"Saving features to: {features_path}\")\n",
" with open(features_path, 'w') as f:\n",
" json.dump(features, f)\n",
"\n",
"# Data quality verification\n",
"if np.isnan(X_train_seq).any() or np.isnan(y_train).any():\n",
" raise ValueError(\"Found NaN values in training data\")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "096e79e3-7a3d-4e17-9a30-4d0747ee2d40",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"2. Creating model...\n",
"\\Min dataset solar energy : 0.0 - Scaled Version : 0.0\n",
"\n",
"Max dataset solar energy : 4.0 - Scaled Version : 3.3333333333333335\n",
"Max dataset solar energy increased by 8% : 4.32 - Scaled Version : 3.6000000000000005\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2024-11-27 23:18:54.766545: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1886] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 43404 MB memory: -> device: 0, name: NVIDIA L40, pci bus id: 0000:c1:00.0, compute capability: 8.9\n",
"2024-11-27 23:18:55.999926: I tensorflow/tsl/platform/default/subprocess.cc:304] Start cannot spawn child process: No such file or directory\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Class distribution in training set:\n",
"Zeros: 56899 (50.41%)\n",
"Non-zeros: 55983 (49.59%)\n",
"\n",
"Class distribution in test set:\n",
"Zeros: 8576 (50.90%)\n",
"Non-zeros: 8273 (49.10%)\n",
"\n",
"Model output names: ['classification_output', 'regression_output', 'final_output']\n",
"\n",
"4. Starting training...\n",
"Epoch 1/150\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2024-11-27 23:19:24.436497: I tensorflow/compiler/xla/stream_executor/cuda/cuda_dnn.cc:442] Loaded cuDNN version 8905\n",
"2024-11-27 23:19:24.593649: I tensorflow/tsl/platform/default/subprocess.cc:304] Start cannot spawn child process: No such file or directory\n",
"2024-11-27 23:19:26.676664: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x237e6dc0 initialized for platform CUDA (this does not guarantee that XLA will be used). Devices:\n",
"2024-11-27 23:19:26.676699: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): NVIDIA L40, Compute Capability 8.9\n",
"2024-11-27 23:19:26.682750: I tensorflow/compiler/mlir/tensorflow/utils/dump_mlir_util.cc:269] disabling MLIR crash reproducer, set env var `MLIR_CRASH_REPRODUCER_DIRECTORY` to enable.\n",
"2024-11-27 23:19:26.852932: I ./tensorflow/compiler/jit/device_compiler.h:186] Compiled cluster using XLA! This line is logged at most once for the lifetime of the process.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"221/221 [==============================] - ETA: 0s - loss: 10.1498 - classification_output_loss: 0.2192 - regression_output_loss: 0.3883 - final_output_loss: 0.2518\n",
"Epoch 1 Detailed Metrics:\n",
"\n",
"Classification Metrics:\n",
"Accuracy: 95.36%\n",
"AUC-ROC: 0.9917\n",
"\n",
"Confusion Matrix:\n",
"[[8285 291]\n",
" [ 491 7782]]\n",
"\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" Zero 0.9441 0.9661 0.9549 8576\n",
" Non-Zero 0.9640 0.9407 0.9522 8273\n",
"\n",
" accuracy 0.9536 16849\n",
" macro avg 0.9540 0.9534 0.9535 16849\n",
"weighted avg 0.9538 0.9536 0.9536 16849\n",
"\n",
"\n",
"Regression Metrics (non-zero values):\n",
"Out of range: 246 predictions\n",
"MAPE: 56.03%\n",
"Within ±10%: 4.04%\n",
"MAE: 0.66\n",
"RMSE: 0.87\n",
"\n",
"Final Combined Output Metrics:\n",
"Out of range: 0 predictions\n",
"MAPE: 25.95%\n",
"Within ±2%: 48.48%\n",
"Within ±5%: 49.50%\n",
"Within ±10%: 51.42%\n",
"Within ±20%: 55.81%\n",
"MAE: 0.24\n",
"RMSE: 0.45\n",
"221/221 [==============================] - 66s 124ms/step - loss: 10.1498 - classification_output_loss: 0.2192 - regression_output_loss: 0.3883 - final_output_loss: 0.2518 - val_loss: 7.6804 - val_classification_output_loss: 0.2792 - val_regression_output_loss: 0.4849 - val_final_output_loss: 0.2209\n",
"Epoch 2/150\n",
"221/221 [==============================] - 13s 58ms/step - loss: 5.9091 - classification_output_loss: 0.1070 - regression_output_loss: 0.1877 - final_output_loss: 0.1142 - val_loss: 4.7197 - val_classification_output_loss: 0.1352 - val_regression_output_loss: 0.2361 - val_final_output_loss: 0.1195\n",
"Epoch 3/150\n",
"221/221 [==============================] - 14s 64ms/step - loss: 3.9752 - classification_output_loss: 0.0814 - regression_output_loss: 0.1177 - final_output_loss: 0.0640 - val_loss: 3.4943 - val_classification_output_loss: 0.0998 - val_regression_output_loss: 0.1060 - val_final_output_loss: 0.0623\n",
"Epoch 4/150\n",
"221/221 [==============================] - 14s 62ms/step - loss: 3.2835 - classification_output_loss: 0.0751 - regression_output_loss: 0.1008 - final_output_loss: 0.0540 - val_loss: 3.1666 - val_classification_output_loss: 0.0896 - val_regression_output_loss: 0.0793 - val_final_output_loss: 0.0562\n",
"Epoch 5/150\n",
"221/221 [==============================] - 13s 59ms/step - loss: 2.9948 - classification_output_loss: 0.0926 - regression_output_loss: 0.1700 - final_output_loss: 0.1103 - val_loss: 2.3640 - val_classification_output_loss: 0.1197 - val_regression_output_loss: 0.1617 - val_final_output_loss: 0.1375\n",
"Epoch 6/150\n",
"221/221 [==============================] - 14s 61ms/step - loss: 1.7550 - classification_output_loss: 0.0797 - regression_output_loss: 0.1151 - final_output_loss: 0.0827 - val_loss: 1.2843 - val_classification_output_loss: 0.0880 - val_regression_output_loss: 0.0697 - val_final_output_loss: 0.0442\n",
"Epoch 7/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 1.0277 - classification_output_loss: 0.0647 - regression_output_loss: 0.0847 - final_output_loss: 0.0549 - val_loss: 0.8079 - val_classification_output_loss: 0.0836 - val_regression_output_loss: 0.0610 - val_final_output_loss: 0.0438\n",
"Epoch 8/150\n",
"221/221 [==============================] - 13s 59ms/step - loss: 0.6795 - classification_output_loss: 0.0600 - regression_output_loss: 0.0716 - final_output_loss: 0.0498 - val_loss: 0.5649 - val_classification_output_loss: 0.0770 - val_regression_output_loss: 0.0542 - val_final_output_loss: 0.0392\n",
"Epoch 9/150\n",
"221/221 [==============================] - 15s 67ms/step - loss: 0.4970 - classification_output_loss: 0.0545 - regression_output_loss: 0.0634 - final_output_loss: 0.0434 - val_loss: 0.4335 - val_classification_output_loss: 0.0751 - val_regression_output_loss: 0.0452 - val_final_output_loss: 0.0354\n",
"Epoch 10/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 0.3957 - classification_output_loss: 0.0517 - regression_output_loss: 0.0524 - final_output_loss: 0.0386 - val_loss: 0.3625 - val_classification_output_loss: 0.0749 - val_regression_output_loss: 0.0416 - val_final_output_loss: 0.0325\n",
"Epoch 11/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 0.3395 - classification_output_loss: 0.0503 - regression_output_loss: 0.0451 - final_output_loss: 0.0335 - val_loss: 0.3256 - val_classification_output_loss: 0.0750 - val_regression_output_loss: 0.0407 - val_final_output_loss: 0.0317\n",
"Epoch 12/150\n",
"221/221 [==============================] - 15s 66ms/step - loss: 0.3114 - classification_output_loss: 0.0509 - regression_output_loss: 0.0411 - final_output_loss: 0.0309 - val_loss: 0.3090 - val_classification_output_loss: 0.0738 - val_regression_output_loss: 0.0406 - val_final_output_loss: 0.0322\n",
"Epoch 13/150\n",
"221/221 [==============================] - 14s 61ms/step - loss: 0.3011 - classification_output_loss: 0.0523 - regression_output_loss: 0.0406 - final_output_loss: 0.0305 - val_loss: 0.2999 - val_classification_output_loss: 0.0677 - val_regression_output_loss: 0.0358 - val_final_output_loss: 0.0293\n",
"Epoch 14/150\n",
"221/221 [==============================] - 13s 60ms/step - loss: 0.3141 - classification_output_loss: 0.0616 - regression_output_loss: 0.0705 - final_output_loss: 0.0576 - val_loss: 0.3864 - val_classification_output_loss: 0.0790 - val_regression_output_loss: 0.2013 - val_final_output_loss: 0.1696\n",
"Epoch 15/150\n",
"221/221 [==============================] - 13s 61ms/step - loss: 0.2690 - classification_output_loss: 0.0643 - regression_output_loss: 0.1000 - final_output_loss: 0.0724 - val_loss: 0.2078 - val_classification_output_loss: 0.0773 - val_regression_output_loss: 0.0603 - val_final_output_loss: 0.0349\n",
"Epoch 16/150\n",
"221/221 [==============================] - 12s 56ms/step - loss: 0.1958 - classification_output_loss: 0.0566 - regression_output_loss: 0.0729 - final_output_loss: 0.0548 - val_loss: 0.1644 - val_classification_output_loss: 0.0686 - val_regression_output_loss: 0.0517 - val_final_output_loss: 0.0378\n",
"Epoch 17/150\n",
"221/221 [==============================] - 13s 59ms/step - loss: 0.1549 - classification_output_loss: 0.0523 - regression_output_loss: 0.0585 - final_output_loss: 0.0489 - val_loss: 0.1353 - val_classification_output_loss: 0.0668 - val_regression_output_loss: 0.0478 - val_final_output_loss: 0.0354\n",
"Epoch 18/150\n",
"221/221 [==============================] - 13s 58ms/step - loss: 0.1323 - classification_output_loss: 0.0503 - regression_output_loss: 0.0551 - final_output_loss: 0.0493 - val_loss: 0.1225 - val_classification_output_loss: 0.0707 - val_regression_output_loss: 0.0496 - val_final_output_loss: 0.0421\n",
"Epoch 19/150\n",
"221/221 [==============================] - 13s 60ms/step - loss: 0.1139 - classification_output_loss: 0.0501 - regression_output_loss: 0.0497 - final_output_loss: 0.0457 - val_loss: 0.1095 - val_classification_output_loss: 0.0744 - val_regression_output_loss: 0.0481 - val_final_output_loss: 0.0386\n",
"Epoch 20/150\n",
"221/221 [==============================] - 13s 58ms/step - loss: 0.0980 - classification_output_loss: 0.0462 - regression_output_loss: 0.0436 - final_output_loss: 0.0403 - val_loss: 0.0943 - val_classification_output_loss: 0.0679 - val_regression_output_loss: 0.0407 - val_final_output_loss: 0.0344\n",
"Epoch 21/150\n",
"221/221 [==============================] - ETA: 0s - loss: 0.0874 - classification_output_loss: 0.0439 - regression_output_loss: 0.0402 - final_output_loss: 0.0375\n",
"Epoch 21 Detailed Metrics:\n",
"\n",
"Classification Metrics:\n",
"Accuracy: 97.16%\n",
"AUC-ROC: 0.9962\n",
"\n",
"Confusion Matrix:\n",
"[[8389 187]\n",
" [ 291 7982]]\n",
"\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" Zero 0.9665 0.9782 0.9723 8576\n",
" Non-Zero 0.9771 0.9648 0.9709 8273\n",
"\n",
" accuracy 0.9716 16849\n",
" macro avg 0.9718 0.9715 0.9716 16849\n",
"weighted avg 0.9717 0.9716 0.9716 16849\n",
"\n",
"\n",
"Regression Metrics (non-zero values):\n",
"Out of range: 26 predictions\n",
"MAPE: 19.29%\n",
"Within ±10%: 44.86%\n",
"MAE: 0.11\n",
"RMSE: 0.14\n",
"\n",
"Final Combined Output Metrics:\n",
"Out of range: 0 predictions\n",
"MAPE: 13.12%\n",
"Within ±2%: 55.12%\n",
"Within ±5%: 62.25%\n",
"Within ±10%: 74.22%\n",
"Within ±20%: 84.48%\n",
"MAE: 0.06\n",
"RMSE: 0.10\n",
"221/221 [==============================] - 20s 91ms/step - loss: 0.0874 - classification_output_loss: 0.0439 - regression_output_loss: 0.0402 - final_output_loss: 0.0375 - val_loss: 0.0881 - val_classification_output_loss: 0.0742 - val_regression_output_loss: 0.0395 - val_final_output_loss: 0.0330\n",
"Epoch 22/150\n",
"221/221 [==============================] - 14s 65ms/step - loss: 0.0800 - classification_output_loss: 0.0425 - regression_output_loss: 0.0390 - final_output_loss: 0.0352 - val_loss: 0.0900 - val_classification_output_loss: 0.0677 - val_regression_output_loss: 0.0532 - val_final_output_loss: 0.0388\n",
"Epoch 23/150\n",
"221/221 [==============================] - 13s 58ms/step - loss: 0.0748 - classification_output_loss: 0.0402 - regression_output_loss: 0.0385 - final_output_loss: 0.0340 - val_loss: 0.0783 - val_classification_output_loss: 0.0639 - val_regression_output_loss: 0.0371 - val_final_output_loss: 0.0365\n",
"Epoch 24/150\n",
"221/221 [==============================] - 13s 59ms/step - loss: 0.0670 - classification_output_loss: 0.0385 - regression_output_loss: 0.0327 - final_output_loss: 0.0290 - val_loss: 0.0738 - val_classification_output_loss: 0.0631 - val_regression_output_loss: 0.0350 - val_final_output_loss: 0.0350\n",
"Epoch 25/150\n",
"221/221 [==============================] - 12s 56ms/step - loss: 0.0620 - classification_output_loss: 0.0378 - regression_output_loss: 0.0294 - final_output_loss: 0.0260 - val_loss: 0.0657 - val_classification_output_loss: 0.0624 - val_regression_output_loss: 0.0286 - val_final_output_loss: 0.0271\n",
"Epoch 26/150\n",
"221/221 [==============================] - 13s 57ms/step - loss: 0.0591 - classification_output_loss: 0.0374 - regression_output_loss: 0.0284 - final_output_loss: 0.0248 - val_loss: 0.0618 - val_classification_output_loss: 0.0628 - val_regression_output_loss: 0.0258 - val_final_output_loss: 0.0240\n",
"Epoch 27/150\n",
"221/221 [==============================] - 13s 59ms/step - loss: 0.0570 - classification_output_loss: 0.0361 - regression_output_loss: 0.0277 - final_output_loss: 0.0243 - val_loss: 0.0591 - val_classification_output_loss: 0.0622 - val_regression_output_loss: 0.0257 - val_final_output_loss: 0.0203\n",
"Epoch 28/150\n",
"221/221 [==============================] - 13s 59ms/step - loss: 0.0555 - classification_output_loss: 0.0362 - regression_output_loss: 0.0272 - final_output_loss: 0.0233 - val_loss: 0.0584 - val_classification_output_loss: 0.0615 - val_regression_output_loss: 0.0266 - val_final_output_loss: 0.0198\n",
"Epoch 29/150\n",
"221/221 [==============================] - 13s 60ms/step - loss: 0.0550 - classification_output_loss: 0.0364 - regression_output_loss: 0.0273 - final_output_loss: 0.0231 - val_loss: 0.0588 - val_classification_output_loss: 0.0611 - val_regression_output_loss: 0.0273 - val_final_output_loss: 0.0214\n",
"Epoch 30/150\n",
"221/221 [==============================] - 14s 64ms/step - loss: 0.0548 - classification_output_loss: 0.0375 - regression_output_loss: 0.0272 - final_output_loss: 0.0231 - val_loss: 0.0565 - val_classification_output_loss: 0.0579 - val_regression_output_loss: 0.0247 - val_final_output_loss: 0.0201\n",
"Epoch 31/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 0.0553 - classification_output_loss: 0.0371 - regression_output_loss: 0.0285 - final_output_loss: 0.0236 - val_loss: 0.0548 - val_classification_output_loss: 0.0564 - val_regression_output_loss: 0.0222 - val_final_output_loss: 0.0191\n",
"Epoch 32/150\n",
"221/221 [==============================] - 13s 58ms/step - loss: 0.0793 - classification_output_loss: 0.0410 - regression_output_loss: 0.0607 - final_output_loss: 0.0465 - val_loss: 0.2093 - val_classification_output_loss: 0.1111 - val_regression_output_loss: 0.1922 - val_final_output_loss: 0.1775\n",
"Epoch 33/150\n",
"221/221 [==============================] - 14s 65ms/step - loss: 0.1067 - classification_output_loss: 0.0635 - regression_output_loss: 0.0839 - final_output_loss: 0.0643 - val_loss: 0.0728 - val_classification_output_loss: 0.0623 - val_regression_output_loss: 0.0473 - val_final_output_loss: 0.0327\n",
"Epoch 34/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 0.0784 - classification_output_loss: 0.0467 - regression_output_loss: 0.0531 - final_output_loss: 0.0493 - val_loss: 0.0785 - val_classification_output_loss: 0.0949 - val_regression_output_loss: 0.0493 - val_final_output_loss: 0.0359\n",
"Epoch 35/150\n",
"221/221 [==============================] - 14s 62ms/step - loss: 0.0675 - classification_output_loss: 0.0457 - regression_output_loss: 0.0424 - final_output_loss: 0.0420 - val_loss: 0.0692 - val_classification_output_loss: 0.0691 - val_regression_output_loss: 0.0519 - val_final_output_loss: 0.0288\n",
"Epoch 36/150\n",
"221/221 [==============================] - 15s 66ms/step - loss: 0.0676 - classification_output_loss: 0.0418 - regression_output_loss: 0.0452 - final_output_loss: 0.0455 - val_loss: 0.0689 - val_classification_output_loss: 0.0829 - val_regression_output_loss: 0.0430 - val_final_output_loss: 0.0324\n",
"Epoch 37/150\n",
"221/221 [==============================] - 12s 56ms/step - loss: 0.0595 - classification_output_loss: 0.0396 - regression_output_loss: 0.0376 - final_output_loss: 0.0386 - val_loss: 0.0798 - val_classification_output_loss: 0.0626 - val_regression_output_loss: 0.0699 - val_final_output_loss: 0.0473\n",
"Epoch 38/150\n",
"221/221 [==============================] - 13s 57ms/step - loss: 0.0606 - classification_output_loss: 0.0404 - regression_output_loss: 0.0414 - final_output_loss: 0.0402 - val_loss: 0.0661 - val_classification_output_loss: 0.0571 - val_regression_output_loss: 0.0558 - val_final_output_loss: 0.0315\n",
"Epoch 39/150\n",
"221/221 [==============================] - 14s 62ms/step - loss: 0.0570 - classification_output_loss: 0.0375 - regression_output_loss: 0.0370 - final_output_loss: 0.0393 - val_loss: 0.0550 - val_classification_output_loss: 0.0546 - val_regression_output_loss: 0.0365 - val_final_output_loss: 0.0288\n",
"Epoch 40/150\n",
"221/221 [==============================] - 13s 61ms/step - loss: 0.0544 - classification_output_loss: 0.0390 - regression_output_loss: 0.0361 - final_output_loss: 0.0359 - val_loss: 0.0600 - val_classification_output_loss: 0.0527 - val_regression_output_loss: 0.0424 - val_final_output_loss: 0.0381\n",
"Epoch 41/150\n",
"221/221 [==============================] - ETA: 0s - loss: 0.0505 - classification_output_loss: 0.0366 - regression_output_loss: 0.0326 - final_output_loss: 0.0335\n",
"Epoch 41 Detailed Metrics:\n",
"\n",
"Classification Metrics:\n",
"Accuracy: 97.79%\n",
"AUC-ROC: 0.9980\n",
"\n",
"Confusion Matrix:\n",
"[[8337 239]\n",
" [ 133 8140]]\n",
"\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" Zero 0.9843 0.9721 0.9782 8576\n",
" Non-Zero 0.9715 0.9839 0.9777 8273\n",
"\n",
" accuracy 0.9779 16849\n",
" macro avg 0.9779 0.9780 0.9779 16849\n",
"weighted avg 0.9780 0.9779 0.9779 16849\n",
"\n",
"\n",
"Regression Metrics (non-zero values):\n",
"Out of range: 66 predictions\n",
"MAPE: 16.65%\n",
"Within ±10%: 48.35%\n",
"MAE: 0.13\n",
"RMSE: 0.19\n",
"\n",
"Final Combined Output Metrics:\n",
"Out of range: 0 predictions\n",
"MAPE: 10.82%\n",
"Within ±2%: 56.88%\n",
"Within ±5%: 64.73%\n",
"Within ±10%: 74.46%\n",
"Within ±20%: 86.63%\n",
"MAE: 0.06\n",
"RMSE: 0.11\n",
"221/221 [==============================] - 20s 89ms/step - loss: 0.0505 - classification_output_loss: 0.0366 - regression_output_loss: 0.0326 - final_output_loss: 0.0335 - val_loss: 0.0626 - val_classification_output_loss: 0.0581 - val_regression_output_loss: 0.0524 - val_final_output_loss: 0.0347\n",
"Epoch 42/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 0.0519 - classification_output_loss: 0.0342 - regression_output_loss: 0.0354 - final_output_loss: 0.0366 - val_loss: 0.0468 - val_classification_output_loss: 0.0514 - val_regression_output_loss: 0.0282 - val_final_output_loss: 0.0241\n",
"Epoch 43/150\n",
"221/221 [==============================] - 12s 56ms/step - loss: 0.0489 - classification_output_loss: 0.0327 - regression_output_loss: 0.0326 - final_output_loss: 0.0343 - val_loss: 0.0487 - val_classification_output_loss: 0.0563 - val_regression_output_loss: 0.0302 - val_final_output_loss: 0.0271\n",
"Epoch 44/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 0.0477 - classification_output_loss: 0.0337 - regression_output_loss: 0.0313 - final_output_loss: 0.0340 - val_loss: 0.0483 - val_classification_output_loss: 0.0535 - val_regression_output_loss: 0.0292 - val_final_output_loss: 0.0297\n",
"Epoch 45/150\n",
"221/221 [==============================] - 14s 65ms/step - loss: 0.0455 - classification_output_loss: 0.0308 - regression_output_loss: 0.0296 - final_output_loss: 0.0330 - val_loss: 0.0433 - val_classification_output_loss: 0.0494 - val_regression_output_loss: 0.0274 - val_final_output_loss: 0.0220\n",
"Epoch 46/150\n",
"221/221 [==============================] - 13s 61ms/step - loss: 0.0433 - classification_output_loss: 0.0298 - regression_output_loss: 0.0286 - final_output_loss: 0.0304 - val_loss: 0.0455 - val_classification_output_loss: 0.0634 - val_regression_output_loss: 0.0265 - val_final_output_loss: 0.0224\n",
"Epoch 47/150\n",
"221/221 [==============================] - 13s 57ms/step - loss: 0.0413 - classification_output_loss: 0.0300 - regression_output_loss: 0.0274 - final_output_loss: 0.0281 - val_loss: 0.0418 - val_classification_output_loss: 0.0464 - val_regression_output_loss: 0.0273 - val_final_output_loss: 0.0227\n",
"Epoch 48/150\n",
"221/221 [==============================] - 13s 59ms/step - loss: 0.0418 - classification_output_loss: 0.0295 - regression_output_loss: 0.0282 - final_output_loss: 0.0301 - val_loss: 0.0518 - val_classification_output_loss: 0.0546 - val_regression_output_loss: 0.0372 - val_final_output_loss: 0.0337\n",
"Epoch 49/150\n",
"221/221 [==============================] - 12s 56ms/step - loss: 0.0404 - classification_output_loss: 0.0272 - regression_output_loss: 0.0272 - final_output_loss: 0.0293 - val_loss: 0.0580 - val_classification_output_loss: 0.0484 - val_regression_output_loss: 0.0416 - val_final_output_loss: 0.0473\n",
"Epoch 50/150\n",
"221/221 [==============================] - 14s 62ms/step - loss: 0.0399 - classification_output_loss: 0.0275 - regression_output_loss: 0.0270 - final_output_loss: 0.0284 - val_loss: 0.0492 - val_classification_output_loss: 0.0514 - val_regression_output_loss: 0.0317 - val_final_output_loss: 0.0357\n",
"Epoch 51/150\n",
"221/221 [==============================] - 13s 61ms/step - loss: 0.0362 - classification_output_loss: 0.0262 - regression_output_loss: 0.0236 - final_output_loss: 0.0246 - val_loss: 0.0476 - val_classification_output_loss: 0.0431 - val_regression_output_loss: 0.0343 - val_final_output_loss: 0.0346\n",
"Epoch 52/150\n",
"221/221 [==============================] - 14s 62ms/step - loss: 0.0351 - classification_output_loss: 0.0258 - regression_output_loss: 0.0231 - final_output_loss: 0.0238 - val_loss: 0.0457 - val_classification_output_loss: 0.0419 - val_regression_output_loss: 0.0328 - val_final_output_loss: 0.0331\n",
"Epoch 53/150\n",
"221/221 [==============================] - 14s 61ms/step - loss: 0.0329 - classification_output_loss: 0.0245 - regression_output_loss: 0.0213 - final_output_loss: 0.0216 - val_loss: 0.0407 - val_classification_output_loss: 0.0418 - val_regression_output_loss: 0.0274 - val_final_output_loss: 0.0273\n",
"Epoch 54/150\n",
"221/221 [==============================] - 14s 62ms/step - loss: 0.0315 - classification_output_loss: 0.0237 - regression_output_loss: 0.0206 - final_output_loss: 0.0203 - val_loss: 0.0371 - val_classification_output_loss: 0.0387 - val_regression_output_loss: 0.0254 - val_final_output_loss: 0.0229\n",
"Epoch 55/150\n",
"221/221 [==============================] - 14s 61ms/step - loss: 0.0311 - classification_output_loss: 0.0225 - regression_output_loss: 0.0206 - final_output_loss: 0.0206 - val_loss: 0.0356 - val_classification_output_loss: 0.0381 - val_regression_output_loss: 0.0235 - val_final_output_loss: 0.0219\n",
"Epoch 56/150\n",
"221/221 [==============================] - 13s 58ms/step - loss: 0.0302 - classification_output_loss: 0.0223 - regression_output_loss: 0.0201 - final_output_loss: 0.0198 - val_loss: 0.0351 - val_classification_output_loss: 0.0411 - val_regression_output_loss: 0.0224 - val_final_output_loss: 0.0207\n",
"Epoch 57/150\n",
"221/221 [==============================] - 13s 57ms/step - loss: 0.0301 - classification_output_loss: 0.0221 - regression_output_loss: 0.0199 - final_output_loss: 0.0201 - val_loss: 0.0340 - val_classification_output_loss: 0.0393 - val_regression_output_loss: 0.0215 - val_final_output_loss: 0.0205\n",
"Epoch 58/150\n",
"221/221 [==============================] - 13s 59ms/step - loss: 0.0296 - classification_output_loss: 0.0213 - regression_output_loss: 0.0199 - final_output_loss: 0.0197 - val_loss: 0.0326 - val_classification_output_loss: 0.0389 - val_regression_output_loss: 0.0204 - val_final_output_loss: 0.0186\n",
"Epoch 59/150\n",
"221/221 [==============================] - 13s 58ms/step - loss: 0.0296 - classification_output_loss: 0.0210 - regression_output_loss: 0.0200 - final_output_loss: 0.0200 - val_loss: 0.0311 - val_classification_output_loss: 0.0367 - val_regression_output_loss: 0.0206 - val_final_output_loss: 0.0161\n",
"Epoch 60/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 0.0295 - classification_output_loss: 0.0211 - regression_output_loss: 0.0202 - final_output_loss: 0.0198 - val_loss: 0.0315 - val_classification_output_loss: 0.0365 - val_regression_output_loss: 0.0215 - val_final_output_loss: 0.0165\n",
"Epoch 61/150\n",
"221/221 [==============================] - ETA: 0s - loss: 0.0290 - classification_output_loss: 0.0201 - regression_output_loss: 0.0199 - final_output_loss: 0.0195\n",
"Epoch 61 Detailed Metrics:\n",
"\n",
"Classification Metrics:\n",
"Accuracy: 98.60%\n",
"AUC-ROC: 0.9993\n",
"\n",
"Confusion Matrix:\n",
"[[8473 103]\n",
" [ 133 8140]]\n",
"\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" Zero 0.9845 0.9880 0.9863 8576\n",
" Non-Zero 0.9875 0.9839 0.9857 8273\n",
"\n",
" accuracy 0.9860 16849\n",
" macro avg 0.9860 0.9860 0.9860 16849\n",
"weighted avg 0.9860 0.9860 0.9860 16849\n",
"\n",
"\n",
"Regression Metrics (non-zero values):\n",
"Out of range: 0 predictions\n",
"MAPE: 11.30%\n",
"Within ±10%: 73.14%\n",
"MAE: 0.06\n",
"RMSE: 0.09\n",
"\n",
"Final Combined Output Metrics:\n",
"Out of range: 0 predictions\n",
"MAPE: 7.72%\n",
"Within ±2%: 60.84%\n",
"Within ±5%: 74.53%\n",
"Within ±10%: 86.72%\n",
"Within ±20%: 91.58%\n",
"MAE: 0.03\n",
"RMSE: 0.06\n",
"221/221 [==============================] - 20s 90ms/step - loss: 0.0290 - classification_output_loss: 0.0201 - regression_output_loss: 0.0199 - final_output_loss: 0.0195 - val_loss: 0.0315 - val_classification_output_loss: 0.0356 - val_regression_output_loss: 0.0215 - val_final_output_loss: 0.0171\n",
"Epoch 62/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 0.0290 - classification_output_loss: 0.0207 - regression_output_loss: 0.0199 - final_output_loss: 0.0194 - val_loss: 0.0311 - val_classification_output_loss: 0.0355 - val_regression_output_loss: 0.0206 - val_final_output_loss: 0.0172\n",
"Epoch 63/150\n",
"221/221 [==============================] - 14s 62ms/step - loss: 0.0288 - classification_output_loss: 0.0205 - regression_output_loss: 0.0199 - final_output_loss: 0.0192 - val_loss: 0.0308 - val_classification_output_loss: 0.0349 - val_regression_output_loss: 0.0199 - val_final_output_loss: 0.0175\n",
"Epoch 64/150\n",
"221/221 [==============================] - 14s 62ms/step - loss: 0.0289 - classification_output_loss: 0.0207 - regression_output_loss: 0.0200 - final_output_loss: 0.0194 - val_loss: 0.0302 - val_classification_output_loss: 0.0348 - val_regression_output_loss: 0.0191 - val_final_output_loss: 0.0168\n",
"Epoch 65/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 0.0289 - classification_output_loss: 0.0204 - regression_output_loss: 0.0202 - final_output_loss: 0.0194 - val_loss: 0.0297 - val_classification_output_loss: 0.0349 - val_regression_output_loss: 0.0185 - val_final_output_loss: 0.0160\n",
"Epoch 66/150\n",
"221/221 [==============================] - 13s 60ms/step - loss: 0.0295 - classification_output_loss: 0.0209 - regression_output_loss: 0.0211 - final_output_loss: 0.0198 - val_loss: 0.0294 - val_classification_output_loss: 0.0350 - val_regression_output_loss: 0.0180 - val_final_output_loss: 0.0157\n",
"Epoch 67/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 0.0302 - classification_output_loss: 0.0208 - regression_output_loss: 0.0215 - final_output_loss: 0.0210 - val_loss: 0.0303 - val_classification_output_loss: 0.0348 - val_regression_output_loss: 0.0191 - val_final_output_loss: 0.0170\n",
"Epoch 68/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 0.0304 - classification_output_loss: 0.0223 - regression_output_loss: 0.0210 - final_output_loss: 0.0212 - val_loss: 0.0636 - val_classification_output_loss: 0.0548 - val_regression_output_loss: 0.0283 - val_final_output_loss: 0.0759\n",
"Epoch 69/150\n",
"221/221 [==============================] - 13s 60ms/step - loss: 0.0798 - classification_output_loss: 0.0495 - regression_output_loss: 0.0662 - final_output_loss: 0.0655 - val_loss: 0.0591 - val_classification_output_loss: 0.0509 - val_regression_output_loss: 0.0539 - val_final_output_loss: 0.0388\n",
"Epoch 70/150\n",
"221/221 [==============================] - 12s 56ms/step - loss: 0.0506 - classification_output_loss: 0.0340 - regression_output_loss: 0.0369 - final_output_loss: 0.0415 - val_loss: 0.0465 - val_classification_output_loss: 0.0452 - val_regression_output_loss: 0.0398 - val_final_output_loss: 0.0249\n",
"Epoch 71/150\n",
"221/221 [==============================] - 13s 58ms/step - loss: 0.0450 - classification_output_loss: 0.0282 - regression_output_loss: 0.0332 - final_output_loss: 0.0362 - val_loss: 0.0431 - val_classification_output_loss: 0.0442 - val_regression_output_loss: 0.0316 - val_final_output_loss: 0.0284\n",
"Epoch 72/150\n",
"221/221 [==============================] - 13s 59ms/step - loss: 0.0425 - classification_output_loss: 0.0302 - regression_output_loss: 0.0303 - final_output_loss: 0.0330 - val_loss: 0.0478 - val_classification_output_loss: 0.0484 - val_regression_output_loss: 0.0391 - val_final_output_loss: 0.0306\n",
"Epoch 73/150\n",
"221/221 [==============================] - 13s 58ms/step - loss: 0.0413 - classification_output_loss: 0.0268 - regression_output_loss: 0.0300 - final_output_loss: 0.0335 - val_loss: 0.0437 - val_classification_output_loss: 0.0455 - val_regression_output_loss: 0.0275 - val_final_output_loss: 0.0344\n",
"Epoch 74/150\n",
"221/221 [==============================] - 13s 61ms/step - loss: 0.0429 - classification_output_loss: 0.0309 - regression_output_loss: 0.0297 - final_output_loss: 0.0353 - val_loss: 0.0438 - val_classification_output_loss: 0.0651 - val_regression_output_loss: 0.0286 - val_final_output_loss: 0.0228\n",
"Epoch 75/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 0.0391 - classification_output_loss: 0.0249 - regression_output_loss: 0.0278 - final_output_loss: 0.0318 - val_loss: 0.0420 - val_classification_output_loss: 0.0521 - val_regression_output_loss: 0.0279 - val_final_output_loss: 0.0266\n",
"Epoch 76/150\n",
"221/221 [==============================] - 13s 58ms/step - loss: 0.0378 - classification_output_loss: 0.0254 - regression_output_loss: 0.0252 - final_output_loss: 0.0311 - val_loss: 0.0443 - val_classification_output_loss: 0.0531 - val_regression_output_loss: 0.0255 - val_final_output_loss: 0.0357\n",
"Epoch 77/150\n",
"221/221 [==============================] - 13s 60ms/step - loss: 0.0387 - classification_output_loss: 0.0283 - regression_output_loss: 0.0267 - final_output_loss: 0.0322 - val_loss: 0.0744 - val_classification_output_loss: 0.0440 - val_regression_output_loss: 0.0526 - val_final_output_loss: 0.0837\n",
"Epoch 78/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 0.0428 - classification_output_loss: 0.0288 - regression_output_loss: 0.0317 - final_output_loss: 0.0347 - val_loss: 0.0552 - val_classification_output_loss: 0.0460 - val_regression_output_loss: 0.0467 - val_final_output_loss: 0.0405\n",
"Epoch 79/150\n",
"221/221 [==============================] - 14s 65ms/step - loss: 0.0370 - classification_output_loss: 0.0250 - regression_output_loss: 0.0260 - final_output_loss: 0.0290 - val_loss: 0.0362 - val_classification_output_loss: 0.0526 - val_regression_output_loss: 0.0227 - val_final_output_loss: 0.0187\n",
"Epoch 80/150\n",
"221/221 [==============================] - 15s 66ms/step - loss: 0.0367 - classification_output_loss: 0.0248 - regression_output_loss: 0.0252 - final_output_loss: 0.0299 - val_loss: 0.0427 - val_classification_output_loss: 0.0726 - val_regression_output_loss: 0.0270 - val_final_output_loss: 0.0209\n",
"Epoch 81/150\n",
"221/221 [==============================] - ETA: 0s - loss: 0.0363 - classification_output_loss: 0.0254 - regression_output_loss: 0.0261 - final_output_loss: 0.0294\n",
"Epoch 81 Detailed Metrics:\n",
"\n",
"Classification Metrics:\n",
"Accuracy: 98.52%\n",
"AUC-ROC: 0.9992\n",
"\n",
"Confusion Matrix:\n",
"[[8431 145]\n",
" [ 104 8169]]\n",
"\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" Zero 0.9878 0.9831 0.9854 8576\n",
" Non-Zero 0.9826 0.9874 0.9850 8273\n",
"\n",
" accuracy 0.9852 16849\n",
" macro avg 0.9852 0.9853 0.9852 16849\n",
"weighted avg 0.9852 0.9852 0.9852 16849\n",
"\n",
"\n",
"Regression Metrics (non-zero values):\n",
"Out of range: 18 predictions\n",
"MAPE: 17.42%\n",
"Within ±10%: 42.09%\n",
"MAE: 0.15\n",
"RMSE: 0.21\n",
"\n",
"Final Combined Output Metrics:\n",
"Out of range: 0 predictions\n",
"MAPE: 13.33%\n",
"Within ±2%: 53.80%\n",
"Within ±5%: 59.62%\n",
"Within ±10%: 68.52%\n",
"Within ±20%: 80.93%\n",
"MAE: 0.08\n",
"RMSE: 0.14\n",
"221/221 [==============================] - 20s 90ms/step - loss: 0.0363 - classification_output_loss: 0.0254 - regression_output_loss: 0.0261 - final_output_loss: 0.0294 - val_loss: 0.0601 - val_classification_output_loss: 0.0380 - val_regression_output_loss: 0.0604 - val_final_output_loss: 0.0479\n",
"Epoch 82/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 0.0396 - classification_output_loss: 0.0282 - regression_output_loss: 0.0283 - final_output_loss: 0.0328 - val_loss: 0.0370 - val_classification_output_loss: 0.0409 - val_regression_output_loss: 0.0238 - val_final_output_loss: 0.0237\n",
"Epoch 83/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 0.0357 - classification_output_loss: 0.0229 - regression_output_loss: 0.0256 - final_output_loss: 0.0287 - val_loss: 0.0380 - val_classification_output_loss: 0.0534 - val_regression_output_loss: 0.0252 - val_final_output_loss: 0.0216\n",
"Epoch 84/150\n",
"221/221 [==============================] - 14s 62ms/step - loss: 0.0337 - classification_output_loss: 0.0232 - regression_output_loss: 0.0235 - final_output_loss: 0.0272 - val_loss: 0.0497 - val_classification_output_loss: 0.0303 - val_regression_output_loss: 0.0465 - val_final_output_loss: 0.0407\n",
"Epoch 85/150\n",
"221/221 [==============================] - 15s 66ms/step - loss: 0.0380 - classification_output_loss: 0.0252 - regression_output_loss: 0.0267 - final_output_loss: 0.0329 - val_loss: 0.0559 - val_classification_output_loss: 0.0405 - val_regression_output_loss: 0.0447 - val_final_output_loss: 0.0485\n",
"Epoch 86/150\n",
"221/221 [==============================] - 13s 61ms/step - loss: 0.0339 - classification_output_loss: 0.0219 - regression_output_loss: 0.0249 - final_output_loss: 0.0265 - val_loss: 0.0419 - val_classification_output_loss: 0.0481 - val_regression_output_loss: 0.0285 - val_final_output_loss: 0.0306\n",
"Epoch 87/150\n",
"221/221 [==============================] - 14s 65ms/step - loss: 0.0327 - classification_output_loss: 0.0218 - regression_output_loss: 0.0230 - final_output_loss: 0.0265 - val_loss: 0.0339 - val_classification_output_loss: 0.0380 - val_regression_output_loss: 0.0253 - val_final_output_loss: 0.0204\n",
"Epoch 88/150\n",
"221/221 [==============================] - 13s 59ms/step - loss: 0.0328 - classification_output_loss: 0.0223 - regression_output_loss: 0.0236 - final_output_loss: 0.0267 - val_loss: 0.0476 - val_classification_output_loss: 0.0404 - val_regression_output_loss: 0.0346 - val_final_output_loss: 0.0431\n",
"Epoch 89/150\n",
"221/221 [==============================] - 13s 61ms/step - loss: 0.0349 - classification_output_loss: 0.0226 - regression_output_loss: 0.0249 - final_output_loss: 0.0295 - val_loss: 0.0416 - val_classification_output_loss: 0.0428 - val_regression_output_loss: 0.0297 - val_final_output_loss: 0.0298\n",
"Epoch 90/150\n",
"221/221 [==============================] - 13s 60ms/step - loss: 0.0321 - classification_output_loss: 0.0202 - regression_output_loss: 0.0225 - final_output_loss: 0.0262 - val_loss: 0.0324 - val_classification_output_loss: 0.0381 - val_regression_output_loss: 0.0226 - val_final_output_loss: 0.0197\n",
"Epoch 91/150\n",
"221/221 [==============================] - 13s 60ms/step - loss: 0.0307 - classification_output_loss: 0.0208 - regression_output_loss: 0.0223 - final_output_loss: 0.0245 - val_loss: 0.0384 - val_classification_output_loss: 0.0717 - val_regression_output_loss: 0.0236 - val_final_output_loss: 0.0179\n",
"Epoch 92/150\n",
"221/221 [==============================] - 12s 56ms/step - loss: 0.0302 - classification_output_loss: 0.0204 - regression_output_loss: 0.0212 - final_output_loss: 0.0250 - val_loss: 0.0435 - val_classification_output_loss: 0.0330 - val_regression_output_loss: 0.0379 - val_final_output_loss: 0.0356\n",
"Epoch 93/150\n",
"221/221 [==============================] - 13s 59ms/step - loss: 0.0327 - classification_output_loss: 0.0197 - regression_output_loss: 0.0238 - final_output_loss: 0.0283 - val_loss: 0.0357 - val_classification_output_loss: 0.0459 - val_regression_output_loss: 0.0234 - val_final_output_loss: 0.0223\n",
"Epoch 94/150\n",
"221/221 [==============================] - 14s 64ms/step - loss: 0.0300 - classification_output_loss: 0.0179 - regression_output_loss: 0.0221 - final_output_loss: 0.0241 - val_loss: 0.0309 - val_classification_output_loss: 0.0322 - val_regression_output_loss: 0.0219 - val_final_output_loss: 0.0210\n",
"Epoch 95/150\n",
"221/221 [==============================] - 14s 63ms/step - loss: 0.0293 - classification_output_loss: 0.0181 - regression_output_loss: 0.0207 - final_output_loss: 0.0246 - val_loss: 0.0310 - val_classification_output_loss: 0.0385 - val_regression_output_loss: 0.0222 - val_final_output_loss: 0.0183\n",
"Epoch 96/150\n",
"221/221 [==============================] - 13s 58ms/step - loss: 0.0278 - classification_output_loss: 0.0172 - regression_output_loss: 0.0199 - final_output_loss: 0.0227 - val_loss: 0.0361 - val_classification_output_loss: 0.0571 - val_regression_output_loss: 0.0237 - val_final_output_loss: 0.0203\n",
"Epoch 97/150\n",
"221/221 [==============================] - 15s 66ms/step - loss: 0.0295 - classification_output_loss: 0.0197 - regression_output_loss: 0.0209 - final_output_loss: 0.0247 - val_loss: 0.0316 - val_classification_output_loss: 0.0417 - val_regression_output_loss: 0.0214 - val_final_output_loss: 0.0181\n",
"Epoch 98/150\n",
"221/221 [==============================] - 14s 62ms/step - loss: 0.0289 - classification_output_loss: 0.0174 - regression_output_loss: 0.0211 - final_output_loss: 0.0240 - val_loss: 0.0450 - val_classification_output_loss: 0.0319 - val_regression_output_loss: 0.0309 - val_final_output_loss: 0.0451\n",
"Epoch 99/150\n",
"221/221 [==============================] - 13s 61ms/step - loss: 0.0302 - classification_output_loss: 0.0194 - regression_output_loss: 0.0216 - final_output_loss: 0.0255 - val_loss: 0.0351 - val_classification_output_loss: 0.0486 - val_regression_output_loss: 0.0228 - val_final_output_loss: 0.0221\n",
"Epoch 100/150\n",
"221/221 [==============================] - 15s 68ms/step - loss: 0.0268 - classification_output_loss: 0.0169 - regression_output_loss: 0.0194 - final_output_loss: 0.0214 - val_loss: 0.0330 - val_classification_output_loss: 0.0376 - val_regression_output_loss: 0.0208 - val_final_output_loss: 0.0257\n",
"Epoch 101/150\n",
"221/221 [==============================] - ETA: 0s - loss: 0.0261 - classification_output_loss: 0.0137 - regression_output_loss: 0.0188 - final_output_loss: 0.0227Restoring model weights from the end of the best epoch: 66.\n",
"\n",
"Epoch 101 Detailed Metrics:\n",
"\n",
"Classification Metrics:\n",
"Accuracy: 98.65%\n",
"AUC-ROC: 0.9994\n",
"\n",
"Confusion Matrix:\n",
"[[8497 79]\n",
" [ 148 8125]]\n",
"\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" Zero 0.9829 0.9908 0.9868 8576\n",
" Non-Zero 0.9904 0.9821 0.9862 8273\n",
"\n",
" accuracy 0.9865 16849\n",
" macro avg 0.9866 0.9864 0.9865 16849\n",
"weighted avg 0.9866 0.9865 0.9865 16849\n",
"\n",
"\n",
"Regression Metrics (non-zero values):\n",
"Out of range: 0 predictions\n",
"MAPE: 10.76%\n",
"Within ±10%: 75.03%\n",
"MAE: 0.05\n",
"RMSE: 0.07\n",
"\n",
"Final Combined Output Metrics:\n",
"Out of range: 0 predictions\n",
"MAPE: 7.87%\n",
"Within ±2%: 61.66%\n",
"Within ±5%: 75.67%\n",
"Within ±10%: 86.32%\n",
"Within ±20%: 91.11%\n",
"MAE: 0.03\n",
"RMSE: 0.06\n",
"221/221 [==============================] - 20s 92ms/step - loss: 0.0261 - classification_output_loss: 0.0137 - regression_output_loss: 0.0188 - final_output_loss: 0.0227 - val_loss: 0.0359 - val_classification_output_loss: 0.0278 - val_regression_output_loss: 0.0242 - val_final_output_loss: 0.0340\n",
"Epoch 101: early stopping\n",
"\n",
"Training completed successfully!\n",
"\n",
"Classification Metrics:\n",
"Accuracy: 98.65%\n",
"AUC-ROC: 0.9994\n",
"\n",
"Confusion Matrix:\n",
"[[8497 79]\n",
" [ 148 8125]]\n",
"\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" Zero 0.9829 0.9908 0.9868 8576\n",
" Non-Zero 0.9904 0.9821 0.9862 8273\n",
"\n",
" accuracy 0.9865 16849\n",
" macro avg 0.9866 0.9864 0.9865 16849\n",
"weighted avg 0.9866 0.9865 0.9865 16849\n",
"\n",
"\n",
"Regression Metrics (non-zero values):\n",
"Out of range: 0 predictions\n",
"MAPE: 10.76%\n",
"Within ±10%: 75.03%\n",
"MAE: 0.05\n",
"RMSE: 0.07\n",
"\n",
"Final Combined Output Metrics:\n",
"Out of range: 0 predictions\n",
"MAPE: 7.87%\n",
"Within ±2%: 61.66%\n",
"Within ±5%: 75.67%\n",
"Within ±10%: 86.32%\n",
"Within ±20%: 91.11%\n",
"MAE: 0.03\n",
"RMSE: 0.06\n"
]
}
],
"source": [
"#Model creation\n",
"print(\"\\n2. Creating model...\")\n",
"input_shape = (X_train_seq.shape[1], X_train_seq.shape[2])\n",
"\n",
"min_val = df['solarenergy'].min()\n",
"min_val_scaled = scaler_y.transform([[0]])[0][0]\n",
"\n",
"max_val = df['solarenergy'].max()\n",
"max_val_scaled = scaler_y.transform([[max_val]])[0][0]\n",
"\n",
"print(f\"\\Min dataset solar energy : {min_val} - Scaled Version : {min_val_scaled}\")\n",
"\n",
"print(f\"\\nMax dataset solar energy : {max_val} - Scaled Version : {max_val_scaled}\")\n",
"\n",
"increase_percentage = 8\n",
"\n",
"max_val = max_val * (1 + increase_percentage / 100)\n",
"max_val_scaled = max_val_scaled * (1 + increase_percentage / 100)\n",
"\n",
"print(f\"Max dataset solar energy increased by {increase_percentage}% : {max_val} - Scaled Version : {max_val_scaled}\")\n",
"\n",
"# Create the hybrid model\n",
"model = create_solarenergy_model(\n",
" input_shape=input_shape, \n",
" folder_name=folder_name, \n",
" min_output=min_val_scaled, \n",
" max_output=max_val_scaled\n",
")\n",
"\n",
"# Prepare binary targets for classification\n",
"y_train_binary = (y_train > 0).astype(float)\n",
"y_test_binary = (y_test > 0).astype(float)\n",
"\n",
"print(\"\\nClass distribution in training set:\")\n",
"print(f\"Zeros: {np.sum(y_train_binary == 0)} ({np.mean(y_train_binary == 0)*100:.2f}%)\")\n",
"print(f\"Non-zeros: {np.sum(y_train_binary == 1)} ({np.mean(y_train_binary == 1)*100:.2f}%)\")\n",
"\n",
"print(\"\\nClass distribution in test set:\")\n",
"print(f\"Zeros: {np.sum(y_test_binary == 0)} ({np.mean(y_test_binary == 0)*100:.2f}%)\")\n",
"print(f\"Non-zeros: {np.sum(y_test_binary == 1)} ({np.mean(y_test_binary == 1)*100:.2f}%)\")\n",
"\n",
"# Get the exact output names from the model\n",
"output_names = [output.name.split('/')[0] for output in model.outputs]\n",
"print(\"\\nModel output names:\", output_names)\n",
"\n",
"print(\"\\n4. Starting training...\")\n",
"history = train_hybrid_model(\n",
" model=model,\n",
" X_train=X_train_seq,\n",
" y_train=y_train,\n",
" X_test=X_test_seq,\n",
" y_test=y_test,\n",
" epochs=150,\n",
" batch_size=512,\n",
" folder_name=folder_name,\n",
" min_output=min_val_scaled,\n",
" max_output=max_val_scaled\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "958d78b99e8898d6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"5. Generating predictions...\n",
"527/527 [==============================] - 6s 10ms/step\n",
"\n",
"6. Evaluating model...\n",
"\n",
"Solar Energy Prediction Metrics:\n",
"\n",
"Absolute Metrics:\n",
"MAE: 0.03 kWh\n",
"RMSE: 0.07 kWh\n",
"R² Score: 0.995\n",
"MAPE: N/A (insufficient data)\n",
"\n",
"Accuracy Metrics:\n",
"Within ±5 kWh: 100.0%\n",
"Within ±10 kWh: 100.0%\n",
"Within ±20 kWh: 100.0%\n",
"\n",
"Level Accuracy:\n",
"Level Accuracy: 97.6%\n",
"\n",
"Confusion Matrix for Energy Levels:\n",
" Low Moderate Very Low\n",
"Low 3539 133 1\n",
"Moderate 26 2082 0\n",
"Very Low 247 0 10821\n",
"\n",
"Plot saved as: 2024-11-27_23-17_energy_analysis.png\n",
"\n",
"Error Statistics:\n",
"Mean error: -0.000\n",
"Error standard deviation: 0.068\n",
"Median error: 0.000\n",
"95th percentile absolute error: 0.137\n"
]
}
],
"source": [
"print(\"\\n5. Generating predictions...\")\n",
"predictions = model.predict(X_test_seq)\n",
"classification_pred, regression_pred, final_pred = predictions\n",
"\n",
"# Inverse transform per tornare ai valori originali\n",
"regression_pred_original = scaler_y.inverse_transform(regression_pred)\n",
"final_pred_original = scaler_y.inverse_transform(final_pred)\n",
"y_test_original = scaler_y.inverse_transform(y_test)\n",
"\n",
"print(\"\\n6. Evaluating model...\")\n",
"# Valutazione delle predizioni finali\n",
"metrics = evaluate_solarenergy_predictions(y_test_original, final_pred_original, folder_name=folder_name)\n",
"\n",
"# Create results dictionary con metriche aggiuntive per il modello ibrido\n",
"training_results = {\n",
" 'model_params': {\n",
" 'input_shape': input_shape,\n",
" 'n_features': len(features),\n",
" 'sequence_length': X_train_seq.shape[1]\n",
" },\n",
" 'training_params': {\n",
" 'batch_size': 192,\n",
" 'total_epochs': len(history.history['loss']),\n",
" 'best_epoch': np.argmin(history.history['val_final_output_loss']) + 1\n",
" },\n",
" 'performance_metrics': {\n",
" 'regression': {\n",
" 'final_loss': float(history.history['val_regression_output_loss'][-1]),\n",
" 'out_of_range_predictions': int(np.sum((regression_pred < 0) | (regression_pred > max_val_scaled)))\n",
" },\n",
" 'final_output': {\n",
" 'final_loss': float(history.history['val_final_output_loss'][-1]),\n",
" 'best_val_loss': float(min(history.history['val_final_output_loss'])),\n",
" 'out_of_range_predictions': int(np.sum((final_pred < 0) | (final_pred > max_val_scaled)))\n",
" }\n",
" }\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "5c05d1d03336b1e4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"7. Predicting missing data...\n",
"7122/7122 [==============================] - 73s 10ms/step\n",
"\n",
"8. Integrating predictions into original dataset...\n",
"\n",
"Prediction Integration Statistics:\n",
"Added 227879 predictions to dataset\n",
"Rows with solar energy after integration: 357615\n",
"\n",
"Filled Values Analysis:\n",
"Zero predictions (classification < 0.5): 117206\n",
"Non-zero predictions (classification >= 0.5): 110673\n",
"\n",
"Non-zero predictions statistics:\n",
"Mean: 1.10\n",
"Median: 0.93\n",
"Std: 0.95\n",
"\n",
"Prediction Statistics:\n",
"Total predictions added: 227879\n",
"\n",
"Classification Statistics:\n",
"Predicted zeros: 117206 (51.43%)\n",
"Predicted non-zeros: 110673 (48.57%)\n",
"Mean classification confidence: 0.4896\n",
"\n",
"Final Predictions Statistics:\n",
"Mean solar energy: 0.64\n",
"Min solar energy: 0.00\n",
"Max solar energy: 3.30\n",
"Zero predictions: 95673 (41.98%)\n",
"\n",
"Training completed successfully!\n"
]
}
],
"source": [
"print(\"\\n7. Predicting missing data...\")\n",
"to_predict_predictions = model.predict(X_to_predict_seq)\n",
"classification_pred, regression_pred, final_pred = to_predict_predictions\n",
"\n",
"# Clip solo le predizioni finali che useremo per l'integrazione\n",
"#final_pred = np.clip(final_pred, min_val_scaled, max_val_scaled)\n",
"final_pred_original = scaler_y.inverse_transform(final_pred)\n",
"\n",
"print(\"\\n8. Integrating predictions into original dataset...\")\n",
"df_updated = integrate_predictions(df.copy(), predictions=(classification_pred, regression_pred, final_pred_original))\n",
"\n",
"df_updated.to_parquet('../../sources/weather_data_solarenergy.parquet')\n",
"\n",
"# Add prediction statistics to training_results\n",
"training_results['prediction_stats'] = {\n",
" 'n_predictions_added': len(final_pred_original),\n",
" 'classification_stats': {\n",
" 'predicted_zeros': int(np.sum(classification_pred < 0.5)),\n",
" 'predicted_non_zeros': int(np.sum(classification_pred >= 0.5)),\n",
" 'mean_confidence': float(classification_pred.mean()),\n",
" },\n",
" 'regression_stats': {\n",
" 'mean_predicted_value': float(regression_pred.mean()),\n",
" 'min_predicted_value': float(regression_pred.min()),\n",
" 'max_predicted_value': float(regression_pred.max()),\n",
" },\n",
" 'final_predictions': {\n",
" 'mean_predicted_solarenergy': float(final_pred_original.mean()),\n",
" 'min_predicted_solarenergy': float(final_pred_original.min()),\n",
" 'max_predicted_solarenergy': float(final_pred_original.max()),\n",
" 'zero_predictions': int(np.sum(final_pred_original == 0)),\n",
" 'non_zero_predictions': int(np.sum(final_pred_original > 0)),\n",
" }\n",
"}\n",
"\n",
"print(\"\\nPrediction Statistics:\")\n",
"print(f\"Total predictions added: {training_results['prediction_stats']['n_predictions_added']}\")\n",
"print(\"\\nClassification Statistics:\")\n",
"print(f\"Predicted zeros: {training_results['prediction_stats']['classification_stats']['predicted_zeros']} \"\n",
" f\"({training_results['prediction_stats']['classification_stats']['predicted_zeros']/len(final_pred_original)*100:.2f}%)\")\n",
"print(f\"Predicted non-zeros: {training_results['prediction_stats']['classification_stats']['predicted_non_zeros']} \"\n",
" f\"({training_results['prediction_stats']['classification_stats']['predicted_non_zeros']/len(final_pred_original)*100:.2f}%)\")\n",
"print(f\"Mean classification confidence: {training_results['prediction_stats']['classification_stats']['mean_confidence']:.4f}\")\n",
"\n",
"print(\"\\nFinal Predictions Statistics:\")\n",
"print(f\"Mean solar energy: {training_results['prediction_stats']['final_predictions']['mean_predicted_solarenergy']:.2f}\")\n",
"print(f\"Min solar energy: {training_results['prediction_stats']['final_predictions']['min_predicted_solarenergy']:.2f}\")\n",
"print(f\"Max solar energy: {training_results['prediction_stats']['final_predictions']['max_predicted_solarenergy']:.2f}\")\n",
"print(f\"Zero predictions: {training_results['prediction_stats']['final_predictions']['zero_predictions']} \"\n",
" f\"({training_results['prediction_stats']['final_predictions']['zero_predictions']/len(final_pred_original)*100:.2f}%)\")\n",
"\n",
"print(\"\\nTraining completed successfully!\")\n",
"\n",
"tf.keras.backend.clear_session()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "ef29b3ecdf12c6db",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAB8YAAASlCAYAAADaj7M5AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzde/zX8/0//tu7w/tdUu+Eypuk0eR8ZjmGqIRyaEOTQ9PsmzlkbI0Z0ZpDyLE1o7FiTos5RKJlMlM0h2FYEzrZ0FuhUq/fH369Pt46qFTverteL5fnZZ6Px/35fN5fr/f783F5uL2fz2dJoVAoBAAAAAAAAABqqFrV3QAAAAAAAAAArEqCcQAAAAAAAABqNME4AAAAAAAAADWaYBwAAAAAAACAGk0wDgAAAAAAAECNJhgHAAAAAAAAoEYTjAMAAAAAAABQownGAQAAAAAAAKjRBOMAAAAAAAAA1GiCcQDWWhdeeGFKSkpWy7XatWuXdu3aFffHjBmTkpKS3H333avl+gsNHTo0JSUl+c9//rNar7syfPk7/M9//pOSkpIMHTp0tfdy4oknZrPNNlvt1wUAAGDNUp1r04WslwFg9RCMA7BGWBj4Ltzq1auXioqKdOjQIddcc00++uijlXKdKVOm5MILL8zEiRNXyvlYPf7zn//kpJNOyuabb5569eqlefPm2XffffPLX/6yulv7Su3atavyu/3FrU2bNtXdHgAAwErx5XV9SUlJmjZtmv333z8PP/zwau9n4R+0L9zq1q2bb33rW+nRo0f+/e9/r5RrjBs3LhdeeGE+/PDDlXK+FWG9DADLrk51NwAAX9SvX7+0atUq8+bNy7Rp0zJmzJiceeaZufLKK3P//fdn++23L9aef/75+dnPfrZc558yZUouuuiibLbZZtlxxx2X+bhHH310ua6zqhx//PE55phjUlZWVt2tfG0tW7bMJ598krp16y617o033shuu+2W+vXr5+STT85mm22WqVOn5rnnnsull16aiy66aDV1vOI22WSTDBgwYJHx8vLyaugGAABg1Vm4ri8UCpk+fXqGDh2aQw45JH/+859z6KGHrvZ+Tj/99Oy2226ZN29ennvuuQwZMiQPPvhgXnzxxVRUVHytc48bNy4XXXRRTjzxxDRu3HjlNBzr5cR6GYBVQzAOwBqlU6dO2XXXXYv7ffv2zeOPP55DDz00hx9+eF555ZXUr18/SVKnTp3UqbNq/1X28ccfZ5111klpaekqvc6yql27dmrXrl3dbawUC58M8FWuuuqqzJo1KxMnTkzLli2rzM2YMWNVtbfMFixYkLlz5y71s5SXl+f73//+auxqyRb+TgMAAKwKX17X9+zZM82aNcvtt99eLcH4Pvvsk6OPPjpJctJJJ+Xb3/52Tj/99Pz+979P3759V3s/y8J6uXpYLwPUfB6lDsAa74ADDsgvfvGLvPXWW/nDH/5QHF/cO8ZHjRqVvffeO40bN866666bLbfcMj//+c+TfP4Ytd122y3J54vhhY/nWvjOrnbt2mXbbbfNhAkTsu+++2adddYpHvvl930tNH/+/Pz85z9P8+bN06BBgxx++OF5++23q9RsttlmOfHEExc59svn3GyzzZb4CLExY8YkWfI7xm+44YZss802KSsrS0VFRXr37r3Io9wWfr5//vOf2X///bPOOutk4403zmWXXbZIb3PmzMkvf/nLbLHFFikrK0uLFi1y7rnnZs6cOYvULs6QIUOy+eabp379+tl9993z5JNPLlKzrO9Me/PNN7PJJpsssshPkqZNmy4ytizfxeJcccUV2XPPPbP++uunfv362WWXXRb7DvmSkpKcdtppGTZsWPE6I0eO/Mrzf5WFv89vvPFG8W6D8vLynHTSSfn4448Xqf/DH/6QXXbZJfXr10+TJk1yzDHHLPK7t7Tf6f/97385/vjj06hRozRu3DgnnHBC/vGPf1T5mdxyyy0pKSnJ888/v8j1f/WrX6V27dp59913v/ZnBwAAaq7GjRunfv36i/xh++zZs3P22WenRYsWKSsry5ZbbpkrrrgihUIhSfLJJ5+kTZs2adOmTT755JPice+//3422mij7Lnnnpk/f/5y93PAAQckSSZNmrTUuscffzz77LNPGjRokMaNG6dLly555ZVXivMXXnhhzjnnnCRJq1atiuv3L6/Xv8x6eflZLwOwsgjGAVgrHH/88UmW/kjzl19+OYceemjmzJmTfv36ZeDAgTn88MPz1FNPJUm22mqr9OvXL0nSq1ev3Hbbbbntttuy7777Fs/xv//9L506dcqOO+6Yq6++Ovvvv/9S++rfv38efPDB/PSnP83pp5+eUaNGpX379lUW7cvq6quvLva0cNt5551Tq1atrL/++ks87sILL0zv3r1TUVGRgQMH5qijjspvfvObHHzwwZk3b16V2g8++CAdO3bMDjvskIEDB6ZNmzb56U9/WuV9bwsWLMjhhx+eK664IocddliuvfbadO3aNVdddVW+973vfeXn+N3vfpcf/vCHad68eS677LLstddei/2DgWXVsmXLvP3223n88ce/snZ5vosvGzRoUHbaaaf069cvv/rVr1KnTp1069YtDz744CK1jz/+eM4666x873vfy6BBg7LZZpst9dzz58/Pf//730W22bNnL1L73e9+Nx999FEGDBiQ7373uxk6dOgij7/r379/evTokdatW+fKK6/MmWeemdGjR2ffffdd5D9qLO53esGCBTnssMNy++2354QTTkj//v0zderUnHDCCVWOPfroo1O/fv0MGzZskT6HDRuWdu3aZeONN17qZwcAAL5ZZs6cmf/+979577338vLLL+dHP/pRZs2aVeWu4EKhkMMPPzxXXXVVOnbsmCuvvDJbbrllzjnnnPTp0ydJUr9+/fz+97/PG2+8kfPOO694bO/evTNz5swMHTp0hZ6o9uabbybJUtfZjz32WDp06JAZM2bkwgsvTJ8+fTJu3LjstddexeD7yCOPzLHHHpvk8zu3F67jN9xwwyWe13p5UdbLAKxWBQBYA9xyyy2FJIVnn312iTXl5eWFnXbaqbj/y1/+svDFf5VdddVVhSSF9957b4nnePbZZwtJCrfccssic/vtt18hSWHw4MGLndtvv/2K+0888UQhSWHjjTcuVFZWFsfvvPPOQpLCoEGDimMtW7YsnHDCCV95zi9beK5+/foVxxZ+T5MmTSoUCoXCjBkzCqWlpYWDDz64MH/+/GLdddddV0hSuPnmmxf5fLfeemtxbM6cOYXmzZsXjjrqqOLYbbfdVqhVq1bhySefrNLP4MGDC0kKTz311BJ7njt3bqFp06aFHXfcsTBnzpzi+JAhQwpJqnzeSZMmLfFn8UUvvfRSoX79+oUkhR133LFwxhlnFEaMGFGYPXt2lbrl+S5OOOGEQsuWLasc//HHHy/yWbbddtvCAQccUGU8SaFWrVqFl19+eal9L7Twe1/c9sMf/rBYt/D3+eSTT65y/BFHHFFYf/31i/v/+c9/CrVr1y7079+/St2LL75YqFOnTpXxJf1O33PPPYUkhauvvro4Nn/+/MIBBxywyM/k2GOPLVRUVFT5Tp977rll+tkBAADfHAvXq1/eysrKCkOHDq1SO2LEiEKSwiWXXFJl/Oijjy6UlJQU3njjjeJY3759C7Vq1SqMHTu2cNdddy2yllmShev2m2++ufDee+8VpkyZUnjwwQcLm222WaGkpKT43x8WtzbdcccdC02bNi3873//K4794x//KNSqVavQo0eP4tjll19eZY2+NNbLi7JeBmB1c8c4AGuNddddNx999NES5xs3bpwkue+++7JgwYIVukZZWVlOOumkZa7v0aNHGjZsWNw/+uijs9FGG+Whhx5aoesv9M9//jMnn3xyunTpkvPPP3+JdY899ljmzp2bM888M7Vq/d+/1k855ZQ0atRokb/eXnfddav8lX5paWl23333/Pvf/y6O3XXXXdlqq63Spk2bKn+tvfBxc0888cQS+xk/fnxmzJiRU089tcp72U888cSUl5cv+xfwBdtss00mTpyY73//+/nPf/6TQYMGpWvXrmnWrFl++9vfrvB38WUL312ffH5n/cyZM7PPPvvkueeeW6R2v/32y9Zbb73Mn2GzzTbLqFGjFtnOPPPMRWpPPfXUKvv77LNP/ve//6WysjJJcu+992bBggX57ne/W+Xn07x587Ru3XqRn8/ifqdHjhyZunXr5pRTTimO1apVK717916knx49emTKlClVzjts2LDUr18/Rx111DJ/BwAAwDfD9ddfX1zz/OEPf8j++++fH/zgB7n33nuLNQ899FBq166d008/vcqxZ599dgqFQpWnml144YXZZpttcsIJJ+T//b//l/3222+R45bm5JNPzoYbbpiKiop07tw5s2fPzu9///sq70H/oqlTp2bixIk58cQT06RJk+L49ttvn4MOOmiF1/vWy4tnvQzA6lTnq0sAYM0wa9asxb4ja6Hvfe97uemmm/KDH/wgP/vZz3LggQfmyCOPzNFHH11l4bc0G2+8cZUF6ldp3bp1lf2SkpJsscUWX/lOsaWprKzMkUcemY033ji33nrrIu9R/6K33norSbLllltWGS8tLc23vvWt4vxCm2yyySLnW2+99fLCCy8U919//fW88sorS3z824wZM76yny9/L3Xr1s23vvWtJR73Vb797W/ntttuy/z58/PPf/4zDzzwQC677LL06tUrrVq1Svv27Zf7u/iyBx54IJdcckkmTpxY5V3qi/v+W7VqtVz9N2jQIO3bt1+m2k033bTK/nrrrZfk8//40KhRo7z++uspFAqLfMcL1a1bt8r+4n6n33rrrWy00UZZZ511qoxvscUWi5zvoIMOykYbbZRhw4blwAMPzIIFC3L77benS5cuVf4oBAAAIEl23333KqHzsccem5122imnnXZaDj300JSWluatt95KRUXFImuKrbbaKkmqrN9KS0tz8803Z7fddku9evWK73ZeVhdccEH22Wef1K5dOxtssEG22mqrRd53/kVLWlsu7O+RRx7J7Nmz06BBg2Xu4YvntV6uynoZgNVJMA7AWuGdd97JzJkzF7sQWah+/foZO3ZsnnjiiTz44IMZOXJk/vjHP+aAAw7Io48+ukzvHvviX0GvLEtasM+fP3+xPZ144omZMmVK/v73v6dRo0YrtZclfQeFQqH4zwsWLMh2222XK6+8crG1LVq0WKk9LY/atWtnu+22y3bbbZe2bdtm//33z7Bhw5Z5Eb0kTz75ZA4//PDsu+++ueGGG7LRRhulbt26ueWWWzJ8+PBF6lfF78lCX/UzWrBgQUpKSvLwww8vtnbdddetsv91e61du3aOO+64/Pa3v80NN9yQp556KlOmTKny5AEAAIAlqVWrVvbff/8MGjQor7/+erbZZpvlPscjjzySJPn000/z+uuvL1f4ut12233tNePawHrZehmAryYYB2CtcNtttyVJOnTosNS6WrVq5cADD8yBBx6YK6+8Mr/61a9y3nnn5Yknnkj79u2X66/Kl8Xrr79eZb9QKOSNN97I9ttvXxxbb7318uGHHy5y7FtvvbXIX4X/+te/zogRI3LvvfemTZs2X3n9li1bJklee+21KueaO3duJk2atEIL4M033zz/+Mc/cuCBBy7397Wwn9dff7346PUkmTdvXiZNmpQddthhuftZkoV3IEydOrXKtVfku7jnnntSr169PPLIIykrKyuO33LLLSut35Vl8803T6FQSKtWrfLtb397hc7RsmXLPPHEE/n444+r/BX8G2+8sdj6Hj16ZODAgfnzn/+chx9+OBtuuOFX/t8iAADAQp999lmSz58El3y+Jnnsscfy0UcfVbmz9tVXXy3OL/TCCy+kX79+OemkkzJx4sT84Ac/yIsvvrjCjx//Kl9cW37Zq6++mg022KB4t/jyrJmtl1c962UAvop3jAOwxnv88cdz8cUXp1WrVunevfsS695///1FxnbcccckKT7qa+HidXFB9Yq49dZbq7z3/O67787UqVPTqVOn4tjmm2+ev/3tb5k7d25x7IEHHsjbb79d5VyPPfZYzj///Jx33nnp2rXrMl2/ffv2KS0tzTXXXFPlru/f/e53mTlzZjp37rzcn+m73/1u3n333SrvI1vok08+yezZs5d47K677poNN9wwgwcPrvJ5hw4dusLf+ZNPPpl58+YtMr7wvW4LHwX3db6L2rVrp6SkJPPnzy+O/ec//8mIESNWqOdV6cgjj0zt2rVz0UUXVfmcyed/mPG///3vK8/RoUOHzJs3r8rPeMGCBbn++usXW7/99ttn++23z0033ZR77rknxxxzzFIfPQgAALDQvHnz8uijj6a0tLT4qPRDDjkk8+fPz3XXXVel9qqrrkpJSUlxTT1v3ryceOKJqaioyKBBgzJ06NBMnz49Z5111irrd6ONNsqOO+6Y3//+91XWsS+99FIeffTRHHLIIcWx5flvDNbLq571MgBfxf+HBmCN8vDDD+fVV1/NZ599lunTp+fxxx/PqFGj0rJly9x///2pV6/eEo/t169fxo4dm86dO6dly5aZMWNGbrjhhmyyySbZe++9k3weUjdu3DiDBw9Ow4YN06BBg+yxxx7L/Q6shZo0aZK99947J510UqZPn56rr746W2yxRU455ZRizQ9+8IPcfffd6dixY7773e/mzTffzB/+8IdsvvnmVc517LHHZsMNN0zr1q3zhz/8ocrcQQcdlGbNmi1y/Q033DB9+/bNRRddlI4dO+bwww/Pa6+9lhtuuCG77bbbCj2+6/jjj8+dd96ZU089NU888UT22muvzJ8/P6+++mruvPPOPPLII1XeF/dFdevWzSWXXJIf/vCHOeCAA/K9730vkyZNyi233LLC70y79NJLM2HChBx55JHFO/Gfe+653HrrrWnSpEnOPPPMr/1ddO7cOVdeeWU6duyY4447LjNmzMj111+fLbbYosr711fUzJkzF/mZLrS8P6PNN988l1xySfr27Zv//Oc/6dq1axo2bJhJkyblT3/6U3r16pWf/OQnSz1H165ds/vuu+fss8/OG2+8kTZt2uT+++8v/nHJ4u566NGjR/G8HgsHAAAsycJ1fZLMmDEjw4cPz+uvv56f/exnxdeFHXbYYdl///1z3nnn5T//+U922GGHPProo7nvvvty5plnFtfLC99rPXr06DRs2DDbb799Lrjggpx//vk5+uijq4TUK9Pll1+eTp06pW3btunZs2c++eSTXHvttSkvL8+FF15YrNtll12SJOedd16OOeaY1K1bN4cddthi3z9uvbx41ssArFYFAFgD3HLLLYUkxa20tLTQvHnzwkEHHVQYNGhQobKycpFjfvnLXxa++K+y0aNHF7p06VKoqKgolJaWFioqKgrHHnts4V//+leV4+67777C1ltvXahTp04hSeGWW24pFAqFwn777VfYZpttFtvffvvtV9hvv/2K+0888UQhSeH2228v9O3bt9C0adNC/fr1C507dy689dZbixw/cODAwsYbb1woKysr7LXXXoXx48cvcs4vfv4vb0888USV72nSpElVzn/dddcV2rRpU6hbt26hWbNmhR/96EeFDz74YJHPsLjPd8IJJxRatmxZZWzu3LmFSy+9tLDNNtsUysrKCuutt15hl112KVx00UWFmTNnLvY7+qIbbrih0KpVq0JZWVlh1113LYwdO3aRzztp0qQq3/+SPPXUU4XevXsXtt1220J5eXmhbt26hU033bRw4oknFt58881F6pflu1jcZ/7d735XaN26daGsrKzQpk2bwi233LLI71ih8PnPqXfv3l/5HSy03377LfVnu9DCa7333ntVjl/Sz/yee+4p7L333oUGDRoUGjRoUGjTpk2hd+/ehddee63KtZf0O/3ee+8VjjvuuELDhg0L5eXlhRNPPLHw1FNPFZIU7rjjjkXqp06dWqhdu3bh29/+9jJ/dgAA4Jvjy+v6JIV69eoVdtxxx8KNN95YWLBgQZX6jz76qHDWWWcVKioqCnXr1i20bt26cPnllxfrJkyYUKhTp07hxz/+cZXjPvvss8Juu+1WqKioWGSt90UL1+133XXXUvte0tr0scceK+y1116F+vXrFxo1alQ47LDDCv/85z8XOf7iiy8ubLzxxoVatWotdu32ZdbL/8d6GYDVraRQ+NIzRQAA+EYaMWJEjjjiiPz1r3/NXnvtVWXuv//9bzbaaKNccMEF+cUvflFNHQIAAMDqZ70MUDN4xzgAwDfQJ598UmV//vz5ufbaa9OoUaPsvPPOi9QPHTo08+fPz/HHH7+6WgQAAIDVznoZoObyjnEAgG+gH//4x/nkk0/Stm3bzJkzJ/fee2/GjRuXX/3qV6lfv36x7vHHH88///nP9O/fP127ds1mm21WfU0DAADAKma9DFBzeZQ6AMA30PDhwzNw4MC88cYb+fTTT7PFFlvkRz/6UU477bQqde3atcu4ceOy11575Q9/+EM23njjauoYAAAAVj3rZYCaSzAOAAAAAAAAQI3mHeMAAAAAAAAA1GjeMb4aLViwIFOmTEnDhg1TUlJS3e0AAACwihQKhXz00UepqKhIrVr+Jr06WIMDAADUfMuz/haMr0ZTpkxJixYtqrsNAAAAVpO33347m2yySXW38Y1kDQ4AAPDNsSzrb8H4atSwYcMkn/9gGjVqVM3dAAAAsKpUVlamRYsWxXUgq581OAAAQM23POtvwfhqtPDRbY0aNbIoBwAA+AbwCO/qYw0OAADwzbEs628vOgMAAAAAAACgRhOMAwAAAAAAAFCjCcYBAAAAAAAAqNEE4wAAAAAAAADUaIJxAAAAAAAAAGo0wTgAAAAAAAAANZpgHAAAAAAAAIAaTTAOAAAAAAAAQI0mGAcAAAAAAACgRhOMAwAAAAAAAFCjCcYBAAAAAAAAqNEE4wAAAAAAAADUaIJxAAAAAAAAAGo0wTgAAAAAAAAANZpgHAAAAAAAAIAaTTAOAAAAAAAAQI1Wp7obAAAAAAAAVtzcuXNz3333ZcqUKamoqEiXLl1SWlpa3W0BwBrFHeMAAADAavPrX/86JSUlOfPMM5dad9ddd6VNmzapV69etttuuzz00EOrp0EAWMsMHjw4nTp1yvXXX58//elPuf7669OpU6cMHjy4ulsDgDWKYBwAAABYLZ599tn85je/yfbbb7/UunHjxuXYY49Nz5498/zzz6dr167p2rVrXnrppdXUKQCsHQYPHpw77rgjjRo1yk9+8pPcc889+clPfpJGjRrljjvuEI4DwBcIxgEAAIBVbtasWenevXt++9vfZr311ltq7aBBg9KxY8ecc8452WqrrXLxxRdn5513znXXXbeaugWANd/cuXNz1113Zb311stdd92VQw89NOuvv34OPfTQKuNz586t7lYBYI0gGAcAAABWud69e6dz585p3779V9Y+/fTTi9R16NAhTz/99BKPmTNnTiorK6tsAFCT3XfffZk/f3569uyZOnXqVJmrU6dOTj755MyfPz/33XdfNXUIAGuWOl9dAgAAALDi7rjjjjz33HN59tlnl6l+2rRpadasWZWxZs2aZdq0aUs8ZsCAAbnooou+Vp8AsDaZMmVKkqRt27aLnV84vrAOAL7pBOMsos/Pzs97H3y02LkN12uYK399yWruCAAAgLXV22+/nTPOOCOjRo1KvXr1Vtl1+vbtmz59+hT3Kysr06JFi1V2PQCobhUVFUk+f9LKoYceusj8wietLKwDgG86wTiLeO+Dj7Lz0b0XO/fc3dev5m4AAABYm02YMCEzZszIzjvvXBybP39+xo4dm+uuuy5z5sxJ7dq1qxzTvHnzTJ8+vcrY9OnT07x58yVep6ysLGVlZSu3eQBYg3Xp0iWDBw/O7373u3Ts2LHK49Q/++yz3Hzzzaldu3a6dOlSjV0CwJrDO8YBAACAVebAAw/Miy++mIkTJxa3XXfdNd27d8/EiRMXCcWTzx/9Onr06Cpjo0aNWuKjYgHgm6i0tDTdunXLBx98kG7duuXPf/5z/vvf/+bPf/5zlfHS0tLqbhUA1gjuGAcAAABWmYYNG2bbbbetMtagQYOsv/76xfEePXpk4403zoABA5IkZ5xxRvbbb78MHDgwnTt3zh133JHx48dnyJAhq71/AFiTnXrqqUmSu+66KwMHDiyO165dO8ccc0xxHgAQjAMAAADVbPLkyalV6/8earfnnntm+PDhOf/88/Pzn/88rVu3zogRIxYJ2AGAz8Pxk08+Offdd1+mTJmSioqKdOnSxZ3iAPAlgnEAAABgtRozZsxS95OkW7du6dat2+ppCADWcvPnz8+7776bd955J4VCIfPnz6/ulgBgjSMYBwAAAACAtdR5552Xp556qrg/fvz4jBgxInvttVf69+9fjZ0BwJql1leXAAAAAAAAa5qFoXjdunVz3HHH5Q9/+EOOO+641K1bN0899VTOO++86m4RANYY7hgHAAAAAIC1zCeffFIMxR988MHiO8V79eqVE088MZ07d85TTz2VTz75JPXr16/mbgGg+rljHAAAAAAA1jK/+c1vkiTdunUrhuILlZaW5uijj65SBwDfdIJxAAAAAABYy7zzzjtJkkMOOWSx8wvHF9YBwDedYBwAAAAAANYym2yySZLkoYceWuz8wvGFdQDwTScYBwAAAACAtcwPf/jDJMldd92VuXPnVpmbO3du7r777ip1APBNJxgHAAAAAIC1TP369bPXXntl3rx56dy5c37zm9/k7bffzm9+85t07tw58+bNy1577ZX69etXd6sAsEYQjAMAAAAAwFqof//+xXD89ttvz/HHH5/bb7+9GIr379+/ulsEgDVGnepuAAAAAAAAWDH9+/fPJ598kt/85jd55513sskmm+SHP/yhO8UB4EsE4wAAAAAAsBarX79+zjzzzOpuAwDWaIJxAAAAAABYi82aNSsDBgzIlClTUlFRkb59+2bdddet7rYAYI0iGAcAAAAAgLXUqaeemldffbW4P2nSpBx66KFp06ZNBg8eXI2dAcCapVZ1NwAAAAAAACy/haF4SUlJDj744Nx00005+OCDU1JSkldffTWnnnpqdbcIAGsMd4wDAAAAAMBaZtasWcVQ/OGHH069evWSJD//+c/Tp0+fdOrUKa+++mpmzZrlseoAEHeMAwAAAADAWmfAgAFJkoMOOqgYii9Ur169tG/fvkodAHzTCcYBAAAAAGAtM2XKlCTJd7/73cXOd+vWrUodAHzTCcYBAAAAAGAtU1FRkSS58847Fzt/1113VakDgG+6ag3Gx44dm8MOOywVFRUpKSnJiBEjFql55ZVXcvjhh6e8vDwNGjTIbrvtlsmTJxfnP/300/Tu3Tvrr79+1l133Rx11FGZPn16lXNMnjw5nTt3zjrrrJOmTZvmnHPOyWeffValZsyYMdl5551TVlaWLbbYIkOHDl2kl+uvvz6bbbZZ6tWrlz322CN///vfV8r3AAAAAAAAy6Nv375JklGjRuXTTz+tMvfpp5/mscceq1IHAN901RqMz549OzvssEOuv/76xc6/+eab2XvvvdOmTZuMGTMmL7zwQn7xi19UeV/KWWedlT//+c+566678pe//CVTpkzJkUceWZyfP39+OnfunLlz52bcuHH5/e9/n6FDh+aCCy4o1kyaNCmdO3fO/vvvn4kTJ+bMM8/MD37wgzzyyCPFmj/+8Y/p06dPfvnLX+a5557LDjvskA4dOmTGjBmr4JsBAAAAAIAlW3fdddOmTZsUCoV06tQp/fv3z7/+9a/0798/nTp1SqFQSJs2bbLuuutWd6sAsEYoKRQKhepuIklKSkrypz/9KV27di2OHXPMMalbt25uu+22xR4zc+bMbLjhhhk+fHiOPvroJMmrr76arbbaKk8//XS+853v5OGHH86hhx6aKVOmpFmzZkmSwYMH56c//Wnee++9lJaW5qc//WkefPDBvPTSS1Wu/eGHH2bkyJFJkj322CO77bZbrrvuuiTJggUL0qJFi/z4xz/Oz372s8X2N2fOnMyZM6e4X1lZmRYtWmTmzJlp1KjRin9Zq9jxPzwjOx/de7Fzz919fW77zaDV3BEAAMDapbKyMuXl5Wv8+q8m8zMA4Jvi1FNPzauvvrrIeJs2bTJ48OBq6AgAVp/lWfutse8YX7BgQR588MF8+9vfTocOHdK0adPsscceVR63PmHChMybNy/t27cvjrVp0yabbrppnn766STJ008/ne22264YiidJhw4dUllZmZdffrlY88VzLKxZeI65c+dmwoQJVWpq1aqV9u3bF2sWZ8CAASkvLy9uLVq0WPEvBAAAAAAAvmTw4MF54IEHstdee6VVq1bZa6+98sADDwjFAeBL1thgfMaMGZk1a1Z+/etfp2PHjnn00UdzxBFH5Mgjj8xf/vKXJMm0adNSWlqaxo0bVzm2WbNmmTZtWrHmi6H4wvmFc0urqayszCeffJL//ve/mT9//mJrFp5jcfr27ZuZM2cWt7fffnv5vwgAAAAAAFiKddddN/37988tt9yS/v37e3w6ACxGnepuYEkWLFiQJOnSpUvOOuusJMmOO+6YcePGZfDgwdlvv/2qs71lUlZWlrKysupuAwAAAACAGmzmzJk577zzMn369DRr1iz9+/dPeXl5dbcFAGuUNTYY32CDDVKnTp1svfXWVca32mqr/PWvf02SNG/ePHPnzs2HH35Y5a7x6dOnp3nz5sWav//971XOMX369OLcwv9dOPbFmkaNGqV+/fqpXbt2ateuvdiahecAAAAAAIDVrXv37nn33XeL+++99166dOmSjTfeOMOGDavGzgBgzbLGPkq9tLQ0u+22W1577bUq4//617/SsmXLJMkuu+ySunXrZvTo0cX51157LZMnT07btm2TJG3bts2LL76YGTNmFGtGjRqVRo0aFUP3tm3bVjnHwpqF5ygtLc0uu+xSpWbBggUZPXp0sQYAAAAAAFanL4biu+++e6677rrsvvvuSZJ333033bt3r872AGCNUq13jM+aNStvvPFGcX/SpEmZOHFimjRpkk033TTnnHNOvve972XffffN/vvvn5EjR+bPf/5zxowZkyQpLy9Pz54906dPnzRp0iSNGjXKj3/847Rt2zbf+c53kiQHH3xwtt566xx//PG57LLLMm3atJx//vnp3bt38THnp556aq677rqce+65Ofnkk/P444/nzjvvzIMPPljsrU+fPjnhhBOy6667Zvfdd8/VV1+d2bNn56STTlp9XxgAAAAAAOTzx6cvDMUfeuihrLPOOkmSyy67LB9//HEOOeSQvPvuu5k5c6bHqgNAqvmO8fHjx2ennXbKTjvtlOTz8HmnnXbKBRdckCQ54ogjMnjw4Fx22WXZbrvtctNNN+Wee+7J3nvvXTzHVVddlUMPPTRHHXVU9t133zRv3jz33ntvcb527dp54IEHUrt27bRt2zbf//7306NHj/Tr169Y06pVqzz44IMZNWpUdthhhwwcODA33XRTOnToUKz53ve+lyuuuCIXXHBBdtxxx0ycODEjR45Ms2bNVvXXBAAAAAAAVZx33nlJPr9TfGEovtA666yT3XbbrUodAHzTlRQKhUJ1N/FNUVlZmfLy8sycOTONGjWq7naW6PgfnpGdj+692Lnn7r4+t/1m0GruCAAAYO2ytqz/ajI/AwBqum7duuW9997Lddddl2233XaR+RdeeCGnn356Ntxww9x1113V0CEArHrLs/ZbY98xDgAAAAAALN7Cp5neeuuti52/7bbbqtQBwDedYBwAAAAAANYy/fv3T5L8/e9/z8cff1xl7uOPP86zzz5bpQ4AvunqVHcDAAAAAADA8ikvL8/GG2+cd999N4ccckh22223HH/88bntttuKofjGG2+c8vLyau4UANYMgnEAAAAAAFgLDRs2LN27d8+7776bZ599thiIJ5+H4sOGDavG7gBgzSIYBwAAAACAtdSwYcMyc+bMnHfeeZk+fXqaNWuW/v37u1McAL7EO8YBAAAAAGAt9pe//CUvvfRS3nvvvbz00kv5y1/+Ut0tAcAaRzAOAAAAAABrqXbt2uXKK6+sMnbllVemXbt21dMQAKyhBOMAAAAAALAW+nL4vckmmyx1HgC+ybxjHAAAAAAA1jL3339/8Z/PP//8tG/fvrj/2GOP5ZJLLinWHX744au9PwBY07hjHAAAAAAA1jJffHz6F0PxL+9/+THrAPBNJRgHAAAAAIC11Jcfn75Qs2bNVnMnALBmE4wDAAAAAMBa6p133lns+PTp01dzJwCwZhOMAwAAAADAWqZPnz7Ff37ssceq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zk+bNi1NmzatMlanTp00adIk06ZNK9Y0a9asSs3C/a+q+eL8F49bXM3iDBgwIOXl5cWtRYsWS/28AAAAAAAAAKx8a2wwPmHChAwaNChDhw5NSUlJdbezQvr27ZuZM2cWt7fffru6WwIAAAAAAAD4xlljg/Enn3wyM2bMyKabbpo6deqkTp06eeutt3L22Wdns802S5I0b948M2bMqHLcZ599lvfffz/Nmzcv1kyfPr1KzcL9r6r54vwXj1tczeKUlZWlUaNGVTYAAAAAAAAAVq81Nhg//vjj88ILL2TixInFraKiIuecc04eeeSRJEnbtm3z4YcfZsKECcXjHn/88SxYsCB77LFHsWbs2LGZN29esWbUqFHZcssts9566xVrRo8eXeX6o0aNStu2bZMkrVq1SvPmzavUVFZW5plnninWAAAAAAAAALBmqlOdF581a1beeOON4v6kSZMyceLENGnSJJtuumnWX3/9KvV169ZN8+bNs+WWWyZJttpqq3Ts2DGnnHJKBg8enHnz5uW0007LMccck4qKiiTJcccdl4suuig9e/bMT3/607z00ksZNGhQrrrqquJ5zzjjjOy3334ZOHBgOnfunDvuuCPjx4/PkCFDkiQlJSU588wzc8kll6R169Zp1apVfvGLX6SioiJdu3Zdxd8SAAAAAAAAAF9HtQbj48ePz/7771/c79OnT5LkhBNOyNChQ5fpHMOGDctpp52WAw88MLVq1cpRRx2Va665pjhfXl6eRx99NL17984uu+ySDTbYIBdccEF69epVrNlzzz0zfPjwnH/++fn5z3+e1q1bZ8SIEdl2222LNeeee25mz56dXr165cMPP8zee++dkSNHpl69el/zWwAAAAAAAABgVSopFAqF6m7im6KysjLl5eWZOXPmGv2+8eN/eEZ2Prr3Yueeu/v63PabQau5IwAAgLXL2rL+q8n8DACo6dq1a7fMtWPGjFllfQBAdVqetd8a+45xAAAAAAAAAFgZBOMAAAAAAAAA1GiCcQAAAAAAAABqNME4AAAAAAAAADWaYBwAAAAAAACAGk0wDgAAAAAAAECNJhgHAAAAAAAAoEYTjAMAAAAAAABQownGAQAAAAAAAKjRBOMAAAAAAAAA1GiCcQAAAAAAAABqNME4AAAAAAAAADWaYBwAAAAAAACAGk0wDgAAAAAAAECNJhgHAAAAAAAAoEYTjAMAAAAAAABQownGAQAAAAAAAKjRBOMAAAAAAAAA1GiCcQAAAAAAAABqNME4AAAAsMrceOON2X777dOoUaM0atQobdu2zcMPP7zUY+666660adMm9erVy3bbbZeHHnpoNXULAABATSUYBwAAAFaZTTbZJL/+9a8zYcKEjB8/PgcccEC6dOmSl19+ebH148aNy7HHHpuePXvm+eefT9euXdO1a9e89NJLq7lzAAAAahLBOAAAALDKHHbYYTnkkEPSunXrfPvb307//v2z7rrr5m9/+9ti6wcNGpSOHTvmnHPOyVZbbZWLL744O++8c6677rrV3DkAAAA1iWAcAAAAWC3mz5+fO+64I7Nnz07btm0XW/P000+nffv2VcY6dOiQp59+eqnnnjNnTiorK6tsAAAAsJBgHAAAAFilXnzxxay77ropKyvLqaeemj/96U/ZeuutF1s7bdq0NGvWrMpYs2bNMm3atKVeY8CAASkvLy9uLVq0WGn9AwAAsParU90NAAAAADXblltumYkTJ2bmzJm5++67c8IJJ+Qvf/nLEsPxFdG3b9/06dOnuF9ZWSkcB5bJp59+msmTJ1d3G7BK/etf/6ruFmC5bbrppqlXr151twHUIIJxAAAAYJUqLS3NFltskSTZZZdd8uyzz2bQoEH5zW9+s0ht8+bNM3369Cpj06dPT/PmzZd6jbKyspSVla28poFvjMmTJ6dXr17V3QasUn7HWRsNGTIk3/72t6u7DaAGEYwDAAAAq9WCBQsyZ86cxc61bds2o0ePzplnnlkcGzVq1BLfSQ7wdW266aYZMmRIdbcBy215wm6/46yNNt100+puAahhBOMAAADAKtO3b9906tQpm266aT766KMMHz48Y8aMySOPPJIk6dGjRzbeeOMMGDAgSXLGGWdkv/32y8CBA9O5c+fccccdGT9+vP+gD6wy9erVc0ciNZ7fcQBIalV3AwAAAEDNNWPGjPTo0SNbbrllDjzwwDz77LN55JFHctBBByX5/BHGU6dOLdbvueeeGT58eIYMGZIddtghd999d0aMGJFtt922uj4CAKyRxowZs1LrAKCmc8c4AAAAsMr87ne/W+r84v5jfbdu3dKtW7dV1BEA1BxjxoxJu3btljoPAHzOHeMAAAAAALCWWlL4LRQHgKoE4wAAAAAAsBYbM2ZMhgwZkiQZMmSIUBwAFkMwDgAAAAAAAECNJhgHAAAAAAAAoEYTjAMAAAAAAABQownGAQAAAAAAAKjRBOMAAAAAAAAA1GiCcQAAAAAAAABqNME4AAAAAAAAADWaYBwAAAAAAACAGk0wDgAAAAAAAECNJhgHAAAAAAAAoEYTjAMAAAAAAABQownGAQAAAAAAAKjRBOMAAAAAAAAA1GiCcQAAAAAAAABqNME4AAAAAAAAADVatQbjY8eOzWGHHZaKioqUlJRkxIgRxbl58+blpz/9abbbbrs0aNAgFRUV6dGjR6ZMmVLlHO+//366d++eRo0apXHjxunZs2dmzZpVpeaFF17IPvvsk3r16qVFixa57LLLFunlrrvuSps2bVKvXr1st912eeihh6rMFwqFXHDBBdloo41Sv379tG/fPq+//vrK+zIAAAAAAAAAWCWqNRifPXt2dthhh1x//fWLzH388cd57rnn8otf/CLPPfdc7r333rz22ms5/PDDq9R17949L7/8ckaNGpUHHnggY8eOTa9evYrzlZWVOfjgg9OyZctMmDAhl19+eS688MIMGTKkWDNu3Lgce+yx6dmzZ55//vl07do1Xbt2zUsvvVSsueyyy3LNNddk8ODBeeaZZ9KgQYN06NAhn3766Sr4ZgAAAAAAAABYWepU58U7deqUTp06LXauvLw8o0aNqjJ23XXXZffdd8/kyZOz6aab5pVXXsnIkSPz7LPPZtddd02SXHvttTnkkENyxRVXpKKiIsOGDcvcuXNz8803p7S0NNtss00mTpyYK6+8shigDxo0KB07dsw555yTJLn44oszatSoXHfddRk8eHAKhUKuvvrqnH/++enSpUuS5NZbb02zZs0yYsSIHHPMMYv9DHPmzMmcOXOK+5WVlV/vCwMAAAAAAABgua1V7xifOXNmSkpK0rhx4yTJ008/ncaNGxdD8SRp3759atWqlWeeeaZYs++++6a0tLRY06FDh7z22mv54IMPijXt27evcq0OHTrk6aefTpJMmjQp06ZNq1JTXl6ePfbYo1izOAMGDEh5eXlxa9Gixdf7AgAAAAAAAABYbmtNMP7pp5/mpz/9aY499tg0atQoSTJt2rQ0bdq0Sl2dOnXSpEmTTJs2rVjTrFmzKjUL97+q5ovzXzxucTWL07dv38ycObO4vf3228v1mQEAAAAAAAD4+qr1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v37at2+f119/vUrN+++/n+7du6dRo0Zp3LhxevbsmVmzZlWpeeGFF7LPPvukXr16adGiRS677LJFernrrrvSpk2b1KtXL9ttt10eeuih5e4FAAAAaoo6derkiCOOyH333Ze33347p5xySoYNG5ZNN900hx9+eO67774sWLCgutsEAACAZVKtwfjs2bOzww475Prrr1/s/GWXXZZrrrkmgwcPzjPPPJMGDRqkQ4cO+fTTT4s13bt3z8svv5xRo0blgQceyNixY9OrV6/ifGVlZQ4++OC0bNkyEyZMyOWXX54LL7wwQ4YMKdaMGzcuxx57bHr27Jnnn38+Xbt2TdeuXfPSSy8tVy8AAABQEzVr1ix777132rZtm1q1auXFF1/MCSeckM033zxjxoyp7vYAAADgK1VrMN6pU6dccsklOeKIIxaZKxQKufrqq3P++eenS5cu2X777XPrrbdmypQpxTvLX3nllYwcOTI33XRT9thjj+y999659tprc8cdd2TKlClJkmHDhmXu3Lm5+eabs8022+SYY47J6aefniuvvLJ4rUGDBqVjx44555xzstVWW+Xiiy/OzjvvnOuuu26ZewEAAICaZvr06bniiiuyzTbbpF27dqmsrMwDDzyQSZMm5d133813v/vdnHDCCdXdJgAAAHylNfYd45MmTcq0adPSvn374lh5eXn22GOPPP3000mSp59+Oo0bN86uu+5arGnfvn1q1aqVZ555pliz7777prS0tFjToUOHvPbaa/nggw+KNV+8zsKahddZll4WZ86cOamsrKyyAQAAwNrgsMMOS4sWLTJ06NCccsopeffdd3P77bcX18YNGjTI2WefnbfffruaOwUAAICvVmdFD3znnXdy//33Z/LkyZk7d26VuS/ejb2ipk2bluTzx7V9UbNmzYpz06ZNS9OmTavM16lTJ02aNKlS06pVq0XOsXBuvfXWy7Rp077yOl/Vy+IMGDAgF1100Vd/WAAAAFjDNG3aNH/5y1/Stm3bJdZsuOGGmTRp0mrsCgAAAFbMCgXjo0ePzuGHH55vfetbefXVV7PtttvmP//5TwqFQnbeeeeV3eNaq2/fvunTp09xv7KyMi1atKjGjgAAAGDZ/O53v/vKmpKSkrRs2XI1dAMAAABfzwoF43379s1PfvKTXHTRRWnYsGHuueeeNG3aNN27d0/Hjh1XSmPNmzdP8vn7zDbaaKPi+PTp07PjjjsWa2bMmFHluM8++yzvv/9+8fjmzZtn+vTpVWoW7n9VzRfnv6qXxSkrK0tZWdkyfV4AAABYk1xzzTWLHS8pKUm9evWyxRZbZN99903t2rVXc2cAAACw/FYoGH/llVdy++23f36COnXyySefZN11102/fv3SpUuX/OhHP/rajbVq1SrNmzfP6NGji+FzZWVlnnnmmeL527Ztmw8//DATJkzILrvskiR5/PHHs2DBguyxxx7FmvPOOy/z5s1L3bp1kySjRo3KlltumfXWW69YM3r06Jx55pnF648aNar4uLhl6QUAAABqkquuuirvvfdePv744+L6+YMPPsg666yTddddNzNmzMi3vvWtPPHEE56OBgAAwBqv1ooc1KBBg+J7xTfaaKO8+eabxbn//ve/y3yeWbNmZeLEiZk4cWKSZNKkSZk4cWImT56ckpKSnHnmmbnkkkty//3358UXX0yPHj1SUVGRrl27Jkm22mqrdOzYMaecckr+/ve/56mnnsppp52WY445JhUVFUmS4447LqWlpenZs2defvnl/PGPf8ygQYOqPOL8jDPOyMiRIzNw4MC8+uqrufDCCzN+/PicdtppSbJMvQAAAEBN8qtf/Sq77bZbXn/99fzvf//L//73v/zrX//KHnvskUGDBmXy5Mlp3rx5zjrrrOpuFQAAAL7SCt0x/p3vfCd//etfs9VWW+WQQw7J2WefnRdffDH33ntvvvOd7yzzecaPH5/999+/uL8wrD7hhBMydOjQnHvuuZk9e3Z69eqVDz/8MHvvvXdGjhyZevXqFY8ZNmxYTjvttBx44IGpVatWjjrqqCqPeysvL8+jjz6a3r17Z5dddskGG2yQCy64IL169SrW7Lnnnhk+fHjOP//8/PznP0/r1q0zYsSIbLvttsWaZekFAAAAaorzzz8/99xzTzbffPPi2BZbbJErrrgiRx11VP7973/nsssuy1FHHVWNXQIAAMCyWaFg/Morr8ysWbOSJBdddFFmzZqVP/7xj2ndunWuvPLKZT5Pu3btUigUljhfUlKSfv36pV+/fkusadKkSYYPH77U62y//fZ58sknl1rTrVu3dOvW7Wv1AgAAADXF1KlT89lnny0y/tlnn2XatGlJkoqKinz00UeruzUAAABYbisUjH/rW98q/nODBg0yePDgldYQAAAAUP3233///PCHP8xNN92UnXbaKUny/PPP50c/+lEOOOCAJMmLL76YVq1aVWebAAAAsExW6B3jJ598cn7/+98vMl5ZWZmTTz75azcFAAAAVK/f/e53adKkSXbZZZeUlZWlrKwsu+66a5o0aZLf/e53SZJ11103AwcOrOZOAQAA4Kut0B3jQ4cOzR//+MdMmDAhV199dWrV+jxf/+STT/L73/8+N99880ptEgAAAFh9CoVC5s6dm/vvvz+TJ0/Oa6+9liTZcssts+WWWxbr9t9//+pqEQAAAJbLCgXjSfLggw/mBz/4QV555ZXceeedWW+99VZmXwAAAEA1KRQK2WKLLfLyyy8vEoYDAADA2miFHqWeJFtvvXWeeeaZzJs3L7vvvnteeeWVldkXAAAAUE1q1aqV1q1b53//+191twIAAAArxQoF4yUlJUmS9ddfP4899lj222+/tG3bNvfff/9KbQ4AAACoHr/+9a9zzjnn5KWXXqruVgAAAOBrW6FHqRcKhf87QZ06uemmm7L11lvn//2//7fSGgMAAACqT48ePfLxxx9nhx12SGlpaerXr19l/v3336+mzgAAAGD5rVAw/sQTT6RJkyZVxvr06ZPtt98+Tz311EppDAAAAKg+V199dXW3AAAAACvNCgXj++2332LH27dvn/bt23+thgAAAIDqd8IJJ1R3CwAAALDSrFAwPn/+/AwdOjSjR4/OjBkzsmDBgirzjz/++EppDgAAAKg+b775Zm655Za8+eabGTRoUJo2bZqHH344m266abbZZpvqbg8AAACWWa0VOeiMM87IGWeckfnz52fbbbfNDjvsUGUDAAAA1m5/+ctfst122+WZZ57Jvffem1mzZiVJ/vGPf+SXv/xlNXcHAAAAy2eF7hi/4447cuedd+aQQw5Z2f0AAAAAa4Cf/exnueSSS9KnT580bNiwOH7AAQfkuuuuq8bOAAAAYPmt0B3jpaWl2WKLLVZ2LwAAAMAa4sUXX8wRRxyxyHjTpk3z3//+txo6AgAAgBW3QsH42WefnUGDBqVQKKzsfgAAAIA1QOPGjTN16tRFxp9//vlsvPHG1dARAAAArLgVepT6X//61zzxxBN5+OGHs80226Ru3bpV5u+9996V0hwAAABQPY455pj89Kc/zV133ZWSkpIsWLAgTz31VH7yk5+kR48e1d0eAAAALJcVCsYbN2682MepAQAAADXDr371q/Tu3TstWrTI/Pnzs/XWW2f+/Pk57rjjcv7551d3ewAAALBcVigYv+WWW1Z2HwAAAMAapLS0NL/97W/zi1/8Ii+99FJmzZqVnXbaKa1bt67u1gAAAGC5rVAwniSfffZZxowZkzfffDPHHXdcGjZsmClTpqRRo0ZZd911V2aPAAAAQDXZdNNNs+mmm1Z3GwAAAPC1rFAw/tZbb6Vjx46ZPHly5syZk4MOOigNGzbMpZdemjlz5mTw4MEru08AAABgNZo/f36GDh2a0aNHZ8aMGVmwYEGV+ccff7yaOgMAAIDlt0LB+BlnnJFdd901//jHP7L++usXx4844oiccsopK605AAAAoHqcccYZGTp0aDp37pxtt902JSUl1d0SAAAArLAVCsaffPLJjBs3LqWlpVXGN9tss7z77rsrpTEAAACg+txxxx258847c8ghh1R3KwAAAPC11VqRgxYsWJD58+cvMv7OO++kYcOGX7spAAAAoHqVlpZmiy22+NrnGTBgQHbbbbc0bNgwTZs2TdeuXfPaa6995XF33XVX2rRpk3r16mW77bbLQw899LV7AQAA4JtrhYLxgw8+OFdffXVxv6SkJLNmzcovf/lLf0kOAAAANcDZZ5+dQYMGpVAofK3z/OUvf0nv3r3zt7/9LaNGjcq8efNy8MEHZ/bs2Us8Zty4cTn22GPTs2fPPP/88+natWu6du2al1566Wv1AgAAwDfXCj1KfeDAgenQoUO23nrrfPrppznuuOPy+uuvZ4MNNsjtt9++snsEAAAAVrO//vWveeKJJ/Lwww9nm222Sd26davM33vvvct0npEjR1bZHzp0aJo2bZoJEyZk3333XewxgwYNSseOHXPOOeckSS6++OKMGjUq1113XQYPHrzYY+bMmZM5c+YU9ysrK5epPwAAAL4ZVigY32STTfKPf/wjd9xxR1544YXMmjUrPXv2TPfu3VO/fv2V3SMAAACwmjVu3DhHHHHESj/vzJkzkyRNmjRZYs3TTz+dPn36VBnr0KFDRowYscRjBgwYkIsuumil9AgAAEDNs0LBeJLUqVMn3//+91dmLwAAAMAa4pZbblnp51ywYEHOPPPM7LXXXtl2222XWDdt2rQ0a9asylizZs0ybdq0JR7Tt2/fKmF6ZWVlWrRo8fWbBgAAoEZYoWD81ltvXep8jx49VqgZAAAAYM3x2WefZcyYMXnzzTdz3HHHpWHDhpkyZUoaNWqUddddd7nP17t377z00kv561//utJ7LSsrS1lZ2Uo/LwAAADXDCgXjZ5xxRpX9efPm5eOPP05paWnWWWcdwTgAAACs5d5666107NgxkydPzpw5c3LQQQelYcOGufTSSzNnzpwlvut7SU477bQ88MADGTt2bDbZZJOl1jZv3jzTp0+vMjZ9+vQ0b958uT8HAAAAJEmtFTnogw8+qLLNmjUrr732Wvbee+/cfvvtK7tHAAAAYDU744wzsuuuu+aDDz5I/fr1i+NHHHFERo8evcznKRQKOe200/KnP/0pjz/+eFq1avWVx7Rt23aRa4waNSpt27Zd9g8AAAAAX7DC7xj/statW+fXv/51vv/97+fVV19dWacFAAAAqsGTTz6ZcePGpbS0tMr4ZpttlnfffXeZz9O7d+8MHz489913Xxo2bFh8T3h5eXkxcO/Ro0c23njjDBgwIMnnofx+++2XgQMHpnPnzrnjjjsyfvz4DBkyZCV9OgAAAL5pVuiO8SWpU6dOpkyZsjJPCQAAAFSDBQsWZP78+YuMv/POO2nYsOEyn+fGG2/MzJkz065du2y00UbF7Y9//GOxZvLkyZk6dWpxf88998zw4cMzZMiQ7LDDDrn77rszYsSIbLvttl/vQwEAAPCNtUJ3jN9///1V9guFQqZOnZrrrrsue+2110ppDAAAAKg+Bx98cK6++uriXdolJSWZNWtWfvnLX+aQQw5Z5vMUCoWvrBkzZswiY926dUu3bt2W+ToAAACwNCsUjHft2rXKfklJSTbccMMccMABGThw4MroCwAAAKhGV1xxRTp27Jitt946n376aY477ri8/vrr2WCDDXL77bdXd3sAAACwXFYoGF+wYMHK7gMAAABYg7Ro0SL/+Mc/8sc//jH/+Mc/MmvWrPTs2TPdu3cvvhscAAAA1hYrFIwDAAAANde8efPSpk2bPPDAA+nevXu6d+9e3S0BAADA17JCwXifPn2WufbKK69ckUsAAAAA1aRu3br59NNPq7sNAAAAWGlWKBh//vnn8/zzz2fevHnZcsstkyT/+te/Urt27ey8887FupKSkpXTJQAAALBa9e7dO5deemluuumm1KnjgXMAAACs3VZoZXvYYYelYcOG+f3vf5/11lsvSfLBBx/kpJNOyj777JOzzz57pTYJAAAArF7PPvtsRo8enUcffTTbbbddGjRoUGX+3nvvrabOAAAAYPmtUDA+cODAPProo8VQPEnWW2+9XHLJJTn44IMF4wAAALCWa9y4cY466qjqbgMAAABWihUKxisrK/Pee+8tMv7ee+/lo48++tpNAQAAANXrlltuqe4WAAAAYKWptSIHHXHEETnppJNy77335p133sk777yTe+65Jz179syRRx65snsEAAAAAAAAgBW2QneMDx48OD/5yU9y3HHHZd68eZ+fqE6d9OzZM5dffvlKbRAAAACoHnfffXfuvPPOTJ48OXPnzq0y99xzz1VTVwAAALD8VuiO8XXWWSc33HBD/ve//+X555/P888/n/fffz833HBDGjRosLJ7BAAAAFaza665JieddFKaNWuW559/PrvvvnvWX3/9/Pvf/06nTp2quz0AAABYLisUjC80derUTJ06Na1bt06DBg1SKBRWVl8AAABANbrhhhsyZMiQXHvttSktLc25556bUaNG5fTTT8/MmTOruz0AAABYLisUjP/vf//LgQcemG9/+9s55JBDMnXq1CRJz549c/bZZ6/UBgEAAIDVb/Lkydlzzz2TJPXr189HH32UJDn++ONz++23V2drAAAAsNxWKBg/66yzUrdu3UyePDnrrLNOcfx73/teRo4cudKaAwAAAKpH8+bN8/777ydJNt100/ztb39LkkyaNMkT4wAAAFjr1FmRgx599NE88sgj2WSTTaqMt27dOm+99dZKaQwAAACoPgcccEDuv//+7LTTTjnppJNy1lln5e6778748eNz5JFHVnd7AAAAsFxW6I7x2bNnV7lTfKH3338/ZWVlX7uphebPn59f/OIXadWqVerXr5/NN988F198cZW/TC8UCrnggguy0UYbpX79+mnfvn1ef/31Rfrq3r17GjVqlMaNG6dnz56ZNWtWlZoXXngh++yzT+rVq5cWLVrksssuW6Sfu+66K23atEm9evWy3Xbb5aGHHlppnxUAAADWJEOGDMl5552XJOndu3duvvnmbLXVVunXr19uvPHGau4OAAAAls8KBeP77LNPbr311uJ+SUlJFixYkMsuuyz777//Smvu0ksvzY033pjrrrsur7zySi699NJcdtllufbaa4s1l112Wa655poMHjw4zzzzTBo0aJAOHTrk008/LdZ07949L7/8ckaNGpUHHnggY8eOTa9evYrzlZWVOfjgg9OyZctMmDAhl19+eS688MIMGTKkWDNu3Lgce+yx6dmzZ55//vl07do1Xbt2zUsvvbTSPi8AAACsKWrVqpU6df7vQXPHHHNMrrnmmvz4xz9OaWlpNXYGAAAAy2+FHqV+2WWX5cADD8z48eMzd+7cnHvuuXn55Zfz/vvv56mnnlppzY0bNy5dunRJ586dkySbbbZZbr/99vz9739P8vnd4ldffXXOP//8dOnSJUly6623plmzZhkxYkSOOeaYvPLKKxk5cmSeffbZ7LrrrkmSa6+9NoccckiuuOKKVFRUZNiwYZk7d25uvvnmlJaWZptttsnEiRNz5ZVXFgP0QYMGpWPHjjnnnHOSJBdffHFGjRqV6667LoMHD15s/3PmzMmcOXOK+5WVlSvtuwEAAICV7YUXXljm2u23334VdgIAAAAr1wrdMb7tttvmX//6V/bee+906dIls2fPzpFHHpnnn38+m2+++Uprbs8998zo0aPzr3/9K0nyj3/8I3/961/TqVOnJMmkSZMybdq0tG/fvnhMeXl59thjjzz99NNJkqeffjqNGzcuhuJJ0r59+9SqVSvPPPNMsWbfffet8hfvHTp0yGuvvZYPPvigWPPF6yysWXidxRkwYEDKy8uLW4sWLb7O1wEAAACr1I477piddtopO+6441K3nXbaqbpbBQAAgOWy3HeMz5s3Lx07dszgwYOL7xpbVX72s5+lsrIybdq0Se3atTN//vz0798/3bt3T5JMmzYtSdKsWbMqxzVr1qw4N23atDRt2rTKfJ06ddKkSZMqNa1atVrkHAvn1ltvvUybNm2p11mcvn37pk+fPsX9yspK4TgAAABrrEmTJlV3CwAAALBKLHcwXrdu3eV6tNrXceedd2bYsGEZPnx48fHmZ555ZioqKnLCCSeslh6+jrKyspSVlVV3GwAAALBMWrZsWd0tAAAAwCqxQo9S//73v5/f/e53K7uXRZxzzjn52c9+lmOOOSbbbbddjj/++Jx11lkZMGBAkqR58+ZJkunTp1c5bvr06cW55s2bZ8aMGVXmP/vss7z//vtVahZ3ji9eY0k1C+cBAACgpnnzzTfz4x//OO3bt0/79u1z+umn580336zutgAAAGC5rVAw/tlnn+XGG2/Mrrvumh/+8Ifp06dPlW1l+fjjj1OrVtUWa9eunQULFiRJWrVqlebNm2f06NHF+crKyjzzzDNp27ZtkqRt27b58MMPM2HChGLN448/ngULFmSPPfYo1owdOzbz5s0r1owaNSpbbrll1ltvvWLNF6+zsGbhdQAAAKAmeeSRR7L11lvn73//e7bffvtsv/32eeaZZ7LNNttk1KhR1d0eAAAALJflepT6v//972y22WZ56aWXsvPOOydJ/vWvf1WpKSkpWWnNHXbYYenfv3823XTTbLPNNnn++edz5ZVX5uSTTy5e68wzz8wll1yS1q1bp1WrVvnFL36RioqKdO3aNUmy1VZbpWPHjjnllFMyePDgzJs3L6eddlqOOeaYVFRUJEmOO+64XHTRRenZs2d++tOf5qWXXsqgQYNy1VVXFXs544wzst9++2XgwIHp3Llz7rjjjowfPz5DhgxZaZ8XAAAA1hQ/+9nPctZZZ+XXv/71IuM//elPc9BBB1VTZwAAALD8lisYb926daZOnZonnngiSfK9730v11xzTZo1a7ZKmrv22mvzi1/8Iv/v//2/zJgxIxUVFfnhD3+YCy64oFhz7rnnZvbs2enVq1c+/PDD7L333hk5cmTq1atXrBk2bFhOO+20HHjggalVq1aOOuqoXHPNNcX58vLyPProo+ndu3d22WWXbLDBBrngggvSq1evYs2ee+6Z4cOH5/zzz8/Pf/7ztG7dOiNGjMi22267Sj47AAAAVKdXXnkld9555yLjJ598cq6++urV3xAAAAB8DcsVjBcKhSr7Dz/8cGbPnr1SG/qihg0b5uqrr17qgrukpCT9+vVLv379lljTpEmTDB8+fKnX2n777fPkk08utaZbt27p1q3bUmsAAACgJthwww0zceLEtG7dusr4xIkT07Rp02rqCgAAAFbMcgXjX/bloBwAAACoGU455ZT06tUr//73v7PnnnsmSZ566qn8+te/ztlnn13N3QEAAMDyWa5gvKSkZJF3iK/Md4oDAAAAa4Zf/OIXadiwYQYOHJi+ffsmSTbeeONcdNFFOf3006u5OwAAAFg+y/0o9RNPPDFlZWVJkk8//TSnnnpqGjRoUKXu3nvvXXkdAgAAAKvdp59+mh/+8Ic566yz8tFHH2XSpEkZPXp02rRp44/kAQAAWOssVzB+wgknVNn//ve/v1KbAQAAANYMXbp0yZFHHplTTz018+fPz8EHH5y6devmv//9b6688sr86Ec/qu4WAQAAYJktVzB+yy23rKo+AAAAgDXIc889l6uuuipJcvfdd6dZs2Z5/vnnc8899+SCCy4QjAMAALBWqVXdDQAAAABrno8//jgNGzZMkjz66KM58sgjU6tWrXznO9/JW2+9Vc3dAQAAwPIRjAMAAACL2GKLLTJixIi8/fbbeeSRR3LwwQcnSWbMmJFGjRpVc3cAAACwfATjAAAAwCIuuOCC/OQnP8lmm22WPfbYI23btk3y+d3jO+20UzV3BwAAAMtnud4xDgAAAHwzHH300dl7770zderU7LDDDsXxAw88MEcccUQ1dgYAAADLTzAOAAAALFbz5s3TvHnzKmO77757NXUDAAAAK86j1AEAAAAAAACo0QTjAAAAAAAAANRognEAAAAAAAAAajTBOAAAAAAAAAA1mmAcAAAAAAAAgBpNMA4AAAAAAABAjSYYBwAAAAAAAKBGE4wDAAAAAAAAUKMJxgEAAAAAAACo0QTjAAAAAAAAANRognEAAAAAAAAAajTBOAAAALDKjB07NocddlgqKipSUlKSESNGLLV+zJgxKSkpWWSbNm3a6mkYAACAGkkwDgAAAKwys2fPzg477JDrr79+uY577bXXMnXq1OLWtGnTVdQhAAAA3wR1qrsBAAAAoObq1KlTOnXqtNzHNW3aNI0bN17m+jlz5mTOnDnF/crKyuW+JgAAADWXO8YBAACANc6OO+6YjTbaKAcddFCeeuqpr6wfMGBAysvLi1uLFi1WQ5cAAACsLQTjAAAAwBpjo402yuDBg3PPPffknnvuSYsWLdKuXbs899xzSz2ub9++mTlzZnF7++23V1PHAAAArA08Sh0AAABYY2y55ZbZcssti/t77rln3nzzzVx11VW57bbblnhcWVlZysrKVkeLAAAArIXcMQ4AAACs0Xbfffe88cYb1d0GAAAAazHBOAAAALBGmzhxYjbaaKPqbgMAAIC1mEepAwAAAKvMrFmzqtztPWnSpEycODFNmjTJpptumr59++bdd9/NrbfemiS5+uqr06pVq2yzzTb59NNPc9NNN+Xxxx/Po48+Wl0fAQAAgBpAMA4AAACsMuPHj8/+++9f3O/Tp0+S5IQTTsjQoUMzderUTJ48uTg/d+7cnH322Xn33XezzjrrZPvtt89jjz1W5RwAAACwvATjAAAAwCrTrl27FAqFJc4PHTq0yv65556bc889dxV3BQAAwDeNd4wDAAAAAAAAUKMJxgEAAAAAAACo0QTjAAAAAAAAANRognEAAAAAAAAAajTBOAAAAAAAAAA1mmAcAAAAAAAAgBpNMA4AAAAAAABAjSYYBwAAAAAAAKBGE4wDAAAAAAAAUKMJxgEAAAAAAACo0QTjAAAAAAAAANRognEAAAAAAAAAajTBOAAAAAAAAAA1mmAcAAAAAAAAgBptjQ/G33333Xz/+9/P+uuvn/r162e77bbL+PHji/OFQiEXXHBBNtpoo9SvXz/t27fP66+/XuUc77//frp3755GjRqlcePG6dmzZ2bNmlWl5oUXXsg+++yTevXqpUWLFrnssssW6eWuu+5KmzZtUq9evWy33XZ56KGHVs2HBgAAAAAAAGClWaOD8Q8++CB77bVX6tatm4cffjj//Oc/M3DgwKy33nrFmssuuyzXXHNNBg8enGeeeSYNGjRIhw4d8umnnxZrunfvnpdffjmjRo3KAw88kLFjx6ZXr17F+crKyhx88MFp2bJlJkyYkMsvvzwXXnhhhgwZUqwZN25cjj322PTs2TPPP/98unbtmq5du+all15aPV8GAAAAAAAAACukTnU3sDSXXnppWrRokVtuuaU41qpVq+I/FwqFXH311Tn//PPTpUuXJMmtt96aZs2aZcSIETnmmGPyyiuvZOTIkXn22Wez6667JkmuvfbaHHLIIbniiitSUVGRYcOGZe7cubn55ptTWlqabbbZJhMnTsyVV15ZDNAHDRqUjh075pxzzkmSXHzxxRk1alSuu+66DB48eHV9JQAAAAAAAAAspzX6jvH7778/u+66a7p165amTZtmp512ym9/+9vi/KRJkzJt2rS0b9++OFZeXp499tgjTz/9dJLk6aefTuPGjYuheJK0b98+tWrVyjPPPFOs2XfffVNaWlqs6dChQ1577bV88MEHxZovXmdhzcLrLM6cOXNSWVlZZQMAAAAAAABg9Vqjg/F///vfufHGG9O6des88sgj+dGPfpTTTz89v//975Mk06ZNS5I0a9asynHNmjUrzk2bNi1NmzatMl+nTp00adKkSs3izvHFayypZuH84gwYMCDl5eXFrUWLFsv1+QEAAAAAAAD4+tboYHzBggXZeeed86tf/So77bRTevXqlVNOOWWteXR53759M3PmzOL29ttvV3dLAAAAAAAAAN84a3QwvtFGG2XrrbeuMrbVVltl8uTJSZLmzZsnSaZPn16lZvr06cW55s2bZ8aMGVXmP/vss7z//vtVahZ3ji9eY0k1C+cXp6ysLI0aNaqyAQAAAAAAALB6rdHB+F577ZXXXnutyti//vWvtGzZMknSqlWrNG/ePKNHjy7OV1ZW5plnnknbtm2TJG3bts2HH36YCRMmFGsef/zxLFiwIHvssUexZuzYsZk3b16xZtSoUdlyyy2z3nrrFWu+eJ2FNQuvAwAAAAAAAMCaaY0Oxs8666z87W9/y69+9au88cYbGT58eIYMGZLevXsnSUpKSnLmmWfmkksuyf33358XX3wxPXr0SEVFRbp27Zrk8zvMO3bsmFNOOSV///vf89RTT+W0007LMccck4qKiiTJcccdl9LS0vTs2TMvv/xy/vjHP2bQoEHp06dPsZczzjgjI0eOzMCBA/Pqq6/mwgsvzPjx43Paaaet9u8FAAAAAAAAgGVXp7obWJrddtstf/rTn9K3b9/069cvrVq1ytVXX53u3bsXa84999zMnj07vXr1yocffpi99947I0eOTL169Yo1w4YNy2mnnZYDDzwwtWrVylFHHZVrrrmmOF9eXp5HH300vXv3zi677JINNtggF1xwQXr16lWs2XPPPTN8+PCcf/75+fnPf57WrVtnxIgR2XbbbVfPlwEAAAAAAADAClmjg/EkOfTQQ3PooYcucb6kpCT9+vVLv379lljTpEmTDB8+fKnX2X777fPkk08utaZbt27p1q3b0hsGAAAAAAAAYI2yRj9KHQAAAAAAAAC+LsE4AAAAAAAAADXaGv8odQAAAADWTNOnT8/MmTOruw0Akrz11ltV/heA6ldeXp5mzZpVdxv8/wTjAAAAACy36dOn5/vH98i8uXOquxUAvqB///7V3QIA/7+6pWX5w223CsfXEIJxAAAAAJbbzJkzM2/unHzyrf2yoF55dbcDAABrlFqfzkz+/ZfMnDlTML6GEIwDAAAAsMIW1CvPggYbVHcbAAAAS1WruhsAAAAAAAAAgFVJMA4AAAAAAABAjSYYBwAAAAAAAKBGE4wDAAAAAAAAUKMJxgEAAAAAAACo0QTjAAAAAAAAANRognEAAAAA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3nuv/P395efnp7vvvlubN292bJ89e7YefPBBSVL79u0d02KtXbs2y3YXL16sunXrysvLS3Xr1tU333yTYb3srH916NAhWSwWNW/ePN02f3//dB3sL7/8UmFhYfL29lbp0qX1+OOP6+TJk1keQ5JmzZqlu+66S4GBgfL09FTt2rU1ffr0dPUqVaqk++67T8uXL1fjxo3l7e2dKzcf2Kdj3LBhg0aMGKEyZcrI19dXDzzwgM6cOZOu/o8//qjWrVvL19dXxYoVU+fOnbVnzx6nOvZpAQ8dOqR//etfKlasmB577DFJttH6zz33nEqXLq1ixYqpS5cuOnnypNM1WbNmjUwmU4bXb/78+TKZTNq0adMtnzsAAABQWNx1113697//raNHj2revHmO8ozWHV65cqVatWql4sWLy8/PTzVq1NArr7wiybYueJMmTSRJ/fv3d/TF7GsZt2vXTnXr1tW2bdvUpk0b+fj4OPa9fo1xu9TUVL3yyisKDg6Wr6+vunTpouPHjzvVqVSpkvr165du3+vbrFSpUqbTKNv7i5mtMT5t2jTVqVPHsZzYkCFDFBsbm+54devW1d69e9W+fXv5+PiofPnyevfdd9PFlpSUpDFjxqhatWry9PRUSEiIXnrpJSUlJaWre7Oy28/88ssvVbt2bae+cL9+/W44+9qtXO8lS5aoc+fOKleunDw9PVW1alWNHTtWqampTsf466+/1KNHDwUHB8vLy0sVKlTQI488ogsXLjimxl6zZo327NmT7lomJCTohRdeUEhIiDw9PVWjRg299957MgzD6Rgmk0lDhw7VZ5995rjGy5Ytc7wX1q9fr+eee05lypRR8eLF9dRTTyk5OVmxsbHq06ePSpQooRIlSuill15K1/Z7772nFi1aqFSpUvL29lZYWJgWLVqU7vgJCQmaM2eO4xzs7+ejR4/qmWeeUY0aNeTt7a1SpUrpwQcfzPaycbGxserXr58CAgJUvHhx9e3bN937VsreGuNnz55VXFycWrZsmeH2wMBAp+cxMTEaMGCAgoKC5OXlpfr162vOnDk3jDm752y/PuvWrdMzzzyjwMBAVahQ4YbtZ4f9O5T169eradOm8vLyUpUqVfTpp5+mqxsbG6thw4Y53mfVqlXTO++8I6vV6qhjf6++9957ioyMVNWqVeXp6elYknDt2rVq3LixvLy8VLVqVc2cOTPdNWnbtq3q16+fYbw1atRQRERErpw7gKKBEeMAgELpu+++U6VKldS6desMt7dp00aVKlXSd999p2nTpuV7e9c7dOiQJKlUqVKZ1tmzZ49at24tf39/vfTSS3J3d9fMmTPVrl07rVu3Ts2aNVObNm303HPP6YMPPtArr7yiWrVqSZLjZ0ZWrFihHj16qHbt2ho/frzOnTun/v3733SnKjQ0VKmpqZo7d6769u2bZd3Zs2erf//+atKkicaPH6/o6GhNnjxZGzZs0I4dO7K883369OmqU6eOunTpIjc3N3333Xd65plnZLVaNWTIEKe6Bw4cUK9evfTUU09p0KBBqlGjxg3P4+zZs+nKPDw85O/v71T27LPPqkSJEhozZoyOHDmiyMhIDR06VAsXLnTUsb8WEREReuedd3Tp0iVNnz5drVq10o4dO5y+dElJSVFERIRatWql9957zzGioF+/fvriiy/Uu3dvNW/eXOvWrVPnzp2dYmnXrp1CQkL02Wef6YEHHnDa9tlnn6lq1aoKDw+/4bkDAAAARUnv3r31yiuvaMWKFRo0aFCGdfbs2aP77rtPd955p9588015enrq4MGD2rBhgyRbn+vNN9/U6NGj9eSTTzr6jmln0Tp37pzuvfdePfLII3r88ccVFBSUZVz/+c9/ZDKZNHLkSMXExCgyMlIdOnTQzp07s5wBKyORkZGKj493Kps0aZJ27tyZZT/09ddf1xtvvKEOHTro6aef1oEDBzR9+nRt2bJFGzZskLu7u6Pu+fPn1alTJ3Xv3l0PPfSQFi1apJEjR6pevXq69957JdlGJHfp0kXr16/Xk08+qVq1amn37t2aNGmS/vzzz1xZazq7/cylS5fq4YcfVr169TR+/HidP39eAwYMUPny5W94jFu53rNnz5afn59GjBghPz8/rV69WqNHj1ZcXJzjZvvk5GRFREQoKSlJzz77rIKDg3Xy5El9//33io2NVZkyZTR37lz95z//UXx8vMaPH++IyzAMdenSRWvWrNGAAQPUoEEDLV++XC+++KJOnjyZbtr11atX64svvtDQoUNVunRpVapUybFuuv3Yb7zxhjZv3qz//e9/Kl68uDZu3KiKFStq3Lhx+uGHHzRhwgTVrVtXffr0cbQ7efJkdenSRY899piSk5O1YMECPfjgg/r+++8dfdm5c+dq4MCB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IIvFonfeeUcXLlyQp6en7rrrrkzXyxs/frw6d+6sVq1a6YknntA///yj//73v6pTp47TFwTZNXfuXH322Wd64IEHFBYWJg8PD+3bt0+ffPKJvLy89Morr0iS3N3d9c4776h///5q27atevXqpejoaE2ePFmVKlXS8OHDMz3GPffcIw8PD91///2ODtGHH36owMBAx13atyIlJUXz5s3LcNsDDzzg+AIkO/z9/TV9+nT17t1bjRo10iOPPKIyZcro2LFjWrp0qVq2bHnDac7DwsLUo0cPRUZG6ty5c2revLnWrVunP//8U1LGd9j36dNHPXv2lCSNHTs22/ECAAAAhdWPP/6o/fv3KyUlRdHR0Vq9erVWrlyp0NBQffvtt/Ly8sp03zfffFM///yzOnfurNDQUMXExGjatGmqUKGCY1axqlWrqnjx4poxY4aKFSsmX19fNWvW7Kb7iSVLllSrVq3Uv39/RUdHKzIyUtWqVdOgQYMcdQYOHKhFixapU6dOeuihh3To0CHNmzfPMXOVXa9evVSmTBlVr149XV+nY8eOCgoKSnf8MmXKaNSoUXrjjTfUqVMndenSRQcOHNC0adPUpEmTm0pK9e7dW1988YUGDx6sNWvWqGXLlkpNTdX+/fv1xRdfaPny5WrcuHGWbVy5ciXDEdMlS5bUM888k+1+5rhx49S1a1e1bNlS/fv31/nz5zVlyhTVrVs3W33hm7neLVq0UIkSJdS3b18999xzMplMmjt3brpk6OrVqzV06FA9+OCDuuOOO5SSkqK5c+fKYrGoR48eWcZ1//33q3379nr11Vd15MgR1a9fXytWrNCSJUs0bNiwdO+NvNC5c2dNnDhRnTp10qOPPqqYmBhNnTpV1apVS7dMXVhYmH766SdNnDhR5cqVU+XKldWsWTPdd999mjt3rgICAlS7dm1t2rRJP/30k0qVKnXD499///1q2bKlXn75ZR05ckS1a9fW119/fcO1yTNz6dIltWjRQs2bN1enTp0UEhKi2NhYLV68WL/88ou6deumhg0bSpKefPJJzZw5U/369dO2bdtUqVIlLVq0SBs2bFBkZGS6td/TupVzzo7t27dn+F1H1apVFR4enqO2XnzxRX377be677771K9fP4WFhSkhIUG7d+/WokWLdOTIkRveoP/6669rxYoVatmypZ5++mnHDR1169bV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x49Ljz9+bR1xX1/bOuL790sPPphpUvzrr6VKlaT27aVHH7X9rFTJVp5dudFGUfbzzz/r/vvvV7ly5WQymbR48eJ0dfbt26cuXbooICBAvr6+atKkiY4dO+bYfvnyZQ0ZMkSlSpWSn5+fevTooejoaKc2jh07ps6dO8vHx0eBgYF68cUXlZKS4lRn7dq1atSokTw9PVWtWjXNnj07XSxTp05VpUqV5OXlpWbNmum3337LldcBAAAAAFA0kRi/SW+//bZMJpOGDRvm6lAAAAAAIO9duiS98YZUo4b02We2BHj//tJff0mjRkleXpnu+vXXtoHk9tnW7U6etJVnJ7GdG20UdQkJCapfv76mTp2a4fZDhw6pVatWqlmzptauXatdu3bp3//+t7zSXNvhw4fru+++05dffql169bp1KlT6t69u2N7amqqOnfurOTkZG3cuFFz5szR7NmzNXr0aEedw4cPq3Pnzmrfvr127typYcOGaeDAgVq+fLmjzsKFCzVixAiNGTNG27dvV/369RUREaGYmJg8eGUAAAAAAEWByTAMw9VB3G62bNmihx56SP7+/mrfvr0iIyOztV9cXJwCAgJ04cIF+fv7522QAAAAAJAbDEOaP/+m1xFPTbWN6r4+oW1nMkkVKkiHD2c+JXputJHfCnr/z2Qy6ZtvvlG3bt0cZY888ojc3d01d+7cDPe5cOGCypQpo/nz56tnz56SpP3796tWrVratGmTmjdvrh9//FH33XefTp06paCgIEnSjBkzNHLkSJ05c0YeHh4aOXKkli5dqj/++MPp2LGxsVq2bJkkqVmzZmrSpImmTJkiSbJarQoJCdGzzz6rl19+OVvnWNCvgSSVrVBRL836KVt13+3fQadPHLtxRQAAAAAoQnLS92PEeA7Fx8frscce04cffqgSJUpkWTcpKUlxcXFODwAAAAC4bfz6q9SihW3q9BMnbOuIf/GF9PPP2UqKS7b1wDNLaEu2vPvx47Z6edkGsma1WrV06VLdcccdioiIUGBgoJo1a+Y03fq2bdt05coVdejQwVFWs2ZNVaxYUZs2bZIkbdq0SfXq1XMkxSUpIiJCcXFx2rNnj6NO2jbsdextJCcna9u2bU51zGazOnTo4KiTEfrgAAAAAICskBjPoSFDhqhz587pOvEZGT9+vAICAhyPkJCQfIgQAAAAAG7RiRNS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IcvuEQ8MlGbMkDIypC5d/ukRr1TJ7AkLDKE4AACXioiI0Lx589S5c2elp6dr+PDhatiwodavX68pU6YU2Of8/fffcnNz/jVBqVKllJWVJUmqVauW/Pz8tHr1asf9lJQUbd68WUFBQZKkoKAgnTlzRrGxsY41a9asUVZWllq0aOFYs379eqef4WNiYlSnTh1VrFjRsebiz8lek/05AAAAAADkleWC8fr162vDhg2XXP/iiy902223mTARAACF6OIe8T/+MHrEV6yQvv662PWIE4oDAJCzhg0b6sCBA2rdurUeeOABpaam6qGHHtKOHTt08803F9jn3HfffXrttdf09ddf67ffftOSJUs0Y8YMPfjgg5KMneqDBg3SxIkTtWzZMu3evVtPPvmk/P391a1bN0lSvXr11KlTJz377LPasmWLfvjhBw0YMEA9e/aUv7+/JKlXr17y8PBQaGio9u7dq08//VSzZ89WWFiYY5aBAwcqOjpa06dPV1xcnMaNG6dt27ZpwIABBfb1AgAAAABKFnezB8ir8PBw9enTR8eOHVNWVpYWL16s/fv368MPP9Ty5cvNHg8AgIIRH28cm/7VV8bzSpWk8eOl554rNkemX4xQHACAnGVkZKhTp06KjIzUqFGjCvWz3njjDY0ZM0YvvPCCTp48KX9/fz333HMKDw93rBk+fLhSU1PVr18/nTlzRq1bt1Z0dLTKlCnjWLNw4UINGDBAHTp0kJubm7p37645c+Y47nt7e+vbb79V//791axZM1WpUkXh4eHq16+fY02rVq20aNEijR49Wq+88ooCAwO1dOlSNWzYsFC/BwAAAACA4stmt1vv18gbNmzQhAkT9NNPP+ns2bNq2rSpwsPD1bFjR7NHu6KUlBR5e3srOTmZrjMAQM7OnJFefVV64w3jyPRSpaT+/aWxY4vVkekXIxQHABRHBfnzX9WqVbVx40YFBgYW0HQlgxV+Bq9eo6aGz1+Vq7URfYN14ujhQp4IAAAAAKwlLz/7WW7HuCS1adNGMTExZo8BAEDBuXBBeu89acwY48h0yegRnzbNOD69GCqIQFwiFAcAFH+PP/643n//fU2ePNnsUQAAAAAAsCxLBuMAABQrq1dLgwZJe/YYz+vVk2bMkDp1MnWsglRQITgAACXRhQsX9MEHH2jVqlVq1qyZypcv73R/xowZJk0GAAAA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S5K++omecQAAAAAlF8E4iid6xAEAAAAgT/r376+PPvpIixYtUoUKFZSQkKCEhASdO3dOkuTt7a3Q0FCFhYVp7dq1io2NVd++fRUUFKSWLVtKkjp27Kj69evriSee0E8//aSVK1dq9OjR6t+/vzw9PSVJ//nPf/Trr79q+PDhiouL09tvv63PPvtMgwcPdswSFhamd999VwsWLNC+ffv0/PPPKzU1VX379i36b0wxENLAT+5uNsUl/KWDJ/8yexwAAAAAMIW72QMABerYMemVV/45Mr1cOWnECGnoUI5MBwAAAIArmDt3riSpXbt2Ttfnz5+vp556SpI0c+ZMubm5qXv37kpLS1NISIjefvttx9pSpUpp+fLlev755xUUFKTy5curT58+mjBhgmNNrVq19PXXX2vw4MGaPXu2atSooffee08hISGONT169NCpU6cUHh6uhIQENWnSRNHR0fL19S28b0Ax5lPOQ21vqao1cSf11U8nNPieCmaPBAAAAABFzma32+1mD1FSpKSkyNvbW8nJyfLy8jJ7nOLl3Dlp+nRp0iTjyHTJ6BF//XWOTAcAAABQ5Pj5z3xW+GdQvUZNDZ+/KldrI/oG68TRw9f8WYu3H1XYZz+pVpXyWjPkLtlstmt+LwAAAABwFXn52Y+j1GFtdrv06adS3brSmDFGKB4UJG3eTI84AAAAAAD/07GBn8p7lNKhP1K16dc/zR4HAAAAAIocwTisK7tHvGdP6fDhf3rEf/hBuuMOs6cDAAAAAMBlXOfprgduM/7y+MIfr33nOQAAAABYFcE4rOf4calPHyP83rjR6BGfMEGKizNCco6DAwAAAADgEo+3uEGStHJvgk6mnDd5GgAAAAAoWgTjsI5z56SJE6XAQOnDD41rTz4pHThgHKNerpy58wEAAAAA4MLq+3upaU0fXciy69OtR8weBwAAAACKFME4XB894gAAAAAAFIjHWxq7xj/ecliZWXaTpwEAAACAokMwDte2bZvUpo1zj/iiRfSIAwAAAABwDbo0qq6K5UrrePJ5rYk7afY4AAAAAFBkCMbhmo4fl556Srr9diMEv7hH/LHH6BEHAAAAAOAalCldSo80D5AkffTj7yZPAwAAAABFh2AcruXcOem116RbbjGOSZekJ56Q9u+nRxwAAAAAgALQ646akqT18ad0+M+/TZ4GAAAAAIoG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GzhwIBITEzFnzhzEx8fD398f+/btg4uLi6FDqxT8jBof9olxYr8YH/aJ8WGfGB/2ifFhnxgf9olxqu39IoiiKBo6CCIiIiIiIiIiIiIiIiIioqrCc4wTEREREREREREREREREVGtxsQ4ERERERERERERERERERHVakyMExERERERERERERERERFRrcbEOBERERERERERERERERER1WpMjFOdlZOTA39/fwiCgIiICEOHQ6STW7duYcSIEWjQoAHMzc3RqFEjhIWFITc319ChEZVp5cqVqF+/PszMzNC+fXucPXvW0CER6WThwoVo27YtrK2t4ezsjH79+iEqKsrQYRFVyKJFiyAIAiZOnGjoUIjqHH1/C/322294/vnnYWZmhhYtWmDPnj3VFGndoU+ffP/99+jcuTPs7e1hb2+PoKAg/p6tAhXdZti0aRMEQUC/fv2qNsA6St9+SU5OxpgxY+Dm5gZTU1P4+vryf1gl07dPli9fjiZNmsDc3BxeXl748MMPkZ2dXU3R1n7Hjx9HcHAw3N3dIQgCtm/f/tTHHD16FK1bt4apqSmee+45rFu3rsrjrEv07ZOtW7eiR48ecHJygo2NDQIDA7F///7qCbaOqMjnpFB4eDgUCgX8/f2rLL66qCJ9kpOTg1mzZsHHxwempqaoX78+1qxZU/XBVhEmxqnOmjp1Ktzd3Q0dBpFerl27BrVajdWrV+Pvv//GF198gVWrVmHmzJmGDo2olM2bNyM0NBRhYWG4ePEi/Pz80LNnTzx48MDQoRE91bFjxzBmzBicPn0aBw8eRF5eHl555RVkZGQYOjQivZw7dw6rV69Gy5YtDR0KUZ2j72+hP/74A4MGDcKIESNw6dIl9OvXD/369cPly5erOfLaS98+OXr0KAYNGoT//e9/OHXqFLy8vPDKK6/g3r171Rx57VXRbYZbt25h8uTJ6Ny5czVFWrfo2y+5ubno0aMHbt26hS1btiAqKgrff/89PDw8qjny2kvfPtmwYQOmT5+OsLAwXL16FT/++CM2b97M/UeVKCMjA35+fli5cqVO9W/evInXXnsN3bp1Q0REBCZOnIiRI0cyEVuJ9O2T48ePo0ePHtizZw8uXLiAbt26ITg4GJcuXariSOsOffukUHJyMoYOHYqXX365iiKruyrSJwMGDMDhw4fx448/IioqChs3bkSTJk2qMMqqJYiiKBo6CKLqtnfvXoSGhuL3339Hs2bNcOnSJR55RDXW559/jm+//RYxMTGGDoVIS/v27dG2bVusWLECAKBWq+Hl5YVx48Zh+vTpBo6OSD+JiYlwdnbGsWPH0KVLF0OHQ6ST9PR0tG7dGt988w0++eQT+Pv7Y/ny5YYOi6jO0Pe30MCBA5GRkYFdu3ZJZR06dIC/vz9WrVpVbXHXZs/6+1SlUsHe3h4rVqzA0KFDqzrcOqEifaJSqdClSxe89957OHHiBJKTk/UagUZPp2+/rFq1Cp9//jmuXbsGExOT6g63TtC3T8aOHYurV6/i8OHDUtmkSZNw5swZnDx5stririsEQcC2bdvKncFi2rRp2L17t9YBb++88w6Sk5Oxb9++aoiybtGlT8rSrFkzDBw4EHPmzKmawOowffrknXfeQePGjSGXy7F9+3bO+FtFdOmTffv24Z133kFMTAwcHByqL7gqxBHjVOckJCTg/fffx88//wwLCwtDh0P0zFJSUmrNlxLVHrm5ubhw4QKCgoKkMplMhqCgIJw6dcqAkRFVTEpKCgDw/y3VKGPGjMFrr72m9b+YiKpHRX4LnTp1qtTntWfPnvztVEkq4/dpZmYm8vLy+HugklS0T+bPnw9nZ2eMGDGiOsKscyrSLzt37kRgYCDGjBkDFxcXNG/eHAsWLIBKpaqusGu1ivRJx44dceHCBWm69ZiYGOzZswe9e/eulpipNH7PGz+1Wo20tDR+zxvY2rVrERMTg7CwMEOHQtB8xwcEBGDx4sXw8PCAr68vJk+ejKysLEOHVmEKQwdAVJ1EUcSwYcMwatQoBAQE4NatW4YOieiZREdH4+uvv8aSJUsMHQqRlocPH0KlUsHFxUWr3MXFBdeuXTNQVEQVo1arMXHiRHTq1AnNmzc3dDhEOtm0aRMuXryIc+fOGToUojqpIr+F4uPjy6wfHx9fZXHWJZXx+3TatGlwd3fnAUeVpCJ9cvLkSfz4448cOVaFKtIvMTExOHLkCIYMGYI9e/YgOjoao0ePRl5eHhMblaAifTJ48GA8fPgQL774IkRRRH5+PkaNGsWp1A3oSd/zqampyMrKgrm5uYEio0JLlixBeno6BgwYYOhQ6qx//vkH06dPx4kTJ6BQMH1pDGJiYnDy5EmYmZlh27ZtePjwIUaPHo1Hjx5h7dq1hg6vQjhinGqF6dOnQxCEci/Xrl3D119/jbS0NMyYMcPQIRNp0XUdLu7evXvo1asX3n77bbz//vsGipyIqPYbM2YMLl++jE2bNhk6FCKd3LlzBxMmTMAvv/wCMzMzQ4dDRFQrLFq0CJs2bcK2bdv4v9VA0tLS8O677+L7779HvXr1DB0OFaNWq+Hs7IzvvvsObdq0wcCBAzFr1iyeBsKAjh49igULFuCbb77BxYsXsXXrVuzevRsff/yxoUMjMkobNmzAvHnz8Ouvv8LZ2dnQ4dRJKpUKgwcPxrx58+Dr62vocKiAWq2GIAj45Zdf0K5dO/Tu3RvLli3D+vXra+yocR5yQbXCpEmTMGzYsHLrNGzYEEeOHMGpU6dgamqqtSwgIABDhgzB+vXrqzBKoifTdR0udP/+fXTr1g0dO3bEd999V8XREemvXr16kMvlSEhI0CpPSEiAq6urgaIi0t/YsWOxa9cuHD9+HJ6enoYOh0gnFy5cwIMHD9C6dWupTKVS4fjx41ixYgVycnIgl8sNGCFR7VeR30Kurq787VSFnuX36ZIlS7Bo0SIcOnQILVu2rMow6xR9++TGjRu4desWgoODpTK1Wg0AUCgUiIqKQqNGjao26DqgIp8VNzc3mJiYaP2+aNq0KeLj45GbmwulUlmlMdd2FemTjz76CO+++y5GjhwJAGjRogUyMjLw73//G7NmzYJMxvFy1e1J3/M2NjYcLW5gmzZtwsiRI/Hbb79xVhgDSktLw/nz53Hp0iWMHTsWgOZ7XhRFKBQKHDhwAN27dzdwlHWPm5sbPDw8YGtrK5U1bdoUoiji7t27aNy4sQGjqxh+A1Kt4OTkhOeff77ci1KpxFdffYXIyEhEREQgIiICe/bsAQBs3rwZn376qYFfBdVluq7DgGak+EsvvYQ2bdpg7dq13Jgho6RUKtGmTRscPnxYKlOr1Th8+DACAwMNGBmRbkRRxNixY7Ft2zYcOXIEDRo0MHRIRDp7+eWX8ddff0m/eSMiIqQDQSMiIpgUJ6oGFfktFBgYqFUfAA4ePMjfTpWkor9PFy9ejI8//hj79u1DQEBAdYRaZ+jbJ88//3yp77fXX38d3bp1Q0REBLy8vKoz/FqrIp+VTp06ITo6WjpQAQCuX78ONzc3JsUrQUX6JDMzs9T+osLfgKIoVl2w9ET8njdOGzduxPDhw7Fx40a89tprhg6nTrOxsSn1PT9q1Cg0adIEERERaN++vaFDrJM6deqE+/fvIz09XSq7fv06ZDJZjR1AwhHjVKd4e3tr3beysgIANGrUqMZ+iKluKUyK+/j4YMmSJUhMTJSWcSQJGZvQ0FCEhIQgICAA7dq1w/Lly5GRkYHhw4cbOjSipxozZgw2bNiAHTt2wNraWjq/q62tLY/mJ6NnbW2N5s2ba5VZWlrC0dGxVDkRVZ2n/RYaOnQoPDw8sHDhQgDAhAkT0LVrVyxduhSvvfYaNm3ahPPnz3OGqEqkb5989tlnmDNnDjZs2ID69etLvwesrKyk/Qn0bPTpEzMzs1LfY3Z2dgDA77dKpu9n5T//+Q9WrFiBCRMmYNy4cfjnn3+wYMECjB8/3pAvo1bRt0+Cg4OxbNkytGrVCu3bt0d0dDQ++ugjBAcH8yDJSpKeno7o6Gjp/s2bNxEREQEHBwd4e3tjxowZuHfvHn766ScAwKhRo7BixQpMnToV7733Ho4cOYJff/0Vu3fvNtRLqHX07ZMNGzYgJCQEX375Jdq3by99z5ubm2uNjqWK06dPZDJZqe9zZ2fnMr//qeL0/ZwMHjwYH3/8MYYPH4558+bh4cOHmDJlCt57770au3+MiXEiohrk4MGDiI6ORnR0dKmDOXjELxmbgQMHIjExEXPmzEF8fDz8/f2xb98+uLi4GDo0oqf69ttvAQAvvfSSVvnatWufeuoLIiIi4Om/hWJjY7VG83Xs2BEbNmzA7NmzMXPmTDRu3Bjbt2/njsBKpG+ffPvtt8jNzUX//v212gkLC8PcuXOrM/RaS98+oeqhb794eXlh//79+PDDD9GyZUt4eHhgwoQJmDZtmqFeQq2jb5/Mnj0bgiBg9uzZuHfvHpycnBAcHMwZMyvR+fPn0a1bN+l+aGgoACAkJATr1q1DXFwcYmNjpeUNGjTA7t278eGHH+LLL7+Ep6cnfvjhB/Ts2bPaY6+t9O2T7777Dvn5+RgzZgzGjBkjlRfWp2enb59Q1dO3T6ysrHDw4EGMGzcOAQEBcHR0xIABA/DJJ59Ue+yVRRCZSSEiIiIiIiIiIiIiIiIiolqMh1wSEREREREREREREREREVGtxsQ4ERERERERERERERERERHVakyMExERERERERERERERERFRrcbEOBERERERERERERERERER1WpMjBMRERERERERERERERERUa3GxDgREREREREREREREREREdVqTIwTEREREREREREREREREVGtxsQ4ERERERERERERERERERHVakyMExERVYOjR49CEAQkJycbOhS9CIKA7du3V1p79evXx/Llyyutvep269YtCIKAiIgIADW3X4mIiIiIiKi0qKgouLq6Ii0trdLaLLkdSYY3ffp0jBs3ztBhEBGRATAxTkRE9IwEQSj3MnfuXEOH+FRz586Fv79/qfK4uDi8+uqr1R+QERg2bBj69eunVebl5YW4uDg0b97cMEERERERERHVQWVtn1WFGTNmYNy4cbC2tpbKvv/+e/j5+cHKygp2dnZo1aoVFi5cWOWx6GLdunVl7ocwMzMzdGgGExcXh8GDB8PX1xcymQwTJ04sVWfy5MlYv349YmJiqj9AIiIyKCbGiYiInlFcXJx0Wb58OWxsbLTKJk+ebLDYcnNzn+nxrq6uMDU1raRoaj65XA5XV1coFApDh0JERERERESVKDY2Frt27cKwYcOksjVr1mDixIkYP348IiIiEB4ejqlTpyI9Pb1aYytv277kPoi4uDjcvn3bYPFUtrlz52r1ydPk5OTAyckJs2fPhp+fX5l16tWrh549e+Lbb7+tpCiJiKimYGKciIjoGbm6ukoXW1tbCIKgVWZlZSXVvXDhAgICAmBhYYGOHTsiKipKq60dO3agdevWMDMzQ8OGDTFv3jzk5+dLy2NjY9G3b19YWVnBxsYGAwYMQEJCgrS8cOT3Dz/8gAYNGkhHiScnJ2PkyJFwcnKCjY0NunfvjsjISACaI8znzZuHyMhI6ejydevWASg9lfrdu3cxaNAgODg4wNLSEgEBAThz5gwA4MaNG+jbty9cXFxgZWWFtm3b4tChQ3q9lyqVCqGhobCzs4OjoyOmTp2KkJAQrZEBZU3H7u/vrzUyf9myZWjRogUsLS3h5eWF0aNHa+24WLduHezs7LB//340bdoUVlZW6NWrF+Li4qT3cf369dixY4f0nhw9elSnKfBOnjyJzp07w9zcHF5eXhg/fjwyMjKk5d988w0aN24MMzMzuLi4oH///nq9R0RERERERKTt2LFjaNeuHUxNTeHm5obp06drbUunpaVhyJAhsLS0hJubG7744gu89NJLWqOJf/31V/j5+cHDw0Mq27lzJwYMGIARI0bgueeeQ7NmzTBo0CB8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mpoKNze3UpfCc4g/jS77DMoil8uxfft2pKeno23bthg5ciRmzZoFoPTp4AYNGgSFQoFBgwbpdaq4iipcPy5cuIANGzagVatW6N27t1adTZs24f3336/yWIiIyLgI4rOeTJOIiIioCg0bNgzJycnYvn27oUMhIiIiIiKiWiAjIwMeHh5YunQpRowYIZWvXLkSO3fuxP79+w0YXc0VHh6OF198EdHR0VoHsN+6dQuNGjXCuXPn9D6Avirs3bsXkyZNwp9//gmFgpPqEhHVJfyvT0RERERERERERES11qVLl3Dt2jW0a9cOKSkpmD9/PgCgb9++WvU++OADJCcnIy0tDdbW1oYItUbZtm0brKys0LhxY0RHR2PChAno1KmTlBTPy8vDo0ePMHv2bHTo0MEokuKA5sCItWvXMilORFQH8T8/EREREREREREREdVqS5YsQVRUFJRKJdq0aYMTJ06gXr16WnUUCoU0HTg9XVpaGqZNm4bY2FjUq1cPQUFBWLp0qbQ8PDwc3bp1g6+vL7Zs2WLASLX179/f0CEQEZGBcCp1IiIiIiIiIiIiIiIiIiKq1WSGDoCIiIiIiIiIiIiIiIiIiKgqMTFORERERERERERERERERES1GhPjRERERERERERERERERERUqzExTkREREREREREREREREREtRoT40REREREREREREREREREVKsxMU5ERERERERERERERERERLUaE+NERERERERERERERERERFSrMTFORERERERERERERERERES12v8DbQsKqe9tsaoAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 2000x1200 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAJOCAYAAABYwk4SAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC8MUlEQVR4nOzdd3hUZfr/8U9EBVFB3RWwsGJFbIjY0F2x4Npd9ufq6u6Kupa1oa5twbViwbUhoiKggIgUUYpI7zXUEEgogUAaqZCQ3pP5/cGXSEgmmXLOeWbmvF/XlUuZOXOeO5Mp59znee47yuPxeAQAAAAAAAAAABo4zHQAAAAAAAAAAACEKpLoAAAAAAAAAAB4QRIdAAAAAAAAAAAvSKIDAAAAAAAAAOAFSXQAAAAAAAAAALwgiQ4AAAAAAAAAgBck0QEAAAAAAAAA8IIkOgAAAAAAAAAAXpBEBwAAAAAAAADAC5LoAAAAsM21116ra6+91nQYrpCcnKyoqCiNHj3a8XHefPNNRUVF2TquN1FRUXrzzTeNjA0AAAB3IIkOAADgMnFxcfrLX/6i0047Ta1atdIpp5yiG2+8UUOGDDEdmleLFy9WVFSUTz8IbdOnT1fPnj3Vrl07tW7dWmeccYbuuecezZ4923RoTTpw8cDbz/vvv286RAAAANjkcNMBAAAAwDkrV67Uddddp9/97nd69NFH1aFDB6WlpWnVqlUaPHiw+vbta+l4c+fOtWQ/Xbp00XfffVfvtv79++uYY47Rf//7X0vGQOBeffVV9evXr9ntPvroI7300kvq2bOn+vfvr9atWysxMVHz58/XhAkTdPPNNzsQbXDuu+8+3XrrrQ1u79atm4FoAAAA4ASS6AAAAC7y7rvvqm3btlq7dq2OO+64evfl5ORYNk5paalat26tI4880pL9tW/fXv/4xz/q3fb+++/rt7/9bYPbI0V5ebmOPPJIHXZY6C8ePfzww3X44U2fWlRXV+vtt9/WjTfe2OjFFStff4EqKSnR0Ucf3eQ2l1xySUi85qqrq1VbW2vZewwAAADehf4ROQAAACyzc+dOnX/++Q0S6JLUrl27BreNHTtW3bt311FHHaUTTjhB9957r9LS0uptc+211+qCCy7Q+vXrdc0116h169Z65ZVX6u47tCZ6RUWF3njjDZ111llq2bKlOnbsqJdfflkVFRVB/375+fl67rnn1LFjR7Vs2VJnnXWW/ve//6m2trZumwNlOT766CN98cUXOuOMM9S6dWv98Y9/VFpamjwej95++22deuqpOuqoo/SnP/1JeXl59cbp1KmTbr/9ds2dO1cXX3yxWrVqpfPOO0+TJ09uENOuXbt0991364QTTlDr1q115ZVXasaMGfW2OVCuZsKECXr11Vd1yimnqHXr1iosLFReXp5efPFFXXjhhTrmmGPUpk0b3XLLLdq4caNPz8m2bdv0l7/8RSeccIJatWqlSy+9VD///LPPz+eDDz6otm3b6rjjjtMDDzyg/Pz8Btv5UhN97969Kiws1NVXX93o/Ye+/nJycvTwww+rffv2atWqlbp27apvv/222ZhTUlL05JNPqnPnzjrqqKP0m9/8RnfffbeSk5PrbTd69GhFRUVpyZIlevLJJ9WuXTudeuqpze7fFwdeH8uXL9fll1+uVq1a6YwzztCYMWMabOvva/bTTz/VmWeeqZYtW2rLli2S9r9+Lr30UrVq1Upnnnmmhg0b1uBv0rNnT3Xt2rXReDt37qybbrrJkt8dAAAgEjETHQAAwEVOO+00RUdHKz4+XhdccEGT27777rt67bXXdM899+iRRx7Rnj17NGTIEF1zzTXasGFDvUR8bm6ubrnlFt177736xz/+ofbt2ze6z9raWt15551avny5HnvsMXXp0kVxcXEaNGiQtm/frqlTpwb8u5WWlqpnz55KT0/Xv/71L/3ud7/TypUr1b9/f2VmZurTTz+tt/3333+vyspK9e3bV3l5efrggw90zz336Prrr9fixYv1n//8R4mJiRoyZIhefPFFjRw5st7jd+zYob/+9a96/PHH9cADD2jUqFG6++67NXv2bN14442SpOzsbF111VUqLS3VM888o9/85jf69ttvdeedd+rHH3/Un//853r7fPvtt3XkkUfqxRdfVEVFhY488kht2bJFU6dO1d13363TTz9d2dnZGjZsmHr27KktW7bo5JNP9vqcbN68WVdffbVOOeUU9evXT0cffbR++OEH9e7dWz/99FOD8Q/m8Xj0pz/9ScuXL9fjjz+uLl26aMqUKXrggQf8/Mvs165dOx111FGaPn26+vbtqxNOOMHrtmVlZbr22muVmJiop59+WqeffromTZqkBx98UPn5+Xr22We9Pnbt2rVauXKl7r33Xp166qlKTk7W0KFDde2112rLli1q3bp1ve2ffPJJnXjiiXr99ddVUlLS7O9RWlqqvXv3Nrj9uOOOqzcbPzExUX/5y1/08MMP64EHHtDIkSP14IMPqnv37jr//PPr9uXPa3bUqFEqLy/XY489ppYtW+qEE07Qhg0bdPPNN+ukk07SW2+9pZqaGg0YMEAnnnhivcfef//9evTRRxu899euXavt27fr1VdfbfZ3BwAAcC0PAAAAXGPu3LmeFi1aeFq0aOHp0aOH5+WXX/bMmTPHU1lZWW+75ORkT4sWLTzvvvtuvdvj4uI8hx9+eL3be/bs6ZHk+eqrrxqM17NnT0/Pnj3r/v3dd995DjvsMM+yZcvqbffVV195JHlWrFjh8+9y/vnn19v322+/7Tn66KM927dvr7ddv379PC1atPCkpqZ6PB6PJykpySPJc+KJJ3ry8/Prtuvfv79Hkqdr166eqqqqutvvu+8+z5FHHukpLy+vu+20007zSPL89NNPdbcVFBR4TjrpJE+3bt3qbnvuuec8kur9vkVFRZ7TTz/d06lTJ09NTY3H4/F4Fi1a5JHkOeOMMzylpaX14i8vL6/b7oCkpCRPy5YtPQMGDKh3myTPqFGj6m674YYbPBdeeGG92Gtraz1XXXWV5+yzz27kWf3V1KlTPZI8H3zwQd1t1dXVnj/84Q8NxnnjjTc8vpxavP766x5JnqOPPtpzyy23eN59913P+vXrG2z36aefeiR5xo4dW3dbZWWlp0ePHp5jjjnGU1hYWHe7JM8bb7xR9+9Dnz+Px+OJjo72SPKMGTOm7rZRo0Z5JHl+//vfe6qrq5uN/cDz6+0nOjq6btsDr4+lS5fW3ZaTk+Np2bKl54UXXqi7zd/XbJs2bTw5OTn1tr3jjjs8rVu39qSnp9fdtmPHDs/hhx9e72+Sn5/vadWqlec///lPvcc/88wznqOPPtpTXFzc7HMAAADgVpRzAQAAcJEbb7xR0dHRuvPOO7Vx40Z98MEHuummm3TKKafUK/ExefJk1dbW6p577tHevXvrfjp06KCzzz5bixYtqrffli1b6qGHHmp2/EmTJqlLly4699xz6+33+uuvl6QG+/XHpEmT9Ic//EHHH398vX336tVLNTU1Wrp0ab3t7777brVt27bu31dccYUk6R//+Ee9GcVXXHGFKisrlZ6eXu/xJ598cr2Z3G3atFGfPn20YcMGZWVlSZJmzpypyy+/XL///e/rtjvmmGP02GOPKTk5ua4cxwEPPPCAjjrqqHq3tWzZsq4uek1NjXJzc3XMMceoc+fOiomJ8fp85OXlaeHChbrnnntUVFRU93zk5ubqpptu0o4dOxr8TgebOXOmDj/8cD3xxBN1t7Vo0SKo5rNvvfWWxo0bp27dumnOnDn673//q+7du+uSSy7R1q1b643doUMH3XfffXW3HXHEEXrmmWdUXFysJUuWeB3j4OevqqpKubm5Ouuss3Tcccc1+nw9+uijatGihc+/w2OPPaZ58+Y1+DnvvPPqbXfeeefpD3/4Q92/TzzxRHXu3Fm7du2qu83f1+xdd91Vb4Z5TU2N5s+fr969e9dbkXDWWWfplltuqffYtm3b6k9/+pPGjx8vj8dT9/iJEyeqd+/ezdaCBwAAcDPKuQAAALjMZZddpsmTJ6uyslIbN27UlClTNGjQIP3lL39RbGyszjvvPO3YsUMej0dnn312o/s44ogj6v37lFNO8anB4Y4dO7R169YGpSYOCKa55I4dO7Rp0yaf9/273/2u3r8PJNQ7duzY6O379u2rd/tZZ53VoA74OeecI2l/DesOHTooJSWlLjl/sC5dukjaX7/74NIap59+eoNta2trNXjwYH355ZdKSkpSTU1N3X2/+c1vGvlN90tMTJTH49Frr72m1157rdFtcnJydMoppzR6X0pKik466SQdc8wx9W7v3Lmz1zF9cd999+m+++5TYWGhVq9erdGjR2vcuHG64447FB8fr1atWiklJUVnn312g6aqBz9v3pSVlWngwIEaNWqU0tPT6xLGklRQUNBg+8ae86acffbZ6tWrV7PbHfr6kqTjjz++3uvI39fsobHm5OSorKxMZ511VoPHNnZbnz59NHHiRC1btkzXXHON5s+fr+zsbN1///3N/j4AAABuRhIdAADApY488khddtlluuyyy3TOOefooYce0qRJk/TGG2+otrZWUVFRmjVrVqOzdA9NrB46e9qb2tpaXXjhhfrkk08avf/QBLY/amtrdeONN+rll19u9P4DCe4DvM0+9nb7wclYuzT2PL733nt67bXX9M9//lNvv/22TjjhBB122GF67rnn6jWfPNSB+1588UWvTSMbS7Q6pU2bNrrxxht144036ogjjtC3336r1atXq2fPnkHtt2/fvho1apSee+459ejRQ23btlVUVJTuvffeRp8vX1+7/vLldeTvazbYWG+66Sa1b99eY8eO1TXXXKOxY8eqQ4cOPl0UAAAAcDOS6AAAANCll14qScrMzJQknXnmmfJ4PDr99NMbJPKCceaZZ2rjxo264YYbGszitmLfxcXFjiUED8z0Pvj32L59uySpU6dOkvY3ck1ISGjw2G3bttXd35wff/xR1113nb755pt6t+fn5+u3v/2t18edccYZkvavGgjkOTnttNO0YMECFRcX17to0tjvE6xLL71U3377bd3r77TTTtOmTZtUW1tbbza6L8/bjz/+qAceeEAff/xx3W3l5eXKz8+3PO5gBfuabdeunVq1aqXExMQG9zV2W4sWLfS3v/1No0eP1v/+9z9NnTrV73I2AAAAbkRNdAAAABdZtGhRozOqZ86cKenXUh3/7//9P7Vo0UJvvfVWg+09Ho9yc3MDGv+ee+5Renq6RowY0eC+srIylZSUBLTfA/uOjo7WnDlzGtyXn5+v6urqgPfdmIyMDE2ZMqXu34WFhRozZowuvvhidejQQZJ06623as2aNYqOjq7brqSkRMOHD1enTp0a1NFuTIsWLRr8DSZNmtRkPXNpf4L12muv1bBhw+qS0wfbs2dPk4+/9dZbVV1draFDh9bdVlNToyFDhjQbc2NKS0vrPQ8HmzVrlqRfX3+33nqrsrKyNHHixLptqqurNWTIEB1zzDFNzlZv7PkaMmRIvTI4oSLY12yLFi3Uq1cvTZ06VRkZGXW3JyYm1j2nh7r//vu1b98+/etf/1JxcbH+8Y9/BPdLAAAAuAAz0QEAAFykb9++Ki0t1Z///Gede+65qqys1MqVKzVx4kR16tSprjnomWeeqXfeeUf9+/dXcnKyevfurWOPPVZJSUmaMmWKHnvsMb344ot+j3///ffrhx9+0OOPP65Fixbp6quvVk1NjbZt26YffvhBc+bMqZsV76+XXnpJP//8s26//XY9+OCD6t69u0pKShQXF6cff/xRycnJTc7c9tc555yjhx9+WGvXrlX79u01cuRIZWdna9SoUXXb9OvXT+PHj9ctt9yiZ555RieccIK+/fZbJSUl6aeffmpQ87sxt99+uwYMGKCHHnpIV111leLi4vT999/XzTRvyhdffKHf//73uvDCC/Xoo4/qjDPOUHZ2tqKjo7V7925t3LjR62PvuOMOXX311erXr5+Sk5N13nnnafLkyY3WFfdFaWmprrrqKl155ZW6+eab1bFjR+Xn52vq1KlatmyZevfurW7dukna37xz2LBhevDBB7V+/Xp16tRJP/74o1asWKFPP/1Uxx57rNdxbr/9dn333Xdq27atzjvvPEVHR2v+/PlN1o/3R0xMjMaOHdvg9jPPPFM9evTwa19WvGbffPNNzZ07V1dffbWeeOIJ1dTU6PPPP9cFF1yg2NjYBtt369ZNF1xwQV2T30suucSvmAEAANyIJDoAAICLfPTRR5o0aZJmzpyp4cOHq7KyUr/73e/05JNP6tVXX9Vxxx1Xt22/fv10zjnnaNCgQXrrrbck7a9Z/sc//lF33nlnQOMfdthhmjp1qgYNGqQxY8ZoypQpat26tc444ww9++yzQZWOad26tZYsWaL33ntPkyZN0pgxY9SmTRudc845euutt+oahFrl7LPP1pAhQ/TSSy8pISFBp59+uiZOnFiv/nj79u21cuVK/ec//9GQIUNUXl6uiy66SNOnT9dtt93m0zivvPKKSkpKNG7cOE2cOFGXXHKJZsyYoX79+jX72PPOO0/r1q3TW2+9pdGjRys3N1ft2rVTt27d9Prrrzf52MMOO0w///yznnvuOY0dO1ZRUVG688479fHHH9clu/1x3HHHacSIEZoxY4ZGjRqlrKwstWjRQp07d9aHH36oZ555pm7bo446SosXL1a/fv307bffqrCwUJ07d9aoUaP04IMPNjnO4MGD1aJFC33//fcqLy/X1Vdfrfnz53utC++v8ePHa/z48Q1uf+CBB/xOolvxmu3evbtmzZqlF198Ua+99po6duyoAQMGaOvWrXXlbw7Vp08fvfzyyzQUBQAA8FGUx4kOSQAAAEAE6dSpky644AL98ssvpkMBGtW7d29t3rxZO3bsaHDf4MGD9e9//1vJycn63e9+ZyA6AACA8EJNdAAAAAAIY2VlZfX+vWPHDs2cOVPXXnttg209Ho+++eYb9ezZkwQ6AACAjyjnAgAAAABh7IwzztCDDz6oM844QykpKRo6dKiOPPJIvfzyy3XblJSU6Oeff9aiRYsUFxenadOmGYwYAAAgvJBEBwAAAIAwdvPNN2v8+PHKyspSy5Yt1aNHD7333ns6++yz67bZs2eP/va3v+m4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",
"text/plain": [
"<Figure size 1500x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABFHUlEQVR4nO3dfZRVZcE+4PsM8pkySHyKkyhafouCEJqihpBSilliViCWmfmVWK/gL0FNHVMzTC3KUislzTQrPzAl9TWl7AUxU7NIEdQASRsUbEZnzu+PlpMToDM47MnxutY6a8159rP3vvfMWal3ez+nVC6XywEAAACAAlW0dQAAAAAA3nmUUgAAAAAUTikFAAAAQOGUUgAAAAAUTikFAAAAQOGUUgAAAAAUTikFAAAAQOGUUgAAAAAUTikFAAAAQOGUUgBAiw0cODBHHnlk4/u77747pVIpd999d5tlaktXXXVVSqVSFi1a1Di2zz77ZJ999tng5/7P8yxatCilUilXXXXVBj/3fzryyCMzcODAws8LALw9KaUA4G3qtSKkVCrlN7/5zRrby+VyqqqqUiqV8uEPf7gNEq6/10quUqmUq6++eq1z9txzz5RKpey4444Fp2s/Fi1alEmTJmXQoEHp0qVL+vXrl7333jvTp09v62hvap999mn8jPzna9ttt23reABAM2zU1gEAgLemS5cumTVrVj7wgQ80Gb/nnnvy9NNPp3Pnzhs8w957752XX345nTp1atXjvnZtn/rUp5qML1q0KPfff3+6dOnSqudbX5/+9Kdz+OGHF/K7fjNbbLFFXn755XTs2PEN5y1cuDC77757unbtmqOOOioDBw7M3/72t8yfPz9f+9rXcuaZZxaUeP1tvvnmqa6uXmO8srKyDdIAAC2llAKAt7kDDzww119/fb75zW9mo43+/Y/2WbNmZciQIVmxYsUGz1BRUbFBCqIDDzwwv/jFL7JixYr06tWrcXzWrFnp27dvttlmm7zwwgutft6W6tChQzp06NDWMZIkpVKpWX+Lb3zjG3nppZeyYMGCbLHFFk22LV++fEPFa7aGhobU1dW94bVUVlauUVi2ldWrV6dbt25tHQMA3lY8vgcAb3Of+MQn8ve//z133HFH41hdXV1++tOf5ogjjljrPg0NDZkxY0Z22GGHdOnSJX379s0xxxyzRsFTLpdz9tlnZ/PNN0+3bt2y77775pFHHlnjeGtbU+ree+/Nxz/+8bznPe9J586dU1VVlZNPPjkvv/xys6/t4IMPTufOnXP99dc3GZ81a1YOO+ywdRZBV199dYYMGZKuXbumZ8+eOfzww7NkyZImc/bZZ5/suOOOefTRR7PvvvumW7duGTBgQM4///w1jnfJJZdkhx12SLdu3bLppptm6NChmTVrVuP2ta0ptTa1tbWZPn16tt5668bfyf/8z/+ktra2Wb+P7373uxk0aFC6du2aYcOG5d57711jTnPXlPrrX/+azTfffI1CKkn69Omzxti3vvWt7LDDDuncuXM222yzHHfccfnHP/7xppkvvPDC7LHHHnn3u9+drl27ZsiQIfnpT3+6xrxSqZTjjz8+11xzTeN5Zs+e/abHfzNnnHFGSqVSFi5cmCOPPDI9evRIZWVlJk2alNWrV68xvyWfnXnz5mXvvfdOt27dctpppyVJ/v73v+fTn/50unfvnh49emTixIl56KGHmvxNrrzyypRKpTz44INrnP/cc89Nhw4d8swzz7zlaweA/3ZKKQB4mxs4cGBGjBiRH//4x41jt912W2pqanL44YevdZ9jjjkmX/7yl7Pnnnvm4osvzqRJk3LNNddkzJgxeeWVVxrnTZs2Laeffnp22WWXXHDBBdlqq60yevTorFq16k1zXX/99Vm9enWOPfbYXHLJJRkzZkwuueSSTJgwodnX1q1btxx88MFNru2hhx7KI488ss7C7ZxzzsmECROyzTbb5KKLLsoXv/jFzJkzJ3vvvfcaJcoLL7yQD33oQ9lll13y9a9/Pdtuu21OPfXU3HbbbY1zLr/88px44onZfvvtM2PGjJx55pkZPHhwfve73zX7OpJ/FYEHHXRQLrzwwnzkIx/JJZdcknHjxuUb3/hGxo8f/6b7f//7388xxxyTfv365fzzz8+ee+6Zgw46aI3CpLm22GKLLFmyJL/+9a/fdO4ZZ5yR4447Lptttlm+/vWv59BDD813vvOdjB49usnnZW0uvvji7LrrrjnrrLNy7rnnZqONNsrHP/7x3HLLLWvM/fWvf52TTz4548ePz8UXX/ymi6bX19dnxYoVa7zW9vk87LDD8uKLL6a6ujqHHXZYrrrqqjUeUWzJZ+fvf/97DjjggAwePDgzZszIvvvum4aGhnzkIx/Jj3/840ycODHnnHNO/va3v2XixIlN9v3Yxz6Wrl275pprrlkj5zXXXJN99tknAwYMeMNrB4B2oQwAvC1deeWV5STl3//+9+VLL720vMkmm5RXr15dLpfL5Y9//OPlfffdt1wul8tbbLFFeezYsY373XvvveUk5WuuuabJ8WbPnt1kfPny5eVOnTqVx44dW25oaGicd9ppp5WTlCdOnNg4dtddd5WTlO+6667GsdeyvF51dXW5VCqVn3rqqTe8tteOd/3115dvvvnmcqlUKi9evLhcLpfLX/7yl8tbbbVVuVwul0eOHFneYYcdGvdbtGhRuUOHDuVzzjmnyfEefvjh8kYbbdRkfOTIkeUk5R/+8IeNY7W1teV+/fqVDz300Maxgw8+uMk51ua1v8WTTz7Z5PgjR45sfP+jH/2oXFFRUb733nub7Dtz5sxykvJ99923zuPX1dWV+/TpUx48eHC5tra2cfy73/1uOUmT8zz55JPlJOUrr7zyDTP/8Y9/LHft2rWcpDx48ODySSedVL7pppvKq1atajLvtc/B6NGjy/X19Y3jl156aTlJ+YorrmgcmzhxYnmLLbZosv9/fg7q6urKO+64Y3m//fZrMp6kXFFRUX7kkUfeMPdrXvv7re11zDHHNM6bPn16OUn5qKOOarL/IYccUn73u9/d+H59PjszZ85sMveGG24oJynPmDGjcay+vr683377rfE3+cQnPlHebLPNmvxO58+f36y/HQC0F+6UAoB24LDDDsvLL7+cm2++OS+++GJuvvnmdd5JdP3116eysjL7779/k7tLhgwZko033jh33XVXkuTOO+9MXV1dTjjhhJRKpcb9v/jFLzYrU9euXRt/XrVqVVasWJE99tgj5XJ5rY8trcvo0aPTs2fPXHvttSmXy7n22mvziU98Yq1zb7zxxjQ0NOSwww5rcm39+vXLNtts03htr9l4442brEnUqVOnDBs2LE888UTjWI8ePfL000/n97//fbMzr83111+f7bbbLttuu22TbPvtt1+SrJHt9f7v//4vy5cvz+c///kmi8kfeeSR672o9w477JAFCxbkU5/6VBYtWpSLL74448aNS9++fXP55Zc3znvtc/DFL34xFRX//lfHo48+Ot27d1/rHU+v9/rPwQsvvJCamprstddemT9//hpzR44cme23377Z1zBw4MDccccda7zW9hn9/Oc/3+T9Xnvtlb///e9ZuXJlkpZ/djp37pxJkyY1GZs9e3Y6duyYo48+unGsoqIixx133Bp5JkyYkGeffbbJca+55pp07do1hx56aLN/BwDwdmahcwBoB3r37p1Ro0Zl1qxZWb16derr6/Oxj31srXP/8pe/pKamZq3rBiX/XuT6qaeeSpJss802a5xr0003fdNMixcvzrRp0/KLX/xijbWqampq3nT/13Ts2DEf//jHM2vWrAwbNixLlixZZ+H2l7/8JeVyeY3Mrz/W622++eZNCrck2XTTTfOHP/yh8f2pp56aO++8M8OGDcvWW2+d0aNH54gjjsiee+7Z7Gt4Ldtjjz2W3r17r3X7Gy0uvq6/RceOHbPVVlu1KMfrvfe9782PfvSj1NfX59FHH83NN9+c888/P5/73Oey5ZZbZtSoUY3nft/73tdk306dOmWrrbZq3L4uN998c84+++wsWLCgydpZ//l7T5Itt9yyRfnf9a53ZdSoUc2a+573vKfJ+9c+wy+88EK6d+/e4s/OgAED1vi2yaeeeir9+/dfY8Hzrbfeeo3j7b///unfv3+uueaafPCDH0xDQ0N+/OMf5+CDD84mm2zSrGsCgLc7pRQAtBNHHHFEjj766CxdujQHHHBAevTosdZ5DQ0N6dOnz1rXs0myztKkJerr67P//vvn+eefz6mnnpptt90273rXu/LMM8/kyCOPTENDQ4uOd8QRR2TmzJk544wzsssuu6zzbpqGhoaUSqXcdttta10EfeONN27yfl0LpZfL5caft9tuuzz++OO5+eabM3v27Nxwww351re+lWnTpq2xJtEbaWhoyE477ZSLLrpordurqqqafazW1qFDh+y0007ZaaedMmLEiOy777655pprml34rMu9996bgw46KHvvvXe+9a1vpX///unYsWOuvPLKJgvFv+b1d1W1tjf7W7f0s/NWs3bo0CFHHHFELr/88nzrW9/Kfffdl2efffa/5tsEAaAISikAaCcOOeSQHHPMMfntb3+b6667bp3zBg0alDvvvDN77rnnG/6H9WvfyvaXv/ylyd04zz333Bp3Pv2nhx9+OH/+85/zgx/8oMnC5q//hsCW+MAHPpD3vOc9ufvuu/O1r31tnfMGDRqUcrmcLbfcMu9973vX61xr8653vSvjx4/P+PHjU1dXl49+9KM555xzMnXq1HTp0qVZxxg0aFAeeuihfPCDH1zrXUJv5PV/i9ce90uSV155JU8++WR22WWXFh3vjQwdOjRJ8re//a3JuR9//PEmn4O6uro8+eSTb1hc3XDDDenSpUtuv/32dO7cuXH8yiuvbLW8raU1PjtbbLFF7rrrrqxevbrJ3VILFy5c6/wJEybk61//en75y1/mtttuS+/evTNmzJj1OjcAvB1ZUwoA2omNN9443/72t3PGGWfkIx/5yDrnHXbYYamvr89Xv/rVNba9+uqrjd8yNmrUqHTs2DGXXHJJkzuHZsyY8aZZXrvT5PX7lcvlXHzxxc28mqZKpVK++c1vZvr06fn0pz+9znkf/ehH06FDh5x55plNzv3a+f/+97+3+Nz/uU+nTp2y/fbbp1wuv+k3z73eYYcdlmeeeabJek2vefnll9/wGw2HDh2a3r17Z+bMmamrq2scv+qqq9b4Vrjmuvfee9ea/9Zbb03y78f1Ro0alU6dOuWb3/xmk9/p97///dTU1GTs2LHrPEeHDh1SKpVSX1/fOLZo0aLcdNNN65V5Q2qNz85r3175+r9xQ0NDLrvssrXO33nnnbPzzjvne9/7Xm644YYcfvjh2Wgj/58xAO8c/qkHAO3If371/NqMHDkyxxxzTKqrq7NgwYKMHj06HTt2zF/+8pdcf/31ufjii/Oxj30svXv3zpe+9KVUV1fnwx/+cA488MA8+OCDue2229KrV683PMe2226bQYMG5Utf+lKeeeaZdO/ePTfccMOb3mH1Rg4++OAcfPDBbzhn0KBBOfvsszN16tQsWrQo48aNyyabbJInn3wyP/vZz/K5z30uX/rSl1p03tGjR6dfv37Zc88907dv3zz22GO59NJLM3bs2Bat/fPpT386P/nJT/L5z38+d911V/bcc8/U19fnT3/6U37yk5/k9ttvb7xL6T917NgxZ599do455pjst99+GT9+fJ588slceeWV672m1Ne+9rXMmzcvH/3oR7PzzjsnSebPn58f/vCH6dmzZ+Ni4b17987UqVNz5pln5kMf+lAOOuigPP744/nWt76V3Xff/Q0fNxs7dmwuuuiifOhDH8oRRxyR5cuX57LLLsvWW2/dZN2u9VVTU5Orr756rdta+hhca3x2xo0bl2HDhuWUU07JwoULs+222+YXv/hFnn/++SRrX0drwoQJjcf16B4A7zRKKQB4B5o5c2aGDBmS73znOznttNOy0UYbZeDAgfnUpz7VZAHvs88+O126dMnMmTNz1113Zfjw4fnVr371hnfHJP8qUX75y1/mxBNPTHV1dbp06ZJDDjkkxx9/fKs+arY2U6ZMyXvf+9584xvfaFzzqaqqKqNHj85BBx3U4uMdc8wxueaaa3LRRRflpZdeyuabb54TTzwxX/nKV1p0nIqKitx00035xje+kR/+8If52c9+lm7dumWrrbbKSSed9KaPjH3uc59LfX19Lrjggnz5y1/OTjvtlF/84hc5/fTTW3xNSXLaaadl1qxZueeee3LNNddk9erV6d+/fw4//PCcfvrpTRYdP+OMM9K7d+9ceumlOfnkk9OzZ8987nOfy7nnnrvGAuCvt99+++X73/9+zjvvvHzxi1/Mlltuma997WtZtGhRq5RSTz/99DrvnFufguetfnY6dOiQW265JSeddFJ+8IMfpKKiIoccckimT5+ePffcc62Pen7yk5/MqaeemkGDBmXYsGEtzgwAb2el8n/enwwAALSam266KYccckh+85vfrPGtjStWrEj//v0zbdq09S4YAeDtyppSAADQSl5++eUm7+vr63PJJZeke/fu2W233daYf9VVV6W+vv4N10oDgPbK43sAANBKTjjhhLz88ssZMWJEamtrc+ONN+b+++/Pueee2+TbLn/961/n0UcfzTnnnJNx48Zl4MCBbRcaANqIx/cAAKCVzJo1K1//+tezcOHC/POf/8zWW2+dY489Nscff3yTefvss0/uv//+7Lnnnrn66qszYMCANkoMAG1HKQUAAABA4awpBQAAAEDhlFIAAAAAFO4dt9B5Q0NDnn322WyyySYplUptHQcAAACgXSmXy3nxxRez2WabpaJi3fdDveNKqWeffTZVVVVtHQMAAACgXVuyZEk233zzdW5/x5VSm2yySZJ//WK6d+/exmkAAAAA2peVK1emqqqqsYNZl3dcKfXaI3vdu3dXSgEAAABsIG+2bJKFzgEAAAAonFIKAAAAgMIppQAAAAAonFIKAAAAgMIppQAAAAAonFIKAAAAgMIppQAAAAAonFIKAAAAgMIppQAAAAAonFIKAAAAgMIppQAAAAAonFIKAAAAgMIppQAAAAAonFIKAAAAgMIppQAAAAAonFIKAAAAgMIppQAAAAAonFIKAAAAgMIppQAAAAAonFIKAAAAgMIppQAAAAAonFIKAAAAgMJt1NYBANqTgVNuaesIAADNtui8sW0dAXgHc6cUAAAAAIVTSgEAAABQOKUUAAAAAIVTSgEAAABQOKUUAAAAAIVTSgEAAABQOKUUAAAAAIVTSgEAAABQOKUUAAAAAIVTSgEAAABQOKUUAAAAAIVTSgEAAABQOKUUAAAAAIVTSgEAAABQOKUUAAAAAIVTSgEAAABQOKUUAAAAAIVTSgEAAABQOKUUAAAAAIVTSgEAAABQOKUUAAAAAIVTSgEAAABQOKUUAAAAAIVTSgEAAABQOKUUAAAAAIVTSgEAAABQOKUUAAAAAIVTSgEAAABQOKUUAAAAAIVTSgEAAABQOKUUAAAAAIVTSgEAAABQOKUUAAAAAIVr81Lqsssuy8CBA9OlS5cMHz48DzzwwBvO/8c//pHjjjsu/fv3T+fOnfPe9743t956a0FpAQAAAGgNG7Xlya+77rpMnjw5M2fOzPDhwzNjxoyMGTMmjz/+ePr06bPG/Lq6uuy///7p06dPfvrTn2bAgAF56qmn0qNHj+LDAwAAALDe2rSUuuiii3L00Udn0qRJSZKZM2fmlltuyRVXXJEpU6asMf+KK67I888/n/vvvz8dO3ZMkgwcOLDIyAAAAAC0gjZ7fK+uri7z5s3LqFGj/h2moiKjRo3K3Llz17rPL37xi4wYMSLHHXdc+vbtmx133DHnnntu6uvri4oNAAAAQCtoszulVqxYkfr6+vTt27fJeN++ffOnP/1prfs88cQT+fWvf51PfvKTufXWW7Nw4cJ84QtfyCuvvJLp06evdZ/a2trU1tY2vl+5cmXrXQQAAAAA66XNFzpviYaGhvTp0yff/e53M2TIkIwfPz7/7//9v8ycOXOd+1RXV6eysrLxVVVVVWBiAAAAANamzUqpXr16pUOHDlm2bFmT8WXLlqVfv35r3ad///5573vfmw4dOjSObbfddlm6dGnq6urWus/UqVNTU1PT+FqyZEnrXQQAAAAA66XNSqlOnTplyJAhmTNnTuNYQ0ND5syZkxEjRqx1nz333DMLFy5MQ0ND49if//zn9O/fP506dVrrPp07d0737t2bvAAAAABoW236+N7kyZNz+eWX5wc/+EEee+yxHHvssVm1alXjt/FNmDAhU6dObZx/7LHH5vnnn89JJ52UP//5z7nlllty7rnn5rjjjmurSwAAAABgPbTZQudJMn78+Dz33HOZNm1ali5dmsGDB2f27NmNi58vXrw4FRX/7s2qqqpy++235+STT87OO++cAQMG5KSTTsqpp57aVpcAAAAAwHoolcvlcluHKNLKlStTWVmZmpoaj/IBrW7glFvaOgIAQLMtOm9sW0cA2qHmdi9vq2/fAwAAAKB9UEoBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAULj/ilLqsssuy8CBA9OlS5cMHz48DzzwwDrnXnXVVSmVSk1eXbp0KTAtAAAAAG9Vm5dS1113XSZPnpzp06dn/vz52WWXXTJmzJgsX758nft07949f/vb3xpfTz31VIGJAQAAAHir2ryUuuiii3L00Udn0qRJ2X777TNz5sx069YtV1xxxTr3KZVK6devX+Orb9++BSYGAAAA4K1q01Kqrq4u8+bNy6hRoxrHKioqMmrUqMydO3ed+7300kvZYostUlVVlYMPPjiPPPLIOufW1tZm5cqVTV4AAAAAtK02LaVWrFiR+vr6Ne506tu3b5YuXbrWfd73vvfliiuuyM9//vNcffXVaWhoyB577JGnn356rfOrq6tTWVnZ+Kqqqmr16wAAAACgZdr88b2WGjFiRCZMmJDBgwdn5MiRufHGG9O7d+985zvfWev8qVOnpqampvG1ZMmSghMDAAAA8J82asuT9+rVKx06dMiyZcuajC9btiz9+vVr1jE6duyYXXfdNQsXLlzr9s6dO6dz585vOSsAAAAAradN75Tq1KlThgwZkjlz5jSONTQ0ZM6cORkxYkSzjlFfX5+HH344/fv331AxAQAAAGhlbXqnVJJMnjw5EydOzNChQzNs2LDMmDEjq1atyqRJk5IkEyZMyIABA1JdXZ0kOeuss/L+978/W2+9df7xj3/kggsuyFNPPZXPfvazbXkZAAAAALRAm5dS48ePz3PPPZdp06Zl6dKlGTx4cGbPnt24+PnixYtTUfHvG7peeOGFHH300Vm6dGk23XTTDBkyJPfff3+23377troEAAAAAFqoVC6Xy20dokgrV65MZWVlampq0r1797aOA7QzA6fc0tYRAACabdF5Y9s6AtAONbd7edt9+x4AAAAAb39KKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKp5QCAAAAoHBKKQAAAAAKt9H67LRq1arcc889Wbx4cerq6ppsO/HEE1slGAAAAADtV4tLqQcffDAHHnhgVq9enVWrVqVnz55ZsWJFunXrlj59+iilAAAAAHhTLX587+STT85HPvKRvPDCC+natWt++9vf5qmnnsqQIUNy4YUXboiMAAAAALQzLS6lFixYkFNOOSUVFRXp0KFDamtrU1VVlfPPPz+nnXbahsgIAAAAQDvT4lKqY8eOqaj41259+vTJ4sWLkySVlZVZsmRJ66YDAAAAoF1q8ZpSu+66a37/+99nm222yciRIzNt2rSsWLEiP/rRj7LjjjtuiIwAAAAAtDMtvlPq3HPPTf/+/ZMk55xzTjbddNMce+yxee655/Ld73631QMCAAAA0P60+E6poUOHNv7cp0+fzJ49u1UDAQAAAND+tfhOKQAAAAB4q5p1p9Ruu+2WOXPmZNNNN82uu+6aUqm0zrnz589vtXAAAAAAtE/NKqUOPvjgdO7cOUkybty4DZkHAAAAgHeAZpVS06dPX+vPAAAAALA+rCkFAAAAQOGadafUpptu+obrSL3e888//5YCAQAAAND+NauUmjFjRuPPf//733P22WdnzJgxGTFiRJJk7ty5uf3223P66advkJAAAAAAtC+lcrlcbskOhx56aPbdd98cf/zxTcYvvfTS3HnnnbnppptaM1+rW7lyZSorK1NTU5Pu3bu3dRygnRk45Za2jgAA0GyLzhvb1hGAdqi53UuL15S6/fbb86EPfWiN8Q996EO58847W3o4AAAAAN6BWlxKvfvd787Pf/7zNcZ//vOf593vfnerhAIAAACgfWvWmlKvd+aZZ+azn/1s7r777gwfPjxJ8rvf/S6zZ8/O5Zdf3uoBAQAAAGh/Wnyn1JFHHpn77rsv3bt3z4033pgbb7wx3bt3z29+85sceeSR6xXisssuy8CBA9OlS5cMHz48DzzwQLP2u/baa1MqlTJu3Lj1Oi8AAAAAbaPFd0olyfDhw3PNNde0SoDrrrsukydPzsyZMzN8+PDMmDEjY8aMyeOPP54+ffqsc79FixblS1/6Uvbaa69WyQEAAABAcVp8p1SS/PWvf81XvvKVHHHEEVm+fHmS5LbbbssjjzzS4mNddNFFOfroozNp0qRsv/32mTlzZrp165YrrrhinfvU19fnk5/8ZM4888xstdVW63MJAAAAALShFpdS99xzT3baaaf87ne/yw033JCXXnopSfLQQw9l+vTpLTpWXV1d5s2bl1GjRv07UEVFRo0alblz565zv7POOit9+vTJZz7zmZbGBwAAAOC/QItLqSlTpuTss8/OHXfckU6dOjWO77fffvntb3/bomOtWLEi9fX16du3b5Pxvn37ZunSpWvd5ze/+U2+//3vN3tR9dra2qxcubLJCwAAAIC21eJS6uGHH84hhxyyxnifPn2yYsWKVgm1Li+++GI+/elP5/LLL0+vXr2atU91dXUqKysbX1VVVRs0IwAAAABvrsULnffo0SN/+9vfsuWWWzYZf/DBBzNgwIAWHatXr17p0KFDli1b1mR82bJl6dev3xrz//rXv2bRokX5yEc+0jjW0NCQJNloo43y+OOPZ9CgQU32mTp1aiZPntz4fuXKlYopAAAAgDbW4julDj/88Jx66qlZunRpSqVSGhoact999+VLX/pSJkyY0KJjderUKUOGDMmcOXMaxxoaGjJnzpyMGDFijfnbbrttHn744SxYsKDxddBBB2XffffNggUL1lo2de7cOd27d2/yAgAAAKBttfhOqXPPPTfHHXdcqqqqUl9fn+233z719fU54ogj8pWvfKXFASZPnpyJEydm6NChGTZsWGbMmJFVq1Zl0qRJSZIJEyZkwIABqa6uTpcuXbLjjjs22b9Hjx5JssY4AAAAAP+9WlxKderUKZdffnlOP/30/PGPf8xLL72UXXfdNdtss816BRg/fnyee+65TJs2LUuXLs3gwYMze/bsxsXPFy9enIqKFt/QBQAAAMB/sVK5XC63dYgirVy5MpWVlampqfEoH9DqBk65pa0jAAA026LzxrZ1BKAdam730uw7pc4666xmzZs2bVpzDwkAAADAO1SzS6kzzjgjm222Wfr06ZN13VxVKpWUUgAAAAC8qWaXUgcccEB+/etfZ+jQoTnqqKPy4Q9/2FpPAAAAAKyXZrdKt9xyS/76179m+PDh+fKXv5wBAwbk1FNPzeOPP74h8wEAAADQDrXoVqfNNtssU6dOzeOPP57rrrsuy5cvz+67754999wzL7/88obKCAAAAEA70+zH9/7T7rvvnkWLFuXRRx/Ngw8+mFdeeSVdu3ZtzWwAAAAAtFMtXhRq7ty5Ofroo9OvX79ccsklmThxYp599tk3/Io/AAAAAHi9Zt8pdf755+eqq67KihUr8slPfjL33ntvdt555w2ZDQAAAIB2qtml1JQpU/Ke97wnhx12WEqlUq666qq1zrvoootaKxsAAAAA7VSzS6m99947pVIpjzzyyDrnlEqlVgkFAAAAQPvW7FLq7rvv3oAxAAAAAHgnafFC5wAAAADwVimlAAAAACicUgoAAACAwimlAAAAACicUgoAAACAwrW4lBo4cGDOOuusLF68eEPkAQAAAOAdoMWl1Be/+MXceOON2WqrrbL//vvn2muvTW1t7YbIBgAAAEA7tV6l1IIFC/LAAw9ku+22ywknnJD+/fvn+OOPz/z58zdERgAAAADamfVeU2q33XbLN7/5zTz77LOZPn16vve972X33XfP4MGDc8UVV6RcLrdmTgAAAADakY3Wd8dXXnklP/vZz3LllVfmjjvuyPvf//585jOfydNPP53TTjstd955Z2bNmtWaWQEAAABoJ1pcSs2fPz9XXnllfvzjH6eioiITJkzIN77xjWy77baNcw455JDsvvvurRoUAAAAgPajxaXU7rvvnv333z/f/va3M27cuHTs2HGNOVtuuWUOP/zwVgkIAAAAQPvT4lLqiSeeyBZbbPGGc971rnflyiuvXO9QAAAAALRvLV7o/M0KKQAAAAB4My2+U2rTTTdNqVRaY7xUKqVLly7Zeuutc+SRR2bSpEmtEhAAAACA9qfFpdS0adNyzjnn5IADDsiwYcOSJA888EBmz56d4447Lk8++WSOPfbYvPrqqzn66KNbPTAAAAAAb38tLqV+85vf5Oyzz87nP//5JuPf+c538qtf/So33HBDdt5553zzm99USgEAAACwVi1eU+r222/PqFGj1hj/4Ac/mNtvvz1JcuCBB+aJJ5546+kAAAAAaJdaXEr17Nkzv/zlL9cY/+Uvf5mePXsmSVatWpVNNtnkracDAAAAoF1q8eN7p59+eo499tjcddddjWtK/f73v8+tt96amTNnJknuuOOOjBw5snWTAgAAANButLiUOvroo7P99tvn0ksvzY033pgked/73pd77rkne+yxR5LklFNOad2UAAAAALQrLSqlXnnllRxzzDE5/fTT8+Mf/3hDZQIAAACgnWvRmlIdO3bMDTfcsKGyAAAAAPAO0eKFzseNG5ebbrppA0QBAAAA4J2ixWtKbbPNNjnrrLNy3333ZciQIXnXu97VZPuJJ57YauEAAAAAaJ9aXEp9//vfT48ePTJv3rzMmzevybZSqaSUAgAAAOBNtbiUevLJJzdEDgAAAADeQVq8ptRr6urq8vjjj+fVV19tzTwAAAAAvAO0uJRavXp1PvOZz6Rbt27ZYYcdsnjx4iTJCSeckPPOO6/VAwIAAADQ/rS4lJo6dWoeeuih3H333enSpUvj+KhRo3Lddde1ajgAAAAA2qcWryl100035brrrsv73//+lEqlxvEddtghf/3rX1s1HAAAAADtU4vvlHruuefSp0+fNcZXrVrVpKQCAAAAgHVpcSk1dOjQ3HLLLY3vXyuivve972XEiBGtlwwAAACAdqvFj++de+65OeCAA/Loo4/m1VdfzcUXX5xHH300999/f+65554NkREAAACAdqbFd0p94AMfyIIFC/Lqq69mp512yq9+9av06dMnc+fOzZAhQzZERgAAAADamRbfKZUkgwYNyuWXX97aWQAAAAB4h1ivUqqhoSELFy7M8uXL09DQ0GTb3nvv3SrBAAAAAGi/WlxK/fa3v80RRxyRp556KuVyucm2UqmU+vr6VgsHAAAAQPvU4lLq85//fOM38PXv37/x2/cAAAAAoLlaXEr95S9/yU9/+tNsvfXWGyIPAAAAAO8ALf72veHDh2fhwoUbIgsAAAAA7xAtvlPqhBNOyCmnnJKlS5dmp512SseOHZts33nnnVstHAAAAADtU4tLqUMPPTRJctRRRzWOlUqllMtlC50DAAAA0CwtLqWefPLJDZEDAAAAgHeQFpdSW2yxxYbIAQAAAMA7SLMXOv/CF76Ql156qfH9j3/846xatarx/T/+8Y8ceOCBrZsOAAAAgHap2aXUd77znaxevbrx/THHHJNly5Y1vq+trc3tt9/euukAAAAAaJeaXUqVy+U3fA8AAAAAzdXsUgoAAAAAWotSCgAAAIDCtejb96ZNm5Zu3bolSerq6nLOOeeksrIySZqsNwUAAAAAb6TZpdTee++dxx9/vPH9HnvskSeeeGKNOQAAAADwZppdSt19990bLMRll12WCy64IEuXLs0uu+ySSy65JMOGDVvr3BtvvDHnnntuFi5cmFdeeSXbbLNNTjnllHz605/eYPkAAAAAaF1tvqbUddddl8mTJ2f69OmZP39+dtlll4wZMybLly9f6/yePXvm//2//5e5c+fmD3/4QyZNmpRJkybl9ttvLzg5AAAAAOurVC6Xy20ZYPjw4dl9991z6aWXJkkaGhpSVVWVE044IVOmTGnWMXbbbbeMHTs2X/3qV9907sqVK1NZWZmampp07979LWUH+E8Dp9zS1hEAAJpt0Xlj2zoC0A41t3tp0zul6urqMm/evIwaNapxrKKiIqNGjcrcuXPfdP9yuZw5c+bk8ccft54VAAAAwNtIi759r7WtWLEi9fX16du3b5Pxvn375k9/+tM696upqcmAAQNSW1ubDh065Fvf+lb233//tc6tra1NbW1t4/uVK1e2TngAAAAA1luL7pR69dVXc9ZZZ+Xpp5/eUHmaZZNNNsmCBQvy+9//Puecc04mT568zoXYq6urU1lZ2fiqqqoqNiwAAAAAa2hRKbXRRhvlggsuyKuvvtoqJ+/Vq1c6dOiQZcuWNRlftmxZ+vXrt879KioqsvXWW2fw4ME55ZRT8rGPfSzV1dVrnTt16tTU1NQ0vpYsWdIq2QEAAABYfy1eU2q//fbLPffc0yon79SpU4YMGZI5c+Y0jjU0NGTOnDkZMWJEs4/T0NDQ5BG91+vcuXO6d+/e5AUAAABA22rxmlIHHHBApkyZkocffjhDhgzJu971ribbDzrooBYdb/LkyZk4cWKGDh2aYcOGZcaMGVm1alUmTZqUJJkwYUIGDBjQeCdUdXV1hg4dmkGDBqW2tja33nprfvSjH+Xb3/52Sy8FAAAAgDbS4lLqC1/4QpLkoosuWmNbqVRKfX19i443fvz4PPfcc5k2bVqWLl2awYMHZ/bs2Y2Lny9evDgVFf++oWvVqlX5whe+kKeffjpdu3bNtttum6uvvjrjx49v6aUAAAAA0EZK5XK53NYhirRy5cpUVlampqbGo3xAqxs45Za2jgAA0GyLzhvb1hGAdqi53UuL15QCAAAAgLeqxY/vJf96hO6ee+7J4sWLU1dX12TbiSee2CrBAAAAAGi/WlxKPfjggznwwAOzevXqrFq1Kj179syKFSvSrVu39OnTRykFAAAAwJtq8eN7J598cj7ykY/khRdeSNeuXfPb3/42Tz31VIYMGZILL7xwQ2QEAAAAoJ1pcSm1YMGCnHLKKamoqEiHDh1SW1ubqqqqnH/++TnttNM2REYAAAAA2pkWl1IdO3ZMRcW/duvTp08WL16cJKmsrMySJUtaNx0AAAAA7VKL15Tadddd8/vf/z7bbLNNRo4cmWnTpmXFihX50Y9+lB133HFDZAQAAACgnWnxnVLnnntu+vfvnyQ555xzsummm+bYY4/Nc889l+9+97utHhAAAACA9qfFd0oNHTq08ec+ffpk9uzZrRoIAAAAgPavxXdKAQAAAMBb1aw7pXbdddeUSqVmHXD+/PlvKRAAAAAA7V+zSqlx48Zt4BgAAAAAvJM0q5SaPn36hs4BAAAAwDtIixc6f828efPy2GOPJUl22GGH7Lrrrq0WCgAAAID2rcWl1PLly3P44Yfn7rvvTo8ePZIk//jHP7Lvvvvm2muvTe/evVs7IwAAAADtTIu/fe+EE07Iiy++mEceeSTPP/98nn/++fzxj3/MypUrc+KJJ26IjAAAAAC0My2+U2r27Nm58847s9122zWObb/99rnssssyevToVg0HAAAAQPvU4julGhoa0rFjxzXGO3bsmIaGhlYJBQAAAED71uJSar/99stJJ52UZ599tnHsmWeeycknn5wPfvCDrRoOAAAAgPapxaXUpZdempUrV2bgwIEZNGhQBg0alC233DIrV67MJZdcsiEyAgAAANDOtHhNqaqqqsyfPz933nln/vSnPyVJtttuu4waNarVwwEAAADQPrW4lEqSUqmU/fffP/vvv39r5wEAAADgHaDZj+/NnTs3N998c5OxH/7wh9lyyy3Tp0+ffO5zn0ttbW2rBwQAAACg/Wl2KXXWWWflkUceaXz/8MMP5zOf+UxGjRqVKVOm5Je//GWqq6s3SEgAAAAA2pdml1ILFixo8u161157bYYPH57LL788kydPzje/+c385Cc/2SAhAQAAAGhfml1KvfDCC+nbt2/j+3vuuScHHHBA4/vdd989S5Ysad10AAAAALRLzS6l+vbtmyeffDJJUldXl/nz5+f9739/4/YXX3wxHTt2bP2EAAAAALQ7zS6lDjzwwEyZMiX33ntvpk6dmm7dumWvvfZq3P6HP/whgwYN2iAhAQAAAGhfNmruxK9+9av56Ec/mpEjR2bjjTfOD37wg3Tq1Klx+xVXXJHRo0dvkJAAAAAAtC/NLqV69eqV//3f/01NTU023njjdOjQocn266+/PhtvvHGrBwQAAACg/Wl2KfWaysrKtY737NnzLYcBAAAA4J2h2WtKAQAAAEBrUUoBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACFU0oBAAAAUDilFAAAAACF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+cc//pHLL788VVVVefzxx5Mk2267bZYsWZLPfvaz6dGjR77zne+kZ8+eufPOOzNixIjG/T/72c9m9erVmTVrVg466KD06tUrV1xxxRrnufrqq3P22WfnscceS6lUSpLU1dWlR48euemmmzJ69OhiLhgAoBk2ausAAADvFL17987YsWNz1VVXpVwuZ+zYsY13OSXJwoULs3r16uy///5N9qurq2t8xO/YY4/NoYcemvnz52f06NEZN25c9thjjyTJQw89lIULF2aTTTZpsv8///nP/PWvf93AVwcA0DJKKQCAAh111FE5/vjjkySXXXZZk20vvfRSkuSWW27JgAEDmmzr3LlzkuSAAw7IU089lVtvvTV33HFHPvjBD+a4447LhRdemJdeeilDhgzJNddcs8Z5e/fuvSEuBwBgvSmlAAAK9Nr6TqVSKWPGjGmybfvtt0/nzp2zePHijBw5cp3H6N27dyZOnJiJEydmr732ype//OVceOGF2W233XLdddelT58+6d69+4a+FACAt0QpBQBQoA4dOuSxxx5r/Pn1Ntlkk3zpS1/KySefnIaGhnzgAx9ITU1N7rvvvnTv3j0TJ07MtGnTMmTIkOywww6pra3NzTffnO222y5J8slPfjIXXHBBDj744Jx11lnZfPPN89RTT+XGG2/M//zP/2TzzTcv/HoBANZFKQUAULA3uovpq1/9anr37p3q6uo88cQT6dGjR3bbbbecdtppSZJOnTpl6tSpWbRoUbp27Zq99tor1157bZKkW7du+d///d+ceuqp+ehHP5oXX3wxAwYMyAc/+EF3TgEA/3V8+x4AAAAAhato6wAAAAAAvPMopQAAAAAonFIKAAAAgMIppQAAAAAonFIKAAAAgMIppQAAAAAonFIKAAAAgMIppQAAAAAonFIKAAAAgMIppQAAAAAonFIKAAAAgMIppQAAAAAo3P8HQEJgpYZA590AAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 1200x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Statistiche principali di Solar Energy:\n",
"--------------------------------------------------\n",
"count : 357,679.0000\n",
"missing : 64.0000\n",
"zeros : 161,156.0000\n",
"mean : 0.6529\n",
"median : 0.0736\n",
"std : 0.9288\n",
"min : 0.0000\n",
"max : 4.0000\n",
"skewness : 1.2834\n",
"kurtosis : 0.3742\n",
"percentile_1 : 0.0000\n",
"percentile_5 : 0.0000\n",
"percentile_10 : 0.0000\n",
"percentile_25 : 0.0000\n",
"percentile_50 : 0.0736\n",
"percentile_75 : 1.1913\n",
"percentile_90 : 2.2530\n",
"percentile_95 : 2.7314\n",
"percentile_99 : 3.1348\n",
"\n",
"Suggerimenti per la normalizzazione:\n",
"--------------------------------------------------\n",
"- La distribuzione è fortemente asimmetrica (skewness > 1)\n",
"- Considerare una trasformazione logaritmica: np.log1p(x)\n",
"- Alta presenza di zeri (45.06%)\n",
"- Considerare un modello in due parti: classificazione degli zeri + regressione sui valori non-zero\n"
]
},
{
"data": {
"text/plain": [
"{'count': 357679,\n",
" 'missing': 64,\n",
" 'zeros': 161156,\n",
" 'mean': 0.6529324282684227,\n",
" 'median': 0.07359524816274643,\n",
" 'std': 0.928826011992019,\n",
" 'min': 0.0,\n",
" 'max': 4.0,\n",
" 'skewness': 1.2833967112068252,\n",
" 'kurtosis': 0.37419692300276486,\n",
" 'percentile_1': 0.0,\n",
" 'percentile_5': 0.0,\n",
" 'percentile_10': 0.0,\n",
" 'percentile_25': 0.0,\n",
" 'percentile_50': 0.07359524816274643,\n",
" 'percentile_75': 1.191302478313446,\n",
" 'percentile_90': 2.2529743671417237,\n",
" 'percentile_95': 2.7313732862472535,\n",
" 'percentile_99': 3.134775576591491}"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"analyze_distribution(df_updated, 'solarenergy', 'Solar Energy')"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "e884cc287364c4ed",
"metadata": {},
"outputs": [
{
"ename": "ValueError",
"evalue": "too many values to unpack (expected 3)",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[24], line 157\u001b[0m\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPredictions within ±\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mthreshold\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mwithin_threshold\u001b[38;5;132;01m:\u001b[39;00m\u001b[38;5;124m.1f\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 156\u001b[0m \u001b[38;5;66;03m# Example usage\u001b[39;00m\n\u001b[0;32m--> 157\u001b[0m \u001b[43mplot_error_analysis\u001b[49m\u001b[43m(\u001b[49m\u001b[43my_test_original\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfinal_pred_original\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfolder_name\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfolder_name\u001b[49m\u001b[43m)\u001b[49m\n",
"Cell \u001b[0;32mIn[24], line 23\u001b[0m, in \u001b[0;36mplot_error_analysis\u001b[0;34m(y_true, predictions, folder_name)\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01msklearn\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mmetrics\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m roc_curve\n\u001b[1;32m 22\u001b[0m \u001b[38;5;66;03m# Unpack predictions\u001b[39;00m\n\u001b[0;32m---> 23\u001b[0m classification_pred, regression_pred, final_pred \u001b[38;5;241m=\u001b[39m predictions\n\u001b[1;32m 25\u001b[0m \u001b[38;5;66;03m# Convert to 1D numpy arrays if needed\u001b[39;00m\n\u001b[1;32m 26\u001b[0m y_true \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mravel(y_true)\n",
"\u001b[0;31mValueError\u001b[0m: too many values to unpack (expected 3)"
]
}
],
"source": [
"def plot_error_analysis(y_true, predictions, folder_name=None):\n",
" \"\"\"\n",
" Function to visualize prediction error analysis for the hybrid model\n",
"\n",
" Parameters:\n",
" -----------\n",
" y_true : array-like\n",
" Actual values\n",
" predictions : tuple\n",
" Tuple containing (classification_pred, regression_pred, final_pred)\n",
" folder_name : str, optional\n",
" Directory to save plots. If None, plots are only displayed\n",
"\n",
" Generates:\n",
" ----------\n",
" - Classification analysis plots\n",
" - Regression error analysis plots\n",
" - Final prediction error analysis plots\n",
" \"\"\"\n",
" from sklearn.metrics import roc_curve\n",
"\n",
" # Unpack predictions\n",
" classification_pred, regression_pred, final_pred = predictions\n",
"\n",
" # Convert to 1D numpy arrays if needed\n",
" y_true = np.ravel(y_true)\n",
" classification_pred = np.ravel(classification_pred)\n",
" regression_pred = np.ravel(regression_pred)\n",
" final_pred = np.ravel(final_pred)\n",
"\n",
" # Create binary ground truth\n",
" y_true_binary = (y_true > 0).astype(float)\n",
"\n",
" # Calculate errors for regression and final predictions\n",
" regression_errors = regression_pred - y_true\n",
" final_errors = final_pred - y_true\n",
"\n",
" # Create main figure\n",
" plt.figure(figsize=(20, 15))\n",
"\n",
" # Classification Analysis (Top Row)\n",
" # Plot 1: Classification Distribution\n",
" plt.subplot(3, 3, 1)\n",
" plt.hist(classification_pred, bins=50, alpha=0.7)\n",
" plt.axvline(x=0.5, color='r', linestyle='--')\n",
" plt.title('Classification Probability Distribution')\n",
" plt.xlabel('Classification Probability')\n",
" plt.ylabel('Frequency')\n",
"\n",
" # Plot 2: ROC Curve\n",
" plt.subplot(3, 3, 2)\n",
" fpr, tpr, _ = roc_curve(y_true_binary, classification_pred)\n",
" plt.plot(fpr, tpr)\n",
" plt.plot([0, 1], [0, 1], 'r--')\n",
" plt.title(f'ROC Curve (AUC = {roc_auc_score(y_true_binary, classification_pred):.4f})')\n",
" plt.xlabel('False Positive Rate')\n",
" plt.ylabel('True Positive Rate')\n",
"\n",
" # Plot 3: Classification Confusion Matrix\n",
" plt.subplot(3, 3, 3)\n",
" cm = confusion_matrix(y_true_binary, classification_pred > 0.5)\n",
" sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')\n",
" plt.title('Classification Confusion Matrix')\n",
" plt.xlabel('Predicted')\n",
" plt.ylabel('Actual')\n",
"\n",
" # Regression Analysis (Middle Row)\n",
" # Plot 4: Regression Error Distribution\n",
" plt.subplot(3, 3, 4)\n",
" plt.hist(regression_errors[y_true > 0], bins=50, alpha=0.7)\n",
" plt.title('Regression Error Distribution (Non-zero Values)')\n",
" plt.xlabel('Error')\n",
" plt.ylabel('Frequency')\n",
"\n",
" # Plot 5: Actual vs Predicted (Regression)\n",
" plt.subplot(3, 3, 5)\n",
" mask_nonzero = y_true > 0\n",
" plt.scatter(y_true[mask_nonzero], regression_pred[mask_nonzero], alpha=0.5)\n",
" plt.plot([y_true[mask_nonzero].min(), y_true[mask_nonzero].max()],\n",
" [y_true[mask_nonzero].min(), y_true[mask_nonzero].max()], 'r--', lw=2)\n",
" plt.title('Actual vs Predicted (Regression, Non-zero Values)')\n",
" plt.xlabel('Actual Values')\n",
" plt.ylabel('Predicted Values')\n",
"\n",
" # Plot 6: Regression Errors vs Actual Values\n",
" plt.subplot(3, 3, 6)\n",
" plt.scatter(y_true[mask_nonzero], regression_errors[mask_nonzero], alpha=0.5)\n",
" plt.axhline(y=0, color='r', linestyle='--')\n",
" plt.title('Regression Errors vs Actual Values (Non-zero Values)')\n",
" plt.xlabel('Actual Values')\n",
" plt.ylabel('Error')\n",
"\n",
" # Final Predictions Analysis (Bottom Row)\n",
" # Plot 7: Final Error Distribution\n",
" plt.subplot(3, 3, 7)\n",
" plt.hist(final_errors, bins=50, alpha=0.7)\n",
" plt.title('Final Prediction Error Distribution')\n",
" plt.xlabel('Error')\n",
" plt.ylabel('Frequency')\n",
"\n",
" # Plot 8: Actual vs Predicted (Final)\n",
" plt.subplot(3, 3, 8)\n",
" plt.scatter(y_true, final_pred, alpha=0.5)\n",
" plt.plot([y_true.min(), y_true.max()], [y_true.min(), y_true.max()], 'r--', lw=2)\n",
" plt.title('Actual vs Predicted (Final)')\n",
" plt.xlabel('Actual Values')\n",
" plt.ylabel('Predicted Values')\n",
"\n",
" # Plot 9: Final Errors vs Actual Values\n",
" plt.subplot(3, 3, 9)\n",
" plt.scatter(y_true, final_errors, alpha=0.5)\n",
" plt.axhline(y=0, color='r', linestyle='--')\n",
" plt.title('Final Errors vs Actual Values')\n",
" plt.xlabel('Actual Values')\n",
" plt.ylabel('Error')\n",
"\n",
" plt.tight_layout()\n",
"\n",
" # Save plot if directory is specified\n",
" if folder_name is not None:\n",
" try:\n",
" filename = f'{folder_name}_error_analysis.png'\n",
" plt.savefig(filename, dpi=300, bbox_inches='tight')\n",
" print(f\"\\nPlot saved as: {filename}\")\n",
" except Exception as e:\n",
" print(f\"\\nError saving plot: {str(e)}\")\n",
"\n",
" plt.show()\n",
"\n",
" # Print comprehensive statistics\n",
" print(\"\\nClassification Statistics:\")\n",
" print(classification_report(y_true_binary, classification_pred > 0.5))\n",
" print(f\"AUC-ROC: {roc_auc_score(y_true_binary, classification_pred):.4f}\")\n",
"\n",
" print(\"\\nRegression Statistics (Non-zero values):\")\n",
" mask_nonzero = y_true > 0\n",
" if np.any(mask_nonzero):\n",
" print(f\"MAE: {np.mean(np.abs(regression_errors[mask_nonzero])):.4f}\")\n",
" print(f\"RMSE: {np.sqrt(np.mean(regression_errors[mask_nonzero] ** 2)):.4f}\")\n",
" print(f\"Mean error: {np.mean(regression_errors[mask_nonzero]):.4f}\")\n",
" print(f\"Error std: {np.std(regression_errors[mask_nonzero]):.4f}\")\n",
"\n",
" print(\"\\nFinal Prediction Statistics:\")\n",
" print(f\"MAE: {np.mean(np.abs(final_errors)):.4f}\")\n",
" print(f\"RMSE: {np.sqrt(np.mean(final_errors ** 2)):.4f}\")\n",
" print(f\"Mean error: {np.mean(final_errors):.4f}\")\n",
" print(f\"Error std: {np.std(final_errors):.4f}\")\n",
"\n",
" # Calculate percentage of errors within thresholds\n",
" thresholds = [0.5, 1.0, 1.5, 2.0]\n",
" print(\"\\nError Thresholds (Final Predictions):\")\n",
" for threshold in thresholds:\n",
" within_threshold = np.mean(np.abs(final_errors) <= threshold) * 100\n",
" print(f\"Predictions within ±{threshold}: {within_threshold:.1f}%\")\n",
"\n",
"# Example usage\n",
"plot_error_analysis(y_test, predictions, folder_name=folder_name)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "26c41d23-65bf-4a38-9241-ea9b17effbd5",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.0rc1"
}
},
"nbformat": 4,
"nbformat_minor": 5
}