pyFTS/Severiano_et_al_HighOrderFTS.ipynb
Petrônio Cândido de Lima e Silva 7e5ff2c98c Google Colaboratory test
2018-05-09 14:18:54 -03:00

2346 lines
221 KiB
Plaintext

{
"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 = $('<div/>');\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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\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 = $('<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 = $('<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 = $('<canvas/>');\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 = $('<div/>')\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 = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></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 = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></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<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"text/html": [
"<div id='b6c84c8c-3033-4934-b717-943d5e4e03a7'></div>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "error",
"ename": "TypeError",
"evalue": "ignored",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-8-fd17c65014be>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mtmp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbchmk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msimpleSearch_RMSE\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0menrollments\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0menrollments\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhofts\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mHighOrderFTS\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m20\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtam\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/usr/local/lib/python3.6/dist-packages/pyFTS/benchmarks/benchmarks.py\u001b[0m in \u001b[0;36msimpleSearch_RMSE\u001b[0;34m(train, test, model, partitions, orders, save, file, tam, plotforecasts, elev, azim, intervals, parameters, partitioner, transformation, indexer)\u001b[0m\n\u001b[1;32m 1021\u001b[0m \u001b[0msets\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpartitioner\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnpart\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtransformation\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtransformation\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msets\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1022\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0moc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mo\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0morders\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstart\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1023\u001b[0;31m \u001b[0mfts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"q = \"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mp\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m\" n = \"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1024\u001b[0m \u001b[0mfts\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend_transformation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtransformation\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1025\u001b[0m \u001b[0mfts\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrain\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msets\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msets\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mparameters\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mTypeError\u001b[0m: __init__() takes 1 positional argument but 2 were given"
]
}
]
},
{
"metadata": {
"id": "_UOMwImD4bYQ",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# Exploring the partitioning effects on transformed data"
]
},
{
"metadata": {
"id": "XklqZLej4bYS",
"colab_type": "code",
"colab": {},
"outputId": "5d4b36ce-7cfe-47db-b042-cc06f2360c53"
},
"cell_type": "code",
"source": [
"tmp = bchmk.simpleSearch_RMSE(enrollments, enrollments, hofts.HighOrderFTS, range(1,20), [1, 2, 3], \n",
" transformation=tdiff, tam=[10, 5])"
],
"execution_count": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\nOwPrPNlLly4RGBjIpEmT8PDwwGAwcOTIEVlklpSUoNVq5TnMhIQEgoODu/sWnE57zTyAjRtpH2Uk\nEHQxQnQKnI8jgVhfX8+SJUvw9PTkgQce4MyZM3Lz0bZt21ixYgUxMTEANDQ08NVXX7F7926mTp3K\njBkzbL7WyZMnGTRokNu9qToTo9HInj17SE1NpaqqSu58v1b3015g1tTU2DQfOQqmt1gscmRRTU2N\nfJTtbseXHb0Pe4Fp30ceEBDQqU037SG50QaDgZqaGreKkLKmtLSUjIwMdu7cSUFBAc3NzQwaNIjx\n48fLAtO6hrcn0Z7o1Ol0JCQkyBv2KSkpjBo1SuRkCroLIToF3ct3333HoUOHuOuuuxg0aBBvv/02\nRUVFPPfcc/I/s3btWkpKShgxYgT79+9nxIgRrFmzBoB9+/axfv16nn32We68887uug2XxWKxyJvv\nf/vb3xy6n0ajsUWTj9lsloVla9WabWE0GikqKqKoqIhevXp1adNOZ2I0Grl06RJFRUU20UtGo1GO\ndaqqqqK+vt6mLjIoKAgfHx+XuV8pQqqoqAilUolarSYsLMzllqiqq6vlTXK9Xs+ZM2cIDg6WHcyB\nAwdy6NAh3nvvPXr37s3y5cuZPn16d192t9Ge6JRmOB09LoW1CwRdiBCdgu7BkftZXV1Neno6sbGx\nco5nbm4uKSkpLF26lISEBAASExP59ttvSU1NJSUlhZSUFH71q1+1+/WdSWuD+9Z01hB/RzEajfzt\nb3/jjTfe4NKlS8TExFBYWIiPjw9btmwhKCioQwKzLaSmnYsXL1JdXU3fvn1Rq9Vu5X5KArOkpITS\n0lIaGxvx9vYmNDSUkJAQAgMD8fPzcxmB2R41NTUYDAbKysoIDQ1FrVZ3S2tOQ0MDx48fl6OKfvzx\nR3x9feVN8sTERAYOHNjq7+Lp06fJzc1l2rRpXXzlrkN7otP6eesoo5SUFFQqlVvMrAt+VohGIkH3\n4OgNOiAggBUrVsj5g1I1o/WbTnp6OsHBwfj6+jJx4kTee+89wsLC5Odra2tt6vy6SnyWl5fLGabS\n4L49qampZGRktBCjzqagoIB169aRlZVFU1MTQ4cOJSkpCYPBQElJCWPHjsXDw4N+/fo5ZfNdatpp\nbm7m0qVLZGVl4evri0ajISQkxKXEWnNzs037UW1tLZ6enrJ72a9fP3x8fLh8+TKFhYU0NDSgUCjw\n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\nAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc8d83e7da0>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"metadata": {
"id": "G8ZtOrkM4bYa",
"colab_type": "text"
},
"cell_type": "markdown",
"source": [
"# Comparing the partitioning schemas"
]
},
{
"metadata": {
"id": "m4mtcEcH4bYe",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 17
},
"outputId": "efbbd93b-7564-44eb-fabd-943b50489b8f"
},
"cell_type": "code",
"source": [
"from pyFTS.partitioners import Grid, Util as pUtil\n",
"\n",
"fuzzy_sets = Grid.GridPartitioner(data=enrollments, npart=12)\n",
"fuzzy_sets2 = Grid.GridPartitioner(data=enrollments, npart=5, transformation=tdiff)\n",
"\n",
"pUtil.plot_partitioners(enrollments, [fuzzy_sets,fuzzy_sets2])"
],
"execution_count": 9,
"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 = $('<div/>');\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",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\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 = $('<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 = $('<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 = $('<canvas/>');\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 = $('<div/>')\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 = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option)\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overriden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>')\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) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></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 = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></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<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 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": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"text/html": [
"<div id='86829fcf-b1de-4149-b276-897600307260'></div>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"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": [
"<matplotlib.figure.Figure at 0x7fc8d8365438>"
]
},
"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": []
}
]
}