Package: bbd
BBD: Bluebonnet Data LibraryBBDis a library for helping teams perform political campaign data analysis.Installing BBDBBD is available on PyPI:python -m pip install bbdExampleFor a running start, you can copy theexamplesfolder to your machine and run the example python scripts to map median household income per census tract in Larimer county, Colorado (among other things).WalkthroughFollow along with this walkthrough to learn more detailed infomation about using this library.Getting Census DataFirst, find the data you want to visualize. This is often easiest through the census API, and the next bit of text will read a bit like a "How to Get Census Data" tutorial.For our working example, we'll use median household income (which is coded in the census data as as "DP03_0062E").We can simply downloaded the census data like so:>>>frombbdimportcensus>>>data=census.get_acs(>>>geography=census.Geography.CD,>>>variables="group(DP03),NAME",>>>year=2018,>>>state="co",>>>dataset=census.DataSets.ACS5_PROFILE,>>>)https://api.census.gov/data/2018/acs/acs1/profile?get=group(DP03),NAME&for=congressional%20district:*&in=state:08For more information on how to come up with your own census API requests I'd highly recommend the first 6 minutes ofthis video. Or, you could simplystart browsing census data sets. For reference, the following table describes the basic elements of the API call used to get this working example's data.URL PartMeaningget=group(DP03)Data columns include those in group DP03 (economics),NAMEInclude name of each entity, just a nicetyfor=congr...district:*One row for each congressional districtin=state:08Only get rows for state 08 (Colorado)This census data is stored more or less as a big table in json format:[["NAME","GEO_ID","DP03_0001E",...]# Headers["Congressional District 1","5001600US0801","693303",...]# Data["Congressional District 2","5001600US0802","672976",...]# Data["...","...","...",...]# Data]When you request it from the API withget_acs, it is automatically converted to a format that is plottable and join-able with shapefiles. If you downloaded the file manually and want to convert it yourself, you can usecensus.load_json_file.>>>print(data){"NAME":["Congressional District 1","Congressional District 2",...],"GEO_ID":["5001600US0801","5001600US0802",...]"DP03_0001E":["693303","672976",...]}Getting ShapefilesLuckily, the census provides shapefiles for pretty much everyGEO_IDyou can find in the census API. You can automatically download them like this:>>>shapefile_path=census.get_shapefile(>>>geography=census.Geography.CD,>>>state="co",>>>year=2018,>>>cache=True,>>>)To get these files manually, just head tothis websiteand select the relevent geography/location.Match Census Data GEO ID to Shapefile GEO IDI happen to know that the GEO_ID in the shapefile is stored under the key "GEOID", and is only 4 digits long. There are reasons for thisdescribed here, but all we need to do is make an entry for our census data that matches the shapefile.>>>data["GEOID"]=[geoid[-4:]forgeoidindata["GEO_ID"]]To determine how many digits you need for your own shapefile, I'd recommend just taking a quick look withPyShp.python -m pip install pyshp>>>importshapefile>>>>>># What is the name of the GEO ID field?>>>shp=shapefile.Reader(shapefile_path)>>>shp.fields[["GEOID","C",4,0],# Cool! Name of GEO ID field is "GEOID"["ALAND","N",14,0],["AWATER","N",14,0],[...],]>>>>>># Now we need to see how many digits long the GEO ID is.>>>forrecordinshp.records():>>>print(record["GEOID"])080108030805...>>># Looks like 4 digits it is!You can also of course simply view the property table in your favorite GIS software (e.g.the free QGIS).Create Data to Color ByThe only thing better than a map is a map with color. You know the saying. The column to color by must be numeric.>>># Note: the name of this entry will be used as the text caption on the colormap>>>data["Median Household Income"]=[float(x)forxindata["DP03_0062E"]]Create Nicely Formatted String for ToolTipWe also want our map to have nice interactive tooltips so that you can see information about each shape by hovering over it with your mouse! To visualize the income, I'll just add comma separators and a $ sign.>>>data["Median HouseHold Income (pretty format)"]=[>>>"${:,.2f}".format(x)forxindata["Median Household Income"]>>>]Create Map!Finally, we can create the leaflet map and save it to our machine.>>>geojson_map=gis.make_map(>>>shapefile_path,>>>data,>>>join_on="GEOID",# Common field between shapefile and our census data>>>color_by="Median Household Income",# Color shapes based on this data field>>>save_to="path/to/save/map.html",# Save leaflet map here!>>>)Simply openpath/to/save/map.htmlin your favorite browser to view your map!Developed byBluebonnet Data