From 7e5ff2c98ce64273832173a150e62d21a0b5527e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=C3=B4nio=20C=C3=A2ndido=20de=20Lima=20e=20Silva?= Date: Wed, 9 May 2018 14:18:54 -0300 Subject: [PATCH] Google Colaboratory test --- Severiano_et_al_HighOrderFTS.ipynb | 2346 ++++++++++++++++++++++++++++ 1 file changed, 2346 insertions(+) create mode 100644 Severiano_et_al_HighOrderFTS.ipynb diff --git a/Severiano_et_al_HighOrderFTS.ipynb b/Severiano_et_al_HighOrderFTS.ipynb new file mode 100644 index 0000000..7c1fe7f --- /dev/null +++ b/Severiano_et_al_HighOrderFTS.ipynb @@ -0,0 +1,2346 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "Severiano%20et%20al%20-%20HighOrderFTS.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/Severiano_et_al_HighOrderFTS.ipynb)" + ] + }, + { + "metadata": { + "id": "LECjF0Ih4bXm", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "# High Order Fuzzy Time Series \n", + "\n", + "Severiano, S. A. Jr; Silva, P. C. L.; Sadaei, H. J.; Guimarães, F. G. Very Short-term Solar Forecasting using Fuzzy Time Series. 2017 IEEE International Conference on Fuzzy Systems. DOI10.1109/FUZZ-IEEE.2017.8015732" + ] + }, + { + "metadata": { + "id": "bt5SUyR_41QI", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "# Installing Dependencies" + ] + }, + { + "metadata": { + "id": "VaCseqr04j8A", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 156 + }, + "outputId": "14db5e02-2cac-4a2c-d21f-ec39c394f09b" + }, + "cell_type": "code", + "source": [ + "!pip install -U git+https://github.com/petroniocandido/pyFTS/\n", + "!pip install dill" + ], + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Collecting git+https://github.com/petroniocandido/pyFTS/\r\n", + " Cloning https://github.com/petroniocandido/pyFTS/ to /tmp/pip-req-build-vcsdyoq1\n", + "Building wheels for collected packages: pyFTS\n", + " Running setup.py bdist_wheel for pyFTS ... \u001b[?25l-\b \b\\\b \bdone\n", + "\u001b[?25h Stored in directory: /tmp/pip-ephem-wheel-cache-es_qve_2/wheels/e3/3e/f8/37b9ff061c854fc9e0fa76a2b7d69265bca326b1ab452b0f7b\n", + "Successfully built pyFTS\n", + "Installing collected packages: pyFTS\n", + "Successfully installed pyFTS-1.2.2\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "Tfabj8ct5BxA", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 173 + }, + "outputId": "4e4b0160-39b5-4192-b5b9-24448abe0fbe" + }, + "cell_type": "code", + "source": [ + "" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Collecting dill\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/91/a0/19d4d31dee064fc553ae01263b5c55e7fb93daff03a69debbedee647c5a0/dill-0.2.7.1.tar.gz (64kB)\n", + "\u001b[K 100% |████████████████████████████████| 71kB 2.5MB/s \n", + "\u001b[?25hBuilding wheels for collected packages: dill\n", + " Running setup.py bdist_wheel for dill ... \u001b[?25l-\b \bdone\n", + "\u001b[?25h Stored in directory: /content/.cache/pip/wheels/99/c4/ed/1b64d2d5809e60d5a3685530432f6159d6a9959739facb61f2\n", + "Successfully built dill\n", + "Installing collected packages: dill\n", + "Successfully installed dill-0.2.7.1\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "YtFB2zFY4bXo", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "# Common Imports" + ] + }, + { + "metadata": { + "id": "6KiF_L3a4bXq", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 72 + }, + "outputId": "e36b309e-55d7-4509-d1c4-fc067fb5c26c" + }, + "cell_type": "code", + "source": [ + "import matplotlib.pylab as plt\n", + "from pyFTS.benchmarks import benchmarks as bchmk\n", + "from pyFTS.models import hofts\n", + "\n", + "from pyFTS.common import Transformations\n", + "tdiff = Transformations.Differential(1)\n", + "\n", + "%matplotlib notebook" + ], + "execution_count": 6, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.6/dist-packages/statsmodels/compat/pandas.py:56: FutureWarning: The pandas.core.datetools module is deprecated and will be removed in a future version. Please use the pandas.tseries module instead.\n", + " from pandas.core import datetools\n" + ], + "name": "stderr" + } + ] + }, + { + "metadata": { + "id": "Y-bjmmLL4bX4", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "# Data Loading" + ] + }, + { + "metadata": { + "id": "QyZ3Atrh4bX4", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 17 + }, + "outputId": "160d74b1-db39-42aa-8f40-319cdf1ec539" + }, + "cell_type": "code", + "source": [ + "from pyFTS.data import Enrollments\n", + "\n", + "enrollments = Enrollments.get_data()\n", + "\n" + ], + "execution_count": 7, + "outputs": [] + }, + { + "metadata": { + "id": "FH6Ftxi84bYI", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "# Exploring the partitioning effects on original data" + ] + }, + { + "metadata": { + "id": "VJwW-vTA4bYK", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 309 + }, + "outputId": "b195fa22-4234-4dd1-c322-db734a371b7d" + }, + "cell_type": "code", + "source": [ + "tmp = bchmk.simpleSearch_RMSE(enrollments, enrollments, hofts.HighOrderFTS, range(1,20), [1, 2, 3], tam=[10, 5])" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "display_data", + "data": { + "application/javascript": [ + "/* Put everything inside the global mpl namespace */\n", + "window.mpl = {};\n", + "\n", + "\n", + "mpl.get_websocket_type = function() {\n", + " if (typeof(WebSocket) !== 'undefined') {\n", + " return WebSocket;\n", + " } else if (typeof(MozWebSocket) !== 'undefined') {\n", + " return MozWebSocket;\n", + " } else {\n", + " alert('Your browser does not have WebSocket support.' +\n", + " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", + " 'Firefox 4 and 5 are also supported but you ' +\n", + " 'have to enable WebSockets in about:config.');\n", + " };\n", + "}\n", + "\n", + "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", + " this.id = figure_id;\n", + "\n", + " this.ws = websocket;\n", + "\n", + " this.supports_binary = (this.ws.binaryType != undefined);\n", + "\n", + " if (!this.supports_binary) {\n", + " var warnings = document.getElementById(\"mpl-warnings\");\n", + " if (warnings) {\n", + " warnings.style.display = 'block';\n", + " warnings.textContent = (\n", + " \"This browser does not support binary websocket messages. \" +\n", + " \"Performance may be slow.\");\n", + " }\n", + " }\n", + "\n", + " this.imageObj = new Image();\n", + "\n", + " this.context = undefined;\n", + " this.message = undefined;\n", + " this.canvas = undefined;\n", + " this.rubberband_canvas = undefined;\n", + " this.rubberband_context = undefined;\n", + " this.format_dropdown = undefined;\n", + "\n", + " this.image_mode = 'full';\n", + "\n", + " this.root = $('
');\n", + " this._root_extra_style(this.root)\n", + " this.root.attr('style', 'display: inline-block');\n", + "\n", + " $(parent_element).append(this.root);\n", + "\n", + " this._init_header(this);\n", + " this._init_canvas(this);\n", + " this._init_toolbar(this);\n", + "\n", + " var fig = this;\n", + "\n", + " this.waiting = false;\n", + "\n", + " this.ws.onopen = function () {\n", + " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", + " fig.send_message(\"send_image_mode\", {});\n", + " if (mpl.ratio != 1) {\n", + " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", + " }\n", + " fig.send_message(\"refresh\", {});\n", + " }\n", + "\n", + " this.imageObj.onload = function() {\n", + " if (fig.image_mode == 'full') {\n", + " // Full images could contain transparency (where diff images\n", + " // almost always do), so we need to clear the canvas so that\n", + " // there is no ghosting.\n", + " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", + " }\n", + " fig.context.drawImage(fig.imageObj, 0, 0);\n", + " };\n", + "\n", + " this.imageObj.onunload = function() {\n", + " fig.ws.close();\n", + " }\n", + "\n", + " this.ws.onmessage = this._make_on_message_function(this);\n", + "\n", + " this.ondownload = ondownload;\n", + "}\n", + "\n", + "mpl.figure.prototype._init_header = function() {\n", + " var titlebar = $(\n", + " '
');\n", + " var titletext = $(\n", + " '
');\n", + " titlebar.append(titletext)\n", + " this.root.append(titlebar);\n", + " this.header = titletext[0];\n", + "}\n", + "\n", + "\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._init_canvas = function() {\n", + " var fig = this;\n", + "\n", + " var canvas_div = $('
');\n", + "\n", + " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", + "\n", + " function canvas_keyboard_event(event) {\n", + " return fig.key_event(event, event['data']);\n", + " }\n", + "\n", + " canvas_div.keydown('key_press', canvas_keyboard_event);\n", + " canvas_div.keyup('key_release', canvas_keyboard_event);\n", + " this.canvas_div = canvas_div\n", + " this._canvas_extra_style(canvas_div)\n", + " this.root.append(canvas_div);\n", + "\n", + " var canvas = $('');\n", + " canvas.addClass('mpl-canvas');\n", + " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", + "\n", + " this.canvas = canvas[0];\n", + " this.context = canvas[0].getContext(\"2d\");\n", + "\n", + " var backingStore = this.context.backingStorePixelRatio ||\n", + "\tthis.context.webkitBackingStorePixelRatio ||\n", + "\tthis.context.mozBackingStorePixelRatio ||\n", + "\tthis.context.msBackingStorePixelRatio ||\n", + "\tthis.context.oBackingStorePixelRatio ||\n", + "\tthis.context.backingStorePixelRatio || 1;\n", + "\n", + " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", + "\n", + " var rubberband = $('');\n", + " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", + "\n", + " var pass_mouse_events = true;\n", + "\n", + " canvas_div.resizable({\n", + " start: function(event, ui) {\n", + " pass_mouse_events = false;\n", + " },\n", + " resize: function(event, ui) {\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " stop: function(event, ui) {\n", + " pass_mouse_events = true;\n", + " fig.request_resize(ui.size.width, ui.size.height);\n", + " },\n", + " });\n", + "\n", + " function mouse_event_fn(event) {\n", + " if (pass_mouse_events)\n", + " return fig.mouse_event(event, event['data']);\n", + " }\n", + "\n", + " rubberband.mousedown('button_press', mouse_event_fn);\n", + " rubberband.mouseup('button_release', mouse_event_fn);\n", + " // Throttle sequential mouse events to 1 every 20ms.\n", + " rubberband.mousemove('motion_notify', mouse_event_fn);\n", + "\n", + " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", + " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", + "\n", + " canvas_div.on(\"wheel\", function (event) {\n", + " event = event.originalEvent;\n", + " event['data'] = 'scroll'\n", + " if (event.deltaY < 0) {\n", + " event.step = 1;\n", + " } else {\n", + " event.step = -1;\n", + " }\n", + " mouse_event_fn(event);\n", + " });\n", + "\n", + " canvas_div.append(canvas);\n", + " canvas_div.append(rubberband);\n", + "\n", + " this.rubberband = rubberband;\n", + " this.rubberband_canvas = rubberband[0];\n", + " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", + " this.rubberband_context.strokeStyle = \"#000000\";\n", + "\n", + " this._resize_canvas = function(width, height) {\n", + " // Keep the size of the canvas, canvas container, and rubber band\n", + " // canvas in synch.\n", + " canvas_div.css('width', width)\n", + " canvas_div.css('height', height)\n", + "\n", + " canvas.attr('width', width * mpl.ratio);\n", + " canvas.attr('height', height * mpl.ratio);\n", + " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", + "\n", + " rubberband.attr('width', width);\n", + " rubberband.attr('height', height);\n", + " }\n", + "\n", + " // Set the figure to an initial 600x600px, this will subsequently be updated\n", + " // upon first draw.\n", + " this._resize_canvas(600, 600);\n", + "\n", + " // Disable right mouse context menu.\n", + " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", + " return false;\n", + " });\n", + "\n", + " function set_focus () {\n", + " canvas.focus();\n", + " canvas_div.focus();\n", + " }\n", + "\n", + " window.setTimeout(set_focus, 100);\n", + "}\n", + "\n", + "mpl.figure.prototype._init_toolbar = function() {\n", + " var fig = this;\n", + "\n", + " var nav_element = $('
')\n", + " nav_element.attr('style', 'width: 100%');\n", + " this.root.append(nav_element);\n", + "\n", + " // Define a callback function for later on.\n", + " function toolbar_event(event) {\n", + " return fig.toolbar_button_onclick(event['data']);\n", + " }\n", + " function toolbar_mouse_event(event) {\n", + " return fig.toolbar_button_onmouseover(event['data']);\n", + " }\n", + "\n", + " for(var toolbar_ind in mpl.toolbar_items) {\n", + " var name = mpl.toolbar_items[toolbar_ind][0];\n", + " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", + " var image = mpl.toolbar_items[toolbar_ind][2];\n", + " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", + "\n", + " if (!name) {\n", + " // put a spacer in here.\n", + " continue;\n", + " }\n", + " var button = $('');\n", + " button.click(method_name, toolbar_event);\n", + " button.mouseover(tooltip, toolbar_mouse_event);\n", + " nav_element.append(button);\n", + " }\n", + "\n", + " // Add the status bar.\n", + " var status_bar = $('');\n", + " nav_element.append(status_bar);\n", + " this.message = status_bar[0];\n", + "\n", + " // Add the close button to the window.\n", + " var buttongrp = $('
');\n", + " var button = $('');\n", + " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", + " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", + " buttongrp.append(button);\n", + " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", + " titlebar.prepend(buttongrp);\n", + "}\n", + "\n", + "mpl.figure.prototype._root_extra_style = function(el){\n", + " var fig = this\n", + " el.on(\"remove\", function(){\n", + "\tfig.close_ws(fig, {});\n", + " });\n", + "}\n", + "\n", + "mpl.figure.prototype._canvas_extra_style = function(el){\n", + " // this is important to make the div 'focusable\n", + " el.attr('tabindex', 0)\n", + " // reach out to IPython and tell the keyboard manager to turn it's self\n", + " // off when our div gets focus\n", + "\n", + " // location in version 3\n", + " if (IPython.notebook.keyboard_manager) {\n", + " IPython.notebook.keyboard_manager.register_events(el);\n", + " }\n", + " else {\n", + " // location in version 2\n", + " IPython.keyboard_manager.register_events(el);\n", + " }\n", + "\n", + "}\n", + "\n", + "mpl.figure.prototype._key_event_extra = function(event, name) {\n", + " var manager = IPython.notebook.keyboard_manager;\n", + " if (!manager)\n", + " manager = IPython.keyboard_manager;\n", + "\n", + " // Check for shift+enter\n", + " if (event.shiftKey && event.which == 13) {\n", + " this.canvas_div.blur();\n", + " event.shiftKey = false;\n", + " // Send a \"J\" for go to next cell\n", + " event.which = 74;\n", + " event.keyCode = 74;\n", + " manager.command_mode();\n", + " manager.handle_keydown(event);\n", + " }\n", + "}\n", + "\n", + "mpl.figure.prototype.handle_save = function(fig, msg) {\n", + " fig.ondownload(fig, null);\n", + "}\n", + "\n", + "\n", + "mpl.find_output_cell = function(html_output) {\n", + " // Return the cell and output element which can be found *uniquely* in the notebook.\n", + " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", + " // IPython event is triggered only after the cells have been serialised, which for\n", + " // our purposes (turning an active figure into a static one), is too late.\n", + " var cells = IPython.notebook.get_cells();\n", + " var ncells = cells.length;\n", + " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", + " data = data.data;\n", + " }\n", + " if (data['text/html'] == html_output) {\n", + " return [cell, data, j];\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n", + "\n", + "// Register the function which deals with the matplotlib target/channel.\n", + "// The kernel may be null if the page has been refreshed.\n", + "if (IPython.notebook.kernel != null) {\n", + " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", + "}\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + }, + { + "output_type": "display_data", + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "metadata": { + "id": "1ydjwILQ4bYk", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "# Fitting a model on original data" + ] + }, + { + "metadata": { + "id": "_CLNLG0C4bYm", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1580 + }, + "outputId": "28e8629a-af79-400f-bf87-ba38f9eae5b4" + }, + "cell_type": "code", + "source": [ + "model1 = hofts.HighOrderFTS(partitioner=fuzzy_sets)\n", + "model1.fit(enrollments, order=3)\n", + "\n", + "print(model1)" + ], + "execution_count": 11, + "outputs": [ + { + "output_type": "stream", + "text": [ + "High Order FTS:\n", + "A1,A2,A2 -> A3,A4\n", + "A1,A2,A3 -> A3,A4\n", + "A1,A3,A2 -> A3,A4\n", + "A1,A3,A3 -> A3,A4\n", + "A10,A10,A10 -> A8,A9\n", + "A10,A10,A9 -> A8,A9\n", + "A10,A9,A10 -> A8,A9\n", + "A10,A9,A9 -> A8,A9\n", + "A2,A2,A2 -> A3,A4\n", + "A2,A2,A3 -> A3,A4,A5\n", + "A2,A2,A4 -> A4,A5\n", + "A2,A3,A2 -> A3,A4\n", + "A2,A3,A3 -> A3,A4,A5\n", + "A2,A3,A4 -> A4,A5\n", + "A2,A3,A5 -> A4,A5\n", + "A2,A4,A4 -> A4,A5\n", + "A2,A4,A5 -> A4,A5\n", + "A3,A2,A3 -> A4,A5\n", + "A3,A2,A4 -> A4,A5\n", + "A3,A3,A3 -> A4,A5\n", + "A3,A3,A4 -> A4,A5\n", + "A3,A3,A5 -> A4,A5\n", + "A3,A4,A4 -> A4,A5\n", + "A3,A4,A5 -> A4,A5\n", + "A3,A5,A4 -> A4,A5\n", + "A3,A5,A5 -> A4,A5\n", + "A4,A4,A4 -> A4,A5,A6\n", + "A4,A4,A5 -> A4,A5,A6,A7\n", + "A4,A4,A6 -> A6,A7\n", + "A4,A5,A4 -> A4,A5,A6\n", + "A4,A5,A5 -> A4,A5,A6,A7\n", + "A4,A5,A6 -> A6,A7,A8,A9\n", + "A4,A5,A7 -> A6,A7,A8,A9\n", + "A4,A6,A6 -> A6,A7,A8,A9\n", + "A4,A6,A7 -> A6,A7,A8,A9\n", + "A5,A4,A4 -> A4,A5,A6\n", + "A5,A4,A5 -> A4,A5,A6,A7\n", + "A5,A4,A6 -> A6,A7\n", + "A5,A5,A4 -> A4,A5,A6\n", + "A5,A5,A5 -> A4,A5,A6,A7\n", + "A5,A5,A6 -> A6,A7,A8,A9\n", + "A5,A5,A7 -> A6,A7,A8,A9\n", + "A5,A6,A6 -> A5,A6,A7,A8,A9\n", + "A5,A6,A7 -> A5,A6,A7,A8,A9\n", + "A5,A6,A8 -> A10,A9\n", + "A5,A6,A9 -> A10,A9\n", + "A5,A7,A6 -> A5,A6\n", + "A5,A7,A7 -> A5,A6\n", + "A5,A7,A8 -> A10,A9\n", + "A5,A7,A9 -> A10,A9\n", + "A6,A4,A4 -> A4,A5\n", + "A6,A4,A5 -> A4,A5\n", + "A6,A5,A4 -> A4,A5\n", + "A6,A5,A5 -> A4,A5\n", + "A6,A6,A4 -> A4,A5\n", + "A6,A6,A5 -> A4,A5\n", + "A6,A6,A6 -> A4,A5,A6\n", + "A6,A6,A7 -> A5,A6\n", + "A6,A6,A8 -> A10,A9\n", + "A6,A6,A9 -> A10,A9\n", + "A6,A7,A5 -> A4,A5\n", + "A6,A7,A6 -> A4,A5,A6\n", + "A6,A7,A7 -> A5,A6\n", + "A6,A7,A8 -> A10,A9\n", + "A6,A7,A9 -> A10,A9\n", + "A6,A8,A10 -> A10,A9\n", + "A6,A8,A9 -> A10,A9\n", + "A6,A9,A10 -> A10,A9\n", + "A6,A9,A9 -> A10,A9\n", + "A7,A5,A4 -> A4,A5\n", + "A7,A5,A5 -> A4,A5\n", + "A7,A6,A4 -> A4,A5\n", + "A7,A6,A5 -> A4,A5\n", + "A7,A6,A6 -> A4,A5\n", + "A7,A7,A5 -> A4,A5\n", + "A7,A7,A6 -> A4,A5\n", + "A7,A8,A10 -> A10,A9\n", + "A7,A8,A9 -> A10,A9\n", + "A7,A9,A10 -> A10,A9\n", + "A7,A9,A9 -> A10,A9\n", + "A8,A10,A10 -> A10,A9\n", + "A8,A10,A9 -> A10,A9\n", + "A8,A9,A10 -> A10,A9\n", + "A8,A9,A9 -> A10,A9\n", + "A9,A10,A10 -> A10,A8,A9\n", + "A9,A10,A9 -> A10,A8,A9\n", + "A9,A9,A10 -> A10,A8,A9\n", + "A9,A9,A9 -> A10,A8,A9\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "2zR6gy0T4bYw", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "# Fitting a model on transformed data" + ] + }, + { + "metadata": { + "id": "RSDUHX2M4bYw", + "colab_type": "code", + "colab": {}, + "outputId": "4e2ad3c8-7c61-4277-b746-f1bbf5d9c7c7" + }, + "cell_type": "code", + "source": [ + "model2 = hofts.HighOrderFTS(\"FTS Diff\", partitioner=fuzzy_sets2)\n", + "model2.append_transformation(tdiff)\n", + "model2.fit(enrollments, order=3)\n", + "\n", + "print(model2)" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "[ 17:43:16] Start training\n", + "[ 17:43:16] Finish training\n", + "High Order FTS:\n", + "A0,A1,A2 -> A2,A3\n", + "A0,A1,A3 -> A2,A3\n", + "A0,A2,A2 -> A2,A3\n", + "A0,A2,A3 -> A2,A3,A4\n", + "A0,A2,A4 -> A4\n", + "A0,A3,A3 -> A4\n", + "A0,A3,A4 -> A4\n", + "A1,A0,A1 -> A2,A3\n", + "A1,A0,A2 -> A2,A3\n", + "A1,A1,A0 -> A1,A2\n", + "A1,A1,A1 -> A1,A2,A3\n", + "A1,A1,A2 -> A2,A3\n", + "A1,A1,A3 -> A2,A3\n", + "A1,A1,A4 -> A2,A3\n", + "A1,A2,A0 -> A1,A2\n", + "A1,A2,A1 -> A1,A2\n", + "A1,A2,A2 -> A1,A2,A3,A4\n", + "A1,A2,A3 -> A2,A3,A4\n", + "A1,A2,A4 -> A2,A3,A4\n", + "A1,A3,A1 -> A1,A2\n", + "A1,A3,A2 -> A1,A2,A3,A4\n", + "A1,A3,A3 -> A2,A3,A4\n", + "A1,A3,A4 -> A4\n", + "A1,A4,A2 -> A2,A3\n", + "A1,A4,A3 -> A2,A3\n", + "A2,A0,A1 -> A2,A3\n", + "A2,A0,A2 -> A2,A3,A4\n", + "A2,A0,A3 -> A3,A4\n", + "A2,A1,A0 -> A1,A2\n", + "A2,A1,A1 -> A0,A1,A2,A3,A4\n", + "A2,A1,A2 -> A0,A1,A2,A3,A4\n", + "A2,A1,A3 -> A1,A2,A3,A4\n", + "A2,A1,A4 -> A2,A3\n", + "A2,A2,A0 -> A1,A2,A3\n", + "A2,A2,A1 -> A0,A1,A2,A3,A4\n", + "A2,A2,A2 -> A0,A1,A2,A3,A4\n", + "A2,A2,A3 -> A1,A2,A3,A4\n", + "A2,A2,A4 -> A2,A3\n", + "A2,A3,A0 -> A2,A3\n", + "A2,A3,A1 -> A1,A2,A3\n", + "A2,A3,A2 -> A1,A2,A3,A4\n", + "A2,A3,A3 -> A1,A2,A3,A4\n", + "A2,A3,A4 -> A2,A3\n", + "A2,A4,A2 -> A1,A2,A3\n", + "A2,A4,A3 -> A1,A2,A3\n", + "A2,A4,A4 -> A2,A3\n", + "A3,A0,A2 -> A3,A4\n", + "A3,A0,A3 -> A3,A4\n", + "A3,A1,A1 -> A0,A1,A3,A4\n", + "A3,A1,A2 -> A0,A1,A2,A3,A4\n", + "A3,A1,A3 -> A1,A2,A3,A4\n", + "A3,A2,A0 -> A2,A3\n", + "A3,A2,A1 -> A0,A1,A2,A3,A4\n", + "A3,A2,A2 -> A0,A1,A2,A3,A4\n", + "A3,A2,A3 -> A0,A1,A2\n", + "A3,A3,A0 -> A2,A3\n", + "A3,A3,A1 -> A1,A2,A3\n", + "A3,A3,A2 -> A0,A1,A2\n", + "A3,A3,A3 -> A0,A1,A2\n", + "A3,A3,A4 -> A2,A3\n", + "A3,A4,A2 -> A1,A2,A3,A4\n", + "A3,A4,A3 -> A1,A2,A3,A4\n", + "A3,A4,A4 -> A2,A3\n", + "A4,A2,A1 -> A1,A2\n", + "A4,A2,A2 -> A0,A1,A2\n", + "A4,A2,A3 -> A0,A1,A2,A3\n", + "A4,A2,A4 -> A2,A3\n", + "A4,A3,A1 -> A1,A2\n", + "A4,A3,A2 -> A0,A1,A2\n", + "A4,A3,A3 -> A0,A1,A2,A3\n", + "A4,A3,A4 -> A2,A3\n", + "A4,A4,A2 -> A3,A4\n", + "A4,A4,A3 -> A3,A4\n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "ykON1zuy4bY4", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "# Using the models" + ] + }, + { + "metadata": { + "id": "MPekYeeK4bY6", + "colab_type": "code", + "colab": {}, + "outputId": "66c8cd78-3297-4816-8a1a-4663b6e83d7e" + }, + "cell_type": "code", + "source": [ + "model1.predict(enrollments)" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[14923.233333333337,\n", + " 15319.950000000004,\n", + " 15319.950000000004,\n", + " 16113.383333333339,\n", + " 16113.383333333339,\n", + " 17700.250000000007,\n", + " 17303.53333333334,\n", + " 16113.383333333339,\n", + " 15319.950000000004,\n", + " 15319.950000000004,\n", + " 15319.950000000004,\n", + " 16113.383333333339,\n", + " 16113.383333333339,\n", + " 17700.250000000007,\n", + " 17303.53333333334,\n", + " 19287.116666666676,\n", + " 19287.116666666676,\n", + " 18890.40000000001,\n", + " 18890.40000000001,\n", + " 18890.40000000001]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 11 + } + ] + }, + { + "metadata": { + "id": "0s30is-Q4bZA", + "colab_type": "code", + "colab": {}, + "outputId": "01de2adb-f7b2-4b20-ee7e-1d5545be4c38" + }, + "cell_type": "code", + "source": [ + "model2.predict(enrollments)" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[12941.02,\n", + " 14511.2,\n", + " 15028.14,\n", + " 15126.2,\n", + " 15171.14,\n", + " 15182.08,\n", + " 16375.14,\n", + " 16734.2,\n", + " 16944.38,\n", + " 15248.2,\n", + " 15806.32,\n", + " 14960.2,\n", + " 14978.2,\n", + " 15058.02,\n", + " 16427.14,\n", + " 17718.14,\n", + " 18538.14,\n", + " 19390.260000000002,\n", + " 19152.2,\n", + " 18691.2]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 12 + } + ] + }, + { + "metadata": { + "id": "hUY7J9Ib4bZI", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "# Comparing the models" + ] + }, + { + "metadata": { + "id": "n0xAzMgw4bZK", + "colab_type": "code", + "colab": {}, + "outputId": "bab1d187-5ad3-44ef-91b3-ab05ecd8754d" + }, + "cell_type": "code", + "source": [ + "bchmk.plot_compared_series(enrollments, [model1, model2], bchmk.colors, intervals=False)" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\nEWeKw8Gc80xK6a2I+Hdxbi4iDkfEtns8t2JgODs7G8PDw0vODQwMlCHhc889JyRkTXz66adx8eLF\nGBoaipGREd9XAAAAQO1t+DMMU0pvRsQbxeGWiLjWsbztPs6t6ObNmxERsWPHjvLTjcfGxoQ5rKnP\nP/88ZmdnY+fOnbFv3z7fXwAAAEBP2PDAMOd8PKV0KqU0vV5f44knnojTp0/Hiy++GA899NB6fRka\n7Msvv4wLFy5Ef39/tFotYSEAAADQMzYsMFx8FmHx7MG5iDgadz/EZGtxyZaI+Ll4fa/nuurv748D\nBw6sTeGwzNzcXJw/fz6efPLJGBsbE0oDAAAAPWUj32HY+dzBLRHx37j7TMNWcW4w/njG4b2eK6WU\njsbdEDIGBgbWsm4oXb58Oaanp6Ovr887WAEAAICetG5pR0rpSES0it8jIk5ExGAR7EXO+Z3FTzou\nPkH5Rs555l7PLf96OecTOedWzrm1ffv29fpj0WC//vprTE1Nxfbt22P//v3x8MMPV10SAAAAwJpL\nOeeqa1hzrVYrT0+v2yMSabArV65EX19fPProo1WXAgAAABsqpfRRzrn111dSdxv+oSdQZ/39/VWX\nAAAAALCuPIANAAAAACgJDAEAAACAksAQAAAAACgJDAEAAACAksAQAAAAACgJDAEAAACAksAQAAAA\nACgJDAEAAACAksAQAAAAACgJDAEAAACAksAQAAAAACgJDAEAAACAksAQAAAAACgJDAEAAACAksAQ\nAAAAACgJDAEAAACAksAQAAAAACgJDAEAAACAksAQAAAAACilnHPVNay5lNL/IuJi1XWw4f4REVer\nLoJK6H1z6X1z6X1z6X0z6Xtz6X1z6f3m9M+c8/aqi2D9PVJ1AevkYs65VXURbKyU0rS+N5PeN5fe\nN5feN5feN5O+N5feN5feQ7XckgwAAAAAlASGAAAAAECpVwPDE1UXQCX0vbn0vrn0vrn0vrn0vpn0\nvbn0vrn0HirUkx96AgAAAAA8mF59hyEAUHMppdFlx0dSSodTSm+ucP2q69RHl94fLX69tcL1by1e\ntxH1sX669H7V3tr3vaGz7yml0ZRSTildKn693eV6ex5gndU6MDQ4NJfBobkMDs1keGielNLhiDjV\ncTwaEZFzPhMRN7qECquuUx9den84Is7knE9ExGBxvNzRlNKliJjboDJZB8t7X1ixt/Z9b+jS9605\n55Rz3h0Rr0dEt3/v2/M9oNtMZ8aHzaO2gaHBobkMDo1ncGgmw0PDFPu4s5fjEXGjeD0XEcv/7v+r\ndWqiS+8H449+zhXHy/0r57y7+G+pqS69j1i9t/Z9D1je92W9buWcu/1ct+drrttMZ8aHzaW2gWEY\nHJrM4NBsBocGMjwQEVsi4lrH8bb7XKemcs4nioEyImI0Iqa7XDboHSc9a7Xe2vc9rAiUJlZYtufr\nr9tMZ8aHTaTOgaHBoaEMDo1ncGgwwwM0V/FOkpmc88zytZzz8eJ/Fmxb4c4DakpvG+2VnPONbgu+\nL+pvhZnOjA+bSJ0DQxrO4NBMett4hofmuhERW4vXWyLi5/tcp/4O55yPLT9ZPP/qSHH4c3S/84Aa\nuofe2ve9revtpvZ8b1ltpgOqVefA0OCAwaFhDA6E4aHJTsYffR2MiDMRESmlLaut0xtSSkdzzseL\n14eL3xd7Px1/9Ht3dL/zgHrq2lv7vvellP70c9ye71mdM50ZHzaROgeGBocGMzg0lsGhwQwPzVIE\nwK3FIHjxnQfF3/k3Ot6J8J+/WKdmlve+6OlbxSekX++4tLP37eL6S3pfXyvs+269te97yPK+d1j+\nvGJ7vsd0menM+LCJpJxz1TU8sJTS0SgekLr4/IOU0kc55+dWWqf+ih8mp+Lu8yu2RsTrOeczXXp/\nLe72/nh11bLWuvXWvm+GIjA8lnN+o+OcfQ8AUDOrzHRmfNgkah0YAgAAAABrq863JAMAAAAAa0xg\nCAAAAACUBIYAAAAAQElgCAAAAACUBIYAAAAAQOmRqgsAAGiSlNLbEdGKiC0RsTUi5iJiLuf8eqWF\nAQBAIeWcq64BAKBxUkpHI2J3zvlY1bUAAEAntyQDAAAAACWBIQAAAABQEhgCAAAAACWBIQAAAABQ\nEhgCAAAAACWfkgwAAAAAlLzDEAAAAAAoCQwBAAAAgJLAEAAAAAAoCQwBAAAAgJLAEAAAAAAoCQwB\nAAAAgJLAEAAAAAAoCQwBAAAAgNL/AZdTBgOMR2+9AAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "metadata": { + "id": "q_wIGA7w4bZQ", + "colab_type": "code", + "colab": {}, + "outputId": "5f9804b0-6ce4-4a53-8134-8f9adca9c1a5" + }, + "cell_type": "code", + "source": [ + "bchmk.print_point_statistics(enrollments, [model1, model2])" + ], + "execution_count": 0, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Model\t\t& Order & RMSE\t\t& SMAPE & Theil's U\t\t\\\\ \n", + "HOFTSFTS\t\t& 3\t\t& 466.65\t\t& 1.06\t\t& 0.76\t\\\\ \n", + "HOFTSFTS Diff\t\t& 3\t\t& 1029.5\t\t& 2.66\t\t& 1.68\t\\\\ \n", + "\n" + ], + "name": "stdout" + } + ] + }, + { + "metadata": { + "id": "hHY2S2FI4bZo", + "colab_type": "text" + }, + "cell_type": "markdown", + "source": [ + "# Residual Analysis" + ] + }, + { + "metadata": { + "id": "Vgq_7eqJ4bZq", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "from pyFTS.benchmarks import ResidualAnalysis as ra\n", + "\n", + "ra.plot_residuals(enrollments, [model1, model2])" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "Enhigq7b4bZy", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "" + ], + "execution_count": 0, + "outputs": [] + }, + { + "metadata": { + "id": "G_SB68Lw4bZ4", + "colab_type": "code", + "colab": {} + }, + "cell_type": "code", + "source": [ + "" + ], + "execution_count": 0, + "outputs": [] + } + ] +} \ No newline at end of file