Skip to content

Instantly share code, notes, and snippets.

@franloza
Created October 17, 2017 20:54
Show Gist options
  • Save franloza/1a2c26f3958ba738a56d09752a288679 to your computer and use it in GitHub Desktop.
Save franloza/1a2c26f3958ba738a56d09752a288679 to your computer and use it in GitHub Desktop.
Comparison between present and future value of a fixed income product compounded daily and annually
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Compound interest rate: Present Value vs Future Value"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import numpy as np\n",
"%matplotlib notebook"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"V = 100000 # Future value\n",
"P = 100000 # Present value\n",
"m = [365,1] # Compounding periods: Daily and annualy\n",
"r = 0.05 # Interest rate - 5%\n",
"t = np.arange(1,101) # Time period: 100 years. Axis of the plots"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def present_value(V,r,m,t):\n",
" return V*(1+r/m)**(-m*t)\n",
"vpresent_value = np.vectorize(present_value)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def future_value(P,r,m,t):\n",
" return P*(1+r/m)**(m*t)\n",
"vfuture_value = np.vectorize(future_value)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"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",
" this.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",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\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": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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\" width=\"638.888905813665\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"present_value_comparison = pd.DataFrame(\n",
" index=t, columns=[\"100y daily compound\", \"100y annually compound\"],\n",
" data=np.array([vpresent_value(V,r,365,t), vpresent_value(V,r,1,t)]).T)\n",
"plt.plot(present_value_comparison)\n",
"plt.title(\"Present Value. V(100) = 100000. Interest Rate: 0.05. t=100 years\")\n",
"plt.xlabel(\"t\")\n",
"plt.ylabel(\"P(t)\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"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",
" this.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",
" // select the cell after this one\n",
" var index = IPython.notebook.find_cell_index(this.cell_info[0]);\n",
" IPython.notebook.select(index + 1);\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": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAj8AAAGvCAYAAAC0IrTpAAAgAElEQVR4XuydB5QU1dZGNznnpIAgiIAoWclJxBzAACpmRIwooJiePsMzPRXhmUBRDKCIEgwoCiJJySAIIpIkipJzZvjXman6bZpupmemu6eq+7trsVC66t5z9rlV9dW5oXKgIgIiIAIiIAIiIAJJRCBHEvkqV0VABERABERABEQAiR91AhEQAREQAREQgaQiIPGTVOGWsyIgAiIgAiIgAhI/6gMiIAIiIAIiIAJJRUDiJ6nCLWdFQAREQAREQAQkftQHREAEREAEREAEkoqAxE9ShVvOioAIiIAIiIAISPyoD4iACIiACIiACCQVAYmfpAq3nBUBERABERABEZD4UR8QAREQAREQARFIKgISP0kVbjkrAiIgAiIgAiIg8aM+IAIiIAIiIAIikFQEJH6SKtxyVgREQAREQAREQOJHfUAEREAEREAERCCpCEj8JFW45awIiIAIiIAIiIDEj/qACIiACIiACIhAUhGQ+EmqcMtZERABERABERABiR/1AREQAREQAREQgaQiIPGTVOGWsyIgAiIgAiIgAhI/6gMiIAIiIAIiIAJJRUDiJ6nCLWdFQAREQAREQAQkftQHREAEREAEREAEkoqAxE9ShVvOioAIiIAIiIAISPyoD4iACIiACIiACCQVAYmfpAq3nBUBERABERABEZD4UR8QAREQAREQARFIKgISP0kVbjkrAiIgAiIgAiIg8aM+IAIiIAIiIAIikFQEJH6SKtxyVgREQAREQAREQOJHfUAEREAEREAERCCpCEj8RBbuJ4EnQhw6HmgXWRWpR50H1AL6ZeCcWByaB/gL+BjoHqaBhcAa4MIIDegKDAQKAPsiPCfah/0INHcqPQysBL4ALH47o91YUH2NgLuBJkB14F3AmASX/MDzwHVAQWACcA+wKujAVsDLQG1gPdAHeCPomOyoKz2M1YClTr/5Nr2DA36vCVwDvALsyMB58Tj0DuBP4Mt0GssNHAw4xq6DP4D3gL7AoQwae4HTl17N4HkZPfwM4DWgMbAVeBv4D5CSTkUlnHtZe8CeJcbnPmBLwHlDnL4eXNWpwLIMGvowMBWYnMHzQl2DzzjXakPA7ocWu1DlCuBpwPr1cude8lnQgZFwyKLJOj3aBCR+IiNqD88egN2MAst24LfI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\" width=\"638.888905813665\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"future_value_comparison = pd.DataFrame(\n",
" index=t, columns=[\"100y daily compound\", \"100y annually compound\"],\n",
" data=np.array([vfuture_value(P,r,365,t), vfuture_value(P,r,1,t)]).T)\n",
"plt.plot(future_value_comparison)\n",
"plt.title(\"Future Value. P = 100000. Interest Rate: 0.05. t=100 years\")\n",
"plt.xlabel(\"t\")\n",
"plt.ylabel(\"V(t)\")\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment