mirror of
https://github.com/DOI-DO/j40-cejst-2.git
synced 2025-09-30 10:53:18 -07:00
Merge branch 'usds:main' into main
This commit is contained in:
commit
e308f0934b
5 changed files with 485 additions and 186 deletions
|
@ -2,6 +2,7 @@ from pathlib import Path
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
from data_pipeline.etl.base import ExtractTransformLoad
|
from data_pipeline.etl.base import ExtractTransformLoad
|
||||||
from data_pipeline.utils import get_module_logger, zip_files
|
from data_pipeline.utils import get_module_logger, zip_files
|
||||||
|
from data_pipeline.score import field_names
|
||||||
|
|
||||||
|
|
||||||
from data_pipeline.etl.sources.census.etl_utils import (
|
from data_pipeline.etl.sources.census.etl_utils import (
|
||||||
|
@ -179,7 +180,9 @@ class PostScoreETL(ExtractTransformLoad):
|
||||||
)
|
)
|
||||||
|
|
||||||
# list the null score tracts
|
# list the null score tracts
|
||||||
null_tract_df = merged_df[merged_df["Score E (percentile)"].isnull()]
|
null_tract_df = merged_df[
|
||||||
|
merged_df[field_names.SCORE_L_COMMUNITIES].isnull()
|
||||||
|
]
|
||||||
|
|
||||||
# subtract data sets
|
# subtract data sets
|
||||||
# this follows the XOR pattern outlined here:
|
# this follows the XOR pattern outlined here:
|
||||||
|
@ -267,7 +270,9 @@ class PostScoreETL(ExtractTransformLoad):
|
||||||
|
|
||||||
# Rename score column
|
# Rename score column
|
||||||
downloadable_df_copy = downloadable_df.rename(
|
downloadable_df_copy = downloadable_df.rename(
|
||||||
columns={"Score G (communities)": "Community of focus (v0.1)"},
|
columns={
|
||||||
|
field_names.SCORE_L_COMMUNITIES: "Community of focus (v0.1)"
|
||||||
|
},
|
||||||
inplace=False,
|
inplace=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -114,6 +114,46 @@ class CensusACSETL(ExtractTransformLoad):
|
||||||
)
|
)
|
||||||
self.HIGH_SCHOOL_ED_FIELD = "Percent individuals age 25 or over with less than high school degree"
|
self.HIGH_SCHOOL_ED_FIELD = "Percent individuals age 25 or over with less than high school degree"
|
||||||
|
|
||||||
|
self.RE_FIELDS = [
|
||||||
|
"B02001_001E",
|
||||||
|
"B02001_002E",
|
||||||
|
"B02001_003E",
|
||||||
|
"B02001_004E",
|
||||||
|
"B02001_005E",
|
||||||
|
"B02001_006E",
|
||||||
|
"B02001_007E",
|
||||||
|
"B02001_008E",
|
||||||
|
"B02001_009E",
|
||||||
|
"B02001_010E",
|
||||||
|
"B03002_001E",
|
||||||
|
"B03002_003E",
|
||||||
|
"B03003_001E",
|
||||||
|
"B03003_003E",
|
||||||
|
]
|
||||||
|
|
||||||
|
# Name output demographics fields.
|
||||||
|
self.BLACK_FIELD_NAME = "Black or African American alone"
|
||||||
|
self.AMERICAN_INDIAN_FIELD_NAME = (
|
||||||
|
"American Indian and Alaska Native alone"
|
||||||
|
)
|
||||||
|
self.ASIAN_FIELD_NAME = "Asian alone"
|
||||||
|
self.HAWAIIAN_FIELD_NAME = "Native Hawaiian and Other Pacific alone"
|
||||||
|
self.TWO_OR_MORE_RACES_FIELD_NAME = "Two or more races"
|
||||||
|
self.NON_HISPANIC_WHITE_FIELD_NAME = "Non-Hispanic White"
|
||||||
|
self.HISPANIC_FIELD_NAME = "Hispanic or Latino"
|
||||||
|
|
||||||
|
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.PERCENT_PREFIX = "Percent "
|
||||||
|
|
||||||
self.STATE_GEOID_FIELD_NAME = "GEOID2"
|
self.STATE_GEOID_FIELD_NAME = "GEOID2"
|
||||||
|
|
||||||
self.df: pd.DataFrame
|
self.df: pd.DataFrame
|
||||||
|
@ -131,6 +171,7 @@ class CensusACSETL(ExtractTransformLoad):
|
||||||
+ self.LINGUISTIC_ISOLATION_FIELDS
|
+ self.LINGUISTIC_ISOLATION_FIELDS
|
||||||
+ self.POVERTY_FIELDS
|
+ self.POVERTY_FIELDS
|
||||||
+ self.EDUCATIONAL_FIELDS
|
+ self.EDUCATIONAL_FIELDS
|
||||||
|
+ self.RE_FIELDS
|
||||||
)
|
)
|
||||||
|
|
||||||
self.df = retrieve_census_acs_data(
|
self.df = retrieve_census_acs_data(
|
||||||
|
@ -235,6 +276,38 @@ class CensusACSETL(ExtractTransformLoad):
|
||||||
/ df[self.EDUCATION_POPULATION_OVER_25]
|
/ df[self.EDUCATION_POPULATION_OVER_25]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Calculate some demographic information.
|
||||||
|
df[self.BLACK_FIELD_NAME] = df["B02001_003E"]
|
||||||
|
df[self.AMERICAN_INDIAN_FIELD_NAME] = df["B02001_004E"]
|
||||||
|
df[self.ASIAN_FIELD_NAME] = df["B02001_005E"]
|
||||||
|
df[self.HAWAIIAN_FIELD_NAME] = df["B02001_006E"]
|
||||||
|
df[self.TWO_OR_MORE_RACES_FIELD_NAME] = df["B02001_008E"]
|
||||||
|
df[self.NON_HISPANIC_WHITE_FIELD_NAME] = df["B03002_003E"]
|
||||||
|
df[self.HISPANIC_FIELD_NAME] = df["B03003_003E"]
|
||||||
|
|
||||||
|
# Calculate demographics as percent
|
||||||
|
df[self.PERCENT_PREFIX + self.BLACK_FIELD_NAME] = (
|
||||||
|
df["B02001_003E"] / df["B02001_001E"]
|
||||||
|
)
|
||||||
|
df[self.PERCENT_PREFIX + self.AMERICAN_INDIAN_FIELD_NAME] = (
|
||||||
|
df["B02001_004E"] / df["B02001_001E"]
|
||||||
|
)
|
||||||
|
df[self.PERCENT_PREFIX + self.ASIAN_FIELD_NAME] = (
|
||||||
|
df["B02001_005E"] / df["B02001_001E"]
|
||||||
|
)
|
||||||
|
df[self.PERCENT_PREFIX + self.HAWAIIAN_FIELD_NAME] = (
|
||||||
|
df["B02001_006E"] / df["B02001_001E"]
|
||||||
|
)
|
||||||
|
df[self.PERCENT_PREFIX + self.TWO_OR_MORE_RACES_FIELD_NAME] = (
|
||||||
|
df["B02001_008E"] / df["B02001_001E"]
|
||||||
|
)
|
||||||
|
df[self.PERCENT_PREFIX + self.NON_HISPANIC_WHITE_FIELD_NAME] = (
|
||||||
|
df["B03002_003E"] / df["B03002_001E"]
|
||||||
|
)
|
||||||
|
df[self.PERCENT_PREFIX + self.HISPANIC_FIELD_NAME] = (
|
||||||
|
df["B03003_003E"] / df["B03003_001E"]
|
||||||
|
)
|
||||||
|
|
||||||
# Save results to self.
|
# Save results to self.
|
||||||
self.df = df
|
self.df = df
|
||||||
|
|
||||||
|
@ -244,17 +317,21 @@ class CensusACSETL(ExtractTransformLoad):
|
||||||
# mkdir census
|
# mkdir census
|
||||||
self.OUTPUT_PATH.mkdir(parents=True, exist_ok=True)
|
self.OUTPUT_PATH.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
columns_to_include = [
|
columns_to_include = (
|
||||||
self.GEOID_TRACT_FIELD_NAME,
|
[
|
||||||
self.UNEMPLOYED_FIELD_NAME,
|
self.GEOID_TRACT_FIELD_NAME,
|
||||||
self.LINGUISTIC_ISOLATION_FIELD_NAME,
|
self.UNEMPLOYED_FIELD_NAME,
|
||||||
self.MEDIAN_INCOME_FIELD_NAME,
|
self.LINGUISTIC_ISOLATION_FIELD_NAME,
|
||||||
self.POVERTY_LESS_THAN_100_PERCENT_FPL_FIELD_NAME,
|
self.MEDIAN_INCOME_FIELD_NAME,
|
||||||
self.POVERTY_LESS_THAN_150_PERCENT_FPL_FIELD_NAME,
|
self.POVERTY_LESS_THAN_100_PERCENT_FPL_FIELD_NAME,
|
||||||
self.POVERTY_LESS_THAN_200_PERCENT_FPL_FIELD_NAME,
|
self.POVERTY_LESS_THAN_150_PERCENT_FPL_FIELD_NAME,
|
||||||
self.MEDIAN_HOUSE_VALUE_FIELD_NAME,
|
self.POVERTY_LESS_THAN_200_PERCENT_FPL_FIELD_NAME,
|
||||||
self.HIGH_SCHOOL_ED_FIELD,
|
self.MEDIAN_HOUSE_VALUE_FIELD_NAME,
|
||||||
]
|
self.HIGH_SCHOOL_ED_FIELD,
|
||||||
|
]
|
||||||
|
+ self.RE_OUTPUT_FIELDS
|
||||||
|
+ [self.PERCENT_PREFIX + field for field in self.RE_OUTPUT_FIELDS]
|
||||||
|
)
|
||||||
|
|
||||||
self.df[columns_to_include].to_csv(
|
self.df[columns_to_include].to_csv(
|
||||||
path_or_buf=self.OUTPUT_PATH / "usa.csv", index=False
|
path_or_buf=self.OUTPUT_PATH / "usa.csv", index=False
|
||||||
|
|
|
@ -26,7 +26,7 @@ class DOEEnergyBurden(ExtractTransformLoad):
|
||||||
# Constants for output
|
# Constants for output
|
||||||
self.COLUMNS_TO_KEEP = [
|
self.COLUMNS_TO_KEEP = [
|
||||||
self.GEOID_TRACT_FIELD_NAME,
|
self.GEOID_TRACT_FIELD_NAME,
|
||||||
self.REVISED_ENERGY_BURDEN_FIELD_NAME
|
self.REVISED_ENERGY_BURDEN_FIELD_NAME,
|
||||||
]
|
]
|
||||||
|
|
||||||
self.raw_df: pd.DataFrame
|
self.raw_df: pd.DataFrame
|
||||||
|
@ -57,7 +57,7 @@ class DOEEnergyBurden(ExtractTransformLoad):
|
||||||
|
|
||||||
output_df = self.raw_df.rename(
|
output_df = self.raw_df.rename(
|
||||||
columns={
|
columns={
|
||||||
self.INPUT_ENERGY_BURDEN_FIELD_NAME : self.REVISED_ENERGY_BURDEN_FIELD_NAME,
|
self.INPUT_ENERGY_BURDEN_FIELD_NAME: self.REVISED_ENERGY_BURDEN_FIELD_NAME,
|
||||||
self.TRACT_INPUT_COLUMN_NAME: self.GEOID_TRACT_FIELD_NAME,
|
self.TRACT_INPUT_COLUMN_NAME: self.GEOID_TRACT_FIELD_NAME,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -31,6 +31,8 @@ L_WATER = "Water Factor (Definition L)"
|
||||||
L_HEALTH = "Health Factor (Definition L)"
|
L_HEALTH = "Health Factor (Definition L)"
|
||||||
L_WORKFORCE = "Workforce Factor (Definition L)"
|
L_WORKFORCE = "Workforce Factor (Definition L)"
|
||||||
L_NON_WORKFORCE = "Any Non-Workforce Factor (Definition L)"
|
L_NON_WORKFORCE = "Any Non-Workforce Factor (Definition L)"
|
||||||
|
PERCENTILE = 90
|
||||||
|
MEDIAN_HOUSE_VALUE_PERCENTILE = 90
|
||||||
|
|
||||||
# Poverty / Income
|
# Poverty / Income
|
||||||
POVERTY_FIELD = "Poverty (Less than 200% of federal poverty line)"
|
POVERTY_FIELD = "Poverty (Less than 200% of federal poverty line)"
|
||||||
|
@ -196,3 +198,63 @@ HOLC_GRADE_D_TRACT_PERCENT_FIELD: str = "Percent of tract that is HOLC Grade D"
|
||||||
HOLC_GRADE_D_TRACT_20_PERCENT_FIELD: str = "Tract is >20% HOLC Grade D"
|
HOLC_GRADE_D_TRACT_20_PERCENT_FIELD: str = "Tract is >20% HOLC Grade D"
|
||||||
HOLC_GRADE_D_TRACT_50_PERCENT_FIELD: str = "Tract is >50% HOLC Grade D"
|
HOLC_GRADE_D_TRACT_50_PERCENT_FIELD: str = "Tract is >50% HOLC Grade D"
|
||||||
HOLC_GRADE_D_TRACT_75_PERCENT_FIELD: str = "Tract is >75% HOLC Grade D"
|
HOLC_GRADE_D_TRACT_75_PERCENT_FIELD: str = "Tract is >75% HOLC Grade D"
|
||||||
|
|
||||||
|
|
||||||
|
# Climate Change
|
||||||
|
EXPECTED_POPULATION_LOSS_RATE_LOW_INCOME_FIELD = f"At or above the {PERCENTILE}th percentile for expected population loss rate and is low income"
|
||||||
|
EXPECTED_AGRICULTURE_LOSS_RATE_LOW_INCOME_FIELD = f"At or above the {PERCENTILE}th percentile for expected agriculture loss rate and is low income"
|
||||||
|
EXPECTED_BUILDING_LOSS_RATE_LOW_INCOME_FIELD = f"At or above the {PERCENTILE}th percentile for expected building loss rate and is low income"
|
||||||
|
|
||||||
|
# Clean energy and efficiency
|
||||||
|
PM25_EXPOSURE_LOW_INCOME_FIELD = f"At or above the {PERCENTILE}th percentile for PM2.5 exposure and is low income"
|
||||||
|
ENERGY_BURDEN_LOW_INCOME_FIELD = f"At or above the {PERCENTILE}th percentile for energy burden and is low income"
|
||||||
|
# Clean transportation
|
||||||
|
DIESEL_PARTICULATE_MATTER_LOW_INCOME_FIELD = f"At or above the {PERCENTILE}th percentile for diesel particulate matter and is low income"
|
||||||
|
TRAFFIC_PROXIMITY_LOW_INCOME_FIELD = f"At or above the {PERCENTILE}th percentile for traffic proximity and is low income"
|
||||||
|
# Affordable and Sustainable Housing
|
||||||
|
LEAD_PAINT_MEDIAN_HOME_VALUE_LOW_INCOME_FIELD = (
|
||||||
|
f"At or above the {PERCENTILE}th percentile for lead paint and"
|
||||||
|
" the median house value is less than {MEDIAN_HOUSE_VALUE_PERCENTILE}th percentile and is low income"
|
||||||
|
)
|
||||||
|
HOUSING_BURDEN_LOW_INCOME_FIELD = f"At or above the {PERCENTILE}th percentile for housing burden and is low income"
|
||||||
|
# Remediation and Reduction of Legacy Pollution
|
||||||
|
RMP_LOW_INCOME_FIELD = f"At or above the {PERCENTILE}th percentile for proximity to RMP sites and is low income"
|
||||||
|
SUPERFUND_LOW_INCOME_FIELD = f"At or above the {PERCENTILE}th percentile for proximity to superfund sites and is low income"
|
||||||
|
HAZARDOUS_WASTE_LOW_INCOME_FIELD = f"At or above the {PERCENTILE}th percentile for proximity to hazardous waste facilities and is low income"
|
||||||
|
# Critical Clean Water and Waste Infrastructure
|
||||||
|
WASTEWATER_DISCHARGE_LOW_INCOME_FIELD = f"At or above the {PERCENTILE}th percentile for wastewater discharge and is low income"
|
||||||
|
# Health Burden
|
||||||
|
DIABETES_LOW_INCOME_FIELD = (
|
||||||
|
f"At or above the {PERCENTILE}th percentile for diabetes and is low income"
|
||||||
|
)
|
||||||
|
ASTHMA_LOW_INCOME_FIELD = (
|
||||||
|
f"At or above the {PERCENTILE}th percentile for asthma and is low income"
|
||||||
|
)
|
||||||
|
HEART_DISEASE_LOW_INCOME_FIELD = f"At or above the {PERCENTILE}th percentile for heart disease and is low income"
|
||||||
|
|
||||||
|
LIFE_EXPECTANCY_LOW_INCOME_FIELD = f"At or above the {PERCENTILE}th percentile for life expectancy and is low income"
|
||||||
|
|
||||||
|
# Workforce
|
||||||
|
UNEMPLOYMENT_LOW_HS_EDUCATION_FIELD = (
|
||||||
|
f"At or above the {PERCENTILE}th percentile for unemployment"
|
||||||
|
" and low HS education"
|
||||||
|
)
|
||||||
|
|
||||||
|
LINGUISTIC_ISOLATION_LOW_HS_EDUCATION_FIELD = (
|
||||||
|
f"At or above the {PERCENTILE}th percentile for households in linguistic isolation"
|
||||||
|
" and low HS education"
|
||||||
|
)
|
||||||
|
|
||||||
|
POVERTY_LOW_HS_EDUCATION_FIELD = (
|
||||||
|
f"At or above the {PERCENTILE}th percentile for households at or below 100% federal poverty level"
|
||||||
|
" and low HS education"
|
||||||
|
)
|
||||||
|
|
||||||
|
MEDIAN_INCOME_LOW_HS_EDUCATION_FIELD = (
|
||||||
|
f"At or below the {PERCENTILE}th percentile for median income"
|
||||||
|
" and low HS education"
|
||||||
|
)
|
||||||
|
|
||||||
|
THRESHOLD_COUNT = "Total threshold criteria exceeded"
|
||||||
|
|
||||||
|
FPL_200_SERIES = "Is low income"
|
||||||
|
|
|
@ -93,9 +93,38 @@ class ScoreL(Score):
|
||||||
|
|
||||||
return df, threshold_column_name
|
return df, threshold_column_name
|
||||||
|
|
||||||
|
def _create_low_income_threshold(self, df: pd.DataFrame) -> pd.Series:
|
||||||
|
"""
|
||||||
|
Returns a pandas series (really a numpy array)
|
||||||
|
of booleans based on the condition of the FPL at 200%
|
||||||
|
is at or more than some established threshold
|
||||||
|
"""
|
||||||
|
return (
|
||||||
|
df[
|
||||||
|
field_names.POVERTY_LESS_THAN_200_FPL_FIELD
|
||||||
|
+ field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
|
]
|
||||||
|
>= self.LOW_INCOME_THRESHOLD
|
||||||
|
)
|
||||||
|
|
||||||
|
def _increment_total_eligibility_exceeded(
|
||||||
|
self, columns_for_subset: list
|
||||||
|
) -> None:
|
||||||
|
"""
|
||||||
|
Increments the total eligible factors for a given tract
|
||||||
|
"""
|
||||||
|
|
||||||
|
self.df[field_names.THRESHOLD_COUNT] += self.df[columns_for_subset].sum(
|
||||||
|
axis=1
|
||||||
|
)
|
||||||
|
|
||||||
def add_columns(self) -> pd.DataFrame:
|
def add_columns(self) -> pd.DataFrame:
|
||||||
logger.info("Adding Score L")
|
logger.info("Adding Score L")
|
||||||
|
|
||||||
|
self.df[field_names.THRESHOLD_COUNT] = 0
|
||||||
|
self.df[field_names.FPL_200_SERIES] = self._create_low_income_threshold(
|
||||||
|
self.df
|
||||||
|
)
|
||||||
self.df[field_names.L_CLIMATE] = self._climate_factor()
|
self.df[field_names.L_CLIMATE] = self._climate_factor()
|
||||||
self.df[field_names.L_ENERGY] = self._energy_factor()
|
self.df[field_names.L_ENERGY] = self._energy_factor()
|
||||||
self.df[field_names.L_TRANSPORTATION] = self._transportation_factor()
|
self.df[field_names.L_TRANSPORTATION] = self._transportation_factor()
|
||||||
|
@ -143,37 +172,55 @@ class ScoreL(Score):
|
||||||
# Low income: In 60th percentile or above for percent of block group population
|
# Low income: In 60th percentile or above for percent of block group population
|
||||||
# of households where household income is less than or equal to twice the federal
|
# of households where household income is less than or equal to twice the federal
|
||||||
# poverty level. Source: Census's American Community Survey]
|
# poverty level. Source: Census's American Community Survey]
|
||||||
climate_criteria = (
|
|
||||||
(
|
|
||||||
self.df[
|
|
||||||
field_names.EXPECTED_BUILDING_LOSS_RATE_FIELD
|
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
|
||||||
]
|
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
|
||||||
)
|
|
||||||
| (
|
|
||||||
self.df[
|
|
||||||
field_names.EXPECTED_AGRICULTURE_LOSS_RATE_FIELD
|
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
|
||||||
]
|
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
|
||||||
)
|
|
||||||
| (
|
|
||||||
self.df[
|
|
||||||
field_names.EXPECTED_POPULATION_LOSS_RATE_FIELD
|
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
|
||||||
]
|
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
return (
|
climate_eligibility_columns = [
|
||||||
|
field_names.EXPECTED_POPULATION_LOSS_RATE_LOW_INCOME_FIELD,
|
||||||
|
field_names.EXPECTED_AGRICULTURE_LOSS_RATE_LOW_INCOME_FIELD,
|
||||||
|
field_names.EXPECTED_BUILDING_LOSS_RATE_LOW_INCOME_FIELD,
|
||||||
|
]
|
||||||
|
|
||||||
|
expected_population_loss_threshold = (
|
||||||
self.df[
|
self.df[
|
||||||
field_names.POVERTY_LESS_THAN_200_FPL_FIELD
|
field_names.EXPECTED_POPULATION_LOSS_RATE_FIELD
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
+ field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
]
|
]
|
||||||
>= self.LOW_INCOME_THRESHOLD
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
) & climate_criteria
|
)
|
||||||
|
|
||||||
|
expected_agriculture_loss_threshold = (
|
||||||
|
self.df[
|
||||||
|
field_names.EXPECTED_AGRICULTURE_LOSS_RATE_FIELD
|
||||||
|
+ field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
|
]
|
||||||
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
|
)
|
||||||
|
|
||||||
|
expected_building_loss_threshold = (
|
||||||
|
self.df[
|
||||||
|
field_names.EXPECTED_BUILDING_LOSS_RATE_FIELD
|
||||||
|
+ field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
|
]
|
||||||
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
|
)
|
||||||
|
|
||||||
|
self.df[field_names.EXPECTED_POPULATION_LOSS_RATE_LOW_INCOME_FIELD] = (
|
||||||
|
expected_population_loss_threshold
|
||||||
|
& self.df[field_names.FPL_200_SERIES]
|
||||||
|
)
|
||||||
|
|
||||||
|
self.df[field_names.EXPECTED_AGRICULTURE_LOSS_RATE_LOW_INCOME_FIELD] = (
|
||||||
|
expected_agriculture_loss_threshold
|
||||||
|
& self.df[field_names.FPL_200_SERIES]
|
||||||
|
)
|
||||||
|
|
||||||
|
self.df[field_names.EXPECTED_BUILDING_LOSS_RATE_LOW_INCOME_FIELD] = (
|
||||||
|
expected_building_loss_threshold
|
||||||
|
& self.df[field_names.FPL_200_SERIES]
|
||||||
|
)
|
||||||
|
|
||||||
|
self._increment_total_eligibility_exceeded(climate_eligibility_columns)
|
||||||
|
|
||||||
|
return self.df[climate_eligibility_columns].any(axis="columns")
|
||||||
|
|
||||||
def _energy_factor(self) -> bool:
|
def _energy_factor(self) -> bool:
|
||||||
# In Xth percentile or above for DOE’s energy cost burden score (Source: LEAD Score)
|
# In Xth percentile or above for DOE’s energy cost burden score (Source: LEAD Score)
|
||||||
|
@ -181,26 +228,38 @@ class ScoreL(Score):
|
||||||
# Low income: In 60th percentile or above for percent of block group population
|
# Low income: In 60th percentile or above for percent of block group population
|
||||||
# of households where household income is less than or equal to twice the federal
|
# of households where household income is less than or equal to twice the federal
|
||||||
# poverty level. Source: Census's American Community Survey]
|
# poverty level. Source: Census's American Community Survey]
|
||||||
energy_criteria = (
|
|
||||||
|
energy_eligibility_columns = [
|
||||||
|
field_names.PM25_EXPOSURE_LOW_INCOME_FIELD,
|
||||||
|
field_names.ENERGY_BURDEN_LOW_INCOME_FIELD,
|
||||||
|
]
|
||||||
|
|
||||||
|
energy_burden_threshold = (
|
||||||
self.df[
|
self.df[
|
||||||
field_names.ENERGY_BURDEN_FIELD
|
field_names.ENERGY_BURDEN_FIELD
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
+ field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
]
|
]
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
) | (
|
)
|
||||||
|
|
||||||
|
pm25_threshold = (
|
||||||
self.df[
|
self.df[
|
||||||
field_names.PM25_FIELD + field_names.PERCENTILE_FIELD_SUFFIX
|
field_names.PM25_FIELD + field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
]
|
]
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
)
|
)
|
||||||
|
|
||||||
return (
|
self.df[field_names.PM25_EXPOSURE_LOW_INCOME_FIELD] = (
|
||||||
self.df[
|
pm25_threshold & self.df[field_names.FPL_200_SERIES]
|
||||||
field_names.POVERTY_LESS_THAN_200_FPL_FIELD
|
)
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
|
||||||
]
|
self.df[field_names.ENERGY_BURDEN_LOW_INCOME_FIELD] = (
|
||||||
>= self.LOW_INCOME_THRESHOLD
|
energy_burden_threshold & self.df[field_names.FPL_200_SERIES]
|
||||||
) & energy_criteria
|
)
|
||||||
|
|
||||||
|
self._increment_total_eligibility_exceeded(energy_eligibility_columns)
|
||||||
|
|
||||||
|
return self.df[energy_eligibility_columns].any(axis="columns")
|
||||||
|
|
||||||
def _transportation_factor(self) -> bool:
|
def _transportation_factor(self) -> bool:
|
||||||
# In Xth percentile or above for diesel particulate matter (Source: EPA National Air Toxics Assessment (NATA)
|
# In Xth percentile or above for diesel particulate matter (Source: EPA National Air Toxics Assessment (NATA)
|
||||||
|
@ -212,25 +271,39 @@ class ScoreL(Score):
|
||||||
# Low income: In 60th percentile or above for percent of block group population
|
# Low income: In 60th percentile or above for percent of block group population
|
||||||
# of households where household income is less than or equal to twice the federal
|
# of households where household income is less than or equal to twice the federal
|
||||||
# poverty level. Source: Census's American Community Survey]
|
# poverty level. Source: Census's American Community Survey]
|
||||||
transportation_criteria = (
|
|
||||||
|
transportion_eligibility_columns = [
|
||||||
|
field_names.DIESEL_PARTICULATE_MATTER_LOW_INCOME_FIELD,
|
||||||
|
field_names.TRAFFIC_PROXIMITY_LOW_INCOME_FIELD,
|
||||||
|
]
|
||||||
|
|
||||||
|
diesel_threshold = (
|
||||||
self.df[
|
self.df[
|
||||||
field_names.DIESEL_FIELD + field_names.PERCENTILE_FIELD_SUFFIX
|
field_names.DIESEL_FIELD + field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
]
|
]
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
) | (
|
)
|
||||||
|
|
||||||
|
traffic_threshold = (
|
||||||
self.df[
|
self.df[
|
||||||
field_names.TRAFFIC_FIELD + field_names.PERCENTILE_FIELD_SUFFIX
|
field_names.TRAFFIC_FIELD + field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
]
|
]
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
)
|
)
|
||||||
|
|
||||||
return (
|
self.df[field_names.DIESEL_PARTICULATE_MATTER_LOW_INCOME_FIELD] = (
|
||||||
self.df[
|
diesel_threshold & self.df[field_names.FPL_200_SERIES]
|
||||||
field_names.POVERTY_LESS_THAN_200_FPL_FIELD
|
)
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
|
||||||
]
|
self.df[field_names.TRAFFIC_PROXIMITY_LOW_INCOME_FIELD] = (
|
||||||
>= self.LOW_INCOME_THRESHOLD
|
traffic_threshold & self.df[field_names.FPL_200_SERIES]
|
||||||
) & transportation_criteria
|
)
|
||||||
|
|
||||||
|
self._increment_total_eligibility_exceeded(
|
||||||
|
transportion_eligibility_columns
|
||||||
|
)
|
||||||
|
|
||||||
|
return self.df[transportion_eligibility_columns].any(axis="columns")
|
||||||
|
|
||||||
def _housing_factor(self) -> bool:
|
def _housing_factor(self) -> bool:
|
||||||
# (
|
# (
|
||||||
|
@ -245,35 +318,47 @@ class ScoreL(Score):
|
||||||
# Low income: In 60th percentile or above for percent of block group population
|
# Low income: In 60th percentile or above for percent of block group population
|
||||||
# of households where household income is less than or equal to twice the federal
|
# of households where household income is less than or equal to twice the federal
|
||||||
# poverty level. Source: Census's American Community Survey]
|
# poverty level. Source: Census's American Community Survey]
|
||||||
housing_criteria = (
|
|
||||||
(
|
housing_eligibility_columns = [
|
||||||
self.df[
|
field_names.LEAD_PAINT_MEDIAN_HOME_VALUE_LOW_INCOME_FIELD,
|
||||||
field_names.LEAD_PAINT_FIELD
|
field_names.HOUSING_BURDEN_LOW_INCOME_FIELD,
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
]
|
||||||
]
|
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
lead_paint_median_house_hold_threshold = (
|
||||||
)
|
self.df[
|
||||||
& (
|
field_names.LEAD_PAINT_FIELD
|
||||||
self.df[
|
+ field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
field_names.MEDIAN_HOUSE_VALUE_FIELD
|
]
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
]
|
) & (
|
||||||
<= self.MEDIAN_HOUSE_VALUE_THRESHOLD
|
self.df[
|
||||||
)
|
field_names.MEDIAN_HOUSE_VALUE_FIELD
|
||||||
) | (
|
+ field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
|
]
|
||||||
|
<= self.MEDIAN_HOUSE_VALUE_THRESHOLD
|
||||||
|
)
|
||||||
|
|
||||||
|
housing_burden_threshold = (
|
||||||
self.df[
|
self.df[
|
||||||
field_names.HOUSING_BURDEN_FIELD
|
field_names.HOUSING_BURDEN_FIELD
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
+ field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
]
|
]
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
)
|
)
|
||||||
return (
|
|
||||||
self.df[
|
# series by series indicators
|
||||||
field_names.POVERTY_LESS_THAN_200_FPL_FIELD
|
self.df[field_names.LEAD_PAINT_MEDIAN_HOME_VALUE_LOW_INCOME_FIELD] = (
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
lead_paint_median_house_hold_threshold
|
||||||
]
|
& self.df[field_names.FPL_200_SERIES]
|
||||||
>= self.LOW_INCOME_THRESHOLD
|
)
|
||||||
) & housing_criteria
|
|
||||||
|
self.df[field_names.HOUSING_BURDEN_LOW_INCOME_FIELD] = (
|
||||||
|
housing_burden_threshold & self.df[field_names.FPL_200_SERIES]
|
||||||
|
)
|
||||||
|
|
||||||
|
self._increment_total_eligibility_exceeded(housing_eligibility_columns)
|
||||||
|
|
||||||
|
return self.df[housing_eligibility_columns].any(axis="columns")
|
||||||
|
|
||||||
def _pollution_factor(self) -> bool:
|
def _pollution_factor(self) -> bool:
|
||||||
# Proximity to Risk Management Plan sites is > X
|
# Proximity to Risk Management Plan sites is > X
|
||||||
|
@ -282,48 +367,54 @@ class ScoreL(Score):
|
||||||
# of households where household income is less than or equal to twice the federal
|
# of households where household income is less than or equal to twice the federal
|
||||||
# poverty level. Source: Census's American Community Survey]
|
# poverty level. Source: Census's American Community Survey]
|
||||||
|
|
||||||
pollution_criteria = (
|
pollution_eligibility_columns = [
|
||||||
(
|
field_names.RMP_LOW_INCOME_FIELD,
|
||||||
self.df[
|
field_names.SUPERFUND_LOW_INCOME_FIELD,
|
||||||
field_names.RMP_FIELD + field_names.PERCENTILE_FIELD_SUFFIX
|
field_names.HAZARDOUS_WASTE_LOW_INCOME_FIELD,
|
||||||
]
|
]
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
|
||||||
)
|
rmp_sites_threshold = (
|
||||||
| (
|
self.df[field_names.RMP_FIELD + field_names.PERCENTILE_FIELD_SUFFIX]
|
||||||
self.df[
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
field_names.NPL_FIELD + field_names.PERCENTILE_FIELD_SUFFIX
|
|
||||||
]
|
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
|
||||||
)
|
|
||||||
| (
|
|
||||||
self.df[
|
|
||||||
field_names.TSDF_FIELD + field_names.PERCENTILE_FIELD_SUFFIX
|
|
||||||
]
|
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
return pollution_criteria & (
|
npl_sites_threshold = (
|
||||||
self.df[
|
self.df[field_names.NPL_FIELD + field_names.PERCENTILE_FIELD_SUFFIX]
|
||||||
field_names.POVERTY_LESS_THAN_200_FPL_FIELD
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
|
||||||
]
|
|
||||||
>= self.LOW_INCOME_THRESHOLD
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
tsdf_sites_threshold = (
|
||||||
|
self.df[
|
||||||
|
field_names.TSDF_FIELD + field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
|
]
|
||||||
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
|
)
|
||||||
|
|
||||||
|
# individual series-by-series
|
||||||
|
self.df[field_names.RMP_LOW_INCOME_FIELD] = (
|
||||||
|
rmp_sites_threshold & self.df[field_names.FPL_200_SERIES]
|
||||||
|
)
|
||||||
|
self.df[field_names.SUPERFUND_LOW_INCOME_FIELD] = (
|
||||||
|
npl_sites_threshold & self.df[field_names.FPL_200_SERIES]
|
||||||
|
)
|
||||||
|
self.df[field_names.HAZARDOUS_WASTE_LOW_INCOME_FIELD] = (
|
||||||
|
tsdf_sites_threshold & self.df[field_names.FPL_200_SERIES]
|
||||||
|
)
|
||||||
|
|
||||||
|
self._increment_total_eligibility_exceeded(
|
||||||
|
pollution_eligibility_columns
|
||||||
|
)
|
||||||
|
|
||||||
|
return self.df[pollution_eligibility_columns].any(axis="columns")
|
||||||
|
|
||||||
def _water_factor(self) -> bool:
|
def _water_factor(self) -> bool:
|
||||||
# In Xth percentile or above for wastewater discharge (Source: EPA Risk-Screening Environmental Indicators (RSEI) Model)
|
# In Xth percentile or above for wastewater discharge (Source: EPA Risk-Screening Environmental Indicators (RSEI) Model)
|
||||||
# AND
|
# AND
|
||||||
# Low income: In 60th percentile or above for percent of block group population
|
# Low income: In 60th percentile or above for percent of block group population
|
||||||
# of households where household income is less than or equal to twice the federal
|
# of households where household income is less than or equal to twice the federal
|
||||||
# poverty level. Source: Census's American Community Survey]
|
# poverty level. Source: Census's American Community Survey]
|
||||||
return (
|
|
||||||
self.df[
|
wastewater_threshold = (
|
||||||
field_names.POVERTY_LESS_THAN_200_FPL_FIELD
|
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
|
||||||
]
|
|
||||||
>= self.LOW_INCOME_THRESHOLD
|
|
||||||
) & (
|
|
||||||
self.df[
|
self.df[
|
||||||
field_names.WASTEWATER_FIELD
|
field_names.WASTEWATER_FIELD
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
+ field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
|
@ -331,6 +422,16 @@ class ScoreL(Score):
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.df[field_names.WASTEWATER_DISCHARGE_LOW_INCOME_FIELD] = (
|
||||||
|
wastewater_threshold & self.df[field_names.FPL_200_SERIES]
|
||||||
|
)
|
||||||
|
|
||||||
|
self._increment_total_eligibility_exceeded(
|
||||||
|
[field_names.WASTEWATER_DISCHARGE_LOW_INCOME_FIELD]
|
||||||
|
)
|
||||||
|
|
||||||
|
return self.df[field_names.WASTEWATER_DISCHARGE_LOW_INCOME_FIELD]
|
||||||
|
|
||||||
def _health_factor(self) -> bool:
|
def _health_factor(self) -> bool:
|
||||||
# In Xth percentile or above for diabetes (Source: CDC Places)
|
# In Xth percentile or above for diabetes (Source: CDC Places)
|
||||||
# or
|
# or
|
||||||
|
@ -344,45 +445,61 @@ class ScoreL(Score):
|
||||||
# of households where household income is less than or equal to twice the federal
|
# of households where household income is less than or equal to twice the federal
|
||||||
# poverty level. Source: Census's American Community Survey]
|
# poverty level. Source: Census's American Community Survey]
|
||||||
|
|
||||||
health_criteria = (
|
health_eligibility_columns = [
|
||||||
(
|
field_names.DIABETES_LOW_INCOME_FIELD,
|
||||||
self.df[
|
field_names.ASTHMA_LOW_INCOME_FIELD,
|
||||||
field_names.DIABETES_FIELD
|
field_names.HEART_DISEASE_LOW_INCOME_FIELD,
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
field_names.LIFE_EXPECTANCY_LOW_INCOME_FIELD,
|
||||||
]
|
]
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
|
||||||
)
|
diabetes_threshold = (
|
||||||
| (
|
|
||||||
self.df[
|
|
||||||
field_names.ASTHMA_FIELD
|
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
|
||||||
]
|
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
|
||||||
)
|
|
||||||
| (
|
|
||||||
self.df[
|
|
||||||
field_names.HEART_DISEASE_FIELD
|
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
|
||||||
]
|
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
|
||||||
)
|
|
||||||
| (
|
|
||||||
self.df[
|
|
||||||
field_names.LIFE_EXPECTANCY_FIELD
|
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
|
||||||
]
|
|
||||||
# Note: a high life expectancy is good, so take 1 minus the threshold to invert it,
|
|
||||||
# and then look for life expenctancies lower than that (not greater than).
|
|
||||||
<= 1 - self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
|
||||||
)
|
|
||||||
)
|
|
||||||
return (
|
|
||||||
self.df[
|
self.df[
|
||||||
field_names.POVERTY_LESS_THAN_200_FPL_FIELD
|
field_names.DIABETES_FIELD + field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
|
]
|
||||||
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
|
)
|
||||||
|
|
||||||
|
asthma_threshold = (
|
||||||
|
self.df[
|
||||||
|
field_names.ASTHMA_FIELD + field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
|
]
|
||||||
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
|
)
|
||||||
|
|
||||||
|
heart_disease_threshold = (
|
||||||
|
self.df[
|
||||||
|
field_names.HEART_DISEASE_FIELD
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
+ field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
]
|
]
|
||||||
>= self.LOW_INCOME_THRESHOLD
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
) & health_criteria
|
)
|
||||||
|
|
||||||
|
life_expectancy_threshold = (
|
||||||
|
self.df[
|
||||||
|
field_names.LIFE_EXPECTANCY_FIELD
|
||||||
|
+ field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
|
]
|
||||||
|
# Note: a high life expectancy is good, so take 1 minus the threshold to invert it,
|
||||||
|
# and then look for life expenctancies lower than that (not greater than).
|
||||||
|
<= 1 - self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
|
)
|
||||||
|
|
||||||
|
self.df[field_names.DIABETES_LOW_INCOME_FIELD] = (
|
||||||
|
diabetes_threshold & self.df[field_names.FPL_200_SERIES]
|
||||||
|
)
|
||||||
|
self.df[field_names.ASTHMA_LOW_INCOME_FIELD] = (
|
||||||
|
asthma_threshold & self.df[field_names.FPL_200_SERIES]
|
||||||
|
)
|
||||||
|
self.df[field_names.HEART_DISEASE_LOW_INCOME_FIELD] = (
|
||||||
|
heart_disease_threshold & self.df[field_names.FPL_200_SERIES]
|
||||||
|
)
|
||||||
|
self.df[field_names.LIFE_EXPECTANCY_LOW_INCOME_FIELD] = (
|
||||||
|
life_expectancy_threshold & self.df[field_names.FPL_200_SERIES]
|
||||||
|
)
|
||||||
|
|
||||||
|
self._increment_total_eligibility_exceeded(health_eligibility_columns)
|
||||||
|
|
||||||
|
return self.df[health_eligibility_columns].any(axis="columns")
|
||||||
|
|
||||||
def _workforce_factor(self) -> bool:
|
def _workforce_factor(self) -> bool:
|
||||||
# Where unemployment is above X%
|
# Where unemployment is above X%
|
||||||
|
@ -395,42 +512,80 @@ class ScoreL(Score):
|
||||||
# AND
|
# AND
|
||||||
# Where the high school degree achievement rates for adults 25 years and older is less than 95%
|
# Where the high school degree achievement rates for adults 25 years and older is less than 95%
|
||||||
# (necessary to screen out university block groups)
|
# (necessary to screen out university block groups)
|
||||||
workforce_criteria_for_states = (
|
|
||||||
(
|
high_scool_achievement_rate_threshold = (
|
||||||
self.df[
|
|
||||||
field_names.UNEMPLOYMENT_FIELD
|
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
|
||||||
]
|
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
|
||||||
)
|
|
||||||
| (
|
|
||||||
self.df[
|
|
||||||
field_names.MEDIAN_INCOME_PERCENT_AMI_FIELD
|
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
|
||||||
]
|
|
||||||
# Note: a high median income as a % of AMI is good, so take 1 minus the threshold to invert it.
|
|
||||||
# and then look for median income lower than that (not greater than).
|
|
||||||
<= 1 - self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
|
||||||
)
|
|
||||||
| (
|
|
||||||
self.df[
|
|
||||||
field_names.POVERTY_LESS_THAN_100_FPL_FIELD
|
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
|
||||||
]
|
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
|
||||||
)
|
|
||||||
| (
|
|
||||||
self.df[
|
|
||||||
field_names.LINGUISTIC_ISO_FIELD
|
|
||||||
+ field_names.PERCENTILE_FIELD_SUFFIX
|
|
||||||
]
|
|
||||||
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
|
||||||
)
|
|
||||||
)
|
|
||||||
workforce_combined_criteria_for_states = (
|
|
||||||
self.df[field_names.HIGH_SCHOOL_ED_FIELD]
|
self.df[field_names.HIGH_SCHOOL_ED_FIELD]
|
||||||
>= self.LACK_OF_HIGH_SCHOOL_MINIMUM_THRESHOLD
|
>= self.LACK_OF_HIGH_SCHOOL_MINIMUM_THRESHOLD
|
||||||
) & workforce_criteria_for_states
|
)
|
||||||
|
|
||||||
|
unemployment_threshold = (
|
||||||
|
self.df[
|
||||||
|
field_names.UNEMPLOYMENT_FIELD
|
||||||
|
+ field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
|
]
|
||||||
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
|
)
|
||||||
|
|
||||||
|
median_income_threshold = (
|
||||||
|
self.df[
|
||||||
|
field_names.MEDIAN_INCOME_PERCENT_AMI_FIELD
|
||||||
|
+ field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
|
]
|
||||||
|
# Note: a high median income as a % of AMI is good, so take 1 minus the threshold to invert it.
|
||||||
|
# and then look for median income lower than that (not greater than).
|
||||||
|
<= 1 - self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
|
)
|
||||||
|
|
||||||
|
linguistic_isolation_threshold = (
|
||||||
|
self.df[
|
||||||
|
field_names.LINGUISTIC_ISO_FIELD
|
||||||
|
+ field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
|
]
|
||||||
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
|
)
|
||||||
|
|
||||||
|
poverty_threshold = (
|
||||||
|
self.df[
|
||||||
|
field_names.POVERTY_LESS_THAN_100_FPL_FIELD
|
||||||
|
+ field_names.PERCENTILE_FIELD_SUFFIX
|
||||||
|
]
|
||||||
|
>= self.ENVIRONMENTAL_BURDEN_THRESHOLD
|
||||||
|
)
|
||||||
|
|
||||||
|
self.df[field_names.LINGUISTIC_ISOLATION_LOW_HS_EDUCATION_FIELD] = (
|
||||||
|
linguistic_isolation_threshold
|
||||||
|
& high_scool_achievement_rate_threshold
|
||||||
|
)
|
||||||
|
|
||||||
|
self.df[field_names.POVERTY_LOW_HS_EDUCATION_FIELD] = (
|
||||||
|
poverty_threshold & high_scool_achievement_rate_threshold
|
||||||
|
)
|
||||||
|
|
||||||
|
self.df[field_names.MEDIAN_INCOME_LOW_HS_EDUCATION_FIELD] = (
|
||||||
|
median_income_threshold & high_scool_achievement_rate_threshold
|
||||||
|
)
|
||||||
|
|
||||||
|
self.df[field_names.UNEMPLOYMENT_LOW_HS_EDUCATION_FIELD] = (
|
||||||
|
unemployment_threshold & high_scool_achievement_rate_threshold
|
||||||
|
)
|
||||||
|
|
||||||
|
# Workforce criteria for states fields that create indicator columns
|
||||||
|
# for each tract in order to indicate whether they met any of the four
|
||||||
|
# criteria. We will used this create individual indicator columns.
|
||||||
|
workforce_eligibility_columns = [
|
||||||
|
field_names.UNEMPLOYMENT_LOW_HS_EDUCATION_FIELD,
|
||||||
|
field_names.POVERTY_LOW_HS_EDUCATION_FIELD,
|
||||||
|
field_names.LINGUISTIC_ISOLATION_LOW_HS_EDUCATION_FIELD,
|
||||||
|
field_names.MEDIAN_INCOME_LOW_HS_EDUCATION_FIELD,
|
||||||
|
]
|
||||||
|
|
||||||
|
workforce_combined_criteria_for_states = self.df[
|
||||||
|
workforce_eligibility_columns
|
||||||
|
].any(axis="columns")
|
||||||
|
|
||||||
|
self._increment_total_eligibility_exceeded(
|
||||||
|
workforce_eligibility_columns
|
||||||
|
)
|
||||||
|
|
||||||
# Now, calculate workforce criteria for island territories.
|
# Now, calculate workforce criteria for island territories.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue