{ "metadata": { "name": "Python_for_R_Fonnesbeck" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Python for R Programmers\n", "\n", "![Python logo](http://python.org/images/python-logo.gif)\n", "\n", "### Christopher Fonnesbeck\n", "### Vanderbilt University\n", "#### 14 June, 2012\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What is Python?\n", "\n", "Python is a **dynamic**, **interpreted** programming language that is **flexible** enough to be used for a variety of tasks, from scripts to mission-critical applications. It currently has a very strong presence in **scientific computing**. Despite being an easy-to-use, high-level language, it is also capable of achieving very high performance." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Runnable pseudocode**: Python's syntax is readable and clear." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from numpy import zeros, random, sqrt\n", "gamma = random.gamma\n", "normal = random.normal\n", "\n", "def pygibbs(N=20000, thin=200):\n", " mat = zeros((N,2))\n", " x,y = mat[0]\n", " for i in range(N):\n", " for j in range(thin):\n", " x = gamma(3, y**2 + 4)\n", " y = normal(1./(x+1), 1./sqrt(2*(x+1)))\n", " mat[i] = x,y\n", "\n", " return mat" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Python objects are **dynamically referenced**" ] }, { "cell_type": "code", "collapsed": false, "input": [ "y = 5\n", "y = 'foo'\n", "x = y = [1, 2, 3]\n", "y[0] = -9\n", "x" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 2, "text": [ "[-9, 2, 3]" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "... but **strongly typed**!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "'5' + 6" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "cannot concatenate 'str' and 'int' objects", "output_type": "pyerr", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;34m'5'\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: cannot concatenate 'str' and 'int' objects" ] } ], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## NumPy and SciPy\n", "\n", "NumPy and SciPy are fundamental scientific modules for Python.\n", "\n", "In particular, **NumPy** provides:\n", "\n", "* fast, efficient mulitidimensional array data structure: `ndarray`\n", "* functions for operating on arrays\n", "* tools for integrating code from compiled languages\n", "* RNGs, linear algebra functions, Fourier transform\n", "\n", "**SciPy** provides a large suite of standard scientific computing:\n", "\n", "* statistical distribtuion classes\n", "* sparse matrices\n", "* signal processing\n", "* optimizers\n", "* numerical integration and DE solvers\n", "* additional linear algebra tools\n", "\n", "$$\\text{NumPy} + \\text{SciPy} \\approx \\text{MATLAB}$$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Calculate second difference matrix\n", "import numpy as np\n", "\n", "I2 = -2*np.eye(8)\n", "E = np.diag(np.ones(7), k=-1)\n", "I2 + E + E.T" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 3, "text": [ "array([[-2., 1., 0., 0., 0., 0., 0., 0.],\n", " [ 1., -2., 1., 0., 0., 0., 0., 0.],\n", " [ 0., 1., -2., 1., 0., 0., 0., 0.],\n", " [ 0., 0., 1., -2., 1., 0., 0., 0.],\n", " [ 0., 0., 0., 1., -2., 1., 0., 0.],\n", " [ 0., 0., 0., 0., 1., -2., 1., 0.],\n", " [ 0., 0., 0., 0., 0., 1., -2., 1.],\n", " [ 0., 0., 0., 0., 0., 0., 1., -2.]])" ] } ], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "from scipy import linalg\n", "\n", "def lse(A, b, B, d, cond=None):\n", " \"\"\"\n", " Equality-contrained least squares.\n", " \n", " The following algorithm minimizes ||Ax - b|| subject to the\n", " constrain Bx = d.\n", " \"\"\"\n", " \n", " A, b, B, d = map(np.asanyarray, (A, b, B, d))\n", " p = B.shape[0]\n", " \n", " # QR decomposition of constraint matrix B\n", " Q, R = linalg.qr(B.T)\n", " \n", " # Solve Ax = b, assuming A is triangular\n", " y = linalg.solve_triangular(R[:p, :p], d, trans='T', lower=False)\n", " A = np.dot(A, Q)\n", " \n", " # Least squares solution to Ax = b\n", " z = linalg.lstsq(A[:, p:], b - np.dot(A[:, :p], y),\n", " cond=cond)[0].ravel()\n", " \n", " return np.dot(Q[:, :p], y) + np.dot(Q[:, p:], z)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "A, b = [[0, 2, 3], [1, 3, 4.5]], [1, 1]\n", "B, d = [[1, 1, 0]], [1]\n", "lse(A, b, B, d)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 5, "text": [ "array([-0.5 , 1.5 , -0.6667])" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matplotlib\n", "\n", "This is the most widely-used 2-D plotting module for Python, allowing users to generate publication-quality plots. **Matplotlib** offers a high level of control and the ability to generate interactive output." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import matplotlib.pyplot as plt\n", "\n", "fig = plt.figure()\n", "x = np.linspace(0,2*np.pi,100)\n", "y = 2*np.sin(x)\n", "ax = fig.add_subplot(1,2,1)\n", "ax.plot(x,y)\n", "y2 = y + 0.1*np.random.normal( size=x.shape )\n", "ax = fig.add_subplot(1,2,2)\n", "ax.plot(x,y2,'bo')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 6, "text": [ "[]" ] }, { "output_type": "display_data", "png": "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\nYII=\n", "text": [ "" ] } ], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "from pymc.examples import gelman_bioassay\n", "from pymc import MCMC, Matplot\n", "M = MCMC(gelman_bioassay)\n", "M.sample(1000,verbose=0)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " \r", "[****************100%******************] 1000 of 1000 complete" ] }, { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "Matplot.plot(M.alpha)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Plotting alpha\n" ] }, { "output_type": "display_data", "png": "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\nTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from matplotlib.patches import Polygon\n", "\n", "\n", "# Generate some data from five different probability distributions,\n", "# each with different characteristics. We want to play with how an IID\n", "# bootstrap resample of the data preserves the distributional\n", "# properties of the original sample, and a boxplot is one visual tool\n", "# to make this assessment\n", "numDists = 5\n", "randomDists = ['Normal(1,1)',' Lognormal(1,1)', 'Exp(1)', 'Gumbel(6,4)',\n", " 'Triangular(2,9,11)']\n", "N = 500\n", "norm = np.random.normal(1,1, N)\n", "logn = np.random.lognormal(1,1, N)\n", "expo = np.random.exponential(1, N)\n", "gumb = np.random.gumbel(6, 4, N)\n", "tria = np.random.triangular(2, 9, 11, N)\n", "\n", "# Generate some random indices that we'll use to resample the original data\n", "# arrays. For code brevity, just use the same random indices for each array\n", "bootstrapIndices = np.random.random_integers(0, N-1, N)\n", "normBoot = norm[bootstrapIndices]\n", "expoBoot = expo[bootstrapIndices]\n", "gumbBoot = gumb[bootstrapIndices]\n", "lognBoot = logn[bootstrapIndices]\n", "triaBoot = tria[bootstrapIndices]\n", "\n", "data = [norm, normBoot, logn, lognBoot, expo, expoBoot, gumb, gumbBoot,\n", " tria, triaBoot]\n", "\n", "fig = plt.figure(figsize=(10,6))\n", "fig.canvas.set_window_title('A Boxplot Example')\n", "ax1 = fig.add_subplot(111)\n", "plt.subplots_adjust(left=0.075, right=0.95, top=0.9, bottom=0.25)\n", "\n", "bp = plt.boxplot(data, notch=0, sym='+', vert=1, whis=1.5)\n", "plt.setp(bp['boxes'], color='black')\n", "plt.setp(bp['whiskers'], color='black')\n", "plt.setp(bp['fliers'], color='red', marker='+')\n", "\n", "# Add a horizontal grid to the plot, but make it very light in color\n", "# so we can use it for reading data values but not be distracting\n", "ax1.yaxis.grid(True, linestyle='-', which='major', color='lightgrey',\n", " alpha=0.5)\n", "\n", "# Hide these grid behind plot objects\n", "ax1.set_axisbelow(True)\n", "ax1.set_title('Comparison of IID Bootstrap Resampling Across Five Distributions')\n", "ax1.set_xlabel('Distribution')\n", "ax1.set_ylabel('Value')\n", "\n", "# Now fill the boxes with desired colors\n", "boxColors = ['darkkhaki','royalblue']\n", "numBoxes = numDists*2\n", "medians = range(numBoxes)\n", "for i in range(numBoxes):\n", " box = bp['boxes'][i]\n", " boxX = []\n", " boxY = []\n", " for j in range(5):\n", " boxX.append(box.get_xdata()[j])\n", " boxY.append(box.get_ydata()[j])\n", " boxCoords = zip(boxX,boxY)\n", " # Alternate between Dark Khaki and Royal Blue\n", " k = i % 2\n", " boxPolygon = Polygon(boxCoords, facecolor=boxColors[k])\n", " ax1.add_patch(boxPolygon)\n", " # Now draw the median lines back over what we just filled in\n", " med = bp['medians'][i]\n", " medianX = []\n", " medianY = []\n", " for j in range(2):\n", " medianX.append(med.get_xdata()[j])\n", " medianY.append(med.get_ydata()[j])\n", " plt.plot(medianX, medianY, 'k')\n", " medians[i] = medianY[0]\n", " # Finally, overplot the sample averages, with horixzontal alignment\n", " # in the center of each box\n", " plt.plot([np.average(med.get_xdata())], [np.average(data[i])],\n", " color='w', marker='*', markeredgecolor='k')\n", "\n", "# Set the axes ranges and axes labels\n", "ax1.set_xlim(0.5, numBoxes+0.5)\n", "top = 40\n", "bottom = -5\n", "ax1.set_ylim(bottom, top)\n", "xtickNames = plt.setp(ax1, xticklabels=np.repeat(randomDists, 2))\n", "plt.setp(xtickNames, rotation=45, fontsize=8)\n", "\n", "# Due to the Y-axis scale being different across samples, it can be\n", "# hard to compare differences in medians across the samples. Add upper\n", "# X-axis tick labels with the sample medians to aid in comparison\n", "# (just use two decimal places of precision)\n", "pos = np.arange(numBoxes)+1\n", "upperLabels = [str(np.round(s, 2)) for s in medians]\n", "weights = ['bold', 'semibold']\n", "for tick,label in zip(range(numBoxes),ax1.get_xticklabels()):\n", " k = tick % 2\n", " ax1.text(pos[tick], top-(top*0.05), upperLabels[tick],\n", " horizontalalignment='center', size='x-small', weight=weights[k],\n", " color=boxColors[k])\n", "\n", "# Finally, add a basic legend\n", "plt.figtext(0.80, 0.08, str(N) + ' Random Numbers' ,\n", " backgroundcolor=boxColors[0], color='black', weight='roman',\n", " size='x-small')\n", "plt.figtext(0.80, 0.045, 'IID Bootstrap Resample',\n", "backgroundcolor=boxColors[1],\n", " color='white', weight='roman', size='x-small')\n", "plt.figtext(0.80, 0.015, '*', color='white', backgroundcolor='silver',\n", " weight='roman', size='medium')\n", "plt.figtext(0.815, 0.013, ' Average Value', color='black', weight='roman',\n", " size='x-small')\n", "\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAqYAAAGeCAYAAABGusPCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlcVGX/P/7XGQZmkGUAFdyQRURNTcIwFRVc0jJsuV1y\n6c72O36VqblU9inLNr9mt5WmbXeWlneZmXm73BbmApq3hpHmmoJiCi6sIvu8f38oJ4ZNRIYzcF7P\nx4PHY842533NXOfwnuuc6zqKiAiIiIiIiDRm0DoAIiIiIiKAiSkREREROQgmpkRERETkEJiYEhER\nEZFDYGJKRERERA6BiSkREREROQQmptToLV26FM7OzlqHUWsrV65Ehw4dYDQa8dBDD2kdDhEMBgO+\n+OILdTooKAivv/66hhE1PSkpKTAYDNixY4fWodgwGAz48ssv7fLe0dHReOyxx2ymH330UbvsC2C9\nbSqYmOpEfn4+Zs+ejT59+sDb2xt+fn6IiorCsmXLUFpaqnV412Xs2LE4ffq01mHUSmlpKR566CEM\nGzYMycnJeOedd6pc74EHHsCtt96qTs+ePRsdO3ZUp5cuXQqDwQCDwQBnZ2cEBASgf//+eOmll5CV\nlXXVOKKjo9XtDQYDmjdvjiFDhuDnn3++/kJW8Mgjj2DgwIHXtM3y5cthMGh/eir/ORsMBrRo0QJR\nUVHYtGmT1qHVO0VR1Nd79uzBlClTGnT/X331FQwGA8aMGdOg+61PW7ZssakvZX/Dhw9H+/btkZaW\nhl69etk9jop19qabbsKECROQmJhYad20tDSMHDmyVu97rcfld999h7fffludVhTFpp7VVXXnFC3q\nLdU/7c/8ZHcXLlzAjTfeiC+++AKTJk3Czp078d///hcTJkzASy+9hN9//13rEOtERFBSUgKz2YyW\nLVtqHU6tnD59Gnl5eRg7diz8/f3h4eFR5Xq1OYE7OTkhLS0Np06dwpo1axAbG4vVq1cjKCjoqt+p\noiiYMGEC0tLScObMGXz11VdQFAW333478vLy6ly+hlZUVGT3fZR9zmWfk4uLC+68806kpKTYfd9a\nad68OVxdXRt0nx988AF69+6NNWvW4Ny5c9f1XlarFVartZ4iu3Z79+5FWlqa+rdixQoYDAb4+vrC\naDQ2SAyLFi1CWloadu3ahf/3//4fjEYjevXqhTlz5tis5+vrC5PJVK/7Ljsuvby84O7uXq/vXRMt\n6i3ZgVCTd99990nr1q0lJyen0rLCwkK5ePGiiIiUlJTIq6++Kp07dxYPDw+JiIiQ//znPzbrK4oi\nH3/8sTz00EPi5+cnERER8sMPP0h+fr48+uij0qZNGwkODpZVq1ap2yQnJ4uiKPLdd9/JXXfdJT4+\nPtK9e/dK7/38889Lly5dpFmzZuLv7y+PP/64ZGdnq8s//fRTMRqNsnfvXomKihJ3d3fZsGGDOr9M\ndna2PPvssxIRESGurq7i7+8vU6dOVZfXtpyffPKJ/OMf/5DWrVtLu3bt5I033rjqZ71v3z4ZOnSo\n+Pj4iL+/vzzyyCOSlZWlxq8ois3f1q1bq3yfiRMnypAhQ9Tpl156SUJCQip9FhUVFxdL9+7dJSws\nTKxWa7VxRkdHy6OPPmozb8uWLaIoihw6dEidd/LkSfnb3/4mfn5+4ufnJ6NHj5bTp0/bbLdt2zaJ\njIwUi8UiHTp0kOnTp0tBQYEad8Uyf/bZZyIisnz5crnzzjvF29tbfHx8ZMCAAXLq1Cn56aefKm3z\n4IMPiohIVFSUPPLII/LWW2/JDTfcIG3atBERkS+++EJ69eolFotFWrRoIXfccYccOXJEjbG2dbCi\nqj7nss/p+++/V+f9+eefMn78ePH39xdvb28ZOnSo7Nu3T11+tTq5adMmiYqKEh8fH7FYLBIVFSX/\n+9//bPZrz2NPURT54osv1OmAgAB59dVXbabnzJkjzz//vAQGBoqfn59MmTJFSkpK1HWKiopk8uTJ\n0qZNGwkKCpLnn39eXnzxRZt6W50jR46IwWCQAwcOSLdu3WTu3LmV1jl06JDcdddd0rp1a3F3d5de\nvXrJrl27ROSv4+O///2v9O7dW8xmsxw6dEguXLggDz74oPj7+4uPj4/cdtttNvW7qKhI5syZIwMG\nDJBmzZpJ69atZezYsery33//Xf7xj39Ix44dxc3NTbp06SLLli2rthxldffPP/+stKzsu0hISBAR\nkb59+8pjjz1Wab3OnTvL//3f/6nT69atkz59+ojFYpHAwECZOnWq5OXl1fh5Vvw+y7z55ptiNBpl\n9+7d1a5bn8dl2fwy0dHR8sgjj8jrr78uISEh0rp1a5kyZYoUFxer61TcRkRkzpw5EhgYKCI1n1Mq\n1ttLly7JlClTJDg4WCwWi/Tv31927typLi/7Tv7zn//IvffeKy1atJDg4GBZunSpzf6r+0zIPpiY\nNnGFhYXi7Owsr7322lXXnTZtmvj4+Mg333wjR48elddff10MBoPExcWp6yiKIm3atJHPP/9ckpKS\nZPTo0dKyZUu5++675cUXX5Q9e/bI2LFjxc3NTS5cuCAifx387du3ly+//FKOHDkis2bNEicnJ9m7\nd6/63q+++qrEx8fLsWPH5LPPPpPAwECZOHGiuvzTTz8Vg8Egffr0kS1btkhycrKcO3euUvLw1FNP\nSUBAgGzatElSUlJkx44d8vHHH19zOVu3bi3PP/+8JCYmynPPPSeKotisU9GZM2fEw8NDxo8fL/v3\n75f4+Hjp3r27DBgwQERE8vPzZffu3aIoiqxdu1bS09OlqKioyveqa2IqIvLll1+KoiiSnJxcbaxl\n/yDKnDhxQu677z4JCAhQ5126dEnat28vQ4YMkcTERPnll18kOjpaQkJC1LiTkpLEyclJpk6dKocP\nH5YNGzaIv7+//P3vfxcRkYsXL8qECRMkMjJS0tPTJT09XfLz82XPnj2iKIq8/fbbcujQIdm/f798\n8skncurUKSkqKpJFixaJoijqNmU/qsqSt9jYWDl48KDs379f/Tz+85//yLFjx2T9+vUycOBA6dix\noxpnbetgRRU/55SUFBk/fryYzWbJzMwUEZGcnBxp27atjBs3TjZt2iQ7duyQ8ePHS/PmzeXcuXMi\ncvU6uXr1alm5cqUcOXJEfvrpJxk5cqT4+Piox5CIfY+9islJYGCgzTkjICBAmjdvLk888YTs3r1b\n/vnPf4rBYJBPPvlEXWfSpEni5+cna9eulcOHD8uzzz4rzZs3l44dO1b7+ZaZNm2aREVFiYjIe++9\nVymZTUlJEXd3dxk/frz88ssvcuzYMfn666/VJOOll14SNzc3GTx4sPzvf/+To0ePSm5urvTq1UvC\nwsIkISFB9u3bJ/fee694e3vL+fPnRURk/vz54unpKd9//70kJyfL7t275Z133lH32717dxk+fLjs\n3LlTkpOTZcOGDTX+mClL3qpKWiomph9++KF4e3tLYWGhus6uXbtEURQ5evSoiIisWrVK3NzcZN68\nefLbb7/J8uXLJTQ0VD2+qlNdYlpSUiLNmjWTF198scp16/u4rPgDuGy9xx57TA4dOiRr164VX19f\nmTJlirpOVT+ayyem1Z1TRCrX21GjRqnH3aFDh2TSpEni4uKi/jgp+046dOggb7zxhiQmJsrDDz8s\n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\nNiIiIhASEoL//e9/dd6Xt7c3xo4diyVLlmDFihX4/vvvkZqael3lvNo/8m7dumHHjh02J9G4uDgU\nFRXV6Z9IXRQXF2Pu3LkIDw9HYGDgNW1bltSUtVx07doVJ06cwKFDh9R1fvvtN5w+fVotT9euXbFx\n40ab99mwYQMURUHXrl0BXK6DVQ1JZjAY0L9/f7z88svYvXs3PDw88Nlnn6nbALVL9A8ePIjz58/j\nlVdewYABA9CpUyfs37+/ym1rqoO19dBDD8HPzw+vvfYagMsth/v370fbtm1tkpHg4GA0b95c3a66\nOnnhwgUcPHgQM2bMwK233orOnTvjzJkztRr2q7bqo9w1CQkJgYuLC3744YdK+63puDl69Ci2bt2K\n1atXV0rsAwIC8K9//QsAEBYWhri4uGv6EdStWzcUFBTgp59+UudlZmZi165dNsejm5sb7r77brzz\nzjvYvHkzfv31V2zfvl1dHhQUhNjYWKxcuRLPPPMM3n333VrHcDVDhw6Fj48P/v3vf+Pzzz/HiBEj\nYLFYAFxOlkJCQnDo0KFK9So4OLhOPenfeustFBcX484776x2nfo6LquzY8cOFBYWqtM//PADzGYz\nOnToAODyD4yKLdNr1661qUfVnVPKKzv/lD/XW61WbNq06ZrPxzV9JlT/GmbcCtLUggULcMstt6Bn\nz5545ZVX0KNHDxQVFeGXX37BG2+8gW+//RY33ngjJk2ahI8++gg333wzbrzxRnzzzTdISkqq9E+t\nrn766SesWLECPXv2xLJly5CWloapU6cCuNy6d+nSJbz11lu45557sGvXLsTFxdVpP7NmzcLNN9+M\nG264ARcvXsSnn34KDw8PeHl5oVmzZnUup1y+J7va5U8++STeeecdPP7443j++eeRmZmJF154AQMG\nDEBkZGSdynI16enpsFqtSEtLw4EDB/Dmm2/izz//RHx8fI3biQguXbqE9PR0iAgOHjyIDz/8EFar\nFSNGjAAATJgwAXPmzMGTTz6JefPmwWq1Ytq0aQgJCcG9994LAJg+fTpWrFiBqVOn4rHHHkNKSgrm\nz5+P++67D+3atQNwubXxm2++wc6dO9GxY0d4enpi48aNOH78OPr37w9PT09s374dp0+fhr+/P4DL\nyQAAfPHFF7j11lvh7u4ONze3Kr+DgIAAmEwmLFy4EO7u7jh37hzef//9KhOimupgbRkMBkyePBkz\n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\nu93OuXPnuHjx4jXdzmq1Eh8fz65du67reDe7mdHUqVNpbr60zdXhw4d56aWXvvU7Dz300E0dw53J\nGlMhhBBCuL2zZ89e1++vXr2af//3f2fhwoVkZmYye/ZsFixYwIYNGygpKSE5OZns7GyqqqqYMmUK\nx48fZ926dQwZMoThw4fz2WefYbVaeeGFF/D09OQXv/gF3t7e7N69m127drF48WK++eYbqqqqeOWV\nVwgICAAuNabLly/n0Ucf5cMPP2TWrFn86le/AqBfv348/PDDjhofeughli5dysaNGyktLWXChAnM\nnz+fxsZGkpKSmDlzZvc9gC5CRkyFEEII4Xa8vLwICAi46v+8vLw6vf3KlSt5/PHHaWhowGazYTab\nqampYeXKlUybNo33338fq9WKt7c32dnZ6HQ6xo8fzwsvvIC/vz86nY7GxkZWr17Nhg0bmDx5Mn/9\n619paWnBZrPxwQcfOI61Z88ex9dTp05l5cqVtLS0cPbsWdLS0vD29kZRFBYtWnTFWnU6HQCLFi2i\noqICo9HI7t27u+FRdD0yYiqEEEIIt5OcnHzDty0qKuLIkSM8++yzXLx4kUWLFjFt2jQWLFiAoij4\n+fnR0NDASy+9hIeHBwB///vfiYq6dCWp1157jb/97W9s2bKF/fv34+/v75ji1+l02O12/P39+c1v\nfvOtY5vNZqKionjttdeYPHky27ZtIzQ0lJdffpnBgwd3+F2TyQTgOKGrtbWVSZMmcdddd91wdlcn\njakQQgghNGXBggW8//77DBkyhNbWVsco5pw5c3jttdcAeO6553juuefw8vJi0KBBHW4/evRo/vM/\n/5Pi4mJiY2OZOHEiL774Ips2bSIsLAyTycTEiRN59tlnsdvtzJo1iwEDBjhu/8Mf/pDx48dTVFRE\ndXU1n376KYWFhfj4+HQ4zp133slvf/tbTp48ybhx45g5cyZz585lzZo1V2183Z1cklQIIYQQ4ibY\n7XZ+97vfYbVa6devH9OnT3d2SW5LGlMhhBBCCOES5OQnIYQQQgjhEqQxFUIIIYQQLkEaUyGEEEII\n4RKkMRVCCCGEEC5BGlMhhBBCCOESpDEVQgghhBAu4f8Dr0q/435JCJ4AAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## IPython\n", "\n", "**IPython** is an enhanced Python shell which provides a more robust and productive development environment for users. It includes the **HTML notebook** featured here, as well as support for **interactive data visualization** and easy high-performance **parallel computing**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Magic functions\n", "\n", "IPython has a set of predefined \u2018magic functions\u2019 that you can call with a command line style syntax. These include:\n", "\n", "* `%run`\n", "* `%edit`\n", "* `%debug`\n", "* `%timeit`\n", "* `%paste`\n", "* `%load_ext`\n", "\n", "For example, we can use `%load_ext` to load an extension to run R code within IPython:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%load_ext rmagic" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "x,y = arange(10), random.normal(size=10)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "%%R -i x,y -o XYcoef\n", "lm.fit <- lm(y~x)\n", "par(mfrow=c(2,2))\n", "plot(lm.fit)\n", "XYcoef <- coef(lm.fit)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "display_data", "png": "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\nti1ft5nb8RsaGvpSI1IpioJGo0Gn03H8+PGX3n9GRgYxMTEv1az9upKTk0lJScn3iUb+KT4+HlNT\nU4P+7YqJiaFs2bK5zl6XF5GRkVStWtVg24fcj2FjHb+FvgAPHDiQZcuWERcXly/b++9//8vjx49V\nH6M6KiqKx48fU6dOHVVzlRzQEAAAIABJREFUxMfHc/PmTf14uWpJTU3l9OnT+gEU1HT48GG8vLxe\n+BxnZ+csnYlEzl7m+D148CCtW7c2WIaUlBR+//13g047GBMTQ0xMDPXr1zfYPsLDwylZsqRB/3ad\nOXOG2rVrG3TqzsOHDxt8bPbcjmGjHb+KyGLRokXKDz/8oHYMZfv27cr8+fPVjqFcuHBBGT16tNox\nlLi4OKV79+5qx1AURVFatWqldoQC4dNPP1XWrVtn8P0Y+v2OiYlR+vTpY9B9HDx4UPnss88Mug9j\n/O0KCAhQ/vzzT4PuwxjHV0E5huWOdCGEEEIFhb4JWgihDldXV+zt7dWOIUShJQVYCPFaZDpRIfJG\nmqCFEEIIFZh8JlPFZFG6dGmqV6+u+u0/FhYW2NvbG2yS+pdlZmZG5cqVVe8VrtVqsbW1xcnJSdUc\nADY2NtSuXVvtGMWGod9vExMTbG1tcXR0NNg+zM3NqVKlikFvdTLG365y5crh5OREyZIlDbYPYxxf\nBeUY1ijKP8aBE0IIIYRRSBO0EEIIoQIpwEIIIYQKpAALIYQQKpACLIQQQqhACrAQQgihAinAQggh\nhAqkAJM51d39+/dzfV50dLTBs9y7d48X3RkWHx+PTqcz2P6Tk5N5/Pjxc9e/7Htl6ByKouTbDFgv\nUpA+G8XN895TnU5HSkqK/seQx0Neveh4Tk1N1f8Oqampr7zt2NhY0tLSnrs+t2PoZRgy/zPx8fGk\npKS8Vob82Mc/P0vp6el52s+rKvYF+NSpU7i5udG3b1/69u373H/o0NBQ2rRpY7AcCQkJeHp6MmzY\nMNzc3IiJicmyPj09ne7du+Pv70/79u3zbf7jf1qyZAnt27enWbNmfPvtt9nWv+x7ZegcISEhtGnT\nhhEjRtCtWzeePn1qkBwF5bNRHC1dupT3338/x3Vbt27F2dkZLy8vvLy8OHr0qJHT5S634xnA3d1d\n/zsMHTr0lbY/ePBgfH19cXFx4dixY9nW53YMqZ3/mbi4OJo3b86lS5deK0Ne93Hv3j0qVaqk/z0W\n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\nFmTWfsPDw4mMjHzlPayS/qR6fAk3b6N82gal7ScorxnNnd9s3rxZJ/Xo9Cfm06dP6d69O2XLlmXw\n4MGaFW42bdrEhAkTdBmK9J5ISEigf//+GBoa0rt3b1JTU0lJScHLy4vPPvuMZs2apZuaUMobihYt\nqpltTcp7DBbOQzVqBNwORv39j/oOJ9/SaQLeuHEjzZo1486dO5ibm/P5559nmAFGknKSWq3ml19+\noWXLlhgZGREdHU3v3r25cOECS5cuZfjw4Xz00UdERES8tqx169ZpfhkLIXh66TJnFyzizJkzuf02\n3jvGxsZvfP+qpBtKrZqovh2NavqUdNvFqdOIm0F6iip/0WkCvnXrFo0aNcLExISffvoJBwcHBgwY\nIC/VSbmmUKFCWFhYMH36dBo2bEjJkiW5d+8eGzZsoFSpUnTu3Bl3d3f8/PxeWc6yOXPYtGgx0bt2\nkzrya+JcPuZ481bcO3SI/v378+WXX+roHb0fkpOTiY+P13cYUhYo/6xtrmFsjHr8JFL/54569W+I\nbCwE8b7RaQLu3LkzgwcP5vTp0wD89NNPlClThnHjxukyDOk9M2HCBIoVK8ZXX30FpK209PIZ76FD\nh9LN9iXi4xHnL6Beu57UsT+R+rkbfX1PMMTSCsXICFXP7rR4eB9l9XI+3/o7V69e5cGDB+kmr38f\npKam5lqSjIqKkl0D+ZRiXw+DtatQffM1xMTAFX99h5Rn6XQQVuPGjVm3bl26iflnzJhBvXr1MPrv\nryhJygGnTp1i+fLlfPTRR5w8eZKpU6fi7u6Oubk5GzZs4Njhw1gnJPFRTCzqqTMQ167D43CoaotS\nrSqqVi4wzAODMmUwOHgQJSQE5cP6mFWwpnXr1pp6Pv30Ux4+fLdHhs6fP586derg7OzMkiVLmD59\nOgBNmjTBx8cHY2PjHKuraNGiOVqepHtKtaoo1TIOokv99gcU+3ooHzmjvLTs6PtI56OgK1asmGFb\njx49XrvflStX2LhxY4btx48fp3r16nIUtKRVo0aNuHfvnuaxiI7m02LFuffdWKIW+dAkKpqy9vZw\nOxjsaqHq+hnY2Lx2RH6NGjX48ccfmT59Oo8fP6Z///5cuXIlt9+OXt2/f58KFSoQFxfH0qVLuXjx\nIkWKFGH8+PEsXLiQkSNH5lhdxsbGMgG/o1TduyH+PIx6yFCwrYzBtMn6Dklv8sRtSLNnz0YIwahR\n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\nCfibb75h4cKFxMTE4OHhQWpqKpMnT6Zly5b6ivG9JuLiEAf+ROzeC8nJKB3boxo1AkWHfWPFihUj\nPDycpKQkjIyMeP78Ob///rtmekspbylevHi6S7dNmzbVOn4iL8tvfcDXrl3jyy+/xMC6PMrDR8ya\nNYt9+/bJBJzHiON/wZNIlI7t9R0K8J8E/GLw1bFjx1i1ahVmZmYA9OrVi19//TXDwA4p94jrNxB/\n7EIcO47i0ADVl54ote30Ekv58uVp3749pqamLFiwgNWrVzN58mTMc6GvWXp7VapUoUqVKvoO463k\ntz5gS0tLDhw4QK2vvoLChfA/cjT9ajqS3omkJNQLFqP6bkyemfdAax9w27Zt6du3Lz179uTZs2es\nWLGCmTNn6jq29454/hxx8FBa3+7z5yjt2qJauyptEWk9GzRoEHZ2dgQHBzNz5kwcHBz0HZL0Hzt2\n7Mj0qkSDBg1YtmyZjiN6c/mtD3j48OFUrVqVGzdu4Hb7NkHRkUzft1ffYUkvEb+tQ6lVE6VObX2H\noqE1AXt4eGBubs6ff/5JoUKFmDdvntYBFFLOEEG30s52jxyF+vaovhiEUj/vLf3YqFEjORgvD2vb\nti0tWrTgwoULzJkzh4kTJ2JhYcHatWvz3dlYfusDLlasGH///TenTp3CQjFkapuP5W1IeYh48ACx\nYyeqFUv1HUo6mX5COnbsSMeOHXUZy3tFJCQgDh1JO9uNjk47213zq5wwQ3pjhoaGmJqa4ufnR+/e\nvTW397i7u9O+fXv69Omj5wizLr/1AUPabUjNmjVDHRoGjx/rOxzpJer5C1G6d0PJ5hKsuS1dAt60\naROVKlXi+vXrXLlyJd0LW7VqJQdi5QARHIz4Yzfi0GGoUxvVgH4oDg30HZb0DmnZsiXu7u48fPiQ\nUqVKsWHDBlq0aKHvsLIlv/UBv0yxtEB9+Ki+w5D+IU77Qeh9lIk/p9t+7tw5Tpw4QZEiRejXrx8G\neugXTpeAK1SoQKlSpahYsaLmPsIXysm1X9+YSElB/HkI8cduCA9PO9tduSzP/RqT3g329vb4+Pho\nJtTp0aMHXbp00XdY2ZLf+oDTsTCH+2H6jkIibWpe9fyFqL4anm7g1YEDB+jXrx8LFy5k+/btzJo1\ni4sXL+r8M5cuAb8YWGNhYUHBggWpV68ec+fOxdDQUO/3EeY3IjUVLlxEHD2GOHESalRH1bsHNHSU\n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\n/vx5GjVqVKRYUlJSyMjI0DpHCQkJWFpaYm9vr5kqEnL6bm/enNO4Z8SIEVrJNy0tjbS0NCpXrkxc\nXBzPPPNMMV6V4WRnZ7N27VpOnTpFdnY2q1atMuqc1CIpCXHiJNyNRzXcW7NcqV0bZelilGKcN8XW\nFiVgeDVN3QAAGvRJREFUwj//b9L4n39PKPo0n5ZVq1YlKiqKMWPGUK9ePerXr0/9+vWpV68eNWvW\nLHLBkiQZV6VKlTh+/Dhnz57F3d0dS8ucB1yfffYZHTp0MNhxly1bhhCCqVOn6q1MU/cDXr16NevW\nraNNmzacP3+egQMH8u677xaqjO+//54TJ06wePE/d0bBwcHUrVuXN998M8/9/j3xzd69e9m7dy+z\nZs0iICCAsLAwnfv5+fnx3//+t1Ax6tPrr7/OzZs3Wb58OceOHWPEiBF8/fXX2NjYGPS4IiYG9aIP\nIS4OWrij6tNba73SXL9PZ/TJslKlShw8eJCrV68SExNDdHQ03333HdHR0aSmpmqSsb29Pa+++qqp\n45Uk6Smsra1p166d5v+9euX/eK24Xnst/zuAffv2ERwcnGt5dHS0zhHuTFkHvGfPHkJCQjh58iRW\nVlZkZmbSsWNHXnrpJRo3zrnzOXfuHK6urlrxPXjwgBs3bmi2edK9e/d49OgRVapUwdHREYDY2Fiu\nXLlC8+bNdT5JuH//PpcuXSI7OxvIeXS9fPlyIGd6yaNHj2Jvb0/z5s2Ji4vjp59+IiYmhnr16pGV\nlcXZs2d59OgRLVu2xMbGhlu3bmFvb8+FCxdwcHCgXr16mmNdvHiR8uXLa414eOfOHbKysvK84/7w\nww+5desW9erVIzAwkJMnT3L06FFUKhUNGjTg9OnTHD9+nG7duhXyHcibuHYNcfosqv59/1loaYlq\nypvQqGGpGxXREkBRFOrWrUvdunXx9PTUrDxz5gw7duxg27ZtZGdnywQsSVIuBRkpr2fPnvTs2TPX\n8i+++ELnSHZP1gGLW7cQx05orVc6d0T5O5Hlu16tRuzaDTbWBarv++GHHwgKCsLKygrI6Sp0/Phx\nFEUhIyODHj160KpVK6KiovD29sbf35+NGzcSEhJC06ZN+euvv/jf//6nKS8qKoqRI0cSGhrKiBEj\nsLe356effiI4OJiePXvy+uuvExYWpjXe/v79+wkMDMTT05N9+/bh5eXFvXv3GDFiBOHh4Xh5edGh\n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\n" } ], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "XYcoef" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 15, "text": [ "array([ 0.41949922, -0.10004703])" ] } ], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Dirk's `Rcpp` benchmarks\n", "\n", "![Dirk](http://www.gravatar.com/avatar/4e96ca7ae02c37e7d940d17997d780e5?s=128&d=identicon&r=PG)" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%R\n", "library(compiler)\n", "library(rbenchmark)\n", "library(inline)\n", "library(RcppGSL)\n", "\n", "Rgibbs <- function(N,thin) {\n", " mat <- matrix(0,ncol=2,nrow=N)\n", " x <- 0\n", " y <- 0\n", " for (i in 1:N) {\n", " for (j in 1:thin) {\n", " x <- rgamma(1,3,y*y+4)\n", " y <- rnorm(1,1/(x+1),1/sqrt(2*(x+1)))\n", " }\n", " mat[i,] <- c(x,y)\n", " }\n", " mat\n", "}\n", "\n", "\n", "RCgibbs <- cmpfun(Rgibbs)\n", "\n", "gibbscode <- '\n", "\n", " // n and thin are SEXPs which the Rcpp::as function maps to C++ vars\n", " int N = as(n);\n", " int thn = as(thin);\n", "\n", " int i,j;\n", " NumericMatrix mat(N, 2);\n", "\n", " RNGScope scope; // Initialize Random number generator\n", "\n", " // The rest of the code follows the R version\n", " double x=0, y=0;\n", "\n", " for (i=0; i\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDEF
0 one A foo 0.799663 0.030021 2012-04-02 00:00:00
1 one B foo-0.522646 0.220671 2012-04-03 00:00:00
2 two C foo-0.468866 0.016852 2012-04-04 00:00:00
3 three A bar-0.393212 0.593464 2012-04-05 00:00:00
4 one B bar-0.575404-1.621361 2012-04-06 00:00:00
5 one C bar 0.228977-1.256740 2012-04-09 00:00:00
6 two A foo-1.226878-0.467621 2012-04-10 00:00:00
7 three B foo-1.449318 1.317463 2012-04-11 00:00:00
8 one C foo 0.158045-0.388078 2012-04-12 00:00:00
9 one A bar-0.149894 0.498263 2012-04-13 00:00:00
10 two B bar 0.061315-0.999789 2012-04-16 00:00:00
11 three C bar-0.087721 0.697154 2012-04-17 00:00:00
12 one A foo 0.849112 0.044553 2012-04-18 00:00:00
13 one B foo-1.305085-1.332287 2012-04-19 00:00:00
14 two C foo-1.435599-1.261241 2012-04-20 00:00:00
15 three A bar-0.560977-1.133941 2012-04-23 00:00:00
16 one B bar-0.672480-0.093903 2012-04-24 00:00:00
17 one C bar 0.299152-0.886278 2012-04-25 00:00:00
18 two A foo 1.912571-1.428091 2012-04-26 00:00:00
19 three B foo 0.474440-0.104162 2012-04-27 00:00:00
20 one C foo-0.451927-0.044103 2012-04-30 00:00:00
21 one A bar 0.135511 1.126078 2012-05-01 00:00:00
22 two B bar-1.067146 0.057069 2012-05-02 00:00:00
23 three C bar 0.485477-0.241935 2012-05-03 00:00:00
\n", "" ], "output_type": "pyout", "prompt_number": 17, "text": [ " A B C D E F\n", "0 one A foo 0.799663 0.030021 2012-04-02 00:00:00\n", "1 one B foo -0.522646 0.220671 2012-04-03 00:00:00\n", "2 two C foo -0.468866 0.016852 2012-04-04 00:00:00\n", "3 three A bar -0.393212 0.593464 2012-04-05 00:00:00\n", "4 one B bar -0.575404 -1.621361 2012-04-06 00:00:00\n", "5 one C bar 0.228977 -1.256740 2012-04-09 00:00:00\n", "6 two A foo -1.226878 -0.467621 2012-04-10 00:00:00\n", "7 three B foo -1.449318 1.317463 2012-04-11 00:00:00\n", "8 one C foo 0.158045 -0.388078 2012-04-12 00:00:00\n", "9 one A bar -0.149894 0.498263 2012-04-13 00:00:00\n", "10 two B bar 0.061315 -0.999789 2012-04-16 00:00:00\n", "11 three C bar -0.087721 0.697154 2012-04-17 00:00:00\n", "12 one A foo 0.849112 0.044553 2012-04-18 00:00:00\n", "13 one B foo -1.305085 -1.332287 2012-04-19 00:00:00\n", "14 two C foo -1.435599 -1.261241 2012-04-20 00:00:00\n", "15 three A bar -0.560977 -1.133941 2012-04-23 00:00:00\n", "16 one B bar -0.672480 -0.093903 2012-04-24 00:00:00\n", "17 one C bar 0.299152 -0.886278 2012-04-25 00:00:00\n", "18 two A foo 1.912571 -1.428091 2012-04-26 00:00:00\n", "19 three B foo 0.474440 -0.104162 2012-04-27 00:00:00\n", "20 one C foo -0.451927 -0.044103 2012-04-30 00:00:00\n", "21 one A bar 0.135511 1.126078 2012-05-01 00:00:00\n", "22 two B bar -1.067146 0.057069 2012-05-02 00:00:00\n", "23 three C bar 0.485477 -0.241935 2012-05-03 00:00:00" ] } ], "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas ships with a few sample datasets, such as 100 records of baseball batting data, which is easily imported into a `DataFrame` using the `read_csv` function:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "baseball = read_csv(\"/Users/fonnescj/Code/pandas/doc/data/baseball.csv\")\n", "baseball" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 18, "text": [ "\n", "Int64Index: 100 entries, 88641 to 89534\n", "Data columns:\n", "id 100 non-null values\n", "year 100 non-null values\n", "stint 100 non-null values\n", "team 100 non-null values\n", "lg 100 non-null values\n", "g 100 non-null values\n", "ab 100 non-null values\n", "r 100 non-null values\n", "h 100 non-null values\n", "X2b 100 non-null values\n", "X3b 100 non-null values\n", "hr 100 non-null values\n", "rbi 100 non-null values\n", "sb 100 non-null values\n", "cs 100 non-null values\n", "bb 100 non-null values\n", "so 100 non-null values\n", "ibb 100 non-null values\n", "hbp 100 non-null values\n", "sh 100 non-null values\n", "sf 100 non-null values\n", "gidp 100 non-null values\n", "dtypes: float64(9), int64(10), object(3)" ] } ], "prompt_number": 18 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `DataFrame` possesses a suite of methods for indexing, slicing and manipulating its contents. Here's an arbitrary record:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "baseball.ix[88650]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 19, "text": [ "id johnsra05\n", "year 2006\n", "stint 1\n", "team NYA\n", "lg AL\n", "g 33\n", "ab 6\n", "r 0\n", "h 1\n", "X2b 0\n", "X3b 0\n", "hr 0\n", "rbi 0\n", "sb 0\n", "cs 0\n", "bb 0\n", "so 4\n", "ibb 0\n", "hbp 0\n", "sh 0\n", "sf 0\n", "gidp 0\n", "Name: 88650" ] } ], "prompt_number": 19 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can carry out spreadsheet-like actions on a `DataFrame`, such as pivoting and crosstabs:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "pivot_table(baseball, values=['hr','so'], rows=['team', 'year'], aggfunc=sum)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
hrso
teamyear
ARI2006 15 58
ARI2007 0 13
ATL2007 0 29
BAL2007 1 23
BOS2006 0 1
BOS2007 20 101
CHA2007 35 134
CHN2006 1 4
CHN2007 9 48
CIN2007 36 127
CLE2007 0 29
COL2007 2 14
DET2007 37 176
FLO2007 0 0
HOU2007 14 212
KCA2007 2 15
LAA2007 0 0
LAN2006 0 7
LAN2007 36 141
MIL2006 0 2
MIL2007 9 60
MIN2007 6 32
NYA2006 0 4
NYA2007 0 0
NYN2007 61 310
OAK2007 8 65
PHI2007 0 26
SDN2007 0 31
SFN2006 6 55
SFN2007 40 188
SLN2007 13 98
TBA2007 0 0
TEX2007 28 140
TOR2007 58 265
\n", "
" ], "output_type": "pyout", "prompt_number": 20, "text": [ " hr so\n", "team year \n", "ARI 2006 15 58\n", " 2007 0 13\n", "ATL 2007 0 29\n", "BAL 2007 1 23\n", "BOS 2006 0 1\n", " 2007 20 101\n", "CHA 2007 35 134\n", "CHN 2006 1 4\n", " 2007 9 48\n", "CIN 2007 36 127\n", "CLE 2007 0 29\n", "COL 2007 2 14\n", "DET 2007 37 176\n", "FLO 2007 0 0\n", "HOU 2007 14 212\n", "KCA 2007 2 15\n", "LAA 2007 0 0\n", "LAN 2006 0 7\n", " 2007 36 141\n", "MIL 2006 0 2\n", " 2007 9 60\n", "MIN 2007 6 32\n", "NYA 2006 0 4\n", " 2007 0 0\n", "NYN 2007 61 310\n", "OAK 2007 8 65\n", "PHI 2007 0 26\n", "SDN 2007 0 31\n", "SFN 2006 6 55\n", " 2007 40 188\n", "SLN 2007 13 98\n", "TBA 2007 0 0\n", "TEX 2007 28 140\n", "TOR 2007 58 265" ] } ], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "crosstab(baseball.year, baseball.lg, margins=True, colnames=['league'])" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
leagueALNLAll
year
2006 3 5 8
2007 35 57 92
All 38 62 100
\n", "
" ], "output_type": "pyout", "prompt_number": 21, "text": [ "league AL NL All\n", "year \n", "2006 3 5 8\n", "2007 35 57 92\n", "All 38 62 100" ] } ], "prompt_number": 21 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Not to mention powerful split/apply/combine methods:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def get_stats(group):\n", " return {'max': group.max(), 'count': group.count(), 'mean': group.mean()}" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "baseball.groupby('lg')[\"sb\"].apply(get_stats)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 23, "text": [ "lg\n", "AL {'count': 38, 'max': 22.0, 'mean': 1.4210526315789473}\n", "NL {'count': 62, 'max': 14.0, 'mean': 1.3548387096774193}" ] } ], "prompt_number": 23 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Statsmodels\n", "\n", "**statsmodels** is a rapidly-evolving module for statistical modeling in Python, providing a set of models, statistical tests, plotting functions including:\n", "\n", "* Linear regression models\n", "* Generalized linear models\n", "* Discrete choice models\n", "* Robust linear models\n", "* Time series analysis\n", "* Nonparametric estimators\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import statsmodels.api as sm\n", "data = sm.datasets.scotland.load()\n", "data.exog = sm.add_constant(data.exog)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stderr", "text": [ "/Library/Python/2.7/site-packages/statsmodels-0.5.0-py2.7-macosx-10.7-intel.egg/statsmodels/tools/tools.py:301: FutureWarning: The default of `prepend` will be changed to True in 0.5.0, use explicit prepend\n", " FutureWarning)\n" ] } ], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [ "gamma_model = sm.GLM(data.endog, data.exog, family=sm.families.Gamma())\n", "gamma_results = gamma_model.fit()\n", "gamma_results.summary()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
Generalized Linear Model Regression Results
Dep. Variable: y No. Observations: 32
Model: GLM Df Residuals: 24
Model Family: Gamma Df Model: 7
Link Function: inverse_power Scale: 0.00358428317349
Method: IRLS Log-Likelihood: -83.017
Date: Thu, 14 Jun 2012 Deviance: 0.087389
Time: 13:07:46 Pearson chi2: 0.0860
No. Iterations: 5
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
coef std err t P>|t| [95.0% Conf. Int.]
x1 4.962e-05 1.62e-05 3.060 0.005 1.78e-05 8.14e-05
x2 0.0020 0.001 3.824 0.001 0.001 0.003
x3 -7.181e-05 2.71e-05 -2.648 0.014 -0.000 -1.87e-05
x4 0.0001 4.06e-05 2.757 0.011 3.23e-05 0.000
x5 -1.468e-07 1.24e-07 -1.187 0.247 -3.89e-07 9.56e-08
x6 -0.0005 0.000 -2.159 0.041 -0.001 -4.78e-05
x7 -2.427e-06 7.46e-07 -3.253 0.003 -3.89e-06 -9.65e-07
const -0.0178 0.011 -1.548 0.135 -0.040 0.005
" ], "output_type": "pyout", "prompt_number": 25, "text": [ "\n", "\"\"\"\n", " Generalized Linear Model Regression Results \n", "==============================================================================\n", "Dep. Variable: y No. Observations: 32\n", "Model: GLM Df Residuals: 24\n", "Model Family: Gamma Df Model: 7\n", "Link Function: inverse_power Scale: 0.00358428317349\n", "Method: IRLS Log-Likelihood: -83.017\n", "Date: Thu, 14 Jun 2012 Deviance: 0.087389\n", "Time: 13:07:46 Pearson chi2: 0.0860\n", "No. Iterations: 5 \n", "==============================================================================\n", " coef std err t P>|t| [95.0% Conf. Int.]\n", "------------------------------------------------------------------------------\n", "x1 4.962e-05 1.62e-05 3.060 0.005 1.78e-05 8.14e-05\n", "x2 0.0020 0.001 3.824 0.001 0.001 0.003\n", "x3 -7.181e-05 2.71e-05 -2.648 0.014 -0.000 -1.87e-05\n", "x4 0.0001 4.06e-05 2.757 0.011 3.23e-05 0.000\n", "x5 -1.468e-07 1.24e-07 -1.187 0.247 -3.89e-07 9.56e-08\n", "x6 -0.0005 0.000 -2.159 0.041 -0.001 -4.78e-05\n", "x7 -2.427e-06 7.46e-07 -3.253 0.003 -3.89e-06 -9.65e-07\n", "const -0.0178 0.011 -1.548 0.135 -0.040 0.005\n", "==============================================================================\n", "\"\"\"" ] } ], "prompt_number": 25 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Cython and f2py\n", "\n", "**f2py** is a Fortran interface generator for Python that ships with NumPy. It is compatible with NumPy's `ndarray` objects, and allows for the use of Fortran 77/90/95 code within Python by simply adding structured comments to functions and subroutines." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\t SUBROUTINE bernoulli(x,p,nx,np,like)\n", "\n", "\tcf2py logical dimension(nx),intent(in) :: x\n", "\tcf2py double precision dimension(np),intent(in) :: p\n", "\tcf2py integer intent(hide),depend(x) :: nx=len(x)\n", "\tcf2py integer intent(hide),depend(p),check(len(p)==1 || len(p)==len(x)):: np=len(p)\n", "\tcf2py double precision intent(out) :: like\n", "\tcf2py threadsafe\n", "\n", "\t IMPLICIT NONE\n", "\n", "\t INTEGER np,nx,i\n", "\t DOUBLE PRECISION p(np), ptmp, like\n", "\t LOGICAL x(nx)\n", "\t LOGICAL not_scalar_p\n", "\t DOUBLE PRECISION infinity\n", "\t PARAMETER (infinity = 1.7976931348623157d308)\n", "\n", "\tC Check parameter size\n", "\t not_scalar_p = (np .NE. 1)\n", "\n", "\t like = 0.0\n", "\t ptmp = p(1)\n", "\t do i=1,nx\n", "\t if (not_scalar_p) ptmp = p(i)\n", "\t if (ptmp .LT. 0.0) then\n", "\t like = -infinity\n", "\t RETURN\n", "\t endif\n", "\n", "\t if (x(i)) then\n", "\t like = like + dlog(ptmp)\n", "\t else\n", "\t like = like + dlog(1.0D0 - ptmp)\n", "\t endif\n", "\n", "\t enddo\n", "\t return\n", "\t END\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from pymc.flib import bernoulli\n", "bernoulli([1,0,1], 0.3)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 26, "text": [ "-2.7646205525906047" ] } ], "prompt_number": 26 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Cython** is a language that allows Python programmers to write fast code without having to write C/C++/Fortran directly. It looks much like Python code, but with type declarations. Cython takes this code, translates it to C, then compiles the generated C code to create a Python extension." ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Benchmark example: Gibbs sampling" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Gibbs sampler for function:\n", "\n", "$$f(x,y) = x x^2 \\exp(-xy^2 - y^2 + 2y - 4x)$$\n", "\n", "using conditional distributions:\n", " \n", "$$x|y \\sim Gamma(3, y^2 +4)$$\n", "$$y|x \\sim Normal(\\frac{1}{1+x}, \\frac{1}{2(1+x)})$$\n", "\n", "Here again is the pure Python implementation:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from numpy import zeros, random, sqrt\n", "gamma = random.gamma\n", "normal = random.normal\n", "\n", "def pygibbs(N=20000, thin=200):\n", " mat = zeros((N,2))\n", " x,y = mat[0]\n", " for i in range(N):\n", " for j in range(thin):\n", " x = gamma(3, y**2 + 4)\n", " y = normal(1./(x+1), 1./sqrt(2*(x+1)))\n", " mat[i] = x,y\n", "\n", " return mat" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 27 }, { "cell_type": "code", "collapsed": false, "input": [ "timeit pygibbs(1000, 10)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "10 loops, best of 3: 86.3 ms per loop\n" ] } ], "prompt_number": 28 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can usually get a marginal speedup simply by compiling the Python code, unchanged, using cython:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%load_ext cythonmagic" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 29 }, { "cell_type": "code", "collapsed": false, "input": [ "%%cython\n", "from numpy import zeros, random, sqrt\n", "gamma = random.gamma\n", "normal = random.normal\n", "\n", "def pygibbs2(N=20000, thin=200):\n", " mat = zeros((N,2))\n", " x,y = mat[0]\n", " for i in range(N):\n", " for j in range(thin):\n", " x = gamma(3, y**2 + 4)\n", " y = normal(1./(x+1), 1./sqrt(2*(x+1)))\n", " mat[i] = x,y\n", "\n", " return mat" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 30 }, { "cell_type": "code", "collapsed": false, "input": [ "timeit pygibbs2(1000, 10)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "10 loops, best of 3: 76.5 ms per loop\n" ] } ], "prompt_number": 31 }, { "cell_type": "markdown", "metadata": {}, "source": [ "For additional gains, we can simply declare variable types, like you would in C:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%cython\n", "from numpy import zeros, random, sqrt\n", "from numpy cimport *\n", "gamma = random.gamma\n", "normal = random.normal\n", "\n", "def pygibbs3(int N=20000, int thin=200):\n", " cdef ndarray[float64_t, ndim=2] mat = zeros((N,2))\n", " cdef float64_t x,y = 0\n", " cdef int i,j\n", " for i in range(N):\n", " for j in range(thin):\n", " x = gamma(3, y**2 + 4)\n", " y = normal(1./(x+1), 1./sqrt(2*(x+1)))\n", " mat[i] = x,y\n", "\n", " return mat" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 32 }, { "cell_type": "code", "collapsed": false, "input": [ "timeit pygibbs3(1000, 10)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "10 loops, best of 3: 68.7 ms per loop\n" ] } ], "prompt_number": 33 }, { "cell_type": "markdown", "metadata": {}, "source": [ "A full-flown \"cythonization\" involves using GSL's random number generators, and giving cython a few more instructions:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%cython -lm -lgsl -lgslcblas\n", "\n", "cimport cython\n", "import numpy as np\n", "from numpy cimport *\n", "\n", "cdef extern from \"math.h\":\n", " double sqrt(double) \n", " \n", "cdef extern from \"gsl/gsl_rng.h\":\n", " ctypedef struct gsl_rng_type\n", " ctypedef struct gsl_rng\n", "\n", " gsl_rng_type *gsl_rng_mt19937\n", " gsl_rng *gsl_rng_alloc(gsl_rng_type * T) nogil\n", " \n", "cdef extern from \"gsl/gsl_randist.h\":\n", " double gamma \"gsl_ran_gamma\"(gsl_rng * r,double,double)\n", " double gaussian \"gsl_ran_gaussian\"(gsl_rng * r,double)\n", " \n", "cdef gsl_rng *r = gsl_rng_alloc(gsl_rng_mt19937)\n", "\n", "@cython.wraparound(False)\n", "@cython.boundscheck(False)\n", "def gibbs(int N=20000,int thin=500):\n", " cdef: \n", " double x=0\n", " double y=0\n", " int i, j\n", " ndarray[float64_t, ndim=2] samples\n", "\n", " samples = np.empty((N,thin))\n", " for i from 0 <= i < N:\n", " for j from 0 <= j < thin:\n", " x = gamma(r,3,1.0/(y*y+4))\n", " y = gaussian(r,1.0/sqrt(x+1))\n", " samples[i,0] = x\n", " samples[i,1] = y\n", " return samples" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 34 }, { "cell_type": "code", "collapsed": false, "input": [ "timeit gibbs(1000, 10)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1000 loops, best of 3: 1.38 ms per loop\n" ] } ], "prompt_number": 35 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Cython parallel" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before running the next cell, make sure you have first started your cluster, you can use the [clusters tab in the dashboard](/#tab2) to do so. Because this example transfers lots of large arrays, we recommend that you first configure your cluster to use the 'NoDB' hub messaging support, which removes a few features but has the lowest memory footprint. You can do so by putting in your IPython profile directory a file called `ipcontroller_config.py` that contains simply:\n", "\n", " # Configuration file for ipcontroller.\n", " c = get_config()\n", " # The class to use for the DB backend\n", " c.HubFactory.db_class = 'IPython.parallel.controller.dictdb.NoDB'\n", "\n", "See [the IPython docs](http://ipython.org/ipython-doc/dev/parallel/parallel_db.html?#cost) for further details." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.parallel import Client\n", "rc = Client()\n", "dv = rc[:]\n", "dv.block = True\n", "dv.activate()" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 37 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we load the cython magic on all engines and execute the cython magic as well on all engines:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%px %load_ext cythonmagic" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Parallel execution on engine(s): [0, 1]\n" ] } ], "prompt_number": 38 }, { "cell_type": "code", "collapsed": false, "input": [ "%%px\n", "%%cython -lm -lgsl -lgslcblas\n", "\n", "cimport cython\n", "import numpy as np\n", "from numpy cimport *\n", "\n", "cdef extern from \"math.h\":\n", " double sqrt(double) \n", " \n", "cdef extern from \"gsl/gsl_rng.h\":\n", " ctypedef struct gsl_rng_type\n", " ctypedef struct gsl_rng\n", "\n", " gsl_rng_type *gsl_rng_mt19937\n", " gsl_rng *gsl_rng_alloc(gsl_rng_type * T) nogil\n", " \n", "cdef extern from \"gsl/gsl_randist.h\":\n", " double gamma \"gsl_ran_gamma\"(gsl_rng * r,double,double)\n", " double gaussian \"gsl_ran_gaussian\"(gsl_rng * r,double)\n", " \n", "cdef gsl_rng *r = gsl_rng_alloc(gsl_rng_mt19937)\n", "\n", "@cython.wraparound(False)\n", "@cython.boundscheck(False)\n", "def gibbs(int N=20000,int thin=500):\n", " cdef: \n", " double x=0\n", " double y=0\n", " int i, j\n", " ndarray[float64_t, ndim=2] samples\n", "\n", " samples = np.empty((N,thin))\n", " for i from 0 <= i < N:\n", " for j from 0 <= j < thin:\n", " x = gamma(r,3,1.0/(y*y+4))\n", " y = gaussian(r,1.0/sqrt(x+1))\n", " samples[i,0] = x\n", " samples[i,1] = y\n", " return samples" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Parallel execution on engine(s): [0, 1]\n" ] } ], "prompt_number": 42 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Divide the array by the number of nodes. In this case they divide evenly, a more general partitioning of sizes is easy to do as well." ] }, { "cell_type": "code", "collapsed": false, "input": [ "N = 1000\n", "thin = 10\n", "n = N/len(rc.ids)\n", "dv.push(dict(n=n, thin=thin))\n", "# Let's just confirm visually we got what we expect\n", "dv['n']" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "pyout", "prompt_number": 43, "text": [ "[500, 500]" ] } ], "prompt_number": 43 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can time purely the execution of the gibbs sampler on the remote nodes" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%timeit\n", "dv.execute('gibbs(n, thin)')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "100 loops, best of 3: 8.23 ms per loop\n" ] } ], "prompt_number": 44 }, { "cell_type": "markdown", "metadata": {}, "source": [ "But a more realistic (and costly) benchmark must also include the cost of bringing the results back from the cluster engines to our local namespace. For that, we assign the call to the variable `a` on each node and then use the view's `gather` method to pull them back in:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%%timeit\n", "dv.execute('a = gibbs(n, thin)')\n", "a = dv.gather('a')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "100 loops, best of 3: 13.9 ms per loop\n" ] } ], "prompt_number": 45 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we see how on a 4-core machine we get close to a 4-fold speedup on pure execution, but once we have to pay the price of communicating the results back to the local engine, the benefit is less. In a real parallel application, much of the art of optimization comes in trying to keep the movement of large amounts of data to a minimum, as communication is always *much* more expensive than computation in today's architectures." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Gibbs Sampler Shootout\n", "\n", "Timed on a 11\" MacBook Air (1.8 GHz Intel Core i7)\n", "\n", "* Python 2.7.1, Cython 0.16\n", "* Julia 0.0.0\n", "* R 2.14.1, Rcpp 0.9.10\n", "\n", "Elapsed time for 10 replications of the Gibbs sampler code, each run for 4 million iterations." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
model elapsed relative
Julia distributed 3.38 1.0
GSLGibbs 5.46 1.6
Cython 5.58 1.7
Julia native RNG 7.03 2.1
RcppGibbs 9.95 2.9
BoostGibbs 10.65 3.2
Julia libRMath 17.27 5.1
Pure Python 278.51 82.4
RCgibbs 328.56 97.2
Rgibbs 419.87 124.2
" ] } ], "metadata": {} } ] }