{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "code", "collapsed": false, "input": [ "%pylab --no-import-all inline" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "prompt_number": 1 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Some Context" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The US Census is complex....so it's good, even essential, to have a framing question to guide your explorations so that you don't get distracted or lost.\n", "\n", "I got into thinking of the census in 2002 when I saw a woman I knew in the following SF Chronicle article: \n", "\n", "[Claremont-Elmwood / Homogeneity in Berkeley? Well, yeah - SFGate](http://www.sfgate.com/bayarea/article/Claremont-Elmwood-Homogeneity-in-Berkeley-3306778.php)\n", "\n", "I thought at that point it should be easy for regular people to do census calculations....\n", "\n", "In the summer of 2013, I wrote the following note to Greg Wilson about diversity calculations:\n", "\n", "[notes for Greg Wilson about an example Data Science Workflow](https://www.evernote.com/shard/s1/sh/b3f79cbc-c0c3-48a3-87b6-91da1b939783/1857ddee32d7baa04c55e629da05e0a7)\n", "\n", "There's a whole cottage industry in musing on \"diversity\" in the USA:\n", "\n", "* [The Most Diverse Cities In The US - Business Insider](http://www.businessinsider.com/the-most-diverse-cities-in-the-us-2013-7) -- using 4 categories: Vallejo.\n", "\n", "* [Most And Least Diverse Cities: Brown University Study Evaluates Diversity In The U.S.](http://www.huffingtonpost.com/2012/09/07/most-least-diverse-cities-brown-university-study_n_1865715.html)\n", "\n", "* [The Top 10 Most Diverse Cities in America](http://www.cnbc.com/id/43066296) -- LA?\n", "\n", "and let's not forget the [Racial Dot Map](http://bit.ly/rdotmap) and [some background](http://bit.ly/rdotmapintro).\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Shows the version of pandas that we are using\n", "!pip show pandas" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "---\r\n", "Name: pandas\r\n", "Version: 0.12.0\r\n", "Location: /Users/raymondyee/anaconda/envs/myenv/lib/python2.7/site-packages\r\n", "Requires: \r\n" ] } ], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "# import useful classes of pandas\n", "import numpy as np\n", "import pandas as pd\n", "from pandas import Series, DataFrame, Index" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "http://www.census.gov/developers/\n", "\n", "Dependency: to start with -- let's use the Python module: https://pypi.python.org/pypi/census/\n", "\n", " pip install -U census" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Things we'd like to be able to do:\n", "\n", "* calculate the population of California.\n", "* then calculate the population of every geographic entity going down to census block if possible.\n", "* for a given geographic unit, can we get the racial/ethnic breakdown?\n" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Figuring out the Census Data is a Big Jigsaw Puzzle" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Some starting points:\n", " \n", " * [Developers - U.S. Census Bureau](http://www.census.gov/developers/)\n", " * [census/README.rst at master \u00b7 sunlightlabs/census](https://github.com/sunlightlabs/census/blob/master/README.rst)\n", " \n", "\n", "We focus first on the API -- and I hope we can come back to processing the bulk data from [Census FTP site](http://www2.census.gov/)" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Prerequisites: Getting and activating key" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* fill out form at http://www.census.gov/developers/tos/key_request.html \n", "\n", "\"Your request for a new API key has been successfully submitted. Please check your email. In a few minutes you should receive a message with instructions on how to activate your new key.\"\n", "\n", "* click on link you'll get http://api.census.gov/data/KeySignup?validate={key}\n", "\n", "Then create a settings.py in the same directory as this notebook (or somewhere else in your Python path) to hold `settings.CENSUS_KEY`" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import settings" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "# This cell should run successfully if you have a string set up to represent your census key\n", "\n", "try:\n", " import settings\n", " assert type(settings.CENSUS_KEY) == str or type(settings.CENSUS_KEY) == unicode\n", "except Exception as e:\n", " print \"error in importing settings to get at settings.CENSUS_KEY\", e" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "states module" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# let's figure out a bit about the us module, in particular, us.states\n", "# https://github.com/unitedstates/python-us\n", "\n", "from us import states\n", "\n", "for (i, state) in enumerate(states.STATES):\n", " print i, state.name, state.fips" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0 Alabama 01\n", "1 Alaska 02\n", "2 Arizona 04\n", "3 Arkansas 05\n", "4 California 06\n", "5 Colorado 08\n", "6 Connecticut 09\n", "7 Delaware 10\n", "8 District of Columbia 11\n", "9 Florida 12\n", "10 Georgia 13\n", "11 Hawaii 15\n", "12 Idaho 16\n", "13 Illinois 17\n", "14 Indiana 18\n", "15 Iowa 19\n", "16 Kansas 20\n", "17 Kentucky 21\n", "18 Louisiana 22\n", "19 Maine 23\n", "20 Maryland 24\n", "21 Massachusetts 25\n", "22 Michigan 26\n", "23 Minnesota 27\n", "24 Mississippi 28\n", "25 Missouri 29\n", "26 Montana 30\n", "27 Nebraska 31\n", "28 Nevada 32\n", "29 New Hampshire 33\n", "30 New Jersey 34\n", "31 New Mexico 35\n", "32 New York 36\n", "33 North Carolina 37\n", "34 North Dakota 38\n", "35 Ohio 39\n", "36 Oklahoma 40\n", "37 Oregon 41\n", "38 Pennsylvania 42\n", "39 Rhode Island 44\n", "40 South Carolina 45\n", "41 South Dakota 46\n", "42 Tennessee 47\n", "43 Texas 48\n", "44 Utah 49\n", "45 Vermont 50\n", "46 Virginia 51\n", "47 Washington 53\n", "48 West Virginia 54\n", "49 Wisconsin 55\n", "50 Wyoming 56\n" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Questions to ponder: How many states are in the list? Is DC included the states list? How to access the territories?" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Formulating URL requests by hand" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It's immensely useful to be able to access the census API directly but creating a URL with the proper parameters -- as well as using the `census` package." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import requests" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "# get the total population of all states\n", "url = \"http://api.census.gov/data/2010/sf1?key={key}&get=P0010001,NAME&for=state:*\".format(key=settings.CENSUS_KEY)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "# note the structure of the response\n", "r = requests.get(url)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Total Population" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# FILL IN\n", "# drop the header record\n", "from itertools import islice\n", "# total population including PR is 312471327\n", "\n", "\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "# FILL IN\n", "# exclude PR: 308745538\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "# let's now create a DataFrame from r.json()\n", "\n", "df = DataFrame(r.json()[1:], columns=r.json()[0])\n", "df.head()" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
P0010001NAMEstate
0 4779736 Alabama 01
1 710231 Alaska 02
2 6392017 Arizona 04
3 2915918 Arkansas 05
4 37253956 California 06
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ " P0010001 NAME state\n", "0 4779736 Alabama 01\n", "1 710231 Alaska 02\n", "2 6392017 Arizona 04\n", "3 2915918 Arkansas 05\n", "4 37253956 California 06" ] } ], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "# FILL IN\n", "# calculate the total population using df\n", "\n", "\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "# FILL IN -- now calculate the total population excluding Puerto Rico\n", "\n", "\n", "\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 14 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Focusing on sf1 +2010 census" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How to map out the geographical hierachy and pull out total population figures?\n", "\n", " 1. Nation\n", " 1. Regions\n", " 1. Divisions\n", " 1. State\n", " 1. County\n", " 1. Census Tract\n", " 1. Block Group\n", " 1. Census Block\n", " \n", "Questions\n", " \n", "* What identifiers are used for these various geographic entities? \n", "* Can we get an enumeration of each of these entities?\n", "* How to figure out which census tract, block group, census block one is in?\n", " \n" ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Total Population of California" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[2010 Census Summary File 1](http://www.census.gov/prod/cen2010/doc/sf1.pdf)\n", "\n", "P0010001 is found in [2010 SF1 API Variables \\[XML\\]](http://www.census.gov/developers/data/sf1.xml) = \"total population\"" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from settings import CENSUS_KEY\n", "import census\n", "\n", "c=census.Census(settings.CENSUS_KEY) \n", "c.sf1.get(('NAME', 'P0010001'), {'for': 'state:%s' % states.CA.fips})" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 15, "text": [ "[{u'NAME': u'California', u'P0010001': u'37253956', u'state': u'06'}]" ] } ], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "\"population of California: {0}\".format(\n", " int(c.sf1.get(('NAME', 'P0010001'), {'for': 'state:%s' % states.CA.fips})[0]['P0010001']))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "'population of California: 37253956'" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's try to get at the counties of California and their populations" ] }, { "cell_type": "code", "collapsed": false, "input": [ "ca_counties = c.sf1.get(('NAME', 'P0010001'), geo={'for': 'county:*', 'in': 'state:%s' % states.CA.fips})" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "# create a DataFrame, convert the 'P0010001' column\n", "# show by descending population\n", "df = DataFrame(ca_counties)\n", "df['P0010001'] = df['P0010001'].astype('int')\n", "df.sort_index(by='P0010001', ascending=False)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NAMEP0010001countystate
18 Los Angeles County 9818605 037 06
36 San Diego County 3095313 073 06
29 Orange County 3010232 059 06
32 Riverside County 2189641 065 06
35 San Bernardino County 2035210 071 06
42 Santa Clara County 1781642 085 06
0 Alameda County 1510271 001 06
33 Sacramento County 1418788 067 06
6 Contra Costa County 1049025 013 06
9 Fresno County 930450 019 06
14 Kern County 839631 029 06
55 Ventura County 823318 111 06
37 San Francisco County 805235 075 06
40 San Mateo County 718451 081 06
38 San Joaquin County 685306 077 06
49 Stanislaus County 514453 099 06
48 Sonoma County 483878 097 06
53 Tulare County 442179 107 06
41 Santa Barbara County 423895 083 06
26 Monterey County 415057 053 06
47 Solano County 413344 095 06
30 Placer County 348432 061 06
39 San Luis Obispo County 269637 079 06
43 Santa Cruz County 262382 087 06
23 Merced County 255793 047 06
20 Marin County 252409 041 06
3 Butte County 220000 007 06
56 Yolo County 200849 113 06
8 El Dorado County 181058 017 06
44 Shasta County 177223 089 06
12 Imperial County 174528 025 06
15 Kings County 152982 031 06
19 Madera County 150865 039 06
27 Napa County 136484 055 06
11 Humboldt County 134623 023 06
28 Nevada County 98764 057 06
50 Sutter County 94737 101 06
22 Mendocino County 87841 045 06
57 Yuba County 72155 115 06
16 Lake County 64665 033 06
51 Tehama County 63463 103 06
54 Tuolumne County 55365 109 06
34 San Benito County 55269 069 06
4 Calaveras County 45578 009 06
46 Siskiyou County 44900 093 06
2 Amador County 38091 005 06
17 Lassen County 34895 035 06
7 Del Norte County 28610 015 06
10 Glenn County 28122 021 06
5 Colusa County 21419 011 06
31 Plumas County 20007 063 06
13 Inyo County 18546 027 06
21 Mariposa County 18251 043 06
25 Mono County 14202 051 06
52 Trinity County 13786 105 06
24 Modoc County 9686 049 06
45 Sierra County 3240 091 06
1 Alpine County 1175 003 06
\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ " NAME P0010001 county state\n", "18 Los Angeles County 9818605 037 06\n", "36 San Diego County 3095313 073 06\n", "29 Orange County 3010232 059 06\n", "32 Riverside County 2189641 065 06\n", "35 San Bernardino County 2035210 071 06\n", "42 Santa Clara County 1781642 085 06\n", "0 Alameda County 1510271 001 06\n", "33 Sacramento County 1418788 067 06\n", "6 Contra Costa County 1049025 013 06\n", "9 Fresno County 930450 019 06\n", "14 Kern County 839631 029 06\n", "55 Ventura County 823318 111 06\n", "37 San Francisco County 805235 075 06\n", "40 San Mateo County 718451 081 06\n", "38 San Joaquin County 685306 077 06\n", "49 Stanislaus County 514453 099 06\n", "48 Sonoma County 483878 097 06\n", "53 Tulare County 442179 107 06\n", "41 Santa Barbara County 423895 083 06\n", "26 Monterey County 415057 053 06\n", "47 Solano County 413344 095 06\n", "30 Placer County 348432 061 06\n", "39 San Luis Obispo County 269637 079 06\n", "43 Santa Cruz County 262382 087 06\n", "23 Merced County 255793 047 06\n", "20 Marin County 252409 041 06\n", "3 Butte County 220000 007 06\n", "56 Yolo County 200849 113 06\n", "8 El Dorado County 181058 017 06\n", "44 Shasta County 177223 089 06\n", "12 Imperial County 174528 025 06\n", "15 Kings County 152982 031 06\n", "19 Madera County 150865 039 06\n", "27 Napa County 136484 055 06\n", "11 Humboldt County 134623 023 06\n", "28 Nevada County 98764 057 06\n", "50 Sutter County 94737 101 06\n", "22 Mendocino County 87841 045 06\n", "57 Yuba County 72155 115 06\n", "16 Lake County 64665 033 06\n", "51 Tehama County 63463 103 06\n", "54 Tuolumne County 55365 109 06\n", "34 San Benito County 55269 069 06\n", "4 Calaveras County 45578 009 06\n", "46 Siskiyou County 44900 093 06\n", "2 Amador County 38091 005 06\n", "17 Lassen County 34895 035 06\n", "7 Del Norte County 28610 015 06\n", "10 Glenn County 28122 021 06\n", "5 Colusa County 21419 011 06\n", "31 Plumas County 20007 063 06\n", "13 Inyo County 18546 027 06\n", "21 Mariposa County 18251 043 06\n", "25 Mono County 14202 051 06\n", "52 Trinity County 13786 105 06\n", "24 Modoc County 9686 049 06\n", "45 Sierra County 3240 091 06\n", "1 Alpine County 1175 003 06" ] } ], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "#http://stackoverflow.com/a/13130357/7782\n", "count,division = np.histogram(df['P0010001'])\n", "df['P0010001'].hist(bins=division)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 19, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nQUGnxi/10AAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 19 } ], "metadata": {} } ] }