{ "metadata": { "name": "P35 All Together Now" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Using DirectView and LoadBalancedView together" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We mentioned that you can use any number of views of any sort simultaneously.\n", "\n", "The most common model for doing this is to use a DirectView to initialise the engine namespaces\n", "(either defining functions and variables, or loading datasets) with a DirectView,\n", "and then submitting work as tasks via the LoadBalancedView.\n", "\n", "For this example, we are going to define a few functions for fetching data and getting a simple summary on some stocks,\n", "then we are going to run those functions on a series of stocks in a load-balanced way." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The usual boilerplate:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%pylab inline" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n", "Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].\n", "For more information, type 'help(pylab)'.\n" ] } ], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython import parallel\n", "\n", "rc = parallel.Client()\n", "dv = rc[:]\n", "lbv = rc.load_balanced_view()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Use matplotlib to fetch data from Yahoo" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%px\n", "\n", "import urllib2\n", "from io import BytesIO\n", "\n", "from matplotlib import finance\n", "\n", "def get_yahoo_data(name=None, start=None, end=None):\n", " \"\"\"return historical stock data from yahoo as a recarray.\"\"\"\n", " fp = finance.fetch_historical_yahoo(name, start, end)\n", " return finance.parse_yahoo_historical(fp, asobject=True)\n", "\n", "def relative_close(records):\n", " \"\"\"return the reative change in closing price over the interval\"\"\"\n", " \n", " close = records['aclose']\n", " return (close[-1] - close[0]) / close[0]\n", "\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Setup the timestamps. We want the past year" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%px\n", "import datetime\n", "end = datetime.datetime.now()\n", "start = end - datetime.timedelta(days=365)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our ticker of stocks to check" ] }, { "cell_type": "code", "collapsed": false, "input": [ "ticker = ['AAPL', 'GOOG', 'MSFT', 'RIMM', 'NOK', 'ORCL', 'AMZN', 'INTC', 'ATVI', 'EA', 'NFLX']" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "And map a simple function (that depends on the code we have defined on the engines)\n", "onto our ticker." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def year_over_year(name):\n", " \"\"\"fetch data, and return year-over-year change (relative to first close)\n", " \n", " in percent\n", " \"\"\"\n", " stock = get_yahoo_data(name, start, end)\n", " return relative_close(stock) * 100\n", "\n", "amr = lbv.map(year_over_year, ticker)\n", "amr" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 6, "text": [ "" ] } ], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "fig, ax = subplots()\n", "fig.set_figwidth(10)\n", "ax.bar(range(len(amr)), amr)\n", "ax.set_xticks(np.arange(len(amr))+0.4)\n", "ax.set_xticklabels(ticker);\n", "ax.axhline(0, c='k')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 7, "text": [ "" ] }, { "output_type": "display_data", "png": "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\nT5FOLlAvWLBAPXr00LPPPqvbbrutqUs8pTguTP3pT3/STTfdpMLCQhUUFGjXrl2KiorS7NmzlZCQ\noF27dqm2A0RWAAADx0lEQVSgoECFhYUaMWKEli5d2qL1XnPNNfrPf/6jJ5980tq2f/9+uVwuTZw4\nUQsXLtTmzZslSV9//bWmT59u/Sh0RkaGpk2bZn1a7OOPP1Z2drYmTpyoVq1aKT09XZMmTbLWhlVV\nVVmfHPKHm2++WTNnzqw1mrB27VprPczevXu1c+dOde7c2W91NEarVq306KOP6p577mmws7jvvvs0\nZ84cBQUdPfWP/Y8zMjJSs2fP1sSJE/1ec01t2rRRamqqnnvuOSvENXR+VHO5XHr44Yd17rnnNsto\n7IABA3TgwAG99NJLko6ek1OnTtW4cePUunVra7+oqCjdfvvt+v3vf299yrXmer/CwkK99dZbfq9X\nqr9P2bVrl7XP1KlTNWfOHJ1//vk+x86dO1etWrXSr371qzpvu/r8ueeeezR37lz/3YkGXHLJJXK7\n3Vq+fHmDbwCqP+1X87dSly5dqi+//NLvNdb3HPztb3+rs+bqNzZpaWkaMmSItW7UqbZv3679+/er\nuLhYBQUFKigo0PTp01t0dKquPuVER72lo2tl582bpwceeECDBw9WeHi4nn32Wb/WHMgcF6ZycnL0\n05/+1Gfb9ddfr4KCgjq3Vw8F19eJHDhwQJ06dbIuDz/8cJPXvGzZMr377ru66KKL1LdvX40dO1Zz\n5sxRhw4d9PLLL2v8+PGKi4vTj370I6Wnp1vvslJSUnTzzTfr8ssvV1xcnG699Va98sorCgsLkyTN\nnj1bF154obp166aePXvqqquu0tixY3XhhRc2af3Vj114eLgmTZpkbavevmHDBiUmJqpHjx66/PLL\nNX78eGvtRUOdd3OM7NRsIyEhQdHR0VqyZIlP/TX369evn4YNG1bn8dV/T5gwwfqIu7/vQ83bnzp1\nqjV9Kh3//KgpOztbu3fv1rRp0/xaryT9+c9/1muvvaaYmBhdcsklat26tfWVHTXvzy9/+UutWLFC\nxcXFevbZZ1VWVqbo6Gh1795d48aNs+6Hv1+j9fUpWVlZVr1ut9v6epCa587vfvc7a2q7+lI9qlnz\n/rrdbvXq1atZz5eaf99zzz11Tv/X3Kd9+/bKycnRnXfeqdjYWLndbmsKx9/qew6qw0Zdj9uYMWO0\nZcuWWlN8Lf29hceumbr77ruVk5NTa91izf+fmlNDfcqx/WJN1113nfUaTE1N1dSpUzVt2jRdcMEF\nkqSHH35Ys2fPVkVFhX/vQIBymZacRAcAAAhwjhuZAgAACCSEKQAAABsIUwAAADYQpgAAAGwgTAEA\nANhAmAIAALDh/wEUMFZ15e+yegAAAABJRU5ErkJggg==\n" } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "And now we can feel sad for RIM, Nokia, and Netflix." ] } ], "metadata": {} } ] }