Skip to content

Instantly share code, notes, and snippets.

@clarkfitzg
Last active May 21, 2016 15:58
Show Gist options
  • Save clarkfitzg/a3e9ea18e426797ceeb10963be9cd7b5 to your computer and use it in GitHub Desktop.
Save clarkfitzg/a3e9ea18e426797ceeb10963be9cd7b5 to your computer and use it in GitHub Desktop.
iidata
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Python for R Users\n",
"\n",
"## Clark Fitzgerald \n",
"\n",
"`@clarkfitzg`\n",
"\n",
"## UC Davis iidata\n",
"\n",
"May 21, 2016\n",
"\n",
"To follow along: http://bit.ly/1XoUzbZ"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# The Standard Library\n",
"\n",
"Python's philosophy is 'batteries included'\n",
"\n",
"This functionality is available with all distributions of Python."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The Zen of Python, by Tim Peters\n",
"\n",
"Beautiful is better than ugly.\n",
"Explicit is better than implicit.\n",
"Simple is better than complex.\n",
"Complex is better than complicated.\n",
"Flat is better than nested.\n",
"Sparse is better than dense.\n",
"Readability counts.\n",
"Special cases aren't special enough to break the rules.\n",
"Although practicality beats purity.\n",
"Errors should never pass silently.\n",
"Unless explicitly silenced.\n",
"In the face of ambiguity, refuse the temptation to guess.\n",
"There should be one-- and preferably only one --obvious way to do it.\n",
"Although that way may not be obvious at first unless you're Dutch.\n",
"Now is better than never.\n",
"Although never is often better than *right* now.\n",
"If the implementation is hard to explain, it's a bad idea.\n",
"If the implementation is easy to explain, it may be a good idea.\n",
"Namespaces are one honking great idea -- let's do more of those!\n"
]
}
],
"source": [
"# Come for the language, stay for the community\n",
"import this"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Project Euler\n",
"\n",
"Algorithm / math problems that you can help you learn to program\n",
"\n",
"### Largest palindrome product\n",
"### Problem 4\n",
"\n",
"A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.\n",
"\n",
"Find the largest palindrome made from the product of two 3-digit numbers."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Trying:\n",
" palindrome(9009)\n",
"Expecting:\n",
" True\n",
"ok\n",
"Trying:\n",
" palindrome(123)\n",
"Expecting:\n",
" False\n",
"ok\n",
"1 items had no tests:\n",
" __main__\n",
"1 items passed all tests:\n",
" 2 tests in __main__.palindrome\n",
"2 tests in 2 items.\n",
"2 passed and 0 failed.\n",
"Test passed.\n"
]
},
{
"data": {
"text/plain": [
"TestResults(failed=0, attempted=2)"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def palindrome(number):\n",
" \"\"\" Check if a number is a palindrome\n",
" \n",
" >>> palindrome(9009)\n",
" True\n",
" >>> palindrome(123)\n",
" False\n",
" \n",
" \"\"\"\n",
" # Convert it to a string\n",
" numstr = str(number)\n",
" # Check if it's the same forwards and backwards\n",
" return numstr == numstr[::-1]\n",
"\n",
"\n",
"import doctest\n",
"doctest.testmod(verbose=True)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"palindrome(9009)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"False"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"palindrome(123)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"906609"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Now let's actually solve that problem\n",
"current = 0\n",
"for i in range(999):\n",
" for j in range(999):\n",
" prod = i * j\n",
" if palindrome(prod):\n",
" current = max(current, prod)\n",
" \n",
"current"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"906609"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# But there's a more elegant way :)\n",
"import itertools\n",
"\n",
"pairs = itertools.product(range(999), range(999))\n",
"products = (a * b for a, b in pairs)\n",
"max(p for p in products if palindrome(p))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Slicing\n",
"\n",
"numerical indexing to slice an iterable"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'abcdef'"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"letters = 'abcdef'\n",
"letters"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'abc'"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"letters[:3]"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'ace'"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"letters[::2]"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"['a', 'b', 'c', 'd', 'e', 'f']"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Python generally avoids copies! This is different than R\n",
"a = list(letters)\n",
"a"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"['A', 'b', 'c', 'd', 'e', 'f']"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Python also has 0 based indexing- R is 1 based\n",
"\n",
"b = a\n",
"b[0] = 'A'\n",
"b"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"['A', 'b', 'c', 'd', 'e', 'f']"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"a"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'fedcba'"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Reverse a string\n",
"letters[::-1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Data Analysis\n",
"\n",
"Here is where we need more than the standard library"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# A few preliminaries\n",
"\n",
"# Import the data analysis libraries we'll use\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"\n",
"# Lets us plot\n",
"%matplotlib inline\n",
"plt.style.use('ggplot')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pandas\n",
"\n",
"Brings R's `DataFrame` to Python\n",
"\n",
"Today we'll download a dataset from STS98, data studies. (Thanks Nick!)\n",
"\n",
"http://anson.ucdavis.edu/~nulle/cl_apartments.zip"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"apt = pd.read_csv('cl_apartments.csv')"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(18084, 22)"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"apt.shape"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>title</th>\n",
" <th>text</th>\n",
" <th>date_posted</th>\n",
" <th>date_updated</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>$995 / 3br - 1350ft2 - Lancaster Apartment Uni...</td>\n",
" <td>Beautiful Remodeled 3 Bed, 2 Bath House in Wes...</td>\n",
" <td>2016-04-13 15:34:06</td>\n",
" <td>2016-05-01 15:46:36</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>$1935 / 2br - 1154ft2 - No place like The Colo...</td>\n",
" <td>View Our Captivating Pools, Spa &amp; Picnic Area\\...</td>\n",
" <td>2016-04-16 17:55:45</td>\n",
" <td>2016-05-01 19:40:19</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>$1825 / 2br - 1056ft2 - No place like The Colo...</td>\n",
" <td>*******Centrally located near Saugus, The Ante...</td>\n",
" <td>2016-04-16 17:58:01</td>\n",
" <td>2016-05-01 19:39:54</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>$650 / 1br - FURNISHED 1 BED GUEST QUARTERS, D...</td>\n",
" <td>FURNISHED 1 BEDROOM &amp; DEN W/ KITCHENETTE GUEST...</td>\n",
" <td>2016-04-17 21:26:15</td>\n",
" <td>2016-05-01 12:49:13</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>$1599 / 2br - 951ft2 - Big Savings!</td>\n",
" <td>Accepting applications now.</td>\n",
" <td>2016-04-28 11:58:28</td>\n",
" <td>2016-05-01 10:44:00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" title \\\n",
"0 $995 / 3br - 1350ft2 - Lancaster Apartment Uni... \n",
"1 $1935 / 2br - 1154ft2 - No place like The Colo... \n",
"2 $1825 / 2br - 1056ft2 - No place like The Colo... \n",
"3 $650 / 1br - FURNISHED 1 BED GUEST QUARTERS, D... \n",
"4 $1599 / 2br - 951ft2 - Big Savings! \n",
"\n",
" text date_posted \\\n",
"0 Beautiful Remodeled 3 Bed, 2 Bath House in Wes... 2016-04-13 15:34:06 \n",
"1 View Our Captivating Pools, Spa & Picnic Area\\... 2016-04-16 17:55:45 \n",
"2 *******Centrally located near Saugus, The Ante... 2016-04-16 17:58:01 \n",
"3 FURNISHED 1 BEDROOM & DEN W/ KITCHENETTE GUEST... 2016-04-17 21:26:15 \n",
"4 Accepting applications now. 2016-04-28 11:58:28 \n",
"\n",
" date_updated \n",
"0 2016-05-01 15:46:36 \n",
"1 2016-05-01 19:40:19 \n",
"2 2016-05-01 19:39:54 \n",
"3 2016-05-01 12:49:13 \n",
"4 2016-05-01 10:44:00 "
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"apt.iloc[:5, :4]"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"title object\n",
"text object\n",
"date_posted object\n",
"date_updated object\n",
"deleted bool\n",
"craigslist object\n",
"latitude float64\n",
"longitude float64\n",
"city object\n",
"price float64\n",
"date object\n",
"sqft float64\n",
"bedrooms float64\n",
"bathrooms float64\n",
"pets object\n",
"laundry object\n",
"parking object\n",
"shp_place object\n",
"shp_city object\n",
"shp_urban object\n",
"shp_county object\n",
"shp_state object\n",
"dtype: object"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"apt.dtypes"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Plotting\n",
"import seaborn as sns"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<seaborn.axisgrid.FacetGrid at 0x11b0b17b8>"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nOmLoEhHp6P8D3RaxX95jfpsAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11b0b17f0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sns.lmplot(x='sqft', y='price', data=apt.iloc[200:300, ])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Statistical Modeling"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import statsmodels.formula.api as smf"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"smf.ols?"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<table class=\"simpletable\">\n",
"<caption>OLS Regression Results</caption>\n",
"<tr>\n",
" <th>Dep. Variable:</th> <td>price</td> <th> R-squared: </th> <td> 0.001</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Model:</th> <td>OLS</td> <th> Adj. R-squared: </th> <td> 0.001</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Method:</th> <td>Least Squares</td> <th> F-statistic: </th> <td> 18.05</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Date:</th> <td>Sat, 21 May 2016</td> <th> Prob (F-statistic):</th> <td>2.16e-05</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Time:</th> <td>08:43:56</td> <th> Log-Likelihood: </th> <td>-1.1169e+05</td>\n",
"</tr>\n",
"<tr>\n",
" <th>No. Observations:</th> <td> 13159</td> <th> AIC: </th> <td>2.234e+05</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Df Residuals:</th> <td> 13157</td> <th> BIC: </th> <td>2.234e+05</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Df Model:</th> <td> 1</td> <th> </th> <td> </td> \n",
"</tr>\n",
"<tr>\n",
" <th>Covariance Type:</th> <td>nonrobust</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>Intercept</th> <td> 2330.1164</td> <td> 10.514</td> <td> 221.625</td> <td> 0.000</td> <td> 2309.508 2350.725</td>\n",
"</tr>\n",
"<tr>\n",
" <th>sqft</th> <td> 0.0108</td> <td> 0.003</td> <td> 4.249</td> <td> 0.000</td> <td> 0.006 0.016</td>\n",
"</tr>\n",
"</table>\n",
"<table class=\"simpletable\">\n",
"<tr>\n",
" <th>Omnibus:</th> <td>9908.362</td> <th> Durbin-Watson: </th> <td> 1.077</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Prob(Omnibus):</th> <td> 0.000</td> <th> Jarque-Bera (JB): </th> <td>536353.862</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Skew:</th> <td> 3.111</td> <th> Prob(JB): </th> <td> 0.00</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Kurtosis:</th> <td>33.651</td> <th> Cond. No. </th> <td>4.26e+03</td> \n",
"</tr>\n",
"</table>"
],
"text/plain": [
"<class 'statsmodels.iolib.summary.Summary'>\n",
"\"\"\"\n",
" OLS Regression Results \n",
"==============================================================================\n",
"Dep. Variable: price R-squared: 0.001\n",
"Model: OLS Adj. R-squared: 0.001\n",
"Method: Least Squares F-statistic: 18.05\n",
"Date: Sat, 21 May 2016 Prob (F-statistic): 2.16e-05\n",
"Time: 08:43:56 Log-Likelihood: -1.1169e+05\n",
"No. Observations: 13159 AIC: 2.234e+05\n",
"Df Residuals: 13157 BIC: 2.234e+05\n",
"Df Model: 1 \n",
"Covariance Type: nonrobust \n",
"==============================================================================\n",
" coef std err t P>|t| [95.0% Conf. Int.]\n",
"------------------------------------------------------------------------------\n",
"Intercept 2330.1164 10.514 221.625 0.000 2309.508 2350.725\n",
"sqft 0.0108 0.003 4.249 0.000 0.006 0.016\n",
"==============================================================================\n",
"Omnibus: 9908.362 Durbin-Watson: 1.077\n",
"Prob(Omnibus): 0.000 Jarque-Bera (JB): 536353.862\n",
"Skew: 3.111 Prob(JB): 0.00\n",
"Kurtosis: 33.651 Cond. No. 4.26e+03\n",
"==============================================================================\n",
"\n",
"Warnings:\n",
"[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n",
"[2] The condition number is large, 4.26e+03. This might indicate that there are\n",
"strong multicollinearity or other numerical problems.\n",
"\"\"\""
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"model = smf.ols('price ~ sqft', data=apt).fit()\n",
"model.summary()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Do highly-populated areas tend to have smaller apartments? If you're unfamiliar with California's cities, it may help to consult this page: https://en.wikipedia.org/wiki/List_of_cities_and_towns_in_California"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On average, what are the most expensive cities?"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>price</th>\n",
" </tr>\n",
" <tr>\n",
" <th>shp_city</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Piedmont</th>\n",
" <td>7300.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>San Marino</th>\n",
" <td>6900.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Belvedere</th>\n",
" <td>6500.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Beverly Hills</th>\n",
" <td>4325.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Los Altos</th>\n",
" <td>3617.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Woodside</th>\n",
" <td>3600.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Manhattan Beach</th>\n",
" <td>3500.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Culver City</th>\n",
" <td>3493.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Tiburon</th>\n",
" <td>3479.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>San Francisco</th>\n",
" <td>3400.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>El Segundo</th>\n",
" <td>3200.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Foster City</th>\n",
" <td>3168.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Millbrae</th>\n",
" <td>3122.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Larkspur</th>\n",
" <td>3100.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Santa Monica</th>\n",
" <td>3097.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" price\n",
"shp_city \n",
"Piedmont 7300.0\n",
"San Marino 6900.0\n",
"Belvedere 6500.0\n",
"Beverly Hills 4325.0\n",
"Los Altos 3617.5\n",
"Woodside 3600.0\n",
"Manhattan Beach 3500.0\n",
"Culver City 3493.5\n",
"Tiburon 3479.0\n",
"San Francisco 3400.0\n",
"El Segundo 3200.0\n",
"Foster City 3168.0\n",
"Millbrae 3122.0\n",
"Larkspur 3100.0\n",
"Santa Monica 3097.0"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Method chaining code can be easier to read.\n",
"# Similar to pipes\n",
"\n",
"(apt.loc[:, ['shp_city', 'price']]\n",
" .groupby('shp_city')\n",
" .median()\n",
" .sort_values('price', ascending=False)\n",
" .head(15)\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"{nan,\n",
" 'Calabasas',\n",
" 'San Marino',\n",
" 'Citrus Heights',\n",
" 'Folsom',\n",
" 'Santee',\n",
" 'Calistoga',\n",
" 'West Covina',\n",
" 'Culver City',\n",
" 'Claremont',\n",
" 'El Monte',\n",
" 'Fairfax',\n",
" 'Del Mar',\n",
" 'Coronado',\n",
" 'Solana Beach',\n",
" 'Escondido',\n",
" 'Lake Elsinore',\n",
" 'Alameda',\n",
" 'Lafayette',\n",
" 'Burbank',\n",
" 'Cerritos',\n",
" 'Lancaster',\n",
" 'Union City',\n",
" 'Benicia',\n",
" 'Ross',\n",
" 'Brea',\n",
" 'El Cajon',\n",
" 'Concord',\n",
" 'Santa Monica',\n",
" 'Vacaville',\n",
" 'Manhattan Beach',\n",
" 'Pomona',\n",
" 'Palmdale',\n",
" 'Fullerton',\n",
" 'Piedmont',\n",
" 'Isleton',\n",
" 'Arcadia',\n",
" 'Torrance',\n",
" 'Berkeley',\n",
" 'Los Altos Hills',\n",
" 'Newark',\n",
" 'Anaheim',\n",
" 'Windsor',\n",
" 'Pleasant Hill',\n",
" 'Sierra Madre',\n",
" 'Davis',\n",
" 'Pleasanton',\n",
" 'Covina',\n",
" 'Norwalk',\n",
" 'Healdsburg',\n",
" 'San Diego',\n",
" 'Santa Rosa',\n",
" 'Sonoma',\n",
" 'Antioch',\n",
" 'Atherton',\n",
" 'Sebastopol',\n",
" 'Hesperia',\n",
" 'Yreka',\n",
" 'Palm Desert',\n",
" 'Dublin',\n",
" 'San Bruno',\n",
" 'Morgan Hill',\n",
" 'Long Beach',\n",
" 'Milpitas',\n",
" 'Santa Clara',\n",
" 'Woodland',\n",
" 'Lemon Grove',\n",
" 'Martinez',\n",
" 'Redwood City',\n",
" 'Sunnyvale',\n",
" 'Daly City',\n",
" 'Ukiah',\n",
" 'Emeryville',\n",
" 'Brisbane',\n",
" 'Lincoln',\n",
" 'Pinole',\n",
" 'Oakley',\n",
" 'Santa Clarita',\n",
" 'Chula Vista',\n",
" 'Pittsburg',\n",
" 'Walnut Creek',\n",
" 'Oceanside',\n",
" 'Monterey Park',\n",
" 'Lakewood',\n",
" 'Imperial Beach',\n",
" 'Elk Grove',\n",
" 'Beverly Hills',\n",
" 'San Mateo',\n",
" 'Irvine',\n",
" 'Rohnert Park',\n",
" 'Stockton',\n",
" 'Cupertino',\n",
" 'Hollister',\n",
" 'Menlo Park',\n",
" 'San Carlos',\n",
" 'San Jose',\n",
" 'Agoura Hills',\n",
" 'Fremont',\n",
" 'Carson',\n",
" 'Vista',\n",
" 'Garden Grove',\n",
" 'Poway',\n",
" 'Vallejo',\n",
" 'Half Moon Bay',\n",
" 'American Canyon',\n",
" 'Baldwin Park',\n",
" 'Petaluma',\n",
" 'Grass Valley',\n",
" 'Cotati',\n",
" 'San Anselmo',\n",
" 'Woodside',\n",
" 'Auburn',\n",
" 'Hayward',\n",
" 'Hermosa Beach',\n",
" 'West Sacramento',\n",
" 'Los Gatos',\n",
" 'Los Altos',\n",
" 'South Pasadena',\n",
" 'Hercules',\n",
" 'Azusa',\n",
" 'San Rafael',\n",
" 'Palo Alto',\n",
" 'Yuba City',\n",
" 'San Ramon',\n",
" 'Danville',\n",
" 'Tiburon',\n",
" 'Los Angeles',\n",
" 'Pasadena',\n",
" 'Moraga',\n",
" 'Manteca',\n",
" 'Bellflower',\n",
" 'Rancho Cucamonga',\n",
" 'Rocklin',\n",
" 'Glendora',\n",
" 'Clearlake',\n",
" 'San Leandro',\n",
" 'West Hollywood',\n",
" 'Cloverdale',\n",
" 'South San Francisco',\n",
" 'San Clemente',\n",
" 'Mountain View',\n",
" 'La Verne',\n",
" 'Pacifica',\n",
" 'Temecula',\n",
" 'Bell Gardens',\n",
" 'Marysville',\n",
" 'Tracy',\n",
" 'National City',\n",
" 'Mill Valley',\n",
" 'Monrovia',\n",
" 'Seal Beach',\n",
" 'Corte Madera',\n",
" 'Burlingame',\n",
" 'Downey',\n",
" 'Campbell',\n",
" 'Roseville',\n",
" 'Placerville',\n",
" 'Montebello',\n",
" 'Glendale',\n",
" 'San Pablo',\n",
" 'Carlsbad',\n",
" 'Millbrae',\n",
" 'Riverside',\n",
" 'Orinda',\n",
" 'St. Helena',\n",
" 'Encinitas',\n",
" 'Fairfield',\n",
" 'Rancho Cordova',\n",
" 'Alhambra',\n",
" 'Whittier',\n",
" 'Saratoga',\n",
" 'Gardena',\n",
" 'Inglewood',\n",
" 'Suisun City',\n",
" 'San Francisco',\n",
" 'Santa Ana',\n",
" 'Upland',\n",
" 'Murrieta',\n",
" 'El Cerrito',\n",
" 'Belmont',\n",
" 'San Dimas',\n",
" 'Novato',\n",
" 'San Marcos',\n",
" 'Livermore',\n",
" 'Foster City',\n",
" 'Colma',\n",
" 'Larkspur',\n",
" 'Belvedere',\n",
" 'Richmond',\n",
" 'Redondo Beach',\n",
" 'Lomita',\n",
" 'Gilroy',\n",
" 'Sausalito',\n",
" 'Sacramento',\n",
" 'La Mesa',\n",
" 'El Segundo',\n",
" 'Industry',\n",
" 'Hawthorne',\n",
" 'Dixon',\n",
" 'Albany',\n",
" 'Truckee',\n",
" 'Yountville',\n",
" 'East Palo Alto',\n",
" 'Napa',\n",
" 'Oakland',\n",
" 'Hillsborough'}"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"set(apt.shp_city)"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Let's scrape the web!\n",
"cali = pd.read_html('https://en.wikipedia.org/wiki/List_of_cities_and_towns_in_California')"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"list"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Always know what your data types are\n",
"type(cali)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"7"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(cali)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"[(1, 2), (485, 7), (1, 2), (8, 11), (7, 2), (14, 19), (13, 2)]"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[x.shape for x in cali]"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" <th>3</th>\n",
" <th>4</th>\n",
" <th>5</th>\n",
" <th>6</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Name</td>\n",
" <td>Type</td>\n",
" <td>County</td>\n",
" <td>Population (2010)[1][7][8]</td>\n",
" <td>Land area[1]</td>\n",
" <td>Incorporated[6]</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>sq mi</td>\n",
" <td>km2</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Adelanto</td>\n",
" <td>City</td>\n",
" <td>San Bernardino</td>\n",
" <td>31765</td>\n",
" <td>56.01</td>\n",
" <td>145.1</td>\n",
" <td>000000001970-12-22-0000December 22, 1970</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Agoura Hills</td>\n",
" <td>City</td>\n",
" <td>Los Angeles</td>\n",
" <td>20330</td>\n",
" <td>7.79</td>\n",
" <td>20.2</td>\n",
" <td>000000001982-12-08-0000December 8, 1982</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Alameda</td>\n",
" <td>City</td>\n",
" <td>Alameda</td>\n",
" <td>73812</td>\n",
" <td>10.61</td>\n",
" <td>27.5</td>\n",
" <td>000000001854-04-19-0000April 19, 1854</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0 1 2 3 \\\n",
"0 Name Type County Population (2010)[1][7][8] \n",
"1 sq mi km2 NaN NaN \n",
"2 Adelanto City San Bernardino 31765 \n",
"3 Agoura Hills City Los Angeles 20330 \n",
"4 Alameda City Alameda 73812 \n",
"\n",
" 4 5 6 \n",
"0 Land area[1] Incorporated[6] NaN \n",
"1 NaN NaN NaN \n",
"2 56.01 145.1 000000001970-12-22-0000December 22, 1970 \n",
"3 7.79 20.2 000000001982-12-08-0000December 8, 1982 \n",
"4 10.61 27.5 000000001854-04-19-0000April 19, 1854 "
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cities = cali[1]\n",
"cities.head()"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>shp_city</th>\n",
" <th>population</th>\n",
" <th>land</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Adelanto</td>\n",
" <td>31765</td>\n",
" <td>56.01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Agoura Hills</td>\n",
" <td>20330</td>\n",
" <td>7.79</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Alameda</td>\n",
" <td>73812</td>\n",
" <td>10.61</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Albany</td>\n",
" <td>18539</td>\n",
" <td>1.79</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Alhambra</td>\n",
" <td>83089</td>\n",
" <td>7.63</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" shp_city population land\n",
"2 Adelanto 31765 56.01\n",
"3 Agoura Hills 20330 7.79\n",
"4 Alameda 73812 10.61\n",
"5 Albany 18539 1.79\n",
"6 Alhambra 83089 7.63"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c2 = cities.iloc[2:, [0, 3, 4]]\n",
"c2.columns = ['shp_city', 'population', 'land']\n",
"\n",
"c2.head()"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'123400'"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Footnotes and commas in HTML! Dang!\n",
"import re\n",
"x = '123,400[8]'\n",
"pattern = re.compile(r',|\\[[0-9]*\\]')\n",
"re.sub(pattern, '', x, count=5)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`lambda` just means make a function in one line."
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"c2[['population', 'land']] = (c2[['population', 'land']]\n",
" .applymap(lambda x: re.sub(pattern, '', x))\n",
" .astype('float64')\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"c2['density'] = c2['population'] / c2['land']"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"shp_city object\n",
"population float64\n",
"land float64\n",
"density float64\n",
"dtype: object"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"c2.dtypes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we're ready to join it into the main table"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(15245, 25)"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"apt2 = pd.merge(apt, c2)\n",
"apt2.shape"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Better check how well this worked\n",
"sum(apt2.population.isnull())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Recall the question: Do highly-populated areas tend to have smaller apartments?"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.0037722587722730811"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"apt2.sqft.corr(apt2.population)"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.027354362941064529"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"apt2.sqft.corr(apt2.density)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Common sense check- what are the most densely populated cities in California?"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>shp_city</th>\n",
" <th>population</th>\n",
" <th>land</th>\n",
" <th>density</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>373</th>\n",
" <td>San Francisco</td>\n",
" <td>805235.0</td>\n",
" <td>46.87</td>\n",
" <td>17180.179219</td>\n",
" </tr>\n",
" <tr>\n",
" <th>105</th>\n",
" <td>Daly City</td>\n",
" <td>101123.0</td>\n",
" <td>7.66</td>\n",
" <td>13201.436031</td>\n",
" </tr>\n",
" <tr>\n",
" <th>193</th>\n",
" <td>Inglewood</td>\n",
" <td>109673.0</td>\n",
" <td>9.07</td>\n",
" <td>12091.841235</td>\n",
" </tr>\n",
" <tr>\n",
" <th>390</th>\n",
" <td>Santa Ana</td>\n",
" <td>324528.0</td>\n",
" <td>27.27</td>\n",
" <td>11900.550055</td>\n",
" </tr>\n",
" <tr>\n",
" <th>127</th>\n",
" <td>El Monte</td>\n",
" <td>113475.0</td>\n",
" <td>9.56</td>\n",
" <td>11869.769874</td>\n",
" </tr>\n",
" <tr>\n",
" <th>290</th>\n",
" <td>Norwalk</td>\n",
" <td>105549.0</td>\n",
" <td>9.71</td>\n",
" <td>10870.133883</td>\n",
" </tr>\n",
" <tr>\n",
" <th>39</th>\n",
" <td>Berkeley</td>\n",
" <td>112580.0</td>\n",
" <td>10.47</td>\n",
" <td>10752.626552</td>\n",
" </tr>\n",
" <tr>\n",
" <th>155</th>\n",
" <td>Garden Grove</td>\n",
" <td>170883.0</td>\n",
" <td>17.94</td>\n",
" <td>9525.250836</td>\n",
" </tr>\n",
" <tr>\n",
" <th>237</th>\n",
" <td>Long Beach</td>\n",
" <td>462257.0</td>\n",
" <td>50.29</td>\n",
" <td>9191.827401</td>\n",
" </tr>\n",
" <tr>\n",
" <th>118</th>\n",
" <td>Downey</td>\n",
" <td>111772.0</td>\n",
" <td>12.41</td>\n",
" <td>9006.607575</td>\n",
" </tr>\n",
" <tr>\n",
" <th>242</th>\n",
" <td>Los Angeles</td>\n",
" <td>3792621.0</td>\n",
" <td>468.67</td>\n",
" <td>8092.305887</td>\n",
" </tr>\n",
" <tr>\n",
" <th>303</th>\n",
" <td>Oxnard</td>\n",
" <td>197899.0</td>\n",
" <td>26.89</td>\n",
" <td>7359.576051</td>\n",
" </tr>\n",
" <tr>\n",
" <th>436</th>\n",
" <td>Torrance</td>\n",
" <td>145538.0</td>\n",
" <td>20.48</td>\n",
" <td>7106.347656</td>\n",
" </tr>\n",
" <tr>\n",
" <th>185</th>\n",
" <td>Huntington Beach</td>\n",
" <td>189992.0</td>\n",
" <td>26.75</td>\n",
" <td>7102.504673</td>\n",
" </tr>\n",
" <tr>\n",
" <th>97</th>\n",
" <td>Costa Mesa</td>\n",
" <td>109960.0</td>\n",
" <td>15.65</td>\n",
" <td>7026.198083</td>\n",
" </tr>\n",
" <tr>\n",
" <th>293</th>\n",
" <td>Oakland</td>\n",
" <td>390724.0</td>\n",
" <td>55.79</td>\n",
" <td>7003.477326</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Anaheim</td>\n",
" <td>336265.0</td>\n",
" <td>49.84</td>\n",
" <td>6746.890048</td>\n",
" </tr>\n",
" <tr>\n",
" <th>462</th>\n",
" <td>West Covina</td>\n",
" <td>106098.0</td>\n",
" <td>16.04</td>\n",
" <td>6614.588529</td>\n",
" </tr>\n",
" <tr>\n",
" <th>330</th>\n",
" <td>Pomona</td>\n",
" <td>149058.0</td>\n",
" <td>22.95</td>\n",
" <td>6494.901961</td>\n",
" </tr>\n",
" <tr>\n",
" <th>364</th>\n",
" <td>Salinas</td>\n",
" <td>150441.0</td>\n",
" <td>23.18</td>\n",
" <td>6490.120794</td>\n",
" </tr>\n",
" <tr>\n",
" <th>426</th>\n",
" <td>Sunnyvale</td>\n",
" <td>140081.0</td>\n",
" <td>21.99</td>\n",
" <td>6370.213734</td>\n",
" </tr>\n",
" <tr>\n",
" <th>392</th>\n",
" <td>Santa Clara</td>\n",
" <td>116468.0</td>\n",
" <td>18.41</td>\n",
" <td>6326.344378</td>\n",
" </tr>\n",
" <tr>\n",
" <th>158</th>\n",
" <td>Glendale</td>\n",
" <td>191719.0</td>\n",
" <td>30.45</td>\n",
" <td>6296.190476</td>\n",
" </tr>\n",
" <tr>\n",
" <th>153</th>\n",
" <td>Fullerton</td>\n",
" <td>135161.0</td>\n",
" <td>22.35</td>\n",
" <td>6047.472036</td>\n",
" </tr>\n",
" <tr>\n",
" <th>314</th>\n",
" <td>Pasadena</td>\n",
" <td>137122.0</td>\n",
" <td>22.97</td>\n",
" <td>5969.612538</td>\n",
" </tr>\n",
" <tr>\n",
" <th>53</th>\n",
" <td>Burbank</td>\n",
" <td>103340.0</td>\n",
" <td>17.34</td>\n",
" <td>5959.630911</td>\n",
" </tr>\n",
" <tr>\n",
" <th>266</th>\n",
" <td>Modesto</td>\n",
" <td>201165.0</td>\n",
" <td>36.87</td>\n",
" <td>5456.061839</td>\n",
" </tr>\n",
" <tr>\n",
" <th>298</th>\n",
" <td>Orange</td>\n",
" <td>134616.0</td>\n",
" <td>24.80</td>\n",
" <td>5428.064516</td>\n",
" </tr>\n",
" <tr>\n",
" <th>377</th>\n",
" <td>San Jose</td>\n",
" <td>945942.0</td>\n",
" <td>176.53</td>\n",
" <td>5358.533960</td>\n",
" </tr>\n",
" <tr>\n",
" <th>450</th>\n",
" <td>Ventura</td>\n",
" <td>106433.0</td>\n",
" <td>21.65</td>\n",
" <td>4916.073903</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>399</th>\n",
" <td>Santa Rosa</td>\n",
" <td>167815.0</td>\n",
" <td>41.29</td>\n",
" <td>4064.301284</td>\n",
" </tr>\n",
" <tr>\n",
" <th>295</th>\n",
" <td>Oceanside</td>\n",
" <td>167086.0</td>\n",
" <td>41.23</td>\n",
" <td>4052.534562</td>\n",
" </tr>\n",
" <tr>\n",
" <th>370</th>\n",
" <td>San Diego</td>\n",
" <td>1301617.0</td>\n",
" <td>325.19</td>\n",
" <td>4002.635382</td>\n",
" </tr>\n",
" <tr>\n",
" <th>91</th>\n",
" <td>Concord</td>\n",
" <td>122067.0</td>\n",
" <td>30.55</td>\n",
" <td>3995.646481</td>\n",
" </tr>\n",
" <tr>\n",
" <th>94</th>\n",
" <td>Corona</td>\n",
" <td>152374.0</td>\n",
" <td>38.83</td>\n",
" <td>3924.130827</td>\n",
" </tr>\n",
" <tr>\n",
" <th>133</th>\n",
" <td>Escondido</td>\n",
" <td>143911.0</td>\n",
" <td>36.81</td>\n",
" <td>3909.562619</td>\n",
" </tr>\n",
" <tr>\n",
" <th>449</th>\n",
" <td>Vallejo</td>\n",
" <td>115942.0</td>\n",
" <td>30.67</td>\n",
" <td>3780.306488</td>\n",
" </tr>\n",
" <tr>\n",
" <th>276</th>\n",
" <td>Moreno Valley</td>\n",
" <td>193365.0</td>\n",
" <td>51.27</td>\n",
" <td>3771.503803</td>\n",
" </tr>\n",
" <tr>\n",
" <th>354</th>\n",
" <td>Riverside</td>\n",
" <td>303871.0</td>\n",
" <td>81.14</td>\n",
" <td>3745.020951</td>\n",
" </tr>\n",
" <tr>\n",
" <th>129</th>\n",
" <td>Elk Grove</td>\n",
" <td>153015.0</td>\n",
" <td>42.19</td>\n",
" <td>3626.807300</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Antioch</td>\n",
" <td>102372.0</td>\n",
" <td>28.35</td>\n",
" <td>3611.005291</td>\n",
" </tr>\n",
" <tr>\n",
" <th>366</th>\n",
" <td>San Bernardino</td>\n",
" <td>209924.0</td>\n",
" <td>59.20</td>\n",
" <td>3546.013514</td>\n",
" </tr>\n",
" <tr>\n",
" <th>348</th>\n",
" <td>Richmond</td>\n",
" <td>103701.0</td>\n",
" <td>30.07</td>\n",
" <td>3448.653143</td>\n",
" </tr>\n",
" <tr>\n",
" <th>454</th>\n",
" <td>Visalia</td>\n",
" <td>124442.0</td>\n",
" <td>36.25</td>\n",
" <td>3432.882759</td>\n",
" </tr>\n",
" <tr>\n",
" <th>393</th>\n",
" <td>Santa Clarita</td>\n",
" <td>176320.0</td>\n",
" <td>52.72</td>\n",
" <td>3344.461305</td>\n",
" </tr>\n",
" <tr>\n",
" <th>432</th>\n",
" <td>Temecula</td>\n",
" <td>100097.0</td>\n",
" <td>30.15</td>\n",
" <td>3319.966833</td>\n",
" </tr>\n",
" <tr>\n",
" <th>297</th>\n",
" <td>Ontario</td>\n",
" <td>163924.0</td>\n",
" <td>49.94</td>\n",
" <td>3282.418903</td>\n",
" </tr>\n",
" <tr>\n",
" <th>360</th>\n",
" <td>Roseville</td>\n",
" <td>118788.0</td>\n",
" <td>36.22</td>\n",
" <td>3279.624517</td>\n",
" </tr>\n",
" <tr>\n",
" <th>196</th>\n",
" <td>Irvine</td>\n",
" <td>212375.0</td>\n",
" <td>66.11</td>\n",
" <td>3212.448949</td>\n",
" </tr>\n",
" <tr>\n",
" <th>173</th>\n",
" <td>Hayward</td>\n",
" <td>144186.0</td>\n",
" <td>45.32</td>\n",
" <td>3181.509267</td>\n",
" </tr>\n",
" <tr>\n",
" <th>281</th>\n",
" <td>Murrieta</td>\n",
" <td>103466.0</td>\n",
" <td>33.58</td>\n",
" <td>3081.179273</td>\n",
" </tr>\n",
" <tr>\n",
" <th>412</th>\n",
" <td>Simi Valley</td>\n",
" <td>124237.0</td>\n",
" <td>41.48</td>\n",
" <td>2995.106075</td>\n",
" </tr>\n",
" <tr>\n",
" <th>138</th>\n",
" <td>Fairfield</td>\n",
" <td>105321.0</td>\n",
" <td>37.39</td>\n",
" <td>2816.822680</td>\n",
" </tr>\n",
" <tr>\n",
" <th>65</th>\n",
" <td>Carlsbad</td>\n",
" <td>105328.0</td>\n",
" <td>37.72</td>\n",
" <td>2792.364793</td>\n",
" </tr>\n",
" <tr>\n",
" <th>151</th>\n",
" <td>Fremont</td>\n",
" <td>214089.0</td>\n",
" <td>77.46</td>\n",
" <td>2763.865221</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>Bakersfield</td>\n",
" <td>347483.0</td>\n",
" <td>142.16</td>\n",
" <td>2444.309229</td>\n",
" </tr>\n",
" <tr>\n",
" <th>434</th>\n",
" <td>Thousand Oaks</td>\n",
" <td>126683.0</td>\n",
" <td>55.03</td>\n",
" <td>2302.071597</td>\n",
" </tr>\n",
" <tr>\n",
" <th>222</th>\n",
" <td>Lancaster</td>\n",
" <td>156633.0</td>\n",
" <td>94.28</td>\n",
" <td>1661.359779</td>\n",
" </tr>\n",
" <tr>\n",
" <th>452</th>\n",
" <td>Victorville</td>\n",
" <td>115903.0</td>\n",
" <td>73.18</td>\n",
" <td>1583.807051</td>\n",
" </tr>\n",
" <tr>\n",
" <th>308</th>\n",
" <td>Palmdale</td>\n",
" <td>152750.0</td>\n",
" <td>105.96</td>\n",
" <td>1441.581729</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>66 rows × 4 columns</p>\n",
"</div>"
],
"text/plain": [
" shp_city population land density\n",
"373 San Francisco 805235.0 46.87 17180.179219\n",
"105 Daly City 101123.0 7.66 13201.436031\n",
"193 Inglewood 109673.0 9.07 12091.841235\n",
"390 Santa Ana 324528.0 27.27 11900.550055\n",
"127 El Monte 113475.0 9.56 11869.769874\n",
"290 Norwalk 105549.0 9.71 10870.133883\n",
"39 Berkeley 112580.0 10.47 10752.626552\n",
"155 Garden Grove 170883.0 17.94 9525.250836\n",
"237 Long Beach 462257.0 50.29 9191.827401\n",
"118 Downey 111772.0 12.41 9006.607575\n",
"242 Los Angeles 3792621.0 468.67 8092.305887\n",
"303 Oxnard 197899.0 26.89 7359.576051\n",
"436 Torrance 145538.0 20.48 7106.347656\n",
"185 Huntington Beach 189992.0 26.75 7102.504673\n",
"97 Costa Mesa 109960.0 15.65 7026.198083\n",
"293 Oakland 390724.0 55.79 7003.477326\n",
"11 Anaheim 336265.0 49.84 6746.890048\n",
"462 West Covina 106098.0 16.04 6614.588529\n",
"330 Pomona 149058.0 22.95 6494.901961\n",
"364 Salinas 150441.0 23.18 6490.120794\n",
"426 Sunnyvale 140081.0 21.99 6370.213734\n",
"392 Santa Clara 116468.0 18.41 6326.344378\n",
"158 Glendale 191719.0 30.45 6296.190476\n",
"153 Fullerton 135161.0 22.35 6047.472036\n",
"314 Pasadena 137122.0 22.97 5969.612538\n",
"53 Burbank 103340.0 17.34 5959.630911\n",
"266 Modesto 201165.0 36.87 5456.061839\n",
"298 Orange 134616.0 24.80 5428.064516\n",
"377 San Jose 945942.0 176.53 5358.533960\n",
"450 Ventura 106433.0 21.65 4916.073903\n",
".. ... ... ... ...\n",
"399 Santa Rosa 167815.0 41.29 4064.301284\n",
"295 Oceanside 167086.0 41.23 4052.534562\n",
"370 San Diego 1301617.0 325.19 4002.635382\n",
"91 Concord 122067.0 30.55 3995.646481\n",
"94 Corona 152374.0 38.83 3924.130827\n",
"133 Escondido 143911.0 36.81 3909.562619\n",
"449 Vallejo 115942.0 30.67 3780.306488\n",
"276 Moreno Valley 193365.0 51.27 3771.503803\n",
"354 Riverside 303871.0 81.14 3745.020951\n",
"129 Elk Grove 153015.0 42.19 3626.807300\n",
"14 Antioch 102372.0 28.35 3611.005291\n",
"366 San Bernardino 209924.0 59.20 3546.013514\n",
"348 Richmond 103701.0 30.07 3448.653143\n",
"454 Visalia 124442.0 36.25 3432.882759\n",
"393 Santa Clarita 176320.0 52.72 3344.461305\n",
"432 Temecula 100097.0 30.15 3319.966833\n",
"297 Ontario 163924.0 49.94 3282.418903\n",
"360 Roseville 118788.0 36.22 3279.624517\n",
"196 Irvine 212375.0 66.11 3212.448949\n",
"173 Hayward 144186.0 45.32 3181.509267\n",
"281 Murrieta 103466.0 33.58 3081.179273\n",
"412 Simi Valley 124237.0 41.48 2995.106075\n",
"138 Fairfield 105321.0 37.39 2816.822680\n",
"65 Carlsbad 105328.0 37.72 2792.364793\n",
"151 Fremont 214089.0 77.46 2763.865221\n",
"28 Bakersfield 347483.0 142.16 2444.309229\n",
"434 Thousand Oaks 126683.0 55.03 2302.071597\n",
"222 Lancaster 156633.0 94.28 1661.359779\n",
"452 Victorville 115903.0 73.18 1583.807051\n",
"308 Palmdale 152750.0 105.96 1441.581729\n",
"\n",
"[66 rows x 4 columns]"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dense = c2.loc[c2.population > 1e5, :].sort_values('density', ascending=False)\n",
"dense"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x11b3caf28>"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nHqHSjhY/+MEPMAwDgPj4eKZPn86sWbMICwsjMTGRuXPnAlBWVkZpaSl9+vRh+vTpjB07lqamJmbO\nnEl9fT2GYbBkyRIGDBjwte7h6aqsrOSXv/wlJSUl7N27N6ht/6qfv9Op4b333mPatGn+vxdZWVlc\ne+21IV3D8ePHefjhhzlw4ABer5fp06czfPjwXncvOqrj3HPP7VX3w+fzUVBQwIcffkhYWBjz58/H\n5XL1unvRUR1er7dX3YsW9fX1ZGZm8uyzzxIeHh7698LsRfbs2WNOnz79S+cnTpxo7tu3zzRN07zr\nrrvM9957z6yurjZ/+MMfmqZpmh999JGZmZlpmqZpLliwwFy3bp1pmqb5zDPPmM8995zp9XrN8ePH\nm42NjWZzc7OZmZlp1tfXm3/+85/NWbNmmaZpmjt37jTvueeeIFT5ZaHSDtM0zaamJvPmm29uc276\n9Onm9u3bTdM0zUceecT8y1/+YtbV1ZnXX3+96fV6zcbGRvP66683m5ubzWeffdZ8+umnTdM0zT/+\n8Y/mwoULTdP8evfwdPzmN78xr7/+evO2227rkba3//l79tlnT7uGsrKyL71PqNewdu1a87HHHjNN\n0zQ//fRTc+zYsb3yXrSu49///rc5duxY84UXXuhV9+Mvf/mL+fDDD5umaZpvv/22ec899/TKe9FR\nHb3x74bX6zXvvfde83vf+55ZW1vbK+5Frxra+Mc//sHBgwe5/fbbmTZtGv/6179wu914vV7i4+MB\nGDNmDJs3b6aiooL09HQAzj33XHw+H0eOHOHvf/+7f5+OjIwM3nrrLXbv3s3QoUMxDIM+ffqQlpbG\ntm3bQmZPj1BpB0BNTQ1Hjx7lzjvv5Ec/+hGVlZW8++67pKWlASe/p1u2bKGqqorU1FScTieGYZCQ\nkEBNTQ0VFRVkZGT4r926devXuocNDQ2n1f6hQ4eybNky/3F1dXXQ2t7Rz9/WrVu7pYYNGzYwdepU\nCgoK8Hg8IV/Dtddey09/+lMATpw4QXh4eFB/jgJRh8/nw+l0Ul1dzV//+tdecz/GjRvHggULAPjo\no48466yzeuW9aF3HgQMHOOuss3rdvQB4/PHHycrKIi4uDtM0e8W9CNkg8fvf/54bbrihzX9xcXFM\nmzaN3/3ud9x9993MmDEDj8fj72YHiIqKorGxEY/H02Y/jqioKNxud5vzX3VtZGRkh+d7ak+PUNpb\npF+/ftx5553893//N/PmzWPGjBmYrZYi6ej7DCe/py3nW+5X6+9/V+5hy3ucjvHjxxMeHu4/Dlbb\nO/v5O90aRo0axc9+9jNWrlzJkCFDKCoq+tLPTKjVEBER4W/TT3/6Ux588MFeeS/a1/HAAw+QnJxM\nfn5+r7ofYWFhzJo1i4ULF3L99df3ynvRuo5FixZxww03MGrUqF51L1588UUGDRpEenq6/x60/rc+\nVO9FyM6RuOWWW7jlllvanDt27Jj/H9DU1FTq6ur8xbfweDycddZZ9OnTp81+HG63m5iYGP/1AwcO\n9H/DDMPo8D2s7OkRCKHSDoCEhASGDh3q/3P//v159913/a97PB5iYmI6/J62nG+ppeX739V72P4H\nvzu0/j4Gsu2d/fydrnHjxvnfZ9y4cSxcuJArrrgi5Gv4+OOPyc3NZerUqVx33XX84he/6LC9va2O\nxsbGXnk/lixZQn19PbfccgtNTU0dtjXUa2hdx6233sqaNWuIi4sDese9ePHFF3E4HGzevJn333+f\n/Pz8Nr2woXovQrZHoiNFRUX89re/BU52sZ977rkYhoHL5WLfvn2YpsmmTZtITU0lJSWFTZs2YZom\nH330EaZp0r9/fy677DI2btwIwMaNG0lLS+PCCy9kz549fPbZZzQ3N/O3v/2NSy+9lJSUlJDY0yOU\n9hZZu3YtS5YsAeDgwYO43W7S09PZtm0bcPJ7mpqaSlJSEhUVFTQ3N9PY2EhtbS2JiYltvqfl5eWk\npaV97XvYnS655BK2b98etLZ39PN3uu68807eeecdAN566y1GjhwZ8jUcPnyYO++8k5kzZ3LzzTcD\ncPHFF/e6e9FRHb3tfrz00kssX74cgL59+xIWFsa3vvWtoP6d7o570b4Oh8PBfffdR1VVVa+5FytX\nrqSkpISSkhIuuuginnjiCa6++uqQ/3vRq5bI/uyzz5g5cyZHjx7F6XTyyCOPcMEFF1BZWcljjz2G\nz+cjPT2dBx54ADgZPDZu3IhpmsyePZvLLruM+vp68vPzOXr0KAMGDKCwsJB+/fqxYcMGioqKME2T\nW265haysrJDZ0yNU2gHg9XqZPXs2H330EWFhYcycOZP+/ftTUFCA1+tl2LBhLFy4EIfDwQsvvEBp\naSmmaXLPPfcwbtw4jh07Rn5+PnV1dbhcLgoLCxk0aBBVVVUsWrSoS/fwdB04cICHHnqINWvW8K9/\n/Yuf//znQWv7V/38nU4N7777LgsWLKBPnz7Exsby6KOPEhUVFdI1LFq0iD/96U9ceOGFmKaJw+Fg\nzpw5LFy4sFfdi47qePDBB3niiSd6zf34/PPPmT17NocPH+b48eNMmzaNCy+8MKh/p7vjXrSv4+67\n7+bcc8/l0Ucf7TX3orXbb7+d+fPn43A4Qv7fqF4VJERERCS09KqhDREREQktChIiIiJimYKEiIiI\nWKYgISIiIpYpSIiIiIhlChIiIiJimYKEiARMTk6OfzGdr3L77bf7/9yyqJOI9B4KEiLSo1pWUARY\nt25dD7ZERKwI2b02RCTwtm3bxtNPP43T6eTjjz9m1KhRLFiwgFdeeYXnnnsOh8PByJEjeeSRR4iI\niOCqq65i7NixVFdXYxgGv/zlLznvvPO45pprWLlyJeedd57/PUtKSvyfc+LECebNm8euXbuor6/n\nggsu4Omnn/bvr3HbbbdRWlrKRRddRE1NDceOHaOgoID333+fsLAw7rjjDm666SbWrVvHm2++yaef\nfsq+fftIT09n7ty5PfXtExHUIyFyxnvnnXeYN28er732Gk1NTSxfvpzly5ezatUqXn75ZSIiIigq\nKgKgoaGB0aNH8/LLL/P973+fhQsXdvieDoejzfGOHTtwuVysWbOGP//5z3z++eds3LiRgoICAEpL\nS9t83VNPPcWAAQP8gaaoqIh//vOfwMn9ZoqKinj55Zf561//yq5duwLyfRGRrlGQEDnDpaWl+Xd0\nvfHGG/mv//ovrrnmGmJiYgCYNGkSb731FnByM6SJEycCcNNNN7F169Yuf0ZWVharVq1i0aJF7N27\nt83Og+29/fbb/t1/BwwYwLhx4/xDICkpKURERNCvXz+GDBnCp59+aq1wEekWChIiZzin84sRTp/P\nh2matN+C58SJE0Dbbdd9Pp//ax0Oh/9rjh8//qXPeOONN5gxYwZRUVFkZmaeckfB9p/v8/n87+ty\nuTq9VkSCS0FC5AxXUVHBoUOH8Pl8vPTSS8yePZs33niDzz77DICysjJGjx4NnNxhccOGDQC8+OKL\nZGRkADBw4EA++OADAF5//fUvfcaWLVv4/ve/z0033cTAgQPZvn27P5w4nU58Ph/wRSi48sor+f3v\nfw/AkSNHeP3117nyyisD9B0QkdOhyZYiZ7jY2Fjy8/M5ePAg6enpTJ06lYiICKZMmcKJEycYOXIk\n8+fP91//2muv8eSTTzJ48GAef/xxAHJzc1m4cCFFRUWMGTPGf23LnIdJkybx0EMP8dprr+Fyubj0\n0kvZv38/ANdccw0TJ05k7dq1/uvvvfde5s+fzw033ODfJvniiy+mpqamTdvbz8UQkeDTNuIiZ7Bt\n27ZRVFTE7373uy5d3/JUhYhICw1tiEiXqQdARNpTj4SIiIhYph4JERERsUxBQkRERCxTkBARERHL\nFCRERETEMgUJERERsez/A5/nCqsluxrtAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x11b36fa58>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"dense.plot(x='population', y='density', kind='scatter')"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x120918828>"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nKCiQJJWVlam8vFx2u12LFy9WWlpab3xkAADCUsB7JPbt26cPP/xQb7zxhjZt2qSGhgatXr1ahYWF\n2rx5s7xer3bt2qUzZ85o06ZN2rp1q1555RWtXbtWHo9HW7Zs0ahRo/TLX/5S06dP18aNGyVJy5cv\n17p16/T666/r4MGDqq2t1eHDh3XgwAFt375d69at0zPPPBPojwsAQFgLeJCorKzUqFGj9JOf/ESP\nP/64pkyZosOHDyszM1OSlJ2drT179ujgwYPKyMiQ3W6X0+lUYmKiamtrVVVVpezsbN+1e/fulcvl\nksfjUUJCgiRp0qRJ2r17t6qqqpSVlSVJGj58uLxer5qamgL9kQEACFsBH9poamrSiRMn9PLLL6uu\nrk6PP/64vF6v7/Xo6Gi5XC653W7FxMT4zg8cONB33ul0+q5tbm7udK79fF1dnfr376/Y2Nir3iMu\nLi4AnxQAgPAX8CARGxurpKQk2e12jRw5Uv369dOpU6d8r7vdbg0aNEhOp1Mul6vL826323cuJibG\nFz46Xjt48GBFRUX5ru14vT/i4/27DuZRx9ajjq1HHQcG9Ry8Ah4kMjIytGnTJj388MM6deqULl68\nqAkTJmjfvn266667VFFRoQkTJmjs2LFav369Wltb1dLSoiNHjiglJUXp6ekqLy/X2LFjVV5erszM\nTDmdTjkcDtXV1SkhIUGVlZUqKChQZGSkXnzxRT3yyCNqaGiQYRideiiup7Gx2eKa6Nvi42OoY4tR\nx9ajjgODerZed4JawIPElClTdODAAc2aNUuGYWj58uW69dZbtXTpUnk8HiUlJWnatGmy2WzKy8tT\nbm6uDMNQYWGhHA6HcnJyVFJSotzcXDkcDq1du1aStGLFChUVFcnr9SorK8v3dEZGRoZmz54twzC0\nbNmyQH9cAADCms0wDKO3CxGMSL/W4g7DetSx9ajjwKCerdedHgkWpAIAAKYRJAAAgGkECQAAYBpB\nAgAAmOb3Uxuffvqpzp07p45zM++8805LCgUAAEKDX0FixYoV+v3vf68RI0b4ztlsNr322muWFQwA\nAAQ/v4LE7t279e6776p///5WlwcAAIQQv+ZIjBgxQiw3AQAAruRXj8TgwYN13333KT09XQ6Hw3d+\n9erVlhUMAAAEP7+CxOTJkzV58mSrywIAAEKMX0MbM2bMUGpqqtxut86dO6fRo0drxowZVpcNAAAE\nOb+CxH/8x3/oJz/5ierr63XixAkVFBRox44dVpcNAAAEOb+GNl599VVt375dcXFxkqT8/HzNnTtX\ns2bNsrRwAAAguPnVI+H1en0hQpKGDBkim81mWaEAAEBo8KtH4rvf/a6ee+45Xw/Ejh07NHr0aEsL\nBgAAgp9fPRIrV65UVFSUnnrqKS1evFh2u12lpaVWlw0AAAQ5v3ok+vfvr3/+53+2uiwAACDEXDdI\nzJgxQzt37tTo0aM7zYkwDEM2m00ff/yx5QUEAADB67pBYufOnZKk2traq15rbW21pkQAACBk+DVH\nYvbs2Z2OvV6vZs6caUmBAABA6Lhuj8TcuXO1b98+Ser0lIbdbtfdd99tbckAAEDQu26QeO211yR9\n/dTG0qVLA1IgAAAQOvx6aqO4uFi//e1v5Xa7JUmXL19WfX29Fi5caGnhAABAcPMrSCxYsEAXL17U\nsWPHlJmZqf3792v8+PFWlw0AAAQ5vyZb/vnPf9Zrr72me+65R//wD/+g7du36/Tp01aXDQAABDm/\ngsQtt9wim82mkSNH6pNPPtGwYcN4/BMAAPg3tJGSkqJnn31WOTk5Kioq0unTp+XxeKwuGwD0KV6v\nVzWfN6r+tEsjhjqVlhyvCJtf93tAr/ErSCxfvlwffvihkpOT9cQTT2jPnj1au3at1WUDgD6l5vNG\n/ezNQ77jBTNTlZ4yrBdLBNzYdYPE/v37rzqOiYnR1KlTde7cOUsLBgB9Tf1p11XHBAkEu+sGiZde\neumar9lsNt86EwCA7hsx1NnpOOGKYyAYXTdIbNq0KVDlAIA+Ly05Xgtmpqr+tEsJQ50alxzf20UC\nbsivORJ5eXmddv9sR48EAPScCFuE0lOGMZyBkOL3glTt2tra9Lvf/U6DBg2yrFAAACA0+BUk7rrr\nrk7HEydO1EMPPcQS2QAA9HF+BYkTJ074/m0Yhj777DN99dVXlhUKAACEBr+CxJw5c3z/ttlsGjJk\nCLuBAuhTulosCoCfQeK9996zuhwAepDX61VF1Rf6rK6JFRJ7SFeLRf3N0MG9WCIgOPg9tLFy5Urt\n3btXdrtd2dnZeuqppzRkyBCrywfABFZI7HldLRYFwM9Nu4qKijRx4kRVVFRo165d+t73vqeSkhKr\nywbAJBq9nsdiUUDX/OqRcLlcneZJPPzww3rrrbcsKxSA7qHR63ksFgV0za8gkZqaql/96leaPn26\nJOn999/XmDFjLC0YAPPSkuNVnDten9U10ej1EBaLArpmMwzDuNFF3//+99XU1KR+/fopIiJCFy9e\n/OYNbDZ9/PHHlhayNzQ2Nvd2EcJafHwMdWwx6th61HFgUM/Wi4+PMf2zfvVIfPDBB6Z/AQAACF9+\nBYmLFy+qrKxMH3zwgS5fvqwJEyZo4cKFGjhwoNXlAwAAQcyvpzaeeeYZXbx4UatWrdLzzz8vj8ej\n0tJSq8sGAACCnF89EocOHdLbb7/tO162bJn+9m//1rJCAQCA0OBXj4RhGDp//rzv+Pz584qMjLSs\nUAAAIDT41SPx8MMP66GHHtLdd98twzD03nvvaf78+VaXDQAABDm/gsQDDzyghoYG/fznP5dhGFq8\neLFmzpxpddkAAECQ8ytIPP3002ppadHPfvYzeb1e/epXv9KxY8e0ZMkSq8sHAACCmF9BoqamRu++\n+67v+O6779b9999vWaEAAEBo8Guy5fDhw/XFF1/4js+cOaNhw1gmFgCAvs6vHom2tjZNnz5dmZmZ\nstvtqqqqUnx8vObOnStJeu211ywtJAAACE5+BYkFCxZ0On7kkUe6/YvPnj2rmTNn6tVXX1VkZKQW\nLVqkiIgIpaSk+Ba72rZtm7Zu3aqoqCjl5+drypQpamlpUXFxsc6ePSun06k1a9YoLi5O1dXVWrVq\nlex2uyZOnKiCggJJUllZmcrLy2W327V48WKlpaV1u+wAAOBrfgWJu+66q0d/aVtbm0pLS9W/f39J\n0urVq1VYWKjMzEyVlpZq165dGj9+vDZt2qSdO3fq0qVLysnJUVZWlrZs2aJRo0apoKBA77zzjjZu\n3KglS5Zo+fLlKisrU0JCgubPn6/a2lp5vV4dOHBA27dvV0NDgxYsWKAdO3b06GcBAKAv82uORE97\n/vnnlZOTo6FDh8owDB0+fFiZmZmSpOzsbO3Zs0cHDx5URkaG7Ha7nE6nEhMTVVtbq6qqKmVnZ/uu\n3bt3r1wulzwejxISEiRJkyZN0u7du1VVVaWsrCxJX8/z8Hq9ampq6o2PDABAWAp4kHjrrbd0yy23\nKCsrS+07mHu9Xt/r0dHRcrlccrvdion5ZlvTgQMH+s47nU7ftc3NzZ3OXXm+q/cAAAA9w6+hjZ70\n1ltvyWazaffu3frkk09UUlLSqZfA7XZr0KBBcjqdnRr9jufdbrfvXExMjC98dLx28ODBioqK8l3b\n8Xp/dGdvdviHOrYedWw96jgwqOfgFfAgsXnzZt+/586dqxUrVuinP/2p9u/frzvvvFMVFRWaMGGC\nxo4dq/Xr16u1tVUtLS06cuSIUlJSlJ6ervLyco0dO1bl5eXKzMyU0+mUw+FQXV2dEhISVFlZqYKC\nAkVGRurFF1/UI488ooaGBhmGodjYWL/K2djYbFUVQF//UaCOreVPHXu9XtV83qj60y6NGOpUWnK8\nImy9MuIZkvgeBwb1bL3uBLWAB4mulJSU6Omnn5bH41FSUpKmTZsmm82mvLw85ebmyjAMFRYWyuFw\nKCcnRyUlJcrNzZXD4dDatWslSStWrFBRUZG8Xq+ysrJ8T2dkZGRo9uzZMgxDy5Yt682PCQSdms8b\n9bM3D/mOF8xMVXoKa8QA8J/NaJ+ogE5Iv9biDsN6/tTxf+7+XDv/+5vF5mZMvk0PZCVZXbSwwfc4\nMKhn63WnR4I+TKAPGzHU2ek44YpjALiRoBjaANA70pLjtWBmqupPu5Qw1KlxyfG9XSQAIYYgAfRh\nEbYIpacMY14EANMY2gAAAKYRJAAAgGkECQAAYBpBAgAAmEaQAAAAphEkAACAaQQJAABgGutIAAAs\nxeZw4Y0gAQCwFJvDhTciIQDAUvWnXdc9RmgjSAAALMXmcOGNoQ0gzLSPR5/cd1TD4wYwHo1ex+Zw\n4Y0gAYQZxqMRbNgcLrxxmwKEGcajAQQSPRLATQr2R9kYjwYQSAQJ4CYF+9BB+3j0yaaL+nbcAMaj\nAViKIAHcpK6GDoIpSLSPR8fHx6ixsbm3iwMgzAVPfywQIhg6AIBv0CMB3CQeZQOAbxAkgJvEo2wA\n8A2GNgAAgGn0SAAIKcH++C3Q1xAkAISUYH/8FuhriPEAQgordwLBhR4JADcUTMMJPH4LBBeCBIAb\nCqbhBB6/BYILQQLADQXTap48fgsEF+ZIALghhhMAXAs9EgBuiOEEANdCkABwQwwnALgWhjYAAIBp\nBAkAAGAaQQIAAJhGkAAAAKYRJAAAgGkECQAAYBpBAgAAmEaQAAAAphEkAACAaaxsCYSZ9i2/T+47\nquFxA3p1y28A4Y8gAYSZYNryG0D44zYFCDNdbfkNAFYhSABhhi2/AQQSQxtAmGnf8vtk00V9O24A\nW34DsBRBAggz7Vt+x8fHqLGxubeLAyDMMbQBAABMI0gAAADTCBIAAMA05kgACDrti2rVn3ZpxFAn\ni2oBQYwgAeAqN9uQ93TDz6JaQOggSAC4ys025D3d8He1qBZBAghOAQ8SbW1teuqpp3T8+HF5PB7l\n5+crOTlZixYtUkREhFJSUlRaWipJ2rZtm7Zu3aqoqCjl5+drypQpamlpUXFxsc6ePSun06k1a9Yo\nLi5O1dXVWrVqlex2uyZOnKiCggJJUllZmcrLy2W327V48WKlpaUF+iMDIedmG/KebvhZVAsIHQEP\nEm+//bbi4uL005/+VOfPn9f06dM1evRoFRYWKjMzU6Wlpdq1a5fGjx+vTZs2aefOnbp06ZJycnKU\nlZWlLVu2aNSoUSooKNA777yjjRs3asmSJVq+fLnKysqUkJCg+fPnq7a2Vl6vVwcOHND27dvV0NCg\nBQsWaMeOHYH+yMBVgn0OwM025D3d8LcvqlV/2qWEoU4W1QKCWMCDxL333qtp06ZJki5fvqzIyEgd\nPnxYmZmZkqTs7Gzt3r1bERERysjIkN1ul9PpVGJiompra1VVVaVHH33Ud+3Pf/5zuVwueTweJSQk\nSJImTZqk3bt3y+FwKCsrS5I0fPhweb1eNTU1KS4uLtAfG2GipwJAsM8BuNmGvKcb/vZFtYKpTgB0\nLeBBYsCAAZIkl8ulhQsX6sknn9Tzzz/vez06Oloul0tut1sxMTG+8wMHDvSddzqdvmubm5s7nWs/\nX1dXp/79+ys2Nvaq9/AnSMTHx9zwGnRPKNZxRdUXnQJAce54ZWfcdtPvc3Lf0c7HTRe7rI+2y5e1\np7peR0+eV+K3BylrfIIiIyP9+h1tly/r42NfmvpZSfqboYP9vtbM9eEiFL/HoYh6Dl69MtmyoaFB\nBQUFmjNnju677z698MILvtfcbrcGDRokp9Mpl8vV5Xm32+07FxMT4wsfHa8dPHiwoqKifNd2vN4f\nLC1srVBdvvnoia80ITVel1ova4AjUkdPfKXb/2rITfdUDI8b0On423EDuqyPDz891Sm4XGrx+H2X\n/vGxL/XC69Wmfhb+CdXvcaihnq3XnaAW8EHZM2fOaN68eSouLtaMGTMkSbfffrv2798vSaqoqFBG\nRobGjh2rqqoqtba2qrm5WUeOHFFKSorS09NVXl4uSSovL1dmZqacTqccDofq6upkGIYqKyuVkZGh\n9PR0VVZWyjAMnThxQoZhdOqhAG5W/36R2nuoUdWffqkPDjWqX7+v7/Dbhyp2/vcXeunNQ6r5rPG6\n79M+FDBj8m1aMDP1mkMB3dkS/OjJ86Z/FgD8FfAeiZdfflnnz5/Xxo0btWHDBtlsNi1ZskQrV66U\nx+NRUlKSpk2bJpvNpry8POXm5sowDBUWFsrhcCgnJ0clJSXKzc2Vw+HQ2rVrJUkrVqxQUVGRvF6v\nsrKyfE9nZGRkaPbs2TIMQ8uWLQv0x0WYab7Q1unY9Zfjm31qwd85AN2ZxJj47UGmfxYA/GUzDMPo\n7UIEI7rRrBWqXZXVn57SS11MkrzW+e7yGl7VfNbYaRKjv5M7hwwZqN/9z59N/Sz8E6rf41BDPVuv\nO0MbBIlr4EtrrVD9w3Cthr07Db5VQrWOQwl1HBjUs/W6EyRY2RK4Cdcakgj2xxWDfd0KAKGLIIE+\npa82qMG+bgWA0EWQQJ8SKg1qTwce9q4AYBWCBPqUYG5QO4aHQU67Pjl2XpdaL+vklxdks0njkv0r\nZ/v7nNx3VMPjBigtOZ69KwBYhiCBPiWYG9SOvSXT/vpW7T30zVoU3/lWtMYl3/z7SPKtU8HeFQCs\nQJBAnxLMm0F17C1xXfB0es110XPl5X69T/tx+0TQYOl9ARA+CBLoU4L56Yore0s6GjXC/xVZg7nX\nJdj11cm4QHcQJIBe1t541Z12KW9qsi61tOk734rWHd+N1/FGt683wmt4/WrU2ntdTjZd1LfjBgRV\nr0uws2IyLuEE4Y4gAVyhra1NFR8d1/HTbo0Y6tSkcd+RPcK6/1W6ntMwTB9+ekpvlh+VJP1m33G/\nG7X2XhcW8bl5VkzGDZUnhQCzCBLo07q6W6z46Lg2/+bzb66RobvTb36rcH9dq/EK5idMwpUVw0L8\nd0S4I0igT+vqbvH4aXena6487gkdA0zMwCgN7BepCy2XJX3TeF2rUaOr3DpWTMZlzgrCHUECfVrH\nu8WB/SJ14oxbkZE2fT81XjWffakLLZd169DoHv+9VwaYOVOT5L7Q1qnxulajRle5dayYjBvMTwoB\nPYEggT6t491iWvIQ/XpvnTJG36LBTof+eky8hscP0OBoh/5z9+c9evd/ZXe3+0KbHshK6nTuWo0a\nXeWhJZifFAJ6AkECfVrHu8ULLW1KSx4iT5uhd//nuCRpQmq89h76s+/6nrr77053N13lAIIJQQJ9\nWse7xepPT6niYEOn1y+1Xu503FN3/93p7qarHEAwIUgAf5GWHK8mV4s+qz/nOzfAEdnpmp66++9O\nd3dPdJUzYRNATyFIAH8RYYvQ/xqfoCEx/fSdb0XLddGj0X8Vq8zRQ294938zDbM/11rd0DNhE0BP\nIUgAHUSj48a7AAAK9ElEQVTYIjQuedhVG2TdqJG9mYb54JFG7a89fd2dPa1u6JmwCaCnECTQ51hx\nt19/2qWB/SKVljxEl1ovq+GMW+OSu17S+nij+4Y7e1rd0AfDhE2GV4DwQJBAyGlvgE6edat/v0g1\nX2jTbcOc8hryq1Gy4m7/6985xBcQqj/9UsO/Fd3l+165k2dXO3ta3dAHw4RNhleA8ECQQEjxer16\nv6ZOm3/z+V8ezfy64e74b+mbRqmru14r7vbTkuP1Sd1Xfr3vqBGx+s2+452Ou3o/Kxv6YFjbgOEV\nIDwQJBBSaj5v1J+OfaUJqfGKiLD5zl/rMc2azxv1f/5vrdKSh+jPJ5vV5Gq56u6+J5aejrBF6LtX\nBIRr9SKM+0tIaGxyy7DZ9NGRszrnaum0OVgwNPRWC4bhFQDdR5BASKk/7VJ87AD9vw/q9f3Ub+7S\nr/WYZv1pl2/IYWC/SPV3RGpwtMO3Xfe3b4k2vfR0x+DxV8Oc8hqGpt51q2IGROnW+GiNTYq/ZjhJ\nTxmm9z78IqCbgwWbYBheAdB9BAmEhPYGOTLCpoazFyRJNZ99qQmp8erviNS4pFu6fExzxFCn/nzy\n6620O85hkK4OCjfb1d4xeEweN1SeNkOXWi/rvLtVt8ZHK8IWoQ8/O3XNcBKIzcGCWV/odQH6AoIE\nQkJ7oz2wX6T+9x3DJX29odbeQ41aMDPV9/jklY1S+yJT1Z9+ecNVKm+2q71j8IjuH+VbVlv65kmM\n64WTK3+fFZuDAYDVCBIICe0N8oWWy/r9Hxo0838lyus1btgl3r7IVKyznxrOuFX96Ze+164MCjfb\n1d4xCLgudP0kxvXCyaRx35FXho6fduvWodHKHnfrdX8fAAQjggRCQscG+ULLZX3nGo9WdqW9C31c\nslfDvxV9zaBws13tHYNHzMAoVX502vda+5MY1wsn9gh7n5oTASA82QzDMHq7EMGosbG5t4sQ1uLj\nY26qjr2GVzWfNXZqkINp8aJgLN/N1jFuHnUcGNSz9eLjY0z/LD0SCAnBPjEv2MsHAFYJnls6AAAQ\ncggSAADANIIEAAAwjSABAABMI0gAAADTCBIAAMA0ggQAADCNIAEAAEwjSAAAANMIEgAAwDSCBAAA\nMI0gAQAATCNIAAAA0wgSAADANIIEAAAwjSABAABMI0gAAADTCBIAAMA0ggQAADCNIAEAAEwjSAAA\nANMIEgAAwDSCBAAAMM3e2wWwmmEYWr58uT755BM5HA4999xzGjFiRG8XCwCAsBD2PRK7du1Sa2ur\n3njjDf3TP/2TVq9e3dtFAgAgbIR9kKiqqtLkyZMlSePGjdMf//jHXi4RAADhI+yDhMvlUkxMjO/Y\nbrfL6/X2YokAAAgfYT9Hwul0yu12+469Xq8iIm6cn+LjY254DbqHOrYedWw96jgwqOfgFfY9Enfc\ncYfKy8slSdXV1Ro1alQvlwgAgPBhMwzD6O1CWKnjUxuStHr1ao0cObKXSwUAQHgI+yABAACsE/ZD\nGwAAwDoECQAAYBpBAgAAmEaQAAAApoX9OhI3Izs7W4mJiZKk9PR0Pfnkk6qurtaqVatkt9s1ceJE\nFRQU9G4hQxj7nljrwQcflNPplCQlJCQoPz9fixYtUkREhFJSUlRaWtrLJQxdNTU1evHFF7Vp0yYd\nO3asy3rdtm2btm7dqqioKOXn52vKlCm9W+gQ07GOP/74Yz322GO+v8c5OTm69957qeNuaGtr01NP\nPaXjx4/L4/EoPz9fycnJPfNdNmAYhmF88cUXRn5+/lXnp0+fbtTV1RmGYRiPPvqo8fHHHwe6aGHj\nv/7rv4xFixYZhmEY1dXVxuOPP97LJQofLS0txowZMzqdy8/PN/bv328YhmEsW7bM+O1vf9sbRQt5\n//qv/2rcf//9xuzZsw3D6LpeGxsbjfvvv9/weDxGc3Ozcf/99xutra29WeyQcmUdb9u2zXj11Vc7\nXUMdd8+bb75prFq1yjAMwzh37pwxZcqUHvsuM7TxF3/84x916tQpzZ07V4899piOHj0ql8slj8ej\nhIQESdKkSZO0Z8+eXi5p6GLfE+vU1tbqwoULmjdvnh5++GHV1NTo8OHDyszMlPR1b9sHH3zQy6UM\nTbfddps2bNjgOz506FCnet2zZ48OHjyojIwM2e12OZ1OJSYm+tauwY11Vcfvv/++5syZo6VLl8rt\ndlPH3XTvvfdq4cKFkqTLly8rMjLyqr8RZr/LfXJoY8eOHfr3f//3TudKS0v12GOPaerUqaqqqlJR\nUZE2bNjg6yqWpOjoaNXX1we6uGHjWvue+LNkOa6vf//+mjdvnh566CEdPXpUjz76qIwOS8RER0er\nubm5F0sYuu655x4dP37cd3xlvbpcLrnd7k7f7YEDB1LfN+HKOh43bpx++MMfasyYMXr55ZdVVlam\n22+/nTruhgEDBkj6+u/wwoUL9eSTT+r555/3vd6d73KfDBKzZs3SrFmzOp27dOmSIiMjJUkZGRlq\nbGz0VWw7t9utQYMGBbSs4cTsvie4scTERN12222+f8fGxurw4cO+1/nu9pyO39n2enU6nfyt6EE/\n+MEPfI3ZD37wA61cuVJ33XUXddxNDQ0NKigo0Jw5c3TffffphRde8L3Wne8yf8X/oqyszNdLUVtb\nq+HDh8vpdMrhcKiurk6GYaiyslIZGRm9XNLQxb4n1nnzzTe1Zs0aSdKpU6fkcrmUlZWlffv2SZIq\nKir47vaQMWPGaP/+/ZK+qdexY8eqqqpKra2tam5u1pEjR5SSktLLJQ1d8+bN00cffSRJ+uCDD5Sa\nmkodd9OZM2c0b948FRcXa8aMGZKk22+/vUe+y32yR6Ir8+fPV3FxscrLy2W327V69WpJ0vLly1VU\nVCSv16usrCylpaX1cklD1z333KPdu3frRz/6kST56hjdN2vWLC1evFi5ubmKiIjQmjVrFBsbq6VL\nl8rj8SgpKUnTpk3r7WKGhZKSEj399NOd6tVmsykvL0+5ubkyDEOFhYVyOBy9XdSQtXz5cj377LOK\niopSfHy8nnnmGUVHR1PH3fDyyy/r/Pnz2rhxozZs2CCbzaYlS5Zo5cqV3f4us9cGAAAwjaENAABg\nGkECAACYRpAAAACmESQAAIBpBAkAAGAaQQIAAJhGkABguX379ikvL6/b73P33XfrxIkTPVAiAD2F\nIAEgIGw2W1C8B4CexcqWAAJm//79Wr9+vS5duqTz58+ruLhYU6dO1eLFi+V0OnXo0CGdOnVK//iP\n/6gHH3xQ586dU3FxsU6ePKmkpCS1tLT09kcAcAWCBICAMAxDmzdv1nPPPaeRI0dq7969WrVqlaZO\nnSrp6z1CXn/9df3pT39SXl6eHnzwQb300ktKTU3VL37xCx04cEDvvvtuL38KAFciSAAICJvNphde\neEG///3v9etf/1o1NTW6cOGC7/WsrCxJ0qhRo3T+/HlJX8+tWLdunSQpMzNTI0aMCHzBAVwXcyQA\nBIRhGMrNzdVHH32k733ve8rPz1fHrX769evX5c95vV7fv9l2Hgg+/F8JICDOnTunL774Qk888YSy\ns7NVWVnZKSR01B4wJk6cqLfffluSdPDgQR07dixg5QXgH4Y2AAREbGyssrKydN999ykmJkbjx4/X\npUuXdOnSpauubX86Y8GCBVq8eLEeeOABjRw5kqENIAixjTgAADCNoQ0AAGAaQQIAAJhGkAAAAKYR\nJAAAgGkECQAAYBpBAgAAmEaQAAAApv1/urqSrQvmf38AAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x12093feb8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"dense.loc[dense.population < 1e6, :].plot(x='land', y='population', kind='scatter')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Machine Learning\n",
"\n",
"We went to all this trouble to get the data, might as well use it!"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"title object\n",
"text object\n",
"date_posted object\n",
"date_updated object\n",
"deleted bool\n",
"craigslist object\n",
"latitude float64\n",
"longitude float64\n",
"city object\n",
"price float64\n",
"date object\n",
"sqft float64\n",
"bedrooms float64\n",
"bathrooms float64\n",
"pets object\n",
"laundry object\n",
"parking object\n",
"shp_place object\n",
"shp_city object\n",
"shp_urban object\n",
"shp_county object\n",
"shp_state object\n",
"population float64\n",
"land float64\n",
"density float64\n",
"dtype: object"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"apt2.dtypes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To put it into a machine learning algorithm we need to first take care of all the missing values"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(10832, 9)"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"apt3 = apt2.loc[:, ['price', 'latitude', 'longitude', 'sqft', 'bedrooms', 'bathrooms', 'population', 'land', 'density']]\n",
"nullrows = apt3.isnull().any(axis=1)\n",
"apt4 = apt3.loc[~nullrows, :]\n",
"apt4.shape"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"X = apt4.iloc[:, 1:].as_matrix()\n",
"y = apt4.iloc[:, 0].as_matrix()"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from sklearn.ensemble import RandomForestRegressor"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"rf = RandomForestRegressor().fit(X, y)"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"0.95718784983256378"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rf.score(X, y)"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<table class=\"simpletable\">\n",
"<caption>OLS Regression Results</caption>\n",
"<tr>\n",
" <th>Dep. Variable:</th> <td>y</td> <th> R-squared: </th> <td> 0.895</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Model:</th> <td>OLS</td> <th> Adj. R-squared: </th> <td> 0.895</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Method:</th> <td>Least Squares</td> <th> F-statistic: </th> <td>1.150e+04</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Date:</th> <td>Sat, 21 May 2016</td> <th> Prob (F-statistic):</th> <td> 0.00</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Time:</th> <td>08:44:33</td> <th> Log-Likelihood: </th> <td> -88815.</td> \n",
"</tr>\n",
"<tr>\n",
" <th>No. Observations:</th> <td> 10832</td> <th> AIC: </th> <td>1.776e+05</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Df Residuals:</th> <td> 10824</td> <th> BIC: </th> <td>1.777e+05</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Df Model:</th> <td> 8</td> <th> </th> <td> </td> \n",
"</tr>\n",
"<tr>\n",
" <th>Covariance Type:</th> <td>nonrobust</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>x1</th> <td> -10.4376</td> <td> 7.983</td> <td> -1.307</td> <td> 0.191</td> <td> -26.086 5.211</td>\n",
"</tr>\n",
"<tr>\n",
" <th>x2</th> <td> -7.3445</td> <td> 2.517</td> <td> -2.918</td> <td> 0.004</td> <td> -12.279 -2.410</td>\n",
"</tr>\n",
"<tr>\n",
" <th>x3</th> <td> 0.0019</td> <td> 0.002</td> <td> 0.962</td> <td> 0.336</td> <td> -0.002 0.006</td>\n",
"</tr>\n",
"<tr>\n",
" <th>x4</th> <td> 303.4792</td> <td> 15.268</td> <td> 19.877</td> <td> 0.000</td> <td> 273.551 333.408</td>\n",
"</tr>\n",
"<tr>\n",
" <th>x5</th> <td> 503.1857</td> <td> 22.420</td> <td> 22.444</td> <td> 0.000</td> <td> 459.239 547.133</td>\n",
"</tr>\n",
"<tr>\n",
" <th>x6</th> <td> 0.0001</td> <td> 2.92e-05</td> <td> 4.146</td> <td> 0.000</td> <td> 6.37e-05 0.000</td>\n",
"</tr>\n",
"<tr>\n",
" <th>x7</th> <td> -1.6553</td> <td> 0.226</td> <td> -7.325</td> <td> 0.000</td> <td> -2.098 -1.212</td>\n",
"</tr>\n",
"<tr>\n",
" <th>x8</th> <td> 0.1364</td> <td> 0.003</td> <td> 50.568</td> <td> 0.000</td> <td> 0.131 0.142</td>\n",
"</tr>\n",
"</table>\n",
"<table class=\"simpletable\">\n",
"<tr>\n",
" <th>Omnibus:</th> <td>8159.177</td> <th> Durbin-Watson: </th> <td> 1.178</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Prob(Omnibus):</th> <td> 0.000</td> <th> Jarque-Bera (JB): </th> <td>654728.978</td>\n",
"</tr>\n",
"<tr>\n",
" <th>Skew:</th> <td> 2.972</td> <th> Prob(JB): </th> <td> 0.00</td> \n",
"</tr>\n",
"<tr>\n",
" <th>Kurtosis:</th> <td>40.621</td> <th> Cond. No. </th> <td>3.89e+06</td> \n",
"</tr>\n",
"</table>"
],
"text/plain": [
"<class 'statsmodels.iolib.summary.Summary'>\n",
"\"\"\"\n",
" OLS Regression Results \n",
"==============================================================================\n",
"Dep. Variable: y R-squared: 0.895\n",
"Model: OLS Adj. R-squared: 0.895\n",
"Method: Least Squares F-statistic: 1.150e+04\n",
"Date: Sat, 21 May 2016 Prob (F-statistic): 0.00\n",
"Time: 08:44:33 Log-Likelihood: -88815.\n",
"No. Observations: 10832 AIC: 1.776e+05\n",
"Df Residuals: 10824 BIC: 1.777e+05\n",
"Df Model: 8 \n",
"Covariance Type: nonrobust \n",
"==============================================================================\n",
" coef std err t P>|t| [95.0% Conf. Int.]\n",
"------------------------------------------------------------------------------\n",
"x1 -10.4376 7.983 -1.307 0.191 -26.086 5.211\n",
"x2 -7.3445 2.517 -2.918 0.004 -12.279 -2.410\n",
"x3 0.0019 0.002 0.962 0.336 -0.002 0.006\n",
"x4 303.4792 15.268 19.877 0.000 273.551 333.408\n",
"x5 503.1857 22.420 22.444 0.000 459.239 547.133\n",
"x6 0.0001 2.92e-05 4.146 0.000 6.37e-05 0.000\n",
"x7 -1.6553 0.226 -7.325 0.000 -2.098 -1.212\n",
"x8 0.1364 0.003 50.568 0.000 0.131 0.142\n",
"==============================================================================\n",
"Omnibus: 8159.177 Durbin-Watson: 1.178\n",
"Prob(Omnibus): 0.000 Jarque-Bera (JB): 654728.978\n",
"Skew: 2.972 Prob(JB): 0.00\n",
"Kurtosis: 40.621 Cond. No. 3.89e+06\n",
"==============================================================================\n",
"\n",
"Warnings:\n",
"[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n",
"[2] The condition number is large, 3.89e+06. This might indicate that there are\n",
"strong multicollinearity or other numerical problems.\n",
"\"\"\""
]
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"linmod = smf.OLS(y, X).fit()\n",
"linmod.summary()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Database\n",
"\n",
"Write the results into a relational database"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from sqlalchemy import create_engine\n",
"\n",
"engine = create_engine('sqlite:///apartment.db')\n",
"apt2.to_sql('apartment', engine)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment