{ "metadata": { "name": "", "signature": "sha256:70494b3455eef6b39078bf8db0b82b3600a42c341a90da855b1bd1111eea2b54" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Introduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This material assumes that you have programmed before. This first lecture provides a quick introduction to programming in Python for those who either haven't used Python before or need a quick refresher.\n", "\n", "Let's start with a hypothetical problem we want to solve. We are interested in understanding the relationship between the weather and the number of mosquitos occuring in a particular year so that we can plan mosquito control measures accordingly. Since we want to apply these mosquito control measures at a number of different sites we need to understand both the relationship at a particular site and whether or not it is consistent across sites. The data we have to address this problem comes from the local government and are stored in tables in comma-separated values (CSV) files. Each file holds the data for a single location, each row holds the information for a single year at that location, and the columns hold the data on both mosquito numbers and the average temperature and rainfall from the beginning of mosquito breeding season. The first few rows of our first file look like:\n", "\n", "~~~\n", "year,temperature,rainfall,mosquitos\n", "2001,87,222,198\n", "2002,72,103,105\n", "2003,77,176,166\n", "~~~" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Objectives" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Conduct variable assignment, looping, and conditionals in Python\n", "* Use an external Python library\n", "* Read tabular data from a file\n", "* Subset and perform analysis on data\n", "* Display simple graphs" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Loading Data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to load the data, we need to import a library called Pandas that knows\n", "how to operate on tables of data." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pandas" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now use Pandas to read our data file." ] }, { "cell_type": "code", "collapsed": false, "input": [ "pandas.read_csv('A1_mosquito_data.csv')" ], "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", "
yeartemperaturerainfallmosquitos
0 2001 80 157 150
1 2002 85 252 217
2 2003 86 154 153
3 2004 87 159 158
4 2005 74 292 243
5 2006 75 283 237
6 2007 80 214 190
7 2008 85 197 181
8 2009 74 231 200
9 2010 74 207 184
\n", "

10 rows \u00d7 4 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ " year temperature rainfall mosquitos\n", "0 2001 80 157 150\n", "1 2002 85 252 217\n", "2 2003 86 154 153\n", "3 2004 87 159 158\n", "4 2005 74 292 243\n", "5 2006 75 283 237\n", "6 2007 80 214 190\n", "7 2008 85 197 181\n", "8 2009 74 231 200\n", "9 2010 74 207 184\n", "\n", "[10 rows x 4 columns]" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `read_csv()` function belongs to the `pandas` library. In order to run it we need to tell Python that it is part of `pandas` and we do this using the dot notation, which is used everywhere in Python to refer to parts of larger things.\n", "\n", "When we are finished typing and press Shift+Enter, the notebook runs our command and shows us its output. In this case, the output is the data we just loaded.\n", "\n", "Our call to `pandas.read_csv()` read data into memory, but didn't save it anywhere. To do that, we need to assign the array to a variable. In Python we use `=` to assign a new value to a variable like this:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "data = pandas.read_csv('A1_mosquito_data.csv')" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This statement doesn't produce any output because assignment doesn't display anything. If we want to check that our data has been loaded, we can print the variable's value:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print data" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " year temperature rainfall mosquitos\n", "0 2001 80 157 150\n", "1 2002 85 252 217\n", "2 2003 86 154 153\n", "3 2004 87 159 158\n", "4 2005 74 292 243\n", "5 2006 75 283 237\n", "6 2007 80 214 190\n", "7 2008 85 197 181\n", "8 2009 74 231 200\n", "9 2010 74 207 184\n", "\n", "[10 rows x 4 columns]\n" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "`print data` tells Python to display the text. Alternatively we could just include `data` as the last value in a code cell:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "data" ], "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", "
yeartemperaturerainfallmosquitos
0 2001 80 157 150
1 2002 85 252 217
2 2003 86 154 153
3 2004 87 159 158
4 2005 74 292 243
5 2006 75 283 237
6 2007 80 214 190
7 2008 85 197 181
8 2009 74 231 200
9 2010 74 207 184
\n", "

10 rows \u00d7 4 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ " year temperature rainfall mosquitos\n", "0 2001 80 157 150\n", "1 2002 85 252 217\n", "2 2003 86 154 153\n", "3 2004 87 159 158\n", "4 2005 74 292 243\n", "5 2006 75 283 237\n", "6 2007 80 214 190\n", "7 2008 85 197 181\n", "8 2009 74 231 200\n", "9 2010 74 207 184\n", "\n", "[10 rows x 4 columns]" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This tells the IPython Notebook to display the `data` object, which is why we see a pretty formated table." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Manipulating data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once we have imported the data we can start doing things with it. First, let's ask what type of thing `data` refers to:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print type(data)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The data is stored in a data structure called a DataFrame. There are other kinds of data structures that are also commonly used in scientific computing including Numpy arrays, and Numpy matrices, which can be used for doing linear algebra." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can select an individual column of data using its name:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print data['year']" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0 2001\n", "1 2002\n", "2 2003\n", "3 2004\n", "4 2005\n", "5 2006\n", "6 2007\n", "7 2008\n", "8 2009\n", "9 2010\n", "Name: year, dtype: int64\n" ] } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Or we can select several columns of data at once:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print data[['rainfall', 'temperature']]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " rainfall temperature\n", "0 157 80\n", "1 252 85\n", "2 154 86\n", "3 159 87\n", "4 292 74\n", "5 283 75\n", "6 214 80\n", "7 197 85\n", "8 231 74\n", "9 207 74\n", "\n", "[10 rows x 2 columns]\n" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also select subsets of rows using slicing. Say we just want the first two rows of data:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print data[0:2]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " year temperature rainfall mosquitos\n", "0 2001 80 157 150\n", "1 2002 85 252 217\n", "\n", "[2 rows x 4 columns]\n" ] } ], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are a couple of important things to note here. First, Python indexing starts at zero. In contrast, programming languages like R and MATLAB start counting at 1, because that's what human beings have done for thousands of years. Languages in the C family (including C++, Java, Perl, and Python) count from 0 because that's simpler for computers to do. This means that if we have 5 things in Python they are numbered 0, 1, 2, 3, 4, and the first row in a data frame is always row 0.\n", "\n", "The other thing to note is that the subset of rows starts at the first value and goes up to, but does not include, the second value. Again, the up-to-but-not-including takes a bit of getting used to, but the rule is that the difference between the upper and lower bounds is the number of values in the slice." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One thing that we can't do with this syntax is directly ask for the data from a single row:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "data[1]" ], "language": "python", "metadata": {}, "outputs": [ { "ename": "KeyError", "evalue": "u'no item named 1'", "output_type": "pyerr", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mdata\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32m/usr/lib/python2.7/dist-packages/pandas/core/frame.pyc\u001b[0m in \u001b[0;36m__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 1656\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1657\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1658\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_column\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1659\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1660\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_getitem_column\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m/usr/lib/python2.7/dist-packages/pandas/core/frame.pyc\u001b[0m in \u001b[0;36m_getitem_column\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 1663\u001b[0m \u001b[1;31m# get column\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1664\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mis_unique\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1665\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_get_item_cache\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1666\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1667\u001b[0m \u001b[1;31m# duplicate columns & possible reduce dimensionaility\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m/usr/lib/python2.7/dist-packages/pandas/core/generic.pyc\u001b[0m in \u001b[0;36m_get_item_cache\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m 1003\u001b[0m \u001b[0mres\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcache\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1004\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mres\u001b[0m \u001b[1;32mis\u001b[0m \u001b[0mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1005\u001b[1;33m \u001b[0mvalues\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1006\u001b[0m \u001b[0mres\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_box_item_values\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalues\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1007\u001b[0m \u001b[0mcache\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mres\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m/usr/lib/python2.7/dist-packages/pandas/core/internals.pyc\u001b[0m in \u001b[0;36mget\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m 2872\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_for_nan_indexer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2873\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2874\u001b[1;33m \u001b[0m_\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mblock\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_find_block\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2875\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mblock\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2876\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m/usr/lib/python2.7/dist-packages/pandas/core/internals.pyc\u001b[0m in \u001b[0;36m_find_block\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m 3184\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3185\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_find_block\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3186\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_check_have\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3187\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mi\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mblock\u001b[0m \u001b[1;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mblocks\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3188\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mitem\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mblock\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m/usr/lib/python2.7/dist-packages/pandas/core/internals.pyc\u001b[0m in \u001b[0;36m_check_have\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m 3191\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0m_check_have\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3192\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mitem\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3193\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'no item named %s'\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mcom\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpprint_thing\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3194\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3195\u001b[0m def reindex_axis(self, new_axis, indexer=None, method=None, axis=0,\n", "\u001b[1;31mKeyError\u001b[0m: u'no item named 1'" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is because there are several things that we could mean by `data[1]` so if we want a single row we can either take a slice that returns a single row:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print data[1:2]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " year temperature rainfall mosquitos\n", "1 2002 85 252 217\n", "\n", "[1 rows x 4 columns]\n" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "or use the `.iloc` method, which stands for \"integer location\" since we are looking up the row based on its integer index." ] }, { "cell_type": "code", "collapsed": false, "input": [ "print data.iloc[1]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "year 2002\n", "temperature 85\n", "rainfall 252\n", "mosquitos 217\n", "Name: 1, dtype: int64\n" ] } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also use this same syntax for getting larger subsets of rows:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print data.iloc[1:3]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ " year temperature rainfall mosquitos\n", "1 2002 85 252 217\n", "2 2003 86 154 153\n", "\n", "[2 rows x 4 columns]\n" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also subset the data based on the value of other rows:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print data['temperature'][data['year'] > 2005]" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "5 75\n", "6 80\n", "7 85\n", "8 74\n", "9 74\n", "Name: temperature, dtype: int64\n" ] } ], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Data frames also know how to perform common mathematical operations on their values. If we want to find the average value for each variable, we can just ask the data frame for its mean values" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print data.mean()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "year 2005.5\n", "temperature 80.0\n", "rainfall 214.6\n", "mosquitos 191.3\n", "dtype: float64\n" ] } ], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Data frames have lots of useful methods:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print data.max()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "year 2010\n", "temperature 87\n", "rainfall 292\n", "mosquitos 243\n", "dtype: int64\n" ] } ], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "print data['temperature'].min()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "74\n" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "print data['mosquitos'][1:3].std()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "45.2548339959\n" ] } ], "prompt_number": 18 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Challenge" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Import the data from `A2_mosquito_data.csv`, create a new variable that holds a data frame with only the weather data, and print the means and standard deviations for the weather variables." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Loops" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once we have some data we often want to be able to loop over it to perform the same operation repeatedly.\n", "A `for` loop in Python takes the general form\n", "\n", "~~~\n", "for item in list:\n", " do_something\n", "~~~\n", "\n", "So if we want to loop over the temperatures and print out there values in degrees Celcius (instead of Farenheit) we can use:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "temps = data['temperature']\n", "for temp_in_f in temps:\n", " temp_in_c = (temp_in_f - 32) * 5 / 9.0\n", " print temp_in_c" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "26.6666666667\n", "29.4444444444\n", "30.0\n", "30.5555555556\n", "23.3333333333\n", "23.8888888889\n", "26.6666666667\n", "29.4444444444\n", "23.3333333333\n", "23.3333333333\n" ] } ], "prompt_number": 19 }, { "cell_type": "markdown", "metadata": {}, "source": [ "That looks good, but why did we use 9.0 instead of 9? The reason is that computers store integers and numbers with decimals as different types: integers and floating point numbers (or floats). Addition, subtraction and multiplication work on both as we'd expect, but division works differently. If we divide one integer by another, we get the quotient without the remainder:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print '10/3 is:', 10 / 3" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "10/3 is: 3\n" ] } ], "prompt_number": 20 }, { "cell_type": "markdown", "metadata": {}, "source": [ "If either part of the division is a float, on the other hand, the computer creates a floating-point answer:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print '10/3.0 is:', 10 / 3.0" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "10/3.0 is: 3.33333333333\n" ] } ], "prompt_number": 21 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The computer does this for historical reasons: integer operations were much faster on early machines, and this behavior is actually useful in a lot of situations. However, it's still confusing, so Python 3 produces a floating-point answer when dividing integers if it needs to. We're still using Python 2.7 in this class, so if we want 5/9 to give us the right answer, we have to write it as 5.0/9, 5/9.0, or some other variation." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Conditionals" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The other standard thing we need to know how to do in Python is conditionals, or if/then/else statements. In Python the basic syntax is:\n", "\n", "~~~python\n", "if condition:\n", " do_something\n", "~~~\n", "\n", "So if we want to loop over the temperatures and print out only those temperatures that are greater than 80 degrees we would use:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "temp = data['temperature'][0]\n", "if temp > 80:\n", " print \"The temperature is greater than 80\"" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 22 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can also use `==` for equality, `<=` for less than or equal to, `>=` for greater than or equal to, and `!=` for not equal to.\n", "\n", "Additional conditions can be handled using `elif` and `else`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "temp = data['temperature'][0]\n", "if temp < 87:\n", " print \"The temperature is < 87\"\n", "elif temp > 87:\n", " print \"The temperature is > 87\"\n", "else:\n", " print \" The temperature is equal to 87\"" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "The temperature is < 87\n" ] } ], "prompt_number": 23 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Challenge" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Import the data from `A2_mosquito_data.csv`, determine the mean temperate, and loop over the temperature values. For each value print out whether it is greater than the mean, less than the mean, or equal to the mean." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Plotting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The mathematician Richard Hamming once said, \"The purpose of computing is insight, not numbers,\" and the best way to develop insight is often to visualize data. The main plotting library in Python is `matplotlib`. To get started, let's tell the IPython Notebook that we want our plots displayed inline, rather than in a separate viewing window:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%matplotlib inline" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 24 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `%` at the start of the line signals that this is a command for the notebook, rather than a statement in Python. Next, we will import the `pyplot` module from `matplotlib`, but since `pyplot` is a fairly long name to type repeatedly let's give it an alias." ] }, { "cell_type": "code", "collapsed": false, "input": [ "from matplotlib import pyplot as plt" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 25 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This import statement shows two new things. First, we can import part of a library by using the `from library import submodule` syntax. Second, we can use a different name to refer to the imported library by using `as newname`.\n", "\n", "Now, let's make a simple plot showing how the number of mosquitos varies over time. We'll use the site you've been doing exercises with since it has a longer time-series." ] }, { "cell_type": "code", "collapsed": false, "input": [ "data = pandas.read_csv('A2_mosquito_data.csv')\n", "plt.plot(data['year'], data['mosquitos'])" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 26, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nQUQZ/x8njjtKqMJ9RQAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 26 }, { "cell_type": "markdown", "metadata": {}, "source": [ "More complicated plots can be created by adding a little additional information. Let's say we want to look at how the different weather variables vary over time." ] }, { "cell_type": "code", "collapsed": false, "input": [ "plt.figure(figsize=(10.0, 3.0))\n", "\n", "plt.subplot(1, 2, 1)\n", "plt.plot(data['year'], data['temperature'], 'ro-')\n", "plt.xlabel('Year')\n", "plt.ylabel('Temperature')\n", "\n", "plt.subplot(1, 2, 2)\n", "plt.plot(data['year'], data['rainfall'], 'bs-')\n", "plt.xlabel('Year')\n", "plt.ylabel('Rain Fall')\n", "plt.show()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "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\nH/jIoJoVDc62AAAAAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 27 }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Challenge" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the data in `A2_mosquito_data.csv` plot the relationship between the number of mosquitos and temperature and the number of mosquitos and rainfall." ] }, { "cell_type": "heading", "level": 3, "metadata": {}, "source": [ "Key Points" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Import a library into a program using `import libraryname`.\n", "* Use the `pandas` library to work with data tables in Python.\n", "* Use `variable = value` to assign a value to a variable.\n", "* Use `print something` to display the value of `something`.\n", "* Use `dataframe['columnname']` to select a column of data.\n", "* Use `dataframe[start_row:stop_row]` to select rows from a data frame.\n", "* Indices start at 0, not 1.\n", "* Use `dataframe.mean()`, `dataframe.max()`, and `dataframe.min()` to calculate simple statistics.\n", "* Use `for x in list:` to loop over values\n", "* Use `if condition:` to make conditional decisions\n", "* Use the `pyplot` library from `matplotlib` for creating simple visualizations." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Next steps" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With the requisite Python background out of the way, now we're ready to dig in to analyzing our data, and along the way learn how to write better code, more efficiently, that is more likely to be correct." ] } ], "metadata": {} } ] }