From 24f8eb93c4d8f5203040393d127426c30677b63f Mon Sep 17 00:00:00 2001 From: Saran Ahluwalia <94847739+saran-ahluwalia@users.noreply.github.com> Date: Thu, 30 Dec 2021 17:17:28 -0500 Subject: [PATCH] Tree Equity Output: Change output from Geojson to CSV format for easier analysis (#1089) Added Tree Equity * draft wip * revised documentation * revised documentation * revised documentation and defer to super * change word in logger * fix flake 8 * address nit Co-authored-by: Saran Ahluwalia --- .../etl/sources/tree_equity_score/etl.py | 50 ++++++++++++++++++- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/data/data-pipeline/data_pipeline/etl/sources/tree_equity_score/etl.py b/data/data-pipeline/data_pipeline/etl/sources/tree_equity_score/etl.py index 4c93d911..ff364f0f 100644 --- a/data/data-pipeline/data_pipeline/etl/sources/tree_equity_score/etl.py +++ b/data/data-pipeline/data_pipeline/etl/sources/tree_equity_score/etl.py @@ -7,6 +7,18 @@ logger = get_module_logger(__name__) class TreeEquityScoreETL(ExtractTransformLoad): + """Tree equity score methodology: https://www.treeequityscore.org/methodology/ + A lower Tree Equity Score indicates a greater priority for closing the tree canopy gap + In order to estimate a general number of trees associated with an increase in tree + canopy, the authors utilize a basic multiplier of 600 sq-ft (55.74 sq-m) of canopy area + per urban tree assuming a medium-size urban tree crown width of 25-30 ft. + Sources: + 1. Tree canopy cover. High resolution tree canopy where available. + In the event tree canopy is not defer to National Land Cover Database. + 2. Census American Community Survey (ACS) 2018 5-year Block Group population estimates. + 3. Census ACS 2018 5-year city and block group Median Income estimates. + """ + def __init__(self): self.TES_URL = "https://national-tes-data-share.s3.amazonaws.com/national_tes_share/" self.TES_CSV = self.TMP_PATH / "tes_2021_data.csv" @@ -83,8 +95,42 @@ class TreeEquityScoreETL(ExtractTransformLoad): pd.concat(tes_state_dfs), crs=tes_state_dfs[0].crs ) + # rename ID to Tract ID + self.df.rename( + # Block group ID delegated to attribute in superclass + columns={"geoid": ExtractTransformLoad.GEOID_FIELD_NAME}, + inplace=True, + ) + def load(self) -> None: - logger.info("Saving Tree Equity Score GeoJSON") + logger.info("Saving Tree Equity Score CSV") # write nationwide csv self.CSV_PATH.mkdir(parents=True, exist_ok=True) - self.df.to_file(self.CSV_PATH / "tes_conus.geojson", driver="GeoJSON") + self.df = self.df[ + [ + ExtractTransformLoad.GEOID_FIELD_NAME, + "total_pop", # Total Population according to ACS Estimates + "state", + "county", + "dep_ratio", # Dependent ratio + "child_perc", # Children (Age 0 -17) (ACS 2014 - 2018) + "seniorperc", # Seniors (Age 65+) (ACS 2014 - 2018) + "treecanopy", # Tree canopy cover + "area", # Source: https://www.fs.fed.us/nrs/pubs/gtr/gtr_nrs200.pdf + "source", + "avg_temp", # Average Temperature from USGS Earth Explorer + "ua_name", + "incorpname", # Incorporated place name + "congressio", # Congressional District + "biome", + "bgpopdense", + "popadjust", # Adjusted population estimate + "tc_gap", # Tree canopy gap + "tc_goal", # Tree canopy goal + "priority", # Priority community according to the index + "tes", # Tree equity score + "tesctyscor", # Tree equity score for the county + "geometry", # Block group geometry coordinates + ] + ] + self.df.to_csv(self.CSV_PATH / "usa.csv", index=False)