Skip to content

Instantly share code, notes, and snippets.

@araastat
Created November 6, 2013 08:40
Show Gist options
  • Save araastat/7332860 to your computer and use it in GitHub Desktop.
Save araastat/7332860 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Data analysis using the Python ecosystem\n",
"\n",
"## Before pandas\n",
"\n",
"### Scientific Python\n",
"Python has a scientific computing ecosystem that has existed since the mid-90s\n",
"\n",
"+ Numpy (as Numeric since 1995, current incarnation since 2006)\n",
"+ Scipy (2001)\n",
"+ Matplotlib (early 2000s)\n",
"+ Sympy (2007)\n",
"\n",
"This ecosystem is meant to emulate __Matlab__, and is geared to numerical data\n",
"\n",
"### Natural Language Processing\n",
"Python has a mature natural language processing library, __NLTK__ (Natural Language ToolKit), for symbolic and statistical natural language processing.\n",
"\n",
"### What was lacking\n",
"\n",
"This ecosystem provided tools for data munging and analysis, but didn't necessarily make it easy. \n",
"\n",
"+ No container for heterogeneous data types (a la <code>data.frame</code> in R) that can be easily manipulated\n",
"\n",
" - Lists and dicts are around, but needed to be simpler\n",
" - Metadata (labeling rows and columns, referencing by labels)\n",
" - Manipulation and extraction using either array or label or component syntax\n",
" \n",
"+ Easy handling of missing data\n",
"\n",
" - Masked arrays in numpy are available\n",
" - Simple imputation\n",
" - Easy way to get complete or partially complete cases\n",
"\n",
"+ Easy data munging capabilities\n",
"\n",
" - reshaping data from wide to long and v.v\n",
" - subsetting\n",
" - split-apply-combine\n",
" - aggregation\n",
" \n",
"+ Exploratory data analysis, summaries\n",
"+ Statistical modeling and machine learning\n",
"\n",
" - Was rudimentary c. 2009\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"## pandas\n",
"\n",
"__pandas__ (Python data analysis toolbox) was first released in 2008. The current version is 0.12, released in July.\n",
"\n",
"+ Puts R in the bullseye\n",
"+ Wants to emulate R's capabilities in a more efficient computing environment\n",
"+ Provide a rich data analysis environment that can be easily integrated into production and web infrastructures\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<quote style=\"font-family:Times New Roman; font-style:italic; font-size:120%; color: red\">R makes users forget how fast a computer really is</quote> <p style=\"text-align:right\">John Myles White, SPDC, October 2013</p>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import warnings\n",
"warnings.filterwarnings(\"ignore\", category=DeprecationWarning)\n",
"warnings.filterwarnings(\"ignore\", category=UserWarning)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy as np\n",
"import pandas as pd\n",
"pd.__version__"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 2,
"text": [
"'0.12.0'"
]
}
],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### <code>pandas</code> has two main data structures: <code>Series</code> and <code>DataFrame</code>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Series"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"values = [5,3,4,8,2,9]\n",
"vals = pd.Series(values)\n",
"vals"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 3,
"text": [
"0 5\n",
"1 3\n",
"2 4\n",
"3 8\n",
"4 2\n",
"5 9\n",
"dtype: int64"
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Each value is now associated with an _index_. The index itself is an object of class <code>Index</code> and can be manipulated directly."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"vals.index"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"text": [
"Int64Index([0, 1, 2, 3, 4, 5], dtype=int64)"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"vals.values"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 5,
"text": [
"array([5, 3, 4, 8, 2, 9])"
]
}
],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"vals2 = pd.Series(values, index=['a','b','c','d','e','f'])\n",
"vals2"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 6,
"text": [
"a 5\n",
"b 3\n",
"c 4\n",
"d 8\n",
"e 2\n",
"f 9\n",
"dtype: int64"
]
}
],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"vals2[['b','d']]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 7,
"text": [
"b 3\n",
"d 8\n",
"dtype: int64"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"vals2[['e','f','g']]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"text": [
"e 2\n",
"f 9\n",
"g NaN\n",
"dtype: float64"
]
}
],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"vals3 = vals2[['a','b','c','f','g','h']]\n",
"vals3"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 9,
"text": [
"a 5\n",
"b 3\n",
"c 4\n",
"f 9\n",
"g NaN\n",
"h NaN\n",
"dtype: float64"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"vals3.isnull()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 10,
"text": [
"a False\n",
"b False\n",
"c False\n",
"f False\n",
"g True\n",
"h True\n",
"dtype: bool"
]
}
],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"vals3.dropna()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 11,
"text": [
"a 5\n",
"b 3\n",
"c 4\n",
"f 9\n",
"dtype: float64"
]
}
],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"vals3.fillna(0)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 12,
"text": [
"a 5\n",
"b 3\n",
"c 4\n",
"f 9\n",
"g 0\n",
"h 0\n",
"dtype: float64"
]
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"vals3.fillna(vals3.mean())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 13,
"text": [
"a 5.00\n",
"b 3.00\n",
"c 4.00\n",
"f 9.00\n",
"g 5.25\n",
"h 5.25\n",
"dtype: float64"
]
}
],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"vals3.fillna(method='ffill')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 14,
"text": [
"a 5\n",
"b 3\n",
"c 4\n",
"f 9\n",
"g 9\n",
"h 9\n",
"dtype: float64"
]
}
],
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"vals3.describe()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 15,
"text": [
"count 4.000000\n",
"mean 5.250000\n",
"std 2.629956\n",
"min 3.000000\n",
"25% 3.750000\n",
"50% 4.500000\n",
"75% 6.000000\n",
"max 9.000000\n",
"dtype: float64"
]
}
],
"prompt_number": 15
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## DataFrame"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"vals.index=pd.Index(['a','b','c','d','e','f'])\n",
"vals3=vals3[['a','c','d','e','z']]\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 16
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"dat = pd.DataFrame({'orig':vals,'new':vals3})\n",
"dat"
],
"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>new</th>\n",
" <th>orig</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>a</th>\n",
" <td> 5</td>\n",
" <td> 5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>b</th>\n",
" <td>NaN</td>\n",
" <td> 3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>c</th>\n",
" <td> 4</td>\n",
" <td> 4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>d</th>\n",
" <td>NaN</td>\n",
" <td> 8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>e</th>\n",
" <td>NaN</td>\n",
" <td> 2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>f</th>\n",
" <td>NaN</td>\n",
" <td> 9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>z</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 17,
"text": [
" new orig\n",
"a 5 5\n",
"b NaN 3\n",
"c 4 4\n",
"d NaN 8\n",
"e NaN 2\n",
"f NaN 9\n",
"z NaN NaN"
]
}
],
"prompt_number": 17
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"dat.fillna(1)"
],
"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>new</th>\n",
" <th>orig</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>a</th>\n",
" <td> 5</td>\n",
" <td> 5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>b</th>\n",
" <td> 1</td>\n",
" <td> 3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>c</th>\n",
" <td> 4</td>\n",
" <td> 4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>d</th>\n",
" <td> 1</td>\n",
" <td> 8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>e</th>\n",
" <td> 1</td>\n",
" <td> 2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>f</th>\n",
" <td> 1</td>\n",
" <td> 9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>z</th>\n",
" <td> 1</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 18,
"text": [
" new orig\n",
"a 5 5\n",
"b 1 3\n",
"c 4 4\n",
"d 1 8\n",
"e 1 2\n",
"f 1 9\n",
"z 1 1"
]
}
],
"prompt_number": 18
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cars = pd.read_csv('mtcars.csv')\n",
"cars[:10]"
],
"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>mpg</th>\n",
" <th>cyl</th>\n",
" <th>disp</th>\n",
" <th>hp</th>\n",
" <th>drat</th>\n",
" <th>wt</th>\n",
" <th>qsec</th>\n",
" <th>vs</th>\n",
" <th>am</th>\n",
" <th>gear</th>\n",
" <th>carb</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td> 21.0</td>\n",
" <td> 6</td>\n",
" <td> 160.0</td>\n",
" <td> 110</td>\n",
" <td> 3.90</td>\n",
" <td> 2.620</td>\n",
" <td> 16.46</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td> 21.0</td>\n",
" <td> 6</td>\n",
" <td> 160.0</td>\n",
" <td> 110</td>\n",
" <td> 3.90</td>\n",
" <td> 2.875</td>\n",
" <td> 17.02</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td> 22.8</td>\n",
" <td> 4</td>\n",
" <td> 108.0</td>\n",
" <td> 93</td>\n",
" <td> 3.85</td>\n",
" <td> 2.320</td>\n",
" <td> 18.61</td>\n",
" <td> 1</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td> 21.4</td>\n",
" <td> 6</td>\n",
" <td> 258.0</td>\n",
" <td> 110</td>\n",
" <td> 3.08</td>\n",
" <td> 3.215</td>\n",
" <td> 19.44</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" <td> 3</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td> 18.7</td>\n",
" <td> 8</td>\n",
" <td> 360.0</td>\n",
" <td> 175</td>\n",
" <td> 3.15</td>\n",
" <td> 3.440</td>\n",
" <td> 17.02</td>\n",
" <td> 0</td>\n",
" <td> 0</td>\n",
" <td> 3</td>\n",
" <td> 2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td> 18.1</td>\n",
" <td> 6</td>\n",
" <td> 225.0</td>\n",
" <td> 105</td>\n",
" <td> 2.76</td>\n",
" <td> 3.460</td>\n",
" <td> 20.22</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" <td> 3</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td> 14.3</td>\n",
" <td> 8</td>\n",
" <td> 360.0</td>\n",
" <td> 245</td>\n",
" <td> 3.21</td>\n",
" <td> 3.570</td>\n",
" <td> 15.84</td>\n",
" <td> 0</td>\n",
" <td> 0</td>\n",
" <td> 3</td>\n",
" <td> 4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td> 24.4</td>\n",
" <td> 4</td>\n",
" <td> 146.7</td>\n",
" <td> 62</td>\n",
" <td> 3.69</td>\n",
" <td> 3.190</td>\n",
" <td> 20.00</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" <td> 4</td>\n",
" <td> 2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td> 22.8</td>\n",
" <td> 4</td>\n",
" <td> 140.8</td>\n",
" <td> 95</td>\n",
" <td> 3.92</td>\n",
" <td> 3.150</td>\n",
" <td> 22.90</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" <td> 4</td>\n",
" <td> 2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td> 19.2</td>\n",
" <td> 6</td>\n",
" <td> 167.6</td>\n",
" <td> 123</td>\n",
" <td> 3.92</td>\n",
" <td> 3.440</td>\n",
" <td> 18.30</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" <td> 4</td>\n",
" <td> 4</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 19,
"text": [
" mpg cyl disp hp drat wt qsec vs am gear carb\n",
"0 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4\n",
"1 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4\n",
"2 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1\n",
"3 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1\n",
"4 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2\n",
"5 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1\n",
"6 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4\n",
"7 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2\n",
"8 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2\n",
"9 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4"
]
}
],
"prompt_number": 19
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cars.cyl"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 20,
"text": [
"0 6\n",
"1 6\n",
"2 4\n",
"3 6\n",
"4 8\n",
"5 6\n",
"6 8\n",
"7 4\n",
"8 4\n",
"9 6\n",
"10 6\n",
"11 8\n",
"12 8\n",
"13 8\n",
"14 8\n",
"15 8\n",
"16 8\n",
"17 4\n",
"18 4\n",
"19 4\n",
"20 4\n",
"21 8\n",
"22 8\n",
"23 8\n",
"24 8\n",
"25 4\n",
"26 4\n",
"27 4\n",
"28 8\n",
"29 6\n",
"30 8\n",
"31 4\n",
"Name: cyl, dtype: int64"
]
}
],
"prompt_number": 20
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cars.ix[[5,7]]"
],
"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>mpg</th>\n",
" <th>cyl</th>\n",
" <th>disp</th>\n",
" <th>hp</th>\n",
" <th>drat</th>\n",
" <th>wt</th>\n",
" <th>qsec</th>\n",
" <th>vs</th>\n",
" <th>am</th>\n",
" <th>gear</th>\n",
" <th>carb</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>5</th>\n",
" <td> 18.1</td>\n",
" <td> 6</td>\n",
" <td> 225.0</td>\n",
" <td> 105</td>\n",
" <td> 2.76</td>\n",
" <td> 3.46</td>\n",
" <td> 20.22</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" <td> 3</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td> 24.4</td>\n",
" <td> 4</td>\n",
" <td> 146.7</td>\n",
" <td> 62</td>\n",
" <td> 3.69</td>\n",
" <td> 3.19</td>\n",
" <td> 20.00</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" <td> 4</td>\n",
" <td> 2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 21,
"text": [
" mpg cyl disp hp drat wt qsec vs am gear carb\n",
"5 18.1 6 225.0 105 2.76 3.46 20.22 1 0 3 1\n",
"7 24.4 4 146.7 62 3.69 3.19 20.00 1 0 4 2"
]
}
],
"prompt_number": 21
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cars['kmpg']=cars['mpg']*1.6\n",
"cars[:4]"
],
"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>mpg</th>\n",
" <th>cyl</th>\n",
" <th>disp</th>\n",
" <th>hp</th>\n",
" <th>drat</th>\n",
" <th>wt</th>\n",
" <th>qsec</th>\n",
" <th>vs</th>\n",
" <th>am</th>\n",
" <th>gear</th>\n",
" <th>carb</th>\n",
" <th>kmpg</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td> 21.0</td>\n",
" <td> 6</td>\n",
" <td> 160</td>\n",
" <td> 110</td>\n",
" <td> 3.90</td>\n",
" <td> 2.620</td>\n",
" <td> 16.46</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 4</td>\n",
" <td> 33.60</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td> 21.0</td>\n",
" <td> 6</td>\n",
" <td> 160</td>\n",
" <td> 110</td>\n",
" <td> 3.90</td>\n",
" <td> 2.875</td>\n",
" <td> 17.02</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 4</td>\n",
" <td> 33.60</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td> 22.8</td>\n",
" <td> 4</td>\n",
" <td> 108</td>\n",
" <td> 93</td>\n",
" <td> 3.85</td>\n",
" <td> 2.320</td>\n",
" <td> 18.61</td>\n",
" <td> 1</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 1</td>\n",
" <td> 36.48</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td> 21.4</td>\n",
" <td> 6</td>\n",
" <td> 258</td>\n",
" <td> 110</td>\n",
" <td> 3.08</td>\n",
" <td> 3.215</td>\n",
" <td> 19.44</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" <td> 3</td>\n",
" <td> 1</td>\n",
" <td> 34.24</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 22,
"text": [
" mpg cyl disp hp drat wt qsec vs am gear carb kmpg\n",
"0 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 33.60\n",
"1 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 33.60\n",
"2 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 36.48\n",
"3 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 34.24"
]
}
],
"prompt_number": 22
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"del cars['kmpg']\n",
"cars[:4]"
],
"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>mpg</th>\n",
" <th>cyl</th>\n",
" <th>disp</th>\n",
" <th>hp</th>\n",
" <th>drat</th>\n",
" <th>wt</th>\n",
" <th>qsec</th>\n",
" <th>vs</th>\n",
" <th>am</th>\n",
" <th>gear</th>\n",
" <th>carb</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td> 21.0</td>\n",
" <td> 6</td>\n",
" <td> 160</td>\n",
" <td> 110</td>\n",
" <td> 3.90</td>\n",
" <td> 2.620</td>\n",
" <td> 16.46</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td> 21.0</td>\n",
" <td> 6</td>\n",
" <td> 160</td>\n",
" <td> 110</td>\n",
" <td> 3.90</td>\n",
" <td> 2.875</td>\n",
" <td> 17.02</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td> 22.8</td>\n",
" <td> 4</td>\n",
" <td> 108</td>\n",
" <td> 93</td>\n",
" <td> 3.85</td>\n",
" <td> 2.320</td>\n",
" <td> 18.61</td>\n",
" <td> 1</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td> 21.4</td>\n",
" <td> 6</td>\n",
" <td> 258</td>\n",
" <td> 110</td>\n",
" <td> 3.08</td>\n",
" <td> 3.215</td>\n",
" <td> 19.44</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" <td> 3</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 23,
"text": [
" mpg cyl disp hp drat wt qsec vs am gear carb\n",
"0 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4\n",
"1 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4\n",
"2 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1\n",
"3 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1"
]
}
],
"prompt_number": 23
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cars.mpg[:10]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 24,
"text": [
"0 21.0\n",
"1 21.0\n",
"2 22.8\n",
"3 21.4\n",
"4 18.7\n",
"5 18.1\n",
"6 14.3\n",
"7 24.4\n",
"8 22.8\n",
"9 19.2\n",
"Name: mpg, dtype: float64"
]
}
],
"prompt_number": 24
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cars3=cars.stack()\n",
"cars3[:20]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 25,
"text": [
"0 mpg 21.000\n",
" cyl 6.000\n",
" disp 160.000\n",
" hp 110.000\n",
" drat 3.900\n",
" wt 2.620\n",
" qsec 16.460\n",
" vs 0.000\n",
" am 1.000\n",
" gear 4.000\n",
" carb 4.000\n",
"1 mpg 21.000\n",
" cyl 6.000\n",
" disp 160.000\n",
" hp 110.000\n",
" drat 3.900\n",
" wt 2.875\n",
" qsec 17.020\n",
" vs 0.000\n",
" am 1.000\n",
"dtype: float64"
]
}
],
"prompt_number": 25
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cars3.unstack()[:5]"
],
"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>mpg</th>\n",
" <th>cyl</th>\n",
" <th>disp</th>\n",
" <th>hp</th>\n",
" <th>drat</th>\n",
" <th>wt</th>\n",
" <th>qsec</th>\n",
" <th>vs</th>\n",
" <th>am</th>\n",
" <th>gear</th>\n",
" <th>carb</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td> 21.0</td>\n",
" <td> 6</td>\n",
" <td> 160</td>\n",
" <td> 110</td>\n",
" <td> 3.90</td>\n",
" <td> 2.620</td>\n",
" <td> 16.46</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td> 21.0</td>\n",
" <td> 6</td>\n",
" <td> 160</td>\n",
" <td> 110</td>\n",
" <td> 3.90</td>\n",
" <td> 2.875</td>\n",
" <td> 17.02</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td> 22.8</td>\n",
" <td> 4</td>\n",
" <td> 108</td>\n",
" <td> 93</td>\n",
" <td> 3.85</td>\n",
" <td> 2.320</td>\n",
" <td> 18.61</td>\n",
" <td> 1</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td> 21.4</td>\n",
" <td> 6</td>\n",
" <td> 258</td>\n",
" <td> 110</td>\n",
" <td> 3.08</td>\n",
" <td> 3.215</td>\n",
" <td> 19.44</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" <td> 3</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td> 18.7</td>\n",
" <td> 8</td>\n",
" <td> 360</td>\n",
" <td> 175</td>\n",
" <td> 3.15</td>\n",
" <td> 3.440</td>\n",
" <td> 17.02</td>\n",
" <td> 0</td>\n",
" <td> 0</td>\n",
" <td> 3</td>\n",
" <td> 2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 26,
"text": [
" mpg cyl disp hp drat wt qsec vs am gear carb\n",
"0 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4\n",
"1 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4\n",
"2 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1\n",
"3 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1\n",
"4 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2"
]
}
],
"prompt_number": 26
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"grouped=cars.groupby(['cyl','gear','carb'])\n",
"grouped['mpg'].mean()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 27,
"text": [
"cyl gear carb\n",
"4 3 1 21.50\n",
" 4 1 29.10\n",
" 2 24.75\n",
" 5 2 28.20\n",
"6 3 1 19.75\n",
" 4 4 19.75\n",
" 5 6 19.70\n",
"8 3 2 17.15\n",
" 3 16.30\n",
" 4 12.62\n",
" 5 4 15.80\n",
" 8 15.00\n",
"Name: mpg, dtype: float64"
]
}
],
"prompt_number": 27
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"stats = ['count','mean','median']\n",
"grouped.agg(stats)[['mpg','disp']]"
],
"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>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th colspan=\"3\" halign=\"left\">mpg</th>\n",
" <th colspan=\"3\" halign=\"left\">disp</th>\n",
" </tr>\n",
" <tr>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th>count</th>\n",
" <th>mean</th>\n",
" <th>median</th>\n",
" <th>count</th>\n",
" <th>mean</th>\n",
" <th>median</th>\n",
" </tr>\n",
" <tr>\n",
" <th>cyl</th>\n",
" <th>gear</th>\n",
" <th>carb</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"4\" valign=\"top\">4</th>\n",
" <th>3</th>\n",
" <th>1</th>\n",
" <td> 1</td>\n",
" <td> 21.50</td>\n",
" <td> 21.50</td>\n",
" <td> 1</td>\n",
" <td> 120.10</td>\n",
" <td> 120.10</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">4</th>\n",
" <th>1</th>\n",
" <td> 4</td>\n",
" <td> 29.10</td>\n",
" <td> 29.85</td>\n",
" <td> 4</td>\n",
" <td> 84.20</td>\n",
" <td> 78.85</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td> 4</td>\n",
" <td> 24.75</td>\n",
" <td> 23.60</td>\n",
" <td> 4</td>\n",
" <td> 121.05</td>\n",
" <td> 130.90</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <th>2</th>\n",
" <td> 2</td>\n",
" <td> 28.20</td>\n",
" <td> 28.20</td>\n",
" <td> 2</td>\n",
" <td> 107.70</td>\n",
" <td> 107.70</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">6</th>\n",
" <th>3</th>\n",
" <th>1</th>\n",
" <td> 2</td>\n",
" <td> 19.75</td>\n",
" <td> 19.75</td>\n",
" <td> 2</td>\n",
" <td> 241.50</td>\n",
" <td> 241.50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <th>4</th>\n",
" <td> 4</td>\n",
" <td> 19.75</td>\n",
" <td> 20.10</td>\n",
" <td> 4</td>\n",
" <td> 163.80</td>\n",
" <td> 163.80</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <th>6</th>\n",
" <td> 1</td>\n",
" <td> 19.70</td>\n",
" <td> 19.70</td>\n",
" <td> 1</td>\n",
" <td> 145.00</td>\n",
" <td> 145.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"5\" valign=\"top\">8</th>\n",
" <th rowspan=\"3\" valign=\"top\">3</th>\n",
" <th>2</th>\n",
" <td> 4</td>\n",
" <td> 17.15</td>\n",
" <td> 17.10</td>\n",
" <td> 4</td>\n",
" <td> 345.50</td>\n",
" <td> 339.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td> 3</td>\n",
" <td> 16.30</td>\n",
" <td> 16.40</td>\n",
" <td> 3</td>\n",
" <td> 275.80</td>\n",
" <td> 275.80</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td> 5</td>\n",
" <td> 12.62</td>\n",
" <td> 13.30</td>\n",
" <td> 5</td>\n",
" <td> 416.40</td>\n",
" <td> 440.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">5</th>\n",
" <th>4</th>\n",
" <td> 1</td>\n",
" <td> 15.80</td>\n",
" <td> 15.80</td>\n",
" <td> 1</td>\n",
" <td> 351.00</td>\n",
" <td> 351.00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td> 1</td>\n",
" <td> 15.00</td>\n",
" <td> 15.00</td>\n",
" <td> 1</td>\n",
" <td> 301.00</td>\n",
" <td> 301.00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 28,
"text": [
" mpg disp \n",
" count mean median count mean median\n",
"cyl gear carb \n",
"4 3 1 1 21.50 21.50 1 120.10 120.10\n",
" 4 1 4 29.10 29.85 4 84.20 78.85\n",
" 2 4 24.75 23.60 4 121.05 130.90\n",
" 5 2 2 28.20 28.20 2 107.70 107.70\n",
"6 3 1 2 19.75 19.75 2 241.50 241.50\n",
" 4 4 4 19.75 20.10 4 163.80 163.80\n",
" 5 6 1 19.70 19.70 1 145.00 145.00\n",
"8 3 2 4 17.15 17.10 4 345.50 339.00\n",
" 3 3 16.30 16.40 3 275.80 275.80\n",
" 4 5 12.62 13.30 5 416.40 440.00\n",
" 5 4 1 15.80 15.80 1 351.00 351.00\n",
" 8 1 15.00 15.00 1 301.00 301.00"
]
}
],
"prompt_number": 28
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"grouped.first()"
],
"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></th>\n",
" <th>mpg</th>\n",
" <th>disp</th>\n",
" <th>hp</th>\n",
" <th>drat</th>\n",
" <th>wt</th>\n",
" <th>qsec</th>\n",
" <th>vs</th>\n",
" <th>am</th>\n",
" </tr>\n",
" <tr>\n",
" <th>cyl</th>\n",
" <th>gear</th>\n",
" <th>carb</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"4\" valign=\"top\">4</th>\n",
" <th>3</th>\n",
" <th>1</th>\n",
" <td> 21.5</td>\n",
" <td> 120.1</td>\n",
" <td> 97</td>\n",
" <td> 3.70</td>\n",
" <td> 2.465</td>\n",
" <td> 20.01</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">4</th>\n",
" <th>1</th>\n",
" <td> 22.8</td>\n",
" <td> 108.0</td>\n",
" <td> 93</td>\n",
" <td> 3.85</td>\n",
" <td> 2.320</td>\n",
" <td> 18.61</td>\n",
" <td> 1</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td> 24.4</td>\n",
" <td> 146.7</td>\n",
" <td> 62</td>\n",
" <td> 3.69</td>\n",
" <td> 3.190</td>\n",
" <td> 20.00</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <th>2</th>\n",
" <td> 26.0</td>\n",
" <td> 120.3</td>\n",
" <td> 91</td>\n",
" <td> 4.43</td>\n",
" <td> 2.140</td>\n",
" <td> 16.70</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"3\" valign=\"top\">6</th>\n",
" <th>3</th>\n",
" <th>1</th>\n",
" <td> 21.4</td>\n",
" <td> 258.0</td>\n",
" <td> 110</td>\n",
" <td> 3.08</td>\n",
" <td> 3.215</td>\n",
" <td> 19.44</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <th>4</th>\n",
" <td> 21.0</td>\n",
" <td> 160.0</td>\n",
" <td> 110</td>\n",
" <td> 3.90</td>\n",
" <td> 2.620</td>\n",
" <td> 16.46</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <th>6</th>\n",
" <td> 19.7</td>\n",
" <td> 145.0</td>\n",
" <td> 175</td>\n",
" <td> 3.62</td>\n",
" <td> 2.770</td>\n",
" <td> 15.50</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"5\" valign=\"top\">8</th>\n",
" <th rowspan=\"3\" valign=\"top\">3</th>\n",
" <th>2</th>\n",
" <td> 18.7</td>\n",
" <td> 360.0</td>\n",
" <td> 175</td>\n",
" <td> 3.15</td>\n",
" <td> 3.440</td>\n",
" <td> 17.02</td>\n",
" <td> 0</td>\n",
" <td> 0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td> 16.4</td>\n",
" <td> 275.8</td>\n",
" <td> 180</td>\n",
" <td> 3.07</td>\n",
" <td> 4.070</td>\n",
" <td> 17.40</td>\n",
" <td> 0</td>\n",
" <td> 0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td> 14.3</td>\n",
" <td> 360.0</td>\n",
" <td> 245</td>\n",
" <td> 3.21</td>\n",
" <td> 3.570</td>\n",
" <td> 15.84</td>\n",
" <td> 0</td>\n",
" <td> 0</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">5</th>\n",
" <th>4</th>\n",
" <td> 15.8</td>\n",
" <td> 351.0</td>\n",
" <td> 264</td>\n",
" <td> 4.22</td>\n",
" <td> 3.170</td>\n",
" <td> 14.50</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td> 15.0</td>\n",
" <td> 301.0</td>\n",
" <td> 335</td>\n",
" <td> 3.54</td>\n",
" <td> 3.570</td>\n",
" <td> 14.60</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 29,
"text": [
" mpg disp hp drat wt qsec vs am\n",
"cyl gear carb \n",
"4 3 1 21.5 120.1 97 3.70 2.465 20.01 1 0\n",
" 4 1 22.8 108.0 93 3.85 2.320 18.61 1 1\n",
" 2 24.4 146.7 62 3.69 3.190 20.00 1 0\n",
" 5 2 26.0 120.3 91 4.43 2.140 16.70 0 1\n",
"6 3 1 21.4 258.0 110 3.08 3.215 19.44 1 0\n",
" 4 4 21.0 160.0 110 3.90 2.620 16.46 0 1\n",
" 5 6 19.7 145.0 175 3.62 2.770 15.50 0 1\n",
"8 3 2 18.7 360.0 175 3.15 3.440 17.02 0 0\n",
" 3 16.4 275.8 180 3.07 4.070 17.40 0 0\n",
" 4 14.3 360.0 245 3.21 3.570 15.84 0 0\n",
" 5 4 15.8 351.0 264 4.22 3.170 14.50 0 1\n",
" 8 15.0 301.0 335 3.54 3.570 14.60 0 1"
]
}
],
"prompt_number": 29
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cars[cars.cyl==4]"
],
"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>mpg</th>\n",
" <th>cyl</th>\n",
" <th>disp</th>\n",
" <th>hp</th>\n",
" <th>drat</th>\n",
" <th>wt</th>\n",
" <th>qsec</th>\n",
" <th>vs</th>\n",
" <th>am</th>\n",
" <th>gear</th>\n",
" <th>carb</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2 </th>\n",
" <td> 22.8</td>\n",
" <td> 4</td>\n",
" <td> 108.0</td>\n",
" <td> 93</td>\n",
" <td> 3.85</td>\n",
" <td> 2.320</td>\n",
" <td> 18.61</td>\n",
" <td> 1</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7 </th>\n",
" <td> 24.4</td>\n",
" <td> 4</td>\n",
" <td> 146.7</td>\n",
" <td> 62</td>\n",
" <td> 3.69</td>\n",
" <td> 3.190</td>\n",
" <td> 20.00</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" <td> 4</td>\n",
" <td> 2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8 </th>\n",
" <td> 22.8</td>\n",
" <td> 4</td>\n",
" <td> 140.8</td>\n",
" <td> 95</td>\n",
" <td> 3.92</td>\n",
" <td> 3.150</td>\n",
" <td> 22.90</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" <td> 4</td>\n",
" <td> 2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td> 32.4</td>\n",
" <td> 4</td>\n",
" <td> 78.7</td>\n",
" <td> 66</td>\n",
" <td> 4.08</td>\n",
" <td> 2.200</td>\n",
" <td> 19.47</td>\n",
" <td> 1</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td> 30.4</td>\n",
" <td> 4</td>\n",
" <td> 75.7</td>\n",
" <td> 52</td>\n",
" <td> 4.93</td>\n",
" <td> 1.615</td>\n",
" <td> 18.52</td>\n",
" <td> 1</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td> 33.9</td>\n",
" <td> 4</td>\n",
" <td> 71.1</td>\n",
" <td> 65</td>\n",
" <td> 4.22</td>\n",
" <td> 1.835</td>\n",
" <td> 19.90</td>\n",
" <td> 1</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td> 21.5</td>\n",
" <td> 4</td>\n",
" <td> 120.1</td>\n",
" <td> 97</td>\n",
" <td> 3.70</td>\n",
" <td> 2.465</td>\n",
" <td> 20.01</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" <td> 3</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td> 27.3</td>\n",
" <td> 4</td>\n",
" <td> 79.0</td>\n",
" <td> 66</td>\n",
" <td> 4.08</td>\n",
" <td> 1.935</td>\n",
" <td> 18.90</td>\n",
" <td> 1</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td> 26.0</td>\n",
" <td> 4</td>\n",
" <td> 120.3</td>\n",
" <td> 91</td>\n",
" <td> 4.43</td>\n",
" <td> 2.140</td>\n",
" <td> 16.70</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" <td> 5</td>\n",
" <td> 2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td> 30.4</td>\n",
" <td> 4</td>\n",
" <td> 95.1</td>\n",
" <td> 113</td>\n",
" <td> 3.77</td>\n",
" <td> 1.513</td>\n",
" <td> 16.90</td>\n",
" <td> 1</td>\n",
" <td> 1</td>\n",
" <td> 5</td>\n",
" <td> 2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31</th>\n",
" <td> 21.4</td>\n",
" <td> 4</td>\n",
" <td> 121.0</td>\n",
" <td> 109</td>\n",
" <td> 4.11</td>\n",
" <td> 2.780</td>\n",
" <td> 18.60</td>\n",
" <td> 1</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 30,
"text": [
" mpg cyl disp hp drat wt qsec vs am gear carb\n",
"2 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1\n",
"7 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2\n",
"8 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2\n",
"17 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1\n",
"18 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2\n",
"19 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1\n",
"20 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1\n",
"25 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1\n",
"26 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2\n",
"27 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2\n",
"31 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2"
]
}
],
"prompt_number": 30
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"tips = pd.read_csv('tips.csv')\n",
"tips[:5]"
],
"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>total_bill</th>\n",
" <th>tip</th>\n",
" <th>sex</th>\n",
" <th>smoker</th>\n",
" <th>day</th>\n",
" <th>time</th>\n",
" <th>size</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td> 16.99</td>\n",
" <td> 1.01</td>\n",
" <td> Female</td>\n",
" <td> No</td>\n",
" <td> Sun</td>\n",
" <td> Dinner</td>\n",
" <td> 2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td> 10.34</td>\n",
" <td> 1.66</td>\n",
" <td> Male</td>\n",
" <td> No</td>\n",
" <td> Sun</td>\n",
" <td> Dinner</td>\n",
" <td> 3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td> 21.01</td>\n",
" <td> 3.50</td>\n",
" <td> Male</td>\n",
" <td> No</td>\n",
" <td> Sun</td>\n",
" <td> Dinner</td>\n",
" <td> 3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td> 23.68</td>\n",
" <td> 3.31</td>\n",
" <td> Male</td>\n",
" <td> No</td>\n",
" <td> Sun</td>\n",
" <td> Dinner</td>\n",
" <td> 2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td> 24.59</td>\n",
" <td> 3.61</td>\n",
" <td> Female</td>\n",
" <td> No</td>\n",
" <td> Sun</td>\n",
" <td> Dinner</td>\n",
" <td> 4</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 31,
"text": [
" total_bill tip sex smoker day time size\n",
"0 16.99 1.01 Female No Sun Dinner 2\n",
"1 10.34 1.66 Male No Sun Dinner 3\n",
"2 21.01 3.50 Male No Sun Dinner 3\n",
"3 23.68 3.31 Male No Sun Dinner 2\n",
"4 24.59 3.61 Female No Sun Dinner 4"
]
}
],
"prompt_number": 31
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"tips['tip_pct'] = tips['tip']/tips['total_bill']*100"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 32
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"groupedtips = tips.groupby(['sex','smoker'])\n",
"groupedtips['tip_pct'].agg('mean')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 33,
"text": [
"sex smoker\n",
"Female No 15.692097\n",
" Yes 18.215035\n",
"Male No 16.066872\n",
" Yes 15.277118\n",
"Name: tip_pct, dtype: float64"
]
}
],
"prompt_number": 33
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"result=tips.groupby('smoker')['tip_pct'].describe()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 34
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"result.unstack('smoker')"
],
"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>smoker</th>\n",
" <th>No</th>\n",
" <th>Yes</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td> 151.000000</td>\n",
" <td> 93.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td> 15.932846</td>\n",
" <td> 16.319604</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td> 3.990977</td>\n",
" <td> 8.511920</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td> 5.679667</td>\n",
" <td> 3.563814</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td> 13.690561</td>\n",
" <td> 10.677083</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td> 15.562472</td>\n",
" <td> 15.384615</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td> 18.501403</td>\n",
" <td> 19.505852</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td> 29.198966</td>\n",
" <td> 71.034483</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 35,
"text": [
"smoker No Yes\n",
"count 151.000000 93.000000\n",
"mean 15.932846 16.319604\n",
"std 3.990977 8.511920\n",
"min 5.679667 3.563814\n",
"25% 13.690561 10.677083\n",
"50% 15.562472 15.384615\n",
"75% 18.501403 19.505852\n",
"max 29.198966 71.034483"
]
}
],
"prompt_number": 35
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"states = ['Ohio','New York','Vermont','Oregon','Washington','Nevada']\n",
"group_key=['East']*3 + ['West']*3\n",
"data = pd.Series(np.random.randn(6), index=states)\n",
"data[['Vermont','Washington']]=np.nan\n",
"data"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 36,
"text": [
"Ohio 0.479346\n",
"New York -0.037588\n",
"Vermont NaN\n",
"Oregon 0.943553\n",
"Washington NaN\n",
"Nevada -1.184667\n",
"dtype: float64"
]
}
],
"prompt_number": 36
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"data.groupby(group_key).mean()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 37,
"text": [
"East 0.220879\n",
"West -0.120557\n",
"dtype: float64"
]
}
],
"prompt_number": 37
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"fill_mean=lambda g: g.fillna(g.mean())\n",
"\n",
"data.groupby(group_key).apply(fill_mean)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 38,
"text": [
"Ohio 0.479346\n",
"New York -0.037588\n",
"Vermont 0.220879\n",
"Oregon 0.943553\n",
"Washington -0.120557\n",
"Nevada -1.184667\n",
"dtype: float64"
]
}
],
"prompt_number": 38
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"tips.pivot_table(rows=['sex','smoker'])"
],
"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>size</th>\n",
" <th>tip</th>\n",
" <th>tip_pct</th>\n",
" <th>total_bill</th>\n",
" </tr>\n",
" <tr>\n",
" <th>sex</th>\n",
" <th>smoker</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">Female</th>\n",
" <th>No</th>\n",
" <td> 2.592593</td>\n",
" <td> 2.773519</td>\n",
" <td> 15.692097</td>\n",
" <td> 18.105185</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Yes</th>\n",
" <td> 2.242424</td>\n",
" <td> 2.931515</td>\n",
" <td> 18.215035</td>\n",
" <td> 17.977879</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"2\" valign=\"top\">Male</th>\n",
" <th>No</th>\n",
" <td> 2.711340</td>\n",
" <td> 3.113402</td>\n",
" <td> 16.066872</td>\n",
" <td> 19.791237</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Yes</th>\n",
" <td> 2.500000</td>\n",
" <td> 3.051167</td>\n",
" <td> 15.277118</td>\n",
" <td> 22.284500</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 39,
"text": [
" size tip tip_pct total_bill\n",
"sex smoker \n",
"Female No 2.592593 2.773519 15.692097 18.105185\n",
" Yes 2.242424 2.931515 18.215035 17.977879\n",
"Male No 2.711340 3.113402 16.066872 19.791237\n",
" Yes 2.500000 3.051167 15.277118 22.284500"
]
}
],
"prompt_number": 39
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"tips.pivot_table(['tip_pct','size'],rows=['sex','day'], cols='smoker')"
],
"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>\n",
" <th></th>\n",
" <th></th>\n",
" <th colspan=\"2\" halign=\"left\">tip_pct</th>\n",
" <th colspan=\"2\" halign=\"left\">size</th>\n",
" </tr>\n",
" <tr>\n",
" <th></th>\n",
" <th>smoker</th>\n",
" <th>No</th>\n",
" <th>Yes</th>\n",
" <th>No</th>\n",
" <th>Yes</th>\n",
" </tr>\n",
" <tr>\n",
" <th>sex</th>\n",
" <th>day</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"4\" valign=\"top\">Female</th>\n",
" <th>Fri</th>\n",
" <td> 16.529591</td>\n",
" <td> 20.912912</td>\n",
" <td> 2.500000</td>\n",
" <td> 2.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Sat</th>\n",
" <td> 14.799347</td>\n",
" <td> 16.381673</td>\n",
" <td> 2.307692</td>\n",
" <td> 2.200000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Sun</th>\n",
" <td> 16.570992</td>\n",
" <td> 23.707473</td>\n",
" <td> 3.071429</td>\n",
" <td> 2.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Thur</th>\n",
" <td> 15.597147</td>\n",
" <td> 16.307257</td>\n",
" <td> 2.480000</td>\n",
" <td> 2.428571</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"4\" valign=\"top\">Male</th>\n",
" <th>Fri</th>\n",
" <td> 13.800498</td>\n",
" <td> 14.473025</td>\n",
" <td> 2.000000</td>\n",
" <td> 2.125000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Sat</th>\n",
" <td> 16.213217</td>\n",
" <td> 13.906681</td>\n",
" <td> 2.656250</td>\n",
" <td> 2.629630</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Sun</th>\n",
" <td> 15.829067</td>\n",
" <td> 17.396381</td>\n",
" <td> 2.883721</td>\n",
" <td> 2.600000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Thur</th>\n",
" <td> 16.570635</td>\n",
" <td> 16.441676</td>\n",
" <td> 2.500000</td>\n",
" <td> 2.300000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 40,
"text": [
" tip_pct size \n",
"smoker No Yes No Yes\n",
"sex day \n",
"Female Fri 16.529591 20.912912 2.500000 2.000000\n",
" Sat 14.799347 16.381673 2.307692 2.200000\n",
" Sun 16.570992 23.707473 3.071429 2.500000\n",
" Thur 15.597147 16.307257 2.480000 2.428571\n",
"Male Fri 13.800498 14.473025 2.000000 2.125000\n",
" Sat 16.213217 13.906681 2.656250 2.629630\n",
" Sun 15.829067 17.396381 2.883721 2.600000\n",
" Thur 16.570635 16.441676 2.500000 2.300000"
]
}
],
"prompt_number": 40
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Statistical modeling"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### statsmodels\n",
"\n",
"Methods provided include\n",
"\n",
"+ Linear regression\n",
"+ Generalized linear models\n",
"+ ANOVA\n",
"+ Nonparametric methods\n",
"+ Few others"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import statsmodels as sm\n",
"import statsmodels.formula.api as smf\n",
"cars[:5]"
],
"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>mpg</th>\n",
" <th>cyl</th>\n",
" <th>disp</th>\n",
" <th>hp</th>\n",
" <th>drat</th>\n",
" <th>wt</th>\n",
" <th>qsec</th>\n",
" <th>vs</th>\n",
" <th>am</th>\n",
" <th>gear</th>\n",
" <th>carb</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td> 21.0</td>\n",
" <td> 6</td>\n",
" <td> 160</td>\n",
" <td> 110</td>\n",
" <td> 3.90</td>\n",
" <td> 2.620</td>\n",
" <td> 16.46</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td> 21.0</td>\n",
" <td> 6</td>\n",
" <td> 160</td>\n",
" <td> 110</td>\n",
" <td> 3.90</td>\n",
" <td> 2.875</td>\n",
" <td> 17.02</td>\n",
" <td> 0</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td> 22.8</td>\n",
" <td> 4</td>\n",
" <td> 108</td>\n",
" <td> 93</td>\n",
" <td> 3.85</td>\n",
" <td> 2.320</td>\n",
" <td> 18.61</td>\n",
" <td> 1</td>\n",
" <td> 1</td>\n",
" <td> 4</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td> 21.4</td>\n",
" <td> 6</td>\n",
" <td> 258</td>\n",
" <td> 110</td>\n",
" <td> 3.08</td>\n",
" <td> 3.215</td>\n",
" <td> 19.44</td>\n",
" <td> 1</td>\n",
" <td> 0</td>\n",
" <td> 3</td>\n",
" <td> 1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td> 18.7</td>\n",
" <td> 8</td>\n",
" <td> 360</td>\n",
" <td> 175</td>\n",
" <td> 3.15</td>\n",
" <td> 3.440</td>\n",
" <td> 17.02</td>\n",
" <td> 0</td>\n",
" <td> 0</td>\n",
" <td> 3</td>\n",
" <td> 2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 41,
"text": [
" mpg cyl disp hp drat wt qsec vs am gear carb\n",
"0 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4\n",
"1 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4\n",
"2 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1\n",
"3 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1\n",
"4 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2"
]
}
],
"prompt_number": 41
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"mod1 = smf.ols('mpg~disp+hp+C(cyl)-1', data=cars) # change to category\n",
"mod1.fit().summary()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<table class=\"simpletable\">\n",
"<caption>OLS Regression Results</caption>\n",
"<tr>\n",
" <th>Dep. Variable:</th> <td>mpg</td> <th> R-squared: </th> <td> 0.984</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Model:</th> <td>OLS</td> <th> Adj. R-squared: </th> <td> 0.981</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Method:</th> <td>Least Squares</td> <th> F-statistic: </th> <td> 331.4</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Date:</th> <td>Wed, 06 Nov 2013</td> <th> Prob (F-statistic):</th> <td>2.44e-23</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Time:</th> <td>00:57:11</td> <th> Log-Likelihood: </th> <td> -76.620</td>\n",
"</tr>\n",
"<tr>\n",
" <th>No. Observations:</th> <td> 32</td> <th> AIC: </th> <td> 163.2</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Df Residuals:</th> <td> 27</td> <th> BIC: </th> <td> 170.6</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Df Model:</th> <td> 5</td> <th> </th> <td> </td> \n",
"</tr>\n",
"</table>\n",
"<table class=\"simpletable\">\n",
"<tr>\n",
" <td></td> <th>coef</th> <th>std err</th> <th>t</th> <th>P>|t|</th> <th>[95.0% Conf. Int.]</th> \n",
"</tr>\n",
"<tr>\n",
" <th>C(cyl)[4]</th> <td> 31.1477</td> <td> 1.767</td> <td> 17.626</td> <td> 0.000</td> <td> 27.522 34.774</td>\n",
"</tr>\n",
"<tr>\n",
" <th>C(cyl)[6]</th> <td> 27.1005</td> <td> 2.703</td> <td> 10.025</td> <td> 0.000</td> <td> 21.554 32.647</td>\n",
"</tr>\n",
"<tr>\n",
" <th>C(cyl)[8]</th> <td> 28.7158</td> <td> 4.600</td> <td> 6.243</td> <td> 0.000</td> <td> 19.278 38.154</td>\n",
"</tr>\n",
"<tr>\n",
" <th>disp</th> <td> -0.0260</td> <td> 0.010</td> <td> -2.499</td> <td> 0.019</td> <td> -0.047 -0.005</td>\n",
"</tr>\n",
"<tr>\n",
" <th>hp</th> <td> -0.0211</td> <td> 0.014</td> <td> -1.490</td> <td> 0.148</td> <td> -0.050 0.008</td>\n",
"</tr>\n",
"</table>\n",
"<table class=\"simpletable\">\n",
"<tr>\n",
" <th>Omnibus:</th> <td> 1.696</td> <th> Durbin-Watson: </th> <td> 1.653</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Prob(Omnibus):</th> <td> 0.428</td> <th> Jarque-Bera (JB): </th> <td> 1.579</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Skew:</th> <td> 0.469</td> <th> Prob(JB): </th> <td> 0.454</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Kurtosis:</th> <td> 2.449</td> <th> Cond. No. </th> <td>3.25e+03</td>\n",
"</tr>\n",
"</table>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 42,
"text": [
"<class 'statsmodels.iolib.summary.Summary'>\n",
"\"\"\"\n",
" OLS Regression Results \n",
"==============================================================================\n",
"Dep. Variable: mpg R-squared: 0.984\n",
"Model: OLS Adj. R-squared: 0.981\n",
"Method: Least Squares F-statistic: 331.4\n",
"Date: Wed, 06 Nov 2013 Prob (F-statistic): 2.44e-23\n",
"Time: 00:57:11 Log-Likelihood: -76.620\n",
"No. Observations: 32 AIC: 163.2\n",
"Df Residuals: 27 BIC: 170.6\n",
"Df Model: 5 \n",
"==============================================================================\n",
" coef std err t P>|t| [95.0% Conf. Int.]\n",
"------------------------------------------------------------------------------\n",
"C(cyl)[4] 31.1477 1.767 17.626 0.000 27.522 34.774\n",
"C(cyl)[6] 27.1005 2.703 10.025 0.000 21.554 32.647\n",
"C(cyl)[8] 28.7158 4.600 6.243 0.000 19.278 38.154\n",
"disp -0.0260 0.010 -2.499 0.019 -0.047 -0.005\n",
"hp -0.0211 0.014 -1.490 0.148 -0.050 0.008\n",
"==============================================================================\n",
"Omnibus: 1.696 Durbin-Watson: 1.653\n",
"Prob(Omnibus): 0.428 Jarque-Bera (JB): 1.579\n",
"Skew: 0.469 Prob(JB): 0.454\n",
"Kurtosis: 2.449 Cond. No. 3.25e+03\n",
"==============================================================================\n",
"\n",
"Warnings:\n",
"[1] The condition number is large, 3.25e+03. This might indicate that there are\n",
"strong multicollinearity or other numerical problems.\n",
"\"\"\""
]
}
],
"prompt_number": 42
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Machine learning\n",
"\n",
"### Scikits-learn\n",
"\n",
"Methods include:\n",
"\n",
"+ Cluster analysis\n",
"+ Dimension reduction\n",
"+ Generalized linear models\n",
"+ Support Vector Machines\n",
"+ Nearest neighbors\n",
"+ Decision Trees\n",
"+ Ensemble methods\n",
"+ Discriminant analysis\n",
"+ Cross-validation\n",
"+ Transformations"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import sklearn as learn\n",
"from sklearn.ensemble import RandomForestRegressor\n",
"X = cars.values[:,1:]\n",
"y = cars.values[:,0]\n",
"\n",
"rf = RandomForestRegressor(n_estimators=100)\n",
"rf = rf.fit(X, y)\n",
"ypred=rf.predict(X)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 43
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import matplotlib as mpl\n",
"import matplotlib.pyplot as plt\n",
"plt.plot(y,ypred,'.')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 44,
"text": [
"[<matplotlib.lines.Line2D at 0x108769950>]"
]
},
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x10829bc50>"
]
}
],
"prompt_number": 44
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import seaborn as sns\n",
"sns.set(palette=\"Purples_r\")\n",
"mpl.rc(\"figure\", figsize=(5, 5))\n",
"\n",
"d = pd.DataFrame({'y':y,'ypred':ypred})"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 45
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sns.lmplot('y','ypred',d)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\n",
"text": [
"<matplotlib.figure.Figure at 0x108776810>"
]
}
],
"prompt_number": 46
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sns.lmplot(\"total_bill\",\"tip\",tips, col=\"sex\",color=\"time\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x108e81590>"
]
}
],
"prompt_number": 47
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from IPython.core.display import HTML\n",
"def css_styling():\n",
" styles = open(\"styles/custom.css\", \"r\").read()\n",
" return HTML(styles)\n",
"css_styling()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<style>\n",
" div.cell{\n",
" margin-left:auto;\n",
" margin-right:auto;\n",
" }\n",
" h1 {\n",
" font-family: Helvetica, serif;\n",
" font-size: 150%;\n",
" }\n",
" h2 {\n",
" font-size: 150%;\n",
" }\n",
" h4{\n",
" margin-top:12px;\n",
" margin-bottom: 3px;\n",
" }\n",
" div.text_cell_render{\n",
" font-family: \"Helvetica Neue\", Arial, Helvetica, Geneva, sans-serif;\n",
" line-height: 145%;\n",
" font-size: 150%;\n",
" margin-left:auto;\n",
" margin-right:auto;\n",
" }\n",
" ul, li {\n",
" padding: 10px;\n",
" }\n",
" .CodeMirror{\n",
" font-family: \"Source Code Pro\", source-code-pro,Consolas, monospace;\n",
" font-size: 150%;\n",
" }\n",
" div.output{\n",
" font-size:150%;\n",
" }\n",
" .prompt{\n",
" display: None;\n",
" }\n",
" .text_cell_render h5 {\n",
" font-weight: 300;\n",
" font-size: 22pt;\n",
" color: #4057A1;\n",
" font-style: italic;\n",
" margin-bottom: .5em;\n",
" margin-top: 0.5em;\n",
" display: block;\n",
" }\n",
" \n",
" .warning{\n",
" color: rgb( 240, 20, 20 )\n",
" } \n",
"</style>\n",
"\n"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 48,
"text": [
"<IPython.core.display.HTML at 0x1098cc2d0>"
]
}
],
"prompt_number": 48
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 48
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment