{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Scientific Python Quickstart" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### [John Stachurski](http://johnstachurski.net/)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### ANU" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is a fast-paced, hands-on introduction to scientific computing with Python, contained in a [Jupyter](http://jupyter.org/) notebook. The main focus will be on introducing Python's four most important scientific libraries: NumPy, Scipy, Pandas and Matplotlib.\n", "\n", "If you don't know how to use this notebook you need to first work through [this page](http://quant-econ.net/py/getting_started.html).\n", "\n", "A slower, more detailed and more systematic treatment of Python for scientific applications can be found at [quant-econ.net](http://quant-econ.net/py/index.html). But this notebook is a good place to start for those who like to learn by doing." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's some information on the version of Python that I'm using:" ] }, { "cell_type": "code", "execution_count": 241, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.5.1 |Anaconda 2.4.1 (64-bit)| (default, Dec 7 2015, 11:16:01) \n", "[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]\n" ] } ], "source": [ "import sys\n", "print(sys.version)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Basic NumPy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Perhaps the single most important scientific library for Python is NumPy. NumPy provides foundational data structures and routines on which many other libraries rely." ] }, { "cell_type": "code", "execution_count": 242, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.10.2\n" ] } ], "source": [ "import numpy as np # Import library and give it alias np\n", "print(np.__version__) # The version I'm using" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "NumPy defines a basic data type called an array (actually a numpy.ndarray)" ] }, { "cell_type": "code", "execution_count": 243, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0., 0., 0.])" ] }, "execution_count": 243, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = np.zeros(3) # Create an array of zeros\n", "a # Print a" ] }, { "cell_type": "code", "execution_count": 244, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "numpy.ndarray" ] }, "execution_count": 244, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that array data *must be homogeneous*\n", "\n", "The most important data types are:\n", "\n", "* float64: 64 bit floating point number\n", "* float32: 32 bit floating point number\n", "* int64: 64 bit integer\n", "* int32: 32 bit integer\n", "* bool: 8 bit True or False\n", "\n", "There are also dtypes to represent complex numbers, unsigned integers, etc\n", "\n", "On most machines, the default dtype for arrays is ``float64`` \n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 245, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "numpy.float64" ] }, "execution_count": 245, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = np.zeros(3)\n", "type(a[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When we create an array such as \n" ] }, { "cell_type": "code", "execution_count": 246, "metadata": { "collapsed": false }, "outputs": [], "source": [ "z = np.zeros(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "``z`` is a \"flat\" array with no dimension--- neither row nor column vector:" ] }, { "cell_type": "code", "execution_count": 247, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(10,)" ] }, "execution_count": 247, "metadata": {}, "output_type": "execute_result" } ], "source": [ " z.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here the shape tuple has only one element, which is the length of the array (tuples with one element end with a comma)\n", "\n", "To give it dimension, we can change the ``shape`` attribute \n", "\n", "For example, let's make it a column vector" ] }, { "cell_type": "code", "execution_count": 248, "metadata": { "collapsed": false }, "outputs": [], "source": [ "z.shape = (10, 1)" ] }, { "cell_type": "code", "execution_count": 249, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0.],\n", " [ 0.],\n", " [ 0.],\n", " [ 0.],\n", " [ 0.],\n", " [ 0.],\n", " [ 0.],\n", " [ 0.],\n", " [ 0.],\n", " [ 0.]])" ] }, "execution_count": 249, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z" ] }, { "cell_type": "code", "execution_count": 250, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0., 0.],\n", " [ 0., 0.]])" ] }, "execution_count": 250, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = np.zeros(4)\n", "z.shape = (2, 2)\n", "z" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Creating arrays" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Creating empty arrays --- initializing memory:" ] }, { "cell_type": "code", "execution_count": 251, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0., 0., 0.])" ] }, "execution_count": 251, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = np.empty(3)\n", "z" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These are just garbage numbers --- whatever was in those memory slots\n", "\n", "Here's how to make a regular gird sequence" ] }, { "cell_type": "code", "execution_count": 252, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 2. , 2.5, 3. , 3.5, 4. ])" ] }, "execution_count": 252, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = np.linspace(2, 4, 5) # From 2 to 4, with 5 elements\n", "z" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Creating an array of ones" ] }, { "cell_type": "code", "execution_count": 253, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 1., 1., 1.])" ] }, "execution_count": 253, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = np.ones(3)\n", "z" ] }, { "cell_type": "code", "execution_count": 254, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 0.],\n", " [ 0., 1.]])" ] }, "execution_count": 254, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = np.identity(2)\n", "z" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Arrays can be made from Python lists or tuples" ] }, { "cell_type": "code", "execution_count": 255, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([10, 20])" ] }, "execution_count": 255, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = np.array([10, 20]) \n", "z" ] }, { "cell_type": "code", "execution_count": 256, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 10., 20.])" ] }, "execution_count": 256, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = np.array((10, 20), dtype=float) \n", "z" ] }, { "cell_type": "code", "execution_count": 257, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1, 2],\n", " [3, 4]])" ] }, "execution_count": 257, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = np.array([[1, 2], [3, 4]]) # 2D array from a list of lists\n", "z" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Array indexing" ] }, { "cell_type": "code", "execution_count": 258, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 1. , 1.25, 1.5 , 1.75, 2. ])" ] }, "execution_count": 258, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = np.linspace(1, 2, 5)\n", "z" ] }, { "cell_type": "code", "execution_count": 259, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 259, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z[0] # First element --- Python sequences are zero based, like C, Java, etc." ] }, { "cell_type": "code", "execution_count": 260, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2.0" ] }, "execution_count": 260, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z[-1] # Special syntax for last element" ] }, { "cell_type": "code", "execution_count": 261, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 1. , 1.25])" ] }, "execution_count": 261, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z[0:2] # Meaning: Two elements, starting from element 0" ] }, { "cell_type": "code", "execution_count": 262, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1, 2],\n", " [3, 4]])" ] }, "execution_count": 262, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = np.array([[1, 2], [3, 4]])\n", "z" ] }, { "cell_type": "code", "execution_count": 263, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 263, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z[0, 0]" ] }, { "cell_type": "code", "execution_count": 264, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([1, 2])" ] }, "execution_count": 264, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z[0,:] # First row" ] }, { "cell_type": "code", "execution_count": 265, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([1, 3])" ] }, "execution_count": 265, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z[:,0] # First column" ] }, { "cell_type": "code", "execution_count": 266, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 2. , 2.5, 3. , 3.5, 4. ])" ] }, "execution_count": 266, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = np.linspace(2, 4, 5)\n", "z" ] }, { "cell_type": "code", "execution_count": 267, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([False, True, True, False, False], dtype=bool)" ] }, "execution_count": 267, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d = np.array([0, 1, 1, 0, 0], dtype=bool)\n", "d" ] }, { "cell_type": "code", "execution_count": 268, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 2.5, 3. ])" ] }, "execution_count": 268, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z[d]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Array methods" ] }, { "cell_type": "code", "execution_count": 269, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([4, 3, 2, 1])" ] }, "execution_count": 269, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = np.array((4, 3, 2, 1))\n", "A" ] }, { "cell_type": "code", "execution_count": 270, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A.sort()" ] }, { "cell_type": "code", "execution_count": 271, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([1, 2, 3, 4])" ] }, "execution_count": 271, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A" ] }, { "cell_type": "code", "execution_count": 272, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2.5" ] }, "execution_count": 272, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.mean()" ] }, { "cell_type": "code", "execution_count": 273, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 273, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.sum()" ] }, { "cell_type": "code", "execution_count": 274, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 274, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.max()" ] }, { "cell_type": "code", "execution_count": 275, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 1, 3, 6, 10])" ] }, "execution_count": 275, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.cumsum()" ] }, { "cell_type": "code", "execution_count": 276, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "1.25" ] }, "execution_count": 276, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.var()" ] }, { "cell_type": "code", "execution_count": 277, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1, 2],\n", " [3, 4]])" ] }, "execution_count": 277, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.shape = (2, 2)\n", "A" ] }, { "cell_type": "code", "execution_count": 278, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1, 3],\n", " [2, 4]])" ] }, "execution_count": 278, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.T # Transpose, equivalent to A.transpose()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Operations on arrays" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Standard arithmetic operations on arrays act elementwise" ] }, { "cell_type": "code", "execution_count": 279, "metadata": { "collapsed": false }, "outputs": [], "source": [ "a = np.array([1, 2, 3, 4])\n", "b = np.array([5, 6, 7, 8])" ] }, { "cell_type": "code", "execution_count": 280, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 6, 8, 10, 12])" ] }, "execution_count": 280, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a + b" ] }, { "cell_type": "code", "execution_count": 281, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([-4, -4, -4, -4])" ] }, "execution_count": 281, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a - b" ] }, { "cell_type": "code", "execution_count": 282, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([11, 12, 13, 14])" ] }, "execution_count": 282, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a + 10" ] }, { "cell_type": "code", "execution_count": 283, "metadata": { "collapsed": false }, "outputs": [], "source": [ "a.shape = 2, 2\n", "b.shape = 2, 2" ] }, { "cell_type": "code", "execution_count": 284, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1, 2],\n", " [3, 4]])" ] }, "execution_count": 284, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a" ] }, { "cell_type": "code", "execution_count": 285, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[5, 6],\n", " [7, 8]])" ] }, "execution_count": 285, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b" ] }, { "cell_type": "code", "execution_count": 286, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 5, 12],\n", " [21, 32]])" ] }, "execution_count": 286, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a * b # Pointwise multiplication!!" ] }, { "cell_type": "code", "execution_count": 287, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[19, 22],\n", " [43, 50]])" ] }, "execution_count": 287, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.dot(a, b) # Matrix multiplication" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For Python $\\geq 3.5$ and NumPy $\\geq 1.1$ the ``@`` operator also works." ] }, { "cell_type": "code", "execution_count": 288, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[19, 22],\n", " [43, 50]])" ] }, "execution_count": 288, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a @ b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I'll continue to use ``np.dot`` below for the benefit of those who are using older versions. But in my opinion the ``@`` operator is much nicer." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Comparisons" ] }, { "cell_type": "code", "execution_count": 289, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ True, True], dtype=bool)" ] }, "execution_count": 289, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = np.array([2, 3])\n", "y = np.array([2, 3])\n", "z == y" ] }, { "cell_type": "code", "execution_count": 290, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([False, True], dtype=bool)" ] }, "execution_count": 290, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y[0] = 3\n", "z == y" ] }, { "cell_type": "code", "execution_count": 291, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0. , 2.5, 5. , 7.5, 10. ])" ] }, "execution_count": 291, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = np.linspace(0, 10, 5)\n", "z" ] }, { "cell_type": "code", "execution_count": 292, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([False, False, True, True, True], dtype=bool)" ] }, "execution_count": 292, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z > 3" ] }, { "cell_type": "code", "execution_count": 293, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 5. , 7.5, 10. ])" ] }, "execution_count": 293, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z[z > 3] # Conditional extraction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matplotlib" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Matplotlib is an outstanding plotting and visualization library for Python that interacts nicely with NumPy. Here are a few quick examples. We'll see more below when we discuss the SciPy library." ] }, { "cell_type": "code", "execution_count": 294, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import matplotlib.pyplot as plt # Import main functionality" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Display figures in this browser window rather than having them open up separately:" ] }, { "cell_type": "code", "execution_count": 295, "metadata": { "collapsed": false }, "outputs": [], "source": [ "%matplotlib inline " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create something to plot" ] }, { "cell_type": "code", "execution_count": 296, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = np.linspace(-2, 2, 100)\n", "y = x**2" ] }, { "cell_type": "code", "execution_count": 297, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 297, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots() # Create axes and figure window\n", "ax.plot(x, y, 'b-')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's a slightly more complex plot" ] }, { "cell_type": "code", "execution_count": 298, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 298, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "y3 = x**3\n", "fig, ax = plt.subplots() # Create axes and figure window\n", "ax.plot(x, y, 'b-', lw=2, alpha=0.8, label='$x^2$')\n", "ax.plot(x, y3, 'g-', lw=2, alpha=0.8, label='$x^3$')\n", "ax.legend(loc='lower right')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## SciPy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's just cover some simple examples --- references for further reading are below" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Statistics and distributions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's use ``scipy.stats`` to generate some data from the Beta distribution" ] }, { "cell_type": "code", "execution_count": 299, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from scipy.stats import beta\n", "q = beta(5, 5) # Beta(a, b), with a = b = 5\n", "obs = q.rvs(2000) # 2000 observations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's histogram it and compare it to the original density" ] }, { "cell_type": "code", "execution_count": 300, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 300, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "ax.hist(obs, bins=40, normed=True)\n", "grid = np.linspace(0.01, 0.99, 100)\n", "ax.plot(grid, q.pdf(grid), 'k-', linewidth=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Other methods" ] }, { "cell_type": "code", "execution_count": 301, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "scipy.stats._distn_infrastructure.rv_frozen" ] }, "execution_count": 301, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(q)" ] }, { "cell_type": "code", "execution_count": 302, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "['__class__',\n", " '__delattr__',\n", " '__dict__',\n", " '__dir__',\n", " '__doc__',\n", " '__eq__',\n", " '__format__',\n", " '__ge__',\n", " '__getattribute__',\n", " '__gt__',\n", " '__hash__',\n", " '__init__',\n", " '__le__',\n", " '__lt__',\n", " '__module__',\n", " '__ne__',\n", " '__new__',\n", " '__reduce__',\n", " '__reduce_ex__',\n", " '__repr__',\n", " '__setattr__',\n", " '__sizeof__',\n", " '__str__',\n", " '__subclasshook__',\n", " '__weakref__',\n", " 'a',\n", " 'args',\n", " 'b',\n", " 'cdf',\n", " 'dist',\n", " 'entropy',\n", " 'expect',\n", " 'interval',\n", " 'isf',\n", " 'kwds',\n", " 'logcdf',\n", " 'logpdf',\n", " 'logpmf',\n", " 'logsf',\n", " 'mean',\n", " 'median',\n", " 'moment',\n", " 'pdf',\n", " 'pmf',\n", " 'ppf',\n", " 'random_state',\n", " 'rvs',\n", " 'sf',\n", " 'stats',\n", " 'std',\n", " 'var']" ] }, "execution_count": 302, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dir(q) # Let's see all its methods" ] }, { "cell_type": "code", "execution_count": 303, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.50000000000000011" ] }, "execution_count": 303, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q.cdf(0.5)" ] }, { "cell_type": "code", "execution_count": 304, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2.4609375000000009" ] }, "execution_count": 304, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q.pdf(0.5)" ] }, { "cell_type": "code", "execution_count": 305, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.5" ] }, "execution_count": 305, "metadata": {}, "output_type": "execute_result" } ], "source": [ "q.mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Basic linear regression:" ] }, { "cell_type": "code", "execution_count": 306, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "gradient = 1.874172371477785\n", "intercept = 1.4035329152756753\n" ] } ], "source": [ "from scipy.stats import linregress\n", "n = 100\n", "alpha, beta, sigma = 1, 2, 1.5\n", "x = np.random.randn(n) # n standard normals\n", "y = alpha + beta * x + sigma * np.random.randn(n)\n", "beta_hat, alpha_hat, r_value, p_value, std_err = linregress(x, y)\n", "print(\"gradient = {}\".format(beta_hat))\n", "print(\"intercept = {}\".format(alpha_hat))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's plot this with data and line of best fit" ] }, { "cell_type": "code", "execution_count": 307, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 307, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nSpZvAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(8, 5))\n", "ax.plot(x, y, 'bo', alpha=0.6, label='observations')\n", "xgrid = np.linspace(-3, 3, 2)\n", "ax.plot(xgrid, alpha_hat + beta_hat * xgrid, 'k-', lw=2, alpha=0.8, label='best fit')\n", "ax.grid()\n", "ax.legend(loc='upper left')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Roots and fixed points" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's choose an arbitrary function to work with" ] }, { "cell_type": "code", "execution_count": 308, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 308, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "def f(x):\n", " return np.sin(4 * (x - 0.25)) + x + x**20 - 1\n", "x = np.linspace(0, 1, 100)\n", "ax.plot(x, f(x))\n", "ax.plot(x, 0 * x)" ] }, { "cell_type": "code", "execution_count": 309, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.4082935042797544" ] }, "execution_count": 309, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy.optimize import bisect # Bisection algorithm --- slow but robust\n", "bisect(f, 0, 1)" ] }, { "cell_type": "code", "execution_count": 310, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.40829350427935679" ] }, "execution_count": 310, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy.optimize import newton # Newton's method --- fast but less robust\n", "newton(f, 0.2) # Start the search at initial condition x = 0.2" ] }, { "cell_type": "code", "execution_count": 311, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.70017000000002816" ] }, "execution_count": 311, "metadata": {}, "output_type": "execute_result" } ], "source": [ "newton(f, 0.7) # Start the search at x = 0.7 instead " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we see that the algorithm gets it wrong --- ``newton`` is fast but not robust\n", "\n", "Let's try a hybrid method" ] }, { "cell_type": "code", "execution_count": 312, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.40829350427936706" ] }, "execution_count": 312, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy.optimize import brentq\n", "brentq(f, 0, 1) # Hybrid method" ] }, { "cell_type": "code", "execution_count": 313, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10000 loops, best of 3: 64.7 µs per loop\n" ] } ], "source": [ "timeit bisect(f, 0, 1)" ] }, { "cell_type": "code", "execution_count": 314, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "100000 loops, best of 3: 14.2 µs per loop\n" ] } ], "source": [ "timeit newton(f, 0.2)" ] }, { "cell_type": "code", "execution_count": 315, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "100000 loops, best of 3: 16.1 µs per loop\n" ] } ], "source": [ "timeit brentq(f, 0, 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the hybrid method is robust but still quite fast..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Numerical optimization and integration" ] }, { "cell_type": "code", "execution_count": 316, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.0" ] }, "execution_count": 316, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy.optimize import fminbound\n", "fminbound(lambda x: x**2, -1, 2) # Search in [-1, 2]" ] }, { "cell_type": "code", "execution_count": 317, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.33333333333333337" ] }, "execution_count": 317, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy.integrate import quad\n", "integral, error = quad(lambda x: x**2, 0, 1)\n", "integral" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Linear Algebra" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's look at some of the most common routines from linear and matrix algebra" ] }, { "cell_type": "code", "execution_count": 318, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import scipy.linalg as la" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We'll experiment with matrices\n", "\n", "$$ \n", " A = \\begin{bmatrix} 2 & -1 \\\\ 3 & 0 \\end{bmatrix} \n", " \\quad \\text{and} \\quad\n", " b = \\begin{bmatrix} 1 \\\\ 1 \\end{bmatrix}\n", "$$" ] }, { "cell_type": "code", "execution_count": 319, "metadata": { "collapsed": false }, "outputs": [], "source": [ "A = [[2, -1],\n", " [3, 0]]\n", "A = np.array(A) # Convert from list to NumPy array\n", "b = np.ones((2, 1)) # Shape is 2 x 1" ] }, { "cell_type": "code", "execution_count": 320, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 2, -1],\n", " [ 3, 0]])" ] }, "execution_count": 320, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A" ] }, { "cell_type": "code", "execution_count": 321, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1.],\n", " [ 1.]])" ] }, "execution_count": 321, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b" ] }, { "cell_type": "code", "execution_count": 322, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0.33333333]\n", " [-0.33333333]]\n" ] } ], "source": [ "x = la.solve(A, b) # Solve for x in Ax = b\n", "print(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's check that $Ax = b$" ] }, { "cell_type": "code", "execution_count": 323, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1.],\n", " [ 1.]])" ] }, "execution_count": 323, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.dot(A, x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also invert directly" ] }, { "cell_type": "code", "execution_count": 324, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0. , 0.33333333],\n", " [-1. , 0.66666667]])" ] }, "execution_count": 324, "metadata": {}, "output_type": "execute_result" } ], "source": [ "la.inv(A)" ] }, { "cell_type": "code", "execution_count": 325, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 0.],\n", " [ 0., 1.]])" ] }, "execution_count": 325, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.dot(A, la.inv(A)) # Should be the identity" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's compute the eigenvalues and eigenvectors" ] }, { "cell_type": "code", "execution_count": 326, "metadata": { "collapsed": false }, "outputs": [], "source": [ "eigvals, eigvecs = la.eig(A)" ] }, { "cell_type": "code", "execution_count": 327, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "eigenvalues = [ 1.+1.41421356j 1.-1.41421356j]\n" ] } ], "source": [ "print(\"eigenvalues = {}\".format(eigvals))" ] }, { "cell_type": "code", "execution_count": 328, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "first eigenvector = [ 0.28867513+0.40824829j 0.86602540+0.j ]\n" ] } ], "source": [ "print(\"first eigenvector = {}\".format(eigvecs[:, 0]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### More information" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* linear algebra: http://docs.scipy.org/doc/scipy/reference/linalg.html\n", "* numerical integration: http://docs.scipy.org/doc/scipy/reference/integrate.html\n", "* interpolation: http://docs.scipy.org/doc/scipy/reference/interpolate.html\n", "* optimization: http://docs.scipy.org/doc/scipy/reference/optimize.html\n", "* distributions and random number generation: http://docs.scipy.org/doc/scipy/reference/stats.html\n", "* signal processing: http://docs.scipy.org/doc/scipy/reference/signal.html\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pandas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas is a very popular library for working with data sets. In pandas, data is held in a dataframe, which is kind of like a spread sheet" ] }, { "cell_type": "code", "execution_count": 329, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's start by writing a test data set to the present working directory, so we can read it back in as a dataframe using pandas. We use an IPython magic to write the data from a cell to a file:" ] }, { "cell_type": "code", "execution_count": 330, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting test_data.csv\n" ] } ], "source": [ "%%file test_data.csv\n", "\"country\",\"country isocode\",\"year\",\"POP\",\"XRAT\",\"tcgdp\",\"cc\",\"cg\"\n", "\"Argentina\",\"ARG\",\"2000\",\"37335.653\",\"0.9995\",\"295072.21869\",\"75.716805379\",\"5.5788042896\"\n", "\"Australia\",\"AUS\",\"2000\",\"19053.186\",\"1.72483\",\"541804.6521\",\"67.759025993\",\"6.7200975332\"\n", "\"India\",\"IND\",\"2000\",\"1006300.297\",\"44.9416\",\"1728144.3748\",\"64.575551328\",\"14.072205773\"\n", "\"Israel\",\"ISR\",\"2000\",\"6114.57\",\"4.07733\",\"129253.89423\",\"64.436450847\",\"10.266688415\"\n", "\"Malawi\",\"MWI\",\"2000\",\"11801.505\",\"59.543808333\",\"5026.2217836\",\"74.707624181\",\"11.658954494\"\n", "\"South Africa\",\"ZAF\",\"2000\",\"45064.098\",\"6.93983\",\"227242.36949\",\"72.718710427\",\"5.7265463933\"\n", "\"United States\",\"USA\",\"2000\",\"282171.957\",\"1\",\"9898700\",\"72.347054303\",\"6.0324539789\"\n", "\"Uruguay\",\"URY\",\"2000\",\"3219.793\",\"12.099591667\",\"25255.961693\",\"78.978740282\",\"5.108067988\"" ] }, { "cell_type": "code", "execution_count": 331, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "./test_data.csv\r\n" ] } ], "source": [ "%ls ./*.csv # Check it's there" ] }, { "cell_type": "code", "execution_count": 332, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df = pd.read_csv('./test_data.csv')" ] }, { "cell_type": "code", "execution_count": 333, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/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", "
countrycountry isocodeyearPOPXRATtcgdpcccg
0ArgentinaARG200037335.6530.999500295072.21869075.7168055.578804
1AustraliaAUS200019053.1861.724830541804.65210067.7590266.720098
2IndiaIND20001006300.29744.9416001728144.37480064.57555114.072206
3IsraelISR20006114.5704.077330129253.89423064.43645110.266688
4MalawiMWI200011801.50559.5438085026.22178474.70762411.658954
5South AfricaZAF200045064.0986.939830227242.36949072.7187105.726546
6United StatesUSA2000282171.9571.0000009898700.00000072.3470546.032454
7UruguayURY20003219.79312.09959225255.96169378.9787405.108068
\n", "
" ], "text/plain": [ " country country isocode year POP XRAT \\\n", "0 Argentina ARG 2000 37335.653 0.999500 \n", "1 Australia AUS 2000 19053.186 1.724830 \n", "2 India IND 2000 1006300.297 44.941600 \n", "3 Israel ISR 2000 6114.570 4.077330 \n", "4 Malawi MWI 2000 11801.505 59.543808 \n", "5 South Africa ZAF 2000 45064.098 6.939830 \n", "6 United States USA 2000 282171.957 1.000000 \n", "7 Uruguay URY 2000 3219.793 12.099592 \n", "\n", " tcgdp cc cg \n", "0 295072.218690 75.716805 5.578804 \n", "1 541804.652100 67.759026 6.720098 \n", "2 1728144.374800 64.575551 14.072206 \n", "3 129253.894230 64.436451 10.266688 \n", "4 5026.221784 74.707624 11.658954 \n", "5 227242.369490 72.718710 5.726546 \n", "6 9898700.000000 72.347054 6.032454 \n", "7 25255.961693 78.978740 5.108068 " ] }, "execution_count": 333, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's try that again but this time using the country as the index column" ] }, { "cell_type": "code", "execution_count": 334, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df = pd.read_csv('./test_data.csv', index_col='country')" ] }, { "cell_type": "code", "execution_count": 335, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/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", "
country isocodeyearPOPXRATtcgdpcccg
country
ArgentinaARG200037335.6530.999500295072.21869075.7168055.578804
AustraliaAUS200019053.1861.724830541804.65210067.7590266.720098
IndiaIND20001006300.29744.9416001728144.37480064.57555114.072206
IsraelISR20006114.5704.077330129253.89423064.43645110.266688
MalawiMWI200011801.50559.5438085026.22178474.70762411.658954
South AfricaZAF200045064.0986.939830227242.36949072.7187105.726546
United StatesUSA2000282171.9571.0000009898700.00000072.3470546.032454
UruguayURY20003219.79312.09959225255.96169378.9787405.108068
\n", "
" ], "text/plain": [ " country isocode year POP XRAT tcgdp \\\n", "country \n", "Argentina ARG 2000 37335.653 0.999500 295072.218690 \n", "Australia AUS 2000 19053.186 1.724830 541804.652100 \n", "India IND 2000 1006300.297 44.941600 1728144.374800 \n", "Israel ISR 2000 6114.570 4.077330 129253.894230 \n", "Malawi MWI 2000 11801.505 59.543808 5026.221784 \n", "South Africa ZAF 2000 45064.098 6.939830 227242.369490 \n", "United States USA 2000 282171.957 1.000000 9898700.000000 \n", "Uruguay URY 2000 3219.793 12.099592 25255.961693 \n", "\n", " cc cg \n", "country \n", "Argentina 75.716805 5.578804 \n", "Australia 67.759026 6.720098 \n", "India 64.575551 14.072206 \n", "Israel 64.436451 10.266688 \n", "Malawi 74.707624 11.658954 \n", "South Africa 72.718710 5.726546 \n", "United States 72.347054 6.032454 \n", "Uruguay 78.978740 5.108068 " ] }, "execution_count": 335, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's drop the year since it's not very informative" ] }, { "cell_type": "code", "execution_count": 336, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/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", "
country isocodePOPXRATtcgdpcccg
country
ArgentinaARG37335.6530.999500295072.21869075.7168055.578804
AustraliaAUS19053.1861.724830541804.65210067.7590266.720098
IndiaIND1006300.29744.9416001728144.37480064.57555114.072206
IsraelISR6114.5704.077330129253.89423064.43645110.266688
MalawiMWI11801.50559.5438085026.22178474.70762411.658954
South AfricaZAF45064.0986.939830227242.36949072.7187105.726546
United StatesUSA282171.9571.0000009898700.00000072.3470546.032454
UruguayURY3219.79312.09959225255.96169378.9787405.108068
\n", "
" ], "text/plain": [ " country isocode POP XRAT tcgdp \\\n", "country \n", "Argentina ARG 37335.653 0.999500 295072.218690 \n", "Australia AUS 19053.186 1.724830 541804.652100 \n", "India IND 1006300.297 44.941600 1728144.374800 \n", "Israel ISR 6114.570 4.077330 129253.894230 \n", "Malawi MWI 11801.505 59.543808 5026.221784 \n", "South Africa ZAF 45064.098 6.939830 227242.369490 \n", "United States USA 282171.957 1.000000 9898700.000000 \n", "Uruguay URY 3219.793 12.099592 25255.961693 \n", "\n", " cc cg \n", "country \n", "Argentina 75.716805 5.578804 \n", "Australia 67.759026 6.720098 \n", "India 64.575551 14.072206 \n", "Israel 64.436451 10.266688 \n", "Malawi 74.707624 11.658954 \n", "South Africa 72.718710 5.726546 \n", "United States 72.347054 6.032454 \n", "Uruguay 78.978740 5.108068 " ] }, "execution_count": 336, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.drop(['year'], axis=1, inplace=True)\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's add a column for GDP per capita" ] }, { "cell_type": "code", "execution_count": 337, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df['GDP percap'] = df['tcgdp'] / df['POP']" ] }, { "cell_type": "code", "execution_count": 338, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/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", "
country isocodePOPXRATtcgdpcccgGDP percap
country
ArgentinaARG37335.6530.999500295072.21869075.7168055.5788047.903229
AustraliaAUS19053.1861.724830541804.65210067.7590266.72009828.436433
IndiaIND1006300.29744.9416001728144.37480064.57555114.0722061.717325
IsraelISR6114.5704.077330129253.89423064.43645110.26668821.138673
MalawiMWI11801.50559.5438085026.22178474.70762411.6589540.425897
South AfricaZAF45064.0986.939830227242.36949072.7187105.7265465.042648
United StatesUSA282171.9571.0000009898700.00000072.3470546.03245435.080382
UruguayURY3219.79312.09959225255.96169378.9787405.1080687.843971
\n", "
" ], "text/plain": [ " country isocode POP XRAT tcgdp \\\n", "country \n", "Argentina ARG 37335.653 0.999500 295072.218690 \n", "Australia AUS 19053.186 1.724830 541804.652100 \n", "India IND 1006300.297 44.941600 1728144.374800 \n", "Israel ISR 6114.570 4.077330 129253.894230 \n", "Malawi MWI 11801.505 59.543808 5026.221784 \n", "South Africa ZAF 45064.098 6.939830 227242.369490 \n", "United States USA 282171.957 1.000000 9898700.000000 \n", "Uruguay URY 3219.793 12.099592 25255.961693 \n", "\n", " cc cg GDP percap \n", "country \n", "Argentina 75.716805 5.578804 7.903229 \n", "Australia 67.759026 6.720098 28.436433 \n", "India 64.575551 14.072206 1.717325 \n", "Israel 64.436451 10.266688 21.138673 \n", "Malawi 74.707624 11.658954 0.425897 \n", "South Africa 72.718710 5.726546 5.042648 \n", "United States 72.347054 6.032454 35.080382 \n", "Uruguay 78.978740 5.108068 7.843971 " ] }, "execution_count": 338, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's sort the whole data frame by GDP per capita" ] }, { "cell_type": "code", "execution_count": 339, "metadata": { "collapsed": false }, "outputs": [], "source": [ "df.sort_values(by='GDP percap', inplace=True)" ] }, { "cell_type": "code", "execution_count": 340, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/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", "
country isocodePOPXRATtcgdpcccgGDP percap
country
MalawiMWI11801.50559.5438085026.22178474.70762411.6589540.425897
IndiaIND1006300.29744.9416001728144.37480064.57555114.0722061.717325
South AfricaZAF45064.0986.939830227242.36949072.7187105.7265465.042648
UruguayURY3219.79312.09959225255.96169378.9787405.1080687.843971
ArgentinaARG37335.6530.999500295072.21869075.7168055.5788047.903229
IsraelISR6114.5704.077330129253.89423064.43645110.26668821.138673
AustraliaAUS19053.1861.724830541804.65210067.7590266.72009828.436433
United StatesUSA282171.9571.0000009898700.00000072.3470546.03245435.080382
\n", "
" ], "text/plain": [ " country isocode POP XRAT tcgdp \\\n", "country \n", "Malawi MWI 11801.505 59.543808 5026.221784 \n", "India IND 1006300.297 44.941600 1728144.374800 \n", "South Africa ZAF 45064.098 6.939830 227242.369490 \n", "Uruguay URY 3219.793 12.099592 25255.961693 \n", "Argentina ARG 37335.653 0.999500 295072.218690 \n", "Israel ISR 6114.570 4.077330 129253.894230 \n", "Australia AUS 19053.186 1.724830 541804.652100 \n", "United States USA 282171.957 1.000000 9898700.000000 \n", "\n", " cc cg GDP percap \n", "country \n", "Malawi 74.707624 11.658954 0.425897 \n", "India 64.575551 14.072206 1.717325 \n", "South Africa 72.718710 5.726546 5.042648 \n", "Uruguay 78.978740 5.108068 7.843971 \n", "Argentina 75.716805 5.578804 7.903229 \n", "Israel 64.436451 10.266688 21.138673 \n", "Australia 67.759026 6.720098 28.436433 \n", "United States 72.347054 6.032454 35.080382 " ] }, "execution_count": 340, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we'll plot per capital GDP using the dataframe's plot method" ] }, { "cell_type": "code", "execution_count": 341, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 341, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df['GDP percap'].plot(kind='bar')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercises" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are two exercises. Feel free to consult documentation such as can be found [here](http://docs.scipy.org/doc/scipy/reference/). The solutions are below. The cell with \"solution below\" is mean to push them below your line of sight and save you from temptation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Exercise 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Generate 10000 data points from the exponential distribution with density\n", "\n", "$$\n", "f(x; \\alpha) = \\alpha \\exp(-\\alpha x)\n", "\\qquad\n", "(x > 0, \\alpha > 0)\n", "$$\n", "\n", "using `scipy.stats` and taking $\\alpha = 0.5$. Then, after looking up the maximum likelihood estimator of $\\alpha$, compute the estimate given your data and check that it is in fact close to $\\alpha$." ] }, { "cell_type": "code", "execution_count": 342, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Put your solution here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Exercise 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the same data set, implement maximum likelihood again, but this time pretending that you don't know the analytical expression for the maximum likelihood estimator. Set up the log likelihood function and maximize it numerically using a routine from `scipy.optimize`." ] }, { "cell_type": "code", "execution_count": 343, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Put your solution here" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solutions" ] }, { "cell_type": "code", "execution_count": 344, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "solution below\n", "\n" ] } ], "source": [ "# Print some nonsense to partially hide solutions\n", "filler_text = \"solution below\\n\" * 25\n", "print(filler_text)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Solution to Exercise 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "After checking [the docs for the exponential distribution](http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.expon.html) we proceed as follows" ] }, { "cell_type": "code", "execution_count": 345, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from scipy.stats import expon\n", "alpha = 0.5\n", "n = 10000\n", "ep = expon(scale=1.0/alpha) # scale controls the exponential parameter\n", "x = ep.rvs(n)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's check we've got the right distribution here" ] }, { "cell_type": "code", "execution_count": 346, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 346, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nRALM/wOHEis7sev3QQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(8, 5))\n", "xmin, xmax = 0.001, 10.0\n", "ax.set_xlim(xmin, xmax)\n", "ax.hist(x, normed=True, bins=40, alpha=0.3)\n", "grid = np.linspace(xmin, xmax, 200)\n", "ax.plot(grid, ep.pdf(grid), 'g-', lw=2, label='true density')\n", "ax.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's [well-known](http://en.wikipedia.org/wiki/Exponential_distribution) that the MLE of $\\alpha$ is $1/\\bar x$ where $\\bar x$ is the mean of the sample. Let's check that it is indeed close to $\\alpha$." ] }, { "cell_type": "code", "execution_count": 347, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "max likelihood estimate of alpha is 0.5042739418869412\n" ] } ], "source": [ "alpha_mle = 1.0 / x.mean()\n", "print(\"max likelihood estimate of alpha is {}\".format(alpha_mle))" ] }, { "cell_type": "code", "execution_count": 348, "metadata": { "collapsed": false }, "outputs": [], "source": [ "s = x.sum()\n", "def neg_loglike(a):\n", " \"Minus the log likelihood function for exponential\"\n", " return - n * np.log(a) + a * s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Minimize over a reasonable parameter space" ] }, { "cell_type": "code", "execution_count": 349, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "0.5042730725954131" ] }, "execution_count": 349, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy.optimize import fminbound\n", "fminbound(neg_loglike, 0.01, 10.0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is very close to the analytical value of the max likelihood estimator we got in exercise 1" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "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.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }