Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save philsheard/5692195 to your computer and use it in GitHub Desktop.
Save philsheard/5692195 to your computer and use it in GitHub Desktop.
This is an iPython notebook that I created to demonstrate some of the features of iPython & pandas. It's the first version and I'll try to improve its usability over time.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "Using Pandas for data analysis"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": "# Here's a demo of a range of Python data analysis features.\n\nA couple of basics first:\n\n1. You're viewing an iPython notebook. It's a feature of the iPython interactive command line shell. By running iPython in notebook mode (type 'ipython notebook --pylab inline' after you've installed everything) you can do lots of handy things:\n * save the input / output to remember or share with others,\n * delete and rearrange elements if you make mistakes,\n * add notes (like this one) using Markdown, to create a narrative with data easily integrated.\n2. The commands below (preceded by 'In [x]') can all be typed into a standard Python shell, or written into a Python script (ending .py). This makes them suitable for interactive work like this, scripts for re-use of the same sequence or use within a web app, which I personally use Django for."
},
{
"cell_type": "code",
"collapsed": false,
"input": "import pandas as pd # Importing pandas as 'pd': it will be clearer later which functions are pandas-related, and avoids naming clashes with other libs\nimport urllib2 # This is a handy library for getting data from the web. Only needed to get the data initially, skip if your data is CSV or similar\nimport simplejson # Another Python library for easy translation of json into Python objects. Again, only needed to interpret the json from our API",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Let's go and get some data to manipulate. I thought [Naveen's new personal data API](http://api.naveen.com/) would be a good test case. It's current, anyone with a Twitter account can get it, and it's not sensitive like most of my day-to-day data."
},
{
"cell_type": "markdown",
"metadata": {},
"source": "---"
},
{
"cell_type": "raw",
"metadata": {},
"source": "For this example, I'm going to put my access token into a string object so that I can call it without constantly revealing it to you. In the line below, substitute everything between the single quotes with your own token, and these commands should all work for you too."
},
{
"cell_type": "code",
"collapsed": false,
"input": "token = str('YOUR_KEY_GOES_HERE')",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "raw",
"metadata": {},
"source": "The next line shows off some of Python's syntax - we're combining two strings into a single object, just using the '+' symbol. In other languages or software, this would typically use a 'Concatenate' command or formula."
},
{
"cell_type": "code",
"collapsed": false,
"input": "url = 'http://api.naveen.com/v0/steps?at=' + token",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "raw",
"metadata": {},
"source": "*Disclaimer: The following few commands, using urllib2 and simplejson were the result of a quick Google. They may not be the 'best' (most efficient, secure, whatever) way to do this - but they work and that will do for now"
},
{
"cell_type": "code",
"collapsed": false,
"input": "req = urllib2.Request(url)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
},
{
"cell_type": "raw",
"metadata": {},
"source": "*Top tip: just type in the name of a variable to see its contents. If you're not sure at any point what a variable contains, this will result in a statement of its contents, a summary of its data if it's a pandas DataFrame or otherwise a definition of what type of object it is."
},
{
"cell_type": "code",
"collapsed": false,
"input": "req",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 23,
"text": "<urllib2.Request instance at 0x107119440>"
}
],
"prompt_number": 23
},
{
"cell_type": "code",
"collapsed": false,
"input": "opener = urllib2.build_opener()\nf = opener.open(req)\nraw_jason = simplejson.load(f)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 20
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps = pd.DataFrame(raw_jason)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 36
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<pre>\n&ltclass 'pandas.core.frame.DataFrame'&gt\nInt64Index: 191 entries, 0 to 190\nData columns (total 3 columns):\ndate 191 non-null values\nid 191 non-null values\nvalue 191 non-null values\ndtypes: int64(1), object(2)\n</pre>",
"output_type": "pyout",
"prompt_number": 37,
"text": "<class 'pandas.core.frame.DataFrame'>\nInt64Index: 191 entries, 0 to 190\nData columns (total 3 columns):\ndate 191 non-null values\nid 191 non-null values\nvalue 191 non-null values\ndtypes: int64(1), object(2)"
}
],
"prompt_number": 37
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps.index",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 38,
"text": "Int64Index([0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 , 43 , 44 , 45 , 46 , 47 , 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60 , 61 , 62 , 63 , 64 , 65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , 80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 91 , 92 , 93 , 94 , 95 , 96 , 97 , 98 , 99 , 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190], dtype=int64)"
}
],
"prompt_number": 38
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps = steps.set_index(steps[\"date\"])",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 90
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps.index",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 91,
"text": "Index([2013-05-30T04:00:00, 2013-05-29T04:00:00, 2013-05-28T04:00:00, 2013-04-29T04:00:00, 2013-04-27T04:00:00, 2013-04-26T04:00:00, 2013-04-25T04:00:00, 2013-04-24T04:00:00, 2013-04-23T04:00:00, 2013-04-21T04:00:00, 2013-04-20T04:00:00, 2013-04-19T04:00:00, 2013-04-18T04:00:00, 2013-04-17T04:00:00, 2013-04-16T04:00:00, 2013-04-15T04:00:00, 2013-04-14T04:00:00, 2013-04-13T04:00:00, 2013-04-12T04:00:00, 2013-04-11T04:00:00, 2013-04-10T04:00:00, 2013-04-09T04:00:00, 2013-04-08T04:00:00, 2013-04-07T04:00:00, 2013-04-06T04:00:00, 2013-04-05T04:00:00, 2013-04-04T04:00:00, 2013-04-03T04:00:00, 2013-04-02T04:00:00, 2013-04-01T04:00:00, 2013-03-31T04:00:00, 2013-03-30T04:00:00, 2013-03-29T04:00:00, 2013-03-28T04:00:00, 2013-03-27T04:00:00, 2013-03-26T04:00:00, 2013-03-25T04:00:00, 2013-03-24T04:00:00, 2013-03-23T04:00:00, 2013-03-22T04:00:00, 2013-03-21T04:00:00, 2013-03-20T04:00:00, 2013-03-19T04:00:00, 2013-03-18T04:00:00, 2013-03-17T04:00:00, 2013-03-16T04:00:00, 2013-03-15T04:00:00, 2013-03-14T04:00:00, 2013-03-13T04:00:00, 2013-03-12T04:00:00, 2013-03-11T04:00:00, 2013-03-10T05:00:00, 2013-03-09T05:00:00, 2013-03-08T05:00:00, 2013-03-07T05:00:00, 2013-03-06T05:00:00, 2013-03-05T05:00:00, 2013-03-04T05:00:00, 2013-03-03T05:00:00, 2013-03-02T05:00:00, 2013-03-01T05:00:00, 2013-02-28T08:00:00, 2013-02-27T08:00:00, 2013-02-26T08:00:00, 2013-02-25T08:00:00, 2013-02-24T05:00:00, 2013-02-23T05:00:00, 2013-02-22T05:00:00, 2013-02-21T05:00:00, 2013-02-20T05:00:00, 2013-02-19T05:00:00, 2013-02-18T05:00:00, 2013-02-17T05:00:00, 2013-02-16T05:00:00, 2013-02-15T05:00:00, 2013-02-14T05:00:00, 2013-02-13T05:00:00, 2013-02-12T05:00:00, 2013-02-11T05:00:00, 2013-02-10T05:00:00, 2013-02-09T05:00:00, 2013-02-08T05:00:00, 2013-02-07T05:00:00, 2013-02-06T05:00:00, 2013-02-05T05:00:00, 2013-02-04T05:00:00, 2013-02-03T05:00:00, 2013-02-02T05:00:00, 2013-02-01T05:00:00, 2013-01-31T05:00:00, 2013-01-30T05:00:00, 2013-01-29T05:00:00, 2013-01-28T05:00:00, 2013-01-27T05:00:00, 2013-01-26T05:00:00, 2013-01-25T05:00:00, 2013-01-24T05:00:00, 2013-01-23T05:00:00, 2013-01-22T05:00:00, 2013-01-21T05:00:00, 2013-01-20T05:00:00, 2013-01-19T05:00:00, 2013-01-18T05:00:00, 2013-01-17T05:00:00, 2013-01-16T05:00:00, 2013-01-15T05:00:00, 2013-01-14T05:00:00, 2013-01-13T05:00:00, 2013-01-12T05:00:00, 2013-01-11T05:00:00, 2013-01-10T05:00:00, 2013-01-09T05:00:00, 2013-01-08T05:00:00, 2013-01-07T05:00:00, 2013-01-06T05:00:00, 2013-01-05T05:00:00, 2013-01-04T05:00:00, 2013-01-03T05:00:00, 2013-01-02T05:00:00, 2013-01-01T05:00:00, 2012-12-31T05:00:00, 2012-12-30T05:00:00, 2012-12-29T05:00:00, 2012-12-28T05:00:00, 2012-12-27T05:00:00, 2012-12-26T05:00:00, 2012-12-25T05:00:00, 2012-12-24T05:00:00, 2012-12-23T05:00:00, 2012-12-22T05:00:00, 2012-12-21T05:00:00, 2012-12-20T05:00:00, 2012-12-19T05:00:00, 2012-12-18T05:00:00, 2012-12-17T05:00:00, 2012-12-16T05:00:00, 2012-05-11T04:00:00, 2012-05-09T04:00:00, 2012-05-08T04:00:00, 2012-05-06T04:00:00, 2012-05-05T04:00:00, 2012-05-04T04:00:00, 2012-05-03T04:00:00, 2012-05-02T04:00:00, 2012-05-01T04:00:00, 2012-04-30T04:00:00, 2012-04-17T04:00:00, 2012-04-16T04:00:00, 2012-04-15T04:00:00, 2012-04-14T04:00:00, 2012-04-13T04:00:00, 2012-04-12T04:00:00, 2012-04-11T04:00:00, 2012-04-10T04:00:00, 2012-04-09T04:00:00, 2012-04-08T04:00:00, 2012-04-07T04:00:00, 2012-04-06T04:00:00, 2012-04-05T04:00:00, 2012-04-03T04:00:00, 2012-04-02T04:00:00, 2012-04-01T04:00:00, 2012-03-31T04:00:00, 2012-03-30T04:00:00, 2012-03-29T04:00:00, 2012-03-28T04:00:00, 2012-03-27T04:00:00, 2012-03-26T04:00:00, 2012-03-25T04:00:00, 2012-03-24T04:00:00, 2012-03-23T04:00:00, 2012-03-22T04:00:00, 2012-03-21T04:00:00, 2012-03-20T04:00:00, 2012-03-19T04:00:00, 2012-03-17T04:00:00, 2012-03-16T04:00:00, 2012-03-15T04:00:00, 2012-03-14T04:00:00, 2012-03-13T04:00:00, 2012-03-12T04:00:00, 2012-03-11T05:00:00, 2012-03-10T05:00:00, 2012-03-09T05:00:00, 2012-03-08T05:00:00, 2012-03-07T05:00:00, 2012-03-06T05:00:00, 2012-03-05T05:00:00, 2012-03-04T05:00:00, 2012-03-03T05:00:00, 2012-03-02T05:00:00], dtype=object)"
}
],
"prompt_number": 91
},
{
"cell_type": "raw",
"metadata": {},
"source": "One issue here is that the index hasn't automatically picked up the datetime format. The next command will clean this up. With more time, I'd bet there's a way to set this properly when creating the dataframe in the first place. When reading using the pandas 'read_csv' method, there's an option to parse_dates=True, so this is something that's on the radar.\n\nFor now, let's just use the pandas 'to_datetime' method to convert the timestamps to proper datetime objects."
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps.index = pd.to_datetime(steps.index)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 92
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps.index",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 93,
"text": "<class 'pandas.tseries.index.DatetimeIndex'>\n[2013-05-30 04:00:00, ..., 2012-03-02 05:00:00]\nLength: 191, Freq: None, Timezone: None"
}
],
"prompt_number": 93
},
{
"cell_type": "raw",
"metadata": {},
"source": "Let's do some analysis on the DataFrame now then.\n\nBasic stuff first. This is the steps dataset so we're probably interested in quantifying it in a few ways."
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps['value'].sum()",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 42,
"text": "1640341"
}
],
"prompt_number": 42
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps['value'].mean()",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 46,
"text": "8588.1727748691101"
}
],
"prompt_number": 46
},
{
"cell_type": "code",
"collapsed": false,
"input": "%precision 2",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 47,
"text": "u'%.2f'"
}
],
"prompt_number": 47
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps['value'].mean()",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 48,
"text": "8588.17"
}
],
"prompt_number": 48
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps.head()",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>date</th>\n <th>id</th>\n <th>value</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2013-05-30 04:00:00</th>\n <td> 2013-05-30T04:00:00</td>\n <td> 51a842a3b0197500094789ae</td>\n <td> 510</td>\n </tr>\n <tr>\n <th>2013-05-29 04:00:00</th>\n <td> 2013-05-29T04:00:00</td>\n <td> 51a842a3b0197500094789b0</td>\n <td> 9</td>\n </tr>\n <tr>\n <th>2013-05-28 04:00:00</th>\n <td> 2013-05-28T04:00:00</td>\n <td> 51a842a3b0197500094789b2</td>\n <td> 6182</td>\n </tr>\n <tr>\n <th>2013-04-29 04:00:00</th>\n <td> 2013-04-29T04:00:00</td>\n <td> 51a842a3b0197500094789b6</td>\n <td> 1825</td>\n </tr>\n <tr>\n <th>2013-04-27 04:00:00</th>\n <td> 2013-04-27T04:00:00</td>\n <td> 51a842a3b0197500094789b9</td>\n <td> 10504</td>\n </tr>\n </tbody>\n</table>\n</div>",
"output_type": "pyout",
"prompt_number": 94,
"text": " date id value\n2013-05-30 04:00:00 2013-05-30T04:00:00 51a842a3b0197500094789ae 510\n2013-05-29 04:00:00 2013-05-29T04:00:00 51a842a3b0197500094789b0 9\n2013-05-28 04:00:00 2013-05-28T04:00:00 51a842a3b0197500094789b2 6182\n2013-04-29 04:00:00 2013-04-29T04:00:00 51a842a3b0197500094789b6 1825\n2013-04-27 04:00:00 2013-04-27T04:00:00 51a842a3b0197500094789b9 10504"
}
],
"prompt_number": 94
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps.index = pd.to_datetime(steps.index)",
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 61
},
{
"cell_type": "raw",
"metadata": {},
"source": "Here's another handy thing. Because we've set the index to be a datetime object, Pandas knows the qualities of that object and can do some handy summaries for us:"
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps[\"2013\"]",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<pre>\n&ltclass 'pandas.core.frame.DataFrame'&gt\nDatetimeIndex: 120 entries, 2013-05-30 04:00:00 to 2013-01-01 05:00:00\nData columns (total 3 columns):\ndate 120 non-null values\nid 120 non-null values\nvalue 120 non-null values\ndtypes: int64(1), object(2)\n</pre>",
"output_type": "pyout",
"prompt_number": 70,
"text": "<class 'pandas.core.frame.DataFrame'>\nDatetimeIndex: 120 entries, 2013-05-30 04:00:00 to 2013-01-01 05:00:00\nData columns (total 3 columns):\ndate 120 non-null values\nid 120 non-null values\nvalue 120 non-null values\ndtypes: int64(1), object(2)"
}
],
"prompt_number": 70
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps[\"2013-05\"]",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>date</th>\n <th>id</th>\n <th>value</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2013-05-30 04:00:00</th>\n <td> 2013-05-30T04:00:00</td>\n <td> 51a842a3b0197500094789ae</td>\n <td> 510</td>\n </tr>\n <tr>\n <th>2013-05-29 04:00:00</th>\n <td> 2013-05-29T04:00:00</td>\n <td> 51a842a3b0197500094789b0</td>\n <td> 9</td>\n </tr>\n <tr>\n <th>2013-05-28 04:00:00</th>\n <td> 2013-05-28T04:00:00</td>\n <td> 51a842a3b0197500094789b2</td>\n <td> 6182</td>\n </tr>\n </tbody>\n</table>\n</div>",
"output_type": "pyout",
"prompt_number": 71,
"text": " date id value\n2013-05-30 04:00:00 2013-05-30T04:00:00 51a842a3b0197500094789ae 510\n2013-05-29 04:00:00 2013-05-29T04:00:00 51a842a3b0197500094789b0 9\n2013-05-28 04:00:00 2013-05-28T04:00:00 51a842a3b0197500094789b2 6182"
}
],
"prompt_number": 71
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps[\"2013-04\"].head()",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>date</th>\n <th>id</th>\n <th>value</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2013-04-29 04:00:00</th>\n <td> 2013-04-29T04:00:00</td>\n <td> 51a842a3b0197500094789b6</td>\n <td> 1825</td>\n </tr>\n <tr>\n <th>2013-04-27 04:00:00</th>\n <td> 2013-04-27T04:00:00</td>\n <td> 51a842a3b0197500094789b9</td>\n <td> 10504</td>\n </tr>\n <tr>\n <th>2013-04-26 04:00:00</th>\n <td> 2013-04-26T04:00:00</td>\n <td> 51a842a3b0197500094789bb</td>\n <td> 9726</td>\n </tr>\n <tr>\n <th>2013-04-25 04:00:00</th>\n <td> 2013-04-25T04:00:00</td>\n <td> 51a842a3b0197500094789bd</td>\n <td> 10383</td>\n </tr>\n <tr>\n <th>2013-04-24 04:00:00</th>\n <td> 2013-04-24T04:00:00</td>\n <td> 51a842a3b0197500094789bf</td>\n <td> 11467</td>\n </tr>\n </tbody>\n</table>\n</div>",
"output_type": "pyout",
"prompt_number": 74,
"text": " date id value\n2013-04-29 04:00:00 2013-04-29T04:00:00 51a842a3b0197500094789b6 1825\n2013-04-27 04:00:00 2013-04-27T04:00:00 51a842a3b0197500094789b9 10504\n2013-04-26 04:00:00 2013-04-26T04:00:00 51a842a3b0197500094789bb 9726\n2013-04-25 04:00:00 2013-04-25T04:00:00 51a842a3b0197500094789bd 10383\n2013-04-24 04:00:00 2013-04-24T04:00:00 51a842a3b0197500094789bf 11467"
}
],
"prompt_number": 74
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps[\"2013-4\"].sum()",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 76,
"text": "date 2013-04-29T04:00:002013-04-27T04:00:002013-04-...\nid 51a842a3b0197500094789b651a842a3b0197500094789...\nvalue 222804\ndtype: object"
}
],
"prompt_number": 76
},
{
"cell_type": "raw",
"metadata": {},
"source": "So if this was a big dataset but we quickly wanted to see how many steps there were in April, that above command would work.\n\nMore often than not, though, you might want to summarise tidy up the presentation a bit.\n\nTake a look at the 'groupby' feature. Let's group by the month element of the index (again, this feels a bit like magic until you realise that 'month' is a method of the datetime object in pandas, so you don't need to create it yourself)"
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps.groupby(steps.index.month).sum()",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>value</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>1 </th>\n <td> 269097</td>\n </tr>\n <tr>\n <th>2 </th>\n <td> 236852</td>\n </tr>\n <tr>\n <th>3 </th>\n <td> 537468</td>\n </tr>\n <tr>\n <th>4 </th>\n <td> 383628</td>\n </tr>\n <tr>\n <th>5 </th>\n <td> 77914</td>\n </tr>\n <tr>\n <th>12</th>\n <td> 135382</td>\n </tr>\n </tbody>\n</table>\n</div>",
"output_type": "pyout",
"prompt_number": 79,
"text": " value\n1 269097\n2 236852\n3 537468\n4 383628\n5 77914\n12 135382"
}
],
"prompt_number": 79
},
{
"cell_type": "raw",
"metadata": {},
"source": "This looks a bit off - there's a jump from May to December. Probably means December is from last year. Let's take a better look.\n\nTo solve this sort of problem, you can groupby multiple attributes. This is the sort of thing I often look to Pivot Tables in excel to do for me:"
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps.groupby([steps.index.year, steps.index.month]).sum()",
"language": "python",
"metadata": {},
"outputs": [
{
"html": "<div style=\"max-height:1000px;max-width:1500px;overflow:auto;\">\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th></th>\n <th>value</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th rowspan=\"4\" valign=\"top\">2012</th>\n <th>3 </th>\n <td> 297113</td>\n </tr>\n <tr>\n <th>4 </th>\n <td> 160824</td>\n </tr>\n <tr>\n <th>5 </th>\n <td> 71213</td>\n </tr>\n <tr>\n <th>12</th>\n <td> 135382</td>\n </tr>\n <tr>\n <th rowspan=\"5\" valign=\"top\">2013</th>\n <th>1 </th>\n <td> 269097</td>\n </tr>\n <tr>\n <th>2 </th>\n <td> 236852</td>\n </tr>\n <tr>\n <th>3 </th>\n <td> 240355</td>\n </tr>\n <tr>\n <th>4 </th>\n <td> 222804</td>\n </tr>\n <tr>\n <th>5 </th>\n <td> 6701</td>\n </tr>\n </tbody>\n</table>\n</div>",
"output_type": "pyout",
"prompt_number": 81,
"text": " value\n2012 3 297113\n 4 160824\n 5 71213\n 12 135382\n2013 1 269097\n 2 236852\n 3 240355\n 4 222804\n 5 6701"
}
],
"prompt_number": 81
},
{
"cell_type": "raw",
"metadata": {},
"source": "This is when it starts getting interesting. Let's do a chart for this:"
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps.groupby([steps.index.year, steps.index.month]).sum().plot()",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 82,
"text": "<matplotlib.axes.AxesSubplot at 0x1072e8790>"
},
{
"output_type": "display_data",
"png": "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\n"
}
],
"prompt_number": 82
},
{
"cell_type": "raw",
"metadata": {},
"source": "This would probably look better as a bar chart:"
},
{
"cell_type": "code",
"collapsed": false,
"input": "steps.groupby([steps.index.year, steps.index.month]).sum().plot(kind='bar')",
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 86,
"text": "<matplotlib.axes.AxesSubplot at 0x107334850>"
},
{
"output_type": "display_data",
"png": "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\nNDoqqmFBdwAAAABJRU5ErkJggg==\n"
}
],
"prompt_number": 86
},
{
"cell_type": "raw",
"metadata": {},
"source": "I've not really scratched the surface on plotting yet, so can't offer any more useful suggestions. This dataset would look nicer in charts if the data was resampled to fill in the blanks between months, but you get the idea from here."
},
{
"cell_type": "markdown",
"metadata": {},
"source": "That's all for now.\n\nYou can do some pretty nice text-based stuff as well, which I use for social network data. Things like 'str.contains' if the column values are of the correct type. You can also use regex within these, so you can easily filter out items that begin wit \"RT @\" for example."
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment