From 781e08f5593fa81eb0df2edd051eea915b26dc84 Mon Sep 17 00:00:00 2001 From: Jorge Escobar <83969469+esfoobar-usds@users.noreply.github.com> Date: Mon, 8 Aug 2022 17:42:14 -0400 Subject: [PATCH 01/23] added tribalId for Supplemental dataset (#1804) --- data/data-pipeline/data_pipeline/etl/sources/tribal/etl.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/data-pipeline/data_pipeline/etl/sources/tribal/etl.py b/data/data-pipeline/data_pipeline/etl/sources/tribal/etl.py index 7b1843163..852a956d0 100644 --- a/data/data-pipeline/data_pipeline/etl/sources/tribal/etl.py +++ b/data/data-pipeline/data_pipeline/etl/sources/tribal/etl.py @@ -81,13 +81,13 @@ def _transform_bia_aian_supplemental( bia_aian_supplemental_df = gpd.read_file(tribal_geojson_path) bia_aian_supplemental_df.drop( - ["OBJECTID", "GISAcres", "Source", "Shape_Length", "Shape_Area"], + ["GISAcres", "Source", "Shape_Length", "Shape_Area"], axis=1, inplace=True, ) bia_aian_supplemental_df.rename( - columns={"Land_Area_": "landAreaName"}, + columns={"OBJECTID": "tribalId", "Land_Area_": "landAreaName"}, inplace=True, ) From 1833e3e794370a67c217c8194b0ceca639defdd3 Mon Sep 17 00:00:00 2001 From: Jorge Escobar <83969469+esfoobar-usds@users.noreply.github.com> Date: Tue, 9 Aug 2022 13:56:03 -0400 Subject: [PATCH 02/23] Setting zoom levels for tribal map (#1810) --- data/data-pipeline/data_pipeline/tile/generate.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/data/data-pipeline/data_pipeline/tile/generate.py b/data/data-pipeline/data_pipeline/tile/generate.py index df37c175a..d5676b793 100644 --- a/data/data-pipeline/data_pipeline/tile/generate.py +++ b/data/data-pipeline/data_pipeline/tile/generate.py @@ -73,6 +73,10 @@ def _generate_score_tiles() -> None: def _generate_tribal_tiles() -> None: """Generates tribal layer tiles""" + + USA_TRIBAL_MIN_ZOOM = 0 + USA_TRIBAL_MAX_ZOOM = 11 + tribal_tiles_path = data_path / "tribal" / "tiles" tribal_geojson_dir = data_path / "tribal" / "geojson" @@ -83,6 +87,7 @@ def _generate_tribal_tiles() -> None: logger.info("Generating Tribal mbtiles file") cmd = "tippecanoe " cmd += "--layer=blocks " + cmd += f"--minimum-zoom={USA_TRIBAL_MIN_ZOOM} --maximum-zoom={USA_TRIBAL_MAX_ZOOM} " cmd += f"--output={tribal_tiles_path}/usa.mbtiles " cmd += str(tribal_geojson_dir / "usa.json") call(cmd, shell=True) @@ -92,6 +97,7 @@ def _generate_tribal_tiles() -> None: cmd = "tippecanoe " cmd += "--no-tile-compression " cmd += "--drop-densest-as-needed " + cmd += f"--minimum-zoom={USA_TRIBAL_MIN_ZOOM} --maximum-zoom={USA_TRIBAL_MAX_ZOOM} " cmd += f"--output-to-directory={tribal_tiles_path} --layer=blocks " cmd += str(tribal_geojson_dir / "usa.json") call(cmd, shell=True) From 1c448a77f997db5a98cb04db7d0a7960a2651341 Mon Sep 17 00:00:00 2001 From: Jorge Escobar <83969469+esfoobar-usds@users.noreply.github.com> Date: Tue, 9 Aug 2022 16:37:10 -0400 Subject: [PATCH 03/23] NRI dataset and initial score YAML configuration (#1534) * update be staging gha * NRI dataset and initial score YAML configuration * checkpoint * adding data checks for release branch * passing tests * adding INPUT_EXTRACTED_FILE_NAME to base class * lint * columns to keep and tests * update be staging gha * checkpoint * update be staging gha * NRI dataset and initial score YAML configuration * checkpoint * adding data checks for release branch * passing tests * adding INPUT_EXTRACTED_FILE_NAME to base class * lint * columns to keep and tests * checkpoint * PR Review * renoving source url * tests * stop execution of ETL if there's a YAML schema issue * update be staging gha * adding source url as class var again * clean up * force cache bust * gha cache bust * dynamically set score vars from YAML * docsctrings * removing last updated year - optional reverse percentile * passing tests * sort order * column ordening * PR review * class level vars * Updating DatasetsConfig * fix pylint errors * moving metadata hint back to code Co-authored-by: lucasmbrown-usds --- .github/workflows/data-checks.yml | 6 +- .github/workflows/deploy_be_staging.yml | 6 +- data/data-pipeline/data_pipeline/etl/base.py | 75 +- .../etl/score/config/__init__.py | 0 .../etl/score/config/datasets.yml | 79 + .../data_pipeline/etl/score/etl_score.py | 1 + .../etl/score/schemas/__init__.py | 0 .../etl/score/schemas/datasets.py | 83 + .../etl/sources/national_risk_index/etl.py | 55 +- .../tests/sources/example/test_etl.py | 13 +- .../sources/national_risk_index/test_etl.py | 7 +- data/data-pipeline/data_pipeline/utils.py | 9 +- mlc_config.json | 1 + package-lock.json | 3415 ----------------- package.json | 7 - 15 files changed, 272 insertions(+), 3485 deletions(-) create mode 100644 data/data-pipeline/data_pipeline/etl/score/config/__init__.py create mode 100644 data/data-pipeline/data_pipeline/etl/score/config/datasets.yml create mode 100644 data/data-pipeline/data_pipeline/etl/score/schemas/__init__.py create mode 100644 data/data-pipeline/data_pipeline/etl/score/schemas/datasets.py delete mode 100644 package-lock.json delete mode 100644 package.json diff --git a/.github/workflows/data-checks.yml b/.github/workflows/data-checks.yml index 55a5ad302..41438384b 100644 --- a/.github/workflows/data-checks.yml +++ b/.github/workflows/data-checks.yml @@ -2,7 +2,9 @@ name: Data Checks on: pull_request: - branches: [main] # runs on any PR against main + branches: + - main + - "**/release/**" paths: - "data/**" jobs: @@ -16,7 +18,7 @@ jobs: # checks all of the versions allowed in pyproject.toml python-version: [3.8, 3.9] steps: - # installs python + # installs Python # one execution of the tests per version listed above - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} diff --git a/.github/workflows/deploy_be_staging.yml b/.github/workflows/deploy_be_staging.yml index 63cc138fd..08a9eefa5 100644 --- a/.github/workflows/deploy_be_staging.yml +++ b/.github/workflows/deploy_be_staging.yml @@ -1,7 +1,9 @@ name: Deploy Backend Staging on: pull_request: - branches: [main] + branches: + - main + - "**/release/**" paths: - "data/**" env: @@ -60,7 +62,7 @@ jobs: - name: Update PR with deployed Score URLs uses: mshick/add-pr-comment@v1 with: - # Deploy to S3 for the staging URL + # Deploy to S3 for the Staging URL message: | ** Score Deployed! ** Find it here: diff --git a/data/data-pipeline/data_pipeline/etl/base.py b/data/data-pipeline/data_pipeline/etl/base.py index 6a89861a4..873aa74c5 100644 --- a/data/data-pipeline/data_pipeline/etl/base.py +++ b/data/data-pipeline/data_pipeline/etl/base.py @@ -1,12 +1,15 @@ import enum import pathlib +import sys import typing from typing import Optional import pandas as pd from data_pipeline.config import settings +from data_pipeline.etl.score.schemas.datasets import DatasetsConfig from data_pipeline.utils import ( + load_yaml_dict_from_file, unzip_file_from_url, remove_all_from_dir, get_module_logger, @@ -30,6 +33,9 @@ class ExtractTransformLoad: Attributes: DATA_PATH (pathlib.Path): Local path where all data will be stored TMP_PATH (pathlib.Path): Local path where temporary data will be stored + + TODO: Fill missing attrs here + GEOID_FIELD_NAME (str): The common column name for a Census Block Group identifier GEOID_TRACT_FIELD_NAME (str): The common column name for a Census Tract identifier """ @@ -40,6 +46,7 @@ class ExtractTransformLoad: DATA_PATH: pathlib.Path = APP_ROOT / "data" TMP_PATH: pathlib.Path = DATA_PATH / "tmp" CONTENT_CONFIG: pathlib.Path = APP_ROOT / "content" / "config" + DATASET_CONFIG: pathlib.Path = APP_ROOT / "etl" / "score" / "config" # Parameters GEOID_FIELD_NAME: str = "GEOID10" @@ -55,6 +62,9 @@ class ExtractTransformLoad: # SOURCE_URL is used to extract source data in extract(). SOURCE_URL: str = None + # INPUT_EXTRACTED_FILE_NAME is the name of the file after extract(). + INPUT_EXTRACTED_FILE_NAME: str = None + # GEO_LEVEL is used to identify whether output data is at the unit of the tract or # census block group. # TODO: add tests that enforce seeing the expected geographic identifier field @@ -64,6 +74,13 @@ class ExtractTransformLoad: # COLUMNS_TO_KEEP is used to identify which columns to keep in the output df. COLUMNS_TO_KEEP: typing.List[str] = None + # INPUT_GEOID_TRACT_FIELD_NAME is the field name that identifies the Census Tract ID + # on the input file + INPUT_GEOID_TRACT_FIELD_NAME: str = None + + # NULL_REPRESENTATION is how nulls are represented on the input field + NULL_REPRESENTATION: str = None + # Thirteen digits in a census block group ID. EXPECTED_CENSUS_BLOCK_GROUPS_CHARACTER_LENGTH: int = 13 # TODO: investigate. Census says there are only 217,740 CBGs in the US. This might @@ -77,8 +94,53 @@ class ExtractTransformLoad: # periods. https://github.com/usds/justice40-tool/issues/964 EXPECTED_MAX_CENSUS_TRACTS: int = 74160 + # We use output_df as the final dataframe to use to write to the CSV + # It is used on the "load" base class method output_df: pd.DataFrame = None + @classmethod + def yaml_config_load(cls) -> dict: + """Generate config dictionary and set instance variables from YAML dataset.""" + + # check if the class instance has score YAML definitions + datasets_config = load_yaml_dict_from_file( + cls.DATASET_CONFIG / "datasets.yml", + DatasetsConfig, + ) + + # get the config for this dataset + try: + dataset_config = next( + item + for item in datasets_config.get("datasets") + if item["module_name"] == cls.NAME + ) + except StopIteration: + # Note: it'd be nice to log the name of the dataframe, but that's not accessible in this scope. + logger.error( + f"Exception encountered while extracting dataset config for dataset {cls.NAME}" + ) + sys.exit() + + # set some of the basic fields + cls.INPUT_GEOID_TRACT_FIELD_NAME = dataset_config[ + "input_geoid_tract_field_name" + ] + + # get the columns to write on the CSV + # and set the constants + cls.COLUMNS_TO_KEEP = [ + cls.GEOID_TRACT_FIELD_NAME, # always index with geoid tract id + ] + for field in dataset_config["load_fields"]: + cls.COLUMNS_TO_KEEP.append(field["long_name"]) + + # set the constants for the class + setattr(cls, field["df_field_name"], field["long_name"]) + + # return the config dict + return dataset_config + # This is a classmethod so it can be used by `get_data_frame` without # needing to create an instance of the class. This is a use case in `etl_score`. @classmethod @@ -87,16 +149,10 @@ def _get_output_file_path(cls) -> pathlib.Path: if cls.NAME is None: raise NotImplementedError( f"Child ETL class needs to specify `cls.NAME` (currently " - f"{cls.NAME}) and `cls.LAST_UPDATED_YEAR` (currently " - f"{cls.LAST_UPDATED_YEAR})." + f"{cls.NAME})." ) - output_file_path = ( - cls.DATA_PATH - / "dataset" - / f"{cls.NAME}_{cls.LAST_UPDATED_YEAR}" - / "usa.csv" - ) + output_file_path = cls.DATA_PATH / "dataset" / f"{cls.NAME}" / "usa.csv" return output_file_path def get_tmp_path(self) -> pathlib.Path: @@ -229,8 +285,7 @@ def load(self, float_format=None) -> None: Data is written in the specified local data folder or remote AWS S3 bucket. - Uses the directory from `self.OUTPUT_DIR` and the file name from - `self._get_output_file_path`. + Uses the directory and the file name from `self._get_output_file_path`. """ logger.info(f"Saving `{self.NAME}` CSV") diff --git a/data/data-pipeline/data_pipeline/etl/score/config/__init__.py b/data/data-pipeline/data_pipeline/etl/score/config/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml b/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml new file mode 100644 index 000000000..8bcf72eaf --- /dev/null +++ b/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml @@ -0,0 +1,79 @@ +--- +datasets: + - long_name: "FEMA National Risk Index" + short_name: "nri" + module_name: national_risk_index + input_geoid_tract_field_name: "TRACTFIPS" + load_fields: + - short_name: "ex_loss" + df_field_name: "RISK_INDEX_EXPECTED_ANNUAL_LOSS_SCORE_FIELD_NAME" + long_name: "FEMA Risk Index Expected Annual Loss Score" + field_type: float + number_of_decimals_in_output: 6 + + - short_name: "ex_pop_loss" + df_field_name: "EXPECTED_POPULATION_LOSS_RATE_FIELD_NAME" + long_name: "Expected population loss rate (Natural Hazards Risk Index)" + description_short: + "Rate of fatalities and injuries resulting from natural hazards each year" + description_long: + "Rate relative to the population of fatalities and injuries due to fourteen + types of natural hazards each year that have some link to climate change: + avalanche, coastal flooding, cold wave, drought, hail, heat wave, hurricane, + ice storm, landslide, riverine flooding, strong wind, tornado, wildfire, and + winter weather. Population loss is defined as the Spatial Hazard Events and + Losses and National Centers for Environmental Information’s (NCEI) reported + number of fatalities and injuries caused by the hazard occurrence. To combine + fatalities and injuries for the computation of population loss value, an + injury is counted as one-tenth (1/10) of a fatality. The NCEI Storm Events + Database classifies injuries and fatalities as direct or indirect. Both direct + and indirect injuries and fatalities are counted as population loss. This + total number of injuries and fatalities is then divided by the population in + the census tract to get a per-capita rate of population risk." + field_type: float + number_of_decimals_in_output: 6 + include_in_tiles: true + include_in_downloadable_files: true + create_percentile: true + + - short_name: "ex_ag_loss" + df_field_name: "EXPECTED_AGRICULTURE_LOSS_RATE_FIELD_NAME" + long_name: "Expected agricultural loss rate (Natural Hazards Risk Index)" + description_short: + "Economic loss rate to agricultural value resulting from natural hazards each + year" + description_long: + "Percent of agricultural value at risk from losses due to fourteen types of + natural hazards that have some link to climate change: avalanche, coastal + flooding, cold wave, drought, hail, heat wave, hurricane, ice storm, + landslide, riverine flooding, strong wind, tornado, wildfire, and winter + weather. Rate calculated by dividing the agricultural value at risk in a + census tract by the total agricultural value in that census tract." + field_type: float + number_of_decimals_in_output: 6 + include_in_tiles: true + include_in_downloadable_files: true + create_percentile: true + + - short_name: "ex_bldg_loss" + df_field_name: "EXPECTED_BUILDING_LOSS_RATE_FIELD_NAME" + long_name: "Expected building loss rate (Natural Hazards Risk Index)" + description_short: + "Economic loss rate to building value resulting from natural hazards each year" + description_long: + "Percent of building value at risk from losses due to fourteen types of + natural hazards that have some link to climate change: avalanche, coastal + flooding, cold wave, drought, hail, heat wave, hurricane, ice storm, + landslide, riverine flooding, strong wind, tornado, wildfire, and winter + weather. Rate calculated by dividing the building value at risk in a census + tract by the total building value in that census tract." + field_type: float + number_of_decimals_in_output: 6 + include_in_tiles: true + include_in_downloadable_files: true + create_percentile: true + + - short_name: "has_ag_val" + df_field_name: "CONTAINS_AGRIVALUE" + long_name: "Contains agricultural value" + field_type: bool diff --git a/data/data-pipeline/data_pipeline/etl/score/etl_score.py b/data/data-pipeline/data_pipeline/etl/score/etl_score.py index fbef9dc28..6d952d0d5 100644 --- a/data/data-pipeline/data_pipeline/etl/score/etl_score.py +++ b/data/data-pipeline/data_pipeline/etl/score/etl_score.py @@ -480,6 +480,7 @@ def _prepare_initial_df(self) -> pd.DataFrame: # for instance, 3rd grade reading level : Low 3rd grade reading level. # This low field will not exist yet, it is only calculated for the # percentile. + # TODO: This will come from the YAML dataset config ReversePercentile( field_name=field_names.READING_FIELD, low_field_name=field_names.LOW_READING_FIELD, diff --git a/data/data-pipeline/data_pipeline/etl/score/schemas/__init__.py b/data/data-pipeline/data_pipeline/etl/score/schemas/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/data/data-pipeline/data_pipeline/etl/score/schemas/datasets.py b/data/data-pipeline/data_pipeline/etl/score/schemas/datasets.py new file mode 100644 index 000000000..0e80bc5b1 --- /dev/null +++ b/data/data-pipeline/data_pipeline/etl/score/schemas/datasets.py @@ -0,0 +1,83 @@ +from dataclasses import dataclass, field +from enum import Enum +from typing import List, Optional + + +class FieldType(Enum): + STRING = "string" + INT64 = "int64" + BOOL = "bool" + FLOAT = "float" + PERCENTAGE = "percentage" + + +@dataclass +class DatasetsConfig: + @dataclass + class Dataset: + """A class that defines a dataset and its load variables. + + Attributes: + long_name (str): A human readable title for the dataset. + short_name (str): used to compose the short variable names for tiles/arcgis. All short variable names will be prepended + with the short name of the data set it comes from, i.e. `nri__ex_loss`. + module_name (str): A string that matches both the Python module name for the dataset and the `NAME` property on the ETL class. + load_fields (LoadField): A list of type LoadField that will drive the score ETL and side effects (tiles, downloadables). + """ + + @dataclass + class LoadField: + """A class to define the fields to be saved on the dataset's output. + + These fields will be then imported by the score generation ETL. + + Attributes: + short_name (str): Used in conjunction with the dataset's `short_name` for files where short names are needed. + df_field_name (str): Name for the field in the etl class. + long_name (str): Column name for the dataset's output csv. + field_type (FieldType): An enum that dictates what type of field this is. + description_short (Optional str): Description used if the field appears in the side panel. + description_long (Optional str): Description used if the field appears in the Methodology page. + number_of_decimals_in_output (Optional int): Used to represent number of decimals in side effects, like Excel. Defaults to 2 decimals. + include_in_tiles (Optional bool): Include this field on the tile export. Defaults to False. + include_in_downloadable_files (Optional bool): Include this field on the CSV and Excel exports. Defaults to False. + create_percentile (Optional bool): Whether or not the backend processing should create a percentile field (ranked in ascending order) + from the values in this field. Defaults to False. + create_reverse_percentile (Optional bool): Whether or not the backend processing should create a "reverse percentile" field (ranked in + descending order) from the values in this field. Defaults to False. + include_in_comparison_tool_as_index (Optional bool): Whether or not to include this field in the comparison tool + as an index used as comparison (e.g., this field might be a state or national index that identifies priority communities). + The field itself must be a boolean for the comparison tool to work appropriately. Defaults to False. + include_in_comparison_tool_as_statistical_descriptor (Optional bool): Whether or not to include this field in the comparison tool as a + statistical descriptor of census tracts (e.g., this field might income levels, life expectancy, etc). This will be + used to generate reports that produce information such as, tracts identified by Index A but not Index B have higher + income levels but lower life expectancy. Defaults to False. + """ + + short_name: str + df_field_name: str + long_name: str + field_type: FieldType = field( + metadata={"by_value": True} + ) # This will be used on the `etl_score_post` for the + # data manipulation. The `by_value` metadata prop will load the field type's Enum value instead of the index, i.e. "string" + # and not STRING + description_short: Optional[str] = None + description_long: Optional[str] = None + number_of_decimals_in_output: Optional[int] = 2 + include_in_tiles: Optional[bool] = False + include_in_downloadable_files: Optional[bool] = False + create_percentile: Optional[bool] = False + create_reverse_percentile: Optional[bool] = False + include_in_comparison_tool_as_index: Optional[bool] = False + include_in_comparison_tool_as_statistical_descriptor: Optional[ + bool + ] = False + + long_name: str + short_name: str + module_name: str + input_geoid_tract_field_name: str + load_fields: List[LoadField] + + datasets: List[Dataset] diff --git a/data/data-pipeline/data_pipeline/etl/sources/national_risk_index/etl.py b/data/data-pipeline/data_pipeline/etl/sources/national_risk_index/etl.py index cdf00af3a..5b14d79b8 100644 --- a/data/data-pipeline/data_pipeline/etl/sources/national_risk_index/etl.py +++ b/data/data-pipeline/data_pipeline/etl/sources/national_risk_index/etl.py @@ -15,10 +15,16 @@ class NationalRiskIndexETL(ExtractTransformLoad): """ETL class for the FEMA National Risk Index dataset""" NAME = "national_risk_index" - LAST_UPDATED_YEAR = 2020 SOURCE_URL = "https://hazards.fema.gov/nri/Content/StaticDocuments/DataDownload//NRI_Table_CensusTracts/NRI_Table_CensusTracts.zip" GEO_LEVEL = ValidGeoLevel.CENSUS_TRACT + # Output score variables (values set on datasets.yml) for linting purposes + RISK_INDEX_EXPECTED_ANNUAL_LOSS_SCORE_FIELD_NAME: str + EXPECTED_BUILDING_LOSS_RATE_FIELD_NAME: str + EXPECTED_AGRICULTURE_LOSS_RATE_FIELD_NAME: str + EXPECTED_POPULATION_LOSS_RATE_FIELD_NAME: str + CONTAINS_AGRIVALUE: str + ## TEMPORARILY HERE ## To get this value up in time for launch, we've hard coded it. We would like ## to, in the future, have this pull the 10th percentile (or nth percentile) @@ -27,54 +33,34 @@ class NationalRiskIndexETL(ExtractTransformLoad): AGRIVALUE_LOWER_BOUND = 408000 def __init__(self): + # load YAML config + self.DATASET_CONFIG = super().yaml_config_load() + + # define the full path for the input CSV file self.INPUT_CSV = self.get_tmp_path() / "NRI_Table_CensusTracts.csv" + # this is the main dataframe + self.df: pd.DataFrame + + # Start dataset-specific vars here self.RISK_INDEX_EXPECTED_ANNUAL_LOSS_SCORE_INPUT_FIELD_NAME = ( "EAL_SCORE" ) - - self.RISK_INDEX_EXPECTED_ANNUAL_LOSS_SCORE_FIELD_NAME = ( - "FEMA Risk Index Expected Annual Loss Score" - ) - self.EXPECTED_ANNUAL_LOSS_BUILDING_VALUE_INPUT_FIELD_NAME = "EAL_VALB" - self.EXPECTED_ANNUAL_LOSS_AGRICULTURAL_VALUE_INPUT_FIELD_NAME = ( "EAL_VALA" ) self.EXPECTED_ANNUAL_LOSS_POPULATION_VALUE_INPUT_FIELD_NAME = "EAL_VALP" - self.AGRICULTURAL_VALUE_INPUT_FIELD_NAME = "AGRIVALUE" self.POPULATION_INPUT_FIELD_NAME = "POPULATION" self.BUILDING_VALUE_INPUT_FIELD_NAME = "BUILDVALUE" - self.EXPECTED_BUILDING_LOSS_RATE_FIELD_NAME = ( - "Expected building loss rate (Natural Hazards Risk Index)" - ) - self.EXPECTED_AGRICULTURE_LOSS_RATE_FIELD_NAME = ( - "Expected agricultural loss rate (Natural Hazards Risk Index)" - ) - self.EXPECTED_POPULATION_LOSS_RATE_FIELD_NAME = ( - "Expected population loss rate (Natural Hazards Risk Index)" - ) - self.CONTAINS_AGRIVALUE = "Contains agricultural value" - - self.COLUMNS_TO_KEEP = [ - self.GEOID_TRACT_FIELD_NAME, - self.RISK_INDEX_EXPECTED_ANNUAL_LOSS_SCORE_FIELD_NAME, - self.EXPECTED_POPULATION_LOSS_RATE_FIELD_NAME, - self.EXPECTED_AGRICULTURE_LOSS_RATE_FIELD_NAME, - self.EXPECTED_BUILDING_LOSS_RATE_FIELD_NAME, - self.CONTAINS_AGRIVALUE, - ] - - self.df: pd.DataFrame - def extract(self) -> None: """Unzips NRI dataset from the FEMA data source and writes the files to the temporary data folder for use in the transform() method """ logger.info("Downloading 405MB National Risk Index Data") + super().extract( source_url=self.SOURCE_URL, extract_path=self.get_tmp_path(), @@ -90,19 +76,18 @@ def transform(self) -> None: """ logger.info("Transforming National Risk Index Data") - NRI_TRACT_COL = "TRACTFIPS" # Census Tract Column in NRI data - # read in the unzipped csv from NRI data source then rename the # Census Tract column for merging df_nri: pd.DataFrame = pd.read_csv( self.INPUT_CSV, - dtype={NRI_TRACT_COL: "string"}, + dtype={self.INPUT_GEOID_TRACT_FIELD_NAME: "string"}, na_values=["None"], low_memory=False, ) + df_nri.rename( columns={ - NRI_TRACT_COL: self.GEOID_TRACT_FIELD_NAME, + self.INPUT_GEOID_TRACT_FIELD_NAME: self.GEOID_TRACT_FIELD_NAME, self.RISK_INDEX_EXPECTED_ANNUAL_LOSS_SCORE_INPUT_FIELD_NAME: self.RISK_INDEX_EXPECTED_ANNUAL_LOSS_SCORE_FIELD_NAME, }, inplace=True, @@ -170,6 +155,7 @@ def transform(self) -> None: ].clip( lower=self.AGRIVALUE_LOWER_BOUND ) + # This produces a boolean that is True in the case of non-zero agricultural value df_nri[self.CONTAINS_AGRIVALUE] = ( df_nri[self.AGRICULTURAL_VALUE_INPUT_FIELD_NAME] > 0 @@ -185,6 +171,7 @@ def transform(self) -> None: # Note: `round` is smart enough to only apply to float columns. df_nri = df_nri.round(10) + # Assign the final df to the class' output_df for the load method self.output_df = df_nri def load(self) -> None: diff --git a/data/data-pipeline/data_pipeline/tests/sources/example/test_etl.py b/data/data-pipeline/data_pipeline/tests/sources/example/test_etl.py index cac6dcfb0..acc64c9ee 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/example/test_etl.py +++ b/data/data-pipeline/data_pipeline/tests/sources/example/test_etl.py @@ -119,6 +119,7 @@ def test_init_base(self, mock_etl, mock_paths): """ # Setup etl = self._get_instance_of_etl_class() + etl.__init__() data_path, tmp_path = mock_paths assert etl.DATA_PATH == data_path @@ -126,8 +127,6 @@ def test_init_base(self, mock_etl, mock_paths): # Also make sure all parameters that need to be non-null are non-null assert etl.NAME is not None - assert etl.LAST_UPDATED_YEAR is not None - assert etl.SOURCE_URL is not None assert etl.GEO_LEVEL is not None assert etl.COLUMNS_TO_KEEP is not None assert len(etl.COLUMNS_TO_KEEP) > 0 @@ -148,14 +147,10 @@ def test_get_output_file_path_base(self, mock_etl, mock_paths): etl = self._get_instance_of_etl_class() data_path, tmp_path = mock_paths + etl.__init__() actual_file_path = etl._get_output_file_path() - expected_file_path = ( - data_path - / "dataset" - / f"{etl.NAME}_{etl.LAST_UPDATED_YEAR}" - / "usa.csv" - ) + expected_file_path = data_path / "dataset" / etl.NAME / "usa.csv" logger.info(f"Expected: {expected_file_path}") @@ -255,6 +250,7 @@ def test_transform_sets_output_df_base(self, mock_etl, mock_paths): etl = self._setup_etl_instance_and_run_extract( mock_etl=mock_etl, mock_paths=mock_paths ) + etl.__init__() etl.transform() assert etl.output_df is not None @@ -272,6 +268,7 @@ def test_load_base(self, snapshot, mock_etl, mock_paths): """ # setup - input variables etl = self._get_instance_of_etl_class() + etl.__init__() # setup - mock transform step df_transform = pd.read_csv( diff --git a/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/test_etl.py b/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/test_etl.py index 132bc335b..f428565f3 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/test_etl.py +++ b/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/test_etl.py @@ -87,11 +87,6 @@ def test_init(self, mock_etl, mock_paths): assert etl.GEOID_FIELD_NAME == "GEOID10" assert etl.GEOID_TRACT_FIELD_NAME == "GEOID10_TRACT" assert etl.NAME == "national_risk_index" - assert etl.LAST_UPDATED_YEAR == 2020 - assert ( - etl.SOURCE_URL - == "https://hazards.fema.gov/nri/Content/StaticDocuments/DataDownload//NRI_Table_CensusTracts/NRI_Table_CensusTracts.zip" - ) assert etl.GEO_LEVEL == ValidGeoLevel.CENSUS_TRACT assert etl.COLUMNS_TO_KEEP == [ etl.GEOID_TRACT_FIELD_NAME, @@ -109,6 +104,6 @@ def test_get_output_file_path(self, mock_etl, mock_paths): output_file_path = etl._get_output_file_path() expected_output_file_path = ( - data_path / "dataset" / "national_risk_index_2020" / "usa.csv" + data_path / "dataset" / "national_risk_index" / "usa.csv" ) assert output_file_path == expected_output_file_path diff --git a/data/data-pipeline/data_pipeline/utils.py b/data/data-pipeline/data_pipeline/utils.py index 5fcf8f42d..0ec626165 100644 --- a/data/data-pipeline/data_pipeline/utils.py +++ b/data/data-pipeline/data_pipeline/utils.py @@ -8,6 +8,7 @@ import uuid import zipfile from pathlib import Path +from marshmallow import ValidationError import urllib3 import requests import yaml @@ -350,7 +351,13 @@ def load_yaml_dict_from_file( # validate YAML yaml_config_schema = class_schema(schema_class) - yaml_config_schema().load(yaml_dict) + + try: + yaml_config_schema().load(yaml_dict) + except ValidationError as e: + logger.error(f"Invalid YAML config file {yaml_file_path}") + logger.error(e.normalized_messages()) + sys.exit() return yaml_dict diff --git a/mlc_config.json b/mlc_config.json index 09a538ae5..95195c9f3 100644 --- a/mlc_config.json +++ b/mlc_config.json @@ -1,4 +1,5 @@ { + "_comment": "Markdown Link Checker configuration, see https://github.com/gaurav-nelson/github-action-markdown-link-check and https://github.com/tcort/markdown-link-check", "ignorePatterns": [ { "pattern": "^http://localhost" diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 1c7bb548c..000000000 --- a/package-lock.json +++ /dev/null @@ -1,3415 +0,0 @@ -{ - "name": "j40_map", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "dependencies": { - "@turf/turf": "^6.5.0", - "@types/d3-ease": "^3.0.0", - "d3-ease": "^3.0.1" - } - }, - "node_modules/@turf/along": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/along/-/along-6.5.0.tgz", - "integrity": "sha512-LLyWQ0AARqJCmMcIEAXF4GEu8usmd4Kbz3qk1Oy5HoRNpZX47+i5exQtmIWKdqJ1MMhW26fCTXgpsEs5zgJ5gw==", - "dependencies": { - "@turf/bearing": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/angle": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/angle/-/angle-6.5.0.tgz", - "integrity": "sha512-4pXMbWhFofJJAOvTMCns6N4C8CMd5Ih4O2jSAG9b3dDHakj3O4yN1+Zbm+NUei+eVEZ9gFeVp9svE3aMDenIkw==", - "dependencies": { - "@turf/bearing": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/area": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", - "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/bbox": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz", - "integrity": "sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/bbox-clip": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bbox-clip/-/bbox-clip-6.5.0.tgz", - "integrity": "sha512-F6PaIRF8WMp8EmgU/Ke5B1Y6/pia14UAYB5TiBC668w5rVVjy5L8rTm/m2lEkkDMHlzoP9vNY4pxpNthE7rLcQ==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/bbox-polygon": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bbox-polygon/-/bbox-polygon-6.5.0.tgz", - "integrity": "sha512-+/r0NyL1lOG3zKZmmf6L8ommU07HliP4dgYToMoTxqzsWzyLjaj/OzgQ8rBmv703WJX+aS6yCmLuIhYqyufyuw==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/bearing": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bearing/-/bearing-6.5.0.tgz", - "integrity": "sha512-dxINYhIEMzgDOztyMZc20I7ssYVNEpSv04VbMo5YPQsqa80KO3TFvbuCahMsCAW5z8Tncc8dwBlEFrmRjJG33A==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/bezier-spline": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bezier-spline/-/bezier-spline-6.5.0.tgz", - "integrity": "sha512-vokPaurTd4PF96rRgGVm6zYYC5r1u98ZsG+wZEv9y3kJTuJRX/O3xIY2QnTGTdbVmAJN1ouOsD0RoZYaVoXORQ==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-clockwise": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-clockwise/-/boolean-clockwise-6.5.0.tgz", - "integrity": "sha512-45+C7LC5RMbRWrxh3Z0Eihsc8db1VGBO5d9BLTOAwU4jR6SgsunTfRWR16X7JUwIDYlCVEmnjcXJNi/kIU3VIw==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-contains": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-contains/-/boolean-contains-6.5.0.tgz", - "integrity": "sha512-4m8cJpbw+YQcKVGi8y0cHhBUnYT+QRfx6wzM4GI1IdtYH3p4oh/DOBJKrepQyiDzFDaNIjxuWXBh0ai1zVwOQQ==", - "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/boolean-point-on-line": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-crosses": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-crosses/-/boolean-crosses-6.5.0.tgz", - "integrity": "sha512-gvshbTPhAHporTlQwBJqyfW+2yV8q/mOTxG6PzRVl6ARsqNoqYQWkd4MLug7OmAqVyBzLK3201uAeBjxbGw0Ng==", - "dependencies": { - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/polygon-to-line": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-disjoint": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-disjoint/-/boolean-disjoint-6.5.0.tgz", - "integrity": "sha512-rZ2ozlrRLIAGo2bjQ/ZUu4oZ/+ZjGvLkN5CKXSKBcu6xFO6k2bgqeM8a1836tAW+Pqp/ZFsTA5fZHsJZvP2D5g==", - "dependencies": { - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/polygon-to-line": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-equal": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-equal/-/boolean-equal-6.5.0.tgz", - "integrity": "sha512-cY0M3yoLC26mhAnjv1gyYNQjn7wxIXmL2hBmI/qs8g5uKuC2hRWi13ydufE3k4x0aNRjFGlg41fjoYLwaVF+9Q==", - "dependencies": { - "@turf/clean-coords": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "geojson-equality": "0.1.6" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-intersects": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-intersects/-/boolean-intersects-6.5.0.tgz", - "integrity": "sha512-nIxkizjRdjKCYFQMnml6cjPsDOBCThrt+nkqtSEcxkKMhAQj5OO7o2CecioNTaX8EayqwMGVKcsz27oP4mKPTw==", - "dependencies": { - "@turf/boolean-disjoint": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-overlap": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-overlap/-/boolean-overlap-6.5.0.tgz", - "integrity": "sha512-8btMIdnbXVWUa1M7D4shyaSGxLRw6NjMcqKBcsTXcZdnaixl22k7ar7BvIzkaRYN3SFECk9VGXfLncNS3ckQUw==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/line-overlap": "^6.5.0", - "@turf/meta": "^6.5.0", - "geojson-equality": "0.1.6" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-parallel": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-parallel/-/boolean-parallel-6.5.0.tgz", - "integrity": "sha512-aSHJsr1nq9e5TthZGZ9CZYeXklJyRgR5kCLm5X4urz7+MotMOp/LsGOsvKvK9NeUl9+8OUmfMn8EFTT8LkcvIQ==", - "dependencies": { - "@turf/clean-coords": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/line-segment": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-point-in-polygon": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-6.5.0.tgz", - "integrity": "sha512-DtSuVFB26SI+hj0SjrvXowGTUCHlgevPAIsukssW6BG5MlNSBQAo70wpICBNJL6RjukXg8d2eXaAWuD/CqL00A==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-point-on-line": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-point-on-line/-/boolean-point-on-line-6.5.0.tgz", - "integrity": "sha512-A1BbuQ0LceLHvq7F/P7w3QvfpmZqbmViIUPHdNLvZimFNLo4e6IQunmzbe+8aSStH9QRZm3VOflyvNeXvvpZEQ==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/boolean-within": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-within/-/boolean-within-6.5.0.tgz", - "integrity": "sha512-YQB3oU18Inx35C/LU930D36RAVe7LDXk1kWsQ8mLmuqYn9YdPsDQTMTkLJMhoQ8EbN7QTdy333xRQ4MYgToteQ==", - "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/boolean-point-on-line": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/buffer": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/buffer/-/buffer-6.5.0.tgz", - "integrity": "sha512-qeX4N6+PPWbKqp1AVkBVWFerGjMYMUyencwfnkCesoznU6qvfugFHNAngNqIBVnJjZ5n8IFyOf+akcxnrt9sNg==", - "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/center": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/projection": "^6.5.0", - "d3-geo": "1.7.1", - "turf-jsts": "*" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/center": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/center/-/center-6.5.0.tgz", - "integrity": "sha512-T8KtMTfSATWcAX088rEDKjyvQCBkUsLnK/Txb6/8WUXIeOZyHu42G7MkdkHRoHtwieLdduDdmPLFyTdG5/e7ZQ==", - "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/center-mean": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/center-mean/-/center-mean-6.5.0.tgz", - "integrity": "sha512-AAX6f4bVn12pTVrMUiB9KrnV94BgeBKpyg3YpfnEbBpkN/znfVhL8dG8IxMAxAoSZ61Zt9WLY34HfENveuOZ7Q==", - "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/center-median": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/center-median/-/center-median-6.5.0.tgz", - "integrity": "sha512-dT8Ndu5CiZkPrj15PBvslpuf01ky41DEYEPxS01LOxp5HOUHXp1oJxsPxvc+i/wK4BwccPNzU1vzJ0S4emd1KQ==", - "dependencies": { - "@turf/center-mean": "^6.5.0", - "@turf/centroid": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/center-of-mass": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/center-of-mass/-/center-of-mass-6.5.0.tgz", - "integrity": "sha512-EWrriU6LraOfPN7m1jZi+1NLTKNkuIsGLZc2+Y8zbGruvUW+QV7K0nhf7iZWutlxHXTBqEXHbKue/o79IumAsQ==", - "dependencies": { - "@turf/centroid": "^6.5.0", - "@turf/convex": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/centroid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.5.0.tgz", - "integrity": "sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/circle": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/circle/-/circle-6.5.0.tgz", - "integrity": "sha512-oU1+Kq9DgRnoSbWFHKnnUdTmtcRUMmHoV9DjTXu9vOLNV5OWtAAh1VZ+mzsioGGzoDNT/V5igbFOkMfBQc0B6A==", - "dependencies": { - "@turf/destination": "^6.5.0", - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/clean-coords": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/clean-coords/-/clean-coords-6.5.0.tgz", - "integrity": "sha512-EMX7gyZz0WTH/ET7xV8MyrExywfm9qUi0/MY89yNffzGIEHuFfqwhcCqZ8O00rZIPZHUTxpmsxQSTfzJJA1CPw==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/clone": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-6.5.0.tgz", - "integrity": "sha512-mzVtTFj/QycXOn6ig+annKrM6ZlimreKYz6f/GSERytOpgzodbQyOgkfwru100O1KQhhjSudKK4DsQ0oyi9cTw==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/clusters": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/clusters/-/clusters-6.5.0.tgz", - "integrity": "sha512-Y6gfnTJzQ1hdLfCsyd5zApNbfLIxYEpmDibHUqR5z03Lpe02pa78JtgrgUNt1seeO/aJ4TG1NLN8V5gOrHk04g==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/clusters-dbscan": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/clusters-dbscan/-/clusters-dbscan-6.5.0.tgz", - "integrity": "sha512-SxZEE4kADU9DqLRiT53QZBBhu8EP9skviSyl+FGj08Y01xfICM/RR9ACUdM0aEQimhpu+ZpRVcUK+2jtiCGrYQ==", - "dependencies": { - "@turf/clone": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0", - "density-clustering": "1.3.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/clusters-kmeans": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/clusters-kmeans/-/clusters-kmeans-6.5.0.tgz", - "integrity": "sha512-DwacD5+YO8kwDPKaXwT9DV46tMBVNsbi1IzdajZu1JDSWoN7yc7N9Qt88oi+p30583O0UPVkAK+A10WAQv4mUw==", - "dependencies": { - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "skmeans": "0.9.7" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/collect": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/collect/-/collect-6.5.0.tgz", - "integrity": "sha512-4dN/T6LNnRg099m97BJeOcTA5fSI8cu87Ydgfibewd2KQwBexO69AnjEFqfPX3Wj+Zvisj1uAVIZbPmSSrZkjg==", - "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/helpers": "^6.5.0", - "rbush": "2.x" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/combine": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/combine/-/combine-6.5.0.tgz", - "integrity": "sha512-Q8EIC4OtAcHiJB3C4R+FpB4LANiT90t17uOd851qkM2/o6m39bfN5Mv0PWqMZIHWrrosZqRqoY9dJnzz/rJxYQ==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/concave": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/concave/-/concave-6.5.0.tgz", - "integrity": "sha512-I/sUmUC8TC5h/E2vPwxVht+nRt+TnXIPRoztDFvS8/Y0+cBDple9inLSo9nnPXMXidrBlGXZ9vQx/BjZUJgsRQ==", - "dependencies": { - "@turf/clone": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/tin": "^6.5.0", - "topojson-client": "3.x", - "topojson-server": "3.x" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/convex": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/convex/-/convex-6.5.0.tgz", - "integrity": "sha512-x7ZwC5z7PJB0SBwNh7JCeCNx7Iu+QSrH7fYgK0RhhNop13TqUlvHMirMLRgf2db1DqUetrAO2qHJeIuasquUWg==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0", - "concaveman": "*" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/destination": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/destination/-/destination-6.5.0.tgz", - "integrity": "sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/difference": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/difference/-/difference-6.5.0.tgz", - "integrity": "sha512-l8iR5uJqvI+5Fs6leNbhPY5t/a3vipUF/3AeVLpwPQcgmedNXyheYuy07PcMGH5Jdpi5gItOiTqwiU/bUH4b3A==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "polygon-clipping": "^0.15.3" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/dissolve": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/dissolve/-/dissolve-6.5.0.tgz", - "integrity": "sha512-WBVbpm9zLTp0Bl9CE35NomTaOL1c4TQCtEoO43YaAhNEWJOOIhZMFJyr8mbvYruKl817KinT3x7aYjjCMjTAsQ==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "polygon-clipping": "^0.15.3" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/distance-weight": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance-weight/-/distance-weight-6.5.0.tgz", - "integrity": "sha512-a8qBKkgVNvPKBfZfEJZnC3DV7dfIsC3UIdpRci/iap/wZLH41EmS90nM+BokAJflUHYy8PqE44wySGWHN1FXrQ==", - "dependencies": { - "@turf/centroid": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/ellipse": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/ellipse/-/ellipse-6.5.0.tgz", - "integrity": "sha512-kuXtwFviw/JqnyJXF1mrR/cb496zDTSbGKtSiolWMNImYzGGkbsAsFTjwJYgD7+4FixHjp0uQPzo70KDf3AIBw==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0", - "@turf/transform-rotate": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/envelope": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/envelope/-/envelope-6.5.0.tgz", - "integrity": "sha512-9Z+FnBWvOGOU4X+fMZxYFs1HjFlkKqsddLuMknRaqcJd6t+NIv5DWvPtDL8ATD2GEExYDiFLwMdckfr1yqJgHA==", - "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/bbox-polygon": "^6.5.0", - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/explode": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/explode/-/explode-6.5.0.tgz", - "integrity": "sha512-6cSvMrnHm2qAsace6pw9cDmK2buAlw8+tjeJVXMfMyY+w7ZUi1rprWMsY92J7s2Dar63Bv09n56/1V7+tcj52Q==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/flatten": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/flatten/-/flatten-6.5.0.tgz", - "integrity": "sha512-IBZVwoNLVNT6U/bcUUllubgElzpMsNoCw8tLqBw6dfYg9ObGmpEjf9BIYLr7a2Yn5ZR4l7YIj2T7kD5uJjZADQ==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/flip": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/flip/-/flip-6.5.0.tgz", - "integrity": "sha512-oyikJFNjt2LmIXQqgOGLvt70RgE2lyzPMloYWM7OR5oIFGRiBvqVD2hA6MNw6JewIm30fWZ8DQJw1NHXJTJPbg==", - "dependencies": { - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/great-circle": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/great-circle/-/great-circle-6.5.0.tgz", - "integrity": "sha512-7ovyi3HaKOXdFyN7yy1yOMa8IyOvV46RC1QOQTT+RYUN8ke10eyqExwBpL9RFUPvlpoTzoYbM/+lWPogQlFncg==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/hex-grid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/hex-grid/-/hex-grid-6.5.0.tgz", - "integrity": "sha512-Ln3tc2tgZT8etDOldgc6e741Smg1CsMKAz1/Mlel+MEL5Ynv2mhx3m0q4J9IB1F3a4MNjDeVvm8drAaf9SF33g==", - "dependencies": { - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/intersect": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/interpolate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/interpolate/-/interpolate-6.5.0.tgz", - "integrity": "sha512-LSH5fMeiGyuDZ4WrDJNgh81d2DnNDUVJtuFryJFup8PV8jbs46lQGfI3r1DJ2p1IlEJIz3pmAZYeTfMMoeeohw==", - "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/centroid": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/hex-grid": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/point-grid": "^6.5.0", - "@turf/square-grid": "^6.5.0", - "@turf/triangle-grid": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/intersect": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/intersect/-/intersect-6.5.0.tgz", - "integrity": "sha512-2legGJeKrfFkzntcd4GouPugoqPUjexPZnOvfez+3SfIMrHvulw8qV8u7pfVyn2Yqs53yoVCEjS5sEpvQ5YRQg==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "polygon-clipping": "^0.15.3" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/isobands": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/isobands/-/isobands-6.5.0.tgz", - "integrity": "sha512-4h6sjBPhRwMVuFaVBv70YB7eGz+iw0bhPRnp+8JBdX1UPJSXhoi/ZF2rACemRUr0HkdVB/a1r9gC32vn5IAEkw==", - "dependencies": { - "@turf/area": "^6.5.0", - "@turf/bbox": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/explode": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "object-assign": "*" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/isolines": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/isolines/-/isolines-6.5.0.tgz", - "integrity": "sha512-6ElhiLCopxWlv4tPoxiCzASWt/jMRvmp6mRYrpzOm3EUl75OhHKa/Pu6Y9nWtCMmVC/RcWtiiweUocbPLZLm0A==", - "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "object-assign": "*" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/kinks": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/kinks/-/kinks-6.5.0.tgz", - "integrity": "sha512-ViCngdPt1eEL7hYUHR2eHR662GvCgTc35ZJFaNR6kRtr6D8plLaDju0FILeFFWSc+o8e3fwxZEJKmFj9IzPiIQ==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/length": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/length/-/length-6.5.0.tgz", - "integrity": "sha512-5pL5/pnw52fck3oRsHDcSGrj9HibvtlrZ0QNy2OcW8qBFDNgZ4jtl6U7eATVoyWPKBHszW3dWETW+iLV7UARig==", - "dependencies": { - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-arc": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-arc/-/line-arc-6.5.0.tgz", - "integrity": "sha512-I6c+V6mIyEwbtg9P9zSFF89T7QPe1DPTG3MJJ6Cm1MrAY0MdejwQKOpsvNl8LDU2ekHOlz2kHpPVR7VJsoMllA==", - "dependencies": { - "@turf/circle": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-chunk": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-chunk/-/line-chunk-6.5.0.tgz", - "integrity": "sha512-i1FGE6YJaaYa+IJesTfyRRQZP31QouS+wh/pa6O3CC0q4T7LtHigyBSYjrbjSLfn2EVPYGlPCMFEqNWCOkC6zg==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/length": "^6.5.0", - "@turf/line-slice-along": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-intersect": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-intersect/-/line-intersect-6.5.0.tgz", - "integrity": "sha512-CS6R1tZvVQD390G9Ea4pmpM6mJGPWoL82jD46y0q1KSor9s6HupMIo1kY4Ny+AEYQl9jd21V3Scz20eldpbTVA==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-segment": "^6.5.0", - "@turf/meta": "^6.5.0", - "geojson-rbush": "3.x" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-offset": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-offset/-/line-offset-6.5.0.tgz", - "integrity": "sha512-CEXZbKgyz8r72qRvPchK0dxqsq8IQBdH275FE6o4MrBkzMcoZsfSjghtXzKaz9vvro+HfIXal0sTk2mqV1lQTw==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-overlap": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-overlap/-/line-overlap-6.5.0.tgz", - "integrity": "sha512-xHOaWLd0hkaC/1OLcStCpfq55lPHpPNadZySDXYiYjEz5HXr1oKmtMYpn0wGizsLwrOixRdEp+j7bL8dPt4ojQ==", - "dependencies": { - "@turf/boolean-point-on-line": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-segment": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/nearest-point-on-line": "^6.5.0", - "deep-equal": "1.x", - "geojson-rbush": "3.x" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-segment": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-segment/-/line-segment-6.5.0.tgz", - "integrity": "sha512-jI625Ho4jSuJESNq66Mmi290ZJ5pPZiQZruPVpmHkUw257Pew0alMmb6YrqYNnLUuiVVONxAAKXUVeeUGtycfw==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-slice": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-slice/-/line-slice-6.5.0.tgz", - "integrity": "sha512-vDqJxve9tBHhOaVVFXqVjF5qDzGtKWviyjbyi2QnSnxyFAmLlLnBfMX8TLQCAf2GxHibB95RO5FBE6I2KVPRuw==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/nearest-point-on-line": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-slice-along": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-slice-along/-/line-slice-along-6.5.0.tgz", - "integrity": "sha512-KHJRU6KpHrAj+BTgTNqby6VCTnDzG6a1sJx/I3hNvqMBLvWVA2IrkR9L9DtsQsVY63IBwVdQDqiwCuZLDQh4Ng==", - "dependencies": { - "@turf/bearing": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-split": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-split/-/line-split-6.5.0.tgz", - "integrity": "sha512-/rwUMVr9OI2ccJjw7/6eTN53URtGThNSD5I0GgxyFXMtxWiloRJ9MTff8jBbtPWrRka/Sh2GkwucVRAEakx9Sw==", - "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/line-segment": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/nearest-point-on-line": "^6.5.0", - "@turf/square": "^6.5.0", - "@turf/truncate": "^6.5.0", - "geojson-rbush": "3.x" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/line-to-polygon": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-to-polygon/-/line-to-polygon-6.5.0.tgz", - "integrity": "sha512-qYBuRCJJL8Gx27OwCD1TMijM/9XjRgXH/m/TyuND4OXedBpIWlK5VbTIO2gJ8OCfznBBddpjiObLBrkuxTpN4Q==", - "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/mask": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/mask/-/mask-6.5.0.tgz", - "integrity": "sha512-RQha4aU8LpBrmrkH8CPaaoAfk0Egj5OuXtv6HuCQnHeGNOQt3TQVibTA3Sh4iduq4EPxnZfDjgsOeKtrCA19lg==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "polygon-clipping": "^0.15.3" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/meta": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz", - "integrity": "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/midpoint": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/midpoint/-/midpoint-6.5.0.tgz", - "integrity": "sha512-MyTzV44IwmVI6ec9fB2OgZ53JGNlgOpaYl9ArKoF49rXpL84F9rNATndbe0+MQIhdkw8IlzA6xVP4lZzfMNVCw==", - "dependencies": { - "@turf/bearing": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/moran-index": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/moran-index/-/moran-index-6.5.0.tgz", - "integrity": "sha512-ItsnhrU2XYtTtTudrM8so4afBCYWNaB0Mfy28NZwLjB5jWuAsvyV+YW+J88+neK/ougKMTawkmjQqodNJaBeLQ==", - "dependencies": { - "@turf/distance-weight": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/nearest-point": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/nearest-point/-/nearest-point-6.5.0.tgz", - "integrity": "sha512-fguV09QxilZv/p94s8SMsXILIAMiaXI5PATq9d7YWijLxWUj6Q/r43kxyoi78Zmwwh1Zfqz9w+bCYUAxZ5+euA==", - "dependencies": { - "@turf/clone": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/nearest-point-on-line": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/nearest-point-on-line/-/nearest-point-on-line-6.5.0.tgz", - "integrity": "sha512-WthrvddddvmymnC+Vf7BrkHGbDOUu6Z3/6bFYUGv1kxw8tiZ6n83/VG6kHz4poHOfS0RaNflzXSkmCi64fLBlg==", - "dependencies": { - "@turf/bearing": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/nearest-point-to-line": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/nearest-point-to-line/-/nearest-point-to-line-6.5.0.tgz", - "integrity": "sha512-PXV7cN0BVzUZdjj6oeb/ESnzXSfWmEMrsfZSDRgqyZ9ytdiIj/eRsnOXLR13LkTdXVOJYDBuf7xt1mLhM4p6+Q==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/point-to-line-distance": "^6.5.0", - "object-assign": "*" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/planepoint": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/planepoint/-/planepoint-6.5.0.tgz", - "integrity": "sha512-R3AahA6DUvtFbka1kcJHqZ7DMHmPXDEQpbU5WaglNn7NaCQg9HB0XM0ZfqWcd5u92YXV+Gg8QhC8x5XojfcM4Q==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/point-grid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/point-grid/-/point-grid-6.5.0.tgz", - "integrity": "sha512-Iq38lFokNNtQJnOj/RBKmyt6dlof0yhaHEDELaWHuECm1lIZLY3ZbVMwbs+nXkwTAHjKfS/OtMheUBkw+ee49w==", - "dependencies": { - "@turf/boolean-within": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/point-on-feature": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/point-on-feature/-/point-on-feature-6.5.0.tgz", - "integrity": "sha512-bDpuIlvugJhfcF/0awAQ+QI6Om1Y1FFYE8Y/YdxGRongivix850dTeXCo0mDylFdWFPGDo7Mmh9Vo4VxNwW/TA==", - "dependencies": { - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/center": "^6.5.0", - "@turf/explode": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/nearest-point": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/point-to-line-distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/point-to-line-distance/-/point-to-line-distance-6.5.0.tgz", - "integrity": "sha512-opHVQ4vjUhNBly1bob6RWy+F+hsZDH9SA0UW36pIRzfpu27qipU18xup0XXEePfY6+wvhF6yL/WgCO2IbrLqEA==", - "dependencies": { - "@turf/bearing": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/projection": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0", - "@turf/rhumb-distance": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/points-within-polygon": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/points-within-polygon/-/points-within-polygon-6.5.0.tgz", - "integrity": "sha512-YyuheKqjliDsBDt3Ho73QVZk1VXX1+zIA2gwWvuz8bR1HXOkcuwk/1J76HuFMOQI3WK78wyAi+xbkx268PkQzQ==", - "dependencies": { - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/polygon-smooth": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/polygon-smooth/-/polygon-smooth-6.5.0.tgz", - "integrity": "sha512-LO/X/5hfh/Rk4EfkDBpLlVwt3i6IXdtQccDT9rMjXEP32tRgy0VMFmdkNaXoGlSSKf/1mGqLl4y4wHd86DqKbg==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/polygon-tangents": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/polygon-tangents/-/polygon-tangents-6.5.0.tgz", - "integrity": "sha512-sB4/IUqJMYRQH9jVBwqS/XDitkEfbyqRy+EH/cMRJURTg78eHunvJ708x5r6umXsbiUyQU4eqgPzEylWEQiunw==", - "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/boolean-within": "^6.5.0", - "@turf/explode": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/nearest-point": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/polygon-to-line": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/polygon-to-line/-/polygon-to-line-6.5.0.tgz", - "integrity": "sha512-5p4n/ij97EIttAq+ewSnKt0ruvuM+LIDzuczSzuHTpq4oS7Oq8yqg5TQ4nzMVuK41r/tALCk7nAoBuw3Su4Gcw==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/polygonize": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/polygonize/-/polygonize-6.5.0.tgz", - "integrity": "sha512-a/3GzHRaCyzg7tVYHo43QUChCspa99oK4yPqooVIwTC61npFzdrmnywMv0S+WZjHZwK37BrFJGFrZGf6ocmY5w==", - "dependencies": { - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/envelope": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/projection": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/projection/-/projection-6.5.0.tgz", - "integrity": "sha512-/Pgh9mDvQWWu8HRxqpM+tKz8OzgauV+DiOcr3FCjD6ubDnrrmMJlsf6fFJmggw93mtVPrZRL6yyi9aYCQBOIvg==", - "dependencies": { - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/random": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/random/-/random-6.5.0.tgz", - "integrity": "sha512-8Q25gQ/XbA7HJAe+eXp4UhcXM9aOOJFaxZ02+XSNwMvY8gtWSCBLVqRcW4OhqilgZ8PeuQDWgBxeo+BIqqFWFQ==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/rectangle-grid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rectangle-grid/-/rectangle-grid-6.5.0.tgz", - "integrity": "sha512-yQZ/1vbW68O2KsSB3OZYK+72aWz/Adnf7m2CMKcC+aq6TwjxZjAvlbCOsNUnMAuldRUVN1ph6RXMG4e9KEvKvg==", - "dependencies": { - "@turf/boolean-intersects": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/rewind": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rewind/-/rewind-6.5.0.tgz", - "integrity": "sha512-IoUAMcHWotBWYwSYuYypw/LlqZmO+wcBpn8ysrBNbazkFNkLf3btSDZMkKJO/bvOzl55imr/Xj4fi3DdsLsbzQ==", - "dependencies": { - "@turf/boolean-clockwise": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/rhumb-bearing": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rhumb-bearing/-/rhumb-bearing-6.5.0.tgz", - "integrity": "sha512-jMyqiMRK4hzREjQmnLXmkJ+VTNTx1ii8vuqRwJPcTlKbNWfjDz/5JqJlb5NaFDcdMpftWovkW5GevfnuzHnOYA==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/rhumb-destination": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rhumb-destination/-/rhumb-destination-6.5.0.tgz", - "integrity": "sha512-RHNP1Oy+7xTTdRrTt375jOZeHceFbjwohPHlr9Hf68VdHHPMAWgAKqiX2YgSWDcvECVmiGaBKWus1Df+N7eE4Q==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/rhumb-distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rhumb-distance/-/rhumb-distance-6.5.0.tgz", - "integrity": "sha512-oKp8KFE8E4huC2Z1a1KNcFwjVOqa99isxNOwfo4g3SUABQ6NezjKDDrnvC4yI5YZ3/huDjULLBvhed45xdCrzg==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/sample": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/sample/-/sample-6.5.0.tgz", - "integrity": "sha512-kSdCwY7el15xQjnXYW520heKUrHwRvnzx8ka4eYxX9NFeOxaFITLW2G7UtXb6LJK8mmPXI8Aexv23F2ERqzGFg==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/sector": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/sector/-/sector-6.5.0.tgz", - "integrity": "sha512-cYUOkgCTWqa23SOJBqxoFAc/yGCUsPRdn/ovbRTn1zNTm/Spmk6hVB84LCKOgHqvSF25i0d2kWqpZDzLDdAPbw==", - "dependencies": { - "@turf/circle": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-arc": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/shortest-path": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/shortest-path/-/shortest-path-6.5.0.tgz", - "integrity": "sha512-4de5+G7+P4hgSoPwn+SO9QSi9HY5NEV/xRJ+cmoFVRwv2CDsuOPDheHKeuIAhKyeKDvPvPt04XYWbac4insJMg==", - "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/bbox-polygon": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/clean-coords": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/transform-scale": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/simplify": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/simplify/-/simplify-6.5.0.tgz", - "integrity": "sha512-USas3QqffPHUY184dwQdP8qsvcVH/PWBYdXY5am7YTBACaQOMAlf6AKJs9FT8jiO6fQpxfgxuEtwmox+pBtlOg==", - "dependencies": { - "@turf/clean-coords": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/square": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/square/-/square-6.5.0.tgz", - "integrity": "sha512-BM2UyWDmiuHCadVhHXKIx5CQQbNCpOxB6S/aCNOCLbhCeypKX5Q0Aosc5YcmCJgkwO5BERCC6Ee7NMbNB2vHmQ==", - "dependencies": { - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/square-grid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/square-grid/-/square-grid-6.5.0.tgz", - "integrity": "sha512-mlR0ayUdA+L4c9h7p4k3pX6gPWHNGuZkt2c5II1TJRmhLkW2557d6b/Vjfd1z9OVaajb1HinIs1FMSAPXuuUrA==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/rectangle-grid": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/standard-deviational-ellipse": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/standard-deviational-ellipse/-/standard-deviational-ellipse-6.5.0.tgz", - "integrity": "sha512-02CAlz8POvGPFK2BKK8uHGUk/LXb0MK459JVjKxLC2yJYieOBTqEbjP0qaWhiBhGzIxSMaqe8WxZ0KvqdnstHA==", - "dependencies": { - "@turf/center-mean": "^6.5.0", - "@turf/ellipse": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/points-within-polygon": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/tag": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/tag/-/tag-6.5.0.tgz", - "integrity": "sha512-XwlBvrOV38CQsrNfrxvBaAPBQgXMljeU0DV8ExOyGM7/hvuGHJw3y8kKnQ4lmEQcmcrycjDQhP7JqoRv8vFssg==", - "dependencies": { - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/tesselate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/tesselate/-/tesselate-6.5.0.tgz", - "integrity": "sha512-M1HXuyZFCfEIIKkglh/r5L9H3c5QTEsnMBoZOFQiRnGPGmJWcaBissGb7mTFX2+DKE7FNWXh4TDnZlaLABB0dQ==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "earcut": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/tin": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/tin/-/tin-6.5.0.tgz", - "integrity": "sha512-YLYikRzKisfwj7+F+Tmyy/LE3d2H7D4kajajIfc9mlik2+esG7IolsX/+oUz1biguDYsG0DUA8kVYXDkobukfg==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/transform-rotate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/transform-rotate/-/transform-rotate-6.5.0.tgz", - "integrity": "sha512-A2Ip1v4246ZmpssxpcL0hhiVBEf4L8lGnSPWTgSv5bWBEoya2fa/0SnFX9xJgP40rMP+ZzRaCN37vLHbv1Guag==", - "dependencies": { - "@turf/centroid": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0", - "@turf/rhumb-distance": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/transform-scale": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/transform-scale/-/transform-scale-6.5.0.tgz", - "integrity": "sha512-VsATGXC9rYM8qTjbQJ/P7BswKWXHdnSJ35JlV4OsZyHBMxJQHftvmZJsFbOqVtQnIQIzf2OAly6rfzVV9QLr7g==", - "dependencies": { - "@turf/bbox": "^6.5.0", - "@turf/center": "^6.5.0", - "@turf/centroid": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0", - "@turf/rhumb-distance": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/transform-translate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/transform-translate/-/transform-translate-6.5.0.tgz", - "integrity": "sha512-NABLw5VdtJt/9vSstChp93pc6oel4qXEos56RBMsPlYB8hzNTEKYtC146XJvyF4twJeeYS8RVe1u7KhoFwEM5w==", - "dependencies": { - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/triangle-grid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/triangle-grid/-/triangle-grid-6.5.0.tgz", - "integrity": "sha512-2jToUSAS1R1htq4TyLQYPTIsoy6wg3e3BQXjm2rANzw4wPQCXGOxrur1Fy9RtzwqwljlC7DF4tg0OnWr8RjmfA==", - "dependencies": { - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/intersect": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/truncate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/truncate/-/truncate-6.5.0.tgz", - "integrity": "sha512-pFxg71pLk+eJj134Z9yUoRhIi8vqnnKvCYwdT4x/DQl/19RVdq1tV3yqOT3gcTQNfniteylL5qV1uTBDV5sgrg==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/turf": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/turf/-/turf-6.5.0.tgz", - "integrity": "sha512-ipMCPnhu59bh92MNt8+pr1VZQhHVuTMHklciQURo54heoxRzt1neNYZOBR6jdL+hNsbDGAECMuIpAutX+a3Y+w==", - "dependencies": { - "@turf/along": "^6.5.0", - "@turf/angle": "^6.5.0", - "@turf/area": "^6.5.0", - "@turf/bbox": "^6.5.0", - "@turf/bbox-clip": "^6.5.0", - "@turf/bbox-polygon": "^6.5.0", - "@turf/bearing": "^6.5.0", - "@turf/bezier-spline": "^6.5.0", - "@turf/boolean-clockwise": "^6.5.0", - "@turf/boolean-contains": "^6.5.0", - "@turf/boolean-crosses": "^6.5.0", - "@turf/boolean-disjoint": "^6.5.0", - "@turf/boolean-equal": "^6.5.0", - "@turf/boolean-intersects": "^6.5.0", - "@turf/boolean-overlap": "^6.5.0", - "@turf/boolean-parallel": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/boolean-point-on-line": "^6.5.0", - "@turf/boolean-within": "^6.5.0", - "@turf/buffer": "^6.5.0", - "@turf/center": "^6.5.0", - "@turf/center-mean": "^6.5.0", - "@turf/center-median": "^6.5.0", - "@turf/center-of-mass": "^6.5.0", - "@turf/centroid": "^6.5.0", - "@turf/circle": "^6.5.0", - "@turf/clean-coords": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/clusters": "^6.5.0", - "@turf/clusters-dbscan": "^6.5.0", - "@turf/clusters-kmeans": "^6.5.0", - "@turf/collect": "^6.5.0", - "@turf/combine": "^6.5.0", - "@turf/concave": "^6.5.0", - "@turf/convex": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/difference": "^6.5.0", - "@turf/dissolve": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/distance-weight": "^6.5.0", - "@turf/ellipse": "^6.5.0", - "@turf/envelope": "^6.5.0", - "@turf/explode": "^6.5.0", - "@turf/flatten": "^6.5.0", - "@turf/flip": "^6.5.0", - "@turf/great-circle": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/hex-grid": "^6.5.0", - "@turf/interpolate": "^6.5.0", - "@turf/intersect": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/isobands": "^6.5.0", - "@turf/isolines": "^6.5.0", - "@turf/kinks": "^6.5.0", - "@turf/length": "^6.5.0", - "@turf/line-arc": "^6.5.0", - "@turf/line-chunk": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/line-offset": "^6.5.0", - "@turf/line-overlap": "^6.5.0", - "@turf/line-segment": "^6.5.0", - "@turf/line-slice": "^6.5.0", - "@turf/line-slice-along": "^6.5.0", - "@turf/line-split": "^6.5.0", - "@turf/line-to-polygon": "^6.5.0", - "@turf/mask": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/midpoint": "^6.5.0", - "@turf/moran-index": "^6.5.0", - "@turf/nearest-point": "^6.5.0", - "@turf/nearest-point-on-line": "^6.5.0", - "@turf/nearest-point-to-line": "^6.5.0", - "@turf/planepoint": "^6.5.0", - "@turf/point-grid": "^6.5.0", - "@turf/point-on-feature": "^6.5.0", - "@turf/point-to-line-distance": "^6.5.0", - "@turf/points-within-polygon": "^6.5.0", - "@turf/polygon-smooth": "^6.5.0", - "@turf/polygon-tangents": "^6.5.0", - "@turf/polygon-to-line": "^6.5.0", - "@turf/polygonize": "^6.5.0", - "@turf/projection": "^6.5.0", - "@turf/random": "^6.5.0", - "@turf/rewind": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0", - "@turf/rhumb-distance": "^6.5.0", - "@turf/sample": "^6.5.0", - "@turf/sector": "^6.5.0", - "@turf/shortest-path": "^6.5.0", - "@turf/simplify": "^6.5.0", - "@turf/square": "^6.5.0", - "@turf/square-grid": "^6.5.0", - "@turf/standard-deviational-ellipse": "^6.5.0", - "@turf/tag": "^6.5.0", - "@turf/tesselate": "^6.5.0", - "@turf/tin": "^6.5.0", - "@turf/transform-rotate": "^6.5.0", - "@turf/transform-scale": "^6.5.0", - "@turf/transform-translate": "^6.5.0", - "@turf/triangle-grid": "^6.5.0", - "@turf/truncate": "^6.5.0", - "@turf/union": "^6.5.0", - "@turf/unkink-polygon": "^6.5.0", - "@turf/voronoi": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/union": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/union/-/union-6.5.0.tgz", - "integrity": "sha512-igYWCwP/f0RFHIlC2c0SKDuM/ObBaqSljI3IdV/x71805QbIvY/BYGcJdyNcgEA6cylIGl/0VSlIbpJHZ9ldhw==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "polygon-clipping": "^0.15.3" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/unkink-polygon": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/unkink-polygon/-/unkink-polygon-6.5.0.tgz", - "integrity": "sha512-8QswkzC0UqKmN1DT6HpA9upfa1HdAA5n6bbuzHy8NJOX8oVizVAqfEPY0wqqTgboDjmBR4yyImsdPGUl3gZ8JQ==", - "dependencies": { - "@turf/area": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0", - "rbush": "^2.0.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/voronoi": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/voronoi/-/voronoi-6.5.0.tgz", - "integrity": "sha512-C/xUsywYX+7h1UyNqnydHXiun4UPjK88VDghtoRypR9cLlb7qozkiLRphQxxsCM0KxyxpVPHBVQXdAL3+Yurow==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "d3-voronoi": "1.1.2" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@types/d3-ease": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", - "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/concaveman": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/concaveman/-/concaveman-1.2.0.tgz", - "integrity": "sha512-OcqechF2/kubbffomKqjGEkb0ndlYhEbmyg/fxIGqdfYp5AZjD2Kl5hc97Hh3ngEuHU2314Z4KDbxL7qXGWrQQ==", - "dependencies": { - "point-in-polygon": "^1.0.1", - "rbush": "^3.0.0", - "robust-predicates": "^2.0.4", - "tinyqueue": "^2.0.3" - } - }, - "node_modules/concaveman/node_modules/quickselect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" - }, - "node_modules/concaveman/node_modules/rbush": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", - "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", - "dependencies": { - "quickselect": "^2.0.0" - } - }, - "node_modules/d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.7.1.tgz", - "integrity": "sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==", - "dependencies": { - "d3-array": "1" - } - }, - "node_modules/d3-voronoi": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz", - "integrity": "sha1-Fodmfo8TotFYyAwUgMWinLDYlzw=" - }, - "node_modules/deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dependencies": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/density-clustering": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/density-clustering/-/density-clustering-1.3.0.tgz", - "integrity": "sha1-3J9ZyPCrl+FiSsZJMP0xlIF9ysU=" - }, - "node_modules/earcut": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.3.tgz", - "integrity": "sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug==" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/geojson-equality": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/geojson-equality/-/geojson-equality-0.1.6.tgz", - "integrity": "sha1-oXE3TvBD5dR5eZWEC65GSOB1LXI=", - "dependencies": { - "deep-equal": "^1.0.0" - } - }, - "node_modules/geojson-rbush": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/geojson-rbush/-/geojson-rbush-3.1.2.tgz", - "integrity": "sha512-grkfdg3HIeTjwTfiJe5FT8+fGU3fABCc+vRJDBwdQz9kkLF0Sbif2gs2JUzjewwgmnvLGy9fInySDeADoNuk7w==", - "dependencies": { - "@turf/bbox": "*", - "@turf/helpers": "6.x", - "@turf/meta": "6.x", - "rbush": "^2.0.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "dependencies": { - "call-bind": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", - "dependencies": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/point-in-polygon": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz", - "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==" - }, - "node_modules/polygon-clipping": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/polygon-clipping/-/polygon-clipping-0.15.3.tgz", - "integrity": "sha512-ho0Xx5DLkgxRx/+n4O74XyJ67DcyN3Tu9bGYKsnTukGAW6ssnuak6Mwcyb1wHy9MZc9xsUWqIoiazkZB5weECg==", - "dependencies": { - "splaytree": "^3.1.0" - } - }, - "node_modules/quickselect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz", - "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==" - }, - "node_modules/rbush": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz", - "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==", - "dependencies": { - "quickselect": "^1.0.1" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/robust-predicates": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-2.0.4.tgz", - "integrity": "sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==" - }, - "node_modules/skmeans": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/skmeans/-/skmeans-0.9.7.tgz", - "integrity": "sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg==" - }, - "node_modules/splaytree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/splaytree/-/splaytree-3.1.0.tgz", - "integrity": "sha512-gvUGR7xnOy0fLKTCxDeUZYgU/I1Tdf8M/lM1Qrf8L2TIOR5ipZjGk02uYcdv0o2x7WjVRgpm3iS2clLyuVAt0Q==" - }, - "node_modules/tinyqueue": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" - }, - "node_modules/topojson-client": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", - "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", - "dependencies": { - "commander": "2" - }, - "bin": { - "topo2geo": "bin/topo2geo", - "topomerge": "bin/topomerge", - "topoquantize": "bin/topoquantize" - } - }, - "node_modules/topojson-server": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/topojson-server/-/topojson-server-3.0.1.tgz", - "integrity": "sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==", - "dependencies": { - "commander": "2" - }, - "bin": { - "geo2topo": "bin/geo2topo" - } - }, - "node_modules/turf-jsts": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/turf-jsts/-/turf-jsts-1.2.3.tgz", - "integrity": "sha512-Ja03QIJlPuHt4IQ2FfGex4F4JAr8m3jpaHbFbQrgwr7s7L6U8ocrHiF3J1+wf9jzhGKxvDeaCAnGDot8OjGFyA==" - } - }, - "dependencies": { - "@turf/along": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/along/-/along-6.5.0.tgz", - "integrity": "sha512-LLyWQ0AARqJCmMcIEAXF4GEu8usmd4Kbz3qk1Oy5HoRNpZX47+i5exQtmIWKdqJ1MMhW26fCTXgpsEs5zgJ5gw==", - "requires": { - "@turf/bearing": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/angle": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/angle/-/angle-6.5.0.tgz", - "integrity": "sha512-4pXMbWhFofJJAOvTMCns6N4C8CMd5Ih4O2jSAG9b3dDHakj3O4yN1+Zbm+NUei+eVEZ9gFeVp9svE3aMDenIkw==", - "requires": { - "@turf/bearing": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0" - } - }, - "@turf/area": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", - "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/bbox": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz", - "integrity": "sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/bbox-clip": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bbox-clip/-/bbox-clip-6.5.0.tgz", - "integrity": "sha512-F6PaIRF8WMp8EmgU/Ke5B1Y6/pia14UAYB5TiBC668w5rVVjy5L8rTm/m2lEkkDMHlzoP9vNY4pxpNthE7rLcQ==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/bbox-polygon": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bbox-polygon/-/bbox-polygon-6.5.0.tgz", - "integrity": "sha512-+/r0NyL1lOG3zKZmmf6L8ommU07HliP4dgYToMoTxqzsWzyLjaj/OzgQ8rBmv703WJX+aS6yCmLuIhYqyufyuw==", - "requires": { - "@turf/helpers": "^6.5.0" - } - }, - "@turf/bearing": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bearing/-/bearing-6.5.0.tgz", - "integrity": "sha512-dxINYhIEMzgDOztyMZc20I7ssYVNEpSv04VbMo5YPQsqa80KO3TFvbuCahMsCAW5z8Tncc8dwBlEFrmRjJG33A==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/bezier-spline": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bezier-spline/-/bezier-spline-6.5.0.tgz", - "integrity": "sha512-vokPaurTd4PF96rRgGVm6zYYC5r1u98ZsG+wZEv9y3kJTuJRX/O3xIY2QnTGTdbVmAJN1ouOsD0RoZYaVoXORQ==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/boolean-clockwise": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-clockwise/-/boolean-clockwise-6.5.0.tgz", - "integrity": "sha512-45+C7LC5RMbRWrxh3Z0Eihsc8db1VGBO5d9BLTOAwU4jR6SgsunTfRWR16X7JUwIDYlCVEmnjcXJNi/kIU3VIw==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/boolean-contains": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-contains/-/boolean-contains-6.5.0.tgz", - "integrity": "sha512-4m8cJpbw+YQcKVGi8y0cHhBUnYT+QRfx6wzM4GI1IdtYH3p4oh/DOBJKrepQyiDzFDaNIjxuWXBh0ai1zVwOQQ==", - "requires": { - "@turf/bbox": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/boolean-point-on-line": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/boolean-crosses": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-crosses/-/boolean-crosses-6.5.0.tgz", - "integrity": "sha512-gvshbTPhAHporTlQwBJqyfW+2yV8q/mOTxG6PzRVl6ARsqNoqYQWkd4MLug7OmAqVyBzLK3201uAeBjxbGw0Ng==", - "requires": { - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/polygon-to-line": "^6.5.0" - } - }, - "@turf/boolean-disjoint": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-disjoint/-/boolean-disjoint-6.5.0.tgz", - "integrity": "sha512-rZ2ozlrRLIAGo2bjQ/ZUu4oZ/+ZjGvLkN5CKXSKBcu6xFO6k2bgqeM8a1836tAW+Pqp/ZFsTA5fZHsJZvP2D5g==", - "requires": { - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/polygon-to-line": "^6.5.0" - } - }, - "@turf/boolean-equal": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-equal/-/boolean-equal-6.5.0.tgz", - "integrity": "sha512-cY0M3yoLC26mhAnjv1gyYNQjn7wxIXmL2hBmI/qs8g5uKuC2hRWi13ydufE3k4x0aNRjFGlg41fjoYLwaVF+9Q==", - "requires": { - "@turf/clean-coords": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "geojson-equality": "0.1.6" - } - }, - "@turf/boolean-intersects": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-intersects/-/boolean-intersects-6.5.0.tgz", - "integrity": "sha512-nIxkizjRdjKCYFQMnml6cjPsDOBCThrt+nkqtSEcxkKMhAQj5OO7o2CecioNTaX8EayqwMGVKcsz27oP4mKPTw==", - "requires": { - "@turf/boolean-disjoint": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/boolean-overlap": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-overlap/-/boolean-overlap-6.5.0.tgz", - "integrity": "sha512-8btMIdnbXVWUa1M7D4shyaSGxLRw6NjMcqKBcsTXcZdnaixl22k7ar7BvIzkaRYN3SFECk9VGXfLncNS3ckQUw==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/line-overlap": "^6.5.0", - "@turf/meta": "^6.5.0", - "geojson-equality": "0.1.6" - } - }, - "@turf/boolean-parallel": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-parallel/-/boolean-parallel-6.5.0.tgz", - "integrity": "sha512-aSHJsr1nq9e5TthZGZ9CZYeXklJyRgR5kCLm5X4urz7+MotMOp/LsGOsvKvK9NeUl9+8OUmfMn8EFTT8LkcvIQ==", - "requires": { - "@turf/clean-coords": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/line-segment": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0" - } - }, - "@turf/boolean-point-in-polygon": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-6.5.0.tgz", - "integrity": "sha512-DtSuVFB26SI+hj0SjrvXowGTUCHlgevPAIsukssW6BG5MlNSBQAo70wpICBNJL6RjukXg8d2eXaAWuD/CqL00A==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/boolean-point-on-line": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-point-on-line/-/boolean-point-on-line-6.5.0.tgz", - "integrity": "sha512-A1BbuQ0LceLHvq7F/P7w3QvfpmZqbmViIUPHdNLvZimFNLo4e6IQunmzbe+8aSStH9QRZm3VOflyvNeXvvpZEQ==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/boolean-within": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/boolean-within/-/boolean-within-6.5.0.tgz", - "integrity": "sha512-YQB3oU18Inx35C/LU930D36RAVe7LDXk1kWsQ8mLmuqYn9YdPsDQTMTkLJMhoQ8EbN7QTdy333xRQ4MYgToteQ==", - "requires": { - "@turf/bbox": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/boolean-point-on-line": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/buffer": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/buffer/-/buffer-6.5.0.tgz", - "integrity": "sha512-qeX4N6+PPWbKqp1AVkBVWFerGjMYMUyencwfnkCesoznU6qvfugFHNAngNqIBVnJjZ5n8IFyOf+akcxnrt9sNg==", - "requires": { - "@turf/bbox": "^6.5.0", - "@turf/center": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/projection": "^6.5.0", - "d3-geo": "1.7.1", - "turf-jsts": "*" - } - }, - "@turf/center": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/center/-/center-6.5.0.tgz", - "integrity": "sha512-T8KtMTfSATWcAX088rEDKjyvQCBkUsLnK/Txb6/8WUXIeOZyHu42G7MkdkHRoHtwieLdduDdmPLFyTdG5/e7ZQ==", - "requires": { - "@turf/bbox": "^6.5.0", - "@turf/helpers": "^6.5.0" - } - }, - "@turf/center-mean": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/center-mean/-/center-mean-6.5.0.tgz", - "integrity": "sha512-AAX6f4bVn12pTVrMUiB9KrnV94BgeBKpyg3YpfnEbBpkN/znfVhL8dG8IxMAxAoSZ61Zt9WLY34HfENveuOZ7Q==", - "requires": { - "@turf/bbox": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/center-median": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/center-median/-/center-median-6.5.0.tgz", - "integrity": "sha512-dT8Ndu5CiZkPrj15PBvslpuf01ky41DEYEPxS01LOxp5HOUHXp1oJxsPxvc+i/wK4BwccPNzU1vzJ0S4emd1KQ==", - "requires": { - "@turf/center-mean": "^6.5.0", - "@turf/centroid": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/center-of-mass": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/center-of-mass/-/center-of-mass-6.5.0.tgz", - "integrity": "sha512-EWrriU6LraOfPN7m1jZi+1NLTKNkuIsGLZc2+Y8zbGruvUW+QV7K0nhf7iZWutlxHXTBqEXHbKue/o79IumAsQ==", - "requires": { - "@turf/centroid": "^6.5.0", - "@turf/convex": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/centroid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.5.0.tgz", - "integrity": "sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/circle": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/circle/-/circle-6.5.0.tgz", - "integrity": "sha512-oU1+Kq9DgRnoSbWFHKnnUdTmtcRUMmHoV9DjTXu9vOLNV5OWtAAh1VZ+mzsioGGzoDNT/V5igbFOkMfBQc0B6A==", - "requires": { - "@turf/destination": "^6.5.0", - "@turf/helpers": "^6.5.0" - } - }, - "@turf/clean-coords": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/clean-coords/-/clean-coords-6.5.0.tgz", - "integrity": "sha512-EMX7gyZz0WTH/ET7xV8MyrExywfm9qUi0/MY89yNffzGIEHuFfqwhcCqZ8O00rZIPZHUTxpmsxQSTfzJJA1CPw==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/clone": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-6.5.0.tgz", - "integrity": "sha512-mzVtTFj/QycXOn6ig+annKrM6ZlimreKYz6f/GSERytOpgzodbQyOgkfwru100O1KQhhjSudKK4DsQ0oyi9cTw==", - "requires": { - "@turf/helpers": "^6.5.0" - } - }, - "@turf/clusters": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/clusters/-/clusters-6.5.0.tgz", - "integrity": "sha512-Y6gfnTJzQ1hdLfCsyd5zApNbfLIxYEpmDibHUqR5z03Lpe02pa78JtgrgUNt1seeO/aJ4TG1NLN8V5gOrHk04g==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/clusters-dbscan": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/clusters-dbscan/-/clusters-dbscan-6.5.0.tgz", - "integrity": "sha512-SxZEE4kADU9DqLRiT53QZBBhu8EP9skviSyl+FGj08Y01xfICM/RR9ACUdM0aEQimhpu+ZpRVcUK+2jtiCGrYQ==", - "requires": { - "@turf/clone": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0", - "density-clustering": "1.3.0" - } - }, - "@turf/clusters-kmeans": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/clusters-kmeans/-/clusters-kmeans-6.5.0.tgz", - "integrity": "sha512-DwacD5+YO8kwDPKaXwT9DV46tMBVNsbi1IzdajZu1JDSWoN7yc7N9Qt88oi+p30583O0UPVkAK+A10WAQv4mUw==", - "requires": { - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "skmeans": "0.9.7" - } - }, - "@turf/collect": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/collect/-/collect-6.5.0.tgz", - "integrity": "sha512-4dN/T6LNnRg099m97BJeOcTA5fSI8cu87Ydgfibewd2KQwBexO69AnjEFqfPX3Wj+Zvisj1uAVIZbPmSSrZkjg==", - "requires": { - "@turf/bbox": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/helpers": "^6.5.0", - "rbush": "2.x" - } - }, - "@turf/combine": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/combine/-/combine-6.5.0.tgz", - "integrity": "sha512-Q8EIC4OtAcHiJB3C4R+FpB4LANiT90t17uOd851qkM2/o6m39bfN5Mv0PWqMZIHWrrosZqRqoY9dJnzz/rJxYQ==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/concave": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/concave/-/concave-6.5.0.tgz", - "integrity": "sha512-I/sUmUC8TC5h/E2vPwxVht+nRt+TnXIPRoztDFvS8/Y0+cBDple9inLSo9nnPXMXidrBlGXZ9vQx/BjZUJgsRQ==", - "requires": { - "@turf/clone": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/tin": "^6.5.0", - "topojson-client": "3.x", - "topojson-server": "3.x" - } - }, - "@turf/convex": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/convex/-/convex-6.5.0.tgz", - "integrity": "sha512-x7ZwC5z7PJB0SBwNh7JCeCNx7Iu+QSrH7fYgK0RhhNop13TqUlvHMirMLRgf2db1DqUetrAO2qHJeIuasquUWg==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0", - "concaveman": "*" - } - }, - "@turf/destination": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/destination/-/destination-6.5.0.tgz", - "integrity": "sha512-4cnWQlNC8d1tItOz9B4pmJdWpXqS0vEvv65bI/Pj/genJnsL7evI0/Xw42RvEGROS481MPiU80xzvwxEvhQiMQ==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/difference": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/difference/-/difference-6.5.0.tgz", - "integrity": "sha512-l8iR5uJqvI+5Fs6leNbhPY5t/a3vipUF/3AeVLpwPQcgmedNXyheYuy07PcMGH5Jdpi5gItOiTqwiU/bUH4b3A==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "polygon-clipping": "^0.15.3" - } - }, - "@turf/dissolve": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/dissolve/-/dissolve-6.5.0.tgz", - "integrity": "sha512-WBVbpm9zLTp0Bl9CE35NomTaOL1c4TQCtEoO43YaAhNEWJOOIhZMFJyr8mbvYruKl817KinT3x7aYjjCMjTAsQ==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "polygon-clipping": "^0.15.3" - } - }, - "@turf/distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-6.5.0.tgz", - "integrity": "sha512-xzykSLfoURec5qvQJcfifw/1mJa+5UwByZZ5TZ8iaqjGYN0vomhV9aiSLeYdUGtYRESZ+DYC/OzY+4RclZYgMg==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/distance-weight": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/distance-weight/-/distance-weight-6.5.0.tgz", - "integrity": "sha512-a8qBKkgVNvPKBfZfEJZnC3DV7dfIsC3UIdpRci/iap/wZLH41EmS90nM+BokAJflUHYy8PqE44wySGWHN1FXrQ==", - "requires": { - "@turf/centroid": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/ellipse": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/ellipse/-/ellipse-6.5.0.tgz", - "integrity": "sha512-kuXtwFviw/JqnyJXF1mrR/cb496zDTSbGKtSiolWMNImYzGGkbsAsFTjwJYgD7+4FixHjp0uQPzo70KDf3AIBw==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0", - "@turf/transform-rotate": "^6.5.0" - } - }, - "@turf/envelope": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/envelope/-/envelope-6.5.0.tgz", - "integrity": "sha512-9Z+FnBWvOGOU4X+fMZxYFs1HjFlkKqsddLuMknRaqcJd6t+NIv5DWvPtDL8ATD2GEExYDiFLwMdckfr1yqJgHA==", - "requires": { - "@turf/bbox": "^6.5.0", - "@turf/bbox-polygon": "^6.5.0", - "@turf/helpers": "^6.5.0" - } - }, - "@turf/explode": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/explode/-/explode-6.5.0.tgz", - "integrity": "sha512-6cSvMrnHm2qAsace6pw9cDmK2buAlw8+tjeJVXMfMyY+w7ZUi1rprWMsY92J7s2Dar63Bv09n56/1V7+tcj52Q==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/flatten": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/flatten/-/flatten-6.5.0.tgz", - "integrity": "sha512-IBZVwoNLVNT6U/bcUUllubgElzpMsNoCw8tLqBw6dfYg9ObGmpEjf9BIYLr7a2Yn5ZR4l7YIj2T7kD5uJjZADQ==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/flip": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/flip/-/flip-6.5.0.tgz", - "integrity": "sha512-oyikJFNjt2LmIXQqgOGLvt70RgE2lyzPMloYWM7OR5oIFGRiBvqVD2hA6MNw6JewIm30fWZ8DQJw1NHXJTJPbg==", - "requires": { - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/great-circle": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/great-circle/-/great-circle-6.5.0.tgz", - "integrity": "sha512-7ovyi3HaKOXdFyN7yy1yOMa8IyOvV46RC1QOQTT+RYUN8ke10eyqExwBpL9RFUPvlpoTzoYbM/+lWPogQlFncg==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==" - }, - "@turf/hex-grid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/hex-grid/-/hex-grid-6.5.0.tgz", - "integrity": "sha512-Ln3tc2tgZT8etDOldgc6e741Smg1CsMKAz1/Mlel+MEL5Ynv2mhx3m0q4J9IB1F3a4MNjDeVvm8drAaf9SF33g==", - "requires": { - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/intersect": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/interpolate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/interpolate/-/interpolate-6.5.0.tgz", - "integrity": "sha512-LSH5fMeiGyuDZ4WrDJNgh81d2DnNDUVJtuFryJFup8PV8jbs46lQGfI3r1DJ2p1IlEJIz3pmAZYeTfMMoeeohw==", - "requires": { - "@turf/bbox": "^6.5.0", - "@turf/centroid": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/hex-grid": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/point-grid": "^6.5.0", - "@turf/square-grid": "^6.5.0", - "@turf/triangle-grid": "^6.5.0" - } - }, - "@turf/intersect": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/intersect/-/intersect-6.5.0.tgz", - "integrity": "sha512-2legGJeKrfFkzntcd4GouPugoqPUjexPZnOvfez+3SfIMrHvulw8qV8u7pfVyn2Yqs53yoVCEjS5sEpvQ5YRQg==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "polygon-clipping": "^0.15.3" - } - }, - "@turf/invariant": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-6.5.0.tgz", - "integrity": "sha512-Wv8PRNCtPD31UVbdJE/KVAWKe7l6US+lJItRR/HOEW3eh+U/JwRCSUl/KZ7bmjM/C+zLNoreM2TU6OoLACs4eg==", - "requires": { - "@turf/helpers": "^6.5.0" - } - }, - "@turf/isobands": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/isobands/-/isobands-6.5.0.tgz", - "integrity": "sha512-4h6sjBPhRwMVuFaVBv70YB7eGz+iw0bhPRnp+8JBdX1UPJSXhoi/ZF2rACemRUr0HkdVB/a1r9gC32vn5IAEkw==", - "requires": { - "@turf/area": "^6.5.0", - "@turf/bbox": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/explode": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "object-assign": "*" - } - }, - "@turf/isolines": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/isolines/-/isolines-6.5.0.tgz", - "integrity": "sha512-6ElhiLCopxWlv4tPoxiCzASWt/jMRvmp6mRYrpzOm3EUl75OhHKa/Pu6Y9nWtCMmVC/RcWtiiweUocbPLZLm0A==", - "requires": { - "@turf/bbox": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "object-assign": "*" - } - }, - "@turf/kinks": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/kinks/-/kinks-6.5.0.tgz", - "integrity": "sha512-ViCngdPt1eEL7hYUHR2eHR662GvCgTc35ZJFaNR6kRtr6D8plLaDju0FILeFFWSc+o8e3fwxZEJKmFj9IzPiIQ==", - "requires": { - "@turf/helpers": "^6.5.0" - } - }, - "@turf/length": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/length/-/length-6.5.0.tgz", - "integrity": "sha512-5pL5/pnw52fck3oRsHDcSGrj9HibvtlrZ0QNy2OcW8qBFDNgZ4jtl6U7eATVoyWPKBHszW3dWETW+iLV7UARig==", - "requires": { - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/line-arc": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-arc/-/line-arc-6.5.0.tgz", - "integrity": "sha512-I6c+V6mIyEwbtg9P9zSFF89T7QPe1DPTG3MJJ6Cm1MrAY0MdejwQKOpsvNl8LDU2ekHOlz2kHpPVR7VJsoMllA==", - "requires": { - "@turf/circle": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/helpers": "^6.5.0" - } - }, - "@turf/line-chunk": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-chunk/-/line-chunk-6.5.0.tgz", - "integrity": "sha512-i1FGE6YJaaYa+IJesTfyRRQZP31QouS+wh/pa6O3CC0q4T7LtHigyBSYjrbjSLfn2EVPYGlPCMFEqNWCOkC6zg==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/length": "^6.5.0", - "@turf/line-slice-along": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/line-intersect": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-intersect/-/line-intersect-6.5.0.tgz", - "integrity": "sha512-CS6R1tZvVQD390G9Ea4pmpM6mJGPWoL82jD46y0q1KSor9s6HupMIo1kY4Ny+AEYQl9jd21V3Scz20eldpbTVA==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-segment": "^6.5.0", - "@turf/meta": "^6.5.0", - "geojson-rbush": "3.x" - } - }, - "@turf/line-offset": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-offset/-/line-offset-6.5.0.tgz", - "integrity": "sha512-CEXZbKgyz8r72qRvPchK0dxqsq8IQBdH275FE6o4MrBkzMcoZsfSjghtXzKaz9vvro+HfIXal0sTk2mqV1lQTw==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/line-overlap": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-overlap/-/line-overlap-6.5.0.tgz", - "integrity": "sha512-xHOaWLd0hkaC/1OLcStCpfq55lPHpPNadZySDXYiYjEz5HXr1oKmtMYpn0wGizsLwrOixRdEp+j7bL8dPt4ojQ==", - "requires": { - "@turf/boolean-point-on-line": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-segment": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/nearest-point-on-line": "^6.5.0", - "deep-equal": "1.x", - "geojson-rbush": "3.x" - } - }, - "@turf/line-segment": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-segment/-/line-segment-6.5.0.tgz", - "integrity": "sha512-jI625Ho4jSuJESNq66Mmi290ZJ5pPZiQZruPVpmHkUw257Pew0alMmb6YrqYNnLUuiVVONxAAKXUVeeUGtycfw==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/line-slice": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-slice/-/line-slice-6.5.0.tgz", - "integrity": "sha512-vDqJxve9tBHhOaVVFXqVjF5qDzGtKWviyjbyi2QnSnxyFAmLlLnBfMX8TLQCAf2GxHibB95RO5FBE6I2KVPRuw==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/nearest-point-on-line": "^6.5.0" - } - }, - "@turf/line-slice-along": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-slice-along/-/line-slice-along-6.5.0.tgz", - "integrity": "sha512-KHJRU6KpHrAj+BTgTNqby6VCTnDzG6a1sJx/I3hNvqMBLvWVA2IrkR9L9DtsQsVY63IBwVdQDqiwCuZLDQh4Ng==", - "requires": { - "@turf/bearing": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0" - } - }, - "@turf/line-split": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-split/-/line-split-6.5.0.tgz", - "integrity": "sha512-/rwUMVr9OI2ccJjw7/6eTN53URtGThNSD5I0GgxyFXMtxWiloRJ9MTff8jBbtPWrRka/Sh2GkwucVRAEakx9Sw==", - "requires": { - "@turf/bbox": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/line-segment": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/nearest-point-on-line": "^6.5.0", - "@turf/square": "^6.5.0", - "@turf/truncate": "^6.5.0", - "geojson-rbush": "3.x" - } - }, - "@turf/line-to-polygon": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/line-to-polygon/-/line-to-polygon-6.5.0.tgz", - "integrity": "sha512-qYBuRCJJL8Gx27OwCD1TMijM/9XjRgXH/m/TyuND4OXedBpIWlK5VbTIO2gJ8OCfznBBddpjiObLBrkuxTpN4Q==", - "requires": { - "@turf/bbox": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/mask": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/mask/-/mask-6.5.0.tgz", - "integrity": "sha512-RQha4aU8LpBrmrkH8CPaaoAfk0Egj5OuXtv6HuCQnHeGNOQt3TQVibTA3Sh4iduq4EPxnZfDjgsOeKtrCA19lg==", - "requires": { - "@turf/helpers": "^6.5.0", - "polygon-clipping": "^0.15.3" - } - }, - "@turf/meta": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz", - "integrity": "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==", - "requires": { - "@turf/helpers": "^6.5.0" - } - }, - "@turf/midpoint": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/midpoint/-/midpoint-6.5.0.tgz", - "integrity": "sha512-MyTzV44IwmVI6ec9fB2OgZ53JGNlgOpaYl9ArKoF49rXpL84F9rNATndbe0+MQIhdkw8IlzA6xVP4lZzfMNVCw==", - "requires": { - "@turf/bearing": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0" - } - }, - "@turf/moran-index": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/moran-index/-/moran-index-6.5.0.tgz", - "integrity": "sha512-ItsnhrU2XYtTtTudrM8so4afBCYWNaB0Mfy28NZwLjB5jWuAsvyV+YW+J88+neK/ougKMTawkmjQqodNJaBeLQ==", - "requires": { - "@turf/distance-weight": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/nearest-point": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/nearest-point/-/nearest-point-6.5.0.tgz", - "integrity": "sha512-fguV09QxilZv/p94s8SMsXILIAMiaXI5PATq9d7YWijLxWUj6Q/r43kxyoi78Zmwwh1Zfqz9w+bCYUAxZ5+euA==", - "requires": { - "@turf/clone": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/nearest-point-on-line": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/nearest-point-on-line/-/nearest-point-on-line-6.5.0.tgz", - "integrity": "sha512-WthrvddddvmymnC+Vf7BrkHGbDOUu6Z3/6bFYUGv1kxw8tiZ6n83/VG6kHz4poHOfS0RaNflzXSkmCi64fLBlg==", - "requires": { - "@turf/bearing": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/nearest-point-to-line": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/nearest-point-to-line/-/nearest-point-to-line-6.5.0.tgz", - "integrity": "sha512-PXV7cN0BVzUZdjj6oeb/ESnzXSfWmEMrsfZSDRgqyZ9ytdiIj/eRsnOXLR13LkTdXVOJYDBuf7xt1mLhM4p6+Q==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/point-to-line-distance": "^6.5.0", - "object-assign": "*" - } - }, - "@turf/planepoint": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/planepoint/-/planepoint-6.5.0.tgz", - "integrity": "sha512-R3AahA6DUvtFbka1kcJHqZ7DMHmPXDEQpbU5WaglNn7NaCQg9HB0XM0ZfqWcd5u92YXV+Gg8QhC8x5XojfcM4Q==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/point-grid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/point-grid/-/point-grid-6.5.0.tgz", - "integrity": "sha512-Iq38lFokNNtQJnOj/RBKmyt6dlof0yhaHEDELaWHuECm1lIZLY3ZbVMwbs+nXkwTAHjKfS/OtMheUBkw+ee49w==", - "requires": { - "@turf/boolean-within": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/point-on-feature": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/point-on-feature/-/point-on-feature-6.5.0.tgz", - "integrity": "sha512-bDpuIlvugJhfcF/0awAQ+QI6Om1Y1FFYE8Y/YdxGRongivix850dTeXCo0mDylFdWFPGDo7Mmh9Vo4VxNwW/TA==", - "requires": { - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/center": "^6.5.0", - "@turf/explode": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/nearest-point": "^6.5.0" - } - }, - "@turf/point-to-line-distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/point-to-line-distance/-/point-to-line-distance-6.5.0.tgz", - "integrity": "sha512-opHVQ4vjUhNBly1bob6RWy+F+hsZDH9SA0UW36pIRzfpu27qipU18xup0XXEePfY6+wvhF6yL/WgCO2IbrLqEA==", - "requires": { - "@turf/bearing": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/projection": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0", - "@turf/rhumb-distance": "^6.5.0" - } - }, - "@turf/points-within-polygon": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/points-within-polygon/-/points-within-polygon-6.5.0.tgz", - "integrity": "sha512-YyuheKqjliDsBDt3Ho73QVZk1VXX1+zIA2gwWvuz8bR1HXOkcuwk/1J76HuFMOQI3WK78wyAi+xbkx268PkQzQ==", - "requires": { - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/polygon-smooth": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/polygon-smooth/-/polygon-smooth-6.5.0.tgz", - "integrity": "sha512-LO/X/5hfh/Rk4EfkDBpLlVwt3i6IXdtQccDT9rMjXEP32tRgy0VMFmdkNaXoGlSSKf/1mGqLl4y4wHd86DqKbg==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/polygon-tangents": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/polygon-tangents/-/polygon-tangents-6.5.0.tgz", - "integrity": "sha512-sB4/IUqJMYRQH9jVBwqS/XDitkEfbyqRy+EH/cMRJURTg78eHunvJ708x5r6umXsbiUyQU4eqgPzEylWEQiunw==", - "requires": { - "@turf/bbox": "^6.5.0", - "@turf/boolean-within": "^6.5.0", - "@turf/explode": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/nearest-point": "^6.5.0" - } - }, - "@turf/polygon-to-line": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/polygon-to-line/-/polygon-to-line-6.5.0.tgz", - "integrity": "sha512-5p4n/ij97EIttAq+ewSnKt0ruvuM+LIDzuczSzuHTpq4oS7Oq8yqg5TQ4nzMVuK41r/tALCk7nAoBuw3Su4Gcw==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/polygonize": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/polygonize/-/polygonize-6.5.0.tgz", - "integrity": "sha512-a/3GzHRaCyzg7tVYHo43QUChCspa99oK4yPqooVIwTC61npFzdrmnywMv0S+WZjHZwK37BrFJGFrZGf6ocmY5w==", - "requires": { - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/envelope": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/projection": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/projection/-/projection-6.5.0.tgz", - "integrity": "sha512-/Pgh9mDvQWWu8HRxqpM+tKz8OzgauV+DiOcr3FCjD6ubDnrrmMJlsf6fFJmggw93mtVPrZRL6yyi9aYCQBOIvg==", - "requires": { - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/random": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/random/-/random-6.5.0.tgz", - "integrity": "sha512-8Q25gQ/XbA7HJAe+eXp4UhcXM9aOOJFaxZ02+XSNwMvY8gtWSCBLVqRcW4OhqilgZ8PeuQDWgBxeo+BIqqFWFQ==", - "requires": { - "@turf/helpers": "^6.5.0" - } - }, - "@turf/rectangle-grid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rectangle-grid/-/rectangle-grid-6.5.0.tgz", - "integrity": "sha512-yQZ/1vbW68O2KsSB3OZYK+72aWz/Adnf7m2CMKcC+aq6TwjxZjAvlbCOsNUnMAuldRUVN1ph6RXMG4e9KEvKvg==", - "requires": { - "@turf/boolean-intersects": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0" - } - }, - "@turf/rewind": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rewind/-/rewind-6.5.0.tgz", - "integrity": "sha512-IoUAMcHWotBWYwSYuYypw/LlqZmO+wcBpn8ysrBNbazkFNkLf3btSDZMkKJO/bvOzl55imr/Xj4fi3DdsLsbzQ==", - "requires": { - "@turf/boolean-clockwise": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/rhumb-bearing": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rhumb-bearing/-/rhumb-bearing-6.5.0.tgz", - "integrity": "sha512-jMyqiMRK4hzREjQmnLXmkJ+VTNTx1ii8vuqRwJPcTlKbNWfjDz/5JqJlb5NaFDcdMpftWovkW5GevfnuzHnOYA==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/rhumb-destination": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rhumb-destination/-/rhumb-destination-6.5.0.tgz", - "integrity": "sha512-RHNP1Oy+7xTTdRrTt375jOZeHceFbjwohPHlr9Hf68VdHHPMAWgAKqiX2YgSWDcvECVmiGaBKWus1Df+N7eE4Q==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/rhumb-distance": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/rhumb-distance/-/rhumb-distance-6.5.0.tgz", - "integrity": "sha512-oKp8KFE8E4huC2Z1a1KNcFwjVOqa99isxNOwfo4g3SUABQ6NezjKDDrnvC4yI5YZ3/huDjULLBvhed45xdCrzg==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" - } - }, - "@turf/sample": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/sample/-/sample-6.5.0.tgz", - "integrity": "sha512-kSdCwY7el15xQjnXYW520heKUrHwRvnzx8ka4eYxX9NFeOxaFITLW2G7UtXb6LJK8mmPXI8Aexv23F2ERqzGFg==", - "requires": { - "@turf/helpers": "^6.5.0" - } - }, - "@turf/sector": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/sector/-/sector-6.5.0.tgz", - "integrity": "sha512-cYUOkgCTWqa23SOJBqxoFAc/yGCUsPRdn/ovbRTn1zNTm/Spmk6hVB84LCKOgHqvSF25i0d2kWqpZDzLDdAPbw==", - "requires": { - "@turf/circle": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/line-arc": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/shortest-path": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/shortest-path/-/shortest-path-6.5.0.tgz", - "integrity": "sha512-4de5+G7+P4hgSoPwn+SO9QSi9HY5NEV/xRJ+cmoFVRwv2CDsuOPDheHKeuIAhKyeKDvPvPt04XYWbac4insJMg==", - "requires": { - "@turf/bbox": "^6.5.0", - "@turf/bbox-polygon": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/clean-coords": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/transform-scale": "^6.5.0" - } - }, - "@turf/simplify": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/simplify/-/simplify-6.5.0.tgz", - "integrity": "sha512-USas3QqffPHUY184dwQdP8qsvcVH/PWBYdXY5am7YTBACaQOMAlf6AKJs9FT8jiO6fQpxfgxuEtwmox+pBtlOg==", - "requires": { - "@turf/clean-coords": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/square": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/square/-/square-6.5.0.tgz", - "integrity": "sha512-BM2UyWDmiuHCadVhHXKIx5CQQbNCpOxB6S/aCNOCLbhCeypKX5Q0Aosc5YcmCJgkwO5BERCC6Ee7NMbNB2vHmQ==", - "requires": { - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0" - } - }, - "@turf/square-grid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/square-grid/-/square-grid-6.5.0.tgz", - "integrity": "sha512-mlR0ayUdA+L4c9h7p4k3pX6gPWHNGuZkt2c5II1TJRmhLkW2557d6b/Vjfd1z9OVaajb1HinIs1FMSAPXuuUrA==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/rectangle-grid": "^6.5.0" - } - }, - "@turf/standard-deviational-ellipse": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/standard-deviational-ellipse/-/standard-deviational-ellipse-6.5.0.tgz", - "integrity": "sha512-02CAlz8POvGPFK2BKK8uHGUk/LXb0MK459JVjKxLC2yJYieOBTqEbjP0qaWhiBhGzIxSMaqe8WxZ0KvqdnstHA==", - "requires": { - "@turf/center-mean": "^6.5.0", - "@turf/ellipse": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/points-within-polygon": "^6.5.0" - } - }, - "@turf/tag": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/tag/-/tag-6.5.0.tgz", - "integrity": "sha512-XwlBvrOV38CQsrNfrxvBaAPBQgXMljeU0DV8ExOyGM7/hvuGHJw3y8kKnQ4lmEQcmcrycjDQhP7JqoRv8vFssg==", - "requires": { - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/tesselate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/tesselate/-/tesselate-6.5.0.tgz", - "integrity": "sha512-M1HXuyZFCfEIIKkglh/r5L9H3c5QTEsnMBoZOFQiRnGPGmJWcaBissGb7mTFX2+DKE7FNWXh4TDnZlaLABB0dQ==", - "requires": { - "@turf/helpers": "^6.5.0", - "earcut": "^2.0.0" - } - }, - "@turf/tin": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/tin/-/tin-6.5.0.tgz", - "integrity": "sha512-YLYikRzKisfwj7+F+Tmyy/LE3d2H7D4kajajIfc9mlik2+esG7IolsX/+oUz1biguDYsG0DUA8kVYXDkobukfg==", - "requires": { - "@turf/helpers": "^6.5.0" - } - }, - "@turf/transform-rotate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/transform-rotate/-/transform-rotate-6.5.0.tgz", - "integrity": "sha512-A2Ip1v4246ZmpssxpcL0hhiVBEf4L8lGnSPWTgSv5bWBEoya2fa/0SnFX9xJgP40rMP+ZzRaCN37vLHbv1Guag==", - "requires": { - "@turf/centroid": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0", - "@turf/rhumb-distance": "^6.5.0" - } - }, - "@turf/transform-scale": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/transform-scale/-/transform-scale-6.5.0.tgz", - "integrity": "sha512-VsATGXC9rYM8qTjbQJ/P7BswKWXHdnSJ35JlV4OsZyHBMxJQHftvmZJsFbOqVtQnIQIzf2OAly6rfzVV9QLr7g==", - "requires": { - "@turf/bbox": "^6.5.0", - "@turf/center": "^6.5.0", - "@turf/centroid": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0", - "@turf/rhumb-distance": "^6.5.0" - } - }, - "@turf/transform-translate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/transform-translate/-/transform-translate-6.5.0.tgz", - "integrity": "sha512-NABLw5VdtJt/9vSstChp93pc6oel4qXEos56RBMsPlYB8hzNTEKYtC146XJvyF4twJeeYS8RVe1u7KhoFwEM5w==", - "requires": { - "@turf/clone": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0" - } - }, - "@turf/triangle-grid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/triangle-grid/-/triangle-grid-6.5.0.tgz", - "integrity": "sha512-2jToUSAS1R1htq4TyLQYPTIsoy6wg3e3BQXjm2rANzw4wPQCXGOxrur1Fy9RtzwqwljlC7DF4tg0OnWr8RjmfA==", - "requires": { - "@turf/distance": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/intersect": "^6.5.0" - } - }, - "@turf/truncate": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/truncate/-/truncate-6.5.0.tgz", - "integrity": "sha512-pFxg71pLk+eJj134Z9yUoRhIi8vqnnKvCYwdT4x/DQl/19RVdq1tV3yqOT3gcTQNfniteylL5qV1uTBDV5sgrg==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - } - }, - "@turf/turf": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/turf/-/turf-6.5.0.tgz", - "integrity": "sha512-ipMCPnhu59bh92MNt8+pr1VZQhHVuTMHklciQURo54heoxRzt1neNYZOBR6jdL+hNsbDGAECMuIpAutX+a3Y+w==", - "requires": { - "@turf/along": "^6.5.0", - "@turf/angle": "^6.5.0", - "@turf/area": "^6.5.0", - "@turf/bbox": "^6.5.0", - "@turf/bbox-clip": "^6.5.0", - "@turf/bbox-polygon": "^6.5.0", - "@turf/bearing": "^6.5.0", - "@turf/bezier-spline": "^6.5.0", - "@turf/boolean-clockwise": "^6.5.0", - "@turf/boolean-contains": "^6.5.0", - "@turf/boolean-crosses": "^6.5.0", - "@turf/boolean-disjoint": "^6.5.0", - "@turf/boolean-equal": "^6.5.0", - "@turf/boolean-intersects": "^6.5.0", - "@turf/boolean-overlap": "^6.5.0", - "@turf/boolean-parallel": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/boolean-point-on-line": "^6.5.0", - "@turf/boolean-within": "^6.5.0", - "@turf/buffer": "^6.5.0", - "@turf/center": "^6.5.0", - "@turf/center-mean": "^6.5.0", - "@turf/center-median": "^6.5.0", - "@turf/center-of-mass": "^6.5.0", - "@turf/centroid": "^6.5.0", - "@turf/circle": "^6.5.0", - "@turf/clean-coords": "^6.5.0", - "@turf/clone": "^6.5.0", - "@turf/clusters": "^6.5.0", - "@turf/clusters-dbscan": "^6.5.0", - "@turf/clusters-kmeans": "^6.5.0", - "@turf/collect": "^6.5.0", - "@turf/combine": "^6.5.0", - "@turf/concave": "^6.5.0", - "@turf/convex": "^6.5.0", - "@turf/destination": "^6.5.0", - "@turf/difference": "^6.5.0", - "@turf/dissolve": "^6.5.0", - "@turf/distance": "^6.5.0", - "@turf/distance-weight": "^6.5.0", - "@turf/ellipse": "^6.5.0", - "@turf/envelope": "^6.5.0", - "@turf/explode": "^6.5.0", - "@turf/flatten": "^6.5.0", - "@turf/flip": "^6.5.0", - "@turf/great-circle": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/hex-grid": "^6.5.0", - "@turf/interpolate": "^6.5.0", - "@turf/intersect": "^6.5.0", - "@turf/invariant": "^6.5.0", - "@turf/isobands": "^6.5.0", - "@turf/isolines": "^6.5.0", - "@turf/kinks": "^6.5.0", - "@turf/length": "^6.5.0", - "@turf/line-arc": "^6.5.0", - "@turf/line-chunk": "^6.5.0", - "@turf/line-intersect": "^6.5.0", - "@turf/line-offset": "^6.5.0", - "@turf/line-overlap": "^6.5.0", - "@turf/line-segment": "^6.5.0", - "@turf/line-slice": "^6.5.0", - "@turf/line-slice-along": "^6.5.0", - "@turf/line-split": "^6.5.0", - "@turf/line-to-polygon": "^6.5.0", - "@turf/mask": "^6.5.0", - "@turf/meta": "^6.5.0", - "@turf/midpoint": "^6.5.0", - "@turf/moran-index": "^6.5.0", - "@turf/nearest-point": "^6.5.0", - "@turf/nearest-point-on-line": "^6.5.0", - "@turf/nearest-point-to-line": "^6.5.0", - "@turf/planepoint": "^6.5.0", - "@turf/point-grid": "^6.5.0", - "@turf/point-on-feature": "^6.5.0", - "@turf/point-to-line-distance": "^6.5.0", - "@turf/points-within-polygon": "^6.5.0", - "@turf/polygon-smooth": "^6.5.0", - "@turf/polygon-tangents": "^6.5.0", - "@turf/polygon-to-line": "^6.5.0", - "@turf/polygonize": "^6.5.0", - "@turf/projection": "^6.5.0", - "@turf/random": "^6.5.0", - "@turf/rewind": "^6.5.0", - "@turf/rhumb-bearing": "^6.5.0", - "@turf/rhumb-destination": "^6.5.0", - "@turf/rhumb-distance": "^6.5.0", - "@turf/sample": "^6.5.0", - "@turf/sector": "^6.5.0", - "@turf/shortest-path": "^6.5.0", - "@turf/simplify": "^6.5.0", - "@turf/square": "^6.5.0", - "@turf/square-grid": "^6.5.0", - "@turf/standard-deviational-ellipse": "^6.5.0", - "@turf/tag": "^6.5.0", - "@turf/tesselate": "^6.5.0", - "@turf/tin": "^6.5.0", - "@turf/transform-rotate": "^6.5.0", - "@turf/transform-scale": "^6.5.0", - "@turf/transform-translate": "^6.5.0", - "@turf/triangle-grid": "^6.5.0", - "@turf/truncate": "^6.5.0", - "@turf/union": "^6.5.0", - "@turf/unkink-polygon": "^6.5.0", - "@turf/voronoi": "^6.5.0" - } - }, - "@turf/union": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/union/-/union-6.5.0.tgz", - "integrity": "sha512-igYWCwP/f0RFHIlC2c0SKDuM/ObBaqSljI3IdV/x71805QbIvY/BYGcJdyNcgEA6cylIGl/0VSlIbpJHZ9ldhw==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "polygon-clipping": "^0.15.3" - } - }, - "@turf/unkink-polygon": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/unkink-polygon/-/unkink-polygon-6.5.0.tgz", - "integrity": "sha512-8QswkzC0UqKmN1DT6HpA9upfa1HdAA5n6bbuzHy8NJOX8oVizVAqfEPY0wqqTgboDjmBR4yyImsdPGUl3gZ8JQ==", - "requires": { - "@turf/area": "^6.5.0", - "@turf/boolean-point-in-polygon": "^6.5.0", - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0", - "rbush": "^2.0.1" - } - }, - "@turf/voronoi": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/voronoi/-/voronoi-6.5.0.tgz", - "integrity": "sha512-C/xUsywYX+7h1UyNqnydHXiun4UPjK88VDghtoRypR9cLlb7qozkiLRphQxxsCM0KxyxpVPHBVQXdAL3+Yurow==", - "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0", - "d3-voronoi": "1.1.2" - } - }, - "@types/d3-ease": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", - "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "concaveman": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/concaveman/-/concaveman-1.2.0.tgz", - "integrity": "sha512-OcqechF2/kubbffomKqjGEkb0ndlYhEbmyg/fxIGqdfYp5AZjD2Kl5hc97Hh3ngEuHU2314Z4KDbxL7qXGWrQQ==", - "requires": { - "point-in-polygon": "^1.0.1", - "rbush": "^3.0.0", - "robust-predicates": "^2.0.4", - "tinyqueue": "^2.0.3" - }, - "dependencies": { - "quickselect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" - }, - "rbush": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz", - "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", - "requires": { - "quickselect": "^2.0.0" - } - } - } - }, - "d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" - }, - "d3-geo": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.7.1.tgz", - "integrity": "sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw==", - "requires": { - "d3-array": "1" - } - }, - "d3-voronoi": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz", - "integrity": "sha1-Fodmfo8TotFYyAwUgMWinLDYlzw=" - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "density-clustering": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/density-clustering/-/density-clustering-1.3.0.tgz", - "integrity": "sha1-3J9ZyPCrl+FiSsZJMP0xlIF9ysU=" - }, - "earcut": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.3.tgz", - "integrity": "sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug==" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "geojson-equality": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/geojson-equality/-/geojson-equality-0.1.6.tgz", - "integrity": "sha1-oXE3TvBD5dR5eZWEC65GSOB1LXI=", - "requires": { - "deep-equal": "^1.0.0" - } - }, - "geojson-rbush": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/geojson-rbush/-/geojson-rbush-3.1.2.tgz", - "integrity": "sha512-grkfdg3HIeTjwTfiJe5FT8+fGU3fABCc+vRJDBwdQz9kkLF0Sbif2gs2JUzjewwgmnvLGy9fInySDeADoNuk7w==", - "requires": { - "@turf/bbox": "*", - "@turf/helpers": "6.x", - "@turf/meta": "6.x", - "rbush": "^2.0.0" - } - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" - }, - "is-arguments": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", - "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", - "requires": { - "call-bind": "^1.0.0" - } - }, - "is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" - }, - "is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "point-in-polygon": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz", - "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==" - }, - "polygon-clipping": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/polygon-clipping/-/polygon-clipping-0.15.3.tgz", - "integrity": "sha512-ho0Xx5DLkgxRx/+n4O74XyJ67DcyN3Tu9bGYKsnTukGAW6ssnuak6Mwcyb1wHy9MZc9xsUWqIoiazkZB5weECg==", - "requires": { - "splaytree": "^3.1.0" - } - }, - "quickselect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz", - "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==" - }, - "rbush": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz", - "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==", - "requires": { - "quickselect": "^1.0.1" - } - }, - "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "robust-predicates": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-2.0.4.tgz", - "integrity": "sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg==" - }, - "skmeans": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/skmeans/-/skmeans-0.9.7.tgz", - "integrity": "sha512-hNj1/oZ7ygsfmPZ7ZfN5MUBRoGg1gtpnImuJBgLO0ljQ67DtJuiQaiYdS4lUA6s0KCwnPhGivtC/WRwIZLkHyg==" - }, - "splaytree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/splaytree/-/splaytree-3.1.0.tgz", - "integrity": "sha512-gvUGR7xnOy0fLKTCxDeUZYgU/I1Tdf8M/lM1Qrf8L2TIOR5ipZjGk02uYcdv0o2x7WjVRgpm3iS2clLyuVAt0Q==" - }, - "tinyqueue": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" - }, - "topojson-client": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", - "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", - "requires": { - "commander": "2" - } - }, - "topojson-server": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/topojson-server/-/topojson-server-3.0.1.tgz", - "integrity": "sha512-/VS9j/ffKr2XAOjlZ9CgyyeLmgJ9dMwq6Y0YEON8O7p/tGGk+dCWnrE03zEdu7i4L7YsFZLEPZPzCvcB7lEEXw==", - "requires": { - "commander": "2" - } - }, - "turf-jsts": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/turf-jsts/-/turf-jsts-1.2.3.tgz", - "integrity": "sha512-Ja03QIJlPuHt4IQ2FfGex4F4JAr8m3jpaHbFbQrgwr7s7L6U8ocrHiF3J1+wf9jzhGKxvDeaCAnGDot8OjGFyA==" - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 1a481968b..000000000 --- a/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "dependencies": { - "@turf/turf": "^6.5.0", - "@types/d3-ease": "^3.0.0", - "d3-ease": "^3.0.1" - } -} From 150b793feeb4f7f746144c461f053004728466cc Mon Sep 17 00:00:00 2001 From: Vim <86254807+vim-usds@users.noreply.github.com> Date: Wed, 10 Aug 2022 09:13:06 -0700 Subject: [PATCH 04/23] Correct copy typo (#1809) --- .../AreaDetail/tests/__snapshots__/areaDetail.test.tsx.snap | 2 +- client/src/data/copy/explore.tsx | 2 +- client/src/intl/en.json | 2 +- client/src/intl/es.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/components/AreaDetail/tests/__snapshots__/areaDetail.test.tsx.snap b/client/src/components/AreaDetail/tests/__snapshots__/areaDetail.test.tsx.snap index 6d67a4e40..b74f18d1b 100644 --- a/client/src/components/AreaDetail/tests/__snapshots__/areaDetail.test.tsx.snap +++ b/client/src/components/AreaDetail/tests/__snapshots__/areaDetail.test.tsx.snap @@ -519,7 +519,7 @@ exports[`rendering of the AreaDetail checks if indicators for NATION is present
Expected building loss rate
- Economic loss rate to agricultural value resulting from natural hazards each year + Economic loss rate to building value resulting from natural hazards each year
diff --git a/client/src/data/copy/explore.tsx b/client/src/data/copy/explore.tsx index 00c6f52cb..8c5e34121 100644 --- a/client/src/data/copy/explore.tsx +++ b/client/src/data/copy/explore.tsx @@ -590,7 +590,7 @@ export const SIDE_PANEL_INDICATOR_DESCRIPTION = defineMessages({ }, EXP_BLD_LOSS: { id: 'explore.map.page.side.panel.indicator.description.exp.bld.loss', - defaultMessage: 'Economic loss rate to agricultural value resulting from natural hazards each year', + defaultMessage: 'Economic loss rate to building value resulting from natural hazards each year', description: `Navigate to the explore the map page. When the map is in view, click on the map. The side panel will show an indicator description of Economic loss rate to buildings resulting from natural hazards`, }, diff --git a/client/src/intl/en.json b/client/src/intl/en.json index ebe6156f2..5b4c8aacb 100644 --- a/client/src/intl/en.json +++ b/client/src/intl/en.json @@ -496,7 +496,7 @@ "description": "Navigate to the explore the map page. When the map is in view, click on the map. The side panel will show an indicator description of Economic loss rate to agriculture resulting from natural hazards\n " }, "explore.map.page.side.panel.indicator.description.exp.bld.loss": { - "defaultMessage": "Economic loss rate to agricultural value resulting from natural hazards each year", + "defaultMessage": "Economic loss rate to building value resulting from natural hazards each year", "description": "Navigate to the explore the map page. When the map is in view, click on the map. The side \n panel will show an indicator description of Economic loss rate to buildings resulting from natural hazards" }, "explore.map.page.side.panel.indicator.description.exp.pop.loss": { diff --git a/client/src/intl/es.json b/client/src/intl/es.json index 2d18c567e..0893ede2d 100644 --- a/client/src/intl/es.json +++ b/client/src/intl/es.json @@ -125,7 +125,7 @@ "explore.map.page.side.panel.indicator.description.dieselPartMatter": "Descarga de gas de motor diésel en el aire", "explore.map.page.side.panel.indicator.description.energyBurden": "Costo promedio anual de la energía dividido por el ingreso familiar", "explore.map.page.side.panel.indicator.description.exp.ag.loss": "Tasa de pérdida económica en relación con el valor agrícola resultante de peligros naturales cada año", - "explore.map.page.side.panel.indicator.description.exp.bld.loss": "Tasa de pérdida económica en relación con el valor agrícola resultante de peligros naturales cada año", + "explore.map.page.side.panel.indicator.description.exp.bld.loss": "Tasa de pérdida económica en relación con el valor construcción resultante de peligros naturales cada año", "explore.map.page.side.panel.indicator.description.exp.pop.loss": "Tasa de muertes y lesiones resultantes de peligros naturales cada año", "explore.map.page.side.panel.indicator.description.heartDisease": "Personas con 18 años cumplidos a quienes se les ha diagnosticado una cardiopatía", "explore.map.page.side.panel.indicator.description.high.ed": "Porcentaje de la población con 15 años cumplidos del grupo de bloques del censo que no está inscrita en la universidad, escuela superior o escuela de posgrado", From a66e4a24805ba2ad2fef5a45466fcdbe5c06ecb6 Mon Sep 17 00:00:00 2001 From: Matthew Bowen Date: Tue, 26 Jul 2022 15:08:15 -0400 Subject: [PATCH 05/23] Add basic test suite for COI (#1518) --- .../child_opportunity_index/__init__.py | 0 .../child_opportunity_index/test_etl.py | 87 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/__init__.py create mode 100644 data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/test_etl.py diff --git a/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/__init__.py b/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/test_etl.py b/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/test_etl.py new file mode 100644 index 000000000..4a5226843 --- /dev/null +++ b/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/test_etl.py @@ -0,0 +1,87 @@ +# pylint: disable=protected-access +from unittest import mock +import pathlib +import requests + +from data_pipeline.etl.sources.child_opportunity_index.etl import ( + ChildOpportunityIndex, +) +from data_pipeline.tests.sources.example.test_etl import TestETL +from data_pipeline.utils import get_module_logger + +logger = get_module_logger(__name__) + + +class TestChildOpportunityIndexETL(TestETL): + """Tests the COI ETL. + + This uses pytest-snapshot. + To update individual snapshots: $ poetry run pytest + data_pipeline/tests/sources/national_risk_index/test_etl.py::TestClassNameETL:: + --snapshot-update + """ + + _ETL_CLASS = ChildOpportunityIndex + + _SAMPLE_DATA_PATH = pathlib.Path(__file__).parents[0] / "data" + _SAMPLE_DATA_FILE_NAME = "NRI_Table_CensusTracts.csv" + _SAMPLE_DATA_ZIP_FILE_NAME = "NRI_Table_CensusTracts.zip" + _EXTRACT_TMP_FOLDER_NAME = "NationalRiskIndexETL" + + def setup_method(self, _method, filename=__file__): + """Invoke `setup_method` from Parent, but using the current file name. + + This code can be copied identically between all child classes. + """ + super().setup_method(_method=_method, filename=filename) + + # XXX: Refactor since I just straight copied it out of NRI's + def _setup_etl_instance_and_run_extract(self, mock_etl, mock_paths): + with mock.patch("data_pipeline.utils.requests") as requests_mock: + zip_file_fixture_src = self._DATA_DIRECTORY_FOR_TEST / "coi.zip" + tmp_path = mock_paths[1] + + # Create mock response. + with open(zip_file_fixture_src, mode="rb") as file: + file_contents = file.read() + response_mock = requests.Response() + response_mock.status_code = 200 + # pylint: disable=protected-access + response_mock._content = file_contents + + # Return text fixture: + requests_mock.get = mock.MagicMock(return_value=response_mock) + + # Instantiate the ETL class. + etl = ChildOpportunityIndex() + + # Monkey-patch the temporary directory to the one used in the test + etl.TMP_PATH = tmp_path + + # Run the extract method. + etl.extract() + + return etl + + def test_init(self, mock_etl, mock_paths): + """Tests that the ChildOpportunityIndexETL class was initialized + correctly. + """ + + etl = ChildOpportunityIndex() + data_path, t_ = mock_paths + assert etl.DATA_PATH == data_path + assert etl.COLUMNS_TO_KEEP == [ + "GEOID10_TRACT", + "Summer days above 90F", + "Percent low access to healthy food", + "Percent impenetrable surface areas", + "Third grade reading proficiency", + ] + assert etl.GEOID_FIELD_NAME == "GEOID10" + assert etl.GEOID_TRACT_FIELD_NAME == "GEOID10_TRACT" + assert etl.TRACT_INPUT_COLUMN_NAME == "geoid" + assert etl.EXTREME_HEAT_INPUT_FIELD == "HE_HEAT" + assert etl.HEALTHY_FOOD_INPUT_FIELD == "HE_FOOD" + assert etl.IMPENETRABLE_SURFACES_INPUT_FIELD == "HE_GREEN" + assert etl.READING_INPUT_FIELD == "ED_READING" From 2cc4dba4a78a8407921dca2b1a22882ddac311a5 Mon Sep 17 00:00:00 2001 From: Matthew Bowen Date: Wed, 27 Jul 2022 15:37:08 -0400 Subject: [PATCH 06/23] Update COI to use new yaml (#1518) --- .../etl/score/config/datasets.yml | 38 +++++++++ .../sources/child_opportunity_index/etl.py | 74 +++++++++--------- .../child_opportunity_index/data/coi.zip | Bin 0 -> 5676 bytes .../child_opportunity_index/data/extract.csv | 11 +++ .../child_opportunity_index/data/output.csv | 13 +++ .../child_opportunity_index/data/raw.csv | 25 ++++++ .../data/transform.csv | 13 +++ .../child_opportunity_index/test_etl.py | 26 ++++-- .../tests/sources/example/test_etl.py | 10 ++- 9 files changed, 165 insertions(+), 45 deletions(-) create mode 100644 data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/coi.zip create mode 100644 data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/extract.csv create mode 100644 data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/output.csv create mode 100644 data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/raw.csv create mode 100644 data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/transform.csv diff --git a/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml b/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml index 8bcf72eaf..944516d48 100644 --- a/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml +++ b/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml @@ -77,3 +77,41 @@ datasets: df_field_name: "CONTAINS_AGRIVALUE" long_name: "Contains agricultural value" field_type: bool + - long_name: "Child Opportunity Index 2.0 database" + short_name: "coi" + module_name: "child_opportunity_index" + description: "A composite index measured at the census tract level that captures neighborhood resources and conditions that matter for children's healthy development." + input_geoid_tract_field_name: "geoid" + load_fields: + - short_name: "he_heat" + df_field_name: "EXTREME_HEAT_FIELD" + long_name: "Summer days above 90F" + field_type: float + include_in_tiles: true + include_in_csv: true + include_in_excel: true + column_position: 1 + - short_name: "he_food" + long_name: "Percent low access to healthy food" + df_field_name: "HEALTHY_FOOD_FIELD" + field_type: float + include_in_tiles: true + include_in_csv: true + include_in_excel: true + column_position: 2 + - short_name: "he_green" + long_name: "Percent impenetrable surface areas" + df_field_name: "IMPENETRABLE_SURFACES_FIELD" + field_type: float + include_in_tiles: true + include_in_csv: true + include_in_excel: true + column_position: 3 + - short_name: "ed_reading" + df_field_name: "READING_FIELD" + long_name: "Third grade reading proficiency" + field_type: float + include_in_tiles: true + include_in_csv: true + include_in_excel: true + column_position: 4 diff --git a/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py b/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py index eb9de9db0..68d8ddbad 100644 --- a/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py +++ b/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py @@ -1,9 +1,8 @@ from pathlib import Path import pandas as pd -from data_pipeline.etl.base import ExtractTransformLoad -from data_pipeline.score import field_names -from data_pipeline.utils import get_module_logger, unzip_file_from_url +from data_pipeline.etl.base import ExtractTransformLoad, ValidGeoLevel +from data_pipeline.utils import get_module_logger logger = get_module_logger(__name__) @@ -22,14 +21,32 @@ class ChildOpportunityIndex(ExtractTransformLoad): Github repo: https://github.com/diversitydatakids/COI/ + + NOTE: Things to ask jorge: + - How do you decide the short name? + - I ended up not having all the same tracts in my data set and had to subset them in the tests --- okay? make up data? """ + # Metadata for the baseclass + NAME = "child_opportunity_index" + GEO_LEVEL = ValidGeoLevel.CENSUS_TRACT + + # Define these for easy code completion + EXTREME_HEAT_FIELD: str + HEALTHY_FOOD_FIELD: str + IMPENETRABLE_SURFACES_FIELD: str + READING_FIELD: str + def __init__(self): - self.COI_FILE_URL = ( + self.DATASET_CONFIG = super().yaml_config_load() + self.SOURCE_URL = ( "https://data.diversitydatakids.org/datastore/zip/f16fff12-b1e5-4f60-85d3-" "3a0ededa30a0?format=csv" ) + # TODO: Decide about nixing this + self.TRACT_INPUT_COLUMN_NAME = self.INPUT_GEOID_TRACT_FIELD_NAME + self.OUTPUT_PATH: Path = ( self.DATA_PATH / "dataset" / "child_opportunity_index" ) @@ -40,31 +57,19 @@ def __init__(self): self.IMPENETRABLE_SURFACES_INPUT_FIELD = "HE_GREEN" self.READING_INPUT_FIELD = "ED_READING" - # Constants for output - self.COLUMNS_TO_KEEP = [ - self.GEOID_TRACT_FIELD_NAME, - field_names.EXTREME_HEAT_FIELD, - field_names.HEALTHY_FOOD_FIELD, - field_names.IMPENETRABLE_SURFACES_FIELD, - field_names.READING_FIELD, - ] - - self.raw_df: pd.DataFrame self.output_df: pd.DataFrame def extract(self) -> None: logger.info("Starting 51MB data download.") - - unzip_file_from_url( - file_url=self.COI_FILE_URL, - download_path=self.get_tmp_path(), - unzipped_file_path=self.get_tmp_path() / "child_opportunity_index", + super().extract( + source_url=self.SOURCE_URL, + extract_path=self.get_tmp_path(), ) - self.raw_df = pd.read_csv( - filepath_or_buffer=self.get_tmp_path() - / "child_opportunity_index" - / "raw.csv", + def transform(self) -> None: + logger.info("Starting transforms.") + raw_df = pd.read_csv( + filepath_or_buffer=self.get_tmp_path() / "raw.csv", # The following need to remain as strings for all of their digits, not get # converted to numbers. dtype={ @@ -73,16 +78,13 @@ def extract(self) -> None: low_memory=False, ) - def transform(self) -> None: - logger.info("Starting transforms.") - - output_df = self.raw_df.rename( + output_df = raw_df.rename( columns={ self.TRACT_INPUT_COLUMN_NAME: self.GEOID_TRACT_FIELD_NAME, - self.EXTREME_HEAT_INPUT_FIELD: field_names.EXTREME_HEAT_FIELD, - self.HEALTHY_FOOD_INPUT_FIELD: field_names.HEALTHY_FOOD_FIELD, - self.IMPENETRABLE_SURFACES_INPUT_FIELD: field_names.IMPENETRABLE_SURFACES_FIELD, - self.READING_INPUT_FIELD: field_names.READING_FIELD, + self.EXTREME_HEAT_INPUT_FIELD: self.EXTREME_HEAT_FIELD, + self.HEALTHY_FOOD_INPUT_FIELD: self.HEALTHY_FOOD_FIELD, + self.IMPENETRABLE_SURFACES_INPUT_FIELD: self.IMPENETRABLE_SURFACES_FIELD, + self.READING_INPUT_FIELD: self.READING_FIELD, } ) @@ -95,8 +97,8 @@ def transform(self) -> None: # Convert percents from 0-100 to 0-1 to standardize with our other fields. percent_fields_to_convert = [ - field_names.HEALTHY_FOOD_FIELD, - field_names.IMPENETRABLE_SURFACES_FIELD, + self.HEALTHY_FOOD_FIELD, + self.IMPENETRABLE_SURFACES_FIELD, ] for percent_field_to_convert in percent_fields_to_convert: @@ -108,8 +110,6 @@ def transform(self) -> None: def load(self) -> None: logger.info("Saving CSV") - + ### XXX: Should we do this in the super().load too? self.OUTPUT_PATH.mkdir(parents=True, exist_ok=True) - self.output_df[self.COLUMNS_TO_KEEP].to_csv( - path_or_buf=self.OUTPUT_PATH / "usa.csv", index=False - ) + super().load(float_format="%.10f") diff --git a/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/coi.zip b/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/coi.zip new file mode 100644 index 0000000000000000000000000000000000000000..9c9f0315245f3a0f9034d6dfa041a2def6121f4f GIT binary patch literal 5676 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 + data_pipeline/tests/sources/child_opportunity_index/test_etl.py::TestClassNameETL:: --snapshot-update """ _ETL_CLASS = ChildOpportunityIndex _SAMPLE_DATA_PATH = pathlib.Path(__file__).parents[0] / "data" - _SAMPLE_DATA_FILE_NAME = "NRI_Table_CensusTracts.csv" - _SAMPLE_DATA_ZIP_FILE_NAME = "NRI_Table_CensusTracts.zip" - _EXTRACT_TMP_FOLDER_NAME = "NationalRiskIndexETL" + _SAMPLE_DATA_FILE_NAME = "raw.csv" + _SAMPLE_DATA_ZIP_FILE_NAME = "coi.zip" + _EXTRACT_TMP_FOLDER_NAME = "ChildOpportunityIndex" + _EXTRACT_CSV_FILE_NAME = "raw.csv" + _FIXTURES_SHARED_TRACT_IDS = [ + "15001021010", + "15001021101", + "15007040603", + "15007040700", + "15009030100", + "15009030201", + "15001021402", + "15001021800", + "15009030402", + "15009030800", + "15003010201", + "15007040604", + ] def setup_method(self, _method, filename=__file__): """Invoke `setup_method` from Parent, but using the current file name. @@ -48,7 +63,6 @@ def _setup_etl_instance_and_run_extract(self, mock_etl, mock_paths): response_mock.status_code = 200 # pylint: disable=protected-access response_mock._content = file_contents - # Return text fixture: requests_mock.get = mock.MagicMock(return_value=response_mock) @@ -69,7 +83,7 @@ def test_init(self, mock_etl, mock_paths): """ etl = ChildOpportunityIndex() - data_path, t_ = mock_paths + data_path, _ = mock_paths assert etl.DATA_PATH == data_path assert etl.COLUMNS_TO_KEEP == [ "GEOID10_TRACT", diff --git a/data/data-pipeline/data_pipeline/tests/sources/example/test_etl.py b/data/data-pipeline/data_pipeline/tests/sources/example/test_etl.py index acc64c9ee..5beb872cc 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/example/test_etl.py +++ b/data/data-pipeline/data_pipeline/tests/sources/example/test_etl.py @@ -120,6 +120,7 @@ def test_init_base(self, mock_etl, mock_paths): # Setup etl = self._get_instance_of_etl_class() etl.__init__() + data_path, tmp_path = mock_paths assert etl.DATA_PATH == data_path @@ -367,9 +368,14 @@ def test_validate_base(self, mock_etl, mock_paths): etl_with_duplicate_geo_field.output_df = actual_output_df.copy( deep=True ) + etl_with_duplicate_geo_field.output_df.reset_index(inplace=True) etl_with_duplicate_geo_field.output_df.loc[ 0:1, ExtractTransformLoad.GEOID_TRACT_FIELD_NAME - ] = "06007040300" + ] = etl_with_duplicate_geo_field.output_df[ + ExtractTransformLoad.GEOID_TRACT_FIELD_NAME + ].iloc[ + 0 + ] with pytest.raises(ValueError) as error: etl_with_duplicate_geo_field.validate() assert str(error.value).startswith("Duplicate values:") @@ -440,7 +446,7 @@ def test_validate_base(self, mock_etl, mock_paths): # Remove another column to keep and make sure error occurs. etl_with_missing_column = copy.deepcopy(etl) - columns_to_keep = actual_output_df.columns[:-1] + columns_to_keep = etl.COLUMNS_TO_KEEP[:-1] etl_with_missing_column.output_df = actual_output_df[columns_to_keep] with pytest.raises(ValueError) as error: etl_with_missing_column.validate() From ecc147a9624be83a0d63a2416570d178ff35c568 Mon Sep 17 00:00:00 2001 From: Matthew Bowen Date: Wed, 27 Jul 2022 17:17:34 -0400 Subject: [PATCH 07/23] Add tests for DOE energy budren (1518 --- .../etl/sources/doe_energy_burden/etl.py | 17 ++-- .../sources/doe_energy_burden/__init__.py | 0 .../data/DOE_LEAD_AMI_TRACT_2018_ALL.csv.zip | Bin 0 -> 376 bytes .../doe_energy_burden/data/extract.csv | 16 ++++ .../sources/doe_energy_burden/data/output.csv | 16 ++++ .../doe_energy_burden/data/transform.csv | 16 ++++ .../sources/doe_energy_burden/test_etl.py | 82 ++++++++++++++++++ 7 files changed, 140 insertions(+), 7 deletions(-) create mode 100644 data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/__init__.py create mode 100644 data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/DOE_LEAD_AMI_TRACT_2018_ALL.csv.zip create mode 100644 data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/extract.csv create mode 100644 data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/output.csv create mode 100644 data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/transform.csv create mode 100644 data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/test_etl.py diff --git a/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py b/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py index 80407d390..92594f899 100644 --- a/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py +++ b/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py @@ -2,18 +2,22 @@ import pandas as pd from data_pipeline.config import settings -from data_pipeline.etl.base import ExtractTransformLoad +from data_pipeline.etl.base import ExtractTransformLoad, ValidGeoLevel from data_pipeline.utils import get_module_logger, unzip_file_from_url logger = get_module_logger(__name__) class DOEEnergyBurden(ExtractTransformLoad): + NAME = "doe_energy_burden" + SOURCE_URL: str = ( + settings.AWS_JUSTICE40_DATASOURCES_URL + + "/DOE_LEAD_AMI_TRACT_2018_ALL.csv.zip" + ) + GEO_LEVEL = ValidGeoLevel.CENSUS_TRACT + def __init__(self): - self.DOE_FILE_URL = ( - settings.AWS_JUSTICE40_DATASOURCES_URL - + "/DOE_LEAD_AMI_TRACT_2018_ALL.csv.zip" - ) + self.DOE_FILE_URL = self.SOURCE_URL self.OUTPUT_PATH: Path = ( self.DATA_PATH / "dataset" / "doe_energy_burden" @@ -38,12 +42,11 @@ def extract(self) -> None: unzip_file_from_url( file_url=self.DOE_FILE_URL, download_path=self.get_tmp_path(), - unzipped_file_path=self.get_tmp_path() / "doe_energy_burden", + unzipped_file_path=self.get_tmp_path() ) self.raw_df = pd.read_csv( filepath_or_buffer=self.get_tmp_path() - / "doe_energy_burden" / "DOE_LEAD_AMI_TRACT_2018_ALL.csv", # The following need to remain as strings for all of their digits, not get converted to numbers. dtype={ diff --git a/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/__init__.py b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/DOE_LEAD_AMI_TRACT_2018_ALL.csv.zip b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/DOE_LEAD_AMI_TRACT_2018_ALL.csv.zip new file mode 100644 index 0000000000000000000000000000000000000000..44af808ec369897921b248863fb9a9c634734042 GIT binary patch literal 376 zcmWIWW@Zs#U|`^2IMwhwr0_UX$Pys0n~{M*oiz9_ex>jI!+Y}l+Zorm_#FDm zFjvEb?kJQEdPDNH(}AgF1Xal*~B@e^O-veYRl8JnG#d2}|Fx^Vn=+!D^}QZ(Uu zAB(QFNOt76fR;B2+Ttl?8{Rgq(Tl(SplMmz{OBv!Bgzd{e6L+2ru{|y_9?Mq&2Jmy x1H2iT1D;r2VBM_zn>AxTj0{~j%e(3-J literal 0 HcmV?d00001 diff --git a/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/extract.csv b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/extract.csv new file mode 100644 index 000000000..1820c356a --- /dev/null +++ b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/extract.csv @@ -0,0 +1,16 @@ +ABV,FIP,BURDEN,QUANTILE +HI,15001021010,0.0380000000,30 +HI,15001021101,0.0410000000,25 +HI,15001021402,0.0240000000,66 +HI,15001021800,0.0290000000,51 +HI,15003010201,0.0270000000,58 +HI,15007040603,0.0440000000,21 +HI,15007040604,0.0330000000,40 +HI,15007040700,0.0260000000,59 +HI,15009030100,0.0350000000,37 +HI,15009030201,0.0220000000,71 +HI,15009030402,0.0200000000,75 +HI,15009030800,0.0190000000,80 +CA,6007040300,0.2000000000,70 +CA,6007040500,0.5000000000,50 +CA,6001020100,0.1990000000,30 diff --git a/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/output.csv b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/output.csv new file mode 100644 index 000000000..218fde8e2 --- /dev/null +++ b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/output.csv @@ -0,0 +1,16 @@ +GEOID10_TRACT,Energy burden +15001021010,0.0380000000 +15001021101,0.0410000000 +15001021402,0.0240000000 +15001021800,0.0290000000 +15003010201,0.0270000000 +15007040603,0.0440000000 +15007040604,0.0330000000 +15007040700,0.0260000000 +15009030100,0.0350000000 +15009030201,0.0220000000 +15009030402,0.0200000000 +15009030800,0.0190000000 +06007040300,0.2000000000 +06007040500,0.5000000000 +06001020100,0.1990000000 diff --git a/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/transform.csv b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/transform.csv new file mode 100644 index 000000000..59808a83c --- /dev/null +++ b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/transform.csv @@ -0,0 +1,16 @@ +ABV,GEOID10_TRACT,Energy burden,QUANTILE +HI,15001021010,0.0380000000,30 +HI,15001021101,0.0410000000,25 +HI,15001021402,0.0240000000,66 +HI,15001021800,0.0290000000,51 +HI,15003010201,0.0270000000,58 +HI,15007040603,0.0440000000,21 +HI,15007040604,0.0330000000,40 +HI,15007040700,0.0260000000,59 +HI,15009030100,0.0350000000,37 +HI,15009030201,0.0220000000,71 +HI,15009030402,0.0200000000,75 +HI,15009030800,0.0190000000,80 +CA,06007040300,0.2000000000,70 +CA,06007040500,0.5000000000,50 +CA,06001020100,0.1990000000,30 diff --git a/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/test_etl.py b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/test_etl.py new file mode 100644 index 000000000..aa5e2824c --- /dev/null +++ b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/test_etl.py @@ -0,0 +1,82 @@ +# pylint: disable=protected-access +from unittest import mock +import pathlib +import requests + +from data_pipeline.etl.sources.doe_energy_burden.etl import ( + DOEEnergyBurden, +) +from data_pipeline.tests.sources.example.test_etl import TestETL +from data_pipeline.utils import get_module_logger + +logger = get_module_logger(__name__) + + +class TestDOEEnergyBurdenETL(TestETL): + """Tests the COI ETL. + + This uses pytest-snapshot. + To update individual snapshots: $ poetry run pytest + data_pipeline/tests/sources/ndoe_energy_burden/test_etl.py::TestClassNameETL:: + --snapshot-update + """ + + _ETL_CLASS = DOEEnergyBurden + + _SAMPLE_DATA_PATH = pathlib.Path(__file__).parents[0] / "data" + _SAMPLE_DATA_FILE_NAME = "DOE_LEAD_AMI_TRACT_2018_ALL.csv" + _SAMPLE_DATA_ZIP_FILE_NAME = "DOE_LEAD_AMI_TRACT_2018_ALL.csv.zip" + _EXTRACT_TMP_FOLDER_NAME = "DOEEnergyBurden" + _EXTRACT_CSV_FILE_NAME = "extract.csv" + + def setup_method(self, _method, filename=__file__): + """Invoke `setup_method` from Parent, but using the current file name. + + This code can be copied identically between all child classes. + """ + super().setup_method(_method=_method, filename=filename) + + # XXX: Refactor since I just straight copied it out of NRI's + def _setup_etl_instance_and_run_extract(self, mock_etl, mock_paths): + with mock.patch("data_pipeline.utils.requests") as requests_mock: + zip_file_fixture_src = self._DATA_DIRECTORY_FOR_TEST / self._SAMPLE_DATA_ZIP_FILE_NAME + tmp_path = mock_paths[1] + + # Create mock response. + with open(zip_file_fixture_src, mode="rb") as file: + file_contents = file.read() + response_mock = requests.Response() + response_mock.status_code = 200 + # pylint: disable=protected-access + response_mock._content = file_contents + # Return text fixture: + requests_mock.get = mock.MagicMock(return_value=response_mock) + + # Instantiate the ETL class. + etl = self._ETL_CLASS() + + # Monkey-patch the temporary directory to the one used in the test + etl.TMP_PATH = tmp_path + + # Run the extract method. + etl.extract() + + return etl + + def test_init(self, mock_etl, mock_paths): + """Tests that the ChildOpportunityIndexETL class was initialized + correctly. + """ + + etl = DOEEnergyBurden() + data_path, _ = mock_paths + assert etl.DATA_PATH == data_path + assert etl.COLUMNS_TO_KEEP == [ + "GEOID10_TRACT", + "Energy burden" + ] + assert etl.GEOID_FIELD_NAME == "GEOID10" + assert etl.GEOID_TRACT_FIELD_NAME == "GEOID10_TRACT" + assert etl.TRACT_INPUT_COLUMN_NAME == "FIP" + assert etl.INPUT_ENERGY_BURDEN_FIELD_NAME == "BURDEN" + assert etl.REVISED_ENERGY_BURDEN_FIELD_NAME == "Energy burden" From b40076e66c83766ce1c09747bc3f563fc5f1112a Mon Sep 17 00:00:00 2001 From: Matthew Bowen Date: Wed, 27 Jul 2022 17:18:33 -0400 Subject: [PATCH 08/23] Add dataset config for energy budren (1518) --- .../data_pipeline/etl/score/config/datasets.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml b/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml index 944516d48..606719fc8 100644 --- a/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml +++ b/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml @@ -115,3 +115,18 @@ datasets: include_in_csv: true include_in_excel: true column_position: 4 + - long_name: "Low-Income Energy Affordabililty Data" + short_name: "LEAD" + module_name: "doe_energy_burden" + description: "Census-tract-level energy budren calculations based on DOE's LEAD tool" + input_geoid_tract_field_name: "FIP" + load_fields: + - short_name: "budren" + df_field_name: "REVISED_ENERGY_BURDEN_FIELD_NAME" + long_name: "Energy burden" + field_type: float + include_in_tiles: true + include_in_csv: true + include_in_excel: true + column_position: 1 + \ No newline at end of file From b38efcceff68b2c6c2fd8efe7988292f3a242095 Mon Sep 17 00:00:00 2001 From: Matthew Bowen Date: Wed, 27 Jul 2022 17:35:56 -0400 Subject: [PATCH 09/23] Refactor ETL to use datasets.yml (#1518) --- .../etl/sources/doe_energy_burden/etl.py | 42 +++++++------------ .../sources/doe_energy_burden/test_etl.py | 2 +- 2 files changed, 15 insertions(+), 29 deletions(-) diff --git a/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py b/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py index 92594f899..a25dfb70f 100644 --- a/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py +++ b/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py @@ -3,7 +3,7 @@ from data_pipeline.config import settings from data_pipeline.etl.base import ExtractTransformLoad, ValidGeoLevel -from data_pipeline.utils import get_module_logger, unzip_file_from_url +from data_pipeline.utils import get_module_logger logger = get_module_logger(__name__) @@ -16,52 +16,41 @@ class DOEEnergyBurden(ExtractTransformLoad): ) GEO_LEVEL = ValidGeoLevel.CENSUS_TRACT + REVISED_ENERGY_BURDEN_FIELD_NAME: str + def __init__(self): - self.DOE_FILE_URL = self.SOURCE_URL + self.DATASET_CONFIG = super().yaml_config_load() self.OUTPUT_PATH: Path = ( self.DATA_PATH / "dataset" / "doe_energy_burden" ) - - self.TRACT_INPUT_COLUMN_NAME = "FIP" self.INPUT_ENERGY_BURDEN_FIELD_NAME = "BURDEN" - self.REVISED_ENERGY_BURDEN_FIELD_NAME = "Energy burden" - - # Constants for output - self.COLUMNS_TO_KEEP = [ - self.GEOID_TRACT_FIELD_NAME, - self.REVISED_ENERGY_BURDEN_FIELD_NAME, - ] self.raw_df: pd.DataFrame self.output_df: pd.DataFrame def extract(self) -> None: - logger.info("Starting data download.") - - unzip_file_from_url( - file_url=self.DOE_FILE_URL, - download_path=self.get_tmp_path(), - unzipped_file_path=self.get_tmp_path() + # TODO: Make these defaults so etract can be blank most of the time + super().extract( + source_url=self.SOURCE_URL, extract_path=self.get_tmp_path() ) - self.raw_df = pd.read_csv( + def transform(self) -> None: + logger.info("Starting transforms.") + raw_df: pd.DataFrame = pd.read_csv( filepath_or_buffer=self.get_tmp_path() / "DOE_LEAD_AMI_TRACT_2018_ALL.csv", # The following need to remain as strings for all of their digits, not get converted to numbers. dtype={ - self.TRACT_INPUT_COLUMN_NAME: "string", + self.INPUT_GEOID_TRACT_FIELD_NAME: "string", }, low_memory=False, ) - def transform(self) -> None: - logger.info("Starting transforms.") - - output_df = self.raw_df.rename( + output_df = raw_df.rename( columns={ self.INPUT_ENERGY_BURDEN_FIELD_NAME: self.REVISED_ENERGY_BURDEN_FIELD_NAME, - self.TRACT_INPUT_COLUMN_NAME: self.GEOID_TRACT_FIELD_NAME, + self.INPUT_GEOID_TRACT_FIELD_NAME: self.GEOID_TRACT_FIELD_NAME, } ) @@ -78,7 +67,4 @@ def transform(self) -> None: def load(self) -> None: logger.info("Saving DOE Energy Burden CSV") - self.OUTPUT_PATH.mkdir(parents=True, exist_ok=True) - self.output_df[self.COLUMNS_TO_KEEP].to_csv( - path_or_buf=self.OUTPUT_PATH / "usa.csv", index=False - ) + super().load(float_format="%.10f") diff --git a/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/test_etl.py b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/test_etl.py index aa5e2824c..548b356f7 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/test_etl.py +++ b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/test_etl.py @@ -77,6 +77,6 @@ def test_init(self, mock_etl, mock_paths): ] assert etl.GEOID_FIELD_NAME == "GEOID10" assert etl.GEOID_TRACT_FIELD_NAME == "GEOID10_TRACT" - assert etl.TRACT_INPUT_COLUMN_NAME == "FIP" + assert etl.INPUT_GEOID_TRACT_FIELD_NAME == "FIP" assert etl.INPUT_ENERGY_BURDEN_FIELD_NAME == "BURDEN" assert etl.REVISED_ENERGY_BURDEN_FIELD_NAME == "Energy burden" From edf91785b68d725f927d32743fe17b89503437af Mon Sep 17 00:00:00 2001 From: matt bowen Date: Tue, 2 Aug 2022 10:04:20 -0400 Subject: [PATCH 10/23] Add fake GEOIDs to COI tests (#1518) --- .../child_opportunity_index/data/coi.zip | Bin 5676 -> 5857 bytes .../child_opportunity_index/data/output.csv | 3 + .../child_opportunity_index/data/raw.csv | 53 +++++++++--------- .../data/transform.csv | 29 +++++----- .../child_opportunity_index/test_etl.py | 14 ----- 5 files changed, 47 insertions(+), 52 deletions(-) diff --git a/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/coi.zip b/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/coi.zip index 9c9f0315245f3a0f9034d6dfa041a2def6121f4f..0009fdb8c83d38f82ded63cb0a750cf43a58156a 100644 GIT binary patch delta 3884 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 delta 3675 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 Date: Tue, 2 Aug 2022 10:24:47 -0400 Subject: [PATCH 11/23] Refactor _setup_etl_instance_and_run_extract to base (#1518) For the three classes we've done so far, a generic _setup_etl_instance_and_run_extract will work fine, for the moment we can reuse the same setup method until we decide future classes need more flexibility --- but they can also always subclass so... --- .../child_opportunity_index/test_etl.py | 29 --------------- .../sources/doe_energy_burden/test_etl.py | 34 +----------------- .../tests/sources/example/test_etl.py | 36 +++++++++++++------ .../sources/national_risk_index/test_etl.py | 29 --------------- 4 files changed, 27 insertions(+), 101 deletions(-) diff --git a/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/test_etl.py b/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/test_etl.py index 4d6affbcd..f246a0c0d 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/test_etl.py +++ b/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/test_etl.py @@ -1,7 +1,5 @@ # pylint: disable=protected-access -from unittest import mock import pathlib -import requests from data_pipeline.etl.sources.child_opportunity_index.etl import ( ChildOpportunityIndex, @@ -36,33 +34,6 @@ def setup_method(self, _method, filename=__file__): """ super().setup_method(_method=_method, filename=filename) - # XXX: Refactor since I just straight copied it out of NRI's - def _setup_etl_instance_and_run_extract(self, mock_etl, mock_paths): - with mock.patch("data_pipeline.utils.requests") as requests_mock: - zip_file_fixture_src = self._DATA_DIRECTORY_FOR_TEST / "coi.zip" - tmp_path = mock_paths[1] - - # Create mock response. - with open(zip_file_fixture_src, mode="rb") as file: - file_contents = file.read() - response_mock = requests.Response() - response_mock.status_code = 200 - # pylint: disable=protected-access - response_mock._content = file_contents - # Return text fixture: - requests_mock.get = mock.MagicMock(return_value=response_mock) - - # Instantiate the ETL class. - etl = ChildOpportunityIndex() - - # Monkey-patch the temporary directory to the one used in the test - etl.TMP_PATH = tmp_path - - # Run the extract method. - etl.extract() - - return etl - def test_init(self, mock_etl, mock_paths): """Tests that the ChildOpportunityIndexETL class was initialized correctly. diff --git a/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/test_etl.py b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/test_etl.py index 548b356f7..c3eaf6677 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/test_etl.py +++ b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/test_etl.py @@ -1,7 +1,5 @@ # pylint: disable=protected-access -from unittest import mock import pathlib -import requests from data_pipeline.etl.sources.doe_energy_burden.etl import ( DOEEnergyBurden, @@ -36,33 +34,6 @@ def setup_method(self, _method, filename=__file__): """ super().setup_method(_method=_method, filename=filename) - # XXX: Refactor since I just straight copied it out of NRI's - def _setup_etl_instance_and_run_extract(self, mock_etl, mock_paths): - with mock.patch("data_pipeline.utils.requests") as requests_mock: - zip_file_fixture_src = self._DATA_DIRECTORY_FOR_TEST / self._SAMPLE_DATA_ZIP_FILE_NAME - tmp_path = mock_paths[1] - - # Create mock response. - with open(zip_file_fixture_src, mode="rb") as file: - file_contents = file.read() - response_mock = requests.Response() - response_mock.status_code = 200 - # pylint: disable=protected-access - response_mock._content = file_contents - # Return text fixture: - requests_mock.get = mock.MagicMock(return_value=response_mock) - - # Instantiate the ETL class. - etl = self._ETL_CLASS() - - # Monkey-patch the temporary directory to the one used in the test - etl.TMP_PATH = tmp_path - - # Run the extract method. - etl.extract() - - return etl - def test_init(self, mock_etl, mock_paths): """Tests that the ChildOpportunityIndexETL class was initialized correctly. @@ -71,10 +42,7 @@ def test_init(self, mock_etl, mock_paths): etl = DOEEnergyBurden() data_path, _ = mock_paths assert etl.DATA_PATH == data_path - assert etl.COLUMNS_TO_KEEP == [ - "GEOID10_TRACT", - "Energy burden" - ] + assert etl.COLUMNS_TO_KEEP == ["GEOID10_TRACT", "Energy burden"] assert etl.GEOID_FIELD_NAME == "GEOID10" assert etl.GEOID_TRACT_FIELD_NAME == "GEOID10_TRACT" assert etl.INPUT_GEOID_TRACT_FIELD_NAME == "FIP" diff --git a/data/data-pipeline/data_pipeline/tests/sources/example/test_etl.py b/data/data-pipeline/data_pipeline/tests/sources/example/test_etl.py index 5beb872cc..713e07b6b 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/example/test_etl.py +++ b/data/data-pipeline/data_pipeline/tests/sources/example/test_etl.py @@ -3,8 +3,10 @@ import os import pathlib from typing import Type +from unittest import mock import pytest +import requests import numpy as np import pandas as pd @@ -98,18 +100,32 @@ def _setup_etl_instance_and_run_extract( In order to re-implement this method, usually it will involve a decent amount of work to monkeypatch `requests` or another method that's used to retrieve data in order to force that method to retrieve the fixture - data. + data. A basic version of that patching is included here for classes that can use it. """ - # When running this in child classes, make sure the child class re-implements - # this method. - if self._ETL_CLASS is not ExampleETL: - raise NotImplementedError( - "Prepare and run extract method not defined for this class." + with mock.patch("data_pipeline.utils.requests") as requests_mock: + zip_file_fixture_src = ( + self._DATA_DIRECTORY_FOR_TEST / self._SAMPLE_DATA_ZIP_FILE_NAME ) - - # The rest of this method applies for `ExampleETL` only. - etl = self._get_instance_of_etl_class() - etl.extract() + tmp_path = mock_paths[1] + + # Create mock response. + with open(zip_file_fixture_src, mode="rb") as file: + file_contents = file.read() + response_mock = requests.Response() + response_mock.status_code = 200 + # pylint: disable=protected-access + response_mock._content = file_contents + # Return text fixture: + requests_mock.get = mock.MagicMock(return_value=response_mock) + + # Instantiate the ETL class. + etl = self._ETL_CLASS() + + # Monkey-patch the temporary directory to the one used in the test + etl.TMP_PATH = tmp_path + + # Run the extract method. + etl.extract() return etl diff --git a/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/test_etl.py b/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/test_etl.py index f428565f3..4892e40a9 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/test_etl.py +++ b/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/test_etl.py @@ -36,35 +36,6 @@ def setup_method(self, _method, filename=__file__): """ super().setup_method(_method=_method, filename=filename) - def _setup_etl_instance_and_run_extract(self, mock_etl, mock_paths): - with mock.patch("data_pipeline.utils.requests") as requests_mock: - zip_file_fixture_src = ( - self._DATA_DIRECTORY_FOR_TEST / "NRI_Table_CensusTracts.zip" - ) - tmp_path = mock_paths[1] - - # Create mock response. - with open(zip_file_fixture_src, mode="rb") as file: - file_contents = file.read() - response_mock = requests.Response() - response_mock.status_code = 200 - # pylint: disable=protected-access - response_mock._content = file_contents - - # Return text fixture: - requests_mock.get = mock.MagicMock(return_value=response_mock) - - # Instantiate the ETL class. - etl = NationalRiskIndexETL() - - # Monkey-patch the temporary directory to the one used in the test - etl.TMP_PATH = tmp_path - - # Run the extract method. - etl.extract() - - return etl - def test_init(self, mock_etl, mock_paths): """Tests that the mock NationalRiskIndexETL class instance was initiliazed correctly. From 6f2442982bb7acde1730ce366a74016fa5504418 Mon Sep 17 00:00:00 2001 From: matt bowen Date: Tue, 2 Aug 2022 10:59:18 -0400 Subject: [PATCH 12/23] Add output-path tests (#1518) --- .../sources/child_opportunity_index/test_etl.py | 11 +++++++++++ .../tests/sources/doe_energy_burden/test_etl.py | 13 ++++++++++++- .../tests/sources/national_risk_index/test_etl.py | 2 -- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/test_etl.py b/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/test_etl.py index f246a0c0d..7183f9113 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/test_etl.py +++ b/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/test_etl.py @@ -56,3 +56,14 @@ def test_init(self, mock_etl, mock_paths): assert etl.HEALTHY_FOOD_INPUT_FIELD == "HE_FOOD" assert etl.IMPENETRABLE_SURFACES_INPUT_FIELD == "HE_GREEN" assert etl.READING_INPUT_FIELD == "ED_READING" + + def test_get_output_file_path(self, mock_etl, mock_paths): + """Tests the right file name is returned.""" + etl = self._ETL_CLASS() + data_path, tmp_path = mock_paths + + output_file_path = etl._get_output_file_path() + expected_output_file_path = ( + data_path / "dataset" / "child_opportunity_index" / "usa.csv" + ) + assert output_file_path == expected_output_file_path diff --git a/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/test_etl.py b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/test_etl.py index c3eaf6677..efa70d579 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/test_etl.py +++ b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/test_etl.py @@ -15,7 +15,7 @@ class TestDOEEnergyBurdenETL(TestETL): This uses pytest-snapshot. To update individual snapshots: $ poetry run pytest - data_pipeline/tests/sources/ndoe_energy_burden/test_etl.py::TestClassNameETL:: + data_pipeline/tests/sources/doe_energy_burden/test_etl.py::TestClassNameETL:: --snapshot-update """ @@ -48,3 +48,14 @@ def test_init(self, mock_etl, mock_paths): assert etl.INPUT_GEOID_TRACT_FIELD_NAME == "FIP" assert etl.INPUT_ENERGY_BURDEN_FIELD_NAME == "BURDEN" assert etl.REVISED_ENERGY_BURDEN_FIELD_NAME == "Energy burden" + + def test_get_output_file_path(self, mock_etl, mock_paths): + """Tests the right file name is returned.""" + etl = self._ETL_CLASS() + data_path, tmp_path = mock_paths + + output_file_path = etl._get_output_file_path() + expected_output_file_path = ( + data_path / "dataset" / "doe_energy_burden" / "usa.csv" + ) + assert output_file_path == expected_output_file_path diff --git a/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/test_etl.py b/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/test_etl.py index 4892e40a9..5839c61d4 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/test_etl.py +++ b/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/test_etl.py @@ -1,7 +1,5 @@ # pylint: disable=protected-access -from unittest import mock import pathlib -import requests from data_pipeline.etl.base import ValidGeoLevel from data_pipeline.etl.sources.national_risk_index.etl import ( From 0349dbdb347ee4a4cd882bc4a481c931a2de4959 Mon Sep 17 00:00:00 2001 From: matt bowen Date: Tue, 2 Aug 2022 15:16:21 -0400 Subject: [PATCH 13/23] Update YAML to match constant (#1518) --- .../data_pipeline/etl/score/config/datasets.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml b/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml index 606719fc8..db0c53c21 100644 --- a/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml +++ b/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml @@ -87,7 +87,7 @@ datasets: df_field_name: "EXTREME_HEAT_FIELD" long_name: "Summer days above 90F" field_type: float - include_in_tiles: true + include_in_tiles: false include_in_csv: true include_in_excel: true column_position: 1 @@ -96,14 +96,14 @@ datasets: df_field_name: "HEALTHY_FOOD_FIELD" field_type: float include_in_tiles: true - include_in_csv: true + include_in_csv: false include_in_excel: true column_position: 2 - short_name: "he_green" long_name: "Percent impenetrable surface areas" df_field_name: "IMPENETRABLE_SURFACES_FIELD" field_type: float - include_in_tiles: true + include_in_tiles: false include_in_csv: true include_in_excel: true column_position: 3 @@ -111,7 +111,7 @@ datasets: df_field_name: "READING_FIELD" long_name: "Third grade reading proficiency" field_type: float - include_in_tiles: true + include_in_tiles: false include_in_csv: true include_in_excel: true column_position: 4 @@ -121,7 +121,7 @@ datasets: description: "Census-tract-level energy budren calculations based on DOE's LEAD tool" input_geoid_tract_field_name: "FIP" load_fields: - - short_name: "budren" + - short_name: "EBP_PFS" df_field_name: "REVISED_ENERGY_BURDEN_FIELD_NAME" long_name: "Energy burden" field_type: float From 11e5a10ab34de6cd2933fbe84c29cb630547a98b Mon Sep 17 00:00:00 2001 From: matt bowen Date: Tue, 2 Aug 2022 15:36:37 -0400 Subject: [PATCH 14/23] Don't blindly set float format (#1518) --- .../data_pipeline/etl/sources/child_opportunity_index/etl.py | 4 +--- .../data_pipeline/etl/sources/doe_energy_burden/etl.py | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py b/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py index 68d8ddbad..6f55458c9 100644 --- a/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py +++ b/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py @@ -110,6 +110,4 @@ def transform(self) -> None: def load(self) -> None: logger.info("Saving CSV") - ### XXX: Should we do this in the super().load too? - self.OUTPUT_PATH.mkdir(parents=True, exist_ok=True) - super().load(float_format="%.10f") + super().load() diff --git a/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py b/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py index a25dfb70f..862943456 100644 --- a/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py +++ b/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py @@ -67,4 +67,4 @@ def transform(self) -> None: def load(self) -> None: logger.info("Saving DOE Energy Burden CSV") - super().load(float_format="%.10f") + super().load() From e19f31ba87b3546a2cd510579eae43e013fec4d2 Mon Sep 17 00:00:00 2001 From: matt bowen Date: Tue, 2 Aug 2022 15:50:25 -0400 Subject: [PATCH 15/23] Add defaults for extract (#1518) --- data/data-pipeline/data_pipeline/etl/base.py | 20 +++++++++++-------- .../etl/sources/doe_energy_burden/etl.py | 6 ------ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/data/data-pipeline/data_pipeline/etl/base.py b/data/data-pipeline/data_pipeline/etl/base.py index 873aa74c5..21f008ccc 100644 --- a/data/data-pipeline/data_pipeline/etl/base.py +++ b/data/data-pipeline/data_pipeline/etl/base.py @@ -176,14 +176,18 @@ def extract( to get the file from a source url, unzips it and stores it on an extract_path.""" - # this can be accessed via super().extract() - if source_url and extract_path: - unzip_file_from_url( - file_url=source_url, - download_path=self.get_tmp_path(), - unzipped_file_path=extract_path, - verify=verify, - ) + if source_url is None: + source_url = self.SOURCE_URL + + if extract_path is None: + extract_path = self.get_tmp_path() + + unzip_file_from_url( + file_url=source_url, + download_path=self.get_tmp_path(), + unzipped_file_path=extract_path, + verify=verify, + ) def transform(self) -> None: """Transform the data extracted into a format that can be consumed by the diff --git a/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py b/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py index 862943456..6250aaff9 100644 --- a/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py +++ b/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py @@ -29,12 +29,6 @@ def __init__(self): self.raw_df: pd.DataFrame self.output_df: pd.DataFrame - def extract(self) -> None: - # TODO: Make these defaults so etract can be blank most of the time - super().extract( - source_url=self.SOURCE_URL, extract_path=self.get_tmp_path() - ) - def transform(self) -> None: logger.info("Starting transforms.") raw_df: pd.DataFrame = pd.read_csv( From 0808e8a1708b09c609e74eb90a44ce4855cc22eb Mon Sep 17 00:00:00 2001 From: matt bowen Date: Tue, 2 Aug 2022 16:24:38 -0400 Subject: [PATCH 16/23] Run YAML load on all subclasses (#1518) --- data/data-pipeline/data_pipeline/etl/base.py | 79 ++++++++++--------- .../etl/score/config/datasets.yml | 16 +++- .../sources/child_opportunity_index/etl.py | 1 - .../etl/sources/doe_energy_burden/etl.py | 2 - .../etl/sources/national_risk_index/etl.py | 3 - 5 files changed, 56 insertions(+), 45 deletions(-) diff --git a/data/data-pipeline/data_pipeline/etl/base.py b/data/data-pipeline/data_pipeline/etl/base.py index 21f008ccc..d93721910 100644 --- a/data/data-pipeline/data_pipeline/etl/base.py +++ b/data/data-pipeline/data_pipeline/etl/base.py @@ -98,48 +98,51 @@ class ExtractTransformLoad: # It is used on the "load" base class method output_df: pd.DataFrame = None + def __init_subclass__(cls) -> None: + cls.DATASET_CONFIG = cls.yaml_config_load() + @classmethod def yaml_config_load(cls) -> dict: """Generate config dictionary and set instance variables from YAML dataset.""" - - # check if the class instance has score YAML definitions - datasets_config = load_yaml_dict_from_file( - cls.DATASET_CONFIG / "datasets.yml", - DatasetsConfig, - ) - - # get the config for this dataset - try: - dataset_config = next( - item - for item in datasets_config.get("datasets") - if item["module_name"] == cls.NAME + if cls.NAME is not None: + # check if the class instance has score YAML definitions + datasets_config = load_yaml_dict_from_file( + cls.DATASET_CONFIG / "datasets.yml", + DatasetsConfig, ) - except StopIteration: - # Note: it'd be nice to log the name of the dataframe, but that's not accessible in this scope. - logger.error( - f"Exception encountered while extracting dataset config for dataset {cls.NAME}" - ) - sys.exit() - - # set some of the basic fields - cls.INPUT_GEOID_TRACT_FIELD_NAME = dataset_config[ - "input_geoid_tract_field_name" - ] - - # get the columns to write on the CSV - # and set the constants - cls.COLUMNS_TO_KEEP = [ - cls.GEOID_TRACT_FIELD_NAME, # always index with geoid tract id - ] - for field in dataset_config["load_fields"]: - cls.COLUMNS_TO_KEEP.append(field["long_name"]) - - # set the constants for the class - setattr(cls, field["df_field_name"], field["long_name"]) - - # return the config dict - return dataset_config + + # get the config for this dataset + try: + dataset_config = next( + item + for item in datasets_config.get("datasets") + if item["module_name"] == cls.NAME + ) + except StopIteration: + # Note: it'd be nice to log the name of the dataframe, but that's not accessible in this scope. + logger.error( + f"Exception encountered while extracting dataset config for dataset {cls.NAME}" + ) + sys.exit() + + # set some of the basic fields + cls.INPUT_GEOID_TRACT_FIELD_NAME = dataset_config[ + "input_geoid_tract_field_name" + ] + + # get the columns to write on the CSV + # and set the constants + cls.COLUMNS_TO_KEEP = [ + cls.GEOID_TRACT_FIELD_NAME, # always index with geoid tract id + ] + for field in dataset_config["load_fields"]: + cls.COLUMNS_TO_KEEP.append(field["long_name"]) + + # set the constants for the class + setattr(cls, field["df_field_name"], field["long_name"]) + + # return the config dict + return dataset_config # This is a classmethod so it can be used by `get_data_frame` without # needing to create an instance of the class. This is a use case in `etl_score`. diff --git a/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml b/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml index db0c53c21..a53018d8a 100644 --- a/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml +++ b/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml @@ -129,4 +129,18 @@ datasets: include_in_csv: true include_in_excel: true column_position: 1 - \ No newline at end of file + - long_name: "Exaple ETL" + short_name: "Example" + module_name: "example_dataset" + description: "An example dataset for documentation" + input_geoid_tract_field_name: "GEOID10_TRACT" + load_fields: + - short_name: "EXAMPLE_FIELD" + df_field_name: "Input Field 1" + long_name: "Example Field 1" + field_type: float + include_in_tiles: true + include_in_csv: true + include_in_excel: true + column_position: 1 + diff --git a/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py b/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py index 6f55458c9..beace4205 100644 --- a/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py +++ b/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py @@ -38,7 +38,6 @@ class ChildOpportunityIndex(ExtractTransformLoad): READING_FIELD: str def __init__(self): - self.DATASET_CONFIG = super().yaml_config_load() self.SOURCE_URL = ( "https://data.diversitydatakids.org/datastore/zip/f16fff12-b1e5-4f60-85d3-" "3a0ededa30a0?format=csv" diff --git a/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py b/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py index 6250aaff9..0f67c4023 100644 --- a/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py +++ b/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py @@ -19,8 +19,6 @@ class DOEEnergyBurden(ExtractTransformLoad): REVISED_ENERGY_BURDEN_FIELD_NAME: str def __init__(self): - self.DATASET_CONFIG = super().yaml_config_load() - self.OUTPUT_PATH: Path = ( self.DATA_PATH / "dataset" / "doe_energy_burden" ) diff --git a/data/data-pipeline/data_pipeline/etl/sources/national_risk_index/etl.py b/data/data-pipeline/data_pipeline/etl/sources/national_risk_index/etl.py index 5b14d79b8..0b7ff12eb 100644 --- a/data/data-pipeline/data_pipeline/etl/sources/national_risk_index/etl.py +++ b/data/data-pipeline/data_pipeline/etl/sources/national_risk_index/etl.py @@ -33,9 +33,6 @@ class NationalRiskIndexETL(ExtractTransformLoad): AGRIVALUE_LOWER_BOUND = 408000 def __init__(self): - # load YAML config - self.DATASET_CONFIG = super().yaml_config_load() - # define the full path for the input CSV file self.INPUT_CSV = self.get_tmp_path() / "NRI_Table_CensusTracts.csv" From dde220959749c01f39b8818a5fd100003b926dff Mon Sep 17 00:00:00 2001 From: matt bowen Date: Tue, 2 Aug 2022 17:21:01 -0400 Subject: [PATCH 17/23] Update description fields (#1518) --- .../data_pipeline/etl/score/config/datasets.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml b/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml index a53018d8a..2de775291 100644 --- a/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml +++ b/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml @@ -80,7 +80,8 @@ datasets: - long_name: "Child Opportunity Index 2.0 database" short_name: "coi" module_name: "child_opportunity_index" - description: "A composite index measured at the census tract level that captures neighborhood resources and conditions that matter for children's healthy development." + description_short: "A composite index measured at the census tract level that captures neighborhood resources and conditions that matter for children's healthy development." + description_long: "A composite index measured at the census tract level that captures neighborhood resources and conditions that matter for children's healthy development." input_geoid_tract_field_name: "geoid" load_fields: - short_name: "he_heat" @@ -118,7 +119,8 @@ datasets: - long_name: "Low-Income Energy Affordabililty Data" short_name: "LEAD" module_name: "doe_energy_burden" - description: "Census-tract-level energy budren calculations based on DOE's LEAD tool" + description_short: "Census-tract-level energy budren calculations based on DOE's LEAD tool" + description_long: "Census-tract-level energy budren calculations based on DOE's LEAD tool" input_geoid_tract_field_name: "FIP" load_fields: - short_name: "EBP_PFS" @@ -132,7 +134,8 @@ datasets: - long_name: "Exaple ETL" short_name: "Example" module_name: "example_dataset" - description: "An example dataset for documentation" + description_short: "An example dataset for documentation" + description_long: "An example dataset for documentation" input_geoid_tract_field_name: "GEOID10_TRACT" load_fields: - short_name: "EXAMPLE_FIELD" From 790b2e6a1221f93024b77185ed8249739d5665a5 Mon Sep 17 00:00:00 2001 From: matt bowen Date: Tue, 9 Aug 2022 16:22:02 -0400 Subject: [PATCH 18/23] Update YAML per final format (#1518) --- .../etl/score/config/datasets.yml | 36 +++++-------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml b/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml index 2de775291..13b06aedc 100644 --- a/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml +++ b/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml @@ -80,62 +80,46 @@ datasets: - long_name: "Child Opportunity Index 2.0 database" short_name: "coi" module_name: "child_opportunity_index" - description_short: "A composite index measured at the census tract level that captures neighborhood resources and conditions that matter for children's healthy development." - description_long: "A composite index measured at the census tract level that captures neighborhood resources and conditions that matter for children's healthy development." input_geoid_tract_field_name: "geoid" load_fields: - short_name: "he_heat" df_field_name: "EXTREME_HEAT_FIELD" long_name: "Summer days above 90F" field_type: float - include_in_tiles: false - include_in_csv: true - include_in_excel: true - column_position: 1 + include_in_downloadable_files: true + include_in_tiles: true - short_name: "he_food" long_name: "Percent low access to healthy food" df_field_name: "HEALTHY_FOOD_FIELD" field_type: float + include_in_downloadable_files: true include_in_tiles: true - include_in_csv: false - include_in_excel: true - column_position: 2 - short_name: "he_green" long_name: "Percent impenetrable surface areas" df_field_name: "IMPENETRABLE_SURFACES_FIELD" field_type: float - include_in_tiles: false - include_in_csv: true - include_in_excel: true - column_position: 3 + include_in_downloadable_files: true + include_in_tiles: true - short_name: "ed_reading" df_field_name: "READING_FIELD" long_name: "Third grade reading proficiency" field_type: float - include_in_tiles: false - include_in_csv: true - include_in_excel: true - column_position: 4 + include_in_downloadable_files: true + include_in_tiles: true - long_name: "Low-Income Energy Affordabililty Data" short_name: "LEAD" module_name: "doe_energy_burden" - description_short: "Census-tract-level energy budren calculations based on DOE's LEAD tool" - description_long: "Census-tract-level energy budren calculations based on DOE's LEAD tool" input_geoid_tract_field_name: "FIP" load_fields: - short_name: "EBP_PFS" df_field_name: "REVISED_ENERGY_BURDEN_FIELD_NAME" long_name: "Energy burden" field_type: float + include_in_downloadable_files: true include_in_tiles: true - include_in_csv: true - include_in_excel: true - column_position: 1 - long_name: "Exaple ETL" short_name: "Example" module_name: "example_dataset" - description_short: "An example dataset for documentation" - description_long: "An example dataset for documentation" input_geoid_tract_field_name: "GEOID10_TRACT" load_fields: - short_name: "EXAMPLE_FIELD" @@ -143,7 +127,5 @@ datasets: long_name: "Example Field 1" field_type: float include_in_tiles: true - include_in_csv: true - include_in_excel: true - column_position: 1 + include_in_downloadable_files: true From 2be776a4e721a75a94105d265d3a05a6e64948de Mon Sep 17 00:00:00 2001 From: matt bowen Date: Wed, 10 Aug 2022 10:38:16 -0400 Subject: [PATCH 19/23] Update fixture tract IDs (#1518) --- .../child_opportunity_index/data/coi.zip | Bin 5857 -> 5858 bytes .../child_opportunity_index/data/output.csv | 6 +++--- .../child_opportunity_index/data/raw.csv | 6 +++--- .../data/transform.csv | 6 +++--- .../data/DOE_LEAD_AMI_TRACT_2018_ALL.csv.zip | Bin 376 -> 382 bytes .../doe_energy_burden/data/extract.csv | 6 +++--- .../sources/doe_energy_burden/data/output.csv | 6 +++--- .../doe_energy_burden/data/transform.csv | 6 +++--- .../tests/sources/example/data/extract.csv | 6 +++--- .../tests/sources/example/data/input.zip | Bin 390 -> 366 bytes .../tests/sources/example/data/output.csv | 6 +++--- .../tests/sources/example/data/transform.csv | 6 +++--- .../tests/sources/example/test_etl.py | 6 +++--- .../data/NRI_Table_CensusTracts.zip | Bin 64366 -> 64404 bytes .../national_risk_index/data/extract.csv | 6 +++--- .../national_risk_index/data/output.csv | 6 +++--- .../national_risk_index/data/transform.csv | 6 +++--- 17 files changed, 39 insertions(+), 39 deletions(-) diff --git a/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/coi.zip b/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/coi.zip index 0009fdb8c83d38f82ded63cb0a750cf43a58156a..a5289deb1e6f4f324c09c9887ccfcedb86fb5c2a 100644 GIT binary patch delta 3631 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 B?KJ=Z delta 3634 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 E08O~diU0rr diff --git a/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/output.csv b/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/output.csv index 308861c9c..c3c2b73ef 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/output.csv +++ b/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/output.csv @@ -11,6 +11,6 @@ GEOID10_TRACT,Summer days above 90F,Percent low access to healthy food,Percent i 15009030201,,0.0000000000,,183.1507700000 15009030402,,0.0167432700,,165.8253500000 15009030800,,0.0145107520,,189.8833900000 -06007040300,,0.0150000000,,200.0000000000 -06001020100,,0.0150000000,,200.0000000000 -06007040500,,0.0150000000,,200.0000000000 +06027000800,,0.0150000000,,200.0000000000 +06061021322,,0.0150000000,,200.0000000000 +06069000802,,0.0150000000,,200.0000000000 diff --git a/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/raw.csv b/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/raw.csv index 52ab63f3e..be4748d5c 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/raw.csv +++ b/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/raw.csv @@ -23,6 +23,6 @@ geoid,year,in100,msaid15,A,msaname15,countyfips,statefips,stateusps,pop,ED_APENR 15009030402,2015,0,27980,22,"Kahului-Wailuku-Lahaina, HI Metro Area",15009,15,HI,1685,0.3768204500,25.8798220000,34.9604720000,69.9000020000,79.8403630000,208.5855100000,165.8253500000,56.9929960000,12.2689750000,2.8912144000,0.6931471800,1.6743270000,,,94.9152530000,,,3.1778426000,7.3098612000,-13.8155110000,1.4903787000,7.6546302000,5.0015731000,69.9591060000,27.6414090000,80619,85.7456740000,4.9374290000,27.2051010000 15009030800,2010,0,27980,23,"Kahului-Wailuku-Lahaina, HI Metro Area",15009,15,HI,1725,0.2588196400,25.8761410000,25.7107850000,59.5999980000,79.6580120000,222.2627900000,185.5475600000,50.3295820000,15.1613000000,3.4776812000,1.7540390000,1.0601417000,,,91.7269360000,,,6.5111756000,4.7154179000,-13.8155110000,4.9853492000,1.8906569000,8.0818968000,83.3512880000,34.2178340000,96516,83.9158250000,4.3561821000,30.5000000000 15009030800,2015,0,27980,24,"Kahului-Wailuku-Lahaina, HI Metro Area",15009,15,HI,2051,0.3132624300,28.6977020000,25.2963310000,58.4000020000,78.9907610000,184.0429400000,189.8833900000,50.4299890000,8.5740423000,3.5176146000,2.1515093000,1.4510752000,,,95.4700240000,,,2.7706735000,4.7154179000,-13.8155110000,4.4182396000,5.1701570000,5.6275120000,82.7601620000,33.0580600000,100117,85.9390640000,3.3368926000,23.8437820000 -6007040300,2015,0,25900,98,"Made up, Micro Area",704,6,CA,12,0.2000000000,25.0000000000,25.0000000000,25.0000000000,190.0000000000,200.0000000000,200.0000000000,50.0000000000,7.0000000000,1.5000000000,1.5000000000,1.5000000000,,,90.1000000000,,,3.1000000000,3.1000000000,-13.4400000000,4.4400000000,5.1700000000,5.6200000000,72.8000000000,33.5000000000,33333,58.0100000000,9.3300000000,32.3300000000 -6001020100,2015,0,25900,87,"Made up, Micro Area",102,6,CA,12,0.2000000000,25.0000000000,25.0000000000,25.0000000000,190.0000000000,200.0000000000,200.0000000000,50.0000000000,7.0000000000,1.5000000000,1.5000000000,1.5000000000,,,90.1000000000,,,3.1000000000,3.1000000000,-13.4400000000,4.4400000000,5.1700000000,5.6200000000,72.8000000000,33.5000000000,33333,58.0100000000,9.3300000000,32.3300000000 -6007040500,2015,0,25900,84,"Made up, Micro Area",704,6,CA,12,0.2000000000,25.0000000000,25.0000000000,25.0000000000,190.0000000000,200.0000000000,200.0000000000,50.0000000000,7.0000000000,1.5000000000,1.5000000000,1.5000000000,,,90.1000000000,,,3.1000000000,3.1000000000,-13.4400000000,4.4400000000,5.1700000000,5.6200000000,72.8000000000,33.5000000000,33333,58.0100000000,9.3300000000,32.3300000000 +6027000800,2015,0,25900,98,"Made up, Micro Area",704,6,CA,12,0.2000000000,25.0000000000,25.0000000000,25.0000000000,190.0000000000,200.0000000000,200.0000000000,50.0000000000,7.0000000000,1.5000000000,1.5000000000,1.5000000000,,,90.1000000000,,,3.1000000000,3.1000000000,-13.4400000000,4.4400000000,5.1700000000,5.6200000000,72.8000000000,33.5000000000,33333,58.0100000000,9.3300000000,32.3300000000 +6061021322,2015,0,25900,87,"Made up, Micro Area",102,6,CA,12,0.2000000000,25.0000000000,25.0000000000,25.0000000000,190.0000000000,200.0000000000,200.0000000000,50.0000000000,7.0000000000,1.5000000000,1.5000000000,1.5000000000,,,90.1000000000,,,3.1000000000,3.1000000000,-13.4400000000,4.4400000000,5.1700000000,5.6200000000,72.8000000000,33.5000000000,33333,58.0100000000,9.3300000000,32.3300000000 +6069000802,2015,0,25900,84,"Made up, Micro Area",704,6,CA,12,0.2000000000,25.0000000000,25.0000000000,25.0000000000,190.0000000000,200.0000000000,200.0000000000,50.0000000000,7.0000000000,1.5000000000,1.5000000000,1.5000000000,,,90.1000000000,,,3.1000000000,3.1000000000,-13.4400000000,4.4400000000,5.1700000000,5.6200000000,72.8000000000,33.5000000000,33333,58.0100000000,9.3300000000,32.3300000000 diff --git a/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/transform.csv b/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/transform.csv index 25b490523..5d049ab93 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/transform.csv +++ b/data/data-pipeline/data_pipeline/tests/sources/child_opportunity_index/data/transform.csv @@ -11,6 +11,6 @@ GEOID10_TRACT,year,in100,msaid15,A,msaname15,countyfips,statefips,stateusps,pop, 15009030201,2015,0,27980,20,"Kahului-Wailuku-Lahaina, HI Metro Area",15009,15,HI,304,0.3610763000,23.8664990000,27.8072380000,100.0000000000,81.1670530000,213.0963400000,183.1507700000,58.9944080000,6.7822700000,2.2015967000,0.0413851890,0.0000000000,,,90.6270220000,,,3.1697340000,3.4708600000,-13.8155110000,1.0144377000,10.5798570000,8.5106382000,68.0851060000,36.8266410000,61048,70.6093220000,4.2774568000,49.1525420000 15009030402,2015,0,27980,22,"Kahului-Wailuku-Lahaina, HI Metro Area",15009,15,HI,1685,0.3768204500,25.8798220000,34.9604720000,69.9000020000,79.8403630000,208.5855100000,165.8253500000,56.9929960000,12.2689750000,2.8912144000,0.6931471800,0.0167432700,,,94.9152530000,,,3.1778426000,7.3098612000,-13.8155110000,1.4903787000,7.6546302000,5.0015731000,69.9591060000,27.6414090000,80619,85.7456740000,4.9374290000,27.2051010000 15009030800,2015,0,27980,24,"Kahului-Wailuku-Lahaina, HI Metro Area",15009,15,HI,2051,0.3132624300,28.6977020000,25.2963310000,58.4000020000,78.9907610000,184.0429400000,189.8833900000,50.4299890000,8.5740423000,3.5176146000,2.1515093000,0.0145107520,,,95.4700240000,,,2.7706735000,4.7154179000,-13.8155110000,4.4182396000,5.1701570000,5.6275120000,82.7601620000,33.0580600000,100117,85.9390640000,3.3368926000,23.8437820000 -06007040300,2015,0,25900,98,"Made up, Micro Area",704,6,CA,12,0.2000000000,25.0000000000,25.0000000000,25.0000000000,190.0000000000,200.0000000000,200.0000000000,50.0000000000,7.0000000000,1.5000000000,1.5000000000,0.0150000000,,,90.1000000000,,,3.1000000000,3.1000000000,-13.4400000000,4.4400000000,5.1700000000,5.6200000000,72.8000000000,33.5000000000,33333,58.0100000000,9.3300000000,32.3300000000 -06001020100,2015,0,25900,87,"Made up, Micro Area",102,6,CA,12,0.2000000000,25.0000000000,25.0000000000,25.0000000000,190.0000000000,200.0000000000,200.0000000000,50.0000000000,7.0000000000,1.5000000000,1.5000000000,0.0150000000,,,90.1000000000,,,3.1000000000,3.1000000000,-13.4400000000,4.4400000000,5.1700000000,5.6200000000,72.8000000000,33.5000000000,33333,58.0100000000,9.3300000000,32.3300000000 -06007040500,2015,0,25900,84,"Made up, Micro Area",704,6,CA,12,0.2000000000,25.0000000000,25.0000000000,25.0000000000,190.0000000000,200.0000000000,200.0000000000,50.0000000000,7.0000000000,1.5000000000,1.5000000000,0.0150000000,,,90.1000000000,,,3.1000000000,3.1000000000,-13.4400000000,4.4400000000,5.1700000000,5.6200000000,72.8000000000,33.5000000000,33333,58.0100000000,9.3300000000,32.3300000000 +06027000800,2015,0,25900,98,"Made up, Micro Area",704,6,CA,12,0.2000000000,25.0000000000,25.0000000000,25.0000000000,190.0000000000,200.0000000000,200.0000000000,50.0000000000,7.0000000000,1.5000000000,1.5000000000,0.0150000000,,,90.1000000000,,,3.1000000000,3.1000000000,-13.4400000000,4.4400000000,5.1700000000,5.6200000000,72.8000000000,33.5000000000,33333,58.0100000000,9.3300000000,32.3300000000 +06061021322,2015,0,25900,87,"Made up, Micro Area",102,6,CA,12,0.2000000000,25.0000000000,25.0000000000,25.0000000000,190.0000000000,200.0000000000,200.0000000000,50.0000000000,7.0000000000,1.5000000000,1.5000000000,0.0150000000,,,90.1000000000,,,3.1000000000,3.1000000000,-13.4400000000,4.4400000000,5.1700000000,5.6200000000,72.8000000000,33.5000000000,33333,58.0100000000,9.3300000000,32.3300000000 +06069000802,2015,0,25900,84,"Made up, Micro Area",704,6,CA,12,0.2000000000,25.0000000000,25.0000000000,25.0000000000,190.0000000000,200.0000000000,200.0000000000,50.0000000000,7.0000000000,1.5000000000,1.5000000000,0.0150000000,,,90.1000000000,,,3.1000000000,3.1000000000,-13.4400000000,4.4400000000,5.1700000000,5.6200000000,72.8000000000,33.5000000000,33333,58.0100000000,9.3300000000,32.3300000000 diff --git a/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/DOE_LEAD_AMI_TRACT_2018_ALL.csv.zip b/data/data-pipeline/data_pipeline/tests/sources/doe_energy_burden/data/DOE_LEAD_AMI_TRACT_2018_ALL.csv.zip index 44af808ec369897921b248863fb9a9c634734042..32c1edae978e4dd44126f6390ed9a29ea36d9e97 100644 GIT binary patch delta 289 zcmeyt^p8n6z?+#xgn@y9gTc_BD^%@McFd}Y!us{TJ3lA=o%t}Sw1S&~k>v$50|S_d zy>OTBkOB|ugKFXXPmXM9{Zzd3Wsgc);NzPA?t(Yk4od6&a`ZoKP*>o~-*fu4(b)>U z!+-p~zpU7yxgl5oO`W*t@?=Pk_MK@K`|UMmFTstTUs^;x)eYDGrIgOih# zgN=1s!v7z*wvtDu^ucx>_Fmp3-^lL)688_v>3z6!a3A}gvah+keH@m*Z4~?;D+RWF zQn>$r>giig>CxmuqqC*T(n&Z$>6LW;Cx&7Gkv31o;ikUjg2%Y`{QZUAj1z92 zji2}um!(cg$=K|?%%d};snmtzzvGs0R+pj)*ZWv>twpjUzXi0sNzfKgDckV2agAR5 z^#@JM%H~I3xgJq&u;P2|8ZqrJ;EOm7$4xx$Rx*%=EcbpjJ65V-*$ww63R(-Y20qkW>wog-t7E)J z1fCUrk@_t=CBx#U$cIarOV%wpb=KMJ!4)G%t|eMhF}7kS?lCsVUA${{!P6*@Y4N=^ z|6O?xEOuVS-F@hmR{l=?C?-YLoW??NoyATnSHiFSNu1gdT5_{EZuJ(24N1(&izDx@ zYIEQ5_5bs&j5mTyQV#0}cr!A|G2;pf31FZwFaSe^VM!y1g%mKXkbpr8lmKs5HjqL_ MAoK^)oFKgn0GR@Y>i_@% literal 390 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 delta 57154 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 diff --git a/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/data/extract.csv b/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/data/extract.csv index 5e2f79e66..ce92d4f4c 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/data/extract.csv +++ b/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/data/extract.csv @@ -1,7 +1,7 @@ OID_,NRI_ID,STATE,STATEABBRV,STATEFIPS,COUNTY,COUNTYTYPE,COUNTYFIPS,STCOFIPS,TRACT,TRACTFIPS,POPULATION,BUILDVALUE,AGRIVALUE,AREA,RISK_SCORE,RISK_RATNG,RISK_NPCTL,RISK_SPCTL,EAL_SCORE,EAL_RATNG,EAL_NPCTL,EAL_SPCTL,EAL_VALT,EAL_VALB,EAL_VALP,EAL_VALPE,EAL_VALA,SOVI_SCORE,SOVI_RATNG,SOVI_NPCTL,SOVI_SPCTL,SOVI_VALUE,RESL_SCORE,RESL_RATNG,RESL_NPCTL,RESL_SPCTL,RESL_VALUE,AVLN_EVNTS,AVLN_AFREQ,AVLN_EXPB,AVLN_EXPP,AVLN_EXPPE,AVLN_EXPT,AVLN_HLRB,AVLN_HLRP,AVLN_HLRR,AVLN_EALB,AVLN_EALP,AVLN_EALPE,AVLN_EALT,AVLN_EALS,AVLN_EALR,AVLN_RISKS,AVLN_RISKR,CFLD_EVNTS,CFLD_AFREQ,CFLD_EXPB,CFLD_EXPP,CFLD_EXPPE,CFLD_EXPT,CFLD_HLRB,CFLD_HLRP,CFLD_HLRR,CFLD_EALB,CFLD_EALP,CFLD_EALPE,CFLD_EALT,CFLD_EALS,CFLD_EALR,CFLD_RISKS,CFLD_RISKR,CWAV_EVNTS,CWAV_AFREQ,CWAV_EXPB,CWAV_EXPP,CWAV_EXPPE,CWAV_EXPA,CWAV_EXPT,CWAV_HLRB,CWAV_HLRP,CWAV_HLRA,CWAV_HLRR,CWAV_EALB,CWAV_EALP,CWAV_EALPE,CWAV_EALA,CWAV_EALT,CWAV_EALS,CWAV_EALR,CWAV_RISKS,CWAV_RISKR,DRGT_EVNTS,DRGT_AFREQ,DRGT_EXPA,DRGT_EXPT,DRGT_HLRA,DRGT_HLRR,DRGT_EALA,DRGT_EALT,DRGT_EALS,DRGT_EALR,DRGT_RISKS,DRGT_RISKR,ERQK_EVNTS,ERQK_AFREQ,ERQK_EXPB,ERQK_EXPP,ERQK_EXPPE,ERQK_EXPT,ERQK_HLRB,ERQK_HLRP,ERQK_HLRR,ERQK_EALB,ERQK_EALP,ERQK_EALPE,ERQK_EALT,ERQK_EALS,ERQK_EALR,ERQK_RISKS,ERQK_RISKR,HAIL_EVNTS,HAIL_AFREQ,HAIL_EXPB,HAIL_EXPP,HAIL_EXPPE,HAIL_EXPA,HAIL_EXPT,HAIL_HLRB,HAIL_HLRP,HAIL_HLRA,HAIL_HLRR,HAIL_EALB,HAIL_EALP,HAIL_EALPE,HAIL_EALA,HAIL_EALT,HAIL_EALS,HAIL_EALR,HAIL_RISKS,HAIL_RISKR,HWAV_EVNTS,HWAV_AFREQ,HWAV_EXPB,HWAV_EXPP,HWAV_EXPPE,HWAV_EXPA,HWAV_EXPT,HWAV_HLRB,HWAV_HLRP,HWAV_HLRA,HWAV_HLRR,HWAV_EALB,HWAV_EALP,HWAV_EALPE,HWAV_EALA,HWAV_EALT,HWAV_EALS,HWAV_EALR,HWAV_RISKS,HWAV_RISKR,HRCN_EVNTS,HRCN_AFREQ,HRCN_EXPB,HRCN_EXPP,HRCN_EXPPE,HRCN_EXPA,HRCN_EXPT,HRCN_HLRB,HRCN_HLRP,HRCN_HLRA,HRCN_HLRR,HRCN_EALB,HRCN_EALP,HRCN_EALPE,HRCN_EALA,HRCN_EALT,HRCN_EALS,HRCN_EALR,HRCN_RISKS,HRCN_RISKR,ISTM_EVNTS,ISTM_AFREQ,ISTM_EXPB,ISTM_EXPP,ISTM_EXPPE,ISTM_EXPT,ISTM_HLRB,ISTM_HLRP,ISTM_HLRR,ISTM_EALB,ISTM_EALP,ISTM_EALPE,ISTM_EALT,ISTM_EALS,ISTM_EALR,ISTM_RISKS,ISTM_RISKR,LNDS_EVNTS,LNDS_AFREQ,LNDS_EXPB,LNDS_EXPP,LNDS_EXPPE,LNDS_EXPT,LNDS_HLRB,LNDS_HLRP,LNDS_HLRR,LNDS_EALB,LNDS_EALP,LNDS_EALPE,LNDS_EALT,LNDS_EALS,LNDS_EALR,LNDS_RISKS,LNDS_RISKR,LTNG_EVNTS,LTNG_AFREQ,LTNG_EXPB,LTNG_EXPP,LTNG_EXPPE,LTNG_EXPT,LTNG_HLRB,LTNG_HLRP,LTNG_HLRR,LTNG_EALB,LTNG_EALP,LTNG_EALPE,LTNG_EALT,LTNG_EALS,LTNG_EALR,LTNG_RISKS,LTNG_RISKR,RFLD_EVNTS,RFLD_AFREQ,RFLD_EXPB,RFLD_EXPP,RFLD_EXPPE,RFLD_EXPA,RFLD_EXPT,RFLD_HLRB,RFLD_HLRP,RFLD_HLRA,RFLD_HLRR,RFLD_EALB,RFLD_EALP,RFLD_EALPE,RFLD_EALA,RFLD_EALT,RFLD_EALS,RFLD_EALR,RFLD_RISKS,RFLD_RISKR,SWND_EVNTS,SWND_AFREQ,SWND_EXPB,SWND_EXPP,SWND_EXPPE,SWND_EXPA,SWND_EXPT,SWND_HLRB,SWND_HLRP,SWND_HLRA,SWND_HLRR,SWND_EALB,SWND_EALP,SWND_EALPE,SWND_EALA,SWND_EALT,SWND_EALS,SWND_EALR,SWND_RISKS,SWND_RISKR,TRND_EVNTS,TRND_AFREQ,TRND_EXPB,TRND_EXPP,TRND_EXPPE,TRND_EXPA,TRND_EXPT,TRND_HLRB,TRND_HLRP,TRND_HLRA,TRND_HLRR,TRND_EALB,TRND_EALP,TRND_EALPE,TRND_EALA,TRND_EALT,TRND_EALS,TRND_EALR,TRND_RISKS,TRND_RISKR,TSUN_EVNTS,TSUN_AFREQ,TSUN_EXPB,TSUN_EXPP,TSUN_EXPPE,TSUN_EXPT,TSUN_HLRB,TSUN_HLRP,TSUN_HLRR,TSUN_EALB,TSUN_EALP,TSUN_EALPE,TSUN_EALT,TSUN_EALS,TSUN_EALR,TSUN_RISKS,TSUN_RISKR,VLCN_EVNTS,VLCN_AFREQ,VLCN_EXPB,VLCN_EXPP,VLCN_EXPPE,VLCN_EXPT,VLCN_HLRB,VLCN_HLRP,VLCN_HLRR,VLCN_EALB,VLCN_EALP,VLCN_EALPE,VLCN_EALT,VLCN_EALS,VLCN_EALR,VLCN_RISKS,VLCN_RISKR,WFIR_EVNTS,WFIR_AFREQ,WFIR_EXPB,WFIR_EXPP,WFIR_EXPPE,WFIR_EXPA,WFIR_EXPT,WFIR_HLRB,WFIR_HLRP,WFIR_HLRA,WFIR_HLRR,WFIR_EALB,WFIR_EALP,WFIR_EALPE,WFIR_EALA,WFIR_EALT,WFIR_EALS,WFIR_EALR,WFIR_RISKS,WFIR_RISKR,WNTW_EVNTS,WNTW_AFREQ,WNTW_EXPB,WNTW_EXPP,WNTW_EXPPE,WNTW_EXPA,WNTW_EXPT,WNTW_HLRB,WNTW_HLRP,WNTW_HLRA,WNTW_HLRR,WNTW_EALB,WNTW_EALP,WNTW_EALPE,WNTW_EALA,WNTW_EALT,WNTW_EALS,WNTW_EALR,WNTW_RISKS,WNTW_RISKR,NRI_VER -1,T06001020100,Hawaii,HI,15,Kauai,County,7,15007,40300,6001020100,8385,992658000.0000000000,147860.5647200878,3.6108521589,18.0705830803,Relatively Low,63.0775787404,63.4969325153,18.6199401875,Relatively Low,59.6420077263,70.5521472393,324935.2155714268,98076.5248682368,0.0296790442,225560.7358958097,1297.9548073803,31.6808724993,Relatively Moderate,48.7278745931,51.8518518519,-0.1330000000,52.5091980000,Relatively Low,23.5125676106,100.0000000000,2.6254599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0699710120,202742385.5800542533,1862.6855876887,14156410466.4337959290,14359152852.0138511658,0.0000357579,0.0000000020,Very Low,507.2650077305,0.0000002606,1.9802850905,509.2452928210,2.6321796000,Very Low,2.5538810410,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0030589604,No Rating,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,0.0005345855,912658000.0000000000,8385.0000000000,63726000000.0000000000,64638658000.0000000000,0.0167507621,0.0001397988,Very Low,22512.2000000000,0.0001541200,1171.3120000000,23683.5120000000,11.8920653303,Relatively Low,13.0147002820,Relatively Low,0.0000000000,0.0000000000,912658000.0000000000,8385.0000000000,63726000000.0000000000,147860.5647200878,64638805860.5647201538,0.0000180224,0.0000000760,0.0002275779,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,2.0000000000,0.0343605913,912658000.0000000000,8385.0000000000,63726000000.0000000000,147860.5647200878,64638805860.5647201538,0.0000255348,0.0000003276,0.0002460797,Very Low,788.9305592758,0.0000968737,736.2401254130,1.3226671624,1526.4933518512,4.6757862953,Very Low,6.1662913066,Very Low,0.0000000000,0.0148900000,912658000.0000000000,8385.0000000000,63726000000.0000000000,64638658000.0000000000,0.0000058883,0.0000028944,Relatively Low,80.0189118426,0.0003613770,2746.4650635800,2826.4839754226,19.2773661946,Relatively Low,15.4429446232,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,142.0000000000,5.9166666660,59632790.0585851222,418.9266599156,3183842615.3584799767,51591.3125103788,3243526996.7295761108,0.0001804370,0.0000114831,0.0042466231,Very Low,63663.1136805333,0.0284625391,216315.2971586954,1296.2757495066,281274.6865887354,29.5879096062,Relatively High,26.9708819409,Relatively High,1.0000000000,0.0312500000,912658000.0000000000,8385.0000000000,63726000000.0000000000,147860.5647200878,64638805860.5647201538,0.0000032387,0.0000018297,0.0000727233,Very Low,92.3692287258,0.0004794348,3643.7043933928,0.3360282071,3736.4096503256,14.9734902768,Relatively Low,16.6070545485,Relatively Low,0.0000000000,0.0000653310,912658000.0000000000,8385.0000000000,63726000000.0000000000,147860.5647200878,64638805860.5647201538,0.0089662390,0.0000059784,0.0021079463,Very Low,534.6107152638,0.0000032750,24.8896914625,0.0203625042,559.5207692305,5.8706925202,Very Low,6.7469108145,Very Low,7.0000000000,0.0319693090,198555247.5326173902,978.4678896234,7436355961.1380958557,7634911208.6707134247,0.0015593140,0.0000038734,Very Low,9898.0167648649,0.0001211641,920.8471781755,10818.8639430404,23.6580872265,Relatively High,20.2115884136,Relatively Moderate,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0005411070,0.0000037371,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021 -2,T06007040300,Hawaii,HI,15,Hawaii,County,1,15001,20100,6007040300,5213,409283000.0000000000,30161527.9142542519,97.0642891247,26.0474557835,Relatively High,89.4815710967,87.4233128834,24.6571275391,Relatively Moderate,83.8106105391,87.4233128834,754552.3595077734,510222.1167381129,0.0320334258,243454.0359926557,876.2067770047,33.3455935266,Relatively Moderate,67.0519519602,65.5270655271,0.9080000000,50.7751980000,Relatively Low,9.3859370029,40.0000000000,2.5387599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0579710120,1082842.5920536572,13.7920666932,104819706.8679994941,105902549.4600531608,0.0000313713,0.0000000025,Very Low,1.9692852387,0.0000000020,0.0151413322,1.9844265710,0.4142077200,Very Low,0.4374499910,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000541,No Rating,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,0.0099874373,409283000.0000000000,5213.0000000000,39618800000.0000000000,40028083000.0000000000,0.0008505842,0.0000116917,Very Low,509627.8000000000,0.0314233600,238817.5360000000,748445.3360000000,37.5977579168,Very High,44.7882310288,Very High,1.0000000000,0.0312500000,409283000.0000000000,5213.0000000000,39618800000.0000000000,30161527.9142542407,40058244527.9142456055,0.0000180224,0.0000000760,0.0002275779,Very Low,230.5075462219,0.0000123856,94.1304164907,214.5030827638,539.1410454765,5.2311349597,Very Low,5.8932581207,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0100000000,409283000.0000000000,5213.0000000000,39618800000.0000000000,30161527.9142542407,40058244527.9142456055,0.0000255348,0.0000003276,0.0002460797,Very Low,104.5094165573,0.0000170798,129.8064434247,74.2213962963,308.5372562783,2.7440512545,Very Low,3.9390063490,Very Low,0.0000000000,0.0148900000,409283000.0000000000,5213.0000000000,39618800000.0000000000,40028083000.0000000000,0.0000058883,0.0000013610,Very Low,35.8846142757,0.0001056430,802.8864714520,838.7710857277,12.8581949229,Relatively Low,11.2121138672,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0006245044,0.0000038327,0.0003492485,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,1.0000000000,0.0312500000,409283000.0000000000,5213.0000000000,39618800000.0000000000,30161527.9142542407,40058244527.9142456055,0.0000083601,0.0000003102,0.0006212585,Very Low,106.9261414761,0.0000505411,384.1124266061,585.5657605523,1076.6043286345,9.8898625798,Very Low,11.9394659724,Relatively Low,0.0000000000,0.0006781468,409283000.0000000000,5213.0000000000,39618800000.0000000000,30161527.9142542519,40058244527.9142456055,0.0003985575,0.0000002657,0.0000937001,Very Low,110.6212172132,0.0000009395,7.1398535480,1.9165373923,119.6776081535,3.5109250974,Very Low,4.3917261130,Very Low,4.0000000000,0.0182681760,315888.8587620233,2.2117928286,16809625.4977076985,17125514.3564697206,0.0006654598,0.0000038734,Very Low,3.8401775301,0.0000001565,1.1894532216,5.0296307517,1.8327269938,Very Low,1.7042906890,Very Low,4.0000000000,0.0204021391,407903840.5845158696,5201.9799937840,39535047952.7582778931,39942951793.3427886963,0.0000000070,0.0000040043,Very Low,0.0583395999,0.0004233184,3217.2197865804,3217.2781261802,17.0524727301,Relatively Low,17.9932135371,Relatively Low,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021 -3,T06007040500,Hawaii,HI,15,Kauai,County,7,15007,40500,6007040500,5943,1030806000.0000000000,459516.6731830848,6.1500338151,19.0467198618,Relatively Moderate,67.4534981234,69.3251533742,18.7719774304,Relatively Low,60.4118835838,72.0858895706,332959.9571449574,167792.7734322688,0.0217301935,165149.4709508616,17.7127618271,33.1217117362,Relatively Moderate,64.7826443794,63.5327635328,0.7680000000,52.5091980000,Relatively Low,23.5125676106,100.0000000000,2.6254599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0699710120,66594737.2848528028,383.9447225607,2917979891.4611377716,2984574628.7459902763,0.0000063169,0.0000000003,Very Low,29.4350693631,0.0000000083,0.0628428106,29.4979121737,1.0184434918,Very Low,1.0330889632,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,56.0000000000,3.1111111110,0.0000000000,0.0000000000,0.0030589604,No Rating,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,0.0005860614,1030806000.0000000000,5943.0000000000,45166800000.0000000000,46197606000.0000000000,0.0167507621,0.0001397988,Very Low,120075.0000000000,0.0011438300,8693.1080000000,128768.1080000000,20.9111551033,Relatively Moderate,23.9260247408,Relatively Moderate,0.0000000000,0.0000000000,1030806000.0000000000,5943.0000000000,45166800000.0000000000,459516.6731830846,46198065516.6731948853,0.0000180224,0.0000000760,0.0002275779,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,2.0000000000,0.0289855072,1030806000.0000000000,5943.0000000000,45166800000.0000000000,459516.6731830846,46198065516.6731948853,0.0000255348,0.0000003276,0.0002460797,Very Low,762.9385502884,0.0000564393,428.9386307213,3.2776151707,1195.1547961804,4.3095415029,Very Low,5.9417734791,Very Low,0.0000000000,0.0148900000,1030806000.0000000000,5943.0000000000,45166800000.0000000000,46197606000.0000000000,0.0000058883,0.0000028944,Relatively Low,90.3777476786,0.0002561316,1946.6001040973,2036.9778517759,17.2833380202,Relatively Low,14.4752368977,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,142.0000000000,5.9166666660,40606220.8832914308,293.0385094863,2227092672.0956783295,530.1707312656,2267699423.1497006416,0.0001804370,0.0000114831,0.0042466231,Very Low,43350.6205845832,0.0199094993,151312.1945288390,13.3209920158,194676.1361054380,26.1722849103,Relatively High,24.9423944801,Relatively High,1.0000000000,0.0312500000,1030806000.0000000000,5943.0000000000,45166800000.0000000000,459516.6731830846,46198065516.6731948853,0.0000032387,0.0000018297,0.0000727233,Very Low,104.3268729204,0.0003398069,2582.5325235382,1.0442984855,2687.9036949441,13.4166096589,Relatively Low,15.5570766452,Relatively Low,0.0000000000,0.0001223370,1030806000.0000000000,5943.0000000000,45166800000.0000000000,459516.6731830848,46198065516.6731948853,0.0052856261,0.0000035243,0.0012426410,Very Low,666.5475081608,0.0000025623,19.4736228040,0.0698561550,686.0909871197,6.2836381633,Very Low,7.5500148235,Very Low,9.0000000000,0.0411033970,42337272.9888006300,137.6534442030,1046166175.9429297447,1088503448.9317302704,0.0015593140,0.0000038734,Very Low,2713.5270992744,0.0000219159,166.5606980512,2880.0877973256,15.2190537663,Relatively Moderate,13.5932751503,Relatively Moderate,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0005411070,0.0000037371,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021 +1,T06069000802,Hawaii,HI,15,Kauai,County,7,15007,40300,6069000802,8385,992658000.0000000000,147860.5647200878,3.6108521589,18.0705830803,Relatively Low,63.0775787404,63.4969325153,18.6199401875,Relatively Low,59.6420077263,70.5521472393,324935.2155714268,98076.5248682368,0.0296790442,225560.7358958097,1297.9548073803,31.6808724993,Relatively Moderate,48.7278745931,51.8518518519,-0.1330000000,52.5091980000,Relatively Low,23.5125676106,100.0000000000,2.6254599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0699710120,202742385.5800542533,1862.6855876887,14156410466.4337959290,14359152852.0138511658,0.0000357579,0.0000000020,Very Low,507.2650077305,0.0000002606,1.9802850905,509.2452928210,2.6321796000,Very Low,2.5538810410,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0030589604,No Rating,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,0.0005345855,912658000.0000000000,8385.0000000000,63726000000.0000000000,64638658000.0000000000,0.0167507621,0.0001397988,Very Low,22512.2000000000,0.0001541200,1171.3120000000,23683.5120000000,11.8920653303,Relatively Low,13.0147002820,Relatively Low,0.0000000000,0.0000000000,912658000.0000000000,8385.0000000000,63726000000.0000000000,147860.5647200878,64638805860.5647201538,0.0000180224,0.0000000760,0.0002275779,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,2.0000000000,0.0343605913,912658000.0000000000,8385.0000000000,63726000000.0000000000,147860.5647200878,64638805860.5647201538,0.0000255348,0.0000003276,0.0002460797,Very Low,788.9305592758,0.0000968737,736.2401254130,1.3226671624,1526.4933518512,4.6757862953,Very Low,6.1662913066,Very Low,0.0000000000,0.0148900000,912658000.0000000000,8385.0000000000,63726000000.0000000000,64638658000.0000000000,0.0000058883,0.0000028944,Relatively Low,80.0189118426,0.0003613770,2746.4650635800,2826.4839754226,19.2773661946,Relatively Low,15.4429446232,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,142.0000000000,5.9166666660,59632790.0585851222,418.9266599156,3183842615.3584799767,51591.3125103788,3243526996.7295761108,0.0001804370,0.0000114831,0.0042466231,Very Low,63663.1136805333,0.0284625391,216315.2971586954,1296.2757495066,281274.6865887354,29.5879096062,Relatively High,26.9708819409,Relatively High,1.0000000000,0.0312500000,912658000.0000000000,8385.0000000000,63726000000.0000000000,147860.5647200878,64638805860.5647201538,0.0000032387,0.0000018297,0.0000727233,Very Low,92.3692287258,0.0004794348,3643.7043933928,0.3360282071,3736.4096503256,14.9734902768,Relatively Low,16.6070545485,Relatively Low,0.0000000000,0.0000653310,912658000.0000000000,8385.0000000000,63726000000.0000000000,147860.5647200878,64638805860.5647201538,0.0089662390,0.0000059784,0.0021079463,Very Low,534.6107152638,0.0000032750,24.8896914625,0.0203625042,559.5207692305,5.8706925202,Very Low,6.7469108145,Very Low,7.0000000000,0.0319693090,198555247.5326173902,978.4678896234,7436355961.1380958557,7634911208.6707134247,0.0015593140,0.0000038734,Very Low,9898.0167648649,0.0001211641,920.8471781755,10818.8639430404,23.6580872265,Relatively High,20.2115884136,Relatively Moderate,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0005411070,0.0000037371,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021 +2,T06061021322,Hawaii,HI,15,Hawaii,County,1,15001,20100,6061021322,5213,409283000.0000000000,30161527.9142542519,97.0642891247,26.0474557835,Relatively High,89.4815710967,87.4233128834,24.6571275391,Relatively Moderate,83.8106105391,87.4233128834,754552.3595077734,510222.1167381129,0.0320334258,243454.0359926557,876.2067770047,33.3455935266,Relatively Moderate,67.0519519602,65.5270655271,0.9080000000,50.7751980000,Relatively Low,9.3859370029,40.0000000000,2.5387599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0579710120,1082842.5920536572,13.7920666932,104819706.8679994941,105902549.4600531608,0.0000313713,0.0000000025,Very Low,1.9692852387,0.0000000020,0.0151413322,1.9844265710,0.4142077200,Very Low,0.4374499910,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000541,No Rating,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,0.0099874373,409283000.0000000000,5213.0000000000,39618800000.0000000000,40028083000.0000000000,0.0008505842,0.0000116917,Very Low,509627.8000000000,0.0314233600,238817.5360000000,748445.3360000000,37.5977579168,Very High,44.7882310288,Very High,1.0000000000,0.0312500000,409283000.0000000000,5213.0000000000,39618800000.0000000000,30161527.9142542407,40058244527.9142456055,0.0000180224,0.0000000760,0.0002275779,Very Low,230.5075462219,0.0000123856,94.1304164907,214.5030827638,539.1410454765,5.2311349597,Very Low,5.8932581207,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0100000000,409283000.0000000000,5213.0000000000,39618800000.0000000000,30161527.9142542407,40058244527.9142456055,0.0000255348,0.0000003276,0.0002460797,Very Low,104.5094165573,0.0000170798,129.8064434247,74.2213962963,308.5372562783,2.7440512545,Very Low,3.9390063490,Very Low,0.0000000000,0.0148900000,409283000.0000000000,5213.0000000000,39618800000.0000000000,40028083000.0000000000,0.0000058883,0.0000013610,Very Low,35.8846142757,0.0001056430,802.8864714520,838.7710857277,12.8581949229,Relatively Low,11.2121138672,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0006245044,0.0000038327,0.0003492485,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,1.0000000000,0.0312500000,409283000.0000000000,5213.0000000000,39618800000.0000000000,30161527.9142542407,40058244527.9142456055,0.0000083601,0.0000003102,0.0006212585,Very Low,106.9261414761,0.0000505411,384.1124266061,585.5657605523,1076.6043286345,9.8898625798,Very Low,11.9394659724,Relatively Low,0.0000000000,0.0006781468,409283000.0000000000,5213.0000000000,39618800000.0000000000,30161527.9142542519,40058244527.9142456055,0.0003985575,0.0000002657,0.0000937001,Very Low,110.6212172132,0.0000009395,7.1398535480,1.9165373923,119.6776081535,3.5109250974,Very Low,4.3917261130,Very Low,4.0000000000,0.0182681760,315888.8587620233,2.2117928286,16809625.4977076985,17125514.3564697206,0.0006654598,0.0000038734,Very Low,3.8401775301,0.0000001565,1.1894532216,5.0296307517,1.8327269938,Very Low,1.7042906890,Very Low,4.0000000000,0.0204021391,407903840.5845158696,5201.9799937840,39535047952.7582778931,39942951793.3427886963,0.0000000070,0.0000040043,Very Low,0.0583395999,0.0004233184,3217.2197865804,3217.2781261802,17.0524727301,Relatively Low,17.9932135371,Relatively Low,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021 +3,T06027000800,Hawaii,HI,15,Kauai,County,7,15007,40500,6027000800,5943,1030806000.0000000000,459516.6731830848,6.1500338151,19.0467198618,Relatively Moderate,67.4534981234,69.3251533742,18.7719774304,Relatively Low,60.4118835838,72.0858895706,332959.9571449574,167792.7734322688,0.0217301935,165149.4709508616,17.7127618271,33.1217117362,Relatively Moderate,64.7826443794,63.5327635328,0.7680000000,52.5091980000,Relatively Low,23.5125676106,100.0000000000,2.6254599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0699710120,66594737.2848528028,383.9447225607,2917979891.4611377716,2984574628.7459902763,0.0000063169,0.0000000003,Very Low,29.4350693631,0.0000000083,0.0628428106,29.4979121737,1.0184434918,Very Low,1.0330889632,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,56.0000000000,3.1111111110,0.0000000000,0.0000000000,0.0030589604,No Rating,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,0.0005860614,1030806000.0000000000,5943.0000000000,45166800000.0000000000,46197606000.0000000000,0.0167507621,0.0001397988,Very Low,120075.0000000000,0.0011438300,8693.1080000000,128768.1080000000,20.9111551033,Relatively Moderate,23.9260247408,Relatively Moderate,0.0000000000,0.0000000000,1030806000.0000000000,5943.0000000000,45166800000.0000000000,459516.6731830846,46198065516.6731948853,0.0000180224,0.0000000760,0.0002275779,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,2.0000000000,0.0289855072,1030806000.0000000000,5943.0000000000,45166800000.0000000000,459516.6731830846,46198065516.6731948853,0.0000255348,0.0000003276,0.0002460797,Very Low,762.9385502884,0.0000564393,428.9386307213,3.2776151707,1195.1547961804,4.3095415029,Very Low,5.9417734791,Very Low,0.0000000000,0.0148900000,1030806000.0000000000,5943.0000000000,45166800000.0000000000,46197606000.0000000000,0.0000058883,0.0000028944,Relatively Low,90.3777476786,0.0002561316,1946.6001040973,2036.9778517759,17.2833380202,Relatively Low,14.4752368977,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,142.0000000000,5.9166666660,40606220.8832914308,293.0385094863,2227092672.0956783295,530.1707312656,2267699423.1497006416,0.0001804370,0.0000114831,0.0042466231,Very Low,43350.6205845832,0.0199094993,151312.1945288390,13.3209920158,194676.1361054380,26.1722849103,Relatively High,24.9423944801,Relatively High,1.0000000000,0.0312500000,1030806000.0000000000,5943.0000000000,45166800000.0000000000,459516.6731830846,46198065516.6731948853,0.0000032387,0.0000018297,0.0000727233,Very Low,104.3268729204,0.0003398069,2582.5325235382,1.0442984855,2687.9036949441,13.4166096589,Relatively Low,15.5570766452,Relatively Low,0.0000000000,0.0001223370,1030806000.0000000000,5943.0000000000,45166800000.0000000000,459516.6731830848,46198065516.6731948853,0.0052856261,0.0000035243,0.0012426410,Very Low,666.5475081608,0.0000025623,19.4736228040,0.0698561550,686.0909871197,6.2836381633,Very Low,7.5500148235,Very Low,9.0000000000,0.0411033970,42337272.9888006300,137.6534442030,1046166175.9429297447,1088503448.9317302704,0.0015593140,0.0000038734,Very Low,2713.5270992744,0.0000219159,166.5606980512,2880.0877973256,15.2190537663,Relatively Moderate,13.5932751503,Relatively Moderate,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0005411070,0.0000037371,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021 4,T15001021010,Hawaii,HI,15,Hawaii,County,1,15001,21010,15001021010,7884,737712000.0000000000,8711454.3090733420,58.4401512286,43.1066279987,Very High,99.4459643383,98.1595092025,42.6674572964,Very High,99.2741170486,99.0797546012,3909779.1321200719,2582125.8111252696,0.1746532017,1327364.3330713348,288.9879234675,31.8903618889,Relatively Moderate,51.0956693021,54.4159544160,-0.0020000000,50.7751980000,Relatively Low,9.3859370029,40.0000000000,2.5387599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000478451,0.0000000048,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000541,No Rating,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,0.0099998852,737712000.0000000000,7884.0000000000,59918400000.0000000000,60656112000.0000000000,0.0008505842,0.0000116917,Very Low,2580741.3999999999,0.1736765400,1319941.7039999999,3900683.1039999998,65.1861714882,Very High,74.2640163391,Very High,1.0000000000,0.0312500000,737712000.0000000000,7884.0000000000,59918400000.0000000000,8711454.3090733420,60664823454.3090744019,0.0000180224,0.0000000760,0.0002275779,Very Low,415.4782459486,0.0000187316,142.3602922696,61.9542156517,619.7927538699,5.4799587665,Very Low,5.9041560145,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0269344664,737712000.0000000000,7884.0000000000,59918400000.0000000000,8711454.3090733420,60664823454.3090744019,0.0000255348,0.0000003276,0.0002460797,Very Low,473.5051910310,0.0000651127,494.8567057547,57.2461948490,1025.6080916347,4.0952789981,Very Low,5.6221049906,Very Low,0.0000000000,0.0148900000,737712000.0000000000,7884.0000000000,59918400000.0000000000,60656112000.0000000000,0.0000058883,0.0000013610,Very Low,64.6802104328,0.0001597715,1214.2637523360,1278.9439627688,14.7995789625,Relatively Low,12.3417814165,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0006245044,0.0000038327,0.0003492485,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,1.0000000000,0.0312500000,737712000.0000000000,7884.0000000000,59918400000.0000000000,8711454.3090733420,60664823454.3090744019,0.0000083601,0.0000003102,0.0006212585,Very Low,192.7289862509,0.0000764370,580.9212298706,169.1270211135,942.7772372349,9.4618177655,Very Low,10.9242145239,Very Low,1.0000000000,0.0004673635,737712000.0000000000,7884.0000000000,59918400000.0000000000,8711454.3090733420,60664823454.3090744019,0.0006900376,0.0000004601,0.0001622266,Very Low,237.9109428670,0.0000016953,12.8843062101,0.6604918534,251.4557409305,4.4968090785,Very Low,5.3796416501,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0006654598,0.0000038734,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,4.0000000000,0.0207448000,737708710.8628113270,7883.9591351862,59918089427.4153671265,60655798138.2781677246,0.0000000070,0.0000040043,Very Low,0.1075487398,0.0006549135,4977.3427848938,4977.4503336337,19.7224171343,Relatively Low,19.9022650650,Relatively Low,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021 5,T15001021101,Hawaii,HI,15,Hawaii,County,1,15001,21101,15001021101,3531,365469000.0000000000,1115552.9463470120,41.0551206444,39.6369371498,Very High,99.0514029613,96.6257668712,35.4631324234,Relatively High,97.7453635601,94.4785276074,2244880.4514211570,1569603.2441089998,0.0888473124,675239.5743199890,37.6329921689,35.2805718581,Relatively High,83.0000273575,82.3361823362,2.1180000000,50.7751980000,Relatively Low,9.3859370029,40.0000000000,2.5387599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0679710120,53358423.6905883327,515.5255139327,3917993905.8884677887,3971352329.5790557861,0.0000009778,0.0000000001,Very Low,3.5462107144,0.0000000023,0.0178004814,3.5640111958,0.5034846073,Very Low,0.5625920420,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000541,No Rating,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,0.0099998512,365469000.0000000000,3531.0000000000,26835600000.0000000000,27201069000.0000000000,0.0008505842,0.0000116917,Very Low,1549795.8000000000,0.0875910700,665692.1319999999,2215487.9320000000,53.9839983966,Very High,68.0399795668,Very High,1.0000000000,0.0312500000,365469000.0000000000,3531.0000000000,26835600000.0000000000,1115552.9463470120,27202184552.9463424683,0.0000180224,0.0000000760,0.0002275779,Very Low,205.8315698678,0.0000083893,63.7587762572,7.9336015953,277.5239477203,4.1923926160,Very Low,4.9971070139,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0289855072,365469000.0000000000,3531.0000000000,26835600000.0000000000,1115552.9463470120,27202184552.9463424683,0.0000255348,0.0000003276,0.0002460797,Very Low,270.4974447523,0.0000335331,254.8514731746,7.9569545004,533.3058724274,3.2931774779,Very Low,5.0015747332,Very Low,0.0000000000,0.0148900000,365469000.0000000000,3531.0000000000,26835600000.0000000000,27201069000.0000000000,0.0000058883,0.0000013610,Very Low,32.0431439731,0.0000715567,543.8312163240,575.8743602971,11.3433526973,Very Low,10.4651653429,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,142.0000000000,5.9166666660,4828130.5279219840,35.1384012388,267051849.4150594473,0.0000000000,271879979.9429814219,0.0006245044,0.0000038327,0.0003492485,Very Low,17839.8663537918,0.0007968309,6055.9146131274,0.0000000000,23895.7809669192,13.0070200492,Relatively Moderate,13.6546608024,Relatively Moderate,1.0000000000,0.0312500000,365469000.0000000000,3531.0000000000,26835600000.0000000000,1115552.9463470120,27202184552.9463424683,0.0000083601,0.0000003102,0.0006212585,Very Low,95.4796314509,0.0000342338,260.1766695466,21.6577094941,377.3140104915,6.9727783560,Very Low,8.9063071715,Very Low,0.0000000000,0.0003634330,365469000.0000000000,3531.0000000000,26835600000.0000000000,1115552.9463470120,27202184552.9463424683,0.0008889061,0.0000005927,0.0002089802,Very Low,118.0676167774,0.0000007606,5.7804922284,0.0847265791,123.9328355849,3.5520526364,Very Low,4.7010550308,Very Low,13.0000000000,0.0593715740,31437177.7921413518,196.0173546829,1489731895.5901708603,1521169073.3823122978,0.0006654598,0.0000038734,Very Low,1242.0638448472,0.0000450783,342.5948426489,1584.6586874961,12.4708959075,Relatively Moderate,12.2698912376,Relatively Moderate,3.0000000000,0.0188028000,365467633.7354047298,3530.9854379618,26835489328.5099411011,27200956962.2453422546,0.0000000070,0.0000040043,Very Low,0.0482928249,0.0002658574,2020.5164362008,2020.5647290257,14.6032241308,Relatively Low,16.3029908639,Relatively Low,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021 6,T15007040603,Hawaii,HI,15,Kauai,County,7,15007,40603,15007040603,2544,509507000.0000000000,3763051.3782403329,15.9289735326,23.8613675670,Relatively Moderate,84.6148558545,84.9693251534,22.2413255033,Relatively Moderate,75.9028856597,83.7423312883,553788.5026946985,159866.0053362669,0.0465200191,353552.1448416797,40370.3525167520,35.0215086434,Relatively Moderate,81.3161710393,79.7720797721,1.9560000000,52.5091980000,Relatively Low,23.5125676106,100.0000000000,2.6254599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0699710120,59268365.9828897715,295.9306212878,2249072721.7871074677,2308341087.7699966431,0.0000020063,0.0000000001,Very Low,8.3203647759,0.0000000014,0.0109218690,8.3312866448,0.6682062552,Very Low,0.7166933897,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,119.0000000000,6.6111111110,1994468.3763317089,1994468.3763317089,0.0030589604,Relatively Moderate,40334.3876510453,40334.3876510453,9.3173396900,Relatively Moderate,10.0118819196,Relatively Moderate,,0.0006288023,509507000.0000000000,2544.0000000000,19334400000.0000000000,19843907000.0000000000,0.0167507621,0.0001397988,Very Low,29888.8000000000,0.0002046000,1554.9600000000,31443.7600000000,13.0703357152,Relatively Low,15.8125293377,Relatively Low,0.0000000000,0.0000000000,509507000.0000000000,2544.0000000000,19334400000.0000000000,3763051.3782403329,19847670051.3782386780,0.0000180224,0.0000000760,0.0002275779,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,2.0000000000,0.0289855072,509500026.7867159247,2543.9789504995,19334240023.7962799072,3763051.3782403329,19847503101.9612274170,0.0000255348,0.0000003276,0.0002460797,Very Low,377.1002611632,0.0000241596,183.6127961654,26.8408852286,587.5539425572,3.4012529352,Very Low,4.9584510525,Very Low,0.0000000000,0.0148900000,509507000.0000000000,2544.0000000000,19334400000.0000000000,19843907000.0000000000,0.0000058883,0.0000028944,Relatively Low,44.6719315627,0.0001096414,833.2745523849,877.9464839477,13.0553404852,Relatively Low,11.5613443431,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,142.0000000000,5.9166666660,119566421.2469792366,677.5008183296,5149006219.3049850464,0.0000000000,5268572640.5519647598,0.0001804370,0.0000114831,0.0042466231,Very Low,127647.4010480262,0.0460304759,349831.6169989206,0.0000000000,477479.0180469467,35.2957296359,Relatively High,35.5664685650,Very High,1.0000000000,0.0312500000,509507000.0000000000,2544.0000000000,19334400000.0000000000,3763051.3782403329,19847670051.3782386780,0.0000032387,0.0000018297,0.0000727233,Very Low,51.5667080334,0.0001454600,1105.4960019992,8.5519178837,1165.6146279163,10.1552327033,Very Low,12.4507973241,Relatively Low,0.0000000000,0.0002990171,509507000.0000000000,2544.0000000000,19334400000.0000000000,3763051.3782403329,19847670051.3782386780,0.0021625099,0.0000014419,0.0005084021,Very Low,329.4612383326,0.0000010968,8.3360081463,0.5720625944,338.3693090733,4.9645617720,Very Low,6.3071150891,Very Low,3.0000000000,0.0137011320,71084897.0818793178,86.3741073938,656443216.1930950880,727528113.2749742270,0.0015593140,0.0000038734,Relatively Low,1518.6837843730,0.0000045839,34.8375621943,1553.5213465673,12.3886737842,Relatively Moderate,11.6999323670,Relatively Moderate,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0005411070,0.0000037371,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021 diff --git a/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/data/output.csv b/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/data/output.csv index b01e6d146..160164d86 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/data/output.csv +++ b/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/data/output.csv @@ -1,7 +1,7 @@ GEOID10_TRACT,FEMA Risk Index Expected Annual Loss Score,Expected population loss rate (Natural Hazards Risk Index),Expected agricultural loss rate (Natural Hazards Risk Index),Expected building loss rate (Natural Hazards Risk Index),Contains agricultural value -06001020100,18.6199401875,0.0000035067,0.0031812618,0.0000661520,True -06007040300,24.6571275391,0.0000000358,0.0000290505,0.0000014426,True -06007040500,18.7719774304,0.0000034603,0.0000385465,0.0000436593,True +06069000802,18.6199401875,0.0000035067,0.0031812618,0.0000661520,True +06061021322,24.6571275391,0.0000000358,0.0000290505,0.0000014426,True +06027000800,18.7719774304,0.0000034603,0.0000385465,0.0000436593,True 15001021010,42.6674572964,0.0000000408,0.0000331733,0.0000018765,True 15001021101,35.4631324234,0.0000002677,0.0000337348,0.0000507987,True 15007040603,22.2413255033,0.0000182039,0.0107280896,0.0002521232,True diff --git a/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/data/transform.csv b/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/data/transform.csv index ce24d0559..809726014 100644 --- a/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/data/transform.csv +++ b/data/data-pipeline/data_pipeline/tests/sources/national_risk_index/data/transform.csv @@ -1,7 +1,7 @@ OID_,NRI_ID,STATE,STATEABBRV,STATEFIPS,COUNTY,COUNTYTYPE,COUNTYFIPS,STCOFIPS,TRACT,GEOID10_TRACT,POPULATION,BUILDVALUE,AGRIVALUE,AREA,RISK_SCORE,RISK_RATNG,RISK_NPCTL,RISK_SPCTL,FEMA Risk Index Expected Annual Loss Score,EAL_RATNG,EAL_NPCTL,EAL_SPCTL,EAL_VALT,EAL_VALB,EAL_VALP,EAL_VALPE,EAL_VALA,SOVI_SCORE,SOVI_RATNG,SOVI_NPCTL,SOVI_SPCTL,SOVI_VALUE,RESL_SCORE,RESL_RATNG,RESL_NPCTL,RESL_SPCTL,RESL_VALUE,AVLN_EVNTS,AVLN_AFREQ,AVLN_EXPB,AVLN_EXPP,AVLN_EXPPE,AVLN_EXPT,AVLN_HLRB,AVLN_HLRP,AVLN_HLRR,AVLN_EALB,AVLN_EALP,AVLN_EALPE,AVLN_EALT,AVLN_EALS,AVLN_EALR,AVLN_RISKS,AVLN_RISKR,CFLD_EVNTS,CFLD_AFREQ,CFLD_EXPB,CFLD_EXPP,CFLD_EXPPE,CFLD_EXPT,CFLD_HLRB,CFLD_HLRP,CFLD_HLRR,CFLD_EALB,CFLD_EALP,CFLD_EALPE,CFLD_EALT,CFLD_EALS,CFLD_EALR,CFLD_RISKS,CFLD_RISKR,CWAV_EVNTS,CWAV_AFREQ,CWAV_EXPB,CWAV_EXPP,CWAV_EXPPE,CWAV_EXPA,CWAV_EXPT,CWAV_HLRB,CWAV_HLRP,CWAV_HLRA,CWAV_HLRR,CWAV_EALB,CWAV_EALP,CWAV_EALPE,CWAV_EALA,CWAV_EALT,CWAV_EALS,CWAV_EALR,CWAV_RISKS,CWAV_RISKR,DRGT_EVNTS,DRGT_AFREQ,DRGT_EXPA,DRGT_EXPT,DRGT_HLRA,DRGT_HLRR,DRGT_EALA,DRGT_EALT,DRGT_EALS,DRGT_EALR,DRGT_RISKS,DRGT_RISKR,ERQK_EVNTS,ERQK_AFREQ,ERQK_EXPB,ERQK_EXPP,ERQK_EXPPE,ERQK_EXPT,ERQK_HLRB,ERQK_HLRP,ERQK_HLRR,ERQK_EALB,ERQK_EALP,ERQK_EALPE,ERQK_EALT,ERQK_EALS,ERQK_EALR,ERQK_RISKS,ERQK_RISKR,HAIL_EVNTS,HAIL_AFREQ,HAIL_EXPB,HAIL_EXPP,HAIL_EXPPE,HAIL_EXPA,HAIL_EXPT,HAIL_HLRB,HAIL_HLRP,HAIL_HLRA,HAIL_HLRR,HAIL_EALB,HAIL_EALP,HAIL_EALPE,HAIL_EALA,HAIL_EALT,HAIL_EALS,HAIL_EALR,HAIL_RISKS,HAIL_RISKR,HWAV_EVNTS,HWAV_AFREQ,HWAV_EXPB,HWAV_EXPP,HWAV_EXPPE,HWAV_EXPA,HWAV_EXPT,HWAV_HLRB,HWAV_HLRP,HWAV_HLRA,HWAV_HLRR,HWAV_EALB,HWAV_EALP,HWAV_EALPE,HWAV_EALA,HWAV_EALT,HWAV_EALS,HWAV_EALR,HWAV_RISKS,HWAV_RISKR,HRCN_EVNTS,HRCN_AFREQ,HRCN_EXPB,HRCN_EXPP,HRCN_EXPPE,HRCN_EXPA,HRCN_EXPT,HRCN_HLRB,HRCN_HLRP,HRCN_HLRA,HRCN_HLRR,HRCN_EALB,HRCN_EALP,HRCN_EALPE,HRCN_EALA,HRCN_EALT,HRCN_EALS,HRCN_EALR,HRCN_RISKS,HRCN_RISKR,ISTM_EVNTS,ISTM_AFREQ,ISTM_EXPB,ISTM_EXPP,ISTM_EXPPE,ISTM_EXPT,ISTM_HLRB,ISTM_HLRP,ISTM_HLRR,ISTM_EALB,ISTM_EALP,ISTM_EALPE,ISTM_EALT,ISTM_EALS,ISTM_EALR,ISTM_RISKS,ISTM_RISKR,LNDS_EVNTS,LNDS_AFREQ,LNDS_EXPB,LNDS_EXPP,LNDS_EXPPE,LNDS_EXPT,LNDS_HLRB,LNDS_HLRP,LNDS_HLRR,LNDS_EALB,LNDS_EALP,LNDS_EALPE,LNDS_EALT,LNDS_EALS,LNDS_EALR,LNDS_RISKS,LNDS_RISKR,LTNG_EVNTS,LTNG_AFREQ,LTNG_EXPB,LTNG_EXPP,LTNG_EXPPE,LTNG_EXPT,LTNG_HLRB,LTNG_HLRP,LTNG_HLRR,LTNG_EALB,LTNG_EALP,LTNG_EALPE,LTNG_EALT,LTNG_EALS,LTNG_EALR,LTNG_RISKS,LTNG_RISKR,RFLD_EVNTS,RFLD_AFREQ,RFLD_EXPB,RFLD_EXPP,RFLD_EXPPE,RFLD_EXPA,RFLD_EXPT,RFLD_HLRB,RFLD_HLRP,RFLD_HLRA,RFLD_HLRR,RFLD_EALB,RFLD_EALP,RFLD_EALPE,RFLD_EALA,RFLD_EALT,RFLD_EALS,RFLD_EALR,RFLD_RISKS,RFLD_RISKR,SWND_EVNTS,SWND_AFREQ,SWND_EXPB,SWND_EXPP,SWND_EXPPE,SWND_EXPA,SWND_EXPT,SWND_HLRB,SWND_HLRP,SWND_HLRA,SWND_HLRR,SWND_EALB,SWND_EALP,SWND_EALPE,SWND_EALA,SWND_EALT,SWND_EALS,SWND_EALR,SWND_RISKS,SWND_RISKR,TRND_EVNTS,TRND_AFREQ,TRND_EXPB,TRND_EXPP,TRND_EXPPE,TRND_EXPA,TRND_EXPT,TRND_HLRB,TRND_HLRP,TRND_HLRA,TRND_HLRR,TRND_EALB,TRND_EALP,TRND_EALPE,TRND_EALA,TRND_EALT,TRND_EALS,TRND_EALR,TRND_RISKS,TRND_RISKR,TSUN_EVNTS,TSUN_AFREQ,TSUN_EXPB,TSUN_EXPP,TSUN_EXPPE,TSUN_EXPT,TSUN_HLRB,TSUN_HLRP,TSUN_HLRR,TSUN_EALB,TSUN_EALP,TSUN_EALPE,TSUN_EALT,TSUN_EALS,TSUN_EALR,TSUN_RISKS,TSUN_RISKR,VLCN_EVNTS,VLCN_AFREQ,VLCN_EXPB,VLCN_EXPP,VLCN_EXPPE,VLCN_EXPT,VLCN_HLRB,VLCN_HLRP,VLCN_HLRR,VLCN_EALB,VLCN_EALP,VLCN_EALPE,VLCN_EALT,VLCN_EALS,VLCN_EALR,VLCN_RISKS,VLCN_RISKR,WFIR_EVNTS,WFIR_AFREQ,WFIR_EXPB,WFIR_EXPP,WFIR_EXPPE,WFIR_EXPA,WFIR_EXPT,WFIR_HLRB,WFIR_HLRP,WFIR_HLRA,WFIR_HLRR,WFIR_EALB,WFIR_EALP,WFIR_EALPE,WFIR_EALA,WFIR_EALT,WFIR_EALS,WFIR_EALR,WFIR_RISKS,WFIR_RISKR,WNTW_EVNTS,WNTW_AFREQ,WNTW_EXPB,WNTW_EXPP,WNTW_EXPPE,WNTW_EXPA,WNTW_EXPT,WNTW_HLRB,WNTW_HLRP,WNTW_HLRA,WNTW_HLRR,WNTW_EALB,WNTW_EALP,WNTW_EALPE,WNTW_EALA,WNTW_EALT,WNTW_EALS,WNTW_EALR,WNTW_RISKS,WNTW_RISKR,NRI_VER,Expected population loss rate (Natural Hazards Risk Index),Expected agricultural loss rate (Natural Hazards Risk Index),Contains agricultural value,Expected building loss rate (Natural Hazards Risk Index) -1,T06001020100,Hawaii,HI,15,Kauai,County,7,15007,40300,06001020100,8385,992658000.0000000000,147860.5647200878,3.6108521589,18.0705830803,Relatively Low,63.0775787404,63.4969325153,18.6199401875,Relatively Low,59.6420077263,70.5521472393,324935.2155714268,98076.5248682368,0.0296790442,225560.7358958097,1297.9548073803,31.6808724993,Relatively Moderate,48.7278745931,51.8518518519,-0.1330000000,52.5091980000,Relatively Low,23.5125676106,100.0000000000,2.6254599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0699710120,202742385.5800542533,1862.6855876887,14156410466.4337959290,14359152852.0138511658,0.0000357579,0.0000000020,Very Low,507.2650077305,0.0000002606,1.9802850905,509.2452928210,2.6321796000,Very Low,2.5538810410,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0030589604,No Rating,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,0.0005345855,912658000.0000000000,8385.0000000000,63726000000.0000000000,64638658000.0000076294,0.0167507621,0.0001397988,Very Low,22512.2000000000,0.0001541200,1171.3120000000,23683.5120000000,11.8920653303,Relatively Low,13.0147002820,Relatively Low,0.0000000000,0.0000000000,912658000.0000000000,8385.0000000000,63726000000.0000000000,147860.5647200878,64638805860.5647201538,0.0000180224,0.0000000760,0.0002275779,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,2.0000000000,0.0343605913,912658000.0000000000,8385.0000000000,63726000000.0000000000,147860.5647200878,64638805860.5647201538,0.0000255348,0.0000003276,0.0002460797,Very Low,788.9305592758,0.0000968737,736.2401254130,1.3226671624,1526.4933518512,4.6757862953,Very Low,6.1662913066,Very Low,0.0000000000,0.0148900000,912658000.0000000000,8385.0000000000,63726000000.0000000000,64638658000.0000076294,0.0000058883,0.0000028944,Relatively Low,80.0189118426,0.0003613770,2746.4650635800,2826.4839754226,19.2773661946,Relatively Low,15.4429446232,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,142.0000000000,5.9166666660,59632790.0585851297,418.9266599156,3183842615.3584799767,51591.3125103788,3243526996.7295761108,0.0001804370,0.0000114831,0.0042466231,Very Low,63663.1136805333,0.0284625391,216315.2971586954,1296.2757495066,281274.6865887354,29.5879096062,Relatively High,26.9708819409,Relatively High,1.0000000000,0.0312500000,912658000.0000000000,8385.0000000000,63726000000.0000000000,147860.5647200878,64638805860.5647201538,0.0000032387,0.0000018297,0.0000727233,Very Low,92.3692287258,0.0004794348,3643.7043933928,0.3360282071,3736.4096503256,14.9734902768,Relatively Low,16.6070545485,Relatively Low,0.0000000000,0.0000653310,912658000.0000000000,8385.0000000000,63726000000.0000000000,147860.5647200878,64638805860.5647201538,0.0089662390,0.0000059784,0.0021079463,Very Low,534.6107152638,0.0000032750,24.8896914625,0.0203625042,559.5207692305,5.8706925202,Very Low,6.7469108145,Very Low,7.0000000000,0.0319693090,198555247.5326173902,978.4678896234,7436355961.1380958557,7634911208.6707124710,0.0015593140,0.0000038734,Very Low,9898.0167648649,0.0001211641,920.8471781755,10818.8639430404,23.6580872265,Relatively High,20.2115884136,Relatively Moderate,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0005411070,0.0000037371,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021,0.0000035067,0.0031812618,True,0.0000661520 -2,T06007040300,Hawaii,HI,15,Hawaii,County,1,15001,20100,06007040300,5213,409283000.0000000000,30161527.9142542519,97.0642891247,26.0474557835,Relatively High,89.4815710967,87.4233128834,24.6571275391,Relatively Moderate,83.8106105391,87.4233128834,754552.3595077734,510222.1167381129,0.0320334258,243454.0359926558,876.2067770047,33.3455935266,Relatively Moderate,67.0519519602,65.5270655271,0.9080000000,50.7751980000,Relatively Low,9.3859370029,40.0000000000,2.5387599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0579710120,1082842.5920536572,13.7920666932,104819706.8679994941,105902549.4600531608,0.0000313713,0.0000000025,Very Low,1.9692852387,0.0000000020,0.0151413322,1.9844265710,0.4142077200,Very Low,0.4374499910,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000541,No Rating,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,0.0099874373,409283000.0000000000,5213.0000000000,39618800000.0000000000,40028083000.0000000000,0.0008505842,0.0000116917,Very Low,509627.8000000000,0.0314233600,238817.5360000000,748445.3360000000,37.5977579168,Very High,44.7882310288,Very High,1.0000000000,0.0312500000,409283000.0000000000,5213.0000000000,39618800000.0000000000,30161527.9142542407,40058244527.9142456055,0.0000180224,0.0000000760,0.0002275779,Very Low,230.5075462219,0.0000123856,94.1304164907,214.5030827638,539.1410454765,5.2311349597,Very Low,5.8932581207,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0100000000,409283000.0000000000,5213.0000000000,39618800000.0000000000,30161527.9142542407,40058244527.9142456055,0.0000255348,0.0000003276,0.0002460797,Very Low,104.5094165573,0.0000170798,129.8064434247,74.2213962963,308.5372562783,2.7440512545,Very Low,3.9390063490,Very Low,0.0000000000,0.0148900000,409283000.0000000000,5213.0000000000,39618800000.0000000000,40028083000.0000000000,0.0000058883,0.0000013610,Very Low,35.8846142757,0.0001056430,802.8864714520,838.7710857277,12.8581949229,Relatively Low,11.2121138672,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0006245044,0.0000038327,0.0003492485,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,1.0000000000,0.0312500000,409283000.0000000000,5213.0000000000,39618800000.0000000000,30161527.9142542407,40058244527.9142456055,0.0000083601,0.0000003102,0.0006212585,Very Low,106.9261414761,0.0000505411,384.1124266061,585.5657605523,1076.6043286345,9.8898625798,Very Low,11.9394659724,Relatively Low,0.0000000000,0.0006781468,409283000.0000000000,5213.0000000000,39618800000.0000000000,30161527.9142542519,40058244527.9142456055,0.0003985575,0.0000002657,0.0000937001,Very Low,110.6212172132,0.0000009395,7.1398535480,1.9165373923,119.6776081535,3.5109250974,Very Low,4.3917261130,Very Low,4.0000000000,0.0182681760,315888.8587620232,2.2117928286,16809625.4977076985,17125514.3564697206,0.0006654598,0.0000038734,Very Low,3.8401775301,0.0000001565,1.1894532216,5.0296307517,1.8327269938,Very Low,1.7042906890,Very Low,4.0000000000,0.0204021391,407903840.5845158696,5201.9799937840,39535047952.7582778931,39942951793.3427886963,0.0000000070,0.0000040043,Very Low,0.0583395999,0.0004233184,3217.2197865804,3217.2781261802,17.0524727301,Relatively Low,17.9932135371,Relatively Low,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021,0.0000000358,0.0000290505,True,0.0000014426 -3,T06007040500,Hawaii,HI,15,Kauai,County,7,15007,40500,06007040500,5943,1030806000.0000000000,459516.6731830848,6.1500338151,19.0467198618,Relatively Moderate,67.4534981234,69.3251533742,18.7719774304,Relatively Low,60.4118835838,72.0858895706,332959.9571449574,167792.7734322688,0.0217301935,165149.4709508616,17.7127618271,33.1217117362,Relatively Moderate,64.7826443794,63.5327635328,0.7680000000,52.5091980000,Relatively Low,23.5125676106,100.0000000000,2.6254599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0699710120,66594737.2848528028,383.9447225607,2917979891.4611377716,2984574628.7459902763,0.0000063169,0.0000000003,Very Low,29.4350693631,0.0000000083,0.0628428106,29.4979121737,1.0184434918,Very Low,1.0330889632,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,56.0000000000,3.1111111110,0.0000000000,0.0000000000,0.0030589604,No Rating,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,0.0005860614,1030806000.0000000000,5943.0000000000,45166800000.0000000000,46197606000.0000000000,0.0167507621,0.0001397988,Very Low,120075.0000000000,0.0011438300,8693.1080000000,128768.1080000000,20.9111551033,Relatively Moderate,23.9260247408,Relatively Moderate,0.0000000000,0.0000000000,1030806000.0000000000,5943.0000000000,45166800000.0000000000,459516.6731830846,46198065516.6731948853,0.0000180224,0.0000000760,0.0002275779,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,2.0000000000,0.0289855072,1030806000.0000000000,5943.0000000000,45166800000.0000000000,459516.6731830846,46198065516.6731948853,0.0000255348,0.0000003276,0.0002460797,Very Low,762.9385502884,0.0000564393,428.9386307213,3.2776151707,1195.1547961804,4.3095415029,Very Low,5.9417734791,Very Low,0.0000000000,0.0148900000,1030806000.0000000000,5943.0000000000,45166800000.0000000000,46197606000.0000000000,0.0000058883,0.0000028944,Relatively Low,90.3777476786,0.0002561316,1946.6001040973,2036.9778517759,17.2833380202,Relatively Low,14.4752368977,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,142.0000000000,5.9166666660,40606220.8832914308,293.0385094863,2227092672.0956783295,530.1707312656,2267699423.1497006416,0.0001804370,0.0000114831,0.0042466231,Very Low,43350.6205845832,0.0199094993,151312.1945288390,13.3209920158,194676.1361054380,26.1722849103,Relatively High,24.9423944801,Relatively High,1.0000000000,0.0312500000,1030806000.0000000000,5943.0000000000,45166800000.0000000000,459516.6731830846,46198065516.6731948853,0.0000032387,0.0000018297,0.0000727233,Very Low,104.3268729204,0.0003398069,2582.5325235382,1.0442984855,2687.9036949441,13.4166096589,Relatively Low,15.5570766452,Relatively Low,0.0000000000,0.0001223370,1030806000.0000000000,5943.0000000000,45166800000.0000000000,459516.6731830848,46198065516.6731948853,0.0052856261,0.0000035243,0.0012426410,Very Low,666.5475081608,0.0000025623,19.4736228040,0.0698561550,686.0909871197,6.2836381633,Very Low,7.5500148235,Very Low,9.0000000000,0.0411033970,42337272.9888006300,137.6534442030,1046166175.9429298639,1088503448.9317302704,0.0015593140,0.0000038734,Very Low,2713.5270992744,0.0000219159,166.5606980512,2880.0877973256,15.2190537663,Relatively Moderate,13.5932751503,Relatively Moderate,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0005411070,0.0000037371,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021,0.0000034603,0.0000385465,True,0.0000436593 +1,T06069000802,Hawaii,HI,15,Kauai,County,7,15007,40300,06069000802,8385,992658000.0000000000,147860.5647200878,3.6108521589,18.0705830803,Relatively Low,63.0775787404,63.4969325153,18.6199401875,Relatively Low,59.6420077263,70.5521472393,324935.2155714268,98076.5248682368,0.0296790442,225560.7358958097,1297.9548073803,31.6808724993,Relatively Moderate,48.7278745931,51.8518518519,-0.1330000000,52.5091980000,Relatively Low,23.5125676106,100.0000000000,2.6254599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0699710120,202742385.5800542533,1862.6855876887,14156410466.4337959290,14359152852.0138511658,0.0000357579,0.0000000020,Very Low,507.2650077305,0.0000002606,1.9802850905,509.2452928210,2.6321796000,Very Low,2.5538810410,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0030589604,No Rating,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,0.0005345855,912658000.0000000000,8385.0000000000,63726000000.0000000000,64638658000.0000076294,0.0167507621,0.0001397988,Very Low,22512.2000000000,0.0001541200,1171.3120000000,23683.5120000000,11.8920653303,Relatively Low,13.0147002820,Relatively Low,0.0000000000,0.0000000000,912658000.0000000000,8385.0000000000,63726000000.0000000000,147860.5647200878,64638805860.5647201538,0.0000180224,0.0000000760,0.0002275779,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,2.0000000000,0.0343605913,912658000.0000000000,8385.0000000000,63726000000.0000000000,147860.5647200878,64638805860.5647201538,0.0000255348,0.0000003276,0.0002460797,Very Low,788.9305592758,0.0000968737,736.2401254130,1.3226671624,1526.4933518512,4.6757862953,Very Low,6.1662913066,Very Low,0.0000000000,0.0148900000,912658000.0000000000,8385.0000000000,63726000000.0000000000,64638658000.0000076294,0.0000058883,0.0000028944,Relatively Low,80.0189118426,0.0003613770,2746.4650635800,2826.4839754226,19.2773661946,Relatively Low,15.4429446232,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,142.0000000000,5.9166666660,59632790.0585851297,418.9266599156,3183842615.3584799767,51591.3125103788,3243526996.7295761108,0.0001804370,0.0000114831,0.0042466231,Very Low,63663.1136805333,0.0284625391,216315.2971586954,1296.2757495066,281274.6865887354,29.5879096062,Relatively High,26.9708819409,Relatively High,1.0000000000,0.0312500000,912658000.0000000000,8385.0000000000,63726000000.0000000000,147860.5647200878,64638805860.5647201538,0.0000032387,0.0000018297,0.0000727233,Very Low,92.3692287258,0.0004794348,3643.7043933928,0.3360282071,3736.4096503256,14.9734902768,Relatively Low,16.6070545485,Relatively Low,0.0000000000,0.0000653310,912658000.0000000000,8385.0000000000,63726000000.0000000000,147860.5647200878,64638805860.5647201538,0.0089662390,0.0000059784,0.0021079463,Very Low,534.6107152638,0.0000032750,24.8896914625,0.0203625042,559.5207692305,5.8706925202,Very Low,6.7469108145,Very Low,7.0000000000,0.0319693090,198555247.5326173902,978.4678896234,7436355961.1380958557,7634911208.6707124710,0.0015593140,0.0000038734,Very Low,9898.0167648649,0.0001211641,920.8471781755,10818.8639430404,23.6580872265,Relatively High,20.2115884136,Relatively Moderate,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0005411070,0.0000037371,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021,0.0000035067,0.0031812618,True,0.0000661520 +2,T06061021322,Hawaii,HI,15,Hawaii,County,1,15001,20100,06061021322,5213,409283000.0000000000,30161527.9142542519,97.0642891247,26.0474557835,Relatively High,89.4815710967,87.4233128834,24.6571275391,Relatively Moderate,83.8106105391,87.4233128834,754552.3595077734,510222.1167381129,0.0320334258,243454.0359926558,876.2067770047,33.3455935266,Relatively Moderate,67.0519519602,65.5270655271,0.9080000000,50.7751980000,Relatively Low,9.3859370029,40.0000000000,2.5387599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0579710120,1082842.5920536572,13.7920666932,104819706.8679994941,105902549.4600531608,0.0000313713,0.0000000025,Very Low,1.9692852387,0.0000000020,0.0151413322,1.9844265710,0.4142077200,Very Low,0.4374499910,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000541,No Rating,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,0.0099874373,409283000.0000000000,5213.0000000000,39618800000.0000000000,40028083000.0000000000,0.0008505842,0.0000116917,Very Low,509627.8000000000,0.0314233600,238817.5360000000,748445.3360000000,37.5977579168,Very High,44.7882310288,Very High,1.0000000000,0.0312500000,409283000.0000000000,5213.0000000000,39618800000.0000000000,30161527.9142542407,40058244527.9142456055,0.0000180224,0.0000000760,0.0002275779,Very Low,230.5075462219,0.0000123856,94.1304164907,214.5030827638,539.1410454765,5.2311349597,Very Low,5.8932581207,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0100000000,409283000.0000000000,5213.0000000000,39618800000.0000000000,30161527.9142542407,40058244527.9142456055,0.0000255348,0.0000003276,0.0002460797,Very Low,104.5094165573,0.0000170798,129.8064434247,74.2213962963,308.5372562783,2.7440512545,Very Low,3.9390063490,Very Low,0.0000000000,0.0148900000,409283000.0000000000,5213.0000000000,39618800000.0000000000,40028083000.0000000000,0.0000058883,0.0000013610,Very Low,35.8846142757,0.0001056430,802.8864714520,838.7710857277,12.8581949229,Relatively Low,11.2121138672,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0006245044,0.0000038327,0.0003492485,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,1.0000000000,0.0312500000,409283000.0000000000,5213.0000000000,39618800000.0000000000,30161527.9142542407,40058244527.9142456055,0.0000083601,0.0000003102,0.0006212585,Very Low,106.9261414761,0.0000505411,384.1124266061,585.5657605523,1076.6043286345,9.8898625798,Very Low,11.9394659724,Relatively Low,0.0000000000,0.0006781468,409283000.0000000000,5213.0000000000,39618800000.0000000000,30161527.9142542519,40058244527.9142456055,0.0003985575,0.0000002657,0.0000937001,Very Low,110.6212172132,0.0000009395,7.1398535480,1.9165373923,119.6776081535,3.5109250974,Very Low,4.3917261130,Very Low,4.0000000000,0.0182681760,315888.8587620232,2.2117928286,16809625.4977076985,17125514.3564697206,0.0006654598,0.0000038734,Very Low,3.8401775301,0.0000001565,1.1894532216,5.0296307517,1.8327269938,Very Low,1.7042906890,Very Low,4.0000000000,0.0204021391,407903840.5845158696,5201.9799937840,39535047952.7582778931,39942951793.3427886963,0.0000000070,0.0000040043,Very Low,0.0583395999,0.0004233184,3217.2197865804,3217.2781261802,17.0524727301,Relatively Low,17.9932135371,Relatively Low,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021,0.0000000358,0.0000290505,True,0.0000014426 +3,T06027000800,Hawaii,HI,15,Kauai,County,7,15007,40500,06027000800,5943,1030806000.0000000000,459516.6731830848,6.1500338151,19.0467198618,Relatively Moderate,67.4534981234,69.3251533742,18.7719774304,Relatively Low,60.4118835838,72.0858895706,332959.9571449574,167792.7734322688,0.0217301935,165149.4709508616,17.7127618271,33.1217117362,Relatively Moderate,64.7826443794,63.5327635328,0.7680000000,52.5091980000,Relatively Low,23.5125676106,100.0000000000,2.6254599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0699710120,66594737.2848528028,383.9447225607,2917979891.4611377716,2984574628.7459902763,0.0000063169,0.0000000003,Very Low,29.4350693631,0.0000000083,0.0628428106,29.4979121737,1.0184434918,Very Low,1.0330889632,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,56.0000000000,3.1111111110,0.0000000000,0.0000000000,0.0030589604,No Rating,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,0.0005860614,1030806000.0000000000,5943.0000000000,45166800000.0000000000,46197606000.0000000000,0.0167507621,0.0001397988,Very Low,120075.0000000000,0.0011438300,8693.1080000000,128768.1080000000,20.9111551033,Relatively Moderate,23.9260247408,Relatively Moderate,0.0000000000,0.0000000000,1030806000.0000000000,5943.0000000000,45166800000.0000000000,459516.6731830846,46198065516.6731948853,0.0000180224,0.0000000760,0.0002275779,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,2.0000000000,0.0289855072,1030806000.0000000000,5943.0000000000,45166800000.0000000000,459516.6731830846,46198065516.6731948853,0.0000255348,0.0000003276,0.0002460797,Very Low,762.9385502884,0.0000564393,428.9386307213,3.2776151707,1195.1547961804,4.3095415029,Very Low,5.9417734791,Very Low,0.0000000000,0.0148900000,1030806000.0000000000,5943.0000000000,45166800000.0000000000,46197606000.0000000000,0.0000058883,0.0000028944,Relatively Low,90.3777476786,0.0002561316,1946.6001040973,2036.9778517759,17.2833380202,Relatively Low,14.4752368977,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,142.0000000000,5.9166666660,40606220.8832914308,293.0385094863,2227092672.0956783295,530.1707312656,2267699423.1497006416,0.0001804370,0.0000114831,0.0042466231,Very Low,43350.6205845832,0.0199094993,151312.1945288390,13.3209920158,194676.1361054380,26.1722849103,Relatively High,24.9423944801,Relatively High,1.0000000000,0.0312500000,1030806000.0000000000,5943.0000000000,45166800000.0000000000,459516.6731830846,46198065516.6731948853,0.0000032387,0.0000018297,0.0000727233,Very Low,104.3268729204,0.0003398069,2582.5325235382,1.0442984855,2687.9036949441,13.4166096589,Relatively Low,15.5570766452,Relatively Low,0.0000000000,0.0001223370,1030806000.0000000000,5943.0000000000,45166800000.0000000000,459516.6731830848,46198065516.6731948853,0.0052856261,0.0000035243,0.0012426410,Very Low,666.5475081608,0.0000025623,19.4736228040,0.0698561550,686.0909871197,6.2836381633,Very Low,7.5500148235,Very Low,9.0000000000,0.0411033970,42337272.9888006300,137.6534442030,1046166175.9429298639,1088503448.9317302704,0.0015593140,0.0000038734,Very Low,2713.5270992744,0.0000219159,166.5606980512,2880.0877973256,15.2190537663,Relatively Moderate,13.5932751503,Relatively Moderate,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0005411070,0.0000037371,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021,0.0000034603,0.0000385465,True,0.0000436593 4,T15001021010,Hawaii,HI,15,Hawaii,County,1,15001,21010,15001021010,7884,737712000.0000000000,8711454.3090733420,58.4401512286,43.1066279987,Very High,99.4459643383,98.1595092025,42.6674572964,Very High,99.2741170486,99.0797546012,3909779.1321200719,2582125.8111252696,0.1746532017,1327364.3330713348,288.9879234675,31.8903618889,Relatively Moderate,51.0956693021,54.4159544160,-0.0020000000,50.7751980000,Relatively Low,9.3859370029,40.0000000000,2.5387599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000478451,0.0000000048,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000541,No Rating,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,0.0099998852,737712000.0000000000,7884.0000000000,59918400000.0000000000,60656112000.0000000000,0.0008505842,0.0000116917,Very Low,2580741.3999999999,0.1736765400,1319941.7039999999,3900683.1039999998,65.1861714882,Very High,74.2640163391,Very High,1.0000000000,0.0312500000,737712000.0000000000,7884.0000000000,59918400000.0000000000,8711454.3090733420,60664823454.3090744019,0.0000180224,0.0000000760,0.0002275779,Very Low,415.4782459486,0.0000187316,142.3602922696,61.9542156517,619.7927538699,5.4799587665,Very Low,5.9041560145,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0269344664,737712000.0000000000,7884.0000000000,59918400000.0000000000,8711454.3090733420,60664823454.3090744019,0.0000255348,0.0000003276,0.0002460797,Very Low,473.5051910310,0.0000651127,494.8567057547,57.2461948490,1025.6080916347,4.0952789981,Very Low,5.6221049906,Very Low,0.0000000000,0.0148900000,737712000.0000000000,7884.0000000000,59918400000.0000000000,60656112000.0000000000,0.0000058883,0.0000013610,Very Low,64.6802104328,0.0001597715,1214.2637523360,1278.9439627688,14.7995789625,Relatively Low,12.3417814165,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0006245044,0.0000038327,0.0003492485,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,1.0000000000,0.0312500000,737712000.0000000000,7884.0000000000,59918400000.0000000000,8711454.3090733420,60664823454.3090744019,0.0000083601,0.0000003102,0.0006212585,Very Low,192.7289862509,0.0000764370,580.9212298706,169.1270211135,942.7772372349,9.4618177655,Very Low,10.9242145239,Very Low,1.0000000000,0.0004673635,737712000.0000000000,7884.0000000000,59918400000.0000000000,8711454.3090733420,60664823454.3090744019,0.0006900376,0.0000004601,0.0001622266,Very Low,237.9109428670,0.0000016953,12.8843062101,0.6604918534,251.4557409305,4.4968090785,Very Low,5.3796416501,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0006654598,0.0000038734,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,4.0000000000,0.0207448000,737708710.8628113270,7883.9591351862,59918089427.4153594971,60655798138.2781677246,0.0000000070,0.0000040043,Very Low,0.1075487398,0.0006549135,4977.3427848938,4977.4503336337,19.7224171343,Relatively Low,19.9022650650,Relatively Low,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021,0.0000000408,0.0000331733,True,0.0000018765 5,T15001021101,Hawaii,HI,15,Hawaii,County,1,15001,21101,15001021101,3531,365469000.0000000000,1115552.9463470120,41.0551206444,39.6369371498,Very High,99.0514029613,96.6257668712,35.4631324234,Relatively High,97.7453635601,94.4785276074,2244880.4514211570,1569603.2441089998,0.0888473124,675239.5743199890,37.6329921689,35.2805718581,Relatively High,83.0000273575,82.3361823362,2.1180000000,50.7751980000,Relatively Low,9.3859370029,40.0000000000,2.5387599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0679710120,53358423.6905883327,515.5255139327,3917993905.8884682655,3971352329.5790553093,0.0000009778,0.0000000001,Very Low,3.5462107144,0.0000000023,0.0178004814,3.5640111958,0.5034846073,Very Low,0.5625920420,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000541,No Rating,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,0.0099998512,365469000.0000000000,3531.0000000000,26835600000.0000000000,27201069000.0000000000,0.0008505842,0.0000116917,Very Low,1549795.8000000000,0.0875910700,665692.1319999999,2215487.9320000000,53.9839983966,Very High,68.0399795668,Very High,1.0000000000,0.0312500000,365469000.0000000000,3531.0000000000,26835600000.0000000000,1115552.9463470120,27202184552.9463424683,0.0000180224,0.0000000760,0.0002275779,Very Low,205.8315698678,0.0000083893,63.7587762572,7.9336015953,277.5239477203,4.1923926160,Very Low,4.9971070139,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0289855072,365469000.0000000000,3531.0000000000,26835600000.0000000000,1115552.9463470120,27202184552.9463424683,0.0000255348,0.0000003276,0.0002460797,Very Low,270.4974447523,0.0000335331,254.8514731746,7.9569545004,533.3058724274,3.2931774779,Very Low,5.0015747332,Very Low,0.0000000000,0.0148900000,365469000.0000000000,3531.0000000000,26835600000.0000000000,27201069000.0000000000,0.0000058883,0.0000013610,Very Low,32.0431439731,0.0000715567,543.8312163240,575.8743602971,11.3433526973,Very Low,10.4651653429,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,142.0000000000,5.9166666660,4828130.5279219840,35.1384012388,267051849.4150594473,0.0000000000,271879979.9429814219,0.0006245044,0.0000038327,0.0003492485,Very Low,17839.8663537918,0.0007968309,6055.9146131274,0.0000000000,23895.7809669192,13.0070200492,Relatively Moderate,13.6546608024,Relatively Moderate,1.0000000000,0.0312500000,365469000.0000000000,3531.0000000000,26835600000.0000000000,1115552.9463470120,27202184552.9463424683,0.0000083601,0.0000003102,0.0006212585,Very Low,95.4796314509,0.0000342338,260.1766695466,21.6577094941,377.3140104915,6.9727783560,Very Low,8.9063071715,Very Low,0.0000000000,0.0003634330,365469000.0000000000,3531.0000000000,26835600000.0000000000,1115552.9463470120,27202184552.9463424683,0.0008889061,0.0000005927,0.0002089802,Very Low,118.0676167774,0.0000007606,5.7804922284,0.0847265791,123.9328355849,3.5520526364,Very Low,4.7010550308,Very Low,13.0000000000,0.0593715740,31437177.7921413518,196.0173546829,1489731895.5901708603,1521169073.3823122978,0.0006654598,0.0000038734,Very Low,1242.0638448472,0.0000450783,342.5948426489,1584.6586874961,12.4708959075,Relatively Moderate,12.2698912376,Relatively Moderate,3.0000000000,0.0188028000,365467633.7354047298,3530.9854379618,26835489328.5099411011,27200956962.2453422546,0.0000000070,0.0000040043,Very Low,0.0482928249,0.0002658574,2020.5164362008,2020.5647290257,14.6032241308,Relatively Low,16.3029908639,Relatively Low,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021,0.0000002677,0.0000337348,True,0.0000507987 6,T15007040603,Hawaii,HI,15,Kauai,County,7,15007,40603,15007040603,2544,509507000.0000000000,3763051.3782403329,15.9289735326,23.8613675670,Relatively Moderate,84.6148558545,84.9693251534,22.2413255033,Relatively Moderate,75.9028856597,83.7423312883,553788.5026946985,159866.0053362670,0.0465200191,353552.1448416796,40370.3525167520,35.0215086434,Relatively Moderate,81.3161710393,79.7720797721,1.9560000000,52.5091980000,Relatively Low,23.5125676106,100.0000000000,2.6254599000,,,,,,,,,Not Applicable,,,,,,Not Applicable,,Not Applicable,,0.0699710120,59268365.9828897640,295.9306212878,2249072721.7871074677,2308341087.7699966431,0.0000020063,0.0000000001,Very Low,8.3203647759,0.0000000014,0.0109218690,8.3312866448,0.6682062552,Very Low,0.7166933897,Very Low,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000021774,0.0000022062,0.0080465986,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,119.0000000000,6.6111111110,1994468.3763317089,1994468.3763317089,0.0030589604,Relatively Moderate,40334.3876510453,40334.3876510453,9.3173396900,Relatively Moderate,10.0118819196,Relatively Moderate,,0.0006288023,509507000.0000000000,2544.0000000000,19334400000.0000000000,19843907000.0000000000,0.0167507621,0.0001397988,Very Low,29888.8000000000,0.0002046000,1554.9600000000,31443.7600000000,13.0703357152,Relatively Low,15.8125293377,Relatively Low,0.0000000000,0.0000000000,509507000.0000000000,2544.0000000000,19334400000.0000000000,3763051.3782403329,19847670051.3782386780,0.0000180224,0.0000000760,0.0002275779,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000016,0.0000001005,0.0000761839,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,2.0000000000,0.0289855072,509500026.7867159843,2543.9789504995,19334240023.7962799072,3763051.3782403329,19847503101.9612274170,0.0000255348,0.0000003276,0.0002460797,Very Low,377.1002611632,0.0000241596,183.6127961654,26.8408852286,587.5539425572,3.4012529352,Very Low,4.9584510525,Very Low,0.0000000000,0.0148900000,509507000.0000000000,2544.0000000000,19334400000.0000000000,19843907000.0000000000,0.0000058883,0.0000028944,Relatively Low,44.6719315627,0.0001096414,833.2745523849,877.9464839477,13.0553404852,Relatively Low,11.5613443431,Relatively Low,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,,,,,,,,,Insufficient Data,,,,,,Insufficient Data,,Insufficient Data,142.0000000000,5.9166666660,119566421.2469792217,677.5008183296,5149006219.3049850464,0.0000000000,5268572640.5519647598,0.0001804370,0.0000114831,0.0042466231,Very Low,127647.4010480262,0.0460304759,349831.6169989206,0.0000000000,477479.0180469467,35.2957296359,Relatively High,35.5664685650,Very High,1.0000000000,0.0312500000,509507000.0000000000,2544.0000000000,19334400000.0000000000,3763051.3782403329,19847670051.3782386780,0.0000032387,0.0000018297,0.0000727233,Very Low,51.5667080334,0.0001454600,1105.4960019992,8.5519178837,1165.6146279163,10.1552327033,Very Low,12.4507973241,Relatively Low,0.0000000000,0.0002990171,509507000.0000000000,2544.0000000000,19334400000.0000000000,3763051.3782403329,19847670051.3782386780,0.0021625099,0.0000014419,0.0005084021,Very Low,329.4612383326,0.0000010968,8.3360081463,0.5720625944,338.3693090733,4.9645617720,Very Low,6.3071150891,Very Low,3.0000000000,0.0137011320,71084897.0818793178,86.3741073938,656443216.1930950880,727528113.2749742270,0.0015593140,0.0000038734,Relatively Low,1518.6837843730,0.0000045839,34.8375621943,1553.5213465673,12.3886737842,Relatively Moderate,11.6999323670,Relatively Moderate,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0005411070,0.0000037371,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,,,,,,,,,,,Insufficient Data,,,,,,,Insufficient Data,,Insufficient Data,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000851,0.0000001057,0.0000000000,No Rating,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,0.0000000000,No Expected Annual Losses,0.0000000000,No Rating,November 2021,0.0000182039,0.0107280896,True,0.0002521232 From c154ab22b8b5a0ca6dc3892fdf65760e5ce2b1d0 Mon Sep 17 00:00:00 2001 From: matt bowen Date: Wed, 10 Aug 2022 11:20:14 -0400 Subject: [PATCH 20/23] Update base class refactor (#1518) Now that NRI is final I needed to make a small number of updates to my refactored code. --- data/data-pipeline/data_pipeline/etl/base.py | 8 ++++---- .../etl/sources/child_opportunity_index/etl.py | 4 ---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/data/data-pipeline/data_pipeline/etl/base.py b/data/data-pipeline/data_pipeline/etl/base.py index d93721910..9f42e035c 100644 --- a/data/data-pipeline/data_pipeline/etl/base.py +++ b/data/data-pipeline/data_pipeline/etl/base.py @@ -46,7 +46,8 @@ class ExtractTransformLoad: DATA_PATH: pathlib.Path = APP_ROOT / "data" TMP_PATH: pathlib.Path = DATA_PATH / "tmp" CONTENT_CONFIG: pathlib.Path = APP_ROOT / "content" / "config" - DATASET_CONFIG: pathlib.Path = APP_ROOT / "etl" / "score" / "config" + DATASET_CONFIG_PATH: pathlib.Path = APP_ROOT / "etl" / "score" / "config" + DATASET_CONFIG: Optional[dict] = None # Parameters GEOID_FIELD_NAME: str = "GEOID10" @@ -107,7 +108,7 @@ def yaml_config_load(cls) -> dict: if cls.NAME is not None: # check if the class instance has score YAML definitions datasets_config = load_yaml_dict_from_file( - cls.DATASET_CONFIG / "datasets.yml", + cls.DATASET_CONFIG_PATH / "datasets.yml", DatasetsConfig, ) @@ -137,11 +138,10 @@ def yaml_config_load(cls) -> dict: ] for field in dataset_config["load_fields"]: cls.COLUMNS_TO_KEEP.append(field["long_name"]) + setattr(cls, field["df_field_name"], field["long_name"]) # set the constants for the class setattr(cls, field["df_field_name"], field["long_name"]) - - # return the config dict return dataset_config # This is a classmethod so it can be used by `get_data_frame` without diff --git a/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py b/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py index beace4205..07a9761b6 100644 --- a/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py +++ b/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py @@ -106,7 +106,3 @@ def transform(self) -> None: ) self.output_df = output_df - - def load(self) -> None: - logger.info("Saving CSV") - super().load() From f948c7f19938fb0740dcf478454edda0607aab08 Mon Sep 17 00:00:00 2001 From: matt bowen Date: Wed, 10 Aug 2022 13:06:46 -0400 Subject: [PATCH 21/23] Remove old comment (#1518) --- .../data_pipeline/etl/sources/child_opportunity_index/etl.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py b/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py index 07a9761b6..b3e40e3a5 100644 --- a/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py +++ b/data/data-pipeline/data_pipeline/etl/sources/child_opportunity_index/etl.py @@ -20,11 +20,6 @@ class ChildOpportunityIndex(ExtractTransformLoad): Full technical documents: https://www.diversitydatakids.org/sites/default/files/2020-02/ddk_coi2.0_technical_documentation_20200212.pdf. Github repo: https://github.com/diversitydatakids/COI/ - - - NOTE: Things to ask jorge: - - How do you decide the short name? - - I ended up not having all the same tracts in my data set and had to subset them in the tests --- okay? make up data? """ # Metadata for the baseclass From 9e5a8027a937a9f330d6a033fc1947851b83281d Mon Sep 17 00:00:00 2001 From: matt bowen Date: Wed, 10 Aug 2022 13:37:56 -0400 Subject: [PATCH 22/23] Fix type signature and return (#1518) --- data/data-pipeline/data_pipeline/etl/base.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/data-pipeline/data_pipeline/etl/base.py b/data/data-pipeline/data_pipeline/etl/base.py index 9f42e035c..b6ef269b4 100644 --- a/data/data-pipeline/data_pipeline/etl/base.py +++ b/data/data-pipeline/data_pipeline/etl/base.py @@ -103,7 +103,7 @@ def __init_subclass__(cls) -> None: cls.DATASET_CONFIG = cls.yaml_config_load() @classmethod - def yaml_config_load(cls) -> dict: + def yaml_config_load(cls) -> Optional[dict]: """Generate config dictionary and set instance variables from YAML dataset.""" if cls.NAME is not None: # check if the class instance has score YAML definitions @@ -143,6 +143,7 @@ def yaml_config_load(cls) -> dict: # set the constants for the class setattr(cls, field["df_field_name"], field["long_name"]) return dataset_config + return None # This is a classmethod so it can be used by `get_data_frame` without # needing to create an instance of the class. This is a use case in `etl_score`. From 3776e248da78916d08f7b085b3ab2649cd5ffd08 Mon Sep 17 00:00:00 2001 From: matt bowen Date: Wed, 10 Aug 2022 14:15:43 -0400 Subject: [PATCH 23/23] Update per code review (#1518) --- data/data-pipeline/data_pipeline/etl/score/config/datasets.yml | 2 +- .../data_pipeline/etl/sources/doe_energy_burden/etl.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml b/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml index 13b06aedc..5316fadde 100644 --- a/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml +++ b/data/data-pipeline/data_pipeline/etl/score/config/datasets.yml @@ -117,7 +117,7 @@ datasets: field_type: float include_in_downloadable_files: true include_in_tiles: true - - long_name: "Exaple ETL" + - long_name: "Example ETL" short_name: "Example" module_name: "example_dataset" input_geoid_tract_field_name: "GEOID10_TRACT" diff --git a/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py b/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py index 0f67c4023..52e8d3f05 100644 --- a/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py +++ b/data/data-pipeline/data_pipeline/etl/sources/doe_energy_burden/etl.py @@ -28,7 +28,7 @@ def __init__(self): self.output_df: pd.DataFrame def transform(self) -> None: - logger.info("Starting transforms.") + logger.info("Starting DOE Energy Burden transforms.") raw_df: pd.DataFrame = pd.read_csv( filepath_or_buffer=self.get_tmp_path() / "DOE_LEAD_AMI_TRACT_2018_ALL.csv", @@ -39,6 +39,7 @@ def transform(self) -> None: low_memory=False, ) + logger.info("Renaming columns and ensuring output format is correct") output_df = raw_df.rename( columns={ self.INPUT_ENERGY_BURDEN_FIELD_NAME: self.REVISED_ENERGY_BURDEN_FIELD_NAME,