pyFTSex/tutorial/pyFTS/developer/Ismail & Efendi - ImprovedWeightedFTS.ipynb

1195 lines
748 KiB
Plaintext
Raw Normal View History

2024-08-15 12:15:32 +04:00
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.3"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
},
"colab": {
"name": "Ismail & Efendi - ImprovedWeightedFTS.ipynb",
"provenance": [],
"toc_visible": true,
"include_colab_link": true
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/github/PYFTS/notebooks/blob/master/Ismail%20%26%20Efendi%20-%20ImprovedWeightedFTS.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rr38fp8obkag",
"colab_type": "text"
},
"source": [
"# First Order Improved Weighted Fuzzy Time Series by Efendi, Ismail and Deris (2013)\n",
"\n",
"R. Efendi, Z. Ismail, and M. M. Deris, “Improved weight Fuzzy Time Series as used in the exchange rates forecasting of \n",
"US Dollar to Ringgit Malaysia,” Int. J. Comput. Intell. Appl., vol. 12, no. 1, p. 1350005, 2013."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4mCI0sMpbkam",
"colab_type": "text"
},
"source": [
"## Environment Setup"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DeygsUfUbkap",
"colab_type": "text"
},
"source": [
"### Library install/update"
]
},
{
"cell_type": "code",
"metadata": {
"id": "eufIipRDbkar",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 211
},
"outputId": "2e97445e-bff6-4378-def6-f25e0e62bdd4"
},
"source": [
"!pip3 install -U git+https://github.com/PYFTS/pyFTS"
],
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": [
"Collecting git+https://github.com/PYFTS/pyFTS\n",
" Cloning https://github.com/PYFTS/pyFTS to /tmp/pip-req-build-sm6te7pr\n",
" Running command git clone -q https://github.com/PYFTS/pyFTS /tmp/pip-req-build-sm6te7pr\n",
"Building wheels for collected packages: pyFTS\n",
" Building wheel for pyFTS (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
" Created wheel for pyFTS: filename=pyFTS-1.6-cp36-none-any.whl size=197025 sha256=fa5975e048b6fe90453ed5024a17dc0ef34718f6b2af888e6c4c0f03b27c8db9\n",
" Stored in directory: /tmp/pip-ephem-wheel-cache-xmnwubyw/wheels/e7/32/a9/230470113df5a73242a5a6d05671cb646db97abf14bbce2644\n",
"Successfully built pyFTS\n",
"Installing collected packages: pyFTS\n",
"Successfully installed pyFTS-1.6\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "znDNtD6-bka2",
"colab_type": "text"
},
"source": [
"### External libraries import"
]
},
{
"cell_type": "code",
"metadata": {
"id": "v37l31bMbka4",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "2de2ffc5-6b5e-44d9-f69e-0761e369176a"
},
"source": [
"import warnings\n",
"warnings.filterwarnings('ignore')\n",
"\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pylab as plt\n",
"import seaborn as sns\n",
"\n",
"%pylab inline"
],
"execution_count": 2,
"outputs": [
{
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "RTcBNZr0bkbA",
"colab_type": "text"
},
"source": [
"### Common pyFTS imports "
]
},
{
"cell_type": "code",
"metadata": {
"id": "mJgiGYqsbkbB",
"colab_type": "code",
"colab": {}
},
"source": [
"from pyFTS.common import Util as cUtil\n",
"from pyFTS.benchmarks import benchmarks as bchmk, Util as bUtil\n",
"from pyFTS.partitioners import Util as pUtil\n",
"\n",
"from pyFTS.models import ismailefendi\n"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "kkCDdCaHbkbI",
"colab_type": "text"
},
"source": [
"## Common data transformations"
]
},
{
"cell_type": "code",
"metadata": {
"id": "4UbQxn9UbkbK",
"colab_type": "code",
"colab": {}
},
"source": [
"from pyFTS.common import Transformations\n",
"\n",
"tdiff = Transformations.Differential(1)\n",
"\n",
"boxcox = Transformations.BoxCox(0)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "dXk2WFbXbkbP",
"colab_type": "text"
},
"source": [
"## Datasets"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "UyuKd-gKbkbS",
"colab_type": "text"
},
"source": [
"### Data Loading"
]
},
{
"cell_type": "code",
"metadata": {
"id": "5O5iMx5dbkbU",
"colab_type": "code",
"colab": {}
},
"source": [
"from pyFTS.data import TAIEX, NASDAQ, SP500\n",
"\n",
"dataset_names = [\"TAIEX\", \"SP500\",\"NASDAQ\"]\n",
"\n",
"def get_dataset(name):\n",
" if dataset_name == \"TAIEX\":\n",
" return TAIEX.get_data()\n",
" elif dataset_name == \"SP500\":\n",
" return SP500.get_data()[11500:16000]\n",
" elif dataset_name == \"NASDAQ\":\n",
" return NASDAQ.get_data()\n",
"\n",
"\n",
"train_split = 2000\n",
"test_length = 200"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "GaKBakk7bkbZ",
"colab_type": "text"
},
"source": [
"### Visualization"
]
},
{
"cell_type": "code",
"metadata": {
"id": "I_us4P61bkbb",
"colab_type": "code",
"colab": {},
"outputId": "2fdc9c25-db2f-4ac3-e527-840fa473ebbf"
},
"source": [
"fig, ax = plt.subplots(nrows=2, ncols=3, figsize=[10,5])\n",
"\n",
"for count,dataset_name in enumerate(dataset_names):\n",
" dataset = get_dataset(dataset_name)\n",
" dataset_diff = tdiff.apply(dataset)\n",
"\n",
" ax[0][count].plot(dataset)\n",
" ax[1][count].plot(dataset_diff)\n",
" ax[0][count].set_title(dataset_name)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nkEP7iTB/N7Eez
"text/plain": [
"<matplotlib.figure.Figure at 0x7efc38b13a90>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kf_ZaKa3bkbi",
"colab_type": "text"
},
"source": [
"### Statistics"
]
},
{
"cell_type": "code",
"metadata": {
"id": "vxPc5s9Kbkbj",
"colab_type": "code",
"colab": {},
"outputId": "866f1ef7-a155-4e2f-c01e-d3e180137507"
},
"source": [
"from statsmodels.tsa.stattools import adfuller\n",
"\n",
"rows =[]\n",
"\n",
"for count,dataset_name in enumerate(dataset_names):\n",
" row = [dataset_name]\n",
" dataset = get_dataset(dataset_name)\n",
" result = adfuller(dataset)\n",
" row.extend([result[0],result[1]])\n",
" row.extend([value for key, value in result[4].items()])\n",
" rows.append(row)\n",
" \n",
"pd.DataFrame(rows,columns=['Dataset','ADF Statistic','p-value','Cr. Val. 1%','Cr. Val. 5%','Cr. Val. 10%'])\n"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Dataset</th>\n",
" <th>ADF Statistic</th>\n",
" <th>p-value</th>\n",
" <th>Cr. Val. 1%</th>\n",
" <th>Cr. Val. 5%</th>\n",
" <th>Cr. Val. 10%</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>TAIEX</td>\n",
" <td>-2.656728</td>\n",
" <td>0.081830</td>\n",
" <td>-3.431601</td>\n",
" <td>-2.862093</td>\n",
" <td>-2.567064</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>SP500</td>\n",
" <td>-1.747171</td>\n",
" <td>0.406987</td>\n",
" <td>-3.431811</td>\n",
" <td>-2.862186</td>\n",
" <td>-2.567114</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>NASDAQ</td>\n",
" <td>0.476224</td>\n",
" <td>0.984132</td>\n",
" <td>-3.432022</td>\n",
" <td>-2.862279</td>\n",
" <td>-2.567163</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Dataset ADF Statistic p-value Cr. Val. 1% Cr. Val. 5% Cr. Val. 10%\n",
"0 TAIEX -2.656728 0.081830 -3.431601 -2.862093 -2.567064\n",
"1 SP500 -1.747171 0.406987 -3.431811 -2.862186 -2.567114\n",
"2 NASDAQ 0.476224 0.984132 -3.432022 -2.862279 -2.567163"
]
},
"metadata": {
"tags": []
},
"execution_count": 6
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_ekj3X8cbkbp",
"colab_type": "text"
},
"source": [
"## Partitioning\n",
"\n",
"The best number of partitions of the Universe of Discourse is an optimization problem. The know more about partitioning schemes please look on the Partitioners notebook. To know more about benchmarking look on the Benchmarks notebook."
]
},
{
"cell_type": "code",
"metadata": {
"id": "mGr2Cpwwbkbr",
"colab_type": "code",
"colab": {}
},
"source": [
"from pyFTS.partitioners import Grid, Util as pUtil\n",
"from pyFTS.benchmarks import benchmarks as bchmk\n",
"from pyFTS.models import chen\n",
"\n",
"tag = 'chen_partitioning'\n",
"_type = 'point'\n",
"\n",
"for dataset_name in dataset_names:\n",
" dataset = get_dataset(dataset_name)\n",
"\n",
" bchmk.sliding_window_benchmarks(dataset, 1000, train=0.8, inc=0.2,\n",
" methods=[chen.ConventionalFTS],\n",
" benchmark_models=False,\n",
" transformations=[None],\n",
" partitions=np.arange(10,100,2), \n",
" progress=False, type=_type,\n",
" file=\"benchmarks.db\", dataset=dataset_name, tag=tag)\n",
"\n",
" bchmk.sliding_window_benchmarks(dataset, 1000, train=0.8, inc=0.2,\n",
" methods=[chen.ConventionalFTS],\n",
" benchmark_models=False,\n",
" transformations=[tdiff],\n",
" partitions=np.arange(3,30,1), \n",
" progress=False, type=_type,\n",
" file=\"benchmarks.db\", dataset=dataset_name, tag=tag)\n"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "zJW-d9N7bkbw",
"colab_type": "code",
"colab": {}
},
"source": [
"from pyFTS.benchmarks import Util as bUtil\n",
"\n",
"df1 = bUtil.get_dataframe_from_bd(\"benchmarks.db\",\n",
" \"tag = 'chen_partitioning' and measure = 'rmse'and transformation is null\")\n",
"\n",
"df2 = bUtil.get_dataframe_from_bd(\"benchmarks.db\",\n",
" \"tag = 'chen_partitioning' and measure = 'rmse' and transformation is not null\")\n",
"\n",
"fig, ax = plt.subplots(nrows=2, ncols=1, figsize=[15,7])\n",
"\n",
"g1 = sns.boxplot(x='Partitions', y='Value', hue='Dataset', data=df1, showfliers=False, ax=ax[0], \n",
" palette=\"Set3\")\n",
"box = g1.get_position()\n",
"g1.set_position([box.x0, box.y0, box.width * 0.85, box.height]) \n",
"g1.legend(loc='right', bbox_to_anchor=(1.15, 0.5), ncol=1)\n",
"ax[0].set_title(\"Original data\")\n",
"ax[0].set_ylabel(\"RMSE\")\n",
"ax[0].set_xlabel(\"\")\n",
"\n",
"g2 = sns.boxplot(x='Partitions', y='Value', hue='Dataset', data=df2, showfliers=False, ax=ax[1], \n",
" palette=\"Set3\")\n",
"box = g2.get_position()\n",
"g2.set_position([box.x0, box.y0, box.width * 0.85, box.height]) \n",
"g2.legend(loc='right', bbox_to_anchor=(1.15, 0.5), ncol=1)\n",
"ax[1].set_title(\"Differentiated data\")\n",
"ax[1].set_ylabel(\"RMSE\")\n",
"ax[1].set_xlabel(\"Number of partitions of the UoD\")"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "bzIywWl-bkb1",
"colab_type": "text"
},
"source": [
"### Comparing the partitioning schemas"
]
},
{
"cell_type": "code",
"metadata": {
"id": "l1pk__sYbkb2",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 367
},
"outputId": "28a70759-b0f6-46dc-9889-67d369675d02"
},
"source": [
"from pyFTS.partitioners import Grid, Util as pUtil\n",
"\n",
"fig, ax = plt.subplots(nrows=2, ncols=3, figsize=[20,5])\n",
"\n",
"\n",
"partitioners = {}\n",
"partitioners_diff = {}\n",
"\n",
"for count,dataset_name in enumerate(dataset_names):\n",
" dataset = get_dataset(dataset_name)\n",
"\n",
" partitioner = Grid.GridPartitioner(data=dataset, npart=30)\n",
" partitioners[dataset_name] = partitioner\n",
" partitioner_diff = Grid.GridPartitioner(data=dataset, npart=10, transformation=tdiff)\n",
" partitioners_diff[dataset_name] = partitioner_diff\n",
"\n",
" pUtil.plot_sets(dataset, [partitioner.sets], titles=[dataset_name], axis=ax[0][count])\n",
" pUtil.plot_sets(dataset, [partitioner_diff.sets], titles=[''], axis=ax[1][count])"
],
"execution_count": 6,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABIQAAAFKCAYAAABsCIRVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsvXm8ZMlV3/mLzLw317dlvqrqXa3e\nJJYZYRAgf8wYDDYIjIxtwIOwR2Is4MN4WGZAH7wAkllsJLCFEYNhBAIhkFiEkIyAQWKR1EILqAUS\nWnqpltTqtbrrZeZbcr1bzB9x4964cWN73U9Vr7ri9/nUJ7dbuZx3b5wT55xvBKGUwsvLy8vLy8vL\ny8vLy8vLy8vr6lHjcn8BLy8vLy8vLy8vLy8vLy8vL69LK58Q8vLy8vLy8vLy8vLy8vLy8rrK5BNC\nXl5eXl5eXl5eXl5eXl5eXleZfELIy8vLy8vLy8vLy8vLy8vL6yqTTwh5eXl5eXl5eXl5eXl5eXl5\nXWXyCSEvLy8vLy8vLy8vLy8vLy+vq0w+IeTl5eXl5eXl5eXl5eXl5eV1lcknhLyueBFCZsK/jBCy\nFB7/S+G4byOEUELI/yr9/68ghDwsPH4XIWQlve/b8tdeQAi5QAgZCsd/AyHkEULI1qX4vV5eXl5e\nxxMh5MsIIe8jhBwQQiaEkPcSQr449wtpPs4fEkI+TAj5+vz/3Jz7DNEX/Ijwnm1CyK/k/+8CIeT7\npc/8KkLIPYSQBSHknYSQZ1zq3+3l5eXl5eXlZZJPCHld8aKUDvg/AA8CeIHw3BuEQ18MYALgRQ5v\n+93i+1JKX5B/1tsA/DmAnwEAQsg2gF8A8H9QSg9O8nd5eXl5eT11EUI2AfwBgJ8DMARwPYAfBbDO\nD3l/7j+2AbwWwO8QQnaEt9gWfMGPC8//RwC3A3gGgH8A4AcJIc/PP3MXwO8B+JH8M+8C8NufnV/o\n5eXl5WUTIeQBQsgThJC+8Ny3E0LeJTwmhJBPEUI+ofj/n0cIeUdeVNgnhHyIEPJ1+WtfkRelefHg\nYULI7xBCvljxPtrPyF//ekLIXxFC5oSQMSHkNwgh15+IEby8FPIJIa+rQnll9ssBfCeAryGEXPMU\n3u57AXwtIeRrwBJD76aU/v4JfE0vLy8vr5PXHQBAKf1NSmlKKV1SSt9BKf1b8SBKaQbgVwB0Adzq\n8L4vBvDjlNIppfRuAL8E4Nvy1/45gI9TSt9EKV2BJY+eQwh59on8Ii8vLy+vJ6MmgO8zvP73AZwF\ncIsimfM2AH8C4Jr8mO8FcCi8/mheXNgA8DwA9wB4DyHkq1w/gxDyTQDeCOC/AdgF8HkAovx9tl1/\npJfXceQTQl5Xi14E4C5K6ZsB3A3gX1qO14pSugfmTN4A4OvBHIKXl5eX1+nUfQBSQsivEUK+Vur+\nKUQIaQH4dgAzAOeFlz6TV3t/Ne/8Qf4e1wL4iHDcR8CCd+S3xWuU0jmATwqve3l5eXldev00gJca\nkisvBvA/APxRfh9A0fX5TAC/RCmN8n/vpZT+hfwGlOlhSunLAPwygFc6fgYB8F8B/ASl9I158eIC\nmF9awJzI8vJ60vIJIa+rRS8Cy7gjv7VhY6/O20H5vx+XXv8AgC0A76CUXjzh7+rl5eXldUKilB4C\n+DIAFKyL5yIh5PcJIefyQ55HCNkHcAHACwH8sxwB3gPwxWBI2BeBVX05hjzIb0VU+CA/hr8uY8Ti\n615eXl5el153AXgXgJfKLxBCegC+CWycfwOAbyGEhPnLYwD3A/gNQsg/FfyHTb8H4As5pmb5jGcB\nuAnAm8Q3yLtX3wzgqx0/08vrWPIJIa+nvQghfw8sq/9b+VNvBPA/EUK+wPDfvpdSui38+xHp9dcA\neD2AryOE/N2T/9ZeXl5eXiclSundlNJvo5TeAODzAVwH1pIPAB/Ix/ldSunzKKV/mv+fGaX0Lkpp\nQil9HMB3A/hqQsgGWBcRAGwKH7MJ4Ci/P5Nek1/38vLy8ro8ehmA7yGEnJGe/+dga8u9A8AfAggA\n/GOAdf2ArRX3AFgXz2OEkDsJIbdbPutRAARsjTrjZ4AhYgDwmOJ9HgMgf18vrxORTwh5XQ16Mdhg\n/GFCyAUAfyk8f2wRQl4C4EYA/wbAfwDwy0J238vLy8vrFItSeg+A14Elho71X/PbBqV0ChagP0d4\n/TkAPp7f/7j4Wl4dvlV43cvLy8vrMohS+jGwjQb+nfTSiwH8Tl4EWIF15bxY+H8PU0q/m1J6K1jn\n6BysOGzS9WC+Y9/hM/by22sV73Ot8LqX14nKJ4S8ntYihHQA/AuwxaS/QPj3PQC+NV8z4jjvdx0Y\nf/wdlNI1gF8EayP9oZP83l5eXl5eJyNCyLMJIT9ACLkhf3wjGBr2Acv/+1JCyLMIIQ1CyAjAqwG8\nS9hR8vUAfpgQspMvFv0dYIkmAHgLgM8nhHxj7odeBuBv82SUl5eXl9fl1cvBxuzrASD3D18J4F8R\nQi7kBeRvAiMBduX/TCl9CMDPw15Y+GcA/ppSOnf4jHsBPAzgm8U3IIQ0AHwjGOrm5XXi8gkhr6e7\n/imAJYDXU0ov8H9gO8m0ADxf8//+H2HryBkh5EP58/8dwG9RSt8DFC2k3wHg/yKE+MVCvby8vE6f\njgB8KYC/JITMwRJBHwPwA5b/dwuAP87//8fA2vxfKLz+crCFoj8D4N0AfppS+scAkK8t940A/hOA\naf7533JCv8fLy8vL6ymIUno/gN9GuTHM/wa2AcGzUBaP7wBL0LwwT/z/KCHktrxIsAvgX0NRWMi3\nlb+eEPJysAWh/4PLZ+RzipeCFRq+lRDSyXdF/mUwnOznTtwQXl4ACDv3vLy8vLy8vLy8vLy8vLye\nfiKEPADg2/k6cXm36HmwpM41AH6eUvpz0v/5QTDS4MvBisJfDpacmQF4J4CXUkofIYR8BYA/B9sN\njIBtIvA+AP+FUvqB/L3uMX0GpfS5+eNvAPDDYLtSdgF8FMA3U0rvPUl7eHlx+YSQl5eXl5eXl5eX\nl5eXl9cpEiHkq8E2w/mHlNIPX+7v4/X0lE8IeXl5eXl5eXl5eXl5eXmdMhFCXgDgekrpL17u7+L1\n9JRPCHl5eXl5eXl5eXl5eXl5eXldZfKLSnt5eXl5eXl5eXl5eXl5eXldZTrWltsnqd3dXXrzzTdf\nro/38vLyOrX60Ic+tEcpPXO5v8fllvcTXl5eXmp5P8Hk/YSXl5eXWq5+4rIlhG6++Wbcddddl+vj\nvby8vE6tCCGfudzf4TTI+wkvLy8vtbyfYPJ+wsvLy0stVz/hkTEvLy8vLy8vLy8vLy8vLy+vq0w+\nIeTl5eXl5eXl5eXl5eXl5eV1lcknhLy8vLy8vLy8vLy8vLy8vLyuMvmEkJeXl5eXl5eXl5eXl5eX\nl9dVJp8Q8vLy8vLy8vLy8vLy8vLy8rrK5BNCXl5eXl5eXl5eXl5eXl5eXleZrAkhQsivEEKeIIR8\nTPM6IYS8mhByPyHkbwkhX3jyX9PLy8vL67TK+wkvLy8vL5O8n/Dy8vI6nXLpEHodgOcbXv9aALfn\n/74TwC889a/l5eXl5XUF6XXwfsLLy8vLS6/XwfsJLy8vr1Mna0KIUnongInhkG8A8HrK9AEA24SQ\na0/qCz4ZUUoRp5n9wCQCKDUekmYp0iy1fh6NY+vHpYn9O2VZiszl8xx+X5IkDp+XgFLze1FKEWdm\nOwFA5PD7kCZAZj4uoxnizG5PGkXWY7I0A7V8d5plyFKzzQGAOvy+NE2RWX4fpRmyzP63iSzvAwBJ\nmiGz/W2yjNndojh1sHkcg9p+X0aROZyfaeLweWkGarlGsyxD6vD3yzL7+RJn1Pp5aUaRuIwvV5Gu\nRD8BOI5ZrtdPFlvPHcBx3Mqo/boGu4Zsn+nqL1zGLvbdHL4/pUgcvn/scH0DYL7aIhdfDTD7u9gs\ndbBZlqbW8RBw8
"text/plain": [
"<Figure size 1440x360 with 6 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "SeKD6ndqbkb7",
"colab_type": "text"
},
"source": [
"## Fitting models"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "q7QnA8HSbkb9",
"colab_type": "text"
},
"source": [
"### With original data"
]
},
{
"cell_type": "code",
"metadata": {
"id": "2cehMhytbkb_",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"outputId": "8827753f-b48c-4790-ef2f-59a4b5966676"
},
"source": [
"for count,dataset_name in enumerate(dataset_names):\n",
" dataset = get_dataset(dataset_name)\n",
"\n",
" model1 = ismailefendi.ImprovedWeightedFTS(partitioner=partitioners[dataset_name])\n",
" model1.name=dataset_name\n",
" model1.fit(dataset[:train_split], save_model=True, file_path='model1'+dataset_name, order=1)\n",
"\n",
" print(model1)"
],
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"text": [
"TAIEX:\n",
"A1 -> A1(0.2),A2(0.8)\n",
"A2 -> A1(0.308),A2(0.462),A3(0.231)\n",
"A3 -> A2(0.176),A3(0.706),A4(0.118)\n",
"A4 -> A3(0.095),A4(0.762),A5(0.143)\n",
"A5 -> A4(0.063),A5(0.794),A6(0.143)\n",
"A6 -> A5(0.081),A6(0.831),A7(0.089)\n",
"A7 -> A6(0.074),A7(0.832),A8(0.094)\n",
"A8 -> A6(0.01),A7(0.146),A8(0.688),A9(0.156)\n",
"A9 -> A10(0.164),A8(0.131),A9(0.705)\n",
"A10 -> A10(0.707),A11(0.114),A12(0.008),A9(0.171)\n",
"A11 -> A10(0.129),A11(0.782),A12(0.089)\n",
"A12 -> A11(0.091),A12(0.818),A13(0.091)\n",
"A13 -> A12(0.141),A13(0.798),A14(0.061)\n",
"A14 -> A13(0.07),A14(0.86),A15(0.07)\n",
"A15 -> A14(0.114),A15(0.743),A16(0.143)\n",
"A16 -> A15(0.113),A16(0.6),A17(0.275),A18(0.013)\n",
"A17 -> A15(0.008),A16(0.165),A17(0.685),A18(0.142)\n",
"A18 -> A16(0.009),A17(0.154),A18(0.684),A19(0.154)\n",
"A19 -> A18(0.176),A19(0.686),A20(0.137)\n",
"A20 -> A19(0.175),A20(0.688),A21(0.125),A22(0.013)\n",
"A21 -> A20(0.18),A21(0.639),A22(0.164),A23(0.016)\n",
"A22 -> A21(0.175),A22(0.714),A23(0.111)\n",
"A23 -> A22(0.207),A23(0.655),A24(0.138)\n",
"A24 -> A21(0.033),A22(0.033),A23(0.067),A24(0.7),A25(0.167)\n",
"A25 -> A24(0.154),A25(0.538),A26(0.308)\n",
"A26 -> A24(0.067),A25(0.467),A26(0.467)\n",
"\n",
"SP500:\n",
"A1 -> A1(0.929),A2(0.071)\n",
"A2 -> A1(0.014),A2(0.929),A3(0.057)\n",
"A3 -> A2(0.02),A3(0.967),A4(0.013)\n",
"A4 -> A3(0.026),A4(0.949),A5(0.026)\n",
"A5 -> A5(0.955),A6(0.045)\n",
"A6 -> A5(0.032),A6(0.889),A7(0.079)\n",
"A7 -> A6(0.052),A7(0.844),A8(0.104)\n",
"A8 -> A7(0.066),A8(0.811),A9(0.123)\n",
"A9 -> A10(0.077),A8(0.077),A9(0.845)\n",
"A10 -> A10(0.826),A11(0.094),A9(0.08)\n",
"A11 -> A10(0.167),A11(0.764),A12(0.069)\n",
"A12 -> A11(0.068),A12(0.743),A13(0.189)\n",
"A13 -> A12(0.084),A13(0.856),A14(0.06)\n",
"A14 -> A13(0.077),A14(0.877),A15(0.046)\n",
"A15 -> A14(0.095),A15(0.81),A16(0.095)\n",
"A16 -> A15(0.067),A16(0.831),A17(0.101)\n",
"A17 -> A16(0.106),A17(0.776),A18(0.118)\n",
"A18 -> A17(0.076),A18(0.811),A19(0.114)\n",
"A19 -> A18(0.155),A19(0.742),A20(0.103)\n",
"A20 -> A19(0.105),A20(0.791),A21(0.105)\n",
"A21 -> A19(0.013),A20(0.103),A21(0.833),A22(0.051)\n",
"A22 -> A21(0.121),A22(0.879)\n",
"\n",
"NASDAQ:\n",
"A1 -> A1(0.81),A2(0.19)\n",
"A2 -> A1(0.026),A2(0.91),A3(0.064)\n",
"A3 -> A2(0.098),A3(0.863),A4(0.039)\n",
"A4 -> A3(0.044),A4(0.85),A5(0.106)\n",
"A5 -> A4(0.076),A5(0.837),A6(0.087)\n",
"A6 -> A5(0.046),A6(0.894),A7(0.06)\n",
"A7 -> A6(0.056),A7(0.912),A8(0.033)\n",
"A8 -> A7(0.052),A8(0.9),A9(0.048)\n",
"A9 -> A10(0.047),A8(0.066),A9(0.887)\n",
"A10 -> A10(0.885),A11(0.043),A9(0.072)\n",
"A12 -> A11(1.0)\n",
"A11 -> A10(0.094),A11(0.859),A12(0.047)\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Y8k1VUO7bkcF",
"colab_type": "text"
},
"source": [
"### With transformed data"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Jc5-uMobbkcH",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 575
},
"outputId": "b3d3e3df-b7d1-4289-a263-b7afefb5b5b1"
},
"source": [
"for count,dataset_name in enumerate(dataset_names):\n",
" dataset = get_dataset(dataset_name)\n",
"\n",
" model2 = ismailefendi.ImprovedWeightedFTS(partitioner=partitioners_diff[dataset_name])\n",
" model2.name=dataset_name\n",
" model2.append_transformation(tdiff)\n",
" model2.fit(dataset[:train_split], save_model=True, file_path='model2'+dataset_name, order=1)\n",
"\n",
" print(model2)"
],
"execution_count": 8,
"outputs": [
{
"output_type": "stream",
"text": [
"TAIEX:\n",
"A1 -> A3(1.0)\n",
"A4 -> A0(0.006),A2(0.018),A3(0.018),A4(0.151),A5(0.47),A6(0.295),A7(0.042)\n",
"A6 -> A1(0.001),A2(0.003),A3(0.006),A4(0.057),A5(0.402),A6(0.471),A7(0.054),A8(0.003),A9(0.003)\n",
"A3 -> A3(0.13),A4(0.174),A5(0.391),A6(0.174),A7(0.13)\n",
"A5 -> A2(0.003),A3(0.011),A4(0.1),A5(0.502),A6(0.326),A7(0.053),A8(0.003),A9(0.001)\n",
"A7 -> A3(0.008),A4(0.024),A5(0.299),A6(0.465),A7(0.189),A8(0.016)\n",
"A9 -> A5(0.25),A6(0.75)\n",
"A2 -> A4(0.125),A5(0.375),A7(0.375),A8(0.125)\n",
"A8 -> A5(0.273),A6(0.364),A7(0.091),A8(0.273)\n",
"A0 -> A9(1.0)\n",
"\n",
"SP500:\n",
"A2 -> A3(0.4),A4(0.6)\n",
"A3 -> A0(0.017),A2(0.017),A3(0.233),A4(0.267),A5(0.25),A6(0.167),A7(0.05)\n",
"A0 -> A4(1.0)\n",
"A5 -> A2(0.001),A3(0.005),A4(0.186),A5(0.683),A6(0.114),A7(0.01),A8(0.001)\n",
"A4 -> A2(0.007),A3(0.084),A4(0.379),A5(0.451),A6(0.067),A7(0.009),A8(0.002)\n",
"A6 -> A3(0.003),A4(0.09),A5(0.517),A6(0.351),A7(0.038)\n",
"A7 -> A3(0.028),A4(0.056),A5(0.389),A6(0.361),A7(0.167)\n",
"A8 -> A5(0.333),A6(0.333),A8(0.333)\n",
"\n",
"NASDAQ:\n",
"A6 -> A3(0.001),A4(0.004),A5(0.038),A6(0.61),A7(0.324),A8(0.022),A9(0.002)\n",
"A9 -> A4(0.333),A5(0.167),A7(0.167),A8(0.333)\n",
"A3 -> A6(1.0)\n",
"A4 -> A4(0.154),A5(0.231),A6(0.231),A7(0.231),A8(0.077),A9(0.077)\n",
"A7 -> A4(0.003),A5(0.016),A6(0.502),A7(0.464),A8(0.013),A9(0.001)\n",
"A5 -> A4(0.042),A5(0.167),A6(0.583),A7(0.111),A8(0.083),A9(0.014)\n",
"A8 -> A5(0.043),A6(0.348),A7(0.543),A8(0.043),A9(0.022)\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "iy4Q6M32bkcN",
"colab_type": "text"
},
"source": [
"## Predicting with the models"
]
},
{
"cell_type": "code",
"metadata": {
"id": "W8wS_Fs-bkcP",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 749
},
"outputId": "64225d84-8550-4e58-cdf8-540194ef34fd"
},
"source": [
"fig, ax = plt.subplots(nrows=3, ncols=1, figsize=[20,10])\n",
"\n",
"\n",
"for count,dataset_name in enumerate(dataset_names):\n",
" dataset = get_dataset(dataset_name)\n",
" \n",
" ax[count].plot(dataset[train_split:train_split+200])\n",
"\n",
" model1 = cUtil.load_obj('model1'+dataset_name)\n",
"\n",
" forecasts = model1.predict(dataset[train_split:train_split+200])\n",
" \n",
" ax[count].plot(forecasts)\n",
" \n",
" ax[count].set_title(dataset_name)\n",
" \n",
"plt.tight_layout()"
],
"execution_count": 9,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nIiIiIiIiIiJyi
"text/plain": [
"<Figure size 1440x720 with 3 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "kPyLIgv-bkcU",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 143
},
"outputId": "b9a8dffb-925c-48d4-9359-e35f202a03f9"
},
"source": [
"from pyFTS.benchmarks import Measures\n",
"\n",
"rows = []\n",
"\n",
"for count,dataset_name in enumerate(dataset_names):\n",
" row = [dataset_name]\n",
" \n",
" dataset = get_dataset(dataset_name)\n",
" \n",
" test = dataset[train_split:train_split+200]\n",
"\n",
" model1 = cUtil.load_obj('model1'+dataset_name)\n",
" \n",
" row.extend(Measures.get_point_statistics(test, model1))\n",
" \n",
" rows.append(row)\n",
" \n",
" \n",
"pd.DataFrame(rows,columns=[\"Dataset\",\"RMSE\",\"SMAPE\",\"Theil's U\"])\n",
" \n",
" \n",
" "
],
"execution_count": 10,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Dataset</th>\n",
" <th>RMSE</th>\n",
" <th>SMAPE</th>\n",
" <th>Theil's U</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>TAIEX</td>\n",
" <td>93.22</td>\n",
" <td>1.59</td>\n",
" <td>1.42</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>SP500</td>\n",
" <td>15.57</td>\n",
" <td>1.22</td>\n",
" <td>2.80</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>NASDAQ</td>\n",
" <td>49.38</td>\n",
" <td>2.42</td>\n",
" <td>2.06</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Dataset RMSE SMAPE Theil's U\n",
"0 TAIEX 93.22 1.59 1.42\n",
"1 SP500 15.57 1.22 2.80\n",
"2 NASDAQ 49.38 2.42 2.06"
]
},
"metadata": {
"tags": []
},
"execution_count": 10
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "xxBPaizXbkca",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 749
},
"outputId": "0f937ea3-d7dc-47e9-b48b-a7aa24d84c8a"
},
"source": [
"fig, ax = plt.subplots(nrows=3, ncols=1, figsize=[20,10])\n",
"\n",
"\n",
"for count,dataset_name in enumerate(dataset_names):\n",
" dataset = get_dataset(dataset_name)\n",
" \n",
" ax[count].plot(dataset[train_split:train_split+200])\n",
"\n",
" model1 = cUtil.load_obj('model2'+dataset_name)\n",
"\n",
" forecasts = model1.predict(dataset[train_split:train_split+200])\n",
" \n",
" ax[count].plot(forecasts)\n",
" \n",
" ax[count].set_title(dataset_name)\n",
" \n",
"plt.tight_layout()"
],
"execution_count": 11,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nbET7ZCXSK4gIR
"text/plain": [
"<Figure size 1440x720 with 3 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "7c4zQ-8Tbkcf",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 143
},
"outputId": "eddb17fe-cce1-4956-8d50-1fd41a482a88"
},
"source": [
"from pyFTS.benchmarks import Measures\n",
"\n",
"rows = []\n",
"\n",
"for count,dataset_name in enumerate(dataset_names):\n",
" row = [dataset_name]\n",
" \n",
" dataset = get_dataset(dataset_name)\n",
" \n",
" test = dataset[train_split:train_split+200]\n",
"\n",
" model1 = cUtil.load_obj('model2'+dataset_name)\n",
" \n",
" row.extend(Measures.get_point_statistics(test, model1))\n",
" \n",
" rows.append(row)\n",
" \n",
" \n",
"pd.DataFrame(rows,columns=[\"Dataset\",\"RMSE\",\"SMAPE\",\"Theil's U\"])\n",
" \n",
" \n",
" "
],
"execution_count": 12,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Dataset</th>\n",
" <th>RMSE</th>\n",
" <th>SMAPE</th>\n",
" <th>Theil's U</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>TAIEX</td>\n",
" <td>64.89</td>\n",
" <td>1.11</td>\n",
" <td>0.99</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>SP500</td>\n",
" <td>5.17</td>\n",
" <td>0.38</td>\n",
" <td>0.94</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>NASDAQ</td>\n",
" <td>24.20</td>\n",
" <td>1.16</td>\n",
" <td>1.01</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Dataset RMSE SMAPE Theil's U\n",
"0 TAIEX 64.89 1.11 0.99\n",
"1 SP500 5.17 0.38 0.94\n",
"2 NASDAQ 24.20 1.16 1.01"
]
},
"metadata": {
"tags": []
},
"execution_count": 12
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0xXCFOWmbkcm",
"colab_type": "text"
},
"source": [
"## Residual Analysis"
]
},
{
"cell_type": "code",
"metadata": {
"id": "rMdpHAaZbkcn",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1000
},
"outputId": "d9292a71-1cce-478a-ed0a-ae96ab08d3a6"
},
"source": [
"from pyFTS.benchmarks import ResidualAnalysis as ra\n",
"\n",
"for count,dataset_name in enumerate(dataset_names):\n",
" dataset = get_dataset(dataset_name)\n",
" \n",
" model1 = cUtil.load_obj('model1'+dataset_name)\n",
" model1 = cUtil.load_obj('model2'+dataset_name)\n",
"\n",
" ra.plot_residuals_by_model(dataset, [model1, model2])"
],
"execution_count": 14,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n/lkvEnxuHQD8J
"text/plain": [
"<Figure size 576x576 with 8 Axes>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAI4CAYAAACC61aaAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzs3XmYFNXZ9/Hvj0UUN0AQFUEU0TyY\nRDS4byguiEbUJyoGFdyIW9To+0QUo0ZDYlZjFk0wLhjHhSSiREkQcDeiguICasAFBAFRFFRAtvv9\no05DTU/3TM9Md1cv9+e6+pqqU9VdZ6Zr+tx9VpkZzjnnnHPVpEXSGXDOOeecKzYPgJxzzjlXdTwA\ncs4551zV8QDIOeecc1XHAyDnnHPOVR0PgJxzzjlXdTwAKhBJMyT1zXKsr6R5ebrOk5LOycdrucoi\n6X1JhzfxuQdJejvfeXJ11fdZ4VycpOsk3dPE5w6V9Gw9x/8laUimcyV9IWmnply3kXksannmARDr\nC4oV4U1eKOkuSZs15zXNbDczezJPWXQFEP7ZPpXUphHPMUk7FzJfSUj/vczsGTPbNck8VYpMgWi8\ngMnls0JS9/AetSpgVl0BpJUvi/JRvhSCmR1tZqOzHNvMzN4FCPn/SVOvk4+/R77+HzwA2uDbZrYZ\n0BvYA7gy4fy4ApLUHTgIMOC4RDPTgEz/5F4Qunzy+6ngUuXLnkAf4Or0ExSpljK5wb9HMVTLHztn\nZrYQmEAUCCGpjaRfSZobotU/SdokHOso6RFJn0laIumZ1A0c/9YnaZMQ5X4qaSawV/ya6d++4xG2\npPbhGovD8x+RtH2mvEvaWdJTkpZK+ljSAwX4E1WKM4ApwF3AkFRiehVs/Ju6pKdD8qvh28spIf1c\nSbPDPTBO0nax5+8maWI4tkjSVSG9jaTfSvowPH6bqolKNZFKukLSQuDOTGnh3GMlTQ/34H8kfTPT\nLytpb0nPh/MWSPqDpI2y/V5Ka6aV9D/hb/OZoiab42LH7pL0R0mPSvpc0guSejTtbak+aZ8Ve0ua\nKmlZuF9+E05LvUefhfdoP0ktJF0taY6kjyTdLWnL2OueEY59IulHade5TtLfJd0jaRkwtL57JDzH\nJF0gaVZ4n2+Q1CPcd8skjYmf7+oys/nAv4Cvw/rPm5GSngOWAztJ2i58jiwJnyvnpr3MxpIeCO/B\ny5J2Tx2QNFzSO+HYTEknpD1X4X1dKuktSf1iB7I2P4X3fmdJw4DBwA/DffhPSf8n6R9p5/9O0s2N\n/XukvUZ993ed/4eGrpWJB0BpFAUXRwOzQ9KNwC5EAdHOQBfgmnDscmAe0AnoDFxFVKOQ7lqgR3gc\nRazAzUELosJuB6AbsAL4Q5ZzbwAeA9oD2wO/b8R1qs0ZQE14HCWpc0NPMLODw+buoUr4AUmHAT8D\nTga2BeYA9wNI2hyYBPwb2I7o/pkcXmMEsC/RfbU7sDe1vwVtA3Qget+HZUqTtAdwB/A9YCvgz8A4\nZW7SWwv8AOgI7Af0Ay7I9nvFnyipNfBPontra+D7QI2keBPZIODHRPfebGBkxj+ia8jNwM1mtgXR\n58WYkJ56j9qF9+h5YGh4HArsBGxG+GyQ1Au4haiw2hbYkuizK24g8HegHdH/QdZ7JOYo4FtE9+4P\ngVHAaUBXokLs1Gb87hVPUldgAPBKLPl0ov/xzdnw+TGP6DPjO8BPw+dMykDgb0SfBfcCD4X/UYB3\niGq2tyT6f7xH0rax5+4TzulIVC49KKlDrvk3s1FE98ovwn34beAeoL+kduF3bEX0eXB3Q6+X5e+R\nMpQs9zeZ/x8az8yq/gG8D3wBfE4UwEwm+lAQ8CXQI3bufsB7Yft64GFg5yyveXjYfhfoHzs2DJgX\n27f4axDVSvwkS157A5/G9p8EzgnbdxN9IG2f9N+0lB/AgcBqoGPYfwv4QfrfM+wPBZ6t5726nejD\nILW/WXjt7kSFwStZ8vAOMCC2fxTwftjuC6wCNo4dz5R2K3BD2uu+DRySfg9muP6lwNh6fq++qXuU\n6AN1IdAidvw+4LrY/fqX2LEBwFtJv8+l8oh9vnwWeyxP3VdpnxVPExVcHdNeo3t4j1rF0iYDF8T2\ndw33XiuiL2n3xY61DfdP6jrXAU83kO9M98gBsf1pwBWx/V8Dv036711qj7T3fw5RYLpJOPYkcH3s\n3K5EgejmsbSfAXfF3rcpsWMtgAXAQVmuPR0YGLaHAh8Cih1/ETg9lpdzYudm/NwjQ/lEVItzbtg+\nFpjZjL9HKg/13d91/h+a8vAaoA2ON7PNiT74v0YUIXci+uCYFqqFPyP6Nt8pPOeXRN92H5P0rqTh\nWV57O+CD2P6cXDMlqa2kP4dqwGVEH5DtJLXMcPoPiYK2F0MzxVm5XqfKDAEeM7OPw/69NK5WLm47\nYu+nmX0BfEL0bbsrUaDT4PPC9nax/cVmtjLtOelpOwCXp+7NcH92TXsdACTtoqj5dGG4j35KdI/n\nYjvgAzNbl5bfeI3Cwtj2cqJA0G1wvJm1Sz2oW7OScjZRjfNbkl6SdGw9r5npHmpFVBtd6zPHzJYT\n3Zdx8c+kXO+RRbHtFRn2/X3PLPX+72BmF5jZitix+PuwHbDEzD6PpaX/r8Xf13VsqC1KNXtOj30e\nfJ3a7+F8C9FE7LXrfF40wWiimkDCz782cH59f4+U+u7vvPAAKI2ZPUUU4f4K+Jjon3q32IfXlhZ1\n3sLMPjezy81sJ6KOtJfF21RjFhAVTCnd0o4vJwq0UraJbV9OFPnuY1G1eKrqTxnyvtDMzjWz7Yia\nRW5RBY5Yag5F/bdOBg4JH/QLiar9dw9t6V+S/b3I5EOiQCT1+psSNUfNJ/qgyjZ0tNbziO6JD2P7\nmZpS09M+AEbGC1Yza2tm92V47q1ENV09w310FRnuoXry2lW1O2h2I/odXR6Z2SwzO5WoqfHnwN/D\nPZXpfsh0D60hCkoWEDWDA+vv+63SL5e235x7xDVd/H34EOgQms9T0v/X1pcl4X9ye+BDSTsAtwEX\nAVuFQPsNar+HXSTF99M/dxqb35SHgG9K+jpRDVBNI18zk/ru70x5aDQPgDL7LXAE8A2iG+omSVsD\nSOoi6aiwfWzoGCZgKVHV5boMrzcGuFJRh+btifpQxE0HviuppaT+wCGxY5sTBWGfhbbaa7NlWtJJ\n2tBB+lOimyRTfqrZ8UTvUy+i5sTewP8AzxD1C5oOnBhq3nYm+kYet4jaQc19wJmSeoe+Nz8FXjCz\n94FHgG0lXaqo0/PmkvaJPe9qSZ0kdSRqsmjs/B63AedJ2keRTSUdk/bhmbI5sAz4QtLXgPMb+L3i\nXiAK0n8oqbWiOWu+Tejr5PJH0mmSOoVv9p+F5HXA4vAz/d77gaQdFQ0j/inwgJmtIerb821J+yvq\nmHwdDQczDd0jrsDM7APgP8DPJG2saFDD2dT+bPiWpBNDX5tLga+IBnSkAuXFAJLOpG7n4q2Bi8P/\n8UlEn33jG5nNOp8VoWb670S16S+a2dxGvmYm9d3fmf4fGs0DoAzMbDFRf5prgCuImrmmhGrhSUQ1\nMgA9w/4XwPPALWb2RIaX/DFR9d17RB1J06sHLyEqUD4j6rT4UOzYb4FNiGqjphA1wWWzF/CCpC+A\nccAlFuZucOsNAe40s7mhxmyhRSP//kD0t7+JqK/EIqJq3fRvMtcBo0MV88lmNgn4EfAPom/dPYg6\nABKqsY8gem8XArOIOvQB/ASYCrwGvA68HNJyZmZTgXND3j8luk+HZjn9/wHfJerndhuQPkKw1u+V\ndp1V4Xc4mug+vAU4w8zeakx+XU76AzPC//DNwCAzWxGasEYCz4X3aF+iDvB/JWoWfw9YSfhyZWYz\nwvb9RPflF8BHRIVlNg3dI644TiXq4/IhMBa4NnzOpDwMnEL0P386cKKZrTazmUT9sJ4n+vz6BvBc\n2mu/QFRufUx0P
"text/plain": [
"<Figure size 576x576 with 8 Axes>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nuk59QnQcHWVm2
"text/plain": [
"<Figure size 576x576 with 8 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "WjlkxhApbkcr",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "iDuKLD0zbkcw",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 0,
"outputs": []
}
]
}