pyFTSex/tutorial/pyFTS/developer/GOOGLE COLAB Sadaei et Al - ExponentialyWeightedFTS.ipynb

843 lines
720 KiB
Plaintext
Raw Normal View History

2024-08-15 12:15:32 +04:00
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "Sadaei%20et%20Al%20-%20ExponentialyWeightedFTS.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/pyFTS/notebooks/GOOGLE%20COLAB%20Sadaei%20et%20Al%20-%20ExponentialyWeightedFTS.ipynb)"
]
},
{
"metadata": {
"id": "7RjZ5q1HligO",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# First Order Exponentialy Weighted Fuzzy Time Series by Sadaei et al. (2013)\n",
"\n",
"H. J. Sadaei, R. Enayatifar, A. H. Abdullah, and A. Gani, “Short-term load forecasting using a hybrid model with a \n",
"refined exponentially weighted fuzzy time series and an improved harmony search,” Int. J. Electr. Power Energy Syst., vol. 62, no. from 2005, pp. 118129, 2014.\n"
]
},
{
"metadata": {
"id": "RYhNljmNligS",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Environment Setup"
]
},
{
"metadata": {
"id": "97jpJJ2sligU",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### Library install/update"
]
},
{
"metadata": {
"id": "TIUHy938ligW",
"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": "RLORwUr6lige",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### External libraries import"
]
},
{
"metadata": {
"id": "m5A2AAXFligg",
"colab_type": "code",
"colab": {},
"outputId": "313a66d2-c56c-4fc5-c9a5-03535195c176"
},
"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": "CJYpnhNYligq",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### Common pyFTS imports "
]
},
{
"metadata": {
"id": "0hSyUcGRligt",
"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 sadaei\n"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "7nTzPaNFligz",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Common data transformations"
]
},
{
"metadata": {
"id": "we6pdkswlig2",
"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": "D91oCJsDlig-",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Datasets"
]
},
{
"metadata": {
"id": "mZY70gJblihA",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### Data Loading"
]
},
{
"metadata": {
"id": "rpNVwv6SlihC",
"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": "HcaE8FbMlihG",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### Visualization"
]
},
{
"metadata": {
"id": "9I6Q375olihI",
"colab_type": "code",
"colab": {},
"outputId": "a310d4a0-7c13-476e-c420-7801cdc8857b"
},
"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": "iVBORw0KGgoAAAANSUhEUgAAAmoAAAE/CAYAAAD2ee+mAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzsnXd4FOX2x79n0yD0EjoYCAEEpIug\nFBGkesUuVvSiXK+9XQV7F7tiwWvB8ruKoGIF6V167yWE0EsIEEhC6p7fH/PO7ruzs32TnV3ez/Pk\nYeadsrMhM3PeU76HmBkKhUKhUCgUCuthi/QFKBQKhUKhUCjMUYaaQqFQKBQKhUVRhppCoVAoFAqF\nRVGGmkKhUCgUCoVFUYaaQqFQKBQKhUVRhppCoVAoFAqFRVGGmkKhUCgUCoVFUYZalEJEedKPnYjO\nSuu3SPvdQURMRDcajr+UiA5I6wuIqNBw3j/Etn8Q0REiqi3tP5yIDhJRjYr4vgqFPxBRLyJaSkS5\nRHSCiP4mogvFfVAm/q5PE9F6IrpCHJMq7hH5b/9Z6ZxJRDRRHHeEiB41fGZ/ItpORAVENJ+Izqvo\n761QKGIXZahFKcxcVf8BsA/AP6Sx76RdRwI4AeB2P057v3xeZv6H+Kw/AMwD8B4AEFFNABMA/JuZ\nc8P5vRSKYCGi6gD+BPAhgNoAGgN4EUCR2GWZuF9qAvgSwBQiqiWdoqb0t/+yNP4CgHQA5wHoB+AJ\nIhosPrMugKkAnhWfuRrA5PL5hgqFO0SURUTHiKiKNHYXES2Q1omIMoloq8nx7YholpjYnCKiNUQ0\nVGy7VDgC9AnMASKaQkQXmpzH42eI7VcQ0UoiyieiHCL6HxE1DssvIcZRhloMI2b2fQGMBjCIiBqE\ncLoHAQwhokHQDLaFzPx7GC5ToQgXrQCAmScxcxkzn2XmWcy8Ud6Jme0AJgKoDCDNj/OOBPAyM59k\n5m0APgdwh9h2DYAtzPwjMxdCM+o6ElGbsHwjhcI/4gA85GV7HwD1ALQwMbL+ADAbQAOxz4MATkvb\nD4kJTjUAPQBsB7CYiPr7+xlEdB2A7wG8D6AugHYAisV5avr7Jc9VlKEW29wOYDUz/wxgG4BbfOzv\nEWY+Du1B8B2AK6DdzAqFldgJoIyIviGiIQZvmQMiigdwF4A8ALukTXuFx+Ar4SmDOEdDABuk/TZA\ne9FA/OvYxsz5AHZL2xWKiuAtAI97MXpGAvgNwHSxDMDhEW4O4HNmLhY/fzPzEuMJWOMAMz8H4AsA\nb/j5GQTgHQCvMPP3YgJ1BNo9WADvBqYCylCLdW6HNouB+NdX+HO8cH3rPy8bti8HUAPALGbODvO1\nKhQhwcynAfQCwNC8XtlE9DsR1Re79CCiUwCOALgJwNUidH8cwIXQQptdoXkO9PSBquJfOcSfK/bR\ntxvD//J2haIiWA1gAYDHjRuIKBnAddD+pr8DMIKIEsXmHAAZAP5HRFdJ94ovpgLooodbfXxGawDN\nAPwon0B4tn8GMNDPzzxnUYZajEJEl0CbKf0ghr4HcAERdfJy2IPMXFP6edaw/TMA3wIYSkQ9w3/V\nCkVoMPM2Zr6DmZsAaA+gEbRwCwAsF3/XdZm5BzPPEcfkMfNqZi5l5qMA7gcwkIiqQfO6AUB16WOq\nAzgjlvMM24zbFYqK4jkADxBRimH8Gmh5mrMATAOQAGAYoHnJoOVdZkHzeh0mokVElO7jsw4BIGj5\nnl4/A1qoEwAOm5znMADj9SoMKEMtdhkJ7UZaT0RHAKyQxgOGiEYBaArgXgBPAfhCmjEpFJaDmbcD\n+BqawRbQoeJfGzOfhPYy6Sht7whgi1jeIm8THoY0abtCUSEw82ZoxTRjDJtGApgiJiKF0LxYI6Xj\nDjDz/cycBs2rnA9tQu6NxtDuk1N+fMZx8W9Dk/M0lLYrPKAMtRiEiCoBuAFaEUEn6ecBADeLHJ1A\nztcIWg7E3cxcBOBTaC7zp8N53QpFKBBRGyJ6jIiaiPWm0EKcy30cdxERtSYiGxHVATAewAKpovlb\nAM8QUS1RJHA3NAMQAH4B0J6IrhX33XMANgojUaGoaJ6H9vfZGADEvXAZgFuFtMwRaCHKoXoepgwz\n7wfwMXxPbq4GsJaZ8/34jB0ADgC4Xj4BEdkAXAstZKvwgjLUYpOrAJwF8C0zH9F/oFW6xQMY7OG4\njwxaUmvE+CcAfmDmxYDDXX43gIeJSCVNK6zCGQAXAVhBRPnQDLTNAB7zcVwLADPE8ZuhhXBukrY/\nD61AYC+AhQDeYuYZACByNa8F8CqAk+LzR4Tp+ygUAcHMGdDkYfRir9ugFdm0hnPC3gqa4XSTmHy8\nSEQtxUSlLoB/wmRyI+Q3GhPR89AKAZ7y5zPE++JxaJOdm4moklAg+AJaWPTDsP8iYgzSfocKhUKh\nUCiiDSLKAnCXnnMpPMm7oBlbDQB8zMwfGo55AlrUpS+0iXhfaEZTHoD5AB5n5oNEdCk0Dc0CaKk0\nuQCWAnibmZeLc2339hnM3E2sDwfwDLSK6MoANgG4npl3hPP3EYsoQ02hUCgUCkWFQUQDoRW4DWDm\n9ZG+HqujDDWFQqFQKBQVChH9A0BjZv400tdidZShplAoFAqFQmFRVDGBQhEmSGvcfYyINktjk0lr\nAL6etJ5868V4KhGdlbZ9Kh3TlYg2EVEGEY0Xyt4KhUKhOAcJSKZBoVB45WsAH0HSIGLmG/VlInoH\nrir2u5nZTIB4ArSq2hXQ2rEMBvBXOVyvQqFQKCxO1BpqdevW5dTU1EhfhkIBAFizZs1xZk4holSz\n7cIrdgM0vSGPEFFDANWliqpvocmt+DTU1D2hsBL6PRGpz1f3g8JqBHtPRK2hlpqaitWrV0f6MhQK\nAAAR7fWxS28AR5lZbgLenIjWATgN4BmhU9cYmv6QzgEx5ulzR0MTNkazZs3UPaGwDH7cE+WKekco\nrEaw94TKUVMoKoabAEyS1g8DaMbMnQE8CuB7IjL2jPQJM3/GzN2YuVtKimqZp1AoFLFG1HrUFIpo\nQbTsugZAV31MtOIqEstriGg3NDXvgwCaSIc3EWMKhUKhOAdRHrUKpLCkLNKXoIgMAwBsZ2ZHSJOI\nUogoTiy3AJAOIJOZDwM4TUQ9RF7b7QB+i8RFKxSeyD5ThIOnzkb6MhQKy1BaZkdxqb1czq0MtQoi\nMzsPbZ6dgV/WHfC9syIqIaJJAJYBaE1EB4holNg0Aq5hTwDoA2CjkOv4CcA9zHxCbLsXWh+8DGg9\nJlXFp8JSfDRvF4Z+sDjSl6FQlDtvztiOzxbt9rnfNROWotUz5fOo9mmoedCGqk1Es4lol/i3lhgn\nofuUQUQbiaiLdMxIsf8uIhopjVteM2rzwVzc8OkyFBSXBn2OiX/vAQA8MnkDjp0pDNelKSwEM9/E\nzA2ZOYGZmzDzl2L8DqP6NjP/zMztmLkTM3dh5j+kbauZuT0zpzHz/axUqRUW45tle5F7tiTSl6FQ\nlCvMjE8W7MZr07f73HfjgVyf+wSLPx61r6HpOMmMATCXmdMBzBXrADAEWggnHVol2gRAM+wAPA/g\nIgDdATyvG3dwakbpxxk/K+Jc8eESrMw6gfnbs4M+x9S1zjSj/1sW0WIohUKhCBo1b1CcK7zw+xbH\n8sFTZ3HLF8uROmYadh0947Jfed8TPg01Zl4E4IRheDiAb8TyN9B0nvTxb1ljOYCaQhdqEIDZzHyC\nmU8CmA1gsKwZJbwG30rnshxxtuCdfXbpP9JyLkOFQqHwA2bGij3a66Bzs5p+HSM6cmwSHThWi7Gw\nRWUUivJg7raj+EZyqmw+mIu/M3IAAJe/t8hl31MFmnd5YNv65XItweao1RdJzwBwBIB+dY0B7Jf2\n0zWgvI0HpBlFRKuJaHV2dvDerWAJwU6DbHCr+ai1eX36NkxcsifSl6FQWI4pq/djxGfLAQA3Xdgs\nkEP7iTB/N7Eez
"text/plain": [
"<matplotlib.figure.Figure at 0x7f0b8afeaa58>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "sb0igc80lihP",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### Statistics"
]
},
{
"metadata": {
"id": "JMlYJZkLlihR",
"colab_type": "code",
"colab": {},
"outputId": "99f9f1ed-15cd-48ed-f184-49e3091334f1"
},
"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": 7
}
]
},
{
"metadata": {
"id": "txDoTprzlihc",
"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": "m1r6SQkHlihe",
"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=[sadaei.ExponentialyWeightedFTS],\n",
" benchmark_models=False,\n",
" transformations=[None],\n",
" orders=[2,3],\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=[sadaei.ExponentialyWeightedFTS],\n",
" benchmark_models=False,\n",
" transformations=[tdiff],\n",
" orders=[2,3],\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": "mv4jnvQXlihj",
"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 = 'EWFTS' and measure = 'rmse'and transformation is null\")\n",
"\n",
"df2 = bUtil.get_dataframe_from_bd(\"benchmarks.db\",\n",
" \"tag = 'partitioning' and model = 'EWFTS' 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": "5CnOjME5lihq",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### Comparing the partitioning schemas"
]
},
{
"metadata": {
"id": "cEfSLIDpliht",
"colab_type": "code",
"colab": {},
"outputId": "4c56c693-c3ff-4e6e-dd72-46a67ce942d6"
},
"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 0x7f0b88dd9128>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "nurFZMXXlihz",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Fitting models"
]
},
{
"metadata": {
"id": "3FQpAccmlih0",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### With original data"
]
},
{
"metadata": {
"id": "Z37TgAaUlih2",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"for count,dataset_name in enumerate(dataset_names):\n",
" dataset = get_dataset(dataset_name)\n",
"\n",
" model1 = sadaei.ExponentialyWeightedFTS(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"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "Nuc0W3xKlih5",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"### With transformed data"
]
},
{
"metadata": {
"id": "Q6B4Uflnlih6",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
"for count,dataset_name in enumerate(dataset_names):\n",
" dataset = get_dataset(dataset_name)\n",
"\n",
" model2 = sadaei.ExponentialyWeightedFTS(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"
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "s3JM7zFHliiK",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Predicting with the models"
]
},
{
"metadata": {
"id": "f1y6WcPcliiL",
"colab_type": "code",
"colab": {},
"outputId": "6229767d-027c-428a-ef52-4450780f24e4"
},
"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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\nUVlTS1H6SgD8Y
"text/plain": [
"<matplotlib.figure.Figure at 0x7f0b88998cf8>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "u4F8sQwhliiX",
"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": "OiCkP8Ualiie",
"colab_type": "code",
"colab": {},
"outputId": "8a1750f9-fa56-4398-af08-1993f14305ef"
},
"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": "iVBORw0KGgoAAAANSUhEUgAABZgAAALICAYAAADyhJW9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3Xd4lMXexvHvpJEeCCGBkARCbwGC\noQkISAcFVDoiqICiKHZBjvV4jtjAhh5QUSwINpoICAoISguIFOlFekto6cnuvH9sfEWlhJCwBO7P\nde21m3nmeeZ+gidn88vsjLHWIiIiIiIiIiIiIiJyoTzcHUBEREREREREREREiiYVmEVERERERERE\nREQkX1RgFhEREREREREREZF8UYFZRERERERERERERPJFBWYRERERERERERERyRcVmEVERERERERE\nREQkX1RgFhEREREREREREZF8UYFZRERERORvjDEppz2cxpj0077ue1q/AcYYa4zp+bfzWxhj9p72\n9UJjTMbfrjsz99iNxpiDxpjQ0/p3McbsM8aEXIr7FRERERHJLxWYRURERET+xlob+McD2A3ceFrb\np6d17Q8kA7fl4bJDT7+utfbG3LFmAj8AYwCMMcWBd4Ah1toTBXlfIiIiIiIFzcvdAUREREREiiJj\nTDmgOdAdmGKMKW2tPZjPy90P/GaMaQf0AhZZa2cUUFQRERERkUKjArOIiIiISP7cBiRaa78yxmwE\n+gKv5udC1tqjxphhwKeABWoUXEwRERERkcKjJTJERERERPLnNmBS7utJnH+ZjDeMMcdPe/z7b8eX\nASHAd9baIwWcVURERESkUKjALCIiIiJygYwxTYBYYHJu0yQgzhhT9xyn3W+tLX7a48m/HR8PfAR0\nNMY0LvjUIiIiIiIFT0tkiIiIiIhcuP6AAdYYY/7evuZCL2aMuROIBm4AEoH3jDHx1tqsAsgqIiIi\nIlJoNINZREREROQCGGN8gR7AYKDuaY/7gD7GmAuaxGGMiQReBgZZazOB/wFJwMiCzC0iIiIiUhhU\nYBYRERERuTBdgXTgI2vtwT8ewARcnxBsf5bz3jLGpJz2WJXb/jYw2Vq7GMBaa4FBwAPGmJqFeysi\nIiIiIhfHuN6/ioiIiIiIiIiIiIhcGM1gFhEREREREREREZF8UYFZRERERERERERERPJFBWYRERER\n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\nArOIiIiIiIiIi
"text/plain": [
"<matplotlib.figure.Figure at 0x7f0b8897afd0>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "jsoryiorliin",
"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": "vXjGpz2Bliit",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"## Residual Analysis"
]
},
{
"metadata": {
"id": "p6zaYB7qliiu",
"colab_type": "code",
"colab": {},
"outputId": "0275361d-7ef6-4da6-f574-571da43bd2b2"
},
"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": "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\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": "0j07WfWClii6",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
""
],
"execution_count": 0,
"outputs": []
},
{
"metadata": {
"id": "Sf0Icfbflii9",
"colab_type": "code",
"colab": {}
},
"cell_type": "code",
"source": [
""
],
"execution_count": 0,
"outputs": []
}
]
}