mirror of
https://github.com/DOI-DO/j40-cejst-2.git
synced 2025-02-22 01:31:25 -08:00
Use Census Decennial 2020 data for territories
This commit is contained in:
parent
460449f989
commit
6436dfa683
12 changed files with 767 additions and 513 deletions
|
@ -65,7 +65,9 @@ def compare_score(compare_to_version: str):
|
|||
|
||||
# TODO: transition to downloader code when it's available
|
||||
production_score_url = f"https://justice40-data.s3.amazonaws.com/data-versions/{compare_to_version}/data/score/csv/full/usa.csv"
|
||||
production_score_path = WORKING_PATH / "usa.csv"
|
||||
production_score_path = (
|
||||
WORKING_PATH / f"prod-score-csv-full-{compare_to_version}-usa.csv"
|
||||
)
|
||||
|
||||
log_info(f"Fetching score version {compare_to_version} from AWS")
|
||||
production_score_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
@ -200,7 +202,7 @@ def compare_score(compare_to_version: str):
|
|||
" The number of tracts match!\n"
|
||||
if len(production_disadvantaged_tracts_set)
|
||||
== len(local_disadvantaged_tracts_set)
|
||||
else f" The difference is {abs(len(production_disadvantaged_tracts_set) - len(local_disadvantaged_tracts_set)):,} tract(s).\n"
|
||||
else f" The difference is {abs(len(production_disadvantaged_tracts_set) - len(local_disadvantaged_tracts_set))} tract(s).\n"
|
||||
)
|
||||
|
||||
removed_tracts = production_disadvantaged_tracts_set.difference(
|
||||
|
@ -209,19 +211,25 @@ def compare_score(compare_to_version: str):
|
|||
added_tracts = local_disadvantaged_tracts_set.difference(
|
||||
production_disadvantaged_tracts_set
|
||||
)
|
||||
removed_tracts_str = ", ".join(list(removed_tracts))
|
||||
added_tracts_str = ", ".join(list(added_tracts))
|
||||
|
||||
log_info(
|
||||
f"There are {len(removed_tracts):,} tract(s) marked as disadvantaged in the prod score that are not disadvantaged in the local score."
|
||||
f"There are {len(removed_tracts):,} tract(s) marked as disadvantaged in the prod "
|
||||
"score that are not disadvantaged in the local score. Those tracts are:"
|
||||
)
|
||||
log_info(removed_tracts_str)
|
||||
log_info(
|
||||
f"There are {len(added_tracts):,} tract(s) marked as disadvantaged in the local score that are not disadvantaged in the prod score."
|
||||
f"There are {len(added_tracts):,} tract(s) marked as disadvantaged in the local "
|
||||
"score that are not disadvantaged in the prod score. Those tracts are:"
|
||||
)
|
||||
log_info(added_tracts_str)
|
||||
|
||||
summary += (
|
||||
f"* There are {len(removed_tracts):,} tract(s) marked as disadvantaged in the production score that are not disadvantaged in the locally"
|
||||
" generated score (i.e. disadvantaged tracts that were removed by the new score)."
|
||||
f" generated score (i.e. disadvantaged tracts that were removed by the new score). Those tracts are:\n{removed_tracts_str}\n"
|
||||
f" There are {len(added_tracts):,} tract(s) marked as disadvantaged in the locally generated score that are not disadvantaged in the"
|
||||
" production score (i.e. disadvantaged tracts that were added by the new score).\n"
|
||||
f" production score (i.e. disadvantaged tracts that were added by the new score). Those tracts are:\n{added_tracts_str}\n\n"
|
||||
)
|
||||
|
||||
try:
|
||||
|
|
|
@ -315,18 +315,18 @@ TILES_SCORE_COLUMNS = {
|
|||
field_names.ISLAND_AREAS_POVERTY_LOW_HS_EDUCATION_FIELD: "IAPLHSE",
|
||||
field_names.ISLAND_AREAS_LOW_MEDIAN_INCOME_LOW_HS_EDUCATION_FIELD: "IALMILHSE",
|
||||
# Percentiles for Island areas' workforce columns
|
||||
field_names.LOW_CENSUS_DECENNIAL_AREA_MEDIAN_INCOME_PERCENT_FIELD_2009
|
||||
field_names.LOW_CENSUS_DECENNIAL_AREA_MEDIAN_INCOME_PERCENT_FIELD_2019
|
||||
+ field_names.PERCENTILE_FIELD_SUFFIX: "IALMILHSE_PFS",
|
||||
field_names.CENSUS_DECENNIAL_POVERTY_LESS_THAN_100_FPL_FIELD_2009
|
||||
field_names.CENSUS_DECENNIAL_POVERTY_LESS_THAN_100_FPL_FIELD_2019
|
||||
+ field_names.ISLAND_AREAS_PERCENTILE_ADJUSTMENT_FIELD
|
||||
+ field_names.PERCENTILE_FIELD_SUFFIX: "IAPLHSE_PFS",
|
||||
field_names.CENSUS_DECENNIAL_UNEMPLOYMENT_FIELD_2009
|
||||
field_names.CENSUS_DECENNIAL_UNEMPLOYMENT_FIELD_2019
|
||||
+ field_names.ISLAND_AREAS_PERCENTILE_ADJUSTMENT_FIELD
|
||||
+ field_names.PERCENTILE_FIELD_SUFFIX: "IAULHSE_PFS",
|
||||
field_names.LOW_HS_EDUCATION_FIELD: "LHE",
|
||||
field_names.ISLAND_AREAS_LOW_HS_EDUCATION_FIELD: "IALHE",
|
||||
# Percentage of HS Degree completion for Islands
|
||||
field_names.CENSUS_DECENNIAL_HIGH_SCHOOL_ED_FIELD_2009: "IAHSEF",
|
||||
field_names.CENSUS_DECENNIAL_HIGH_SCHOOL_ED_FIELD_2019: "IAHSEF",
|
||||
# Booleans for the front end about the types of thresholds exceeded
|
||||
field_names.CLIMATE_THRESHOLD_EXCEEDED: "N_CLT_EOMI",
|
||||
field_names.ENERGY_THRESHOLD_EXCEEDED: "N_ENY_EOMI",
|
||||
|
|
|
@ -166,7 +166,7 @@ class ScoreETL(ExtractTransformLoad):
|
|||
census_decennial_csv = (
|
||||
constants.DATA_PATH
|
||||
/ "dataset"
|
||||
/ "census_decennial_2010"
|
||||
/ "census_decennial_2020"
|
||||
/ "usa.csv"
|
||||
)
|
||||
self.census_decennial_df = pd.read_csv(
|
||||
|
@ -470,13 +470,13 @@ class ScoreETL(ExtractTransformLoad):
|
|||
field_names.EXPECTED_BUILDING_LOSS_RATE_FIELD,
|
||||
field_names.EXPECTED_AGRICULTURE_LOSS_RATE_FIELD,
|
||||
field_names.EXPECTED_POPULATION_LOSS_RATE_FIELD,
|
||||
field_names.CENSUS_DECENNIAL_HIGH_SCHOOL_ED_FIELD_2009,
|
||||
field_names.CENSUS_DECENNIAL_POVERTY_LESS_THAN_100_FPL_FIELD_2009,
|
||||
field_names.CENSUS_DECENNIAL_POVERTY_LESS_THAN_200_FPL_FIELD_2009,
|
||||
field_names.CENSUS_DECENNIAL_UNEMPLOYMENT_FIELD_2009,
|
||||
field_names.CENSUS_DECENNIAL_HIGH_SCHOOL_ED_FIELD_2019,
|
||||
field_names.CENSUS_DECENNIAL_POVERTY_LESS_THAN_100_FPL_FIELD_2019,
|
||||
field_names.CENSUS_DECENNIAL_POVERTY_LESS_THAN_200_FPL_FIELD_2019,
|
||||
field_names.CENSUS_DECENNIAL_UNEMPLOYMENT_FIELD_2019,
|
||||
field_names.CENSUS_UNEMPLOYMENT_FIELD_2010,
|
||||
field_names.CENSUS_POVERTY_LESS_THAN_100_FPL_FIELD_2010,
|
||||
field_names.CENSUS_DECENNIAL_TOTAL_POPULATION_FIELD_2009,
|
||||
field_names.CENSUS_DECENNIAL_TOTAL_POPULATION_FIELD_2019,
|
||||
field_names.UST_FIELD,
|
||||
field_names.DOT_TRAVEL_BURDEN_FIELD,
|
||||
field_names.FUTURE_FLOOD_RISK_FIELD,
|
||||
|
@ -542,8 +542,8 @@ class ScoreETL(ExtractTransformLoad):
|
|||
low_field_name=field_names.LOW_LIFE_EXPECTANCY_FIELD,
|
||||
),
|
||||
ReversePercentile(
|
||||
field_name=field_names.CENSUS_DECENNIAL_AREA_MEDIAN_INCOME_PERCENT_FIELD_2009,
|
||||
low_field_name=field_names.LOW_CENSUS_DECENNIAL_AREA_MEDIAN_INCOME_PERCENT_FIELD_2009,
|
||||
field_name=field_names.CENSUS_DECENNIAL_AREA_MEDIAN_INCOME_PERCENT_FIELD_2019,
|
||||
low_field_name=field_names.LOW_CENSUS_DECENNIAL_AREA_MEDIAN_INCOME_PERCENT_FIELD_2019,
|
||||
),
|
||||
]
|
||||
|
||||
|
@ -658,7 +658,7 @@ class ScoreETL(ExtractTransformLoad):
|
|||
df_copy[field_names.COMBINED_CENSUS_TOTAL_POPULATION_2010] = df_copy[
|
||||
[
|
||||
field_names.TOTAL_POP_FIELD,
|
||||
field_names.CENSUS_DECENNIAL_TOTAL_POPULATION_FIELD_2009,
|
||||
field_names.CENSUS_DECENNIAL_TOTAL_POPULATION_FIELD_2019,
|
||||
]
|
||||
].mean(axis=1, skipna=True)
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
# Decennial Census of Island Areas
|
||||
|
||||
Adding a new ETL folder for Decennial Census of Island Areas since the Island areas aren't included in ACS.
|
||||
Decennial Census of Island Areas since the Island areas aren't included in ACS.
|
||||
|
||||
There's the American Samoa Summary File, the Guam Summary File, the Commonwealth of the Northern Mariana Islands Summary File, and the US Virgin Islands Summary File:
|
||||
|
||||
1. https://api.census.gov/data/2010/dec/as.html
|
||||
1. https://api.census.gov/data/2010/dec/gu.html
|
||||
1. https://api.census.gov/data/2010/dec/mp.html
|
||||
1. https://api.census.gov/data/2010/dec/vi.html
|
||||
1. https://api.census.gov/data/2020/dec/dhcas.html
|
||||
1. https://api.census.gov/data/2020/dec/dhcgu.html
|
||||
1. https://api.census.gov/data/2020/dec/dhcmp.html
|
||||
1. https://api.census.gov/data/2020/dec/dhcvi.html
|
||||
|
|
|
@ -0,0 +1,190 @@
|
|||
from enum import Enum
|
||||
from data_pipeline.score import field_names
|
||||
|
||||
|
||||
class DEC_FIELD_NAMES(str, Enum):
|
||||
"""Field/column names for the decennial data"""
|
||||
|
||||
MALE_HIGH_SCHOOL_ED = "Total male high school graduates 25 and over"
|
||||
FEMALE_HIGH_SCHOOL_ED = "Total female high school graduates 25 and over"
|
||||
IMPUTED_COLLEGE_ATTENDANCE = "Percent enrollment in college, graduate or professional school, imputed"
|
||||
TOTAL_RACE_POPULATION = "Total population surveyed on racial data"
|
||||
BLACK = "Black or African American"
|
||||
AMERICAN_INDIAN = "American Indian / Alaska Native"
|
||||
ASIAN = "Asian"
|
||||
HAWAIIAN = "Native Hawaiian or Pacific"
|
||||
TWO_OR_MORE_RACES = "two or more races"
|
||||
NON_HISPANIC_WHITE = "White"
|
||||
HISPANIC = "Hispanic or Latino"
|
||||
OTHER_RACE = "other races"
|
||||
HOUSEHOLD_POVERTY_LEVEL_UNDER_0_5 = (
|
||||
"Household poverty level Under 0.50 IN 2019"
|
||||
)
|
||||
HOUSEHOLD_POVERTY_LEVEL_UNDER_0_74 = (
|
||||
"Household poverty level Under 0.74 IN 2019"
|
||||
)
|
||||
HOUSEHOLD_POVERTY_LEVEL_UNDER_0_99 = (
|
||||
"Household poverty level Under 0.99 IN 2019"
|
||||
)
|
||||
HOUSEHOLD_POVERTY_LEVEL_OVER_2_0 = (
|
||||
"Household poverty level Over 2.0 IN 2019"
|
||||
)
|
||||
TOTAL_HOUSEHOLD_POVERTY_LEVEL = "Total Household poverty level IN 2019"
|
||||
TERRITORY_MEDIAN_INCOME = "Territory Median Income"
|
||||
EMPLOYMENT_MALE_UNEMPLOYED = "Total males not in labor force"
|
||||
EMPLOYMENT_FEMALE_UNEMPLOYED = "Total females not in labor force"
|
||||
EMPLOYMENT_MALE_IN_LABOR_FORCE = "Total males in labor force"
|
||||
EMPLOYMENT_FEMALE_IN_LABOR_FORCE = "Total females in labor force"
|
||||
COLLEGE_ATTENDANCE_TOTAL_ENROLLED = "Total asked enrolled in college or graduate school (excludes military housing)"
|
||||
COLLEGE_NON_ATTENDANCE = "Percent of population not currently enrolled in college, graduate or professional school"
|
||||
COLLEGE_ATTENDANCE_MALE_ENROLLED = "Males enrolled in college or graduate school (excludes military housing)"
|
||||
COLLEGE_ATTENDANCE_FEMALE_ENROLLED = "Females enrolled in college or graduate school (excludes military housing)"
|
||||
COLLEGE_ATTENDANCE_POPULATION = (
|
||||
"Population enrolled in college, graduate or professional school"
|
||||
)
|
||||
COLLEGE_ATTENDANCE_PERCENT = (
|
||||
"Percent enrollment in college, graduate or professional school"
|
||||
)
|
||||
COLLEGE_NON_ATTENDANCE_PERCENT = "Percent of population not currently enrolled in college, graduate or professional school"
|
||||
|
||||
def __str__(self) -> str:
|
||||
"""This method removes the need to use the value attribute from the Enums"""
|
||||
return str.__str__(self)
|
||||
|
||||
|
||||
__FIELD_NAME_COMMON_XWALK = {
|
||||
"P1_001N": field_names.CENSUS_DECENNIAL_TOTAL_POPULATION_FIELD_2019,
|
||||
"PBG19_005N": DEC_FIELD_NAMES.MALE_HIGH_SCHOOL_ED,
|
||||
"PBG19_012N": DEC_FIELD_NAMES.FEMALE_HIGH_SCHOOL_ED,
|
||||
"PCT31_001N": DEC_FIELD_NAMES.COLLEGE_ATTENDANCE_TOTAL_ENROLLED,
|
||||
"PBG32_003N": DEC_FIELD_NAMES.EMPLOYMENT_MALE_IN_LABOR_FORCE,
|
||||
"PBG32_007N": DEC_FIELD_NAMES.EMPLOYMENT_MALE_UNEMPLOYED,
|
||||
"PBG32_010N": DEC_FIELD_NAMES.EMPLOYMENT_FEMALE_IN_LABOR_FORCE,
|
||||
"PBG32_014N": DEC_FIELD_NAMES.EMPLOYMENT_FEMALE_UNEMPLOYED,
|
||||
"PCT34_003N": DEC_FIELD_NAMES.COLLEGE_ATTENDANCE_MALE_ENROLLED,
|
||||
"PCT34_016N": DEC_FIELD_NAMES.COLLEGE_ATTENDANCE_FEMALE_ENROLLED,
|
||||
"PBG43_001N": field_names.CENSUS_DECENNIAL_MEDIAN_INCOME_2019,
|
||||
"PBG74_001N": DEC_FIELD_NAMES.TOTAL_HOUSEHOLD_POVERTY_LEVEL,
|
||||
"PBG74_002N": DEC_FIELD_NAMES.HOUSEHOLD_POVERTY_LEVEL_UNDER_0_5,
|
||||
"PBG74_003N": DEC_FIELD_NAMES.HOUSEHOLD_POVERTY_LEVEL_UNDER_0_74,
|
||||
"PBG74_004N": DEC_FIELD_NAMES.HOUSEHOLD_POVERTY_LEVEL_UNDER_0_99,
|
||||
"PBG74_010N": DEC_FIELD_NAMES.HOUSEHOLD_POVERTY_LEVEL_OVER_2_0,
|
||||
}
|
||||
"""
|
||||
Census variable to text column name mapping. For details on Census variables see:
|
||||
https://api.census.gov/data/2020/dec/dhcas/variables.html
|
||||
https://api.census.gov/data/2020/dec/dhcgu/variables.html
|
||||
https://api.census.gov/data/2020/dec/dhcmp/variables.html
|
||||
https://api.census.gov/data/2020/dec/dhcvi/variables.html
|
||||
"""
|
||||
|
||||
# Note that the 2010 census for island areas does not break out
|
||||
# hispanic and non-hispanic white, so this is slightly different from
|
||||
# our other demographic data
|
||||
__FIELD_NAME_AS_XWALK = {
|
||||
"PCT9_001N": DEC_FIELD_NAMES.TOTAL_RACE_POPULATION,
|
||||
"PCT9_003N": DEC_FIELD_NAMES.HAWAIIAN,
|
||||
"PCT9_079N": DEC_FIELD_NAMES.ASIAN,
|
||||
"PCT9_130N": DEC_FIELD_NAMES.NON_HISPANIC_WHITE,
|
||||
"PCT9_155N": DEC_FIELD_NAMES.BLACK,
|
||||
"PCT9_180N": DEC_FIELD_NAMES.AMERICAN_INDIAN,
|
||||
"PCT9_205N": DEC_FIELD_NAMES.OTHER_RACE,
|
||||
"PCT9_230N": DEC_FIELD_NAMES.TWO_OR_MORE_RACES,
|
||||
"P5_002N": DEC_FIELD_NAMES.HISPANIC,
|
||||
}
|
||||
"""American Samoa specific race fields."""
|
||||
|
||||
__FIELD_NAME_VI_XWALK = {
|
||||
"PCT7_001N": DEC_FIELD_NAMES.TOTAL_RACE_POPULATION,
|
||||
"PCT7_003N": DEC_FIELD_NAMES.BLACK,
|
||||
"PCT7_205N": DEC_FIELD_NAMES.ASIAN,
|
||||
"PCT7_230N": DEC_FIELD_NAMES.AMERICAN_INDIAN,
|
||||
"PCT7_255N": DEC_FIELD_NAMES.HAWAIIAN,
|
||||
"PCT7_280N": DEC_FIELD_NAMES.OTHER_RACE,
|
||||
"PCT7_305N": DEC_FIELD_NAMES.TWO_OR_MORE_RACES,
|
||||
"P5_021N": DEC_FIELD_NAMES.NON_HISPANIC_WHITE,
|
||||
"PCT6_003N": DEC_FIELD_NAMES.HISPANIC,
|
||||
}
|
||||
"""US Virgin Islands specific race fields."""
|
||||
|
||||
__FIELD_NAME_GU_XWALK = {
|
||||
"PCT10_001N": DEC_FIELD_NAMES.TOTAL_RACE_POPULATION,
|
||||
"PCT10_003N": DEC_FIELD_NAMES.HAWAIIAN,
|
||||
"PCT10_204N": DEC_FIELD_NAMES.ASIAN,
|
||||
"PCT10_330N": DEC_FIELD_NAMES.BLACK,
|
||||
"PCT10_355N": DEC_FIELD_NAMES.AMERICAN_INDIAN,
|
||||
"PCT10_380N": DEC_FIELD_NAMES.OTHER_RACE,
|
||||
"PCT10_405N": DEC_FIELD_NAMES.TWO_OR_MORE_RACES,
|
||||
"P5_026N": DEC_FIELD_NAMES.NON_HISPANIC_WHITE,
|
||||
"PCT9_003N": DEC_FIELD_NAMES.HISPANIC,
|
||||
}
|
||||
"""Guam specific race fields."""
|
||||
|
||||
__FIELD_NAME_MP_XWALK = {
|
||||
"PCT9_001N": DEC_FIELD_NAMES.TOTAL_RACE_POPULATION,
|
||||
"PCT9_003N": DEC_FIELD_NAMES.ASIAN,
|
||||
"PCT9_129N": DEC_FIELD_NAMES.HAWAIIAN,
|
||||
"PCT9_330N": DEC_FIELD_NAMES.BLACK,
|
||||
"PCT9_355N": DEC_FIELD_NAMES.AMERICAN_INDIAN,
|
||||
"PCT9_380N": DEC_FIELD_NAMES.OTHER_RACE,
|
||||
"PCT9_405N": DEC_FIELD_NAMES.TWO_OR_MORE_RACES,
|
||||
"P5_002N": DEC_FIELD_NAMES.HISPANIC,
|
||||
"P5_024N": DEC_FIELD_NAMES.NON_HISPANIC_WHITE,
|
||||
}
|
||||
"""Northern Mariana Islands specific race fields."""
|
||||
|
||||
OUTPUT_RACE_FIELDS = [
|
||||
DEC_FIELD_NAMES.BLACK,
|
||||
DEC_FIELD_NAMES.AMERICAN_INDIAN,
|
||||
DEC_FIELD_NAMES.ASIAN,
|
||||
DEC_FIELD_NAMES.HAWAIIAN,
|
||||
DEC_FIELD_NAMES.TWO_OR_MORE_RACES,
|
||||
DEC_FIELD_NAMES.NON_HISPANIC_WHITE,
|
||||
DEC_FIELD_NAMES.HISPANIC,
|
||||
DEC_FIELD_NAMES.OTHER_RACE,
|
||||
]
|
||||
"""Race fields to output in the results."""
|
||||
|
||||
DEC_TERRITORY_PARAMS = [
|
||||
{
|
||||
"state_abbreviation": "as",
|
||||
"fips": "60",
|
||||
# https://www2.census.gov/geo/docs/reference/codes2020/cou/st60_as_cou2020.txt
|
||||
"county_fips": ["010", "020", "030", "040", "050"],
|
||||
"xwalk": __FIELD_NAME_COMMON_XWALK | __FIELD_NAME_AS_XWALK,
|
||||
# Note: we hardcode the median income for each territory in this dict,
|
||||
# because that data is hard to programmatically access.
|
||||
# https://www.ruralhealthinfo.org/states/american-samoa
|
||||
"median_income": 26352,
|
||||
},
|
||||
{
|
||||
"state_abbreviation": "gu",
|
||||
"fips": "66",
|
||||
# https://www2.census.gov/geo/docs/reference/codes2020/cou/st66_gu_cou2020.txt
|
||||
"county_fips": ["010"],
|
||||
"xwalk": __FIELD_NAME_COMMON_XWALK | __FIELD_NAME_GU_XWALK,
|
||||
# https://www.ruralhealthinfo.org/states/guam
|
||||
# https://data.census.gov/table/DECENNIALDPGU2020.DP3?g=040XX00US66&d=DECIA%20Guam%20Demographic%20Profile
|
||||
"median_income": 58289,
|
||||
},
|
||||
{
|
||||
"state_abbreviation": "mp",
|
||||
"fips": "69",
|
||||
# https://www2.census.gov/geo/docs/reference/codes2020/cou/st69_mp_cou2020.txt
|
||||
"county_fips": ["085", "100", "110", "120"],
|
||||
"xwalk": __FIELD_NAME_COMMON_XWALK | __FIELD_NAME_MP_XWALK,
|
||||
# https://www.ruralhealthinfo.org/states/northern-mariana
|
||||
# https://data.census.gov/table/DECENNIALDPMP2020.DP3?d=DECIA%20Commonwealth%20of%20the%20Northern%20Mariana%20Islands%20Demographic%20Profile
|
||||
"median_income": 31362,
|
||||
},
|
||||
{
|
||||
"state_abbreviation": "vi",
|
||||
"fips": "78",
|
||||
# https://www2.census.gov/geo/docs/reference/codes2020/cou/st78_vi_cou2020.txt
|
||||
"county_fips": ["010", "020", "030"],
|
||||
"xwalk": __FIELD_NAME_COMMON_XWALK | __FIELD_NAME_VI_XWALK,
|
||||
# https://www.ruralhealthinfo.org/states/us-virgin-islands
|
||||
"median_income": 40408,
|
||||
},
|
||||
]
|
||||
"""List of territories to process."""
|
|
@ -1,14 +1,19 @@
|
|||
import json
|
||||
from typing import List
|
||||
import os
|
||||
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
import json
|
||||
from typing import List
|
||||
from pathlib import Path
|
||||
from data_pipeline.etl.sources.census_decennial.constants import (
|
||||
DEC_TERRITORY_PARAMS,
|
||||
DEC_FIELD_NAMES,
|
||||
OUTPUT_RACE_FIELDS,
|
||||
)
|
||||
from data_pipeline.etl.base import ExtractTransformLoad
|
||||
from data_pipeline.score import field_names
|
||||
from data_pipeline.utils import get_module_logger
|
||||
from data_pipeline.etl.datasource import DataSource
|
||||
from data_pipeline.etl.datasource import FileDataSource
|
||||
from data_pipeline.score import field_names
|
||||
from data_pipeline.utils import get_module_logger
|
||||
|
||||
pd.options.mode.chained_assignment = "raise"
|
||||
|
||||
|
@ -16,514 +21,209 @@ logger = get_module_logger(__name__)
|
|||
|
||||
|
||||
class CensusDecennialETL(ExtractTransformLoad):
|
||||
def __init__(self):
|
||||
self.DECENNIAL_YEAR = 2010
|
||||
self.OUTPUT_PATH = (
|
||||
self.DATA_PATH
|
||||
/ "dataset"
|
||||
/ f"census_decennial_{self.DECENNIAL_YEAR}"
|
||||
)
|
||||
DECENNIAL_YEAR = 2020
|
||||
OUTPUT_PATH = (
|
||||
ExtractTransformLoad.DATA_PATH
|
||||
/ "dataset"
|
||||
/ f"census_decennial_{DECENNIAL_YEAR}"
|
||||
)
|
||||
|
||||
# Income Fields
|
||||
# AS, GU, and MP all share the same variable names, but VI is different
|
||||
# https://api.census.gov/data/2010/dec/as.html
|
||||
# https://api.census.gov/data/2010/dec/gu/variables.html
|
||||
# https://api.census.gov/data/2010/dec/mp/variables.html
|
||||
# https://api.census.gov/data/2010/dec/vi/variables.html
|
||||
|
||||
# Total population field is the same in all island areas
|
||||
self.TOTAL_POP_FIELD = self.TOTAL_POP_VI_FIELD = "P001001"
|
||||
self.TOTAL_POP_FIELD_NAME = "Total population in 2009"
|
||||
|
||||
self.MEDIAN_INCOME_FIELD = "PBG049001"
|
||||
self.MEDIAN_INCOME_VI_FIELD = "PBG047001"
|
||||
self.MEDIAN_INCOME_FIELD_NAME = "Median household income in 2009 ($)"
|
||||
self.AREA_MEDIAN_INCOME_FIELD_NAME = (
|
||||
"Median household income as a percent of "
|
||||
"territory median income in 2009"
|
||||
def __get_api_url(
|
||||
self,
|
||||
state_abbreviation: str,
|
||||
name_list: List[str],
|
||||
fips: str,
|
||||
county: str,
|
||||
) -> str:
|
||||
url = (
|
||||
f"https://api.census.gov/data/{self.DECENNIAL_YEAR}/dec/dhc{state_abbreviation}?get=NAME,{name_list}"
|
||||
+ f"&for=tract:*&in=state:{fips}%20county:{county}"
|
||||
)
|
||||
|
||||
self.TERRITORY_MEDIAN_INCOME_FIELD = "Territory Median Income"
|
||||
|
||||
self.TOTAL_HOUSEHOLD_RATIO_INCOME_TO_POVERTY_LEVEL_FIELD = "PBG083001"
|
||||
self.TOTAL_HOUSEHOLD_RATIO_INCOME_TO_POVERTY_LEVEL_VI_FIELD = (
|
||||
"PBG077001"
|
||||
)
|
||||
self.TOTAL_HOUSEHOLD_RATIO_INCOME_TO_POVERTY_LEVEL_FIELD_NAME = (
|
||||
"TOTAL; RATIO OF INCOME TO POVERTY LEVEL IN 2009"
|
||||
)
|
||||
|
||||
self.HOUSEHOLD_OVER_200_PERC_POVERTY_LEVEL_FIELD = "PBG083010"
|
||||
self.HOUSEHOLD_OVER_200_PERC_POVERTY_LEVEL_VI_FIELD = "PBG077010"
|
||||
self.HOUSEHOLD_OVER_200_PERC_POVERTY_LEVEL_FIELD_NAME = (
|
||||
"Total!!2.00 and over; RATIO OF INCOME TO POVERTY LEVEL IN 2009"
|
||||
)
|
||||
|
||||
self.PERCENTAGE_HOUSEHOLDS_BELOW_200_PERC_POVERTY_LEVEL_FIELD_NAME = (
|
||||
"Percentage households below 200% of federal poverty line in 2009"
|
||||
)
|
||||
|
||||
# We will combine three fields to get households < 100% FPL.
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_ONE = (
|
||||
"PBG083002" # Total!!Under .50
|
||||
)
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_TWO = (
|
||||
"PBG083003" # Total!!.50 to .74
|
||||
)
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_THREE = (
|
||||
"PBG083004" # Total!!.75 to .99
|
||||
)
|
||||
|
||||
# Same fields, for Virgin Islands.
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_VI_PART_ONE = (
|
||||
"PBG077002" # Total!!Under .50
|
||||
)
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_VI_PART_TWO = (
|
||||
"PBG077003" # Total!!.50 to .74
|
||||
)
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_VI_PART_THREE = (
|
||||
"PBG077004" # Total!!.75 to .99
|
||||
)
|
||||
|
||||
self.HOUSEHOLD_OVER_200_PERC_POVERTY_LEVEL_FIELD = "PBG083010"
|
||||
self.HOUSEHOLD_OVER_200_PERC_POVERTY_LEVEL_VI_FIELD = "PBG077010"
|
||||
self.HOUSEHOLD_OVER_200_PERC_POVERTY_LEVEL_FIELD_NAME = (
|
||||
"Total!!2.00 and over; RATIO OF INCOME TO POVERTY LEVEL IN 2009"
|
||||
)
|
||||
|
||||
self.PERCENTAGE_HOUSEHOLDS_BELOW_100_PERC_POVERTY_LEVEL_FIELD_NAME = (
|
||||
"Percentage households below 100% of federal poverty line in 2009"
|
||||
)
|
||||
|
||||
# High School Education Fields
|
||||
self.TOTAL_POPULATION_FIELD = "PBG026001"
|
||||
self.TOTAL_POPULATION_VI_FIELD = "PCT032001"
|
||||
self.TOTAL_POPULATION_FIELD_NAME = "Total; SEX BY EDUCATIONAL ATTAINMENT FOR THE POPULATION 25 YEARS AND OVER"
|
||||
|
||||
self.MALE_HIGH_SCHOOL_ED_FIELD = "PBG026005"
|
||||
self.MALE_HIGH_SCHOOL_ED_VI_FIELD = "PCT032011"
|
||||
self.MALE_HIGH_SCHOOL_ED_FIELD_NAME = (
|
||||
"Total!!Male!!High school graduate, GED, or alternative; "
|
||||
"SEX BY EDUCATIONAL ATTAINMENT FOR THE POPULATION 25 YEARS AND OVER"
|
||||
)
|
||||
|
||||
self.FEMALE_HIGH_SCHOOL_ED_FIELD = "PBG026012"
|
||||
self.FEMALE_HIGH_SCHOOL_ED_VI_FIELD = "PCT032028"
|
||||
self.FEMALE_HIGH_SCHOOL_ED_FIELD_NAME = (
|
||||
"Total!!Female!!High school graduate, GED, or alternative; "
|
||||
"SEX BY EDUCATIONAL ATTAINMENT FOR THE POPULATION 25 YEARS AND OVER"
|
||||
)
|
||||
|
||||
self.PERCENTAGE_HIGH_SCHOOL_ED_FIELD_NAME = "Percent individuals age 25 or over with less than high school degree in 2009"
|
||||
|
||||
# Employment fields
|
||||
self.EMPLOYMENT_MALE_IN_LABOR_FORCE_FIELD = (
|
||||
"PBG038003" # Total!!Male!!In labor force
|
||||
)
|
||||
self.EMPLOYMENT_MALE_UNEMPLOYED_FIELD = (
|
||||
"PBG038007" # Total!!Male!!In labor force!!Civilian!!Unemployed
|
||||
)
|
||||
self.EMPLOYMENT_FEMALE_IN_LABOR_FORCE_FIELD = (
|
||||
"PBG038010" # Total!!Female!!In labor force
|
||||
)
|
||||
self.EMPLOYMENT_FEMALE_UNEMPLOYED_FIELD = (
|
||||
"PBG038014" # Total!!Female!!In labor force!!Civilian!!Unemployed
|
||||
)
|
||||
|
||||
# Same fields, Virgin Islands.
|
||||
self.EMPLOYMENT_MALE_IN_LABOR_FORCE_VI_FIELD = (
|
||||
"PBG036003" # Total!!Male!!In labor force
|
||||
)
|
||||
self.EMPLOYMENT_MALE_UNEMPLOYED_VI_FIELD = (
|
||||
"PBG036007" # Total!!Male!!In labor force!!Civilian!!Unemployed
|
||||
)
|
||||
self.EMPLOYMENT_FEMALE_IN_LABOR_FORCE_VI_FIELD = (
|
||||
"PBG036010" # Total!!Female!!In labor force
|
||||
)
|
||||
self.EMPLOYMENT_FEMALE_UNEMPLOYED_VI_FIELD = (
|
||||
"PBG036014" # Total!!Female!!In labor force!!Civilian!!Unemployed
|
||||
)
|
||||
|
||||
self.UNEMPLOYMENT_FIELD_NAME = (
|
||||
field_names.CENSUS_DECENNIAL_UNEMPLOYMENT_FIELD_2009
|
||||
)
|
||||
|
||||
# Race/Ethnicity fields
|
||||
self.TOTAL_RACE_POPULATION_FIELD = "PCT086001" # Total
|
||||
self.ASIAN_FIELD = "PCT086002" # Total!!Asian
|
||||
self.BLACK_FIELD = "PCT086003" # Total!!Black or African American
|
||||
self.HAWAIIAN_FIELD = (
|
||||
"PCT086004" # Total!!Native Hawaiian and Other Pacific Islander
|
||||
)
|
||||
# Note that the 2010 census for island araeas does not break out
|
||||
# hispanic and non-hispanic white, so this is slightly different from
|
||||
# our other demographic data
|
||||
self.NON_HISPANIC_WHITE_FIELD = "PCT086005" # Total!!White
|
||||
self.HISPANIC_FIELD = "PCT086006" # Total!!Hispanic or Latino
|
||||
self.OTHER_RACE_FIELD = "PCT086007" # Total!!Other Ethnic Origin or Ra
|
||||
|
||||
self.TOTAL_RACE_POPULATION_VI_FIELD = "P003001" # Total
|
||||
self.BLACK_VI_FIELD = (
|
||||
"P003003" # Total!!One race!!Black or African American alone
|
||||
)
|
||||
self.AMERICAN_INDIAN_VI_FIELD = "P003005" # Total!!One race!!American Indian and Alaska Native alone
|
||||
self.ASIAN_VI_FIELD = "P003006" # Total!!One race!!Asian alone
|
||||
self.HAWAIIAN_VI_FIELD = "P003007" # Total!!One race!!Native Hawaiian and Other Pacific Islander alone
|
||||
self.TWO_OR_MORE_RACES_VI_FIELD = "P003009" # Total!!Two or More Races
|
||||
self.NON_HISPANIC_WHITE_VI_FIELD = (
|
||||
"P005006" # Total!!Not Hispanic or Latino!!One race!!White alone
|
||||
)
|
||||
self.HISPANIC_VI_FIELD = "P005002" # Total!!Hispanic or Latino
|
||||
self.OTHER_RACE_VI_FIELD = (
|
||||
"P003008" # Total!!One race!!Some Other Race alone
|
||||
)
|
||||
self.TOTAL_RACE_POPULATION_VI_FIELD = "P003001" # Total
|
||||
|
||||
self.TOTAL_RACE_POPULATION_FIELD_NAME = (
|
||||
"Total population surveyed on racial data"
|
||||
)
|
||||
self.BLACK_FIELD_NAME = "Black or African American"
|
||||
self.AMERICAN_INDIAN_FIELD_NAME = "American Indian / Alaska Native"
|
||||
self.ASIAN_FIELD_NAME = "Asian"
|
||||
self.HAWAIIAN_FIELD_NAME = "Native Hawaiian or Pacific"
|
||||
self.TWO_OR_MORE_RACES_FIELD_NAME = "two or more races"
|
||||
self.NON_HISPANIC_WHITE_FIELD_NAME = "White"
|
||||
self.HISPANIC_FIELD_NAME = "Hispanic or Latino"
|
||||
# Note that `other` is lowercase because the whole field will show up in the download
|
||||
# file as "Percent other races"
|
||||
self.OTHER_RACE_FIELD_NAME = "other races"
|
||||
|
||||
# Name output demographics fields.
|
||||
self.RE_OUTPUT_FIELDS = [
|
||||
self.BLACK_FIELD_NAME,
|
||||
self.AMERICAN_INDIAN_FIELD_NAME,
|
||||
self.ASIAN_FIELD_NAME,
|
||||
self.HAWAIIAN_FIELD_NAME,
|
||||
self.TWO_OR_MORE_RACES_FIELD_NAME,
|
||||
self.NON_HISPANIC_WHITE_FIELD_NAME,
|
||||
self.HISPANIC_FIELD_NAME,
|
||||
self.OTHER_RACE_FIELD_NAME,
|
||||
]
|
||||
|
||||
var_list = [
|
||||
self.MEDIAN_INCOME_FIELD,
|
||||
self.TOTAL_HOUSEHOLD_RATIO_INCOME_TO_POVERTY_LEVEL_FIELD,
|
||||
self.HOUSEHOLD_OVER_200_PERC_POVERTY_LEVEL_FIELD,
|
||||
self.TOTAL_POPULATION_FIELD,
|
||||
self.MALE_HIGH_SCHOOL_ED_FIELD,
|
||||
self.FEMALE_HIGH_SCHOOL_ED_FIELD,
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_ONE,
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_TWO,
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_THREE,
|
||||
self.EMPLOYMENT_MALE_IN_LABOR_FORCE_FIELD,
|
||||
self.EMPLOYMENT_MALE_UNEMPLOYED_FIELD,
|
||||
self.EMPLOYMENT_FEMALE_IN_LABOR_FORCE_FIELD,
|
||||
self.EMPLOYMENT_FEMALE_UNEMPLOYED_FIELD,
|
||||
self.TOTAL_POP_FIELD,
|
||||
self.TOTAL_RACE_POPULATION_FIELD,
|
||||
self.ASIAN_FIELD,
|
||||
self.BLACK_FIELD,
|
||||
self.HAWAIIAN_FIELD,
|
||||
self.NON_HISPANIC_WHITE_FIELD,
|
||||
self.HISPANIC_FIELD,
|
||||
self.OTHER_RACE_FIELD,
|
||||
]
|
||||
var_list = ",".join(var_list)
|
||||
|
||||
var_list_vi = [
|
||||
self.MEDIAN_INCOME_VI_FIELD,
|
||||
self.TOTAL_HOUSEHOLD_RATIO_INCOME_TO_POVERTY_LEVEL_VI_FIELD,
|
||||
self.HOUSEHOLD_OVER_200_PERC_POVERTY_LEVEL_VI_FIELD,
|
||||
self.TOTAL_POPULATION_VI_FIELD,
|
||||
self.MALE_HIGH_SCHOOL_ED_VI_FIELD,
|
||||
self.FEMALE_HIGH_SCHOOL_ED_VI_FIELD,
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_VI_PART_ONE,
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_VI_PART_TWO,
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_VI_PART_THREE,
|
||||
self.EMPLOYMENT_MALE_IN_LABOR_FORCE_VI_FIELD,
|
||||
self.EMPLOYMENT_MALE_UNEMPLOYED_VI_FIELD,
|
||||
self.EMPLOYMENT_FEMALE_IN_LABOR_FORCE_VI_FIELD,
|
||||
self.EMPLOYMENT_FEMALE_UNEMPLOYED_VI_FIELD,
|
||||
self.TOTAL_POP_VI_FIELD,
|
||||
self.BLACK_VI_FIELD,
|
||||
self.AMERICAN_INDIAN_VI_FIELD,
|
||||
self.ASIAN_VI_FIELD,
|
||||
self.HAWAIIAN_VI_FIELD,
|
||||
self.TWO_OR_MORE_RACES_VI_FIELD,
|
||||
self.NON_HISPANIC_WHITE_VI_FIELD,
|
||||
self.HISPANIC_VI_FIELD,
|
||||
self.OTHER_RACE_VI_FIELD,
|
||||
self.TOTAL_RACE_POPULATION_VI_FIELD,
|
||||
]
|
||||
var_list_vi = ",".join(var_list_vi)
|
||||
|
||||
self.FIELD_NAME_XWALK = {
|
||||
self.MEDIAN_INCOME_FIELD: self.MEDIAN_INCOME_FIELD_NAME,
|
||||
self.MEDIAN_INCOME_VI_FIELD: self.MEDIAN_INCOME_FIELD_NAME,
|
||||
self.TOTAL_HOUSEHOLD_RATIO_INCOME_TO_POVERTY_LEVEL_FIELD: self.TOTAL_HOUSEHOLD_RATIO_INCOME_TO_POVERTY_LEVEL_FIELD_NAME,
|
||||
self.TOTAL_HOUSEHOLD_RATIO_INCOME_TO_POVERTY_LEVEL_VI_FIELD: self.TOTAL_HOUSEHOLD_RATIO_INCOME_TO_POVERTY_LEVEL_FIELD_NAME,
|
||||
self.HOUSEHOLD_OVER_200_PERC_POVERTY_LEVEL_FIELD: self.HOUSEHOLD_OVER_200_PERC_POVERTY_LEVEL_FIELD_NAME,
|
||||
self.HOUSEHOLD_OVER_200_PERC_POVERTY_LEVEL_VI_FIELD: self.HOUSEHOLD_OVER_200_PERC_POVERTY_LEVEL_FIELD_NAME,
|
||||
self.TOTAL_POPULATION_FIELD: self.TOTAL_POPULATION_FIELD_NAME,
|
||||
self.TOTAL_POPULATION_VI_FIELD: self.TOTAL_POPULATION_FIELD_NAME,
|
||||
self.MALE_HIGH_SCHOOL_ED_FIELD: self.MALE_HIGH_SCHOOL_ED_FIELD_NAME,
|
||||
self.MALE_HIGH_SCHOOL_ED_VI_FIELD: self.MALE_HIGH_SCHOOL_ED_FIELD_NAME,
|
||||
self.FEMALE_HIGH_SCHOOL_ED_FIELD: self.FEMALE_HIGH_SCHOOL_ED_FIELD_NAME,
|
||||
self.FEMALE_HIGH_SCHOOL_ED_VI_FIELD: self.FEMALE_HIGH_SCHOOL_ED_FIELD_NAME,
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_ONE: self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_ONE,
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_VI_PART_ONE: self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_ONE,
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_TWO: self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_TWO,
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_VI_PART_TWO: self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_TWO,
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_THREE: self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_THREE,
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_VI_PART_THREE: self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_THREE,
|
||||
self.EMPLOYMENT_MALE_IN_LABOR_FORCE_VI_FIELD: self.EMPLOYMENT_MALE_IN_LABOR_FORCE_FIELD,
|
||||
self.EMPLOYMENT_MALE_UNEMPLOYED_VI_FIELD: self.EMPLOYMENT_MALE_UNEMPLOYED_FIELD,
|
||||
self.EMPLOYMENT_FEMALE_IN_LABOR_FORCE_VI_FIELD: self.EMPLOYMENT_FEMALE_IN_LABOR_FORCE_FIELD,
|
||||
self.EMPLOYMENT_FEMALE_UNEMPLOYED_VI_FIELD: self.EMPLOYMENT_FEMALE_UNEMPLOYED_FIELD,
|
||||
self.EMPLOYMENT_MALE_IN_LABOR_FORCE_FIELD: self.EMPLOYMENT_MALE_IN_LABOR_FORCE_FIELD,
|
||||
self.EMPLOYMENT_MALE_UNEMPLOYED_FIELD: self.EMPLOYMENT_MALE_UNEMPLOYED_FIELD,
|
||||
self.EMPLOYMENT_FEMALE_IN_LABOR_FORCE_FIELD: self.EMPLOYMENT_FEMALE_IN_LABOR_FORCE_FIELD,
|
||||
self.EMPLOYMENT_FEMALE_UNEMPLOYED_FIELD: self.EMPLOYMENT_FEMALE_UNEMPLOYED_FIELD,
|
||||
self.TOTAL_RACE_POPULATION_FIELD: self.TOTAL_RACE_POPULATION_FIELD_NAME,
|
||||
self.TOTAL_RACE_POPULATION_VI_FIELD: self.TOTAL_RACE_POPULATION_FIELD_NAME,
|
||||
# Note there is no American Indian data for AS/GU/MI
|
||||
self.AMERICAN_INDIAN_VI_FIELD: self.AMERICAN_INDIAN_FIELD_NAME,
|
||||
self.ASIAN_FIELD: self.ASIAN_FIELD_NAME,
|
||||
self.ASIAN_VI_FIELD: self.ASIAN_FIELD_NAME,
|
||||
self.BLACK_FIELD: self.BLACK_FIELD_NAME,
|
||||
self.BLACK_VI_FIELD: self.BLACK_FIELD_NAME,
|
||||
self.HAWAIIAN_FIELD: self.HAWAIIAN_FIELD_NAME,
|
||||
self.HAWAIIAN_VI_FIELD: self.HAWAIIAN_FIELD_NAME,
|
||||
self.TWO_OR_MORE_RACES_VI_FIELD: self.TWO_OR_MORE_RACES_FIELD_NAME,
|
||||
self.NON_HISPANIC_WHITE_FIELD: self.NON_HISPANIC_WHITE_FIELD_NAME,
|
||||
self.NON_HISPANIC_WHITE_VI_FIELD: self.NON_HISPANIC_WHITE_FIELD_NAME,
|
||||
self.HISPANIC_FIELD: self.HISPANIC_FIELD_NAME,
|
||||
self.HISPANIC_VI_FIELD: self.HISPANIC_FIELD_NAME,
|
||||
self.OTHER_RACE_FIELD: self.OTHER_RACE_FIELD_NAME,
|
||||
self.OTHER_RACE_VI_FIELD: self.OTHER_RACE_FIELD_NAME,
|
||||
}
|
||||
|
||||
# To do: Ask Census Slack Group about whether you need to hardcode the county fips
|
||||
# https://uscensusbureau.slack.com/archives/C6DGLC05B/p1635218909012600
|
||||
self.ISLAND_TERRITORIES = [
|
||||
{
|
||||
"state_abbreviation": "as",
|
||||
"fips": "60",
|
||||
"county_fips": ["010", "020", "030", "040", "050"],
|
||||
"var_list": var_list,
|
||||
# Note: we hardcode the median income for each territory in this dict,
|
||||
# because that data is hard to programmatically access.
|
||||
self.TERRITORY_MEDIAN_INCOME_FIELD: 23892,
|
||||
},
|
||||
{
|
||||
"state_abbreviation": "gu",
|
||||
"fips": "66",
|
||||
"county_fips": ["010"],
|
||||
"var_list": var_list,
|
||||
self.TERRITORY_MEDIAN_INCOME_FIELD: 48274,
|
||||
},
|
||||
{
|
||||
"state_abbreviation": "mp",
|
||||
"fips": "69",
|
||||
"county_fips": ["085", "100", "110", "120"],
|
||||
"var_list": var_list,
|
||||
self.TERRITORY_MEDIAN_INCOME_FIELD: 19958,
|
||||
},
|
||||
{
|
||||
"state_abbreviation": "vi",
|
||||
"fips": "78",
|
||||
"county_fips": ["010", "020", "030"],
|
||||
"var_list": var_list_vi,
|
||||
self.TERRITORY_MEDIAN_INCOME_FIELD: 37254,
|
||||
},
|
||||
]
|
||||
|
||||
self.API_URL = (
|
||||
"https://api.census.gov/data/{}/dec/{}?get=NAME,{}"
|
||||
+ "&for=tract:*&in=state:{}%20county:{}"
|
||||
)
|
||||
|
||||
census_api_key = os.environ.get("CENSUS_API_KEY")
|
||||
if census_api_key:
|
||||
self.API_URL = self.API_URL + f"&key={census_api_key}"
|
||||
url += f"&key={census_api_key}"
|
||||
return url
|
||||
|
||||
self.final_race_fields: List[str] = []
|
||||
def __get_destination_path(
|
||||
self,
|
||||
state_abbreviation: str,
|
||||
fips: str,
|
||||
county: str,
|
||||
test_path: Path = None,
|
||||
) -> str:
|
||||
root_path = test_path or self.get_sources_path()
|
||||
return (
|
||||
root_path
|
||||
/ str(self.DECENNIAL_YEAR)
|
||||
/ state_abbreviation
|
||||
/ fips
|
||||
/ county
|
||||
/ "census.json"
|
||||
)
|
||||
|
||||
self.df: pd.DataFrame
|
||||
self.df_vi: pd.DataFrame
|
||||
self.df_all: pd.DataFrame
|
||||
|
||||
def get_data_sources(self) -> [DataSource]:
|
||||
def __init__(self):
|
||||
self.df_all = pd.DataFrame()
|
||||
self.final_race_fields = []
|
||||
|
||||
def get_data_sources(self) -> List[DataSource]:
|
||||
sources = []
|
||||
|
||||
for island in self.ISLAND_TERRITORIES:
|
||||
for island in DEC_TERRITORY_PARAMS:
|
||||
for county in island["county_fips"]:
|
||||
|
||||
api_url = self.API_URL.format(
|
||||
self.DECENNIAL_YEAR,
|
||||
api_url = self.__get_api_url(
|
||||
island["state_abbreviation"],
|
||||
island["var_list"],
|
||||
",".join(island["xwalk"].keys()),
|
||||
island["fips"],
|
||||
county,
|
||||
)
|
||||
|
||||
sources.append(
|
||||
FileDataSource(
|
||||
source=api_url,
|
||||
destination=self.get_sources_path()
|
||||
/ str(self.DECENNIAL_YEAR)
|
||||
/ island["state_abbreviation"]
|
||||
/ island["fips"]
|
||||
/ county
|
||||
/ "census.json",
|
||||
api_url,
|
||||
self.__get_destination_path(
|
||||
island["state_abbreviation"], island["fips"], county
|
||||
),
|
||||
)
|
||||
)
|
||||
|
||||
return sources
|
||||
|
||||
def extract(self, use_cached_data_sources: bool = False) -> None:
|
||||
|
||||
super().extract(
|
||||
use_cached_data_sources
|
||||
) # download and extract data sources
|
||||
|
||||
dfs = []
|
||||
dfs_vi = []
|
||||
for island in self.ISLAND_TERRITORIES:
|
||||
logger.debug(
|
||||
f"Downloading data for state/territory {island['state_abbreviation']}"
|
||||
)
|
||||
for county in island["county_fips"]:
|
||||
|
||||
def extract(
|
||||
self,
|
||||
use_cached_data_sources: bool = False,
|
||||
test_territory_params=None,
|
||||
test_path: Path = None,
|
||||
) -> None:
|
||||
super().extract(use_cached_data_sources)
|
||||
for territory in test_territory_params or DEC_TERRITORY_PARAMS:
|
||||
for county in territory["county_fips"]:
|
||||
abbr = territory["state_abbreviation"]
|
||||
file_path = self.__get_destination_path(
|
||||
abbr, territory["fips"], county, test_path=test_path
|
||||
)
|
||||
try:
|
||||
filepath = (
|
||||
self.get_sources_path()
|
||||
/ str(self.DECENNIAL_YEAR)
|
||||
/ island["state_abbreviation"]
|
||||
/ island["fips"]
|
||||
/ county
|
||||
/ "census.json"
|
||||
)
|
||||
df = json.load(filepath.open())
|
||||
except ValueError as e:
|
||||
json_data = json.load(file_path.open())
|
||||
except (FileNotFoundError, ValueError) as e:
|
||||
logger.error(
|
||||
f"Could not load content in census decennial ETL because {e}."
|
||||
)
|
||||
raise
|
||||
df = pd.DataFrame(json_data[1:], columns=json_data[0])
|
||||
# Rename the columns to their common names
|
||||
df.rename(columns=territory["xwalk"], inplace=True)
|
||||
|
||||
# First row is the header
|
||||
df = pd.DataFrame(df[1:], columns=df[0])
|
||||
# Convert columns to numeric where applicable
|
||||
for column in df.columns:
|
||||
if column not in ["state", "county", "NAME", "tract"]:
|
||||
df[column] = pd.to_numeric(df[column], errors="ignore")
|
||||
|
||||
for col in island["var_list"].split(","):
|
||||
# Converting appropriate variables to numeric.
|
||||
# Also replacing 0s with NaNs
|
||||
df[col] = pd.to_numeric(df[col])
|
||||
# Add the territory median income
|
||||
df.loc[
|
||||
df[field_names.CENSUS_DECENNIAL_TOTAL_POPULATION_FIELD_2019]
|
||||
> 0,
|
||||
DEC_FIELD_NAMES.TERRITORY_MEDIAN_INCOME,
|
||||
] = territory["median_income"]
|
||||
self.df_all = pd.concat([self.df_all, df])
|
||||
|
||||
# TO-DO: CHECK THIS. I think it makes sense to replace 0 with NaN
|
||||
# because for our variables of interest (e.g. Median Household Income,
|
||||
# it doesn't make sense for that to be 0.)
|
||||
# Likely, it's actually missing but can't find a cite for that in the docs
|
||||
df[col] = df[col].replace(0, np.nan)
|
||||
|
||||
if island["state_abbreviation"] == "vi":
|
||||
dfs_vi.append(df)
|
||||
else:
|
||||
dfs.append(df)
|
||||
|
||||
self.df = pd.concat(dfs)
|
||||
self.df_vi = pd.concat(dfs_vi)
|
||||
def _merge_tracts_2010_compatibility(self):
|
||||
"""Merges tract 69120950200 to match 2010 tracts"""
|
||||
# MP 69/120 69120950200 = 69120950201, 69120950202
|
||||
# Tract has been split, but 69120950202 has no data, so we just make 69120950200 = 69120950201
|
||||
self.df_all = self.df_all.drop(
|
||||
self.df_all[
|
||||
self.df_all[field_names.GEOID_TRACT_FIELD] == "69120950202"
|
||||
].index
|
||||
)
|
||||
self.df_all.loc[
|
||||
self.df_all[field_names.GEOID_TRACT_FIELD] == "69120950201",
|
||||
field_names.GEOID_TRACT_FIELD,
|
||||
] = "69120950200"
|
||||
|
||||
def transform(self) -> None:
|
||||
# Rename All Fields
|
||||
self.df.rename(columns=self.FIELD_NAME_XWALK, inplace=True)
|
||||
self.df_vi.rename(columns=self.FIELD_NAME_XWALK, inplace=True)
|
||||
# Creating Geo ID (Census Block Group) Field Name
|
||||
self.df_all[field_names.GEOID_TRACT_FIELD] = (
|
||||
self.df_all["state"] + self.df_all["county"] + self.df_all["tract"]
|
||||
)
|
||||
|
||||
# Combine the dfs after renaming
|
||||
self.df_all = pd.concat([self.df, self.df_vi])
|
||||
# Combine the two MP 2020 tracts that were split from one 2010 tract
|
||||
self._merge_tracts_2010_compatibility()
|
||||
|
||||
# Rename total population:
|
||||
self.df_all[self.TOTAL_POP_FIELD_NAME] = self.df_all[
|
||||
self.TOTAL_POP_FIELD
|
||||
# Replace invalid numeric values with NaN
|
||||
numeric_columns = self.df_all.select_dtypes(include="number").columns
|
||||
for num_column in numeric_columns:
|
||||
self.df_all.loc[self.df_all[num_column] < -999, num_column] = np.nan
|
||||
|
||||
# Percentage of households below 100% FPL
|
||||
self.df_all[
|
||||
field_names.CENSUS_DECENNIAL_POVERTY_LESS_THAN_100_FPL_FIELD_2019
|
||||
] = (
|
||||
self.df_all[DEC_FIELD_NAMES.HOUSEHOLD_POVERTY_LEVEL_UNDER_0_5]
|
||||
+ self.df_all[DEC_FIELD_NAMES.HOUSEHOLD_POVERTY_LEVEL_UNDER_0_74]
|
||||
+ self.df_all[DEC_FIELD_NAMES.HOUSEHOLD_POVERTY_LEVEL_UNDER_0_99]
|
||||
) / self.df_all[
|
||||
DEC_FIELD_NAMES.TOTAL_HOUSEHOLD_POVERTY_LEVEL
|
||||
]
|
||||
|
||||
# Percentage of households below 200% which is
|
||||
# [PBG083001 (total) - PBG083010 (num households over 200%)] / PBG083001 (total)
|
||||
self.df_all[
|
||||
self.PERCENTAGE_HOUSEHOLDS_BELOW_200_PERC_POVERTY_LEVEL_FIELD_NAME
|
||||
field_names.CENSUS_DECENNIAL_POVERTY_LESS_THAN_200_FPL_FIELD_2019
|
||||
] = (
|
||||
self.df_all[
|
||||
self.TOTAL_HOUSEHOLD_RATIO_INCOME_TO_POVERTY_LEVEL_FIELD_NAME
|
||||
]
|
||||
- self.df_all[self.HOUSEHOLD_OVER_200_PERC_POVERTY_LEVEL_FIELD_NAME]
|
||||
self.df_all[DEC_FIELD_NAMES.TOTAL_HOUSEHOLD_POVERTY_LEVEL]
|
||||
- self.df_all[DEC_FIELD_NAMES.HOUSEHOLD_POVERTY_LEVEL_OVER_2_0]
|
||||
) / self.df_all[
|
||||
self.TOTAL_HOUSEHOLD_RATIO_INCOME_TO_POVERTY_LEVEL_FIELD_NAME
|
||||
]
|
||||
|
||||
# Percentage of households below 100% FPL
|
||||
# which we get by adding `Total!!Under .50`, `Total!!.50 to .74`, ` Total!!.75 to .99`,
|
||||
# and then dividing by PBG083001 (total)
|
||||
self.df_all[
|
||||
self.PERCENTAGE_HOUSEHOLDS_BELOW_100_PERC_POVERTY_LEVEL_FIELD_NAME
|
||||
] = (
|
||||
self.df_all[
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_ONE
|
||||
]
|
||||
+ self.df_all[
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_TWO
|
||||
]
|
||||
+ self.df_all[
|
||||
self.HOUSEHOLD_UNDER_100_PERC_POVERTY_LEVEL_FIELD_PART_THREE
|
||||
]
|
||||
) / self.df_all[
|
||||
self.TOTAL_HOUSEHOLD_RATIO_INCOME_TO_POVERTY_LEVEL_FIELD_NAME
|
||||
DEC_FIELD_NAMES.TOTAL_HOUSEHOLD_POVERTY_LEVEL
|
||||
]
|
||||
|
||||
# Percentage High School Achievement is
|
||||
# Percentage = (Male + Female) / (Total)
|
||||
self.df_all[self.PERCENTAGE_HIGH_SCHOOL_ED_FIELD_NAME] = (
|
||||
self.df_all[self.MALE_HIGH_SCHOOL_ED_FIELD_NAME]
|
||||
+ self.df_all[self.FEMALE_HIGH_SCHOOL_ED_FIELD_NAME]
|
||||
) / self.df_all[self.TOTAL_POPULATION_FIELD_NAME]
|
||||
self.df_all[field_names.CENSUS_DECENNIAL_HIGH_SCHOOL_ED_FIELD_2019] = (
|
||||
self.df_all[DEC_FIELD_NAMES.MALE_HIGH_SCHOOL_ED]
|
||||
+ self.df_all[DEC_FIELD_NAMES.FEMALE_HIGH_SCHOOL_ED]
|
||||
) / self.df_all[
|
||||
field_names.CENSUS_DECENNIAL_TOTAL_POPULATION_FIELD_2019
|
||||
]
|
||||
|
||||
# Calculate employment.
|
||||
self.df_all[self.UNEMPLOYMENT_FIELD_NAME] = (
|
||||
self.df_all[self.EMPLOYMENT_MALE_UNEMPLOYED_FIELD]
|
||||
+ self.df_all[self.EMPLOYMENT_FEMALE_UNEMPLOYED_FIELD]
|
||||
self.df_all[field_names.CENSUS_DECENNIAL_UNEMPLOYMENT_FIELD_2019] = (
|
||||
self.df_all[DEC_FIELD_NAMES.EMPLOYMENT_MALE_UNEMPLOYED]
|
||||
+ self.df_all[DEC_FIELD_NAMES.EMPLOYMENT_FEMALE_UNEMPLOYED]
|
||||
) / (
|
||||
self.df_all[self.EMPLOYMENT_MALE_IN_LABOR_FORCE_FIELD]
|
||||
+ self.df_all[self.EMPLOYMENT_FEMALE_IN_LABOR_FORCE_FIELD]
|
||||
self.df_all[DEC_FIELD_NAMES.EMPLOYMENT_MALE_IN_LABOR_FORCE]
|
||||
+ self.df_all[DEC_FIELD_NAMES.EMPLOYMENT_FEMALE_IN_LABOR_FORCE]
|
||||
)
|
||||
|
||||
# Calculate area median income
|
||||
median_income_df = pd.DataFrame(self.ISLAND_TERRITORIES)
|
||||
median_income_df = median_income_df[
|
||||
["fips", self.TERRITORY_MEDIAN_INCOME_FIELD]
|
||||
]
|
||||
self.df_all = self.df_all.merge(
|
||||
right=median_income_df, left_on="state", right_on="fips", how="left"
|
||||
)
|
||||
self.df_all[self.AREA_MEDIAN_INCOME_FIELD_NAME] = (
|
||||
self.df_all[self.MEDIAN_INCOME_FIELD_NAME]
|
||||
/ self.df_all[self.TERRITORY_MEDIAN_INCOME_FIELD]
|
||||
self.df_all[
|
||||
field_names.CENSUS_DECENNIAL_AREA_MEDIAN_INCOME_PERCENT_FIELD_2019
|
||||
] = (
|
||||
self.df_all[field_names.CENSUS_DECENNIAL_MEDIAN_INCOME_2019]
|
||||
/ self.df_all[DEC_FIELD_NAMES.TERRITORY_MEDIAN_INCOME]
|
||||
)
|
||||
|
||||
# Creating Geo ID (Census Block Group) Field Name
|
||||
self.df_all[self.GEOID_TRACT_FIELD_NAME] = (
|
||||
self.df_all["state"] + self.df_all["county"] + self.df_all["tract"]
|
||||
# Calculate college attendance
|
||||
self.df_all[DEC_FIELD_NAMES.COLLEGE_ATTENDANCE_POPULATION] = (
|
||||
self.df_all[DEC_FIELD_NAMES.COLLEGE_ATTENDANCE_MALE_ENROLLED]
|
||||
+ self.df_all[DEC_FIELD_NAMES.COLLEGE_ATTENDANCE_FEMALE_ENROLLED]
|
||||
)
|
||||
self.df_all[DEC_FIELD_NAMES.COLLEGE_ATTENDANCE_PERCENT] = (
|
||||
self.df_all[DEC_FIELD_NAMES.COLLEGE_ATTENDANCE_MALE_ENROLLED]
|
||||
+ self.df_all[DEC_FIELD_NAMES.COLLEGE_ATTENDANCE_FEMALE_ENROLLED]
|
||||
) / self.df_all[DEC_FIELD_NAMES.COLLEGE_ATTENDANCE_TOTAL_ENROLLED]
|
||||
self.df_all[DEC_FIELD_NAMES.COLLEGE_NON_ATTENDANCE_PERCENT] = (
|
||||
1 - self.df_all[DEC_FIELD_NAMES.COLLEGE_ATTENDANCE_PERCENT]
|
||||
)
|
||||
|
||||
# Calculate stats by race
|
||||
for race_field_name in self.RE_OUTPUT_FIELDS:
|
||||
for race_field_name in OUTPUT_RACE_FIELDS:
|
||||
output_field_name = (
|
||||
field_names.PERCENT_PREFIX
|
||||
+ race_field_name
|
||||
+ field_names.ISLAND_AREA_BACKFILL_SUFFIX
|
||||
# 2010 vs 2020 WARNING
|
||||
# We must keep the old 2009 date to make it compatible with all the other 2010 data
|
||||
+ f" in {field_names.DEC_DATA_YEAR}"
|
||||
)
|
||||
self.final_race_fields.append(output_field_name)
|
||||
self.df_all[output_field_name] = (
|
||||
self.df_all[race_field_name]
|
||||
/ self.df_all[self.TOTAL_RACE_POPULATION_FIELD_NAME]
|
||||
/ self.df_all[DEC_FIELD_NAMES.TOTAL_RACE_POPULATION]
|
||||
)
|
||||
self.final_race_fields.append(output_field_name)
|
||||
|
||||
# Reporting Missing Values
|
||||
for col in self.df_all.columns:
|
||||
|
@ -533,21 +233,21 @@ class CensusDecennialETL(ExtractTransformLoad):
|
|||
)
|
||||
|
||||
def load(self) -> None:
|
||||
# mkdir census
|
||||
self.OUTPUT_PATH.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
columns_to_include = [
|
||||
self.GEOID_TRACT_FIELD_NAME,
|
||||
self.TOTAL_POP_FIELD_NAME,
|
||||
self.MEDIAN_INCOME_FIELD_NAME,
|
||||
self.TERRITORY_MEDIAN_INCOME_FIELD,
|
||||
self.AREA_MEDIAN_INCOME_FIELD_NAME,
|
||||
self.PERCENTAGE_HOUSEHOLDS_BELOW_100_PERC_POVERTY_LEVEL_FIELD_NAME,
|
||||
self.PERCENTAGE_HOUSEHOLDS_BELOW_200_PERC_POVERTY_LEVEL_FIELD_NAME,
|
||||
self.PERCENTAGE_HIGH_SCHOOL_ED_FIELD_NAME,
|
||||
self.UNEMPLOYMENT_FIELD_NAME,
|
||||
field_names.GEOID_TRACT_FIELD,
|
||||
field_names.CENSUS_DECENNIAL_TOTAL_POPULATION_FIELD_2019,
|
||||
field_names.CENSUS_DECENNIAL_MEDIAN_INCOME_2019,
|
||||
DEC_FIELD_NAMES.TERRITORY_MEDIAN_INCOME,
|
||||
field_names.CENSUS_DECENNIAL_AREA_MEDIAN_INCOME_PERCENT_FIELD_2019,
|
||||
field_names.CENSUS_DECENNIAL_POVERTY_LESS_THAN_100_FPL_FIELD_2019,
|
||||
field_names.CENSUS_DECENNIAL_POVERTY_LESS_THAN_200_FPL_FIELD_2019,
|
||||
field_names.CENSUS_DECENNIAL_UNEMPLOYMENT_FIELD_2019,
|
||||
field_names.CENSUS_DECENNIAL_HIGH_SCHOOL_ED_FIELD_2019,
|
||||
DEC_FIELD_NAMES.COLLEGE_ATTENDANCE_PERCENT,
|
||||
DEC_FIELD_NAMES.COLLEGE_NON_ATTENDANCE,
|
||||
DEC_FIELD_NAMES.COLLEGE_ATTENDANCE_POPULATION,
|
||||
] + self.final_race_fields
|
||||
|
||||
self.df_all[columns_to_include].to_csv(
|
||||
path_or_buf=self.OUTPUT_PATH / "usa.csv", index=False
|
||||
)
|
||||
|
|
|
@ -182,22 +182,26 @@ AGGREGATION_POPULATION_FIELD = "Population Characteristics"
|
|||
UNDER_5_FIELD = "Individuals under 5 years old"
|
||||
OVER_64_FIELD = "Individuals over 64 years old"
|
||||
|
||||
# Fields from 2010 decennial census (generally only loaded for the territories)
|
||||
CENSUS_DECENNIAL_MEDIAN_INCOME_2009 = "Median household income in 2009 ($)"
|
||||
CENSUS_DECENNIAL_POVERTY_LESS_THAN_100_FPL_FIELD_2009 = (
|
||||
"Percentage households below 100% of federal poverty line in 2009"
|
||||
# Fields from 2020 decennial census (generally only loaded for the territories)
|
||||
# 2010 vs 2020 WARNING
|
||||
# We must keep the old 2009 date to make it compatible with all the other 2010 data
|
||||
DEC_DATA_YEAR = "2009"
|
||||
CENSUS_DECENNIAL_MEDIAN_INCOME_2019 = (
|
||||
f"Median household income in {DEC_DATA_YEAR} ($)"
|
||||
)
|
||||
CENSUS_DECENNIAL_POVERTY_LESS_THAN_200_FPL_FIELD_2009 = (
|
||||
"Percentage households below 200% of federal poverty line in 2009"
|
||||
CENSUS_DECENNIAL_POVERTY_LESS_THAN_100_FPL_FIELD_2019 = f"Percentage households below 100% of federal poverty line in {DEC_DATA_YEAR}"
|
||||
CENSUS_DECENNIAL_POVERTY_LESS_THAN_200_FPL_FIELD_2019 = f"Percentage households below 200% of federal poverty line in {DEC_DATA_YEAR}"
|
||||
CENSUS_DECENNIAL_HIGH_SCHOOL_ED_FIELD_2019 = f"Percent individuals age 25 or over with less than high school degree in {DEC_DATA_YEAR}"
|
||||
CENSUS_DECENNIAL_UNEMPLOYMENT_FIELD_2019 = (
|
||||
f"Unemployment (percent) in {DEC_DATA_YEAR}"
|
||||
)
|
||||
CENSUS_DECENNIAL_HIGH_SCHOOL_ED_FIELD_2009 = "Percent individuals age 25 or over with less than high school degree in 2009"
|
||||
CENSUS_DECENNIAL_UNEMPLOYMENT_FIELD_2009 = "Unemployment (percent) in 2009"
|
||||
CENSUS_DECENNIAL_TOTAL_POPULATION_FIELD_2009 = "Total population in 2009"
|
||||
CENSUS_DECENNIAL_AREA_MEDIAN_INCOME_PERCENT_FIELD_2009 = (
|
||||
"Median household income as a percent of territory median income in 2009"
|
||||
CENSUS_DECENNIAL_TOTAL_POPULATION_FIELD_2019 = (
|
||||
f"Total population in {DEC_DATA_YEAR}"
|
||||
)
|
||||
LOW_CENSUS_DECENNIAL_AREA_MEDIAN_INCOME_PERCENT_FIELD_2009 = "Low median household income as a percent of territory median income in 2009"
|
||||
# Fields from 2010 ACS (loaded for comparison with the territories)
|
||||
CENSUS_DECENNIAL_AREA_MEDIAN_INCOME_PERCENT_FIELD_2019 = f"Median household income as a percent of territory median income in {DEC_DATA_YEAR}"
|
||||
LOW_CENSUS_DECENNIAL_AREA_MEDIAN_INCOME_PERCENT_FIELD_2019 = f"Low median household income as a percent of territory median income in {DEC_DATA_YEAR}"
|
||||
|
||||
# # Fields from 2010 ACS (loaded for comparison with the territories)
|
||||
CENSUS_UNEMPLOYMENT_FIELD_2010 = "Unemployment (percent) in 2010"
|
||||
CENSUS_POVERTY_LESS_THAN_100_FPL_FIELD_2010 = (
|
||||
"Percent of individuals less than 100% Federal Poverty Line in 2010"
|
||||
|
@ -698,11 +702,11 @@ LOW_MEDIAN_INCOME_PCTILE_THRESHOLD = (
|
|||
f"percent of area median income"
|
||||
)
|
||||
ISLAND_LOW_MEDIAN_INCOME_PCTILE_THRESHOLD = (
|
||||
f"{LOW_CENSUS_DECENNIAL_AREA_MEDIAN_INCOME_PERCENT_FIELD_2009} exceeds "
|
||||
f"{LOW_CENSUS_DECENNIAL_AREA_MEDIAN_INCOME_PERCENT_FIELD_2019} exceeds "
|
||||
f"{PERCENTILE}th percentile"
|
||||
)
|
||||
ISLAND_UNEMPLOYMENT_PCTILE_THRESHOLD = f"{CENSUS_DECENNIAL_UNEMPLOYMENT_FIELD_2009} exceeds {PERCENTILE}th percentile"
|
||||
ISLAND_POVERTY_PCTILE_THRESHOLD = f"{CENSUS_DECENNIAL_POVERTY_LESS_THAN_100_FPL_FIELD_2009} exceeds {PERCENTILE}th percentile"
|
||||
ISLAND_UNEMPLOYMENT_PCTILE_THRESHOLD = f"{CENSUS_DECENNIAL_UNEMPLOYMENT_FIELD_2019} exceeds {PERCENTILE}th percentile"
|
||||
ISLAND_POVERTY_PCTILE_THRESHOLD = f"{CENSUS_DECENNIAL_POVERTY_LESS_THAN_100_FPL_FIELD_2019} exceeds {PERCENTILE}th percentile"
|
||||
|
||||
# Not currently used in a factor
|
||||
EXTREME_HEAT_MEDIAN_HOUSE_VALUE_LOW_INCOME_FIELD = (
|
||||
|
|
|
@ -807,7 +807,7 @@ class ScoreNarwhal(Score):
|
|||
island_areas_unemployment_criteria_field_name,
|
||||
) = self._combine_island_areas_with_states_and_set_thresholds(
|
||||
df=self.df,
|
||||
column_from_island_areas=field_names.CENSUS_DECENNIAL_UNEMPLOYMENT_FIELD_2009,
|
||||
column_from_island_areas=field_names.CENSUS_DECENNIAL_UNEMPLOYMENT_FIELD_2019,
|
||||
column_from_decennial_census=field_names.CENSUS_UNEMPLOYMENT_FIELD_2010,
|
||||
combined_column_name=field_names.COMBINED_UNEMPLOYMENT_2010,
|
||||
threshold_cutoff_for_island_areas=self.ENVIRONMENTAL_BURDEN_THRESHOLD,
|
||||
|
@ -827,7 +827,7 @@ class ScoreNarwhal(Score):
|
|||
island_areas_poverty_criteria_field_name,
|
||||
) = self._combine_island_areas_with_states_and_set_thresholds(
|
||||
df=self.df,
|
||||
column_from_island_areas=field_names.CENSUS_DECENNIAL_POVERTY_LESS_THAN_100_FPL_FIELD_2009,
|
||||
column_from_island_areas=field_names.CENSUS_DECENNIAL_POVERTY_LESS_THAN_100_FPL_FIELD_2019,
|
||||
column_from_decennial_census=field_names.CENSUS_POVERTY_LESS_THAN_100_FPL_FIELD_2010,
|
||||
combined_column_name=field_names.COMBINED_POVERTY_LESS_THAN_100_FPL_FIELD_2010,
|
||||
threshold_cutoff_for_island_areas=self.ENVIRONMENTAL_BURDEN_THRESHOLD,
|
||||
|
@ -848,14 +848,14 @@ class ScoreNarwhal(Score):
|
|||
# refactor.
|
||||
self.df[field_names.ISLAND_LOW_MEDIAN_INCOME_PCTILE_THRESHOLD] = (
|
||||
self.df[
|
||||
field_names.LOW_CENSUS_DECENNIAL_AREA_MEDIAN_INCOME_PERCENT_FIELD_2009
|
||||
field_names.LOW_CENSUS_DECENNIAL_AREA_MEDIAN_INCOME_PERCENT_FIELD_2019
|
||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
||||
]
|
||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||
)
|
||||
|
||||
self.df[field_names.ISLAND_AREAS_LOW_HS_EDUCATION_FIELD] = (
|
||||
self.df[field_names.CENSUS_DECENNIAL_HIGH_SCHOOL_ED_FIELD_2009]
|
||||
self.df[field_names.CENSUS_DECENNIAL_HIGH_SCHOOL_ED_FIELD_2019]
|
||||
>= self.LACK_OF_HIGH_SCHOOL_MINIMUM_THRESHOLD
|
||||
)
|
||||
|
||||
|
@ -890,7 +890,7 @@ class ScoreNarwhal(Score):
|
|||
100
|
||||
* workforce_combined_criteria_for_island_areas.sum()
|
||||
# Choosing a random column from island areas to calculate the denominator.
|
||||
/ self.df[field_names.CENSUS_DECENNIAL_UNEMPLOYMENT_FIELD_2009]
|
||||
/ self.df[field_names.CENSUS_DECENNIAL_UNEMPLOYMENT_FIELD_2019]
|
||||
.notnull()
|
||||
.sum()
|
||||
)
|
||||
|
@ -1044,7 +1044,7 @@ class ScoreNarwhal(Score):
|
|||
island_areas_poverty_200_criteria_field_name,
|
||||
) = self._combine_island_areas_with_states_and_set_thresholds(
|
||||
df=self.df,
|
||||
column_from_island_areas=field_names.CENSUS_DECENNIAL_POVERTY_LESS_THAN_200_FPL_FIELD_2009,
|
||||
column_from_island_areas=field_names.CENSUS_DECENNIAL_POVERTY_LESS_THAN_200_FPL_FIELD_2019,
|
||||
column_from_decennial_census=field_names.POVERTY_LESS_THAN_200_FPL_IMPUTED_FIELD,
|
||||
combined_column_name=field_names.COMBINED_POVERTY_LESS_THAN_200_FPL_FIELD_2010,
|
||||
threshold_cutoff_for_island_areas=self.LOW_INCOME_THRESHOLD,
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
[["NAME","P1_001N","PBG19_005N","PBG19_012N","PCT31_001N","PBG32_003N","PBG32_007N","PBG32_010N","PBG32_014N","PCT34_003N","PCT34_016N","PBG43_001N","PBG74_001N","PBG74_002N","PBG74_003N","PBG74_004N","PBG74_010N","PCT9_001N","PCT9_003N","PCT9_079N","PCT9_130N","PCT9_155N","PCT9_180N","PCT9_205N","PCT9_230N","P5_002N","state","county","tract"],
|
||||
["Census Tract 9505, Eastern District, American Samoa","2623","305","308","2044","443","42","369","44","175","164","26000","2151","538","338","329","352","2623","2021","342","77","0","0","99","84","107","60","010","950500"],
|
||||
["Census Tract 9503, Eastern District, American Samoa","2415","325","345","2293","418","35","379","53","173","174","33631","2414","448","332","320","565","2415","2259","39","6","0","0","1","110","14","60","010","950300"],
|
||||
["Census Tract 9501, Eastern District, American Samoa","1487","248","214","1404","269","38","254","39","103","106","24219","1485","448","243","146","200","1487","1449","3","1","1","0","1","32","6","60","010","950100"],
|
||||
["Census Tract 9502, Eastern District, American Samoa","1158","164","143","1096","221","23","163","18","84","75","28333","1148","236","172","175","335","1158","1092","11","7","0","0","1","47","5","60","010","950200"],
|
||||
["Census Tract 9506, Eastern District, American Samoa","3218","452","458","3031","645","57","573","56","216","242","26970","3188","774","462","439","666","3218","2781","167","9","1","0","5","255","40","60","010","950600"],
|
||||
["Census Tract 9507, Eastern District, American Samoa","2727","381","364","2489","569","60","456","48","208","183","29083","2612","593","458","315","494","2727","2366","217","29","8","2","10","95","38","60","010","950700"],
|
||||
["Census Tract 9509, Eastern District, American Samoa","3431","512","476","3239","718","76","682","89","238","244","30643","3412","724","510","573","623","3431","2988","332","28","0","0","2","81","27","60","010","950900"]]
|
|
@ -0,0 +1,58 @@
|
|||
[["NAME","P1_001N","PBG19_005N","PBG19_012N","PCT31_001N","PBG32_003N","PBG32_007N","PBG32_010N","PBG32_014N","PCT34_003N","PCT34_016N","PBG43_001N","PBG74_001N","PBG74_002N","PBG74_003N","PBG74_004N","PBG74_010N","PCT10_001N","PCT10_003N","PCT10_204N","PCT10_330N","PCT10_355N","PCT10_380N","PCT10_405N","P5_026N","PCT9_003N","state","county","tract"],
|
||||
["Census Tract 9501, Guam, Guam","1347","7","6","77","25","1","14","0","2","29","40000","80","6","5","12","32","1347","13","128","159","11","63","111","764","221","66","010","950100"],
|
||||
["Census Tract 9502, Guam, Guam","626","9","9","87","23","2","19","2","3","30","43750","102","6","0","10","44","626","29","91","56","3","32","86","296","81","66","010","950200"],
|
||||
["Census Tract 9503, Guam, Guam","629","4","1","6","1","0","1","0","0","1","53750","6","0","0","0","0","629","3","620","0","0","0","1","5","0","66","010","950300"],
|
||||
["Census Tract 9504.01, Guam, Guam","5809","669","581","5273","1447","150","1191","141","151","2096","53309","5688","455","322","376","2836","5809","1592","3775","14","9","3","359","54","70","66","010","950401"],
|
||||
["Census Tract 9504.02, Guam, Guam","6606","735","668","5972","1581","168","1234","157","145","2198","50980","6579","834","472","531","2759","6606","2722","3135","32","0","13","574","122","101","66","010","950402"],
|
||||
["Census Tract 9505.01, Guam, Guam","1834","211","188","1638","398","45","295","48","35","588","42054","1803","309","166","171","646","1834","1060","560","2","0","1","186","23","39","66","010","950501"],
|
||||
["Census Tract 9505.02, Guam, Guam","5343","660","577","4952","1387","115","1052","86","160","1932","55833","5285","532","206","297","2911","5343","1833","2813","46","2","36","421","183","110","66","010","950502"],
|
||||
["Census Tract 9507.01, Guam, Guam","5213","549","535","4849","1327","75","1088","86","162","1927","66023","5187","316","190","224","3283","5213","1279","2776","64","12","50","556","448","134","66","010","950701"],
|
||||
["Census Tract 9507.02, Guam, Guam","4020","485","449","3640","930","89","742","61","102","1338","56406","3978","513","294","235","1894","4020","2093","1426","17","3","2","408","61","44","66","010","950702"],
|
||||
["Census Tract 9508.01, Guam, Guam","3921","503","470","3607","932","127","836","124","66","1365","51528","3898","545","217","210","1804","3921","2058","1539","8","2","4","273","36","36","66","010","950801"],
|
||||
["Census Tract 9508.02, Guam, Guam","4110","483","550","3846","894","102","746","111","97","1580","35372","4099","691","292","375","1531","4110","2055","1629","3","2","14","352","51","56","66","010","950802"],
|
||||
["Census Tract 9509, Guam, Guam","4653","531","506","4404","1149","94","1014","94","98","1837","53221","4638","386","196","284","2672","4653","1048","3251","2","5","16","291","40","57","66","010","950900"],
|
||||
["Census Tract 9510, Guam, Guam","3449","441","400","3240","821","74","739","57","105","1277","51806","3400","325","175","219","1743","3449","1137","1993","4","3","3","271","37","50","66","010","951000"],
|
||||
["Census Tract 9511, Guam, Guam","6498","775","751","6108","1745","98","1498","134","216","2433","55673","6472","517","279","356","3630","6498","1974","3791","26","9","23","511","155","118","66","010","951100"],
|
||||
["Census Tract 9516, Guam, Guam","142","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","142","111","16","4","0","1","7","3","3","66","010","951600"],
|
||||
["Census Tract 9517, Guam, Guam","2239","193","198","1910","523","24","442","40","57","756","78333","2014","138","46","97","1387","2239","779","993","21","4","22","269","149","57","66","010","951700"],
|
||||
["Census Tract 9518, Guam, Guam","99","18","13","83","27","1","18","3","1","33","50000","92","2","5","3","36","99","80","14","0","0","0","5","0","0","66","010","951800"],
|
||||
["Census Tract 9519.01, Guam, Guam","4081","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","4081","797","2733","34","5","24","287","197","47","66","010","951901"],
|
||||
["Census Tract 9519.02, Guam, Guam","3484","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","3484","575","2057","52","6","48","262","456","108","66","010","951902"],
|
||||
["Census Tract 9522, Guam, Guam","3273","322","333","3102","900","84","749","105","58","1282","49355","3253","267","161","185","1805","3273","912","1845","26","1","13","349","125","47","66","010","952200"],
|
||||
["Census Tract 9523, Guam, Guam","2829","250","289","2639","776","67","684","71","54","1080","59083","2811","233","141","128","1763","2829","848","1355","29","11","27","307","242","68","66","010","952300"],
|
||||
["Census Tract 9524, Guam, Guam","1637","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","1637","614","737","16","0","18","176","72","46","66","010","952400"],
|
||||
["Census Tract 9527, Guam, Guam","4468","537","542","3973","1016","78","874","68","117","1550","67578","4302","367","183","208","2623","4468","2929","823","19","0","11","423","253","136","66","010","952700"],
|
||||
["Census Tract 9528, Guam, Guam",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"66","010","952800"],
|
||||
["Census Tract 9529, Guam, Guam","5145","599","604","4121","1096","96","971","99","132","1631","62031","4430","349","125","215","2754","5145","3508","779","27","9","41","540","234","133","66","010","952900"],
|
||||
["Census Tract 9530, Guam, Guam","3388","359","419","3023","775","85","742","100","112","1222","49605","3251","360","178","189","1777","3388","1990","747","16","0","22","453","157","98","66","010","953000"],
|
||||
["Census Tract 9531.01, Guam, Guam","3966","530","500","3720","1029","110","889","75","111","1435","76413","3947","250","133","202","2659","3966","2585","551","15","1","20","544","236","171","66","010","953101"],
|
||||
["Census Tract 9531.02, Guam, Guam","3098","362","380","2885","776","50","637","80","107","1078","67841","3074","196","114","161","1948","3098","1891","609","16","1","13","445","122","116","66","010","953102"],
|
||||
["Census Tract 9532, Guam, Guam","2611","351","356","2410","614","72","577","77","48","960","67813","2597","286","80","137","1612","2611","1725","343","28","3","5","385","118","105","66","010","953200"],
|
||||
["Census Tract 9533, Guam, Guam","3808","461","449","3478","902","85","769","94","78","1352","47419","3764","499","256","243","1889","3808","2268","910","18","0","11","452","137","99","66","010","953300"],
|
||||
["Census Tract 9534, Guam, Guam","943","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","943","609","120","10","0","9","129","61","38","66","010","953400"],
|
||||
["Census Tract 9535, Guam, Guam",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"66","010","953500"],
|
||||
["Census Tract 9536, Guam, Guam","3616","418","408","3349","925","87","773","78","103","1295","71711","3574","278","171","104","2372","3616","2403","427","16","5","16","596","144","278","66","010","953600"],
|
||||
["Census Tract 9539, Guam, Guam","4192","558","522","3831","946","97","789","74","85","1456","62386","4174","560","256","232","2215","4192","3101","328","3","5","39","532","176","137","66","010","953900"],
|
||||
["Census Tract 9540, Guam, Guam","2106","259","234","1961","527","29","446","39","61","732","83889","2102","111","58","88","1447","2106","1283","277","11","1","16","308","207","82","66","010","954000"],
|
||||
["Census Tract 9543, Guam, Guam","1532","153","172","1405","426","41","325","39","42","534","77125","1526","131","63","58","993","1532","932","160","10","3","14","237","160","61","66","010","954300"],
|
||||
["Census Tract 9544, Guam, Guam","53","7","4","48","14","4","10","2","0","19","92500","50","8","0","1","32","53","39","4","0","0","0","9","1","0","66","010","954400"],
|
||||
["Census Tract 9545, Guam, Guam","2483","9","7","69","20","1","14","3","3","21","40000","83","12","15","3","28","2483","71","203","257","35","98","219","1444","324","66","010","954500"],
|
||||
["Census Tract 9547, Guam, Guam","2089","287","255","1910","497","71","407","48","52","729","54931","2061","238","108","95","1129","2089","1259","485","30","1","3","197","111","53","66","010","954700"],
|
||||
["Census Tract 9548, Guam, Guam","2426","288","273","2183","472","99","444","83","31","833","47969","2416","504","186","173","979","2426","1638","489","5","0","2","217","69","68","66","010","954800"],
|
||||
["Census Tract 9551, Guam, Guam","3550","514","473","3285","873","78","677","80","69","1200","80909","3518","265","165","162","2364","3550","2554","168","28","5","25","409","340","175","66","010","955100"],
|
||||
["Census Tract 9552, Guam, Guam","2317","367","322","2116","529","56","416","39","31","799","67813","2295","252","105","149","1358","2317","2016","68","7","0","3","163","59","90","66","010","955200"],
|
||||
["Census Tract 9553, Guam, Guam","1604","230","235","1481","305","50","264","28","25","582","51667","1600","267","82","84","726","1604","1362","43","4","0","1","129","65","50","66","010","955300"],
|
||||
["Census Tract 9554, Guam, Guam","647","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","-999999999","647","565","10","0","2","3","51","16","24","66","010","955400"],
|
||||
["Census Tract 9556, Guam, Guam","1008","125","118","940","267","11","209","11","22","355","81250","1001","63","36","48","640","1008","683","168","8","1","4","106","37","24","66","010","955600"],
|
||||
["Census Tract 9557, Guam, Guam","4940","625","550","4642","1263","132","1059","105","139","1803","63352","4901","456","235","198","2988","4940","2251","2010","22","2","8","497","146","95","66","010","955700"],
|
||||
["Census Tract 9558, Guam, Guam","7804","920","801","7224","1979","153","1695","167","267","2723","66349","7738","475","326","410","4635","7804","2631","3870","71","16","48","759","393","179","66","010","955800"],
|
||||
["Census Tract 9559, Guam, Guam","3185","322","324","3023","1011","65","740","66","99","1230","64833","3150","237","90","119","2201","3185","650","1461","50","28","39","389","562","139","66","010","955900"],
|
||||
["Census Tract 9560, Guam, Guam","2572","260","285","2256","536","46","481","77","42","855","59375","2524","337","208","179","1227","2572","1693","419","5","3","20","259","159","60","66","010","956000"],
|
||||
["Census Tract 9561, Guam, Guam","2011","218","236","1846","528","50","425","36","53","721","77500","1981","150","98","84","1301","2011","1306","239","12","1","16","263","169","69","66","010","956100"],
|
||||
["Census Tract 9562, Guam, Guam","3945","469","420","3270","797","69","747","68","66","1255","77455","3488","220","71","122","2406","3945","1911","833","20","2","35","471","643","158","66","010","956200"],
|
||||
["Census Tract 9563, Guam, Guam","2385","278","250","2173","592","54","429","64","58","822","57031","2346","242","140","121","1133","2385","1316","748","7","2","14","181","112","51","66","010","956300"],
|
||||
["Census Tract 9804, Guam, Guam","0","0","0","0","0","0","0","0","0","0","-666666666","0","0","0","0","0","0","0","0","0","0","0","0","0","0","66","010","980400"],
|
||||
["Census Tract 9801, Guam, Guam","42","7","9","41","12","0","11","2","1","17","60000","42","6","0","3","28","42","26","7","0","0","0","9","0","0","66","010","980100"],
|
||||
["Census Tract 9802, Guam, Guam","0","0","0","0","0","0","0","0","0","0","-666666666","0","0","0","0","0","0","0","0","0","0","0","0","0","0","66","010","980200"],
|
||||
["Census Tract 9803, Guam, Guam","0","0","0","0","0","0","0","0","0","0","-666666666","0","0","0","0","0","0","0","0","0","0","0","0","0","0","66","010","980300"],
|
||||
["Census Tract 9900, Guam, Guam","0","0","0","0","0","0","0","0","0","0","-666666666","0","0","0","0","0","0","0","0","0","0","0","0","0","0","66","010","990000"]]
|
|
@ -0,0 +1,134 @@
|
|||
,NAME,Total population in 2009,Total male high school graduates 25 and over,Total female high school graduates 25 and over,Total asked enrolled in college or graduate school (excludes military housing),Total males in labor force,Total males not in labor force,Total females in labor force,Total females not in labor force,Males enrolled in college or graduate school (excludes military housing),Females enrolled in college or graduate school (excludes military housing),Median household income in 2009 ($),Total Household poverty level IN 2019,Household poverty level Under 0.50 IN 2019,Household poverty level Under 0.74 IN 2019,Household poverty level Under 0.99 IN 2019,Household poverty level Over 2.0 IN 2019,Total population surveyed on racial data,Native Hawaiian or Pacific,Asian,White,Black or African American,American Indian / Alaska Native,other races,two or more races,Hispanic or Latino,state,county,tract,Territory Median Income
|
||||
0,"Census Tract 9505, Eastern District, American Samoa",2623.0,305.0,308.0,2044.0,443.0,42.0,369.0,44.0,175.0,164.0,26000.0,2151.0,538.0,338.0,329.0,352.0,2623.0,2021.0,342.0,77.0,0.0,0.0,99.0,84.0,107.0,60,010,950500,26352.0
|
||||
1,"Census Tract 9503, Eastern District, American Samoa",2415.0,325.0,345.0,2293.0,418.0,35.0,379.0,53.0,173.0,174.0,33631.0,2414.0,448.0,332.0,320.0,565.0,2415.0,2259.0,39.0,6.0,0.0,0.0,1.0,110.0,14.0,60,010,950300,26352.0
|
||||
2,"Census Tract 9501, Eastern District, American Samoa",1487.0,248.0,214.0,1404.0,269.0,38.0,254.0,39.0,103.0,106.0,24219.0,1485.0,448.0,243.0,146.0,200.0,1487.0,1449.0,3.0,1.0,1.0,0.0,1.0,32.0,6.0,60,010,950100,26352.0
|
||||
3,"Census Tract 9502, Eastern District, American Samoa",1158.0,164.0,143.0,1096.0,221.0,23.0,163.0,18.0,84.0,75.0,28333.0,1148.0,236.0,172.0,175.0,335.0,1158.0,1092.0,11.0,7.0,0.0,0.0,1.0,47.0,5.0,60,010,950200,26352.0
|
||||
4,"Census Tract 9506, Eastern District, American Samoa",3218.0,452.0,458.0,3031.0,645.0,57.0,573.0,56.0,216.0,242.0,26970.0,3188.0,774.0,462.0,439.0,666.0,3218.0,2781.0,167.0,9.0,1.0,0.0,5.0,255.0,40.0,60,010,950600,26352.0
|
||||
5,"Census Tract 9507, Eastern District, American Samoa",2727.0,381.0,364.0,2489.0,569.0,60.0,456.0,48.0,208.0,183.0,29083.0,2612.0,593.0,458.0,315.0,494.0,2727.0,2366.0,217.0,29.0,8.0,2.0,10.0,95.0,38.0,60,010,950700,26352.0
|
||||
6,"Census Tract 9509, Eastern District, American Samoa",3431.0,512.0,476.0,3239.0,718.0,76.0,682.0,89.0,238.0,244.0,30643.0,3412.0,724.0,510.0,573.0,623.0,3431.0,2988.0,332.0,28.0,0.0,0.0,2.0,81.0,27.0,60,010,950900,26352.0
|
||||
0,"Census Tract 9518, Manu'a District, American Samoa",832.0,169.0,119.0,784.0,213.0,23.0,148.0,36.0,63.0,63.0,26818.0,831.0,167.0,155.0,181.0,116.0,832.0,800.0,0.0,2.0,0.0,0.0,0.0,30.0,3.0,60,020,951800,26352.0
|
||||
0,"Census Tract 9519, Rose Island, American Samoa",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-666666666.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,60,030,951900,
|
||||
0,"Census Tract 9520, Swains Island, American Samoa",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-666666666.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,60,040,952000,
|
||||
0,"Census Tract 9510, Western District, American Samoa",3593.0,484.0,488.0,3386.0,738.0,34.0,559.0,25.0,272.0,225.0,24688.0,3572.0,1032.0,693.0,578.0,399.0,3593.0,3002.0,473.0,10.0,0.0,0.0,5.0,103.0,22.0,60,050,951000,26352.0
|
||||
1,"Census Tract 9511, Western District, American Samoa",6252.0,1007.0,961.0,5818.0,1162.0,80.0,842.0,72.0,477.0,422.0,24227.0,6201.0,2026.0,1206.0,876.0,725.0,6252.0,5765.0,212.0,50.0,1.0,0.0,1.0,223.0,40.0,60,050,951100,26352.0
|
||||
2,"Census Tract 9512.01, Western District, American Samoa",3406.0,411.0,386.0,2896.0,625.0,33.0,483.0,43.0,239.0,206.0,29107.0,3061.0,723.0,517.0,451.0,408.0,3406.0,3030.0,230.0,12.0,0.0,2.0,4.0,128.0,11.0,60,050,951201,26352.0
|
||||
3,"Census Tract 9512.02, Western District, American Samoa",4582.0,586.0,616.0,4322.0,906.0,59.0,814.0,64.0,319.0,320.0,31714.0,4535.0,784.0,687.0,577.0,1184.0,4582.0,3903.0,355.0,50.0,3.0,6.0,3.0,262.0,31.0,60,050,951202,26352.0
|
||||
4,"Census Tract 9512.03, Western District, American Samoa",4994.0,605.0,648.0,4721.0,964.0,89.0,896.0,106.0,330.0,340.0,32196.0,4948.0,1019.0,724.0,626.0,1199.0,4994.0,4308.0,264.0,61.0,3.0,3.0,4.0,351.0,33.0,60,050,951203,26352.0
|
||||
5,"Census Tract 9513, Western District, American Samoa",3010.0,443.0,419.0,2844.0,632.0,115.0,542.0,107.0,240.0,220.0,27330.0,2994.0,791.0,488.0,384.0,593.0,3010.0,2833.0,97.0,10.0,1.0,0.0,1.0,68.0,11.0,60,050,951300,26352.0
|
||||
6,"Census Tract 9515, Western District, American Samoa",1689.0,270.0,235.0,1588.0,355.0,77.0,307.0,96.0,139.0,110.0,28611.0,1674.0,484.0,184.0,217.0,246.0,1689.0,1593.0,14.0,2.0,1.0,0.0,0.0,79.0,2.0,60,050,951500,26352.0
|
||||
7,"Census Tract 9516, Western District, American Samoa",4293.0,629.0,565.0,4077.0,1075.0,306.0,937.0,351.0,311.0,322.0,28958.0,4280.0,990.0,726.0,621.0,889.0,4293.0,3900.0,122.0,20.0,5.0,0.0,2.0,244.0,16.0,60,050,951600,26352.0
|
||||
0,"Census Tract 9501, Guam, Guam",1347.0,7.0,6.0,77.0,25.0,1.0,14.0,0.0,2.0,29.0,40000.0,80.0,6.0,5.0,12.0,32.0,1347.0,13.0,128.0,764.0,159.0,11.0,63.0,111.0,221.0,66,010,950100,58289.0
|
||||
1,"Census Tract 9502, Guam, Guam",626.0,9.0,9.0,87.0,23.0,2.0,19.0,2.0,3.0,30.0,43750.0,102.0,6.0,0.0,10.0,44.0,626.0,29.0,91.0,296.0,56.0,3.0,32.0,86.0,81.0,66,010,950200,58289.0
|
||||
2,"Census Tract 9503, Guam, Guam",629.0,4.0,1.0,6.0,1.0,0.0,1.0,0.0,0.0,1.0,53750.0,6.0,0.0,0.0,0.0,0.0,629.0,3.0,620.0,5.0,0.0,0.0,0.0,1.0,0.0,66,010,950300,58289.0
|
||||
3,"Census Tract 9504.01, Guam, Guam",5809.0,669.0,581.0,5273.0,1447.0,150.0,1191.0,141.0,151.0,2096.0,53309.0,5688.0,455.0,322.0,376.0,2836.0,5809.0,1592.0,3775.0,54.0,14.0,9.0,3.0,359.0,70.0,66,010,950401,58289.0
|
||||
4,"Census Tract 9504.02, Guam, Guam",6606.0,735.0,668.0,5972.0,1581.0,168.0,1234.0,157.0,145.0,2198.0,50980.0,6579.0,834.0,472.0,531.0,2759.0,6606.0,2722.0,3135.0,122.0,32.0,0.0,13.0,574.0,101.0,66,010,950402,58289.0
|
||||
5,"Census Tract 9505.01, Guam, Guam",1834.0,211.0,188.0,1638.0,398.0,45.0,295.0,48.0,35.0,588.0,42054.0,1803.0,309.0,166.0,171.0,646.0,1834.0,1060.0,560.0,23.0,2.0,0.0,1.0,186.0,39.0,66,010,950501,58289.0
|
||||
6,"Census Tract 9505.02, Guam, Guam",5343.0,660.0,577.0,4952.0,1387.0,115.0,1052.0,86.0,160.0,1932.0,55833.0,5285.0,532.0,206.0,297.0,2911.0,5343.0,1833.0,2813.0,183.0,46.0,2.0,36.0,421.0,110.0,66,010,950502,58289.0
|
||||
7,"Census Tract 9507.01, Guam, Guam",5213.0,549.0,535.0,4849.0,1327.0,75.0,1088.0,86.0,162.0,1927.0,66023.0,5187.0,316.0,190.0,224.0,3283.0,5213.0,1279.0,2776.0,448.0,64.0,12.0,50.0,556.0,134.0,66,010,950701,58289.0
|
||||
8,"Census Tract 9507.02, Guam, Guam",4020.0,485.0,449.0,3640.0,930.0,89.0,742.0,61.0,102.0,1338.0,56406.0,3978.0,513.0,294.0,235.0,1894.0,4020.0,2093.0,1426.0,61.0,17.0,3.0,2.0,408.0,44.0,66,010,950702,58289.0
|
||||
9,"Census Tract 9508.01, Guam, Guam",3921.0,503.0,470.0,3607.0,932.0,127.0,836.0,124.0,66.0,1365.0,51528.0,3898.0,545.0,217.0,210.0,1804.0,3921.0,2058.0,1539.0,36.0,8.0,2.0,4.0,273.0,36.0,66,010,950801,58289.0
|
||||
10,"Census Tract 9508.02, Guam, Guam",4110.0,483.0,550.0,3846.0,894.0,102.0,746.0,111.0,97.0,1580.0,35372.0,4099.0,691.0,292.0,375.0,1531.0,4110.0,2055.0,1629.0,51.0,3.0,2.0,14.0,352.0,56.0,66,010,950802,58289.0
|
||||
11,"Census Tract 9509, Guam, Guam",4653.0,531.0,506.0,4404.0,1149.0,94.0,1014.0,94.0,98.0,1837.0,53221.0,4638.0,386.0,196.0,284.0,2672.0,4653.0,1048.0,3251.0,40.0,2.0,5.0,16.0,291.0,57.0,66,010,950900,58289.0
|
||||
12,"Census Tract 9510, Guam, Guam",3449.0,441.0,400.0,3240.0,821.0,74.0,739.0,57.0,105.0,1277.0,51806.0,3400.0,325.0,175.0,219.0,1743.0,3449.0,1137.0,1993.0,37.0,4.0,3.0,3.0,271.0,50.0,66,010,951000,58289.0
|
||||
13,"Census Tract 9511, Guam, Guam",6498.0,775.0,751.0,6108.0,1745.0,98.0,1498.0,134.0,216.0,2433.0,55673.0,6472.0,517.0,279.0,356.0,3630.0,6498.0,1974.0,3791.0,155.0,26.0,9.0,23.0,511.0,118.0,66,010,951100,58289.0
|
||||
14,"Census Tract 9516, Guam, Guam",142.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,142.0,111.0,16.0,3.0,4.0,0.0,1.0,7.0,3.0,66,010,951600,58289.0
|
||||
15,"Census Tract 9517, Guam, Guam",2239.0,193.0,198.0,1910.0,523.0,24.0,442.0,40.0,57.0,756.0,78333.0,2014.0,138.0,46.0,97.0,1387.0,2239.0,779.0,993.0,149.0,21.0,4.0,22.0,269.0,57.0,66,010,951700,58289.0
|
||||
16,"Census Tract 9518, Guam, Guam",99.0,18.0,13.0,83.0,27.0,1.0,18.0,3.0,1.0,33.0,50000.0,92.0,2.0,5.0,3.0,36.0,99.0,80.0,14.0,0.0,0.0,0.0,0.0,5.0,0.0,66,010,951800,58289.0
|
||||
17,"Census Tract 9519.01, Guam, Guam",4081.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,4081.0,797.0,2733.0,197.0,34.0,5.0,24.0,287.0,47.0,66,010,951901,58289.0
|
||||
18,"Census Tract 9519.02, Guam, Guam",3484.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,3484.0,575.0,2057.0,456.0,52.0,6.0,48.0,262.0,108.0,66,010,951902,58289.0
|
||||
19,"Census Tract 9522, Guam, Guam",3273.0,322.0,333.0,3102.0,900.0,84.0,749.0,105.0,58.0,1282.0,49355.0,3253.0,267.0,161.0,185.0,1805.0,3273.0,912.0,1845.0,125.0,26.0,1.0,13.0,349.0,47.0,66,010,952200,58289.0
|
||||
20,"Census Tract 9523, Guam, Guam",2829.0,250.0,289.0,2639.0,776.0,67.0,684.0,71.0,54.0,1080.0,59083.0,2811.0,233.0,141.0,128.0,1763.0,2829.0,848.0,1355.0,242.0,29.0,11.0,27.0,307.0,68.0,66,010,952300,58289.0
|
||||
21,"Census Tract 9524, Guam, Guam",1637.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,1637.0,614.0,737.0,72.0,16.0,0.0,18.0,176.0,46.0,66,010,952400,58289.0
|
||||
22,"Census Tract 9527, Guam, Guam",4468.0,537.0,542.0,3973.0,1016.0,78.0,874.0,68.0,117.0,1550.0,67578.0,4302.0,367.0,183.0,208.0,2623.0,4468.0,2929.0,823.0,253.0,19.0,0.0,11.0,423.0,136.0,66,010,952700,58289.0
|
||||
23,"Census Tract 9528, Guam, Guam",,,,,,,,,,,,,,,,,,,,,,,,,,66,010,952800,
|
||||
24,"Census Tract 9529, Guam, Guam",5145.0,599.0,604.0,4121.0,1096.0,96.0,971.0,99.0,132.0,1631.0,62031.0,4430.0,349.0,125.0,215.0,2754.0,5145.0,3508.0,779.0,234.0,27.0,9.0,41.0,540.0,133.0,66,010,952900,58289.0
|
||||
25,"Census Tract 9530, Guam, Guam",3388.0,359.0,419.0,3023.0,775.0,85.0,742.0,100.0,112.0,1222.0,49605.0,3251.0,360.0,178.0,189.0,1777.0,3388.0,1990.0,747.0,157.0,16.0,0.0,22.0,453.0,98.0,66,010,953000,58289.0
|
||||
26,"Census Tract 9531.01, Guam, Guam",3966.0,530.0,500.0,3720.0,1029.0,110.0,889.0,75.0,111.0,1435.0,76413.0,3947.0,250.0,133.0,202.0,2659.0,3966.0,2585.0,551.0,236.0,15.0,1.0,20.0,544.0,171.0,66,010,953101,58289.0
|
||||
27,"Census Tract 9531.02, Guam, Guam",3098.0,362.0,380.0,2885.0,776.0,50.0,637.0,80.0,107.0,1078.0,67841.0,3074.0,196.0,114.0,161.0,1948.0,3098.0,1891.0,609.0,122.0,16.0,1.0,13.0,445.0,116.0,66,010,953102,58289.0
|
||||
28,"Census Tract 9532, Guam, Guam",2611.0,351.0,356.0,2410.0,614.0,72.0,577.0,77.0,48.0,960.0,67813.0,2597.0,286.0,80.0,137.0,1612.0,2611.0,1725.0,343.0,118.0,28.0,3.0,5.0,385.0,105.0,66,010,953200,58289.0
|
||||
29,"Census Tract 9533, Guam, Guam",3808.0,461.0,449.0,3478.0,902.0,85.0,769.0,94.0,78.0,1352.0,47419.0,3764.0,499.0,256.0,243.0,1889.0,3808.0,2268.0,910.0,137.0,18.0,0.0,11.0,452.0,99.0,66,010,953300,58289.0
|
||||
30,"Census Tract 9534, Guam, Guam",943.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,943.0,609.0,120.0,61.0,10.0,0.0,9.0,129.0,38.0,66,010,953400,58289.0
|
||||
31,"Census Tract 9535, Guam, Guam",,,,,,,,,,,,,,,,,,,,,,,,,,66,010,953500,
|
||||
32,"Census Tract 9536, Guam, Guam",3616.0,418.0,408.0,3349.0,925.0,87.0,773.0,78.0,103.0,1295.0,71711.0,3574.0,278.0,171.0,104.0,2372.0,3616.0,2403.0,427.0,144.0,16.0,5.0,16.0,596.0,278.0,66,010,953600,58289.0
|
||||
33,"Census Tract 9539, Guam, Guam",4192.0,558.0,522.0,3831.0,946.0,97.0,789.0,74.0,85.0,1456.0,62386.0,4174.0,560.0,256.0,232.0,2215.0,4192.0,3101.0,328.0,176.0,3.0,5.0,39.0,532.0,137.0,66,010,953900,58289.0
|
||||
34,"Census Tract 9540, Guam, Guam",2106.0,259.0,234.0,1961.0,527.0,29.0,446.0,39.0,61.0,732.0,83889.0,2102.0,111.0,58.0,88.0,1447.0,2106.0,1283.0,277.0,207.0,11.0,1.0,16.0,308.0,82.0,66,010,954000,58289.0
|
||||
35,"Census Tract 9543, Guam, Guam",1532.0,153.0,172.0,1405.0,426.0,41.0,325.0,39.0,42.0,534.0,77125.0,1526.0,131.0,63.0,58.0,993.0,1532.0,932.0,160.0,160.0,10.0,3.0,14.0,237.0,61.0,66,010,954300,58289.0
|
||||
36,"Census Tract 9544, Guam, Guam",53.0,7.0,4.0,48.0,14.0,4.0,10.0,2.0,0.0,19.0,92500.0,50.0,8.0,0.0,1.0,32.0,53.0,39.0,4.0,1.0,0.0,0.0,0.0,9.0,0.0,66,010,954400,58289.0
|
||||
37,"Census Tract 9545, Guam, Guam",2483.0,9.0,7.0,69.0,20.0,1.0,14.0,3.0,3.0,21.0,40000.0,83.0,12.0,15.0,3.0,28.0,2483.0,71.0,203.0,1444.0,257.0,35.0,98.0,219.0,324.0,66,010,954500,58289.0
|
||||
38,"Census Tract 9547, Guam, Guam",2089.0,287.0,255.0,1910.0,497.0,71.0,407.0,48.0,52.0,729.0,54931.0,2061.0,238.0,108.0,95.0,1129.0,2089.0,1259.0,485.0,111.0,30.0,1.0,3.0,197.0,53.0,66,010,954700,58289.0
|
||||
39,"Census Tract 9548, Guam, Guam",2426.0,288.0,273.0,2183.0,472.0,99.0,444.0,83.0,31.0,833.0,47969.0,2416.0,504.0,186.0,173.0,979.0,2426.0,1638.0,489.0,69.0,5.0,0.0,2.0,217.0,68.0,66,010,954800,58289.0
|
||||
40,"Census Tract 9551, Guam, Guam",3550.0,514.0,473.0,3285.0,873.0,78.0,677.0,80.0,69.0,1200.0,80909.0,3518.0,265.0,165.0,162.0,2364.0,3550.0,2554.0,168.0,340.0,28.0,5.0,25.0,409.0,175.0,66,010,955100,58289.0
|
||||
41,"Census Tract 9552, Guam, Guam",2317.0,367.0,322.0,2116.0,529.0,56.0,416.0,39.0,31.0,799.0,67813.0,2295.0,252.0,105.0,149.0,1358.0,2317.0,2016.0,68.0,59.0,7.0,0.0,3.0,163.0,90.0,66,010,955200,58289.0
|
||||
42,"Census Tract 9553, Guam, Guam",1604.0,230.0,235.0,1481.0,305.0,50.0,264.0,28.0,25.0,582.0,51667.0,1600.0,267.0,82.0,84.0,726.0,1604.0,1362.0,43.0,65.0,4.0,0.0,1.0,129.0,50.0,66,010,955300,58289.0
|
||||
43,"Census Tract 9554, Guam, Guam",647.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,-999999999.0,647.0,565.0,10.0,16.0,0.0,2.0,3.0,51.0,24.0,66,010,955400,58289.0
|
||||
44,"Census Tract 9556, Guam, Guam",1008.0,125.0,118.0,940.0,267.0,11.0,209.0,11.0,22.0,355.0,81250.0,1001.0,63.0,36.0,48.0,640.0,1008.0,683.0,168.0,37.0,8.0,1.0,4.0,106.0,24.0,66,010,955600,58289.0
|
||||
45,"Census Tract 9557, Guam, Guam",4940.0,625.0,550.0,4642.0,1263.0,132.0,1059.0,105.0,139.0,1803.0,63352.0,4901.0,456.0,235.0,198.0,2988.0,4940.0,2251.0,2010.0,146.0,22.0,2.0,8.0,497.0,95.0,66,010,955700,58289.0
|
||||
46,"Census Tract 9558, Guam, Guam",7804.0,920.0,801.0,7224.0,1979.0,153.0,1695.0,167.0,267.0,2723.0,66349.0,7738.0,475.0,326.0,410.0,4635.0,7804.0,2631.0,3870.0,393.0,71.0,16.0,48.0,759.0,179.0,66,010,955800,58289.0
|
||||
47,"Census Tract 9559, Guam, Guam",3185.0,322.0,324.0,3023.0,1011.0,65.0,740.0,66.0,99.0,1230.0,64833.0,3150.0,237.0,90.0,119.0,2201.0,3185.0,650.0,1461.0,562.0,50.0,28.0,39.0,389.0,139.0,66,010,955900,58289.0
|
||||
48,"Census Tract 9560, Guam, Guam",2572.0,260.0,285.0,2256.0,536.0,46.0,481.0,77.0,42.0,855.0,59375.0,2524.0,337.0,208.0,179.0,1227.0,2572.0,1693.0,419.0,159.0,5.0,3.0,20.0,259.0,60.0,66,010,956000,58289.0
|
||||
49,"Census Tract 9561, Guam, Guam",2011.0,218.0,236.0,1846.0,528.0,50.0,425.0,36.0,53.0,721.0,77500.0,1981.0,150.0,98.0,84.0,1301.0,2011.0,1306.0,239.0,169.0,12.0,1.0,16.0,263.0,69.0,66,010,956100,58289.0
|
||||
50,"Census Tract 9562, Guam, Guam",3945.0,469.0,420.0,3270.0,797.0,69.0,747.0,68.0,66.0,1255.0,77455.0,3488.0,220.0,71.0,122.0,2406.0,3945.0,1911.0,833.0,643.0,20.0,2.0,35.0,471.0,158.0,66,010,956200,58289.0
|
||||
51,"Census Tract 9563, Guam, Guam",2385.0,278.0,250.0,2173.0,592.0,54.0,429.0,64.0,58.0,822.0,57031.0,2346.0,242.0,140.0,121.0,1133.0,2385.0,1316.0,748.0,112.0,7.0,2.0,14.0,181.0,51.0,66,010,956300,58289.0
|
||||
52,"Census Tract 9801, Guam, Guam",42.0,7.0,9.0,41.0,12.0,0.0,11.0,2.0,1.0,17.0,60000.0,42.0,6.0,0.0,3.0,28.0,42.0,26.0,7.0,0.0,0.0,0.0,0.0,9.0,0.0,66,010,980100,58289.0
|
||||
53,"Census Tract 9802, Guam, Guam",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-666666666.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,66,010,980200,
|
||||
54,"Census Tract 9803, Guam, Guam",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-666666666.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,66,010,980300,
|
||||
55,"Census Tract 9804, Guam, Guam",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-666666666.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,66,010,980400,
|
||||
56,"Census Tract 9900, Guam, Guam",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-666666666.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,66,010,990000,
|
||||
0,"Census Tract 9501, Northern Islands Municipality, Commonwealth of the Northern Mariana Islands",7.0,2.0,0.0,7.0,5.0,0.0,0.0,0.0,2.0,0.0,13125.0,7.0,2.0,0.0,1.0,0.0,7.0,7.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,69,085,950100,31362.0
|
||||
0,"Census Tract 9501, Rota Municipality, Commonwealth of the Northern Mariana Islands",1893.0,347.0,252.0,1810.0,514.0,96.0,374.0,75.0,109.0,119.0,31289.0,1891.0,357.0,175.0,157.0,548.0,1893.0,1212.0,557.0,27.0,1.0,0.0,3.0,92.0,17.0,69,100,950100,31362.0
|
||||
1,"Census Tract 9900, Rota Municipality, Commonwealth of the Northern Mariana Islands",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-666666666.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,69,100,990000,
|
||||
0,"Census Tract 1, Saipan Municipality, Commonwealth of the Northern Mariana Islands",1206.0,161.0,143.0,1164.0,342.0,40.0,231.0,37.0,112.0,65.0,42000.0,1203.0,130.0,86.0,121.0,427.0,1206.0,613.0,413.0,41.0,1.0,1.0,1.0,136.0,10.0,69,110,000100,31362.0
|
||||
1,"Census Tract 2, Saipan Municipality, Commonwealth of the Northern Mariana Islands",1399.0,193.0,148.0,1340.0,328.0,39.0,229.0,39.0,91.0,86.0,31250.0,1394.0,280.0,162.0,189.0,362.0,1399.0,817.0,454.0,36.0,0.0,1.0,3.0,88.0,6.0,69,110,000200,31362.0
|
||||
2,"Census Tract 3, Saipan Municipality, Commonwealth of the Northern Mariana Islands",1616.0,189.0,158.0,1551.0,478.0,53.0,365.0,62.0,93.0,117.0,48281.0,1602.0,147.0,115.0,114.0,754.0,1616.0,497.0,856.0,103.0,3.0,1.0,8.0,148.0,33.0,69,110,000300,31362.0
|
||||
3,"Census Tract 4, Saipan Municipality, Commonwealth of the Northern Mariana Islands",3096.0,477.0,364.0,2993.0,980.0,123.0,651.0,92.0,140.0,122.0,24056.0,3087.0,423.0,325.0,508.0,622.0,3096.0,457.0,2462.0,47.0,5.0,2.0,8.0,114.0,15.0,69,110,000400,31362.0
|
||||
4,"Census Tract 5, Saipan Municipality, Commonwealth of the Northern Mariana Islands",2448.0,311.0,269.0,2367.0,645.0,79.0,442.0,61.0,180.0,154.0,30431.0,2440.0,345.0,243.0,307.0,749.0,2448.0,799.0,1393.0,67.0,3.0,0.0,7.0,177.0,41.0,69,110,000500,31362.0
|
||||
5,"Census Tract 6, Saipan Municipality, Commonwealth of the Northern Mariana Islands",2739.0,337.0,240.0,2633.0,830.0,77.0,562.0,67.0,209.0,170.0,31250.0,2728.0,448.0,181.0,381.0,826.0,2739.0,801.0,1736.0,44.0,2.0,2.0,1.0,153.0,28.0,69,110,000600,31362.0
|
||||
6,"Census Tract 7, Saipan Municipality, Commonwealth of the Northern Mariana Islands",3071.0,508.0,308.0,2937.0,949.0,67.0,599.0,61.0,171.0,176.0,26417.0,3066.0,504.0,377.0,406.0,701.0,3071.0,973.0,1919.0,33.0,2.0,0.0,3.0,140.0,17.0,69,110,000700,31362.0
|
||||
7,"Census Tract 8, Saipan Municipality, Commonwealth of the Northern Mariana Islands",1840.0,224.0,183.0,1771.0,494.0,77.0,315.0,53.0,133.0,104.0,23693.0,1657.0,308.0,200.0,224.0,289.0,1840.0,576.0,1131.0,39.0,1.0,0.0,4.0,87.0,5.0,69,110,000800,31362.0
|
||||
8,"Census Tract 9, Saipan Municipality, Commonwealth of the Northern Mariana Islands",2967.0,438.0,295.0,2870.0,838.0,138.0,520.0,108.0,183.0,172.0,23365.0,2957.0,651.0,395.0,384.0,506.0,2967.0,947.0,1871.0,15.0,2.0,0.0,0.0,132.0,18.0,69,110,000900,31362.0
|
||||
9,"Census Tract 10, Saipan Municipality, Commonwealth of the Northern Mariana Islands",2566.0,335.0,232.0,2446.0,733.0,89.0,487.0,73.0,153.0,156.0,32500.0,2564.0,372.0,255.0,344.0,797.0,2566.0,906.0,1365.0,32.0,6.0,2.0,4.0,249.0,26.0,69,110,001000,31362.0
|
||||
10,"Census Tract 11, Saipan Municipality, Commonwealth of the Northern Mariana Islands",1597.0,248.0,178.0,1536.0,471.0,48.0,294.0,50.0,111.0,84.0,23015.0,1594.0,375.0,169.0,187.0,341.0,1597.0,392.0,1099.0,19.0,3.0,0.0,1.0,83.0,14.0,69,110,001100,31362.0
|
||||
11,"Census Tract 12, Saipan Municipality, Commonwealth of the Northern Mariana Islands",1900.0,321.0,214.0,1835.0,535.0,100.0,327.0,76.0,130.0,101.0,21250.0,1895.0,455.0,207.0,268.0,373.0,1900.0,645.0,1158.0,15.0,0.0,0.0,0.0,82.0,2.0,69,110,001200,31362.0
|
||||
12,"Census Tract 13, Saipan Municipality, Commonwealth of the Northern Mariana Islands",3236.0,434.0,331.0,3119.0,738.0,117.0,521.0,105.0,234.0,229.0,27850.0,3225.0,777.0,351.0,379.0,746.0,3236.0,1702.0,1264.0,23.0,0.0,0.0,5.0,242.0,44.0,69,110,001300,31362.0
|
||||
13,"Census Tract 14, Saipan Municipality, Commonwealth of the Northern Mariana Islands",4266.0,565.0,478.0,4081.0,1007.0,132.0,753.0,129.0,311.0,261.0,36086.0,4263.0,674.0,426.0,487.0,1265.0,4266.0,2577.0,1282.0,46.0,8.0,0.0,2.0,350.0,86.0,69,110,001400,31362.0
|
||||
14,"Census Tract 15, Saipan Municipality, Commonwealth of the Northern Mariana Islands",3306.0,458.0,356.0,3172.0,909.0,88.0,689.0,89.0,194.0,196.0,37550.0,3296.0,456.0,280.0,289.0,1196.0,3306.0,1506.0,1358.0,136.0,12.0,1.0,4.0,282.0,82.0,69,110,001500,31362.0
|
||||
15,"Census Tract 16, Saipan Municipality, Commonwealth of the Northern Mariana Islands",4027.0,569.0,496.0,3816.0,952.0,139.0,748.0,141.0,326.0,315.0,43073.0,4022.0,653.0,309.0,310.0,1425.0,4027.0,3049.0,469.0,36.0,3.0,0.0,3.0,460.0,30.0,69,110,001600,31362.0
|
||||
16,"Census Tract 17, Saipan Municipality, Commonwealth of the Northern Mariana Islands",2105.0,264.0,232.0,2020.0,516.0,55.0,417.0,53.0,126.0,107.0,54554.0,2102.0,226.0,103.0,154.0,1115.0,2105.0,1156.0,497.0,204.0,11.0,2.0,5.0,225.0,55.0,69,110,001700,31362.0
|
||||
17,"Census Tract 9900, Saipan Municipality, Commonwealth of the Northern Mariana Islands",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-666666666.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,69,110,990000,
|
||||
0,"Census Tract 9501.01, Tinian Municipality, Commonwealth of the Northern Mariana Islands",1250.0,230.0,149.0,1207.0,402.0,52.0,262.0,33.0,62.0,54.0,31771.0,1249.0,245.0,124.0,114.0,346.0,1250.0,535.0,589.0,9.0,0.0,0.0,3.0,113.0,21.0,69,120,950101,31362.0
|
||||
1,"Census Tract 9501.02, Tinian Municipality, Commonwealth of the Northern Mariana Islands",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-666666666.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,69,120,950102,
|
||||
2,"Census Tract 9502.01, Tinian Municipality, Commonwealth of the Northern Mariana Islands",794.0,119.0,95.0,763.0,220.0,28.0,171.0,27.0,38.0,51.0,41875.0,793.0,98.0,73.0,70.0,329.0,794.0,498.0,181.0,13.0,2.0,0.0,0.0,100.0,4.0,69,120,950201,31362.0
|
||||
3,"Census Tract 9502.02, Tinian Municipality, Commonwealth of the Northern Mariana Islands",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-666666666.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,69,120,950202,
|
||||
4,"Census Tract 9900, Tinian Municipality, Commonwealth of the Northern Mariana Islands",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-666666666.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,69,120,990000,
|
||||
0,"Census Tract 9704, St. Croix Island, United States Virgin Islands",3983.0,666.0,538.0,3362.0,923.0,47.0,881.0,33.0,33.0,82.0,56402.0,3971.0,318.0,71.0,145.0,2742.0,3983.0,0.0,39.0,595.0,2676.0,28.0,430.0,183.0,940.0,78,010,970400,40408.0
|
||||
1,"Census Tract 9701, St. Croix Island, United States Virgin Islands",1832.0,197.0,170.0,1583.0,475.0,23.0,410.0,23.0,1.0,78.0,75625.0,1767.0,69.0,31.0,48.0,1411.0,1832.0,0.0,28.0,986.0,534.0,20.0,149.0,94.0,267.0,78,010,970100,40408.0
|
||||
2,"Census Tract 9702, St. Croix Island, United States Virgin Islands",2446.0,369.0,361.0,1947.0,536.0,41.0,501.0,27.0,32.0,39.0,33400.0,2366.0,438.0,90.0,147.0,1154.0,2446.0,0.0,18.0,299.0,1816.0,14.0,181.0,102.0,695.0,78,010,970200,40408.0
|
||||
3,"Census Tract 9703, St. Croix Island, United States Virgin Islands",3025.0,410.0,459.0,2384.0,638.0,45.0,623.0,50.0,3.0,44.0,34444.0,3002.0,603.0,174.0,219.0,1440.0,3025.0,0.0,17.0,368.0,2081.0,8.0,318.0,215.0,907.0,78,010,970300,40408.0
|
||||
4,"Census Tract 9705, St. Croix Island, United States Virgin Islands",4814.0,567.0,541.0,3195.0,903.0,84.0,815.0,73.0,20.0,51.0,44196.0,3779.0,371.0,145.0,219.0,2251.0,4814.0,44.0,63.0,530.0,2999.0,31.0,581.0,448.0,1405.0,78,010,970500,40408.0
|
||||
5,"Census Tract 9706, St. Croix Island, United States Virgin Islands",2074.0,236.0,195.0,1773.0,570.0,31.0,500.0,27.0,5.0,70.0,62750.0,2074.0,111.0,45.0,86.0,1516.0,2074.0,0.0,59.0,531.0,1089.0,13.0,193.0,170.0,344.0,78,010,970600,40408.0
|
||||
6,"Census Tract 9707, St. Croix Island, United States Virgin Islands",1909.0,280.0,269.0,1651.0,435.0,31.0,400.0,27.0,8.0,34.0,40809.0,1896.0,147.0,80.0,109.0,1179.0,1909.0,0.0,5.0,208.0,1393.0,13.0,184.0,105.0,410.0,78,010,970700,40408.0
|
||||
7,"Census Tract 9708, St. Croix Island, United States Virgin Islands",3157.0,383.0,397.0,2405.0,585.0,62.0,595.0,91.0,19.0,15.0,29375.0,3086.0,648.0,214.0,244.0,1270.0,3157.0,0.0,5.0,59.0,2181.0,19.0,630.0,230.0,1331.0,78,010,970800,40408.0
|
||||
8,"Census Tract 9709, St. Croix Island, United States Virgin Islands",914.0,77.0,151.0,665.0,169.0,18.0,231.0,36.0,6.0,9.0,30385.0,911.0,227.0,48.0,50.0,363.0,914.0,0.0,1.0,40.0,779.0,1.0,67.0,22.0,135.0,78,010,970900,40408.0
|
||||
9,"Census Tract 9710, St. Croix Island, United States Virgin Islands",2041.0,270.0,259.0,1690.0,430.0,44.0,404.0,42.0,25.0,33.0,34550.0,2032.0,340.0,128.0,121.0,1018.0,2041.0,0.0,6.0,278.0,1499.0,11.0,118.0,115.0,270.0,78,010,971000,40408.0
|
||||
10,"Census Tract 9711, St. Croix Island, United States Virgin Islands",3079.0,399.0,433.0,2317.0,527.0,99.0,627.0,103.0,26.0,35.0,24036.0,3011.0,743.0,265.0,223.0,1087.0,3079.0,0.0,6.0,171.0,2569.0,5.0,203.0,117.0,683.0,78,010,971100,40408.0
|
||||
11,"Census Tract 9712, St. Croix Island, United States Virgin Islands",3372.0,546.0,506.0,2835.0,712.0,67.0,622.0,44.0,11.0,31.0,34250.0,3366.0,445.0,176.0,200.0,1800.0,3372.0,0.0,21.0,123.0,2708.0,6.0,266.0,215.0,644.0,78,010,971200,40408.0
|
||||
12,"Census Tract 9713, St. Croix Island, United States Virgin Islands",2678.0,361.0,344.0,2191.0,582.0,63.0,536.0,53.0,25.0,33.0,37132.0,2674.0,306.0,145.0,186.0,1397.0,2678.0,0.0,21.0,161.0,2113.0,15.0,231.0,134.0,585.0,78,010,971300,40408.0
|
||||
13,"Census Tract 9714, St. Croix Island, United States Virgin Islands",2550.0,297.0,359.0,1759.0,402.0,20.0,467.0,33.0,9.0,14.0,28641.0,2337.0,570.0,110.0,190.0,996.0,2550.0,0.0,6.0,80.0,2067.0,7.0,261.0,98.0,563.0,78,010,971400,40408.0
|
||||
14,"Census Tract 9715, St. Croix Island, United States Virgin Islands",3130.0,450.0,436.0,2573.0,707.0,26.0,754.0,36.0,14.0,35.0,45292.0,3124.0,255.0,106.0,205.0,1887.0,3130.0,0.0,20.0,129.0,2603.0,11.0,190.0,171.0,557.0,78,010,971500,40408.0
|
||||
15,"Census Tract 9900, St. Croix Island, United States Virgin Islands",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-666666666.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,78,010,990000,
|
||||
0,"Census Tract 9501, St. John Island, United States Virgin Islands",1233.0,164.0,130.0,1058.0,322.0,34.0,329.0,32.0,8.0,35.0,52143.0,1228.0,97.0,36.0,63.0,799.0,1233.0,0.0,7.0,570.0,532.0,6.0,37.0,75.0,88.0,78,020,950100,40408.0
|
||||
1,"Census Tract 9502, St. John Island, United States Virgin Islands",2648.0,496.0,401.0,2305.0,853.0,72.0,700.0,99.0,25.0,47.0,49100.0,2623.0,301.0,98.0,134.0,1617.0,2648.0,1.0,13.0,777.0,1420.0,19.0,158.0,248.0,444.0,78,020,950200,40408.0
|
||||
2,"Census Tract 9900, St. John Island, United States Virgin Islands",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-666666666.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,78,020,990000,
|
||||
0,"Census Tract 9601, St. Thomas Island, United States Virgin Islands",3329.0,485.0,449.0,2761.0,856.0,108.0,861.0,118.0,37.0,39.0,40234.0,3313.0,339.0,160.0,200.0,1840.0,3329.0,0.0,11.0,409.0,2403.0,7.0,90.0,402.0,542.0,78,030,960100,40408.0
|
||||
1,"Census Tract 9602, St. Thomas Island, United States Virgin Islands",3762.0,556.0,652.0,3101.0,894.0,116.0,871.0,90.0,84.0,22.0,37628.0,3722.0,401.0,175.0,209.0,1959.0,3762.0,0.0,13.0,41.0,3427.0,1.0,62.0,213.0,287.0,78,030,960200,40408.0
|
||||
2,"Census Tract 9603, St. Thomas Island, United States Virgin Islands",3117.0,516.0,560.0,2708.0,692.0,61.0,766.0,65.0,56.0,45.0,41746.0,3099.0,253.0,160.0,159.0,1926.0,3117.0,0.0,1.0,19.0,2838.0,1.0,59.0,199.0,248.0,78,030,960300,40408.0
|
||||
3,"Census Tract 9604, St. Thomas Island, United States Virgin Islands",3872.0,494.0,547.0,3303.0,992.0,52.0,1068.0,65.0,14.0,99.0,50602.0,3868.0,284.0,100.0,176.0,2548.0,3872.0,3.0,98.0,1000.0,2369.0,24.0,106.0,239.0,333.0,78,030,960400,40408.0
|
||||
4,"Census Tract 9605, St. Thomas Island, United States Virgin Islands",5001.0,676.0,580.0,4375.0,1340.0,90.0,1435.0,102.0,14.0,138.0,61962.0,4990.0,253.0,103.0,180.0,3793.0,5001.0,2.0,51.0,1715.0,2608.0,27.0,135.0,430.0,414.0,78,030,960500,40408.0
|
||||
5,"Census Tract 9606, St. Thomas Island, United States Virgin Islands",3114.0,402.0,423.0,2538.0,743.0,59.0,741.0,79.0,30.0,53.0,39393.0,3081.0,286.0,145.0,212.0,1658.0,3114.0,0.0,71.0,332.0,2220.0,13.0,158.0,302.0,561.0,78,030,960600,40408.0
|
||||
6,"Census Tract 9607, St. Thomas Island, United States Virgin Islands",2900.0,486.0,379.0,2489.0,783.0,77.0,688.0,64.0,23.0,51.0,44375.0,2897.0,273.0,135.0,147.0,1797.0,2900.0,0.0,15.0,488.0,2088.0,10.0,63.0,224.0,263.0,78,030,960700,40408.0
|
||||
7,"Census Tract 9608, St. Thomas Island, United States Virgin Islands",3161.0,430.0,428.0,2399.0,687.0,66.0,702.0,88.0,41.0,37.0,41375.0,2837.0,306.0,101.0,207.0,1578.0,3161.0,1.0,33.0,302.0,2351.0,11.0,173.0,278.0,602.0,78,030,960800,40408.0
|
||||
8,"Census Tract 9609, St. Thomas Island, United States Virgin Islands",3721.0,449.0,501.0,3049.0,930.0,107.0,826.0,119.0,57.0,66.0,38444.0,3700.0,478.0,239.0,241.0,1959.0,3721.0,0.0,82.0,437.0,2662.0,24.0,90.0,419.0,490.0,78,030,960900,40408.0
|
||||
9,"Census Tract 9610, St. Thomas Island, United States Virgin Islands",4386.0,681.0,620.0,3582.0,1095.0,135.0,976.0,156.0,60.0,29.0,31429.0,4276.0,559.0,301.0,317.0,1861.0,4386.0,0.0,85.0,217.0,3437.0,11.0,123.0,491.0,1050.0,78,030,961000,40408.0
|
||||
10,"Census Tract 9611, St. Thomas Island, United States Virgin Islands",3780.0,521.0,647.0,3144.0,833.0,114.0,866.0,117.0,24.0,24.0,29135.0,3754.0,511.0,272.0,278.0,1592.0,3780.0,0.0,92.0,84.0,3033.0,5.0,137.0,420.0,623.0,78,030,961100,40408.0
|
||||
11,"Census Tract 9612, St. Thomas Island, United States Virgin Islands",2118.0,261.0,280.0,1608.0,436.0,53.0,432.0,69.0,59.0,13.0,28523.0,1982.0,354.0,153.0,131.0,751.0,2118.0,0.0,23.0,87.0,1688.0,10.0,85.0,210.0,394.0,78,030,961200,40408.0
|
||||
12,"Census Tract 9900, St. Thomas Island, United States Virgin Islands",0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-666666666.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,78,030,990000,
|
|
|
@ -0,0 +1,152 @@
|
|||
import pytest
|
||||
import pandas as pd
|
||||
from pathlib import Path
|
||||
from data_pipeline.etl.sources.census_decennial.constants import (
|
||||
DEC_TERRITORY_PARAMS,
|
||||
DEC_FIELD_NAMES,
|
||||
OUTPUT_RACE_FIELDS,
|
||||
)
|
||||
from data_pipeline.etl.sources.census_decennial.etl import CensusDecennialETL
|
||||
from data_pipeline.score import field_names
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def territory_params_fixture():
|
||||
return [
|
||||
{
|
||||
"state_abbreviation": "as",
|
||||
"fips": "60",
|
||||
"county_fips": ["010"],
|
||||
"xwalk": DEC_TERRITORY_PARAMS[0]["xwalk"],
|
||||
"median_income": 26352,
|
||||
},
|
||||
{
|
||||
"state_abbreviation": "gu",
|
||||
"fips": "66",
|
||||
"county_fips": ["010"],
|
||||
"xwalk": DEC_TERRITORY_PARAMS[1]["xwalk"],
|
||||
"median_income": 58289,
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def extract_path_fixture():
|
||||
return Path(__file__).parents[0] / "data/extract"
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def transform_path_fixture():
|
||||
return Path(__file__).parents[0] / "data/transform"
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def transformed_data_fixture(transform_path_fixture):
|
||||
"""Load the test data and call the ETL transform"""
|
||||
dec = CensusDecennialETL()
|
||||
dec.df_all = pd.read_csv(
|
||||
transform_path_fixture / "usa.csv",
|
||||
# Make sure these columns are string as expected of the original
|
||||
dtype={"state": "object", "county": "object", "tract": "object"},
|
||||
)
|
||||
dec.transform()
|
||||
return dec.df_all
|
||||
|
||||
|
||||
###############
|
||||
# Extract tests
|
||||
###############
|
||||
def test_no_files_found(territory_params_fixture):
|
||||
"""Test the ETL raises an exception if the file is not found"""
|
||||
dec = CensusDecennialETL()
|
||||
with pytest.raises(FileNotFoundError):
|
||||
dec.extract(
|
||||
use_cached_data_sources=True,
|
||||
test_territory_params=territory_params_fixture,
|
||||
test_path=Path("/path_does_not_exist"),
|
||||
)
|
||||
|
||||
|
||||
def test_load_data(extract_path_fixture, territory_params_fixture):
|
||||
"""Test the ETL loads and translates the data"""
|
||||
dec = CensusDecennialETL()
|
||||
dec.extract(
|
||||
use_cached_data_sources=True,
|
||||
test_territory_params=territory_params_fixture,
|
||||
test_path=extract_path_fixture,
|
||||
)
|
||||
df = dec.df_all
|
||||
assert len(df) == 64
|
||||
assert len(df.columns) == 30
|
||||
|
||||
# Columns should not have any census variable names
|
||||
census_vars = list(DEC_TERRITORY_PARAMS[0]["xwalk"].keys()) + list(
|
||||
DEC_TERRITORY_PARAMS[1]["xwalk"].keys()
|
||||
)
|
||||
for var in census_vars:
|
||||
assert var not in df.columns
|
||||
|
||||
# Median income is added for entries with population
|
||||
assert (
|
||||
df.loc[
|
||||
df[field_names.CENSUS_DECENNIAL_TOTAL_POPULATION_FIELD_2019] > 0,
|
||||
DEC_FIELD_NAMES.TERRITORY_MEDIAN_INCOME,
|
||||
]
|
||||
> 0
|
||||
).all()
|
||||
assert not (
|
||||
df.loc[
|
||||
df[field_names.CENSUS_DECENNIAL_TOTAL_POPULATION_FIELD_2019] == 0,
|
||||
DEC_FIELD_NAMES.TERRITORY_MEDIAN_INCOME,
|
||||
]
|
||||
> 0
|
||||
).any()
|
||||
|
||||
|
||||
###############
|
||||
# Transform tests
|
||||
###############
|
||||
def test_geo_tract_generation(transformed_data_fixture):
|
||||
result = transformed_data_fixture
|
||||
assert field_names.GEOID_TRACT_FIELD in result.columns
|
||||
assert result[field_names.GEOID_TRACT_FIELD].notnull().all()
|
||||
|
||||
# Grab one GEO ID and test it
|
||||
assert (
|
||||
result[field_names.GEOID_TRACT_FIELD][0]
|
||||
== result["state"][0] + result["county"][0] + result["tract"][0]
|
||||
)
|
||||
|
||||
|
||||
def test_merge_tracts(transformed_data_fixture):
|
||||
result = transformed_data_fixture
|
||||
# 69120950200 exists, but the tract split does now
|
||||
assert (
|
||||
result.loc[result[field_names.GEOID_TRACT_FIELD] == "69120950200"]
|
||||
.any()
|
||||
.any()
|
||||
)
|
||||
assert (
|
||||
not result.loc[result[field_names.GEOID_TRACT_FIELD] == "69120950201"]
|
||||
.any()
|
||||
.any()
|
||||
)
|
||||
assert (
|
||||
not result.loc[result[field_names.GEOID_TRACT_FIELD] == "69120950202"]
|
||||
.any()
|
||||
.any()
|
||||
)
|
||||
|
||||
|
||||
def test_remove_invalid_values(transformed_data_fixture):
|
||||
numeric_df = transformed_data_fixture.select_dtypes(include="number")
|
||||
assert not (numeric_df < -999).any().any()
|
||||
|
||||
|
||||
def test_race_fields(transformed_data_fixture):
|
||||
for race_field_name in OUTPUT_RACE_FIELDS:
|
||||
assert race_field_name in transformed_data_fixture.columns
|
||||
assert any(
|
||||
col.startswith(field_names.PERCENT_PREFIX + race_field_name)
|
||||
for col in transformed_data_fixture.columns
|
||||
)
|
Loading…
Add table
Reference in a new issue