pyFTS/GOOGLE COLAB - Ismail & Efendi - ImprovedWeightedFTS.ipynb

958 lines
722 KiB
Plaintext
Raw Normal View History

{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Ismail%20%26%20Efendi%20-%20ImprovedWeightedFTS.ipynb",
"version": "0.3.2",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"[View in Colaboratory](https://colab.research.google.com/github/petroniocandido/pyFTS/blob/master/GOOGLE%20COLAB%20-%20Ismail%20&%20Efendi%20-%20ImprovedWeightedFTS.ipynb)"
]
},
{
"metadata": {
"id": "JslYilggi0HL",
"colab_type": "text"
},
"cell_type": "markdown",
"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."
]
},
{
"metadata": {
"id": "DzVVKHPNi0HP",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Environment Setup"
]
},
{
"metadata": {
"id": "JGMvfv1Fi0HR",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### Library install/update"
]
},
{
"metadata": {
"id": "tlFMsqImi0HT",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"!pip3 install -U git+https://github.com/petroniocandido/pyFTS\n",
"!pip3 install dill"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "WyNTIoSli0Hb",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### External libraries import"
]
},
{
"metadata": {
"id": "dnImGFxmi0Hd",
"colab_type": "code",
"colab": {},
"outputId": "8f71febe-378a-4317-df3d-fa38fa23d9b0"
},
"cell_type": "code",
"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": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "qrj1Rykpi0Ho",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### Common pyFTS imports "
]
},
{
"metadata": {
"id": "fMuSTFPki0Hp",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"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": []
},
{
"metadata": {
"id": "d74EgH_yi0Hu",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Common data transformations"
]
},
{
"metadata": {
"id": "Wc5adG6ji0Hx",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"from pyFTS.common import Transformations\n",
"\n",
"tdiff = Transformations.Differential(1)\n",
"\n",
"boxcox = Transformations.BoxCox(0)"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "1qAPqLl-i0H8",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Datasets"
]
},
{
"metadata": {
"id": "SZ0QWfoPi0H_",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### Data Loading"
]
},
{
"metadata": {
"id": "f92yR8w8i0IB",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"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": []
},
{
"metadata": {
"id": "GF-j8XPhi0IH",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### Visualization"
]
},
{
"metadata": {
"id": "JYaHcBqWi0IJ",
"colab_type": "code",
"colab": {},
"outputId": "22c691db-8fb3-4e23-8625-73281801c929"
},
"cell_type": "code",
"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": []
}
}
]
},
{
"metadata": {
"id": "QHdi1WcDi0IR",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### Statistics"
]
},
{
"metadata": {
"id": "sGSm6qO9i0IS",
"colab_type": "code",
"colab": {},
"outputId": "5a7c034a-bd1f-42ea-9a10-3ac33497353f"
},
"cell_type": "code",
"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
}
]
},
{
"metadata": {
"id": "S_oP3C1ri0Id",
"colab_type": "text"
},
"cell_type": "markdown",
"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."
]
},
{
"metadata": {
"id": "PiYrN-Ygi0Ig",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"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 = '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=[ismailefendi.ImprovedWeightedFTS],\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=[ismailefendi.ImprovedWeightedFTS],\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": []
},
{
"metadata": {
"id": "1bL5qdoei0Ik",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"from pyFTS.benchmarks import Util as bUtil\n",
"\n",
"df1 = bUtil.get_dataframe_from_bd(\"benchmarks.db\",\n",
" \"tag = 'partitioning' and model = 'IWFTS' and measure = 'rmse'and transformation is null\")\n",
"\n",
"df2 = bUtil.get_dataframe_from_bd(\"benchmarks.db\",\n",
" \"tag = 'partitioning' and model = 'IWFTS' 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": []
},
{
"metadata": {
"id": "TXygoLBIi0Iu",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### Comparing the partitioning schemas"
]
},
{
"metadata": {
"id": "ER5IwllQi0Iv",
"colab_type": "code",
"colab": {},
"outputId": "c55c71ec-6c62-4659-8404-de286539f5f4"
},
"cell_type": "code",
"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": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABIQAAAFKCAYAAABsCIRVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzsvXm8ZMlV3/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": [
"<matplotlib.figure.Figure at 0x7efc3695aac8>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "RynRlaEri0I1",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Fitting models"
]
},
{
"metadata": {
"id": "dXw-ezB8i0I3",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### With original data"
]
},
{
"metadata": {
"id": "W2FeK2mDi0I3",
"colab_type": "code",
"colab": {},
"outputId": "f85ee988-a5aa-4e1d-80d6-7c0b0d080f73"
},
"cell_type": "code",
"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": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"TAIEX:\n",
"A1 -> A1(0.2),A2(0.8)\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",
"A2 -> A1(0.308),A2(0.462),A3(0.231)\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",
"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",
"\n",
"SP500:\n",
"A1 -> A1(0.929),A2(0.071)\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",
"A2 -> A1(0.014),A2(0.929),A3(0.057)\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",
"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",
"\n",
"NASDAQ:\n",
"A1 -> A1(0.81),A2(0.19)\n",
"A10 -> A10(0.885),A11(0.043),A9(0.072)\n",
"A11 -> A10(0.094),A11(0.859),A12(0.047)\n",
"A12 -> A11(1.0)\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",
"\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "b4lCC4R2i0I-",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### With transformed data"
]
},
{
"metadata": {
"id": "cgfcC9aCi0JA",
"colab_type": "code",
"colab": {},
"outputId": "5ca77cbb-00a3-4be0-a572-00b9273b79d4"
},
"cell_type": "code",
"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": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"TAIEX:\n",
"A0 -> A4(1.0)\n",
"A1 -> A4(0.667),A5(0.333)\n",
"A2 -> A2(0.273),A3(0.091),A4(0.364),A5(0.273)\n",
"A3 -> A2(0.016),A3(0.189),A4(0.465),A5(0.299),A6(0.024),A7(0.008)\n",
"A4 -> A1(0.003),A2(0.003),A3(0.054),A4(0.471),A5(0.402),A6(0.057),A7(0.006),A8(0.003),A9(0.001)\n",
"A5 -> A0(0.001),A2(0.003),A3(0.053),A4(0.326),A5(0.502),A6(0.1),A7(0.011),A8(0.003)\n",
"A6 -> A3(0.042),A4(0.295),A5(0.47),A6(0.151),A7(0.018),A8(0.018),A9(0.006)\n",
"A7 -> A3(0.13),A4(0.174),A5(0.391),A6(0.174),A7(0.13)\n",
"A8 -> A2(0.125),A3(0.375),A5(0.375),A6(0.125)\n",
"A9 -> A1(0.5),A7(0.5)\n",
"\n",
"SP500:\n",
"A2 -> A2(0.333),A4(0.333),A5(0.333)\n",
"A3 -> A3(0.167),A4(0.361),A5(0.389),A6(0.056),A7(0.028)\n",
"A4 -> A3(0.038),A4(0.351),A5(0.517),A6(0.09),A7(0.003)\n",
"A5 -> A2(0.001),A3(0.01),A4(0.114),A5(0.683),A6(0.186),A7(0.005),A8(0.001)\n",
"A6 -> A2(0.002),A3(0.009),A4(0.067),A5(0.451),A6(0.379),A7(0.084),A8(0.007)\n",
"A7 -> A3(0.05),A4(0.167),A5(0.25),A6(0.267),A7(0.233),A8(0.017),A9(0.017)\n",
"A8 -> A6(0.6),A7(0.4)\n",
"A9 -> A6(1.0)\n",
"\n",
"NASDAQ:\n",
"A0 -> A2(0.333),A3(0.333),A6(0.333)\n",
"A1 -> A2(0.333),A5(0.333),A6(0.333)\n",
"A2 -> A0(0.022),A2(0.043),A3(0.543),A4(0.348),A5(0.043)\n",
"A3 -> A1(0.001),A2(0.013),A3(0.464),A4(0.502),A5(0.016),A6(0.003)\n",
"A4 -> A0(0.001),A1(0.001),A2(0.022),A3(0.324),A4(0.61),A5(0.038),A6(0.004),A7(0.001)\n",
"A5 -> A1(0.014),A2(0.083),A3(0.111),A4(0.583),A5(0.167),A6(0.042)\n",
"A6 -> A0(0.077),A2(0.077),A3(0.231),A4(0.231),A5(0.231),A6(0.154)\n",
"A7 -> A4(1.0)\n",
"\n"
],
"name": "stdout"
}
]
},
{
"metadata": {
"id": "EH-S7TJti0JS",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Predicting with the models"
]
},
{
"metadata": {
"id": "H7RzpFIZi0JU",
"colab_type": "code",
"colab": {},
"outputId": "d28615ae-d26e-4c99-c3f1-6031e4983fc1"
},
"cell_type": "code",
"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": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nIiIiIiIiIiJyi
"text/plain": [
"<matplotlib.figure.Figure at 0x7efc363de828>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "t6YyaycEi0Jg",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"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": 0,
"outputs": []
},
{
"metadata": {
"id": "k1CjPyr7i0Jl",
"colab_type": "code",
"colab": {},
"outputId": "cdb05a10-275b-415e-a0b2-28cecc9f92e3"
},
"cell_type": "code",
"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": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nkJaZRUJKBvEpG
"text/plain": [
"<matplotlib.figure.Figure at 0x7efc369e48d0>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "V3uOr7ZJi0Ju",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"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": 0,
"outputs": []
},
{
"metadata": {
"id": "Q2TFkWXvi0J2",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Residual Analysis"
]
},
{
"metadata": {
"id": "qBeFl9Mei0J7",
"colab_type": "code",
"colab": {},
"outputId": "168a9184-d638-4d32-a4d5-8a97b6983f52"
},
"cell_type": "code",
"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(dataset, [model1, model2])"
],
"execution_count": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nRsC5ovlwlXPOO
"text/plain": [
"<matplotlib.figure.Figure at 0x7f1145edefd0>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAI4CAYAAABndZP2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3XecXHW9//HXO9tSSUghkARIIAEM\nIAiR5k9BQgmohKvoBQuRi8QCWPBeDViwi+WK5aIIgoCFchE1CoohtIsSIHQSSkIo6YX0nt39/P44\n39k9OzuzO7M7M2fK5/l47GPP+Z4zM5+ZPbPzmW+VmeGcc845V036JB2Ac84551yheYLjnHPOuarj\nCY5zzjnnqo4nOM4555yrOp7gOOecc67qeILjnHPOuarjCU6FkzRP0glZjp0gaUmBHud+SR8rxH25\nZPk1Ux4kjZVkkup7ePvLJP2q0HG5dpX+XpG0j6TNkuoKfd+VwBOcEpL0qqRt4YJbIekGSQN7c59m\ndrCZ3V+gEF0ZKcb1ApVxzUgaGJ733/K8XcE+dMpJpudlZt8xM08gqc33SrYEOTz3bwGY2etmNtDM\nWrq5r49KeqiY8SbBE5zSe4+ZDQQOB94CXJpwPK681er18j5gB3CypD2TDqY7mWpheloz43qsVt8r\nZU2RRHINT3ASYmYrgLuJ3oxIapL0Q0mvS1op6WpJ/cKx4ZL+Kmm9pLWS/i91wYRvLieF7X4he18n\naT7w1vhjhmx/fGy/LdOXtHt4jNXh9n+VNCZT7JLGS3pA0gZJayTdWoSXyMWkXy9Q9dfMNOBq4Bng\nw7nEJGkA8DdgVPgmv1nSqPA6/VjSsvDzY0lNsdtPlfSUpI2SXpY0JZSPkjQzvH4LJV0Qu83XJN0u\n6beSNgIfzVLWR9KMcL9vSLpN0tAsr9F5kp6XtEnSIkkfD+XZntfXJP02dvszFDWprFfU5PGm2LFX\nJf2npGfC3+BWSX27+RtUpBp8r2SltFoeRTU1i8I19oqkD4Xr5Grg2HBtrQ/nDpZ0U4j5NUlfjr0u\ndZL+O8T3iqSL0h7nfknflvRPYCuwX7brO5x/gqQlkr4gaZWk5ZLOlHS6pJfC3+WyfJ+/JzgJCRf3\nacDCUHQFcADRm3I8MBr4ajj2eWAJMAIYCVwGZFpj43Jg//BzKtGHRK76AL8G9gX2AbYB/5Pl3G8C\n/wB2B8YAP8vjcVwPZLheoEqvGUn7AicAvws/5+YSjJltIXqNloVq+YFmtgz4EnAM0et0GHAU8OXw\nWEcBNwH/BQwB3gG8Gu7yFqLXcBRwFvAdSSfGHnIqcHu43e+ylF0MnAkcH+5nHXBVlqewCng3sBtw\nHnClpCO6eF7x1+wA4Gbgs0R/87uAv0hqjJ32AWAKMA54M/DRLHFUtFp6r+QjJMo/BU4zs0HAccBT\nZvY88Ang4XBtDQk3+RkwGNiP6Po9l+i6BLiA6DU+HDiC6BpP9xFgOjAIeI0s13fs/D2BvrT/ba4l\n+nJzJPB24CuSxuX1pM3Mf0r0Q/SPczOwiegNNJvoH6GALcD+sXOPBV4J298A/gyMz3KfJ4XtRcCU\n2LHpwJLYvsXvA7gB+FaWWA8H1sX27wc+FrZvAq4BxiT9mlbzT7brJRyr2muGKPl4KmyPBlqAt+QS\nE1FitCTt/l4GTo/tnwq8GrZ/CVyZIYa9w+MOipV9F7ghbH8NeDDtNpnKngcmx/b3AnYB9cDY8Fzq\ns7wOfwI+08Xz+hrw27D9FeC22LE+wFLghNjf/MOx498Hrk76Gvf3Ss/fK7HrZ33az87Y+6HtGgMG\nhOPvA/ql3ddHgYdi+3XhfibGyj4O3B+27wU+Hjt2UvxaDs/nG93En359bwPqwv6gcH9Hx85/HDgz\nn+vCa3BK70yLsucTgIOA4UTfHPoDj4dq0vXA30M5wA+Ivo38I1Ttzchy36OAxbH913INSlJ/Sb8M\nVZEbgQeBIcrc+/4LRP80Hg1V4v+R6+O4vGW6XqC6r5lzCTUiZrYUeID8vi2nG0XH5/VaKIMokXk5\ny23WmtmmtNuNju0vprP0sn2BP8b+Rs8TJU4j028o6TRJc0J1/HrgdNr/3t3p8BzNrDXEEo93RWx7\nK9DrTrhlphbfKwDDzWxI6gf4faaTLKoJ/Hei2prlku6UdFC2+wQa6Py+SV1P6a9Ft++FHK7vN6y9\nM/S28Htl7Pg28rxmPcFJiJk9QJTh/xBYQ/THOzh2oQ62qMMcZrbJzD5vZvsBZwCXSJqc4W6XE/3D\nTtkn7fhWojd6Srzz5ueBA4ky5t2IquoheqOlx77CzC4ws1FEWf3P423PrvDSrheo0mtG0nHABOBS\nRaNhVgBHAx9Ue6fdrmLK1LSwjCjRiD/HVBPPYqImh0y3GSppUNrtlnbzWOlli4maBIbEfvqGxK2N\noj5BfyD6+44MH1R30f5aZnqs9HjbnqMkEf1dl2a9RZWqlfdKT5jZ3WZ2MlFN4gtEzUDQ+fpaQ1TT\nmP6+SV1Py4maz1Lir0vbw6U2cri+i8ITnGT9GDgZOJToQrtS0h4AkkZLOjVsv1tRxzMBG4i+AbZm\nuL/biD4Ydg/t0BenHX+K6IOiTlFHyuNjxwYR/RNYr6gT5OXZgpb0frV3kFtHdCFniscV1o+JRhUd\nFr6hV+M1Mw2YBUwkqsY/HDgE6EfU5t9dTCuBYZIGx8puBr4saYSk4UTt+6nOudcB50marKhD8GhJ\nB5nZYuBfwHcl9ZX0ZuD82O1ydTXw7dCviBDD1AznNQJNwGqgWdJpwCndPK+424B3hefRQPSBuiM8\nh1pUC++VvEgaqahD/QCia2Nz7H5XAmMU+myFmpTbiK7dQeH6vYT26/824DPhdRwCfLGbh+/u+i4K\nT3ASZGaridpbv0p0gSwE5oQqzHuIMn6IvtHeQ3RBPgz83Mzuy3CXXyeqRnyFqJPab9KOfwZ4D1E7\n7IeI2kBTfkz0IbIGmENUhZvNW4FHJG0GZhK1oy7K4Sm7Xki7XqDKrhlFo3o+APwsfItN/bwS4ko1\nU2WNycxeIEpoFoXmiFHAt4C5RCOyngWeCGWY2aOEDo9EH24P0P6t9RyiPgzLgD8Cl5vZPV08x0x+\nEp7vPyRtInqdjk4/KTSFfZrog2Md8MFwu66eV/z2LxJ1yPwZ0d/jPUTDpnfmGW9VqPb3Sg/1IUpS\nlgFriRKwT4Zj9wLzgBWS1oSyi4n6Li0CHiJq+ro+HLuW6DV4BniSqDammSg57KS767tYFDrvOOec\nc87lLdTIXG1m+3Z7cgl5DY5zzjnncqZoTqDTJdVLGk3U5PbHpONK5zU4zjnnnMuZpP5EzbkHEfUt\nupOoKW1jooGl8QTHOeecc1XHm6icc845V3WqfjG44cOH29ixY5MOw5XY448/vsbMRnR/ZnXx6702\n+fXuakmu13vVJzhjx45l7ty5SYfhSkxSzrOMVhO/3muTX++uluR6vXsTlXPOOeeqjic4zjnnnKs6\nJUlwJF0vaZWk52Jlh4eFt56SNFfSUaFckn4qaaGkZxRbTl3SNEkLwk9vFt9zzjnnXBUrVQ3ODcCU\ntLLvA183s8OJptP+fig/jWjq7AlEy9H/AiC2fsfRwFHA5ZJ2L3rkzjnnnKs4JUlwzOxBorUvOhQD\nu4XtwbSv7jsVuMkic4iWlN8LOBWYZWZrzWwd0YJ86UmTc84551yio6g+C9wt6YdEidZxoXw0sDh2\n3pJQlq28E0nTiWp/2Gef9BXtnXPOOVftkuxk/Engc2a2N/A54LpC3bGZXWNmk8xs0ogRNTc1hKsQ\nmfqmpR3P2h/NOedc15JMcKYBd4Tt/yXqVwOwFNg7dt6YUJat3LlKdQNdN7Nm7I/mnHOue0kmOMuA\n48P2icCCsD0TODd8ez0G2GBmy4G7gVMk7R46F58SylyNumf+Sk784f0sXrs16VB6JEvftLhs/dGc\nc851oyR9cCTdD
"text/plain": [
"<matplotlib.figure.Figure at 0x7f11461d7dd8>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nyQpg37j1UaFMR
"text/plain": [
"<matplotlib.figure.Figure at 0x7f1145991940>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "vw90oLSBi0KA",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
""
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "6H8SSa5Ri0KD",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
""
],
"execution_count": 0,
"outputs": []
}
]
}