{ "metadata": { "name": "", "signature": "sha256:bc6490dd883689bab0367408eba78343b257bc52d1d9fdda1eb8c3266b80c991" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Exercise" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this exercise, reproduce some of the findings from [What Makes Houston the Next Great American City? | Travel | Smithsonian](http://www.smithsonianmag.com/travel/what-makes-houston-the-next-great-american-city-4870584/), specifically the calculation represented in\n", "\n", "![Alt text](http://thumbs.media.smithsonianmag.com//filer/Houston-diversity-3.jpg__600x0_q85_upscale.jpg \"Optional title\")\n", "\n", "whose caption is\n", "\n", "
To assess the parity of the four major U.S. ethnic and racial groups, Rice University researchers used a scale called the Entropy Index. It ranges from 0 (a population has just one group) to 1 (all groups are equivalent). Edging New York for the most balanced diversity, Houston had an Entropy Index of 0.874 (orange bar).
\n", "\n", "The research report by *Smithsonian Magazine* is\n", "[Houston Region Grows More Racially/Ethnically Diverse, With Small Declines in Segregation: A Joint Report Analyzing Census Data from 1990, 2000, and 2010](http://kinder.rice.edu/uploadedFiles/Urban_Research_Center/Media/Houston%20Region%20Grows%20More%20Ethnically%20Diverse%202-13.pdf) by the Kinder Institute for Urban Research & the Hobby Center for the Study of Texas. \n", "\n", "In the report, you'll find the following quotes:\n", "\n", "
How does Houston\u2019s racial/ethnic diversity compare to the racial/ethnic\n", "diversity of other large metropolitan areas? The Houston metropolitan\n", "area is the most racially/ethnically diverse.
\n", "\n", "....\n", "\n", "
Houston is one of the most racially/ethnically diverse metropolitan\n", "areas in the nation as well. *It is the most diverse of the 10 largest\n", "U.S. metropolitan areas.* [emphasis mine] Unlike the other large metropolitan areas, all\n", "four major racial/ethnic groups have substantial representation in\n", "Houston with Latinos and Anglos occupying roughly equal shares of the\n", "population.
\n", "\n", "....\n", "\n", "
Houston has the highest entropy score of the 10 largest metropolitan\n", "areas, 0.874. New York is a close second with a score of 0.872.
\n", "\n", "....\n", "\n", "Your task is:\n", "\n", "1. Tabulate all the metropolian/micropolitan statistical areas. Remember that you have to group various entities that show up separately in the Census API but which belong to the same area. You should find 942 metropolitan/micropolitan statistical areas in the 2010 Census.\n", "\n", "1. Calculate the normalized Shannon index (`entropy5`) using the categories of White, Black, Hispanic, Asian, and Other as outlined in the [Day_07_G_Calculating_Diversity notebook](http://nbviewer.ipython.org/github/rdhyee/working-open-data-2014/blob/master/notebooks/Day_07_G_Calculating_Diversity.ipynb#Converting-to-Racial-Dot-Map-Categories) \n", "\n", "1. Calculate the normalized Shannon index (`entropy4`) by not considering the Other category. In other words, assume that the the total population is the sum of White, Black, Hispanic, and Asian.\n", "\n", "1. Figure out how exactly the entropy score was calculated in the report from Rice University. Since you'll find that the entropy score reported matches neither `entropy5` nor `entropy4`, you'll need to play around with the entropy calculation to figure how to use 4 categories to get the score for Houston to come out to \"0.874\" and that for NYC to be \"0.872\". [I **think** I've done so and get 0.873618 and \n", "0.872729 respectively.]\n", "\n", "1. Add a calculation of the [Gini-Simpson diversity index](https://en.wikipedia.org/wiki/Diversity_index#Gini.E2.80.93Simpson_index) using the five categories of White, Black, Hispanic, Asian, and Other.\n", "\n", "1. Note where the Bay Area stands in terms of the diversity index.\n", "\n", "For bonus points:\n", "\n", "* make a bar chart in the style used in the Smithsonian Magazine\n", "\n", "Deliverable:\n", "\n", "1. You will need to upload your notebook to a gist and render the notebook in nbviewer and then enter the nbviewer URL (e.g., http://nbviewer.ipython.org/gist/rdhyee/60b6c0b0aad7fd531938)\n", "2. On bCourses, upload the CSV version of your `msas_df`." ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Hispanic or Latino Origin and Racial Subcategories" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "http://www.census.gov/developers/data/sf1.xml\n", "\n", "compare to http://www.census.gov/prod/cen2010/briefs/c2010br-02.pdf \n", "\n", "I think the P0050001 might be the key category\n", "\n", "* P0010001 = P0050001\n", "* P0050001 = P0050002 + P0050010\n", "\n", "P0050002 Not Hispanic or Latino (total) = \n", "\n", "* P0050003 Not Hispanic White only \n", "* P0050004 Not Hispanic Black only\n", "* P0050006 Not Hispanic Asian only\n", "* Not Hispanic Other (should also be P0050002 - (P0050003 + P0050004 + P0050006)\n", " * P0050005 Not Hispanic: American Indian/ American Indian and Alaska Native alone\n", " * P0050007 Not Hispanic: Native Hawaiian and Other Pacific Islander alone\n", " * P0050008 Not Hispanic: Some Other Race alone\n", " * P0050009 Not Hispanic: Two or More Races\n", "\n", "* P0050010 Hispanic or Latino\n", " \n", "P0050010 = P0050011...P0050017\n", "\n", "From [Hispanic and Latino Americans (Wikipedia)](https://en.wikipedia.org/w/index.php?title=Hispanic_and_Latino_Americans&oldid=595018646): \n", "\n", "
While the two terms are sometimes used interchangeably, Hispanic is a narrower term which mostly refers to persons of Spanish speaking origin or ancestry, while Latino is more frequently used to refer more generally to anyone of Latin American origin or ancestry, including Brazilians.
\n", "\n", "and\n", "\n", "
The Census Bureau's 2010 census does provide a definition of the terms Latino or Hispanic and is as follows: \u201cHispanic or Latino\u201d refers to a person of Cuban, Mexican, Puerto Rican, South or Central American, or other Spanish culture or origin regardless of race. It allows respondents to self-define whether they were Latino or Hispanic and then identify their specific country or place of origin.[52] On its website, the Census Bureau defines \"Hispanic\" or \"Latino\" persons as being \"persons who trace their origin [to]... Spanish speaking Central and South America countries, and other Spanish cultures\".
\n", "\n", "In the [Racial Dot Map](http://bit.ly/rdotmap): \"Whites are coded as blue; African-Americans, green; Asians, red; Hispanics, orange; and all other racial categories are coded as brown.\" \n", "\n", "In this notebook, we will relate the Racial Dot Map 5-category scheme to the P005\\* variables." ] }, { "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": "code", "collapsed": false, "input": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from pandas import DataFrame, Series, Index\n", "import pandas as pd\n", "\n", "from itertools import islice" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "import census\n", "import us\n", "\n", "import settings" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The census documentation has example URLs but needs your API key to work. In this notebook, we'll use the IPython notebook HTML display mechanism to help out.\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "c = census.Census(key=settings.CENSUS_KEY)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "# generators for the various census geographic entities of interest\n", "\n", "def states(variables='NAME'):\n", " geo={'for':'state:*'}\n", " states_fips = set([state.fips for state in us.states.STATES])\n", " # need to filter out non-states\n", " for r in c.sf1.get(variables, geo=geo):\n", " if r['state'] in states_fips:\n", " yield r\n", " \n", "def counties(variables='NAME'):\n", " \"\"\"ask for all the states in one call\"\"\"\n", " \n", " # tabulate a set of fips codes for the states\n", " states_fips = set([s.fips for s in us.states.STATES])\n", " \n", " geo={'for':'county:*',\n", " 'in':'state:*'} \n", " for county in c.sf1.get(variables, geo=geo):\n", " # eliminate counties whose states aren't in a state or DC\n", " if county['state'] in states_fips:\n", " yield county\n", " \n", "\n", "def counties2(variables='NAME'):\n", " \"\"\"generator for all counties\"\"\"\n", " \n", " # since we can get all the counties in one call, \n", " # this function is for demonstrating the use of walking through \n", " # the states to get at the counties\n", "\n", " for state in us.states.STATES:\n", " geo={'for':'county:*',\n", " 'in':'state:{fips}'.format(fips=state.fips)}\n", " for county in c.sf1.get(variables, geo=geo):\n", " yield county\n", "\n", " \n", "def tracts(variables='NAME'):\n", " for state in us.states.STATES:\n", " \n", " # handy to print out state to monitor progress\n", " # print state.fips, state\n", " counties_in_state={'for':'county:*',\n", " 'in':'state:{fips}'.format(fips=state.fips)}\n", " \n", " for county in c.sf1.get('NAME', geo=counties_in_state):\n", " \n", " # print county['state'], county['NAME']\n", " tracts_in_county = {'for':'tract:*',\n", " 'in': 'state:{s_fips} county:{c_fips}'.format(s_fips=state.fips, \n", " c_fips=county['county'])}\n", " \n", " for tract in c.sf1.get(variables,geo=tracts_in_county):\n", " yield tract\n", "\n", "\n", "def msas(variables=\"NAME\"):\n", " \n", " for state in us.STATES:\n", " geo = {'for':'metropolitan statistical area/micropolitan statistical area:*', \n", " 'in':'state:{state_fips}'.format(state_fips=state.fips)\n", " }\n", " \n", " for msa in c.sf1.get(variables, geo=geo):\n", " yield msa\n", " \n", "def block_groups(variables='NAME'):\n", " # http://api.census.gov/data/2010/sf1?get=P0010001&for=block+group:*&in=state:02+county:170\n", " # let's use the county generator\n", " for county in counties(variables):\n", " geo = {'for':'block group:*',\n", " 'in':'state:{state} county:{county}'.format(state=county['state'],\n", " county=county['county'])\n", " }\n", " for block_group in c.sf1.get(variables, geo):\n", " yield block_group\n", " \n", " \n", "def blocks(variables='NAME'):\n", " # http://api.census.gov/data/2010/sf1?get=P0010001&for=block:*&in=state:02+county:290+tract:00100\n", " \n", " # make use of the tract generator\n", " for tract in tracts(variables):\n", " geo={'for':'block:*',\n", " 'in':'state:{state} county:{county} tract:{tract}'.format(state=tract['state'],\n", " county=tract['county'],\n", " tract=tract['tract'])\n", " }\n", " for block in c.sf1.get(variables, geo):\n", " yield block\n", " \n", "def csas(variables=\"NAME\"):\n", " # http://api.census.gov/data/2010/sf1?get=P0010001&for=combined+statistical+area:*&in=state:24\n", " for state in us.STATES:\n", " geo = {'for':'combined statistical area:*', \n", " 'in':'state:{state_fips}'.format(state_fips=state.fips)\n", " }\n", " \n", " for csa in c.sf1.get(variables, geo=geo):\n", " yield csa\n", "\n", "def districts(variables=\"NAME\"):\n", " # http://api.census.gov/data/2010/sf1?get=P0010001&for=congressional+district:*&in=state:24\n", " for state in us.STATES:\n", " geo = {'for':'congressional district:*', \n", " 'in':'state:{state_fips}'.format(state_fips=state.fips)\n", " }\n", " \n", " for district in c.sf1.get(variables, geo=geo):\n", " yield district \n", " \n", "def zip_code_tabulation_areas(variables=\"NAME\"):\n", " # http://api.census.gov/data/2010/sf1?get=P0010001&for=zip+code+tabulation+area:*&in=state:02\n", " for state in us.STATES:\n", " geo = {'for':'zip code tabulation area:*', \n", " 'in':'state:{state_fips}'.format(state_fips=state.fips)\n", " }\n", " \n", " for zip_code_tabulation_area in c.sf1.get(variables, geo=geo):\n", " yield zip_code_tabulation_area " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "\n", "def census_labels(prefix='P005', n0=1, n1=17, field_width=4, include_name=True, join=False):\n", " \"\"\"convenience function to generate census labels\"\"\"\n", " \n", " label_format = \"{i:0%dd}\" % (field_width)\n", " \n", " variables = [prefix + label_format.format(i=i) for i in xrange(n0,n1+1)]\n", " if include_name:\n", " variables = ['NAME'] + variables\n", "\n", " if join:\n", " return \",\".join(variables)\n", " else:\n", " return variables\n", "\n", "def rdot_labels(other=True):\n", " if other:\n", " return ['White', 'Black', 'Asian', 'Hispanic', 'Other']\n", " else:\n", " return ['White', 'Black', 'Asian', 'Hispanic']\n", " \n", "FINAL_LABELS = ['NAME', 'Total'] + rdot_labels() + ['p_White', 'p_Black', 'p_Asian', 'p_Hispanic', 'p_Other'] + ['entropy5', 'entropy4', 'entropy_rice', 'gini_simpson']\n", " \n", "def convert_to_rdotmap(row):\n", " \"\"\"takes the P005 variables and maps to a series with White, Black, Asian, Hispanic, Other\n", " Total\"\"\"\n", " return pd.Series({'Total':row['P0050001'],\n", " 'White':row['P0050003'],\n", " 'Black':row['P0050004'],\n", " 'Asian':row['P0050006'],\n", " 'Hispanic':row['P0050010'],\n", " 'Other': row['P0050005'] + row['P0050007'] + row['P0050008'] + row['P0050009'],\n", " }, index=['Total', 'White', 'Black', 'Hispanic', 'Asian', 'Other'])\n", "\n", "\n", "def normalize(s):\n", " \"\"\"take a Series and divide each item by the sum so that the new series adds up to 1.0\"\"\"\n", " total = np.sum(s)\n", " return s.astype('float') / total\n", " \n", "def normalize_relabel(s):\n", " \"\"\"take a Series and divide each item by the sum so that the new series adds up to 1.0\n", " Also relabel the indices by adding p_ prefix\"\"\"\n", " total = np.sum(s)\n", " new_index = list(Series(s.index).apply(lambda x: \"p_\"+x))\n", " return Series(list(s.astype('float') / total),new_index)\n", "\n", "def entropy(series):\n", " \"\"\"Normalized Shannon Index\"\"\"\n", " # a series in which all the entries are equal should result in normalized entropy of 1.0\n", " \n", " # eliminate 0s\n", " series1 = series[series!=0]\n", "\n", " # if len(series) < 2 (i.e., 0 or 1) then return 0\n", " \n", " if len(series1) > 1:\n", " # calculate the maximum possible entropy for given length of input series\n", " max_s = -np.log(1.0/len(series))\n", " \n", " total = float(sum(series1))\n", " p = series1.astype('float')/float(total)\n", " return sum(-p*np.log(p))/max_s\n", " else:\n", " return 0.0\n", "\n", "def gini_simpson(s):\n", " # https://en.wikipedia.org/wiki/Diversity_index#Gini.E2.80.93Simpson_index\n", " s1 = normalize(s)\n", " return 1-np.sum(s1*s1)\n", "\n", "def entropy_rice(series):\n", " \"\"\"hard code how Rice U did calculation \n", " This function takes the entropy5 calculation and removes the contribution from 'Other'\n", " \"\"\"\n", " # pass in a Series with \n", " # 'Asian','Black','Hispanic','White','Other'\n", " # http://kinder.rice.edu/uploadedFiles/Urban_Research_Center/Media/Houston%20Region%20Grows%20More%20Ethnically%20Diverse%202-13.pdf\n", "\n", " s0 = normalize(series)\n", " s_other = s0['Other']*np.log(s0['Other']) if s0['Other'] > 0 else 0.0\n", " return (np.log(0.2)*entropy(series) - s_other)/np.log(0.25)\n", "\n", "def diversity(df):\n", " \"\"\"Takes a df with the P005 variables and does entropy calculation\"\"\"\n", " # convert populations to int\n", " df[census_labels(include_name=False)] = df[census_labels(include_name=False)].astype('int')\n", " df = pd.concat((df, df.apply(convert_to_rdotmap, axis=1)),axis=1)\n", " df = pd.concat((df,df[rdot_labels()].apply(normalize_relabel,axis=1)), axis=1)\n", " df['entropy5'] = df.apply(lambda x:entropy(x[rdot_labels()]), axis=1)\n", " df['entropy4'] = df.apply(lambda x:entropy(x[rdot_labels(other=False)]), axis=1)\n", " df['entropy_rice'] = df.apply(lambda x:entropy_rice(x[rdot_labels()]), axis=1)\n", " df['gini_simpson'] = df.apply(lambda x:gini_simpson(x[rdot_labels()]), axis=1)\n", " return df" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "States" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# grab states, convert populations to int\n", "states_df = DataFrame(list(states(census_labels())))\n", "states_df = diversity(states_df)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "states_df[FINAL_LABELS].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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NAMETotalWhiteBlackAsianHispanicOtherp_Whitep_Blackp_Asianp_Hispanicp_Otherentropy5entropy4entropy_ricegini_simpson
0 Alabama 4779736 3204402 1244437 52937 185602 92358 0.670414 0.260357 0.011075 0.038831 0.019323 0.541001 0.570292 0.573075 0.480755
1 Alaska 710231 455320 21949 37459 39249 156254 0.641087 0.030904 0.052742 0.055262 0.220004 0.646677 0.475235 0.510480 0.533815
2 Arizona 6392017 3695647 239101 170509 1895149 391611 0.578166 0.037406 0.026675 0.296487 0.061266 0.663524 0.643529 0.646914 0.571955
3 Arkansas 2915918 2173469 447102 35647 186050 73650 0.745381 0.153331 0.012225 0.063805 0.025258 0.515025 0.526205 0.530902 0.416039
4 California 37253956 14956253 2163804 4775070 14013719 1345110 0.401468 0.058083 0.128176 0.376167 0.036107 0.796994 0.843670 0.838778 0.676216
\n", "

5 rows \u00d7 16 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ " NAME Total White Black Asian Hispanic Other \\\n", "0 Alabama 4779736 3204402 1244437 52937 185602 92358 \n", "1 Alaska 710231 455320 21949 37459 39249 156254 \n", "2 Arizona 6392017 3695647 239101 170509 1895149 391611 \n", "3 Arkansas 2915918 2173469 447102 35647 186050 73650 \n", "4 California 37253956 14956253 2163804 4775070 14013719 1345110 \n", "\n", " p_White p_Black p_Asian p_Hispanic p_Other entropy5 entropy4 \\\n", "0 0.670414 0.260357 0.011075 0.038831 0.019323 0.541001 0.570292 \n", "1 0.641087 0.030904 0.052742 0.055262 0.220004 0.646677 0.475235 \n", "2 0.578166 0.037406 0.026675 0.296487 0.061266 0.663524 0.643529 \n", "3 0.745381 0.153331 0.012225 0.063805 0.025258 0.515025 0.526205 \n", "4 0.401468 0.058083 0.128176 0.376167 0.036107 0.796994 0.843670 \n", "\n", " entropy_rice gini_simpson \n", "0 0.573075 0.480755 \n", "1 0.510480 0.533815 \n", "2 0.646914 0.571955 \n", "3 0.530902 0.416039 \n", "4 0.838778 0.676216 \n", "\n", "[5 rows x 16 columns]" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "states_df.sort_index(by='entropy5', ascending=False)[FINAL_LABELS].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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NAMETotalWhiteBlackAsianHispanicOtherp_Whitep_Blackp_Asianp_Hispanicp_Otherentropy5entropy4entropy_ricegini_simpson
11 Hawaii 1360301 309343 19904 513294 120842 396918 0.227408 0.014632 0.377339 0.088835 0.291787 0.833108 0.750762 0.707954 0.712656
4 California 37253956 14956253 2163804 4775070 14013719 1345110 0.401468 0.058083 0.128176 0.376167 0.036107 0.796994 0.843670 0.838778 0.676216
28 Nevada 2700551 1462081 208058 191047 716501 122864 0.541401 0.077043 0.070744 0.265317 0.045496 0.751622 0.774363 0.771193 0.623482
32 New York 19378102 11304247 2783857 1406194 3416922 466882 0.583352 0.143660 0.072566 0.176329 0.024093 0.732727 0.787727 0.785917 0.602124
43 Texas 25145561 11397345 2886825 948426 9460921 452044 0.453255 0.114805 0.037717 0.376246 0.017977 0.727466 0.793870 0.792449 0.638073
\n", "

5 rows \u00d7 16 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 9, "text": [ " NAME Total White Black Asian Hispanic Other \\\n", "11 Hawaii 1360301 309343 19904 513294 120842 396918 \n", "4 California 37253956 14956253 2163804 4775070 14013719 1345110 \n", "28 Nevada 2700551 1462081 208058 191047 716501 122864 \n", "32 New York 19378102 11304247 2783857 1406194 3416922 466882 \n", "43 Texas 25145561 11397345 2886825 948426 9460921 452044 \n", "\n", " p_White p_Black p_Asian p_Hispanic p_Other entropy5 entropy4 \\\n", "11 0.227408 0.014632 0.377339 0.088835 0.291787 0.833108 0.750762 \n", "4 0.401468 0.058083 0.128176 0.376167 0.036107 0.796994 0.843670 \n", "28 0.541401 0.077043 0.070744 0.265317 0.045496 0.751622 0.774363 \n", "32 0.583352 0.143660 0.072566 0.176329 0.024093 0.732727 0.787727 \n", "43 0.453255 0.114805 0.037717 0.376246 0.017977 0.727466 0.793870 \n", "\n", " entropy_rice gini_simpson \n", "11 0.707954 0.712656 \n", "4 0.838778 0.676216 \n", "28 0.771193 0.623482 \n", "32 0.785917 0.602124 \n", "43 0.792449 0.638073 \n", "\n", "[5 rows x 16 columns]" ] } ], "prompt_number": 9 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Counties" ] }, { "cell_type": "code", "collapsed": false, "input": [ "r = list(counties(census_labels()))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "counties_df = DataFrame(r)\n", "counties_df = diversity(counties_df)\n", "counties_df[FINAL_LABELS].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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NAMETotalWhiteBlackAsianHispanicOtherp_Whitep_Blackp_Asianp_Hispanicp_Otherentropy5entropy4entropy_ricegini_simpson
0 Autauga County 54571 42154 9595 467 1310 1045 0.772462 0.175826 0.008558 0.024005 0.019149 0.441816 0.453294 0.458294 0.371372
1 Baldwin County 182265 152200 16966 1340 7992 3767 0.835048 0.093084 0.007352 0.043848 0.020668 0.388299 0.386196 0.392968 0.291627
2 Barbour County 27457 12837 12820 107 1387 306 0.467531 0.466912 0.003897 0.050515 0.011145 0.580086 0.636407 0.637309 0.560717
3 Bibb County 22915 17191 5024 22 406 272 0.750207 0.219245 0.000960 0.017718 0.011870 0.421943 0.448712 0.451897 0.388665
4 Blount County 57322 50952 724 115 4626 905 0.888873 0.012630 0.002006 0.080702 0.015788 0.274015 0.263741 0.270876 0.202978
\n", "

5 rows \u00d7 16 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 11, "text": [ " NAME Total White Black Asian Hispanic Other p_White \\\n", "0 Autauga County 54571 42154 9595 467 1310 1045 0.772462 \n", "1 Baldwin County 182265 152200 16966 1340 7992 3767 0.835048 \n", "2 Barbour County 27457 12837 12820 107 1387 306 0.467531 \n", "3 Bibb County 22915 17191 5024 22 406 272 0.750207 \n", "4 Blount County 57322 50952 724 115 4626 905 0.888873 \n", "\n", " p_Black p_Asian p_Hispanic p_Other entropy5 entropy4 entropy_rice \\\n", "0 0.175826 0.008558 0.024005 0.019149 0.441816 0.453294 0.458294 \n", "1 0.093084 0.007352 0.043848 0.020668 0.388299 0.386196 0.392968 \n", "2 0.466912 0.003897 0.050515 0.011145 0.580086 0.636407 0.637309 \n", "3 0.219245 0.000960 0.017718 0.011870 0.421943 0.448712 0.451897 \n", "4 0.012630 0.002006 0.080702 0.015788 0.274015 0.263741 0.270876 \n", "\n", " gini_simpson \n", "0 0.371372 \n", "1 0.291627 \n", "2 0.560717 \n", "3 0.388665 \n", "4 0.202978 \n", "\n", "[5 rows x 16 columns]" ] } ], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "counties_df.sort_index(by='entropy5', ascending=False)[FINAL_LABELS].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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NAMETotalWhiteBlackAsianHispanicOtherp_Whitep_Blackp_Asianp_Hispanicp_Otherentropy5entropy4entropy_ricegini_simpson
1868 Queens County 2230722 616727 395881 508334 613750 96030 0.276470 0.177468 0.227879 0.275135 0.043049 0.925644 0.989171 0.976964 0.762589
68 Aleutians West Census Area 5561 1745 318 1575 726 1197 0.313792 0.057184 0.283222 0.130552 0.215249 0.920216 0.882623 0.829850 0.754673
186 Alameda County 1510271 514559 184126 390524 339889 81173 0.340706 0.121916 0.258579 0.225052 0.053747 0.910834 0.957875 0.944102 0.748656
233 Solano County 413344 168628 58743 59027 99356 27590 0.407960 0.142116 0.142804 0.240371 0.066748 0.897416 0.926901 0.911537 0.730745
67 Aleutians East Borough 3141 425 212 1113 385 1006 0.135307 0.067494 0.354346 0.122572 0.320280 0.896064 0.864996 0.777253 0.733972
\n", "

5 rows \u00d7 16 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ " NAME Total White Black Asian Hispanic \\\n", "1868 Queens County 2230722 616727 395881 508334 613750 \n", "68 Aleutians West Census Area 5561 1745 318 1575 726 \n", "186 Alameda County 1510271 514559 184126 390524 339889 \n", "233 Solano County 413344 168628 58743 59027 99356 \n", "67 Aleutians East Borough 3141 425 212 1113 385 \n", "\n", " Other p_White p_Black p_Asian p_Hispanic p_Other entropy5 \\\n", "1868 96030 0.276470 0.177468 0.227879 0.275135 0.043049 0.925644 \n", "68 1197 0.313792 0.057184 0.283222 0.130552 0.215249 0.920216 \n", "186 81173 0.340706 0.121916 0.258579 0.225052 0.053747 0.910834 \n", "233 27590 0.407960 0.142116 0.142804 0.240371 0.066748 0.897416 \n", "67 1006 0.135307 0.067494 0.354346 0.122572 0.320280 0.896064 \n", "\n", " entropy4 entropy_rice gini_simpson \n", "1868 0.989171 0.976964 0.762589 \n", "68 0.882623 0.829850 0.754673 \n", "186 0.957875 0.944102 0.748656 \n", "233 0.926901 0.911537 0.730745 \n", "67 0.864996 0.777253 0.733972 \n", "\n", "[5 rows x 16 columns]" ] } ], "prompt_number": 12 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "MSAs" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# msas\n", "\n", "r = list(msas(census_labels()))" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "len(r)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 14, "text": [ "1013" ] } ], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "df=DataFrame(r)\n", "df[census_labels(include_name=False)] = df[census_labels(include_name=False)].astype('int')\n", "\n", "msas_grouped = df.groupby('metropolitan statistical area/micropolitan statistical area')\n", "\n", "#df1 = msas_grouped.apply(lambda x:Series((list(x['NAME']), sum(x['P0050001'])), index=['msas','total_pop'])).sort_index(by='total_pop', ascending=False)\n", "df1 = msas_grouped.apply(lambda x:Series((list(x['NAME']), ), \n", " index=['msas']))\n", "\n", "\n", "df2 = msas_grouped.sum()\n", "df3 = pd.concat((df1,df2), axis=1)\n", "df3['NAME'] = df3.apply(lambda x: \"; \".join(x['msas']), axis=1)\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "msas_df = diversity(df3)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "# grab the ten most populous msas and sort by entropy_rice\n", "msas_df.sort_index(by='Total', ascending=False)[:10].sort_index(by='entropy_rice', ascending=False)[FINAL_LABELS]" ], "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", "
NAMETotalWhiteBlackAsianHispanicOtherp_Whitep_Blackp_Asianp_Hispanicp_Otherentropy5entropy4entropy_ricegini_simpson
metropolitan statistical area/micropolitan statistical area
26420 Houston-Sugar Land-Baytown, TX Metro Area 5946800 2360472 998883 384596 2099412 103437 0.396931 0.167970 0.064673 0.353032 0.017394 0.796281 0.876425 0.873618 0.685115
35620 New York-Northern New Jersey-Long Island, NY-N... 18897109 9233812 3044096 1860840 4327560 430801 0.488636 0.161088 0.098472 0.229006 0.022797 0.805286 0.876454 0.872729 0.672625
47900 Washington-Arlington-Alexandria, DC-VA-MD-WV M... 5582170 2711258 1409473 513919 770795 176725 0.485700 0.252496 0.092064 0.138082 0.031659 0.808094 0.864206 0.859318 0.671797
31100 Los Angeles-Long Beach-Santa Ana, CA Metro Area 12828837 4056820 859086 1858148 5700862 353921 0.316227 0.066965 0.144842 0.444379 0.027588 0.798070 0.859159 0.855080 0.676304
19100 Dallas-Fort Worth-Arlington, TX Metro Area 6371773 3201677 941695 337815 1752166 138420 0.502478 0.147792 0.053017 0.274989 0.021724 0.759459 0.824101 0.821697 0.646772
33100 Miami-Fort Lauderdale-Pompano Beach, FL Metro ... 5564635 1937939 1096536 122082 2312929 95149 0.348260 0.197054 0.021939 0.415648 0.017099 0.749136 0.821351 0.819535 0.666348
16980 Chicago-Joliet-Naperville, IL-IN-WI Metro Area... 9461105 5204489 1613644 526857 1957080 159035 0.550093 0.170556 0.055687 0.206855 0.016809 0.736833 0.807444 0.805894 0.622136
12060 Atlanta-Sandy Springs-Marietta, GA Metro Area 5268860 2671757 1679979 252510 547400 117214 0.507084 0.318851 0.047925 0.103893 0.022247 0.729649 0.787682 0.786026 0.627614
37980 Philadelphia-Camden-Wilmington, PA-NJ-DE-MD Me... 5965343 3875845 1204303 293656 468168 123371 0.649727 0.201883 0.049227 0.078481 0.020681 0.640825 0.685528 0.686114 0.528088
14460 Boston-Cambridge-Quincy, MA-NH Metro Area (par... 4552402 3408585 301533 292786 410516 138982 0.748744 0.066236 0.064315 0.090176 0.030529 0.556973 0.565366 0.569788 0.421795
\n", "

10 rows \u00d7 16 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ " NAME \\\n", "metropolitan statistical area/micropolitan statistical area \n", "26420 Houston-Sugar Land-Baytown, TX Metro Area \n", "35620 New York-Northern New Jersey-Long Island, NY-N... \n", "47900 Washington-Arlington-Alexandria, DC-VA-MD-WV M... \n", "31100 Los Angeles-Long Beach-Santa Ana, CA Metro Area \n", "19100 Dallas-Fort Worth-Arlington, TX Metro Area \n", "33100 Miami-Fort Lauderdale-Pompano Beach, FL Metro ... \n", "16980 Chicago-Joliet-Naperville, IL-IN-WI Metro Area... \n", "12060 Atlanta-Sandy Springs-Marietta, GA Metro Area \n", "37980 Philadelphia-Camden-Wilmington, PA-NJ-DE-MD Me... \n", "14460 Boston-Cambridge-Quincy, MA-NH Metro Area (par... \n", "\n", " Total \\\n", "metropolitan statistical area/micropolitan statistical area \n", "26420 5946800 \n", "35620 18897109 \n", "47900 5582170 \n", "31100 12828837 \n", "19100 6371773 \n", "33100 5564635 \n", "16980 9461105 \n", "12060 5268860 \n", "37980 5965343 \n", "14460 4552402 \n", "\n", " White Black \\\n", "metropolitan statistical area/micropolitan statistical area \n", "26420 2360472 998883 \n", "35620 9233812 3044096 \n", "47900 2711258 1409473 \n", "31100 4056820 859086 \n", "19100 3201677 941695 \n", "33100 1937939 1096536 \n", "16980 5204489 1613644 \n", "12060 2671757 1679979 \n", "37980 3875845 1204303 \n", "14460 3408585 301533 \n", "\n", " Asian \\\n", "metropolitan statistical area/micropolitan statistical area \n", "26420 384596 \n", "35620 1860840 \n", "47900 513919 \n", "31100 1858148 \n", "19100 337815 \n", "33100 122082 \n", "16980 526857 \n", "12060 252510 \n", "37980 293656 \n", "14460 292786 \n", "\n", " Hispanic Other \\\n", "metropolitan statistical area/micropolitan statistical area \n", "26420 2099412 103437 \n", "35620 4327560 430801 \n", "47900 770795 176725 \n", "31100 5700862 353921 \n", "19100 1752166 138420 \n", "33100 2312929 95149 \n", "16980 1957080 159035 \n", "12060 547400 117214 \n", "37980 468168 123371 \n", "14460 410516 138982 \n", "\n", " p_White \\\n", "metropolitan statistical area/micropolitan statistical area \n", "26420 0.396931 \n", "35620 0.488636 \n", "47900 0.485700 \n", "31100 0.316227 \n", "19100 0.502478 \n", "33100 0.348260 \n", "16980 0.550093 \n", "12060 0.507084 \n", "37980 0.649727 \n", "14460 0.748744 \n", "\n", " p_Black \\\n", "metropolitan statistical area/micropolitan statistical area \n", "26420 0.167970 \n", "35620 0.161088 \n", "47900 0.252496 \n", "31100 0.066965 \n", "19100 0.147792 \n", "33100 0.197054 \n", "16980 0.170556 \n", "12060 0.318851 \n", "37980 0.201883 \n", "14460 0.066236 \n", "\n", " p_Asian \\\n", "metropolitan statistical area/micropolitan statistical area \n", "26420 0.064673 \n", "35620 0.098472 \n", "47900 0.092064 \n", "31100 0.144842 \n", "19100 0.053017 \n", "33100 0.021939 \n", "16980 0.055687 \n", "12060 0.047925 \n", "37980 0.049227 \n", "14460 0.064315 \n", "\n", " p_Hispanic \\\n", "metropolitan statistical area/micropolitan statistical area \n", "26420 0.353032 \n", "35620 0.229006 \n", "47900 0.138082 \n", "31100 0.444379 \n", "19100 0.274989 \n", "33100 0.415648 \n", "16980 0.206855 \n", "12060 0.103893 \n", "37980 0.078481 \n", "14460 0.090176 \n", "\n", " p_Other \\\n", "metropolitan statistical area/micropolitan statistical area \n", "26420 0.017394 \n", "35620 0.022797 \n", "47900 0.031659 \n", "31100 0.027588 \n", "19100 0.021724 \n", "33100 0.017099 \n", "16980 0.016809 \n", "12060 0.022247 \n", "37980 0.020681 \n", "14460 0.030529 \n", "\n", " entropy5 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "26420 0.796281 \n", "35620 0.805286 \n", "47900 0.808094 \n", "31100 0.798070 \n", "19100 0.759459 \n", "33100 0.749136 \n", "16980 0.736833 \n", "12060 0.729649 \n", "37980 0.640825 \n", "14460 0.556973 \n", "\n", " entropy4 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "26420 0.876425 \n", "35620 0.876454 \n", "47900 0.864206 \n", "31100 0.859159 \n", "19100 0.824101 \n", "33100 0.821351 \n", "16980 0.807444 \n", "12060 0.787682 \n", "37980 0.685528 \n", "14460 0.565366 \n", "\n", " entropy_rice \\\n", "metropolitan statistical area/micropolitan statistical area \n", "26420 0.873618 \n", "35620 0.872729 \n", "47900 0.859318 \n", "31100 0.855080 \n", "19100 0.821697 \n", "33100 0.819535 \n", "16980 0.805894 \n", "12060 0.786026 \n", "37980 0.686114 \n", "14460 0.569788 \n", "\n", " gini_simpson \n", "metropolitan statistical area/micropolitan statistical area \n", "26420 0.685115 \n", "35620 0.672625 \n", "47900 0.671797 \n", "31100 0.676304 \n", "19100 0.646772 \n", "33100 0.666348 \n", "16980 0.622136 \n", "12060 0.627614 \n", "37980 0.528088 \n", "14460 0.421795 \n", "\n", "[10 rows x 16 columns]" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "# Testing code\n", "\n", "def to_unicode(vals):\n", " return [unicode(v) for v in vals]\n", "\n", "def test_msas_df(msas_df):\n", "\n", " min_set_of_columns = set(['Asian','Black','Hispanic', 'Other', 'Total', 'White',\n", " 'entropy4', 'entropy5', 'entropy_rice', 'gini_simpson','p_Asian', 'p_Black',\n", " 'p_Hispanic', 'p_Other','p_White']) \n", " \n", " assert min_set_of_columns & set(msas_df.columns) == min_set_of_columns\n", " \n", " # https://www.census.gov/geo/maps-data/data/tallies/national_geo_tallies.html\n", " # 366 metro areas\n", " # 576 micropolitan areas\n", " \n", " assert len(msas_df) == 942 \n", " \n", " # total number of people in metro/micro areas\n", " \n", " assert msas_df.Total.sum() == 289261315\n", " assert msas_df['White'].sum() == 180912856\n", " assert msas_df['Other'].sum() == 8540181\n", " \n", " # list of msas in descendng order by entropy_rice \n", " top_10_metros = msas_df.sort_index(by='Total', ascending=False)[:10]\n", " msa_codes_in_top_10_pop_sorted_by_entropy_rice = list(top_10_metros.sort_index(by='entropy_rice', \n", " ascending=False).index) \n", " \n", " assert to_unicode(msa_codes_in_top_10_pop_sorted_by_entropy_rice)== [u'26420', u'35620', u'47900', u'31100', u'19100', \n", " u'33100', u'16980', u'12060', u'37980', u'14460']\n", "\n", "\n", " top_10_metro = msas_df.sort_index(by='Total', ascending=False)[:10]\n", " \n", " list(top_10_metro.sort_index(by='entropy_rice', ascending=False)['entropy5'])\n", " \n", " np.testing.assert_allclose(top_10_metro.sort_index(by='entropy_rice', ascending=False)['entropy5'], \n", " [0.79628076626851163, 0.80528601550164602, 0.80809418318973791, 0.7980698349711991,\n", " 0.75945930510650161, 0.74913610558765376, 0.73683277781032397, 0.72964862063970914,\n", " 0.64082509648457675, 0.55697288400004963])\n", " \n", " np.testing.assert_allclose(top_10_metro.sort_index(by='entropy_rice', ascending=False)['entropy_rice'],\n", " [0.87361766576115552,\n", " 0.87272877244078051,\n", " 0.85931803868749834,\n", " 0.85508015237749468,\n", " 0.82169723530719896,\n", " 0.81953527301129059,\n", " 0.80589423784325431,\n", " 0.78602596561378812,\n", " 0.68611350427640316,\n", " 0.56978827050565117])\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 18 }, { "cell_type": "code", "collapsed": false, "input": [ "# you are on the right track if test_msas_df doesn't complain\n", "test_msas_df(msas_df)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "# code to save your dataframe to a CSV\n", "# upload the CSV to bCourses\n", "# uncomment to run\n", "# msas_df.to_csv(\"msas_2010.csv\", encoding=\"UTF-8\")" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "# load back the CSV and test again\n", "# df = DataFrame.from_csv(\"msas_2010.csv\", encoding=\"UTF-8\")\n", "# test_msas_df(df)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 21 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Appendix: what if used all the P005 categories?" ] }, { "cell_type": "code", "collapsed": false, "input": [ "all_categories = census_labels('P005',2,10, include_name=False) + \\\n", " census_labels('P005',11,17, include_name=False)\n", "all_categories" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 22, "text": [ "['P0050002',\n", " 'P0050003',\n", " 'P0050004',\n", " 'P0050005',\n", " 'P0050006',\n", " 'P0050007',\n", " 'P0050008',\n", " 'P0050009',\n", " 'P0050010',\n", " 'P0050011',\n", " 'P0050012',\n", " 'P0050013',\n", " 'P0050014',\n", " 'P0050015',\n", " 'P0050016',\n", " 'P0050017']" ] } ], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "msas_df['entropy_all'] = msas_df.apply(lambda x:entropy(x[all_categories]), axis=1)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 23 }, { "cell_type": "code", "collapsed": false, "input": [ "msas_df.sort_index(by='entropy_all', ascending=False)[FINAL_LABELS + ['entropy_all']][:20]" ], "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
NAMETotalWhiteBlackAsianHispanicOtherp_Whitep_Blackp_Asianp_Hispanicp_Otherentropy5entropy4entropy_ricegini_simpsonentropy_all
metropolitan statistical area/micropolitan statistical area
44700 Stockton, CA Metro Area 685306 245919 48540 94547 266341 29959 0.358846 0.070830 0.137963 0.388645 0.043716 0.828052 0.869824 0.862634 0.694223 0.695439
31100 Los Angeles-Long Beach-Santa Ana, CA Metro Area 12828837 4056820 859086 1858148 5700862 353921 0.316227 0.066965 0.144842 0.444379 0.027588 0.798070 0.859159 0.855080 0.676304 0.689053
23420 Fresno, CA Metro Area 930450 304522 45005 86856 468070 25997 0.327285 0.048369 0.093348 0.503058 0.027940 0.732562 0.780302 0.778371 0.627984 0.685842
40140 Riverside-San Bernardino-Ontario, CA Metro Area 4224851 1546666 301523 249899 1996402 130361 0.366088 0.071369 0.059150 0.472538 0.030856 0.736344 0.779591 0.777447 0.633143 0.680298
25260 Hanford-Corcoran, CA Metro Area 152982 53879 10314 5339 77866 5584 0.352192 0.067420 0.034900 0.508988 0.036501 0.702746 0.729483 0.728699 0.609796 0.676985
32900 Merced, CA Metro Area 255793 81599 8785 18183 140485 6741 0.319004 0.034344 0.071085 0.549214 0.026353 0.679215 0.719629 0.719421 0.589674 0.675128
41500 Salinas, CA Metro Area 415057 136435 11300 23777 230003 13542 0.328714 0.027225 0.057286 0.554148 0.032627 0.662618 0.688024 0.688723 0.579780 0.672056
46700 Vallejo-Fairfield, CA Metro Area 413344 168628 58743 59027 99356 27590 0.407960 0.142116 0.142804 0.240371 0.066748 0.897416 0.926901 0.911537 0.730745 0.670699
12540 Bakersfield-Delano, CA Metro Area 839631 323794 45377 33100 413033 24327 0.385638 0.054044 0.039422 0.491922 0.028973 0.686088 0.722859 0.722509 0.603981 0.668019
26420 Houston-Sugar Land-Baytown, TX Metro Area 5946800 2360472 998883 384596 2099412 103437 0.396931 0.167970 0.064673 0.353032 0.017394 0.796281 0.876425 0.873618 0.685115 0.661636
31460 Madera-Chowchilla, CA Metro Area 150865 57380 5009 2533 80992 4951 0.380340 0.033202 0.016790 0.536851 0.032817 0.618488 0.634707 0.637158 0.564671 0.659675
17500 Clewiston, FL Micro Area 39140 13650 5057 275 19243 915 0.348748 0.129203 0.007026 0.491645 0.023378 0.685630 0.733128 0.732653 0.619370 0.658762
10740 Albuquerque, NM Metro Area 887077 374214 19766 16769 414222 62106 0.421851 0.022282 0.018904 0.466952 0.070012 0.662122 0.629810 0.634408 0.598243 0.658328
29820 Las Vegas-Paradise, NV Metro Area 1951269 935955 194821 165121 568644 86728 0.479665 0.099843 0.084622 0.291423 0.044447 0.800982 0.835903 0.830088 0.665889 0.654037
33700 Modesto, CA Metro Area 514453 240423 13065 24712 215658 20595 0.467337 0.025396 0.048035 0.419199 0.040033 0.675950 0.691203 0.691824 0.601313 0.653970
24380 Grants, NM Micro Area 27213 5857 221 136 9934 11065 0.215228 0.008121 0.004998 0.365046 0.406607 0.702078 0.552323 0.551140 0.654998 0.652172
41740 San Diego-Carlsbad-San Marcos, CA Metro Area 3095313 1500047 146600 328058 991348 129260 0.484619 0.047362 0.105985 0.320274 0.041760 0.764654 0.795817 0.792070 0.647349 0.652044
41940 San Jose-Sunnyvale-Santa Clara, CA Metro Area 1836911 648063 42686 566764 510396 69002 0.352800 0.023238 0.308542 0.277856 0.037564 0.805816 0.852024 0.846600 0.701179 0.649439
47300 Visalia-Porterville, CA Metro Area 442179 143935 5497 14204 268065 10478 0.325513 0.012432 0.032123 0.606236 0.023696 0.573133 0.598715 0.601417 0.524771 0.647226
41860 San Francisco-Oakland-Fremont, CA Metro Area 4335391 1840372 349895 994616 938794 211714 0.424500 0.080707 0.229418 0.216542 0.048834 0.859532 0.901183 0.891526 0.711379 0.645037
\n", "

20 rows \u00d7 17 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 24, "text": [ " NAME \\\n", "metropolitan statistical area/micropolitan statistical area \n", "44700 Stockton, CA Metro Area \n", "31100 Los Angeles-Long Beach-Santa Ana, CA Metro Area \n", "23420 Fresno, CA Metro Area \n", "40140 Riverside-San Bernardino-Ontario, CA Metro Area \n", "25260 Hanford-Corcoran, CA Metro Area \n", "32900 Merced, CA Metro Area \n", "41500 Salinas, CA Metro Area \n", "46700 Vallejo-Fairfield, CA Metro Area \n", "12540 Bakersfield-Delano, CA Metro Area \n", "26420 Houston-Sugar Land-Baytown, TX Metro Area \n", "31460 Madera-Chowchilla, CA Metro Area \n", "17500 Clewiston, FL Micro Area \n", "10740 Albuquerque, NM Metro Area \n", "29820 Las Vegas-Paradise, NV Metro Area \n", "33700 Modesto, CA Metro Area \n", "24380 Grants, NM Micro Area \n", "41740 San Diego-Carlsbad-San Marcos, CA Metro Area \n", "41940 San Jose-Sunnyvale-Santa Clara, CA Metro Area \n", "47300 Visalia-Porterville, CA Metro Area \n", "41860 San Francisco-Oakland-Fremont, CA Metro Area \n", "\n", " Total \\\n", "metropolitan statistical area/micropolitan statistical area \n", "44700 685306 \n", "31100 12828837 \n", "23420 930450 \n", "40140 4224851 \n", "25260 152982 \n", "32900 255793 \n", "41500 415057 \n", "46700 413344 \n", "12540 839631 \n", "26420 5946800 \n", "31460 150865 \n", "17500 39140 \n", "10740 887077 \n", "29820 1951269 \n", "33700 514453 \n", "24380 27213 \n", "41740 3095313 \n", "41940 1836911 \n", "47300 442179 \n", "41860 4335391 \n", "\n", " White Black \\\n", "metropolitan statistical area/micropolitan statistical area \n", "44700 245919 48540 \n", "31100 4056820 859086 \n", "23420 304522 45005 \n", "40140 1546666 301523 \n", "25260 53879 10314 \n", "32900 81599 8785 \n", "41500 136435 11300 \n", "46700 168628 58743 \n", "12540 323794 45377 \n", "26420 2360472 998883 \n", "31460 57380 5009 \n", "17500 13650 5057 \n", "10740 374214 19766 \n", "29820 935955 194821 \n", "33700 240423 13065 \n", "24380 5857 221 \n", "41740 1500047 146600 \n", "41940 648063 42686 \n", "47300 143935 5497 \n", "41860 1840372 349895 \n", "\n", " Asian \\\n", "metropolitan statistical area/micropolitan statistical area \n", "44700 94547 \n", "31100 1858148 \n", "23420 86856 \n", "40140 249899 \n", "25260 5339 \n", "32900 18183 \n", "41500 23777 \n", "46700 59027 \n", "12540 33100 \n", "26420 384596 \n", "31460 2533 \n", "17500 275 \n", "10740 16769 \n", "29820 165121 \n", "33700 24712 \n", "24380 136 \n", "41740 328058 \n", "41940 566764 \n", "47300 14204 \n", "41860 994616 \n", "\n", " Hispanic Other \\\n", "metropolitan statistical area/micropolitan statistical area \n", "44700 266341 29959 \n", "31100 5700862 353921 \n", "23420 468070 25997 \n", "40140 1996402 130361 \n", "25260 77866 5584 \n", "32900 140485 6741 \n", "41500 230003 13542 \n", "46700 99356 27590 \n", "12540 413033 24327 \n", "26420 2099412 103437 \n", "31460 80992 4951 \n", "17500 19243 915 \n", "10740 414222 62106 \n", "29820 568644 86728 \n", "33700 215658 20595 \n", "24380 9934 11065 \n", "41740 991348 129260 \n", "41940 510396 69002 \n", "47300 268065 10478 \n", "41860 938794 211714 \n", "\n", " p_White \\\n", "metropolitan statistical area/micropolitan statistical area \n", "44700 0.358846 \n", "31100 0.316227 \n", "23420 0.327285 \n", "40140 0.366088 \n", "25260 0.352192 \n", "32900 0.319004 \n", "41500 0.328714 \n", "46700 0.407960 \n", "12540 0.385638 \n", "26420 0.396931 \n", "31460 0.380340 \n", "17500 0.348748 \n", "10740 0.421851 \n", "29820 0.479665 \n", "33700 0.467337 \n", "24380 0.215228 \n", "41740 0.484619 \n", "41940 0.352800 \n", "47300 0.325513 \n", "41860 0.424500 \n", "\n", " p_Black \\\n", "metropolitan statistical area/micropolitan statistical area \n", "44700 0.070830 \n", "31100 0.066965 \n", "23420 0.048369 \n", "40140 0.071369 \n", "25260 0.067420 \n", "32900 0.034344 \n", "41500 0.027225 \n", "46700 0.142116 \n", "12540 0.054044 \n", "26420 0.167970 \n", "31460 0.033202 \n", "17500 0.129203 \n", "10740 0.022282 \n", "29820 0.099843 \n", "33700 0.025396 \n", "24380 0.008121 \n", "41740 0.047362 \n", "41940 0.023238 \n", "47300 0.012432 \n", "41860 0.080707 \n", "\n", " p_Asian \\\n", "metropolitan statistical area/micropolitan statistical area \n", "44700 0.137963 \n", "31100 0.144842 \n", "23420 0.093348 \n", "40140 0.059150 \n", "25260 0.034900 \n", "32900 0.071085 \n", "41500 0.057286 \n", "46700 0.142804 \n", "12540 0.039422 \n", "26420 0.064673 \n", "31460 0.016790 \n", "17500 0.007026 \n", "10740 0.018904 \n", "29820 0.084622 \n", "33700 0.048035 \n", "24380 0.004998 \n", "41740 0.105985 \n", "41940 0.308542 \n", "47300 0.032123 \n", "41860 0.229418 \n", "\n", " p_Hispanic \\\n", "metropolitan statistical area/micropolitan statistical area \n", "44700 0.388645 \n", "31100 0.444379 \n", "23420 0.503058 \n", "40140 0.472538 \n", "25260 0.508988 \n", "32900 0.549214 \n", "41500 0.554148 \n", "46700 0.240371 \n", "12540 0.491922 \n", "26420 0.353032 \n", "31460 0.536851 \n", "17500 0.491645 \n", "10740 0.466952 \n", "29820 0.291423 \n", "33700 0.419199 \n", "24380 0.365046 \n", "41740 0.320274 \n", "41940 0.277856 \n", "47300 0.606236 \n", "41860 0.216542 \n", "\n", " p_Other \\\n", "metropolitan statistical area/micropolitan statistical area \n", "44700 0.043716 \n", "31100 0.027588 \n", "23420 0.027940 \n", "40140 0.030856 \n", "25260 0.036501 \n", "32900 0.026353 \n", "41500 0.032627 \n", "46700 0.066748 \n", "12540 0.028973 \n", "26420 0.017394 \n", "31460 0.032817 \n", "17500 0.023378 \n", "10740 0.070012 \n", "29820 0.044447 \n", "33700 0.040033 \n", "24380 0.406607 \n", "41740 0.041760 \n", "41940 0.037564 \n", "47300 0.023696 \n", "41860 0.048834 \n", "\n", " entropy5 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "44700 0.828052 \n", "31100 0.798070 \n", "23420 0.732562 \n", "40140 0.736344 \n", "25260 0.702746 \n", "32900 0.679215 \n", "41500 0.662618 \n", "46700 0.897416 \n", "12540 0.686088 \n", "26420 0.796281 \n", "31460 0.618488 \n", "17500 0.685630 \n", "10740 0.662122 \n", "29820 0.800982 \n", "33700 0.675950 \n", "24380 0.702078 \n", "41740 0.764654 \n", "41940 0.805816 \n", "47300 0.573133 \n", "41860 0.859532 \n", "\n", " entropy4 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "44700 0.869824 \n", "31100 0.859159 \n", "23420 0.780302 \n", "40140 0.779591 \n", "25260 0.729483 \n", "32900 0.719629 \n", "41500 0.688024 \n", "46700 0.926901 \n", "12540 0.722859 \n", "26420 0.876425 \n", "31460 0.634707 \n", "17500 0.733128 \n", "10740 0.629810 \n", "29820 0.835903 \n", "33700 0.691203 \n", "24380 0.552323 \n", "41740 0.795817 \n", "41940 0.852024 \n", "47300 0.598715 \n", "41860 0.901183 \n", "\n", " entropy_rice \\\n", "metropolitan statistical area/micropolitan statistical area \n", "44700 0.862634 \n", "31100 0.855080 \n", "23420 0.778371 \n", "40140 0.777447 \n", "25260 0.728699 \n", "32900 0.719421 \n", "41500 0.688723 \n", "46700 0.911537 \n", "12540 0.722509 \n", "26420 0.873618 \n", "31460 0.637158 \n", "17500 0.732653 \n", "10740 0.634408 \n", "29820 0.830088 \n", "33700 0.691824 \n", "24380 0.551140 \n", "41740 0.792070 \n", "41940 0.846600 \n", "47300 0.601417 \n", "41860 0.891526 \n", "\n", " gini_simpson \\\n", "metropolitan statistical area/micropolitan statistical area \n", "44700 0.694223 \n", "31100 0.676304 \n", "23420 0.627984 \n", "40140 0.633143 \n", "25260 0.609796 \n", "32900 0.589674 \n", "41500 0.579780 \n", "46700 0.730745 \n", "12540 0.603981 \n", "26420 0.685115 \n", "31460 0.564671 \n", "17500 0.619370 \n", "10740 0.598243 \n", "29820 0.665889 \n", "33700 0.601313 \n", "24380 0.654998 \n", "41740 0.647349 \n", "41940 0.701179 \n", "47300 0.524771 \n", "41860 0.711379 \n", "\n", " entropy_all \n", "metropolitan statistical area/micropolitan statistical area \n", "44700 0.695439 \n", "31100 0.689053 \n", "23420 0.685842 \n", "40140 0.680298 \n", "25260 0.676985 \n", "32900 0.675128 \n", "41500 0.672056 \n", "46700 0.670699 \n", "12540 0.668019 \n", "26420 0.661636 \n", "31460 0.659675 \n", "17500 0.658762 \n", "10740 0.658328 \n", "29820 0.654037 \n", "33700 0.653970 \n", "24380 0.652172 \n", "41740 0.652044 \n", "41940 0.649439 \n", "47300 0.647226 \n", "41860 0.645037 \n", "\n", "[20 rows x 17 columns]" ] } ], "prompt_number": 24 }, { "cell_type": "code", "collapsed": false, "input": [ "msas_df.sort_index(by='P0050001', ascending=False).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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
msasP0050001P0050002P0050003P0050004P0050005P0050006P0050007P0050008P0050009P0050010P0050011P0050012P0050013P0050014P0050015P0050016P0050017NAMETotal
metropolitan statistical area/micropolitan statistical area
35620 [New York-Northern New Jersey-Long Island, NY-... 18897109 14569549 9233812 3044096 31377 1860840 4859 93753 300812 4327560 1943852 318520 61255 17421 3729 1670891 311892 New York-Northern New Jersey-Long Island, NY-N... 18897109...
31100 [Los Angeles-Long Beach-Santa Ana, CA Metro Area] 12828837 7127975 4056820 859086 25102 1858148 30821 30960 267038 5700862 2710537 48532 65858 26521 4627 2545313 299474 Los Angeles-Long Beach-Santa Ana, CA Metro Area 12828837...
16980 [Chicago-Joliet-Naperville, IL-IN-WI Metro Are... 9461105 7504025 5204489 1613644 12777 526857 1975 13026 131257 1957080 979392 32349 23748 5944 986 815750 98911 Chicago-Joliet-Naperville, IL-IN-WI Metro Area... 9461105...
19100 [Dallas-Fort Worth-Arlington, TX Metro Area] 6371773 4619607 3201677 941695 24758 337815 5431 9049 99182 1752166 959603 20176 18632 3688 765 668721 80581 Dallas-Fort Worth-Arlington, TX Metro Area 6371773...
37980 [Philadelphia-Camden-Wilmington, PA-NJ-DE-MD M... 5965343 5497175 3875845 1204303 9541 293656 1563 10971 101296 468168 192506 37477 6799 2110 653 191036 37587 Philadelphia-Camden-Wilmington, PA-NJ-DE-MD Me... 5965343...
\n", "

5 rows \u00d7 35 columns

\n", "
" ], "metadata": {}, "output_type": "pyout", "prompt_number": 25, "text": [ " msas \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 [New York-Northern New Jersey-Long Island, NY-... \n", "31100 [Los Angeles-Long Beach-Santa Ana, CA Metro Area] \n", "16980 [Chicago-Joliet-Naperville, IL-IN-WI Metro Are... \n", "19100 [Dallas-Fort Worth-Arlington, TX Metro Area] \n", "37980 [Philadelphia-Camden-Wilmington, PA-NJ-DE-MD M... \n", "\n", " P0050001 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 18897109 \n", "31100 12828837 \n", "16980 9461105 \n", "19100 6371773 \n", "37980 5965343 \n", "\n", " P0050002 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 14569549 \n", "31100 7127975 \n", "16980 7504025 \n", "19100 4619607 \n", "37980 5497175 \n", "\n", " P0050003 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 9233812 \n", "31100 4056820 \n", "16980 5204489 \n", "19100 3201677 \n", "37980 3875845 \n", "\n", " P0050004 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 3044096 \n", "31100 859086 \n", "16980 1613644 \n", "19100 941695 \n", "37980 1204303 \n", "\n", " P0050005 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 31377 \n", "31100 25102 \n", "16980 12777 \n", "19100 24758 \n", "37980 9541 \n", "\n", " P0050006 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 1860840 \n", "31100 1858148 \n", "16980 526857 \n", "19100 337815 \n", "37980 293656 \n", "\n", " P0050007 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 4859 \n", "31100 30821 \n", "16980 1975 \n", "19100 5431 \n", "37980 1563 \n", "\n", " P0050008 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 93753 \n", "31100 30960 \n", "16980 13026 \n", "19100 9049 \n", "37980 10971 \n", "\n", " P0050009 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 300812 \n", "31100 267038 \n", "16980 131257 \n", "19100 99182 \n", "37980 101296 \n", "\n", " P0050010 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 4327560 \n", "31100 5700862 \n", "16980 1957080 \n", "19100 1752166 \n", "37980 468168 \n", "\n", " P0050011 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 1943852 \n", "31100 2710537 \n", "16980 979392 \n", "19100 959603 \n", "37980 192506 \n", "\n", " P0050012 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 318520 \n", "31100 48532 \n", "16980 32349 \n", "19100 20176 \n", "37980 37477 \n", "\n", " P0050013 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 61255 \n", "31100 65858 \n", "16980 23748 \n", "19100 18632 \n", "37980 6799 \n", "\n", " P0050014 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 17421 \n", "31100 26521 \n", "16980 5944 \n", "19100 3688 \n", "37980 2110 \n", "\n", " P0050015 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 3729 \n", "31100 4627 \n", "16980 986 \n", "19100 765 \n", "37980 653 \n", "\n", " P0050016 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 1670891 \n", "31100 2545313 \n", "16980 815750 \n", "19100 668721 \n", "37980 191036 \n", "\n", " P0050017 \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 311892 \n", "31100 299474 \n", "16980 98911 \n", "19100 80581 \n", "37980 37587 \n", "\n", " NAME \\\n", "metropolitan statistical area/micropolitan statistical area \n", "35620 New York-Northern New Jersey-Long Island, NY-N... \n", "31100 Los Angeles-Long Beach-Santa Ana, CA Metro Area \n", "16980 Chicago-Joliet-Naperville, IL-IN-WI Metro Area... \n", "19100 Dallas-Fort Worth-Arlington, TX Metro Area \n", "37980 Philadelphia-Camden-Wilmington, PA-NJ-DE-MD Me... \n", "\n", " Total \n", "metropolitan statistical area/micropolitan statistical area \n", "35620 18897109 ... \n", "31100 12828837 ... \n", "16980 9461105 ... \n", "19100 6371773 ... \n", "37980 5965343 ... \n", "\n", "[5 rows x 35 columns]" ] } ], "prompt_number": 25 }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Plot courtesy of AJ" ] }, { "cell_type": "code", "collapsed": false, "input": [ "top_10_metros = msas_df.sort_index(by='Total', ascending=False)[:10]\n", "top_10_metros['City'] = top_10_metros['NAME'].apply(lambda name: name.split('-')[0])\n", "top_10_metros.sort(columns=['entropy_rice'], inplace=True, ascending=True)\n", "\n", "cities = pd.Series(top_10_metros['City'])\n", "\n", "diversity = pd.Series(top_10_metros['entropy_rice'])\n", "\n", "p_white = pd.Series(top_10_metros['p_White'])\n", "p_asian = pd.Series(top_10_metros['p_Asian'])\n", "p_black = pd.Series(top_10_metros['p_Black'])\n", "p_latino = pd.Series(top_10_metros['p_Hispanic'])" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 26 }, { "cell_type": "code", "collapsed": false, "input": [ "import matplotlib.pyplot as plt\n", "\n", "fig = plt.figure(figsize=(10, 8))\n", "ax = plt.subplot(111)\n", "\n", "# y axis locations for diversity and races\n", "y_div = np.arange(len(cities))*2\n", "y_race = (np.arange(len(cities))*2)+1\n", "\n", "# diversity bars\n", "pDiversity = ax.barh(y_div, diversity, alpha=0.4)\n", "\n", "# stacked horizontal bars\n", "pWhite = ax.barh(y_race, p_white, color='b')\n", "pLatino = ax.barh(y_race, p_latino, color='g', left=p_white)\n", "pBlack = ax.barh(y_race, p_black, color='r', left=p_white+p_latino)\n", "pAsian = ax.barh(y_race, p_asian, color='c', left=p_white+p_latino+p_black)\n", "\n", "plt.yticks(y_race, cities)\n", "\n", "# legend foo https://stackoverflow.com/questions/4700614/how-to-put-the-legend-out-of-the-plot\n", "# Shink current axis's height by 10% on the bottom\n", "box = ax.get_position()\n", "ax.set_position([box.x0, box.y0 + box.height * 0.1,\n", " box.width, box.height * 0.85])\n", "\n", "# Put a legend below current axis\n", "ax.legend((pWhite, pLatino, pBlack, pAsian, pDiversity), ('White', 'Latino', 'Black', 'Asian', 'Diversity'),\n", " loc='upper center', bbox_to_anchor=(0.5, -0.05),\n", " fancybox=True, shadow=True, ncol=5)\n", "\n", "plt.show()\n", "\n", "# If you want to save it" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "display_data", "png": "iVBORw0KGgoAAAANSUhEUgAAAoIAAAG5CAYAAAAapVXmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4VFX+x/HPzSREwEAAidIMVYmkQgwlJEywgFJEFJDe\nlqisGKyLuK7J7rrqCusKukrQlSICitIVdtUMEKoiHcWCCYiglITQSbm/P1jmRyAVktwJ9/16njxP\n5s6553znXpj55Jw7M4ZpmqYAAABgO15WFwAAAABrEAQBAABsiiAIAABgUwRBAAAAmyIIAgAA2BRB\nEAAAwKa8rS7Ak4WHh2vLli1WlwEAAFCssLAwbd68uVT7GHyOYOEMwxCHp3JKTExUYmKi1WXgMnH+\nKi/OXeXG+avcLie3sDQMAABgUwRBAAAAm2JpuAiGYVhdAmAvXpLyrC4C8Bw+krKtLsKOHA4pN9fq\nKtz8/P2VlZFRbLvLWRomCBbhXBDk8AAVx5ASra4B8CCJvApZwZCklBSry/h/cXElCnhcIwgAAIAS\nIwgCAADYFEEQAADApgiCAAAANkUQBAAAsCmCIAAAgE0RBAEAAGyKIAgAAGBTFRoEr7322ny3p02b\npjFjxpTpGH/729/KtD8AAICrVYUGwYu/sq08vsLtxRdfLPM+AQAArkaWLg1f+DUoaWlp6ty5s8LC\nwnT77bdr7969kqRhw4bpo48+crc7P6u4f/9+xcbGKiIiQiEhIUpNTdW4ceN06tQpRUREaPDgwZKk\nf/zjHwoJCVFISIhee+0191hBQUGKj49XcHCwunTpotOnT1fUwwYAAPAIFRoEz4e08z/PP/+8e1Zw\nzJgxGj58uLZs2aKBAwfq0UcflVT4LOL777+vrl27atOmTdqyZYvCw8P10ksvqWrVqtq0aZNmzpyp\njRs3atq0adqwYYPWrVunqVOnavPmzZKkH374QY888oi2b98uf3//fGETAADADrwrcrDzIe286dOn\n66uvvpIkrVu3TgsWLJAkDRo0SE8//XSRfUVFRWnEiBHKzs5Wr169FBYWdkmb1NRU9e7dW1WrVpUk\n9e7dW6tWrVLPnj3VpEkThYaGSpLatGmjtLS0sniIAAAAlUaFBsGLXbg0XNBtSfL29lZeXp4kKS8v\nT2fPnpUkxcTEaNWqVVqyZImGDRumxx9/3L0cfJ5hGPn6NE3TPaPo6+vr3u5wOHTq1KlCqiz76xgB\nFMJLUqLVRQCew0e8ClnC4ZDi4qyuws3P37/A7S6XSy6X64r6tjQIXqhDhw6aM2eOBg0apFmzZik2\nNlaS1LhxY23cuFF9+vTRokWLlJ2dLUnas2ePGjRooN/97nc6ffq0Nm3apMGDB8vHx0c5OTny9vZW\nTEyMhg0bpnHjxikvL08LFizQe++9V2DgLExp2gIAAFQUp9Mpp9Ppvp2UlFTqPio0CBZ0vd/5bZMn\nT9bw4cP1yiuvKCAgQO+++64kadSoUbrnnnsUHh6url27ut8skpKSogkTJsjHx0d+fn6aMWOGJCk+\nPl6hoaFq06aNZs6cqWHDhikqKsrdV1hYmNLS0irkHcwAAACezDCZ8irUxUvLAAAAnupycovHLA17\nqmefTba6BAAA8D8BAb5KSBhqdRlXDYJgMQID460uAQAA/E96OhM0ZYnvGgYAALApgiAAAIBNEQQB\nAABsiiAIAABgUwRBAAAAmyIIAgAA2BRBEAAAwKYIggAAADZFEAQAALApgiAAAIBNEQQBAABsiiAI\nAABgUwRBAAAAm/K2ugBPl56ebHUJAADgfwICfK0u4apimKZpWl2EpzIMQxweAABQGVxObmFpGAAA\nwKYIggAAADbFNYLFMAzD6hIAVEZekvKsLgJW8ZGUbXURduBwSLm5VldRLvz8/ZWVkVHu43CNYBHO\nhUAOD4DLYUiJVtcAyyTy6lERDElKSbG6jPIRF1fq6/24RhAAAAAlRhAEAACwKYIgAACATREEAQAA\nbIogCAAAYFMEQQAAAJsiCAIAANgUQRAAAMCmyi0Ienl56cknn3TfnjBhgpKSksqk79OnTysoKEjb\nt293b3vllVf00EMPlWj/xMRETZw4sUxqAQAAqKzKLQhWqVJF8+fP1+HDhyWV7Ve1XXPNNfrnP/+p\n0aNHS5L27dunKVOm6OWXXy5235ycHL42DgAAQOUYBH18fBQfH69XX331kvsOHjyo+++/X1FRUYqK\nitKaNWskSaGhocrKypJpmqpTp45mzpwpSRoyZIg+++yzfH106dJF9erV0/Tp0/XYY48pKSlJGRkZ\n6ty5s8LCwnT77bdr7969kqRhw4bpoYceUrt27fSHP/whXz9Tp07V3XffrdOnT5fHYQAAAPBY5XqN\n4OjRozVr1ixlZWXl256QkKDHHntMGzZs0Lx58/S73/1OkhQdHa3U1FTt2LFDzZo1U2pqqiRp3bp1\nio6OvqT/f/7zn3r22Wd1+PBhDRw4UGPGjNHw4cO1ZcsWDRw4UI8++qi77S+//KK1a9fmWxJ+/fXX\n9cknn2jhwoW65ppryuMQAAAAeCzv8uzcz89PQ4YM0aRJk1S1alX39s8++0zffPON+/axY8d04sQJ\nxcTEaOXKlQoMDNTDDz+s5ORk/fLLL6pVq1a+/c+rV6+ebrvtNvXo0UPSucC4YMECSdKgQYP09NNP\nSzq3LN2nTx/3krBpmpoxY4YaNWqkhQsXyuFwlNsxAAAA8FTlGgQlaezYsWrdurWGDx/u3maaptav\nX68qVarkaxsbG6vXX39djRs31gsvvKD58+dr3rx5io2NLbR/Ly8veXn9/8SmaZoFtqtWrZr7d8Mw\nFBISoi1btmjv3r1q3LhxEY+A6wkBXAYvSYlWFwGr+IhXjwrhcEhxcVZXUS78/P2LbeNyueRyua5o\nnHIPgrVq1VLfvn31zjvvaOTIkZKkO++8U5MmTXK/q3jz5s0KDw9Xw4YNdejQIeXk5KhJkybq2LGj\nJkyYoDfeeKNEY3Xo0EFz5szRoEGDNGvWrCIDZEREhB5++GH17NlTy5cvV7169QpsV1iwBAAAsJLT\n6ZTT6XTfvpxPZym3awQvfGfuE088oUOHDrlvT5o0SV999ZXCwsLUqlUrJScnu+9r166dbrrpJklS\nx44d9csvv6hjx44lGnPy5Ml69913FRYWplmzZum1114rsJ7zt6OjozVhwgR169ZNR44cuazHCQAA\nUFkZJlNehTIMQ+PHT7G6DAAA8D8BAb5KSBhqdRkeyTCMUq9klvvScGUXGBhvdQkAAOB/0tOTi2+E\nEuMr5gAAAGyKIAgAAGBTBEEAAACbIggCAADYFEEQAADApgiCAAAANkUQBAAAsCmCIAAAgE0RBAEA\nAGyKIAgAAGBTBEEAAACbIggCAADYFEEQAADApgiCAAAANuVtdQGeLj092eoSAADA/wQE+FpdwlXF\nME3TtLoIT2UYhjg8AACgMric3MLSMAAAgE2xNFwMwzCsLgFAZeMlKc/qIioXH0nZVheBysXhkHJz\nra6iTPj5+ysrI8OSsVkaLsK5EMjhAVBahpRodQ2VTCLPtigdQ5JSUqwuo2zExZXJpWgsDQMAAKDE\nCIIAAAA2RRAEAACwKYIgAACATREEAQAAbIogCAAAYFMEQQAAAJsiCAIAANgUQRAAAMCmShQEH3vs\nMb322mvu2126dNGoUaPct5944gm9+uqrJR40MTFREydOLPC+6OjoEvdzsRUrVmjt2rWXvT8AAICd\nlCgIduzYUWvWrJEk5eXl6fDhw9q5c6f7/rVr15YqwBX1/b2rV68ucT8XS0lJcdcJAACAopUoCLZv\n394907Zjxw4FBwfLz89PmZmZOnPmjL755hstX75cUVFRCgkJ0YMPPujed9KkSWrVqpXCwsI0YMAA\n9/adO3cqLi5OzZo10+TJk93br732WkmSy+WS0+lUnz59FBQUpEGDBrnbfPLJJwoKClJkZKQeffRR\n9ejRQ+np6ZoyZYpeffVVRUREaPXq1UpLS1Pnzp0VFham22+/XXv37pUkDRs2TAkJCYqOjlazZs30\n0UcfXcEhBAAAqJy8S9Kofv368vb21t69e7V27Vq1b99e+/bt09q1a1WjRg2FhIRozJgxeu655yRJ\nQ4YM0ZIlS9S9e3e9/PLLSktLk4+Pj7KysiRJpmnq22+/lcvlUlZWlm6++WaNHj1aDocj32zh5s2b\ntXPnTtWrV0/R0dFas2aNWrdurYceekirVq1SYGCgBgwYIMMwFBgYqIceekh+fn56/PHHJUk9evTQ\n8OHDNXjwYL377rt69NFHNX/+fEnSgQMHtHr1an3zzTfq2bOn7rvvvjI9sAAAAJ6uxG8W6dChg9as\nWaM1a9aoffv2at++vdasWeNeFv7888/Vrl07hYaG6osvvnAvHYeGhmrAgAGaNWuWHA6HpHNLw927\nd5ePj4/q1KmjgIAA/frrr5eMGRUVpfr168swDIWHh+unn37St99+q6ZNmyowMFCS1L9/f5mm6d7n\nwt/XrVvnnoUcNGiQUlNT3eP36tVLkhQUFFTg2AAAAFe7Es0ISufexLF69Wpt27ZNISEhatSokSZM\nmKCaNWtq+PDhGjVqlDZu3KgGDRooKSlJp06dkiQtXbpUK1eu1OLFi/XCCy9o27ZtkqQqVaq4+3Y4\nHMrJyblkTF9f30vaXHx94YXBryCF3X/h+EX3Ufj1jABQIC9JiVYXUbn4iGdblJLDIcXFWV1FmfDz\n97+s/Vwul1wu1xWNXeIg2KFDB73yyitq3ry5DMNQrVq1lJmZqW+++UZTp06VJNWpU0fHjx/Xhx9+\nqL59+8o0Te3Zs0dOp1PR0dGaM2eOjh8/Xmx4K4xhGLr55pu1e/dupaenKzAwUHPnznWHQz8/P/fy\n8/ma58yZo0GDBmnWrFmKjY0t9ZiXWysAAEB5cjqdcjqd7ttJSUml7qPEQTA4OFiHDx/O96aN0NBQ\nnTx5UnXq1NGoUaMUHBysG264QW3btpUk5ebmavDgwTp69KhM01RCQoJq1qwpwzAKfefwhdsLanPN\nNdfoX//6l7p27arq1avr1ltvdbfr0aOH7r//fi1cuFCvv/66Jk+erOHDh+uVV15RQECA3n333RKP\nAwAAcLUzzEo45XXixAlVr15dkvT73/9eN910kxISEsp8HMMwNH78lDLvFwAAFCwgwFcJCUOtLqNS\nMgyj1CuZJZ4R9CRTp07V9OnTdfbsWbVu3Trfx9WUtcDA+HLrGwAA5Jeenmx1CbZSKYPg2LFjNXbs\nWKvLAAAAqNT4rmEAAACbIggCAADYFEEQAADApgiCAAAANkUQBAAAsCmCIAAAgE0RBAEAAGyKIAgA\nAGBTBEEAAACbIggCAADYFEEQAADApgiCAAAANkUQBAAAsClvqwvwdOnpyVaXAACAbQQE+Fpdgq0Y\npmmaVhfhqQzDEIcHAABUBpeTW1gaBgAAsCmWhothGIbVJQCXx0tSntVFACgPPpKyrS7iYg6HlJtr\ndRWVmp+/v7IyMip0TJaGi3AuBHJ4UFkZUqLVNQAoF4me9+pkSFJKitVlVG5xcVd0SRpLwwAAACgx\ngiAAAIBNEQQBAABsiiAIAABgUwRBAAAAmyIIAgAA2BRBEAAAwKYIggAAADZFEAQAALCpYoPgtdde\nW+aDjh07Vg0bNryiT88uSmJioiZOnFgufQMAAFwtig2CZf1du3l5eVq0aJFuueUWrVixokz7Po/v\nBwYAACjeZS0Nb968We3atVNYWJh69+6tzMxMSdKkSZPUqlUrhYWFqX///gXu63K5FBYWphEjRmj2\n7Nnu7YmJiRoxYoTi4uLUrFkzTZ482X3fX/7yF7Vs2VIxMTEaMGCAe7bvxx9/1F133aXIyEjFxsZq\n165dl4xXWJsPP/xQISEhCg8PV6dOnS7nMAAAAFRq3pez05AhQ/TGG28oJiZGzz//vJKSkvTqq6/q\n5ZdfVlpamnx8fJSVlVXgvrNnz1a/fv3Uo0cPPfXUU8rNzZXD4ZAkfffdd0pJSVFWVpZuvvlmjR49\nWl9//bU+/vhjbd26VWfPnlXr1q0VGRkpSYqPj9eUKVPUvHlzrV+/XqNHj9bnn38u6f9nBQtr85e/\n/EX/+c9/VK9evUJrBQAAuJqVOggePXpUR48eVUxMjCRp6NCh6tOnjyQpNDRUAwYMUK9evdSrV69L\n9j179qw+/fRT/fOf/1T16tXVtm1bLVu2TN26dZNhGOrWrZt8fHxUp04dBQQE6MCBA1q9erV69eql\nKlWqqEqVKurRo4ck6cSJE1qzZo177PP9X6ioNtHR0Ro6dKj69u2r3r17l/YwAAAAVHqXNSN4oQvf\n8LF06VKtXLlSixcv1gsvvKBt27a5Z/skafny5crMzFRwcLAk6eTJk7rmmmvUrVs3SVKVKlXcbR0O\nh3JycmQYRr4xzv+el5enWrVqadOmTYXWVlSbN998Uxs2bNDSpUvVpk0bbdy4UbVr1y6gF643RCXl\nJSnR6iIAlAcfeeCrk8MhxcVZXUWl5ufvX6r2LpdLLpfrisYsdRCsWbOmatWqpdTUVHXs2FEzZ86U\n0+mUaZras2ePnE6noqOjNWfOHJ04cUI1atRw7zt79my988476tevn6RzQbBJkyY6depUge8gNgxD\n0dHRevDBB/XMM88oOztbS5cu1YMPPig/Pz81adJE8+bN0/333y/TNLVt2zaFhoZKOhcYi2rz448/\nKioqSlFRUfr000/1888/FxgEy+udzQAAAFfC6XTK6XS6byclJZW6j2KD4MmTJ9WoUSP37SeeeELT\np0/XQw89pJMnT6pZs2Z69913lZOTo8GDB+vo0aMyTVMJCQn5QuDJkye1fPlyJScnu7dVq1ZNHTt2\n1OLFi2UYRoHv9o2MjFTPnj0VGhqq66+/XiEhIapZs6YkadasWXr44Yf117/+VdnZ2erfv787CJ7v\nq7A2Tz/9tL7//nuZpqnbb7/dvR8AAIBdGGYlmPI6ceKEqlevrpMnT6pTp06aOnWqwsPDy31cwzA0\nfvyUch8HAAC7CwjwVULCUKvLqNQuvpyuJK74GsGKEB8fr507d+r06dMaNmxYhYTA8wID4ytsLAAA\n7Co9Pbn4RihzlSIIzpo1y+oSAAAArjp81zAAAIBNEQQBAABsiiAIAABgUwRBAAAAmyIIAgAA2BRB\nEAAAwKYIggAAADZFEAQAALApgiAAAIBNEQQBAABsiiAIAABgUwRBAAAAmyIIAgAA2JS31QV4uvT0\nZKtLAADgqhcQ4Gt1CbZkmKZpWl2EpzIMQxweAABQGVxObmFpGAAAwKZYGi6GYRhWlwDgauQlKc/q\nInA185GUbXURVwuHQ8rNrdAh/fz9lZWRUe7jsDRchHMhkMMDoDwYUqLVNeCqlsgrWFkxJCklpWIH\njYsr9TIvS8MAAAAoMYIgAACATREEAQAAbIogCAAAYFMEQQAAAJsiCAIAANgUQRAAAMCmCIIAAAA2\nRRAEAACwKY8Mgg6HQxEREQoODlZ4eLj+8Y9/FPtJ2WlpaQoJCZEkuVwu9ejRoyJKBQAAqLQ88ruG\nq1Wrpk2bNkmSDh48qAEDBigrK0uJiYnWFgYAAHAV8cgZwQvVrVtXycnJev311yWdm/mLjY1VmzZt\n1KZNG61du7bI/Tds2KAOHTqodevWio6O1nfffSdJ2rFjh9q2bauIiAiFhYXphx9+KPfHAgAA4Ek8\nckbwYk2aNFFubq4OHjyo66+/Xv/973/l6+ur77//XgMGDNCXX35Z6L5BQUFatWqVHA6HPvvsM40f\nP17z5s3TW2+9pYSEBA0YMEA5OTnKycmpwEcEAABgvUoRBC909uxZPfLII9qyZYscDod7hq8wmZmZ\nGjJkiH744QcZhuEOfB06dNALL7ygn3/+Wb1791bz5s0ronwAAACPUSmC4O7du+VwOFS3bl0lJiaq\nXr16mjlzpnJzc3XNNdcUue9zzz2n2267TfPnz1d6erqcTqckqX///mrXrp2WLFmiu+++W1OmTFFc\nXFwBPRhl/4AAwEtSotVF4GrmI17ByozDIRWYEcqPn79/sW1cLpdcLtcVjePxQfDgwYN66KGHNGbM\nGElSVlaWGjZsKEmaMWOGcnNzi9w/KytL9evXlyS9++677u27d+9W06ZNNWbMGO3Zs0fbtm0rMAgW\n925lAAAAKzidTvcElyQlJSWVug+PfLPIqVOn3B8fc8cdd6hr167605/+JEkaPXq0pk+frvDwcO3a\ntUvXXnutez/DMC75/emnn9Yzzzyj1q1bKzc31739gw8+UHBwsCIiIrRjxw4NGTKkAh8hAACA9QyT\nKa9CGYah8eOnWF0GAAAeKSDAVwkJQ60uA/9jGEapVzI9fmnYaoGB8VaXAACAR0pPT7a6BFwhj1wa\nBgAAQPkjCAIAANgUQRAAAMCmCIIAAAA2RRAEAACwKYIgAACATREEAQAAbIogCAAAYFMEQQAAAJsi\nCAIAANgUQRAAAMCmCIIAAAA2RRAEAACwKYIgAACATXlbXYCnS09PtroEAAA8UkCAr9Ul4AoZpmma\nVhfhqQzDEIcHAABUBpeTW1gaBgAAsCmWhothGIbVJQDW8pKUZ3URAAriIynb6iJQeg6HlJtb4uZ+\n/v7Kysgol1JYGi7CuRDI4YHdGVKi1TUAKFAir1KVkSFJKSkl3yEurkRLviwNAwAAoMQIggAAADZF\nEAQAALApgiAAAIBNEQQBAABsiiAIAABgUwRBAAAAmyIIAgAA2BRBEAAAwKY8Ngh6eXlp8ODB7ts5\nOTmqW7euevToIUlavHixXn755TIZa9SoUfrmm2/KpC8AAIDKwmO/a7h69erasWOHTp8+rWuuuUb/\n/e9/1bBhQ/d3//bo0cMdCq/U1KlTy6QfAACAysRjZwQl6e6779bSpUslSbNnz1b//v3d36E3bdo0\njRkzRtK52cF27dqpdevWuuOOO/Tbb79JkhITEzV06FDFxsaqcePG+vjjj/Xkk08qNDRUd911l3Jy\nciRJTqdTGzdutOARAgAAWMejg2C/fv00Z84cnTlzRtu2bVPbtm0LbBcTE6N169bp66+/Vr9+/fT3\nv//dfd9PP/2klJQULVq0SIMGDdIdd9yhrVu3qmrVqu6QaRiGe6YRAADALjx2aViSQkJClJaWptmz\nZ6tbt26Fttu7d6/69u2rAwcO6OzZs2ratKmkcwHvrrvuksPhUHBwsPLy8tSlS5d8fRePgAib85KU\naHURAAriI16lKiWHQ4qLK3FzP3//Are7XC65XK4rKsWjg6Ak9ezZU08++aRWrFihgwcPFthmzJgx\nevLJJ9W9e3etWLFCiYmJ7vuqVKki6dybT3x8fNzbvby8lJubW+z455eiAQAAPInT6ZTT6XTfTkpK\nKnUfHh8ER4wYoVq1aqlVq1aFpt6srCzVr19f0rlrB88rLsQR8gAAgJ157DWC56/Za9CggR555BH3\ntvPbL/w9MTFRffr0UWRkpOrWrVtgmwv7LOw2AACAnRgm02KFMgxD48dPsboMAAA8TkCArxIShlpd\nBi5gGEapVzs9fmnYaoGB8VaXAACAx0lPT7a6BJQBj10aBgAAQPkiCAIAANgUQRAAAMCmCIIAAAA2\nRRAEAACwKYIgAACATREEAQAAbIogCAAAYFMEQQAAAJsiCAIAANgUQRAAAMCmCIIAAAA2RRAEAACw\nKW+rC/B06enJVpcAAIDHCQjwtboElAHDNE3T6iI8lWEY4vAAAIDK4HJyC0vDAAAANkUQBAAAsCmu\nESyGYRhWlwAAV8ZLUp7VRaAs+EjKtroIu3I4pNxcS4b28/dXVkZGufTNNYJFOBcCOTwAKjtDSrS6\nBpSJRF6VrGJIUkqKNYPHxZXo2j+uEQQAAECJEQQBAABsiiAIAABgUwRBAAAAmyIIAgAA2BRBEAAA\nwKYIggAAADZFEAQAALApgiAAAIBNVXgQPHDggB544AE1b95ckZGR6tatm6ZOnaoePXoU2H7UqFH6\n5ptvKrhKAACAq1+FftewaZq69957NXz4cM2ZM0eStHXrVi1atKjQfaZOnVpR5QEAANhKhc4IpqSk\nqEqVKoqPj3dvCw0NVUxMjI4fP64+ffooKChIgwYNct/vdDq1ceNGSdKyZcvUpk0bhYeH64477pAk\nbdiwQR06dFDr1q0VHR2t7777TpJ08uRJ9e3bV61atVLv3r3Vrl07dz+zZ89WaGioQkJCNG7cuIp6\n+AAAAB6lQmcEt2/frjZt2lyy3TRNbdq0STt37lS9evUUHR2tNWvWqEOHDjIMQ4Zh6ODBg4qPj9eq\nVasUGBiozMxMSVJQUJBWrVolh8Ohzz77TOPHj9e8efP0r3/9S3Xq1NGOHTu0Y8cOhYeHyzAM/fLL\nLxo3bpy+/vpr+fv7684779TChQt1zz33VOShAAAAsFyFBkHDMAq9LyoqSvXr15ckhYeHKy0tTR06\ndJB0LiiuW7dOsbGxCgwMlCT5+/tLkjIzMzVkyBD98MMPMgxDOTk5kqTVq1dr7NixkqRWrVopNDRU\npmnqyy+/lNPpVJ06dSRJAwcO1MqVK4sIgoXXDACVgpekRKuLQFnwEa9KlnE4pLg4S4b2+1/muZjL\n5ZLL5bqivis0CLZq1Urz5s0r8D5fX1/37w6Hwx3ozissRD733HO67bbbNH/+fKWlpSnugpNkmuYl\n7S/up6A2pbkfAADACk6nU06n0307KSmp1H1U6DWCnTt31pkzZ/K9AWTr1q1atWpVkfsZhqF27dpp\n5cqVSktLkyRlZGRIkrKystwzidOmTXPvEx0drQ8++ECStHPnTm3btk2GYSgqKkorVqzQ4cOHlZub\nqzlz5uQ7iAAAAHZR4R8fM3/+fH322Wdq3ry5goOD9eyzz6pevXpFLhtL0nXXXafk5GT17t1b4eHh\neuCBByRJTz/9tJ555hm1bt1aubm57n5Gjx6tgwcPqlWrVnruuefUqlUr1axZUzfccINeeuklxcXF\nKTw8XJGRkYV+dA0AAMDVzDCv0rXPvLw8ZWdny9fXVz/++KPuuOMOfffdd/L2LvlquGEYGj9+SjlW\nCQCAZwrp6mSRAAAgAElEQVQI8FVCwlCry0ApGIZR6kvaKvQawYp04sQJde7cWdnZ2TJNU2+++Wap\nQuB5gYHxxTcCAOAqk56ebHUJqABXbRD08/PTl19+aXUZAAAAHovvGgYAALApgiAAAIBNEQQBAABs\niiAIAABgUwRBAAAAmyIIAgAA2BRBEAAAwKYIggAAADZFEAQAALApgiAAAIBNEQQBAABsiiAIAABg\nU95WF+Dp0tOTrS4BAIAKFxDga3UJqACGaZqm1UV4KsMwxOEBAACVweXkFpaGAQAAbIogCAAAYFNc\nI1gMwzCsLgHA1c5LUp7VRZQ/H0nZVhcBXAmHQ8rNrZCh/Pz9lZWRUe7jcI1gEc6FQA4PgPJmSIlW\n11ABEnlGReVmSFJKSsUMFhdX6uv9uEYQAAAAJUYQBAAAsCmCIAAAgE0RBAEAAGyKIAgAAGBTBEEA\nAACbIggCAADYFEEQAADApgiCAAAANuUxQXDBggXy8vLSrl27JElbtmzRp59+6r5/2rRpGjNmzGX1\nffToUb355ptlUicAAMDVwmOC4OzZs9W9e3fNnj1bkrRp0yZ98skn7vuv5Dt/MzIy9K9//euKawQA\nALiaeEQQPH78uNavX6/XX39dc+fOVXZ2tv70pz9p7ty5ioiI0AcffJCv/eLFi9WuXTu1bt1ad9xx\nh3777TdJUmJiokaMGKG4uDg1a9ZMkydPliSNGzdOP/74oyIiIvSHP/xBJ06c0O233642bdooNDRU\nixYtqvDHDAAAYDVvqwuQpIULF6pr16668cYbVbduXW3btk1/+ctftHHjRk2aNEmSNH36dHf7mJgY\nrVu3TpL09ttv6+9//7smTJggSfruu++UkpKirKws3XzzzRo9erRefvll7dixQ5s2bZIk5ebmav78\n+fLz89OhQ4fUvn179ezZs4IfNQAAgLU8IgjOnj1bjz32mCSpT58+mj17toKDg2WaZoHt9+7dq759\n++rAgQM6e/asmjZtKunc8nG3bt3k4+OjOnXqKCAgQL/++usl/eTl5emZZ57RqlWr5OXlpV9++UW/\n/fabAgICChjt8pekAaBEvCQlWl1E+fMRz6io5BwOKS6uQoby8/cvto3L5ZLL5bqicSwPgkeOHFFK\nSoq2b98uwzCUm5srwzDUqlWrQvcZM2aMnnzySXXv3l0rVqxQYmKi+74qVaq4f3c4HMrJyblk/1mz\nZunQoUP6+uuv5XA41KRJE50+fbrAsQoLowAAAFZyOp1yOp3u20lJSaXuw/JrBOfNm6chQ4YoLS1N\nP/30k/bs2aMmTZpoz549OnbsmLvdhYEsKytL9evXl3Tu3cQFtbmQn59fvr6ysrIUEBAgh8OhlJQU\npaenl/GjAgAA8HyWB8E5c+bo3nvvzbftvvvu04EDB7Rz5073m0UMw3C/czgxMVF9+vRRZGSk6tat\n695+YZsL1alTR9HR0QoJCdEf/vAHDRw4UF999ZVCQ0M1c+ZMBQUFlf8DBQAA8DCGydpnoQzD0Pjx\nU6wuAwCAMhEQ4KuEhKFWl4FyYhhGqS9ps/waQU8XGBhvdQkAAJSJ9PRkq0uAh7F8aRgAAADWIAgC\nAADYFEEQAADApgiCAAAANkUQBAAAsCmCIAAAgE0RBAEAAGyKIAgAAGBTBEEAAACbIggCAADYFEEQ\nAADApgiCAAAANkUQBAAAsClvqwvwdOnpyVaXAABAmQgI8LW6BHgYwzRN0+oiPJVhGOLwAACAyuBy\ncgtLwwAAADZFEAQAALAprhEshmEYVpcAACiMl6Q8q4soOR9J2VYXgSvjcEi5uRUylJ+/v7IyMsp1\nDK4RLMK5EMjhAQDPZUiJVtdQCom8qlR2hiSlpFTMYHFxpbrmj2sEAQAAUGIEQQAAAJsiCAIAANgU\nQRAAAMCmCIIAAAA2RRAEAACwKYIgAACATREEAQAAbIogCAAAYFNFBkGHw6GIiAiFhISob9++OnXq\nlNLS0hQSElJg++eff15ffPGFJMnpdGrjxo0lLsTlcqlHjx7l2mbUqFH65ptvSlwTAADA1azIIFit\nWjVt2rRJ27ZtU5UqVfTWW28V+d27SUlJ6ty5s6RzX3Piad/TO3XqVAUFBVldBgAAgEco8dJwx44d\n9cMPP0iScnNzFR8fr+DgYHXp0kWnT5+WJA0bNkwfffTRJfuOHj1at956q4KDg5WYmOjevmzZMgUF\nBalNmzaaP3++e/uJEyc0YsQItW3bVq1bt9aiRYsu6TMxMVGDBw9Whw4ddNNNN+ntt99233f8+HH1\n6dNHQUFBGjRokHu70+nU119/XWRNAAAAdlGiIJiTk6NPP/1UoaGhMk1T33//vR555BFt375d/v7+\n7vBX2CzgCy+8oC+//FJbtmzRihUrtG3bNp0+fVrx8fFasmSJNm7cqAMHDrj3feGFF3Tbbbdp/fr1\n+uKLL/TUU0/p5MmTl/S7fft2paSkaO3atfrzn/+s/fv3S5I2bdqk1157TTt37tTu3bu1Zs0ad31F\n1QQAAGAn3kXdeerUKUVEREiSYmNjNXLkSP38889q0qSJQkNDJUlt2rRRWlpakYPMnTtXU6dOVU5O\njvbv36+dO3cqNzdXTZo0UbNmzSRJgwYNUnJysiTpP//5jxYvXqwJEyZIks6cOaO9e/fm69MwDN1z\nzz3y9fWVr6+v4uLitGHDBvn7+ysqKkr169eXJIWHhystLU0dOnQotqaCr330rOVtAMAFvCQlWl1E\nyfmIV5VKz+GQ4uIqZCg/f/8i73e5XHK5XFc0RpFBsGrVqtq0adMl2319fd2/OxwOnTp1qtA+fvrp\nJ02cOFFfffWVatasqeHDh+v06dOXzByappnv9scff6wWLVrk23Z+xq8wXl5eBdaXk5NTopoKcnFd\nAAAAnsDpdMrpdLpvJyUllbqPcv/4mKysLFWvXl01atTQr7/+qk8//VSGYahly5ZKS0vT7t27JUmz\nZ89279OlSxdNmjTJfbugMGqaphYuXKgzZ87o8OHDcrlcuvXWW0sU3AqrCQAAwE6KnBEsLBxdvL2o\nEBUWFqaIiAi1bNlSjRo1UseOHSWdm7VLTk5Wt27dVK1aNcXExOjEiROSpOeee05jx45VaGio8vLy\n1LRpU/cbRs6PZRiGQkNDFRcXp0OHDulPf/qTbrjhBu3atavYUFdYTQAAAHZimJV07TMpKUnXXnut\nnnjiiXIbwzAMjR8/pdz6BwB4loAAXyUkDLW6DOCyGIZR6kvaipwR9HQVsZwbGBhf7mMAADxDenqy\n1SUAFarSBsHnn3/e6hIAAAAqNb5rGAAAwKYIggAAADZFEAQAALApgiAAAIBNEQQBAABsiiAIAABg\nUwRBAAAAmyIIAgAA2BRBEAAAwKYIggAAADZFEAQAALApgiAAAIBNeVtdgKdLT0+2ugQAQAUJCPC1\nugSgQhmmaZpWF+GpDMMQhwcAAFQGl5NbWBoGAACwKYIgAACATXGNYDEMw7C6BACAHXlJyrO6iLLh\nIynb6iIu5nBIublWV+Hm5++vrIyMCh+XawSLcC4EcngAAFYwpESraygjiZ73ampIUkqK1WX8v7i4\nK35fAtcIAgAAoMQIggAAADZFEAQAALApgiAAAIBNEQQBAABsiiAIAABgUwRBAAAAmyIIAgAA2BRB\nEAAAwKY8Jgg6HA5FREQoPDxcbdq00dq1ay+rn7/97W9lXBkAAMDVyWOCYLVq1bRp0yZt3rxZL774\nop555pnL6ufFF18s48oAAACuTh4TBC909OhR1a5dW5JkmqaeeuophYSEKDQ0VB988IEkaf/+/YqN\njVVERIRCQkKUmpqqcePG6dSpU4qIiNDgwYMlSf/4xz8UEhKikJAQvfbaa5KktLQ0BQUFKT4+XsHB\nwerSpYtOnz5tzYMFAACwiGFe6TcclxFvb2+FhITo9OnT2r9/v1JSUhQREaGPPvpIU6ZM0fLly3Xw\n4EHdeuutWr9+vWbNmqUzZ85o/PjxysvL08mTJ3XttdfKz89Px44dkyRt3LhRw4cP1/r165WXl6e2\nbdvqvffek7+/v1q0aKGNGzcqNDRU/fr1U8+ePTVw4MB8NRmGIc/7mmwAgD0YUqLVNZSRRM97NTUk\nKSXF6jL+X1ycrjSSGYZR6j68r2jEMlS1alVt2rRJkrRu3ToNHjxY27dvV2pqqgYMGCDDMBQQEKBO\nnTrpyy+/VFRUlEaMGKHs7Gz16tVLYWFhl/SZmpqq3r17q2rVqpKk3r17a9WqVerZs6eaNGmi0NBQ\nSVKbNm2UlpZWSGVGeTxcAACK5qWrJgj6yANfTR0OKS7O6irc/Pz9S72Py+WSy+W6onE9JgheqF27\ndjp06JAOHjxYYLo1DEMxMTFatWqVlixZomHDhunxxx93Lwdf2O7CfU3T/N8sn+Tr6+ve7nA4dOrU\nqQJr8ZAJUwAAgHycTqecTqf7dlJSUqn78MhrBL/99lvl5eXpuuuuU0xMjObOnau8vDwdPHhQK1eu\nVFRUlPbs2aO6devqd7/7nUaOHOmeTfTx8VFOTo4kKSYmRgsWLNCpU6d04sQJLViwQDExMYQ7AAAA\nedCM4Pk3eUjnZuGmT58uwzB07733au3atQoLC5NhGHrllVcUEBCgGTNm6JVXXpGPj4/8/Pw0Y8YM\nSVJ8fLxCQ0PVpk0bzZw5U8OGDVNUVJQkadSoUQoLC1NaWpp7ZvC8i28DAABc7TzmzSKeyDAMjR8/\nxeoyAKDCBAT4KiFhqNVlALgMlfrNIp4qMDDe6hIAoMKkpydbXQKACuSR1wgCAACg/BEEAQAAbIog\nCAAAYFMEQQAAAJsiCAIAANgUQRAAAMCmCIIAAAA2RRAEAACwKYIgAACATREEcVXatctldQm4Apy/\nysvlclldAq4A589+CIK4Kn33ncvqEnAFOH+VF0GicuP82Q9BEAAAwKYIggAAADZlmKZpWl2EpwoP\nD9eWLVusLgMAAKBYYWFh2rx5c6n2IQgCAADYFEvDAAAANkUQBAAAsCmCIAAAgE3ZPgguW7ZMLVu2\nVIsWLfTyyy8X2ObRRx9VixYtFBYWpk2bNlVwhShKcedv1qxZCgsLU2hoqKKjo7V161YLqkRBSvJ/\nT5K+/PJLeXt76+OPP67A6lCckpw/l8uliIgIBQcHy+l0VmyBKFJx5+/QoUPq2rWrwsPDFRwcrGnT\nplV8kSjQiBEjdP311yskJKTQNqXKLaaN5eTkmM2aNTN/+ukn8+zZs2ZYWJi5c+fOfG2WLl1q3nXX\nXaZpmua6devMtm3bWlEqClCS87dmzRozMzPTNE3T/PTTTzl/HqIk5+58u7i4OLNbt27mvHnzLKgU\nBSnJ+cvIyDBvueUWc+/evaZpmubBgwetKBUFKMn5e/75581x48aZpnnu3NWuXdvMzs62olxcZOXK\nlebXX39tBgcHF3h/aXOLrWcEN2zYoObNm6tx48by8fHRAw88oIULF+Zrs2jRIg0dOlSS1LZtW2Vm\nZurXX3+1olxcpCTnr3379qpZs6akc+fv559/tqJUXKQk506SJk+erPvvv19169a1oEoUpiTn7/33\n39d9992nhg0bSpKuu+46K0pFAUpy/urVq6esrCxJUlZWlurUqSNvb28rysVFYmJiVKtWrULvL21u\nsXUQ3Ldvnxo1auS+3bBhQ+3bt6/YNoQJz1CS83ehd955R3fffXdFlIZilPT/3sKFC/Xwww9LkgzD\nqNAaUbiSnL/vv/9eR44cUVxcnCIjIzVz5syKLhOFKMn5GzVqlHbs2KH69esrLCxMr732WkWXictU\n2txi63hf0hcW86KPWuQFyTOU5jykpKTo3//+t1avXl2OFaGkSnLuxo4dq5deekmGYcg0zUv+H8I6\nJTl/2dnZ+vrrr/X555/r5MmTat++vdq1a6cWLVpUQIUoSknO39/+9jeFh4fL5XLpxx9/1B133KEt\nW7bIz8+vAirElSpNbrF1EGzQoIH27t3rvr137173MkZhbX7++Wc1aNCgwmpE4Upy/iRp69atGjVq\n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\nR1WrVnWH6xdeeEExMTF64403dOzYMU2aNKnAPubOnavExERlZGSoefPmevbZZyWdCy/dunXT2LFj\ndeTIET3++OPq1q2bjhwpfqb4anI+8J08eVJz585V+/btJeWf5TBNs9DzIEmDBw/W6dOntXPnTv32\n2296/PHHLxnnz3/+s2bMmKGVK1eqfv365fyoPM+MGTPUr18/9e3bV8uXL9fBgwclSSNHjlRycrKy\nsrK0Y8cOde7cucD9mzdvrtTUVGVlZen555/XoEGD9Ouvv7rv37Bhg1q2bKnDhw/r6aef1siRIyvk\ncXmyW2+9VQ0bNtSqVavyrTgMGDBAs2fPdrdbvny5AgICFB4ern379ql79+7605/+pIyMDE2YMEH3\n3XefDh8+7G7/3nvv6e2339bx48d13XXXKSEhQcuWLVNWVpbWrl2r8PDwS2q58Dk/KytLffv21ZAh\nQ/Tee++523zyySdq0KCBwsLCyuuQVFoEQViqU6dO7v/Eqampio2NVUxMjHvbqlWr1KlTJ3f7cePG\nqUaNGmrUqJHi4uLcf2UWJzk5WQ8++KBuvfVWGYahIUOGyNfXV+vWrSv7B1VJnJ9duuaaa3Tttddq\n/Pjx+f46l4peajEMQ71791ZkZKQcDocGDhzoPh9Lly7VzTffrIEDB8rLy0sPPPCAWrZsqcWLF5fr\nY/IkpmmqV69eqlWrlvz9/fX555/rySefvKRdUedh//79WrZsmd566y3VrFlT3t7e7lmQ82M8/vjj\n+uyzz5SSkqI6depU2OPzFKmpqdq3b5969uypFi1a6JZbbtGsWbMknftjc8eOHcrKylLNmjUVERFR\nYB/333+/brjhBklS37591aJFC61fv959f2BgoEaOHOl+7ti/f79+++238n9wHq5+/fruP+7OP1f0\n799fixYt0unTpyVJ77//vvr37y/pXMi7++671bVrV0nS7bffrsjISPcMomEYGjZsmIKCguTl5SVv\nb295eXlp27ZtOnXqlK6//nrdcsstJapt4MCBWrp0qY4fPy5JmjlzpgYPHlx2D/4qQhCEpWJjY5Wa\nmqqMjAwdPHhQzZo1U/v27bVmzRplZGRox44d+WYEzz9ZS1K1atV04sSJEo2Tnp6uiRMnqlatWu6f\nn3/+Wfv37y/zx1RZnDx5Ug8++KAaN26smjVrqlOnTjp69Gi+8Ffc9TnXX3+9+/eqVau6n3R/+eUX\n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\nqD8A29RZ3QKB1TYAAAAASUVORK5CYII=\n", "text": [ "" ] } ], "prompt_number": 27 } ], "metadata": {} } ] }