From 89410dc710699a25ed557b71a74baa4515c8240b Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Tue, 7 Sep 2021 22:15:31 -0400 Subject: [PATCH 001/133] First pass of the CDC Indicator --- .github/workflows/python-ci.yml | 2 +- cdc_vaccines/.pylintrc | 22 +++ cdc_vaccines/Makefile | 25 +++ cdc_vaccines/README.md | 70 ++++++++ cdc_vaccines/REVIEW.md | 38 ++++ cdc_vaccines/cache/.gitignore | 0 cdc_vaccines/delphi_cdc_vaccines/__init__.py | 13 ++ cdc_vaccines/delphi_cdc_vaccines/__main__.py | 12 ++ cdc_vaccines/delphi_cdc_vaccines/constants.py | 54 ++++++ cdc_vaccines/delphi_cdc_vaccines/pull.py | 162 ++++++++++++++++++ cdc_vaccines/delphi_cdc_vaccines/run.py | 84 +++++++++ cdc_vaccines/params.json.template | 35 ++++ cdc_vaccines/setup.py | 29 ++++ cdc_vaccines/static/.gitignore | 0 .../tests/test_data/bad_extra_cols.csv | 8 + .../tests/test_data/bad_missing_cols.csv | 8 + .../tests/test_data/bad_missing_days.csv | 31 ++++ cdc_vaccines/tests/test_data/small.csv | 109 ++++++++++++ .../tests/test_data/small_confirmed.csv | 0 cdc_vaccines/tests/test_data/small_pull.csv | 4 + cdc_vaccines/tests/test_pull.py | 71 ++++++++ cdc_vaccines/tests/test_run.py | 80 +++++++++ 22 files changed, 856 insertions(+), 1 deletion(-) create mode 100644 cdc_vaccines/.pylintrc create mode 100644 cdc_vaccines/Makefile create mode 100644 cdc_vaccines/README.md create mode 100644 cdc_vaccines/REVIEW.md create mode 100644 cdc_vaccines/cache/.gitignore create mode 100644 cdc_vaccines/delphi_cdc_vaccines/__init__.py create mode 100644 cdc_vaccines/delphi_cdc_vaccines/__main__.py create mode 100644 cdc_vaccines/delphi_cdc_vaccines/constants.py create mode 100644 cdc_vaccines/delphi_cdc_vaccines/pull.py create mode 100644 cdc_vaccines/delphi_cdc_vaccines/run.py create mode 100644 cdc_vaccines/params.json.template create mode 100644 cdc_vaccines/setup.py create mode 100644 cdc_vaccines/static/.gitignore create mode 100644 cdc_vaccines/tests/test_data/bad_extra_cols.csv create mode 100644 cdc_vaccines/tests/test_data/bad_missing_cols.csv create mode 100644 cdc_vaccines/tests/test_data/bad_missing_days.csv create mode 100644 cdc_vaccines/tests/test_data/small.csv create mode 100644 cdc_vaccines/tests/test_data/small_confirmed.csv create mode 100644 cdc_vaccines/tests/test_data/small_pull.csv create mode 100644 cdc_vaccines/tests/test_pull.py create mode 100644 cdc_vaccines/tests/test_run.py diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index adeb011a6..45b8aea32 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-ci.yml @@ -16,7 +16,7 @@ jobs: if: github.event.pull_request.draft == false strategy: matrix: - packages: [_delphi_utils_python, changehc, claims_hosp, combo_cases_and_deaths, covid_act_now, doctor_visits, google_symptoms, hhs_hosp, hhs_facilities, jhu, nchs_mortality, nowcast, quidel, quidel_covidtest, safegraph_patterns, sir_complainsalot, usafacts] + packages: [_delphi_utils_python, changehc, claims_hosp, combo_cases_and_deaths, covid_act_now, doctor_visits, google_symptoms, hhs_hosp, hhs_facilities, jhu, nchs_mortality, nowcast, quidel, quidel_covidtest, safegraph_patterns, sir_complainsalot, usafacts, cdc_vaccines] defaults: run: working-directory: ${{ matrix.packages }} diff --git a/cdc_vaccines/.pylintrc b/cdc_vaccines/.pylintrc new file mode 100644 index 000000000..f30837c7e --- /dev/null +++ b/cdc_vaccines/.pylintrc @@ -0,0 +1,22 @@ + +[MESSAGES CONTROL] + +disable=logging-format-interpolation, + too-many-locals, + too-many-arguments, + # Allow pytest functions to be part of a class. + no-self-use, + # Allow pytest classes to have one test. + too-few-public-methods + +[BASIC] + +# Allow arbitrarily short-named variables. +variable-rgx=[a-z_][a-z0-9_]* +argument-rgx=[a-z_][a-z0-9_]* +attr-rgx=[a-z_][a-z0-9_]* + +[DESIGN] + +# Don't complain about pytest "unused" arguments. +ignored-argument-names=(_.*|run_as_module) \ No newline at end of file diff --git a/cdc_vaccines/Makefile b/cdc_vaccines/Makefile new file mode 100644 index 000000000..ca3013248 --- /dev/null +++ b/cdc_vaccines/Makefile @@ -0,0 +1,25 @@ +.PHONY = venv, lint, test, clean + +dir = $(shell find ./delphi_* -name __init__.py | grep -o 'delphi_[_[:alnum:]]*') + +venv: + python -m venv env + +install: venv + . env/bin/activate; \ + pip install wheel ; \ + pip install -e ../_delphi_utils_python ;\ + pip install -e . + +lint: + . env/bin/activate; pylint $(dir) + . env/bin/activate; pydocstyle $(dir) + +test: + . env/bin/activate ;\ + (cd tests && ../env/bin/pytest --cov=$(dir) --cov-report=term-missing) + +clean: + rm -rf env + rm -f params.json + diff --git a/cdc_vaccines/README.md b/cdc_vaccines/README.md new file mode 100644 index 000000000..b56682d0f --- /dev/null +++ b/cdc_vaccines/README.md @@ -0,0 +1,70 @@ +# CDC Vaccinations + +This indicator provides the number official vaccinations in the US. We export the county-level +daily vaccination rates data as-is, and publishes the result as a COVIDcast signal. +We also aggregate the data to the HHS, State, and Nation levels. +For detailed information see the files DETAILS.md contained in this directory. + +Note that individuals could be vaccinated outside of the US. Additionally, +there is no county level data for counties in Texas and Hawaii. There are unknown +counties in each state and a row for unknown county and unknown state. + + +## Running the Indicator + +The indicator is run by directly executing the Python module contained in this +directory. The safest way to do this is to create a virtual environment, +installed the common DELPHI tools, and then install the module and its +dependencies. To do this, run the following command from this directory: + +``` +make install +``` + +This command will install the package in editable mode, so you can make changes that +will automatically propagate to the installed package. + +All of the user-changable parameters are stored in `params.json`. To execute +the module and produce the output datasets (by default, in `receiving`), run +the following: + +``` +env/bin/python -m delphi_cdc_vaccines +``` + +If you want to enter the virtual environment in your shell, +you can run `source env/bin/activate`. Run `deactivate` to leave the virtual environment. + +Once you are finished, you can remove the virtual environment and +params file with the following: + +``` +make clean +``` + +## Testing the code + +To run static tests of the code style, run the following command: + +``` +make lint +``` + +Unit tests are also included in the module. To execute these, run the following +command from this directory: + +``` +make test +``` + +To run individual tests, run the following: + +``` +(cd tests && ../env/bin/pytest test_run.py --cov=delphi_ --cov-report=term-missing) +``` + +The output will show the number of unit tests that passed and failed, along +with the percentage of code covered by the tests. + +None of the linting or unit tests should fail, and the code lines that are not covered by unit tests should be small and +should not include critical sub-routines. diff --git a/cdc_vaccines/REVIEW.md b/cdc_vaccines/REVIEW.md new file mode 100644 index 000000000..03f87b17a --- /dev/null +++ b/cdc_vaccines/REVIEW.md @@ -0,0 +1,38 @@ +## Code Review (Python) + +A code review of this module should include a careful look at the code and the +output. To assist in the process, but certainly not in replace of it, please +check the following items. + +**Documentation** + +- [ ] the README.md file template is filled out and currently accurate; it is +possible to load and test the code using only the instructions given +- [ ] minimal docstrings (one line describing what the function does) are +included for all functions; full docstrings describing the inputs and expected +outputs should be given for non-trivial functions + +**Structure** + +- [ ] code should pass lint checks (`make lint`) +- [ ] any required metadata files are checked into the repository and placed +within the directory `static` +- [ ] any intermediate files that are created and stored by the module should +be placed in the directory `cache` +- [ ] final expected output files to be uploaded to the API are placed in the +`receiving` directory; output files should not be committed to the respository +- [ ] all options and API keys are passed through the file `params.json` +- [ ] template parameter file (`params.json.template`) is checked into the +code; no personal (i.e., usernames) or private (i.e., API keys) information is +included in this template file + +**Testing** + +- [ ] module can be installed in a new virtual environment (`make install`) +- [ ] reasonably high level of unit test coverage covering all of the main logic +of the code (e.g., missing coverage for raised errors that do not currently seem +possible to reach are okay; missing coverage for options that will be needed are +not) +- [ ] all unit tests run without errors (`make test`) +- [ ] indicator directory has been added to GitHub CI +(`covidcast-indicators/.github/workflows/python-ci.yml`) diff --git a/cdc_vaccines/cache/.gitignore b/cdc_vaccines/cache/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/cdc_vaccines/delphi_cdc_vaccines/__init__.py b/cdc_vaccines/delphi_cdc_vaccines/__init__.py new file mode 100644 index 000000000..6813595b4 --- /dev/null +++ b/cdc_vaccines/delphi_cdc_vaccines/__init__.py @@ -0,0 +1,13 @@ +# -*- coding: utf-8 -*- +"""Module to pull and clean indicators from the CDC source. + +This file defines the functions that are made public by the module. As the +module is intended to be executed though the main method, these are primarily +for testing. +""" + +from __future__ import absolute_import +from . import pull +from . import run + +__version__ = "0.1.0" diff --git a/cdc_vaccines/delphi_cdc_vaccines/__main__.py b/cdc_vaccines/delphi_cdc_vaccines/__main__.py new file mode 100644 index 000000000..32fc0eecc --- /dev/null +++ b/cdc_vaccines/delphi_cdc_vaccines/__main__.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +"""Call the function run_module when executed. + +This file indicates that calling the module (`python -m MODULE_NAME`) will +call the function `run_module` found within the run.py file. There should be +no need to change this template. +""" + +from delphi_utils import read_params +from .run import run_module # pragma: no cover + +run_module(read_params()) # pragma: no cover diff --git a/cdc_vaccines/delphi_cdc_vaccines/constants.py b/cdc_vaccines/delphi_cdc_vaccines/constants.py new file mode 100644 index 000000000..113ecb69e --- /dev/null +++ b/cdc_vaccines/delphi_cdc_vaccines/constants.py @@ -0,0 +1,54 @@ +"""Registry for variations.""" + + +from delphi_utils import Smoother + +FULL_VAC_SUM = "cumulative_counts_tot_vaccine" +FULL_VAC = "counts_tot_vaccine" +FULL_VAC_SUM_12P = "cumulative_counts_tot_vaccine_12P" +FULL_VAC_12P = "counts_tot_vaccine_12P" +FULL_VAC_SUM_18P = "cumulative_counts_tot_vaccine_18P" +FULL_VAC_18P = "counts_tot_vaccine_18P" +FULL_VAC_SUM_65P = "cumulative_counts_tot_vaccine_65P" +FULL_VAC_65P = "counts_tot_vaccine_65P" +PART_VAC_SUM = "cumulative_counts_part_vaccine" +PART_VAC = "counts_part_vaccine" +PART_VAC_SUM_12P = "cumulative_counts_part_vaccine_12P" +PART_VAC_12P = "counts_part_vaccine_12P" +PART_VAC_SUM_18P = "cumulative_counts_part_vaccine_18P" +PART_VAC_18P = "counts_part_vaccine_18P" +PART_VAC_SUM_65P = "cumulative_counts_part_vaccine_65P" +PART_VAC_65P = "counts_part_vaccine_65P" + + + +SIGNALS = [ + FULL_VAC_SUM , + FULL_VAC , + FULL_VAC_SUM_12P , + FULL_VAC_12P , + FULL_VAC_SUM_18P , + FULL_VAC_18P , + FULL_VAC_SUM_65P , + FULL_VAC_65P , + PART_VAC_SUM , + PART_VAC , + PART_VAC_SUM_12P , + PART_VAC_12P , + PART_VAC_SUM_18P , + PART_VAC_18P , + PART_VAC_SUM_65P , + PART_VAC_65P +] + +GEOS = [ + "nation", + "state_code", + "hrr", + "hhs" +] + +SMOOTHERS = [ + (Smoother("identity", impute_method=None), ""), + (Smoother("moving_average", window_length=7), "_7dav"), +] diff --git a/cdc_vaccines/delphi_cdc_vaccines/pull.py b/cdc_vaccines/delphi_cdc_vaccines/pull.py new file mode 100644 index 000000000..e19043163 --- /dev/null +++ b/cdc_vaccines/delphi_cdc_vaccines/pull.py @@ -0,0 +1,162 @@ +# -*- coding: utf-8 -*- +"""Functions for pulling data from the CDC data website for vaccines.""" +import hashlib +from logging import Logger +from delphi_utils.geomap import GeoMapper +import numpy as np +import pandas as pd + + + + + +def pull_cdcvacc_data(base_url: str, logger: Logger) -> pd.DataFrame: + """Pull the latest data from the CDC on vaccines and conform it into a dataset. + + The output dataset has: + - Each row corresponds to (County, Date), denoted (FIPS, timestamp) + - Each row additionally has columns that correspond to the counts or + cumulative counts of vaccination status (fully vaccinated, + partially vaccinated) of various age groups (all, 12+, 18+, 65+) + from December 13th 2020 until the latest date + + Note that the raw dataset gives the `cumulative` metrics, from which + we compute `counts` by taking first differences. Hence, `counts` + may be negative. This is wholly dependent on the quality of the raw + dataset. + + We filter the data such that we only keep rows with valid FIPS, or "FIPS" + codes defined under the exceptions of the README. The current exceptions + include: + # - 0: statewise unallocated + Parameters + ---------- + base_url: str + Base URL for pulling the CDC Vaccination Data + logger: Logger + Returns + ------- + pd.DataFrame + Dataframe as described above. + """ + # Columns to drop the the data frame. + drop_columns = [ + "date", + "recip_state", + "series_complete_pop_pct", + "mmwr_week", + "recip_county", + "state_id" + ] + + + # Read data + df = pd.read_csv(base_url) + logger.info("data retrieved from source", + num_rows=df.shape[0], + num_cols=df.shape[1], + min_date=min(df['Date']), + max_date=max(df['Date']), + checksum=hashlib.sha256(pd.util.hash_pandas_object(df).values).hexdigest()) + df.columns = [i.lower() for i in df.columns] + + df['recip_state'] = df['recip_state'].str.lower() + drop_columns.extend([x for x in df.columns if ("pct" in x) | ("svi" in x)]) + drop_columns = list(set(drop_columns)) + df = GeoMapper().add_geocode(df, "state_id", "state_code", + from_col="recip_state", new_col="state_id", dropna=False) + df['state_id'] = df['state_id'].fillna('0').astype(int) + # Change FIPS from 0 to XX000 for statewise unallocated cases/deaths + unassigned_index = (df["fips"] == "UNK") + df.loc[unassigned_index, "fips"] = df["state_id"].loc[unassigned_index].values * 1000 + + # Conform FIPS + df["fips"] = df["fips"].apply(lambda x: f"{int(x):05d}") + df["timestamp"] = pd.to_datetime(df["date"]) + # Drop unnecessary columns (state is pre-encoded in fips) + try: + df.drop(drop_columns, axis=1, inplace=True) + except KeyError as e: + raise ValueError( + "Tried to drop non-existent columns. The dataset " + "schema may have changed. Please investigate and " + "amend drop_columns." + ) from e + # timestamp: str -> datetime + df.columns = ["fips", + "cumulative_counts_tot_vaccine", + "cumulative_counts_tot_vaccine_12P", + "cumulative_counts_tot_vaccine_18P", + "cumulative_counts_tot_vaccine_65P", + "cumulative_counts_part_vaccine", + "cumulative_counts_part_vaccine_12P", + "cumulative_counts_part_vaccine_18P", + "cumulative_counts_part_vaccine_65P", + "timestamp"] + df_dummy = df.loc[(df["fips"]!='00000') & (df["timestamp"] == min(df["timestamp"]))].copy() + #handle fips 00000 separately + df_oth = df.loc[((df["fips"]=='00000') & + (df["timestamp"]==min(df[df['fips'] == '00000']['timestamp'])))].copy() + df_dummy = pd.concat([df_dummy, df_oth]) + df_dummy.loc[:, "timestamp"] = df_dummy.loc[:, "timestamp"] - pd.Timedelta(days=1) + df_dummy.loc[:, ["cumulative_counts_tot_vaccine", + "cumulative_counts_tot_vaccine_12P", + "cumulative_counts_tot_vaccine_18P", + "cumulative_counts_tot_vaccine_65P", + "cumulative_counts_part_vaccine", + "cumulative_counts_part_vaccine_12P", + "cumulative_counts_part_vaccine_18P", + "cumulative_counts_part_vaccine_65P", + ]] = 0 + + df =pd.concat([df_dummy, df]) + # Obtain new_counts + df.sort_values(["fips", "timestamp"], inplace=True) + df["counts_tot_vaccine"] = df["cumulative_counts_tot_vaccine"].diff() # 1st discrete difference + df["counts_tot_vaccine_12P"] = df["cumulative_counts_tot_vaccine_12P"].diff() + df["counts_tot_vaccine_18P"] = df["cumulative_counts_tot_vaccine_18P"].diff() + df["counts_tot_vaccine_65P"] = df["cumulative_counts_tot_vaccine_65P"].diff() + df["counts_part_vaccine"] = df["cumulative_counts_part_vaccine"].diff() + df["counts_part_vaccine_12P"] = df["cumulative_counts_part_vaccine_12P"].diff() + df["counts_part_vaccine_18P"] = df["cumulative_counts_part_vaccine_18P"].diff() + df["counts_part_vaccine_65P"] = df["cumulative_counts_part_vaccine_65P"].diff() + + rem_list = [ x for x in list(df.columns) if x not in ['timestamp', 'fips'] ] + # Handle edge cases where we diffed across fips + mask = df["fips"] != df["fips"].shift(1) + df.loc[mask, rem_list] = np.nan + print(rem_list) + df.reset_index(inplace=True, drop=True) + # Final sanity checks + unique_days = df["timestamp"].unique() + min_timestamp = min(unique_days) + max_timestamp = max(unique_days) + n_days = (max_timestamp - min_timestamp) / np.timedelta64(1, "D") + 1 + if n_days != len(unique_days): + raise ValueError( + f"Not every day between {min_timestamp} and " + "{max_timestamp} is represented." + ) + return df.loc[ + df["timestamp"] >= min(df["timestamp"]), + [ # Reorder + "fips", + "timestamp", + "cumulative_counts_tot_vaccine", + "counts_tot_vaccine", + "cumulative_counts_tot_vaccine_12P", + "counts_tot_vaccine_12P", + "cumulative_counts_tot_vaccine_18P", + "counts_tot_vaccine_18P", + "cumulative_counts_tot_vaccine_65P", + "counts_tot_vaccine_65P", + "cumulative_counts_part_vaccine", + "counts_part_vaccine", + "cumulative_counts_part_vaccine_12P", + "counts_part_vaccine_12P", + "cumulative_counts_part_vaccine_18P", + "counts_part_vaccine_18P", + "cumulative_counts_part_vaccine_65P", + "counts_part_vaccine_65P" + ], + ].reset_index(drop=True) diff --git a/cdc_vaccines/delphi_cdc_vaccines/run.py b/cdc_vaccines/delphi_cdc_vaccines/run.py new file mode 100644 index 000000000..455ca44d2 --- /dev/null +++ b/cdc_vaccines/delphi_cdc_vaccines/run.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +"""Functions to call when running the function. + +This module should contain a function called `run_module`, that is executed +when the module is run with `python -m MODULE_NAME`. `run_module`'s lone argument should be a +nested dictionary of parameters loaded from the params.json file. We expect the `params` to have +the following structure: + - "common": + - "export_dir": str, directory to which the results are exported + - "log_filename": (optional) str, path to log file + - "indicator": (optional) + - "wip_signal": (optional) Any[str, bool], list of signals that are works in progress, or + True if all signals in the registry are works in progress, or False if only + unpublished signals are. See `delphi_utils.add_prefix()` + - Any other indicator-specific settings +""" +from datetime import timedelta, datetime +from itertools import product +import time as tm +import numpy as np +from delphi_utils.export import create_export_csv +from delphi_utils.geomap import GeoMapper +from delphi_utils import get_structured_logger +from .constants import GEOS, SIGNALS, SMOOTHERS +from .pull import pull_cdcvacc_data + + +def run_module(params): + """ + Run the indicator. + + Arguments + -------- + params: Dict[str, Any] + Nested dictionary of parameters. + """ + start_time = tm.time() + logger = get_structured_logger( + __name__, filename=params["common"].get("log_filename"), + log_exceptions=params["common"].get("log_exceptions", True)) + base_url = params["indicator"]["base_url"] + ## build the base version of the signal at the most detailed geo level you can get. + all_data = pull_cdcvacc_data(base_url, logger) + run_stats = [] + ## aggregate & smooth + for (sensor, smoother, geo) in product(SIGNALS, SMOOTHERS, GEOS): + logger.info("Running on ", + sensor=sensor, + smoother=smoother, + geo=geo) + df = GeoMapper().replace_geocode( + all_data[['timestamp','fips', sensor]],from_col='fips', + from_code="fips", + new_col="geo_id", + new_code=geo, + date_col="timestamp") + df["val"] = df[["geo_id", sensor]].groupby("geo_id")[sensor].transform( + smoother[0].smooth + ) + df["se"] = np.nan + df["sample_size"] = np.nan + sensor_name = sensor + smoother[1] + if not(("cumulative" in sensor_name) and ("7dav" in sensor_name)): + # don't export first 6 days for smoothed signals since they'll be nan. + start_date = min(df.timestamp) + timedelta(6) if smoother[1] else min(df.timestamp) + exported_csv_dates = create_export_csv( + df, + params["common"]["export_dir"], + geo, + sensor_name, + start_date=start_date) + if len(exported_csv_dates) > 0: + run_stats.append((max(exported_csv_dates), len(exported_csv_dates))) + ## log this indicator run + elapsed_time_in_seconds = round(tm.time() - start_time, 2) + min_max_date = run_stats and min(s[0] for s in run_stats) + csv_export_count = sum(s[-1] for s in run_stats) + max_lag_in_days = min_max_date and (datetime.now() - min_max_date).days + formatted_min_max_date = min_max_date and min_max_date.strftime("%Y-%m-%d") + logger.info("Completed indicator run", + elapsed_time_in_seconds = elapsed_time_in_seconds, + csv_export_count = csv_export_count, + max_lag_in_days = max_lag_in_days, + oldest_final_export_date = formatted_min_max_date) diff --git a/cdc_vaccines/params.json.template b/cdc_vaccines/params.json.template new file mode 100644 index 000000000..3d5337846 --- /dev/null +++ b/cdc_vaccines/params.json.template @@ -0,0 +1,35 @@ +{ + "common": { + "export_dir": "./receiving", + "log_filename": "cdc_vaccines.log" + }, + "indicator": { + "base_url": "https://data.cdc.gov/api/views/8xkx-amqh/rows.csv", + "export_start_date": "2020-12-13" + }, + "validation": { + "common": { + "data_source": "cdc", + "span_length": 14, + "min_expected_lag": {"all": "1"}, + "max_expected_lag": {"all": "7"}, + "dry_run": true, + "suppressed_errors": [] + }, + "static": { + "minimum_sample_size": 0, + "missing_se_allowed": true, + "missing_sample_size_allowed": true + }, + "dynamic": {} + }, + "archive": { + "aws_credentials": { + "aws_access_key_id": "", + "aws_secret_access_key": "" + }, + "bucket_name": "", + "indicator_prefix": "usafacts", + "cache_dir": "./cache" + } +} diff --git a/cdc_vaccines/setup.py b/cdc_vaccines/setup.py new file mode 100644 index 000000000..8802dfd45 --- /dev/null +++ b/cdc_vaccines/setup.py @@ -0,0 +1,29 @@ +from setuptools import setup +from setuptools import find_packages + +required = [ + "numpy", + "pandas", + "pydocstyle", + "pytest", + "pytest-cov", + "pylint==2.8.3", + "delphi-utils", + "covidcast" +] + +setup( + name="delphi_cdc_vaccines", + version="0.0.1", + description="The number of people who are vaccinated per county.", + author="Ananya Joshi", + author_email="aajoshi@andrew.cmu.edu", + url="https://github.com/cmu-delphi/covidcast-indicators", + install_requires=required, + classifiers=[ + "Development Status :: 0 - Attempt", + "Intended Audience :: Developers", + "Programming Language :: Python :: 3.8", + ], + packages=find_packages(), +) diff --git a/cdc_vaccines/static/.gitignore b/cdc_vaccines/static/.gitignore new file mode 100644 index 000000000..e69de29bb diff --git a/cdc_vaccines/tests/test_data/bad_extra_cols.csv b/cdc_vaccines/tests/test_data/bad_extra_cols.csv new file mode 100644 index 000000000..6642296a1 --- /dev/null +++ b/cdc_vaccines/tests/test_data/bad_extra_cols.csv @@ -0,0 +1,8 @@ +Date,FIPS,MMWR_week,Recip_County,Recip_State,Series_Complete_Pop_Pct,Series_Complete_Yes,Series_Complete_12Plus,Series_Complete_12PlusPop_Pct,Series_Complete_18Plus,Series_Complete_18PlusPop_Pct,Series_Complete_65Plus,Series_Complete_65PlusPop_Pct,Completeness_pct,Administered_Dose1_Recip,Administered_Dose1_Pop_Pct,Administered_Dose1_Recip_12Plus,Administered_Dose1_Recip_12PlusPop_Pct,Administered_Dose1_Recip_18Plus,Administered_Dose1_Recip_18PlusPop_Pct,Administered_Dose1_Recip_65Plus,Administered_Dose1_Recip_65PlusPop_Pct,SVI_CTGY,Series_Complete_Pop_Pct_SVI,Series_Complete_12PlusPop_Pct_SVI,Series_Complete_18PlusPop_Pct_SVI,Series_Complete_65PlusPop_Pct_SVI,Extra_Administered_Dose1_Recip_12PlusPop_Pct,Extra_Administered_Dose1_Recip_18Plus,Extra_Administered_Dose1_Recip_18PlusPop_Pct,Extra_Administered_Dose1_Recip_65Plus,Extra_Administered_Dose1_Recip_65PlusPop_Pct,Extra_SVI_CTGY +8/26/21,UNK,34,Unknown County,UNK,0,789625,789591,0,733809,0,55620,0,0,1119266,0,1119203,0,1035082,0,75596,0,,,,,,0,1035082,0,75596,0, +8/26/21,32013,34,Humboldt County,NV,32.9,5537,5535,40.2,5368,43.6,1696,69.9,94.9,6293,37.4,6290,45.6,6014,48.9,1877,77.3,Mod-High,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI,Mod-High VC/Mod-High SVI,Mod-High VC/Mod-High SVI,45.6,6014,48.9,1877,77.3,Mod-High +8/26/21,47131,34,Obion County,TN,28.4,8529,8529,33.1,8412,35.7,4114,66,97.8,10758,35.8,10755,41.7,10520,44.6,4625,74.2,High,Low VC/High SVI,Low-Mod VC/High SVI,Low-Mod VC/High SVI,Mod-High VC/High SVI,41.7,10520,44.6,4625,74.2,High +8/26/21,48305,34,Lynn County,TX,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,High,,,,,0,0,0,0,0,High +8/26/21,UNK,34,Unknown County,VA,0,2358403,2352494,0,2206696,0,603704,0,51.3,2705300,0,2696267,0,2516857,0,660454,0,,,,,,0,2516857,0,660454,0, +8/26/21,51678,34,Lexington city,VA,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,Low-Mod,,,,,0,0,0,0,0,Low-Mod +8/26/21,50025,34,Windham County,VT,56.8,23963,23963,64,22620,65.1,7718,76.5,73.7,27598,65.4,27588,73.7,25830,74.3,8588,85.1,Low-Mod,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI,73.7,25830,74.3,8588,85.1,Low-Mod \ No newline at end of file diff --git a/cdc_vaccines/tests/test_data/bad_missing_cols.csv b/cdc_vaccines/tests/test_data/bad_missing_cols.csv new file mode 100644 index 000000000..4efd5c1bd --- /dev/null +++ b/cdc_vaccines/tests/test_data/bad_missing_cols.csv @@ -0,0 +1,8 @@ +Date,FIPS,MMWR_week,Recip_County,Recip_State,Series_Complete_Pop_Pct,Series_Complete_65PlusPop_Pct,Administered_Dose1_Recip_12Plus,Administered_Dose1_Recip_12PlusPop_Pct,Administered_Dose1_Recip_18Plus,Administered_Dose1_Recip_18PlusPop_Pct,Administered_Dose1_Recip_65Plus +8/26/21,UNK,34,Unknown County,UNK,0,0,1119203,0,1035082,0,75596 +8/26/21,32013,34,Humboldt County,NV,32.9,69.9,6290,45.6,6014,48.9,1877 +8/26/21,47131,34,Obion County,TN,28.4,66,10755,41.7,10520,44.6,4625 +8/26/21,48305,34,Lynn County,TX,0,0,0,0,0,0,0 +8/26/21,UNK,34,Unknown County,VA,0,0,2696267,0,2516857,0,660454 +8/26/21,51678,34,Lexington city,VA,0,0,0,0,0,0,0 +8/26/21,50025,34,Windham County,VT,56.8,76.5,27588,73.7,25830,74.3,8588 \ No newline at end of file diff --git a/cdc_vaccines/tests/test_data/bad_missing_days.csv b/cdc_vaccines/tests/test_data/bad_missing_days.csv new file mode 100644 index 000000000..75a15510c --- /dev/null +++ b/cdc_vaccines/tests/test_data/bad_missing_days.csv @@ -0,0 +1,31 @@ +Date,FIPS,MMWR_week,Recip_County,Recip_State,Series_Complete_Pop_Pct,Series_Complete_Yes,Series_Complete_12Plus,Series_Complete_12PlusPop_Pct,Series_Complete_18Plus,Series_Complete_18PlusPop_Pct,Series_Complete_65Plus,Series_Complete_65PlusPop_Pct,Completeness_pct,Administered_Dose1_Recip,Administered_Dose1_Pop_Pct,Administered_Dose1_Recip_12Plus,Administered_Dose1_Recip_12PlusPop_Pct,Administered_Dose1_Recip_18Plus,Administered_Dose1_Recip_18PlusPop_Pct,Administered_Dose1_Recip_65Plus,Administered_Dose1_Recip_65PlusPop_Pct,SVI_CTGY,Series_Complete_Pop_Pct_SVI,Series_Complete_12PlusPop_Pct_SVI,Series_Complete_18PlusPop_Pct_SVI,Series_Complete_65PlusPop_Pct_SVI +8/25/21,26007,34,Alpena County,MI,44.8,12730,12730,51,12344,53.5,5137,75.8,93.8,13426,47.3,13425,53.8,13293,57.6,5593,82.5,Low-Mod,Mod-High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/25/21,30071,34,Phillips County,MT,33.8,1337,1337,40.1,1295,43,618,67.5,95.6,1513,38.3,1511,45.4,1450,48.1,665,72.6,Low-Mod,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/25/21,41029,34,Jackson County,OR,46,101653,101502,53.2,97081,55.2,37628,75.5,97.7,115107,52.1,114881,60.2,109038,62,40450,81.1,Mod-High,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/25/21,UNK,34,Unknown County,UNK,0,787349,787315,0,731890,0,55518,0,0,1116357,0,1116294,0,1032597,0,75307,0,,,,, +8/25/21,49041,34,Sevier County,UT,30.7,6630,6630,37.5,6350,41.3,2602,72.9,97.2,8092,37.4,8089,45.8,7606,49.5,2928,82.1,Low-Mod,Low-Mod VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/25/21,26013,34,Baraga County,MI,48.8,4002,4001,54.4,3927,57.7,1440,77.1,93.8,4225,51.5,4224,57.5,4156,61,1481,79.3,Mod-High,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/24/21,30071,34,Phillips County,MT,33.8,1337,1337,40.1,1295,43,618,67.5,95.6,1513,38.3,1511,45.4,1450,48.1,665,72.6,Low-Mod,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/24/21,26007,34,Alpena County,MI,44.8,12719,12719,50.9,12338,53.4,5137,75.8,93.8,13422,47.3,13421,53.8,13289,57.6,5593,82.5,Low-Mod,Mod-High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/24/21,26013,34,Baraga County,MI,48.8,4002,4001,54.4,3927,57.7,1440,77.1,93.8,4225,51.5,4224,57.5,4156,61,1481,79.3,Mod-High,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/24/21,41029,34,Jackson County,OR,46,101651,101500,53.2,97079,55.2,37627,75.5,97.7,115101,52.1,114875,60.2,109032,62,40448,81.1,Mod-High,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/24/21,49041,34,Sevier County,UT,30.6,6607,6607,37.4,6328,41.2,2597,72.8,97.2,8050,37.2,8047,45.6,7567,49.2,2921,81.9,Low-Mod,Low-Mod VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/24/21,UNK,34,Unknown County,UNK,0,785133,785100,0,730087,0,55397,0,0,1113646,0,1113584,0,1030330,0,75003,0,,,,, +8/23/21,41029,34,Jackson County,OR,45.9,101501,101350,53.1,96953,55.1,37621,75.5,97.7,114861,52,114635,60,108835,61.9,40432,81.1,Mod-High,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/23/21,49041,34,Sevier County,UT,30.3,6557,6557,37.1,6295,41,2586,72.5,97.2,7920,36.6,7918,44.8,7478,48.7,2913,81.7,Low-Mod,Low-Mod VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/23/21,26007,34,Alpena County,MI,44.8,12714,12714,50.9,12334,53.4,5137,75.8,93.8,13422,47.3,13421,53.8,13289,57.6,5593,82.5,Low-Mod,Mod-High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/23/21,30071,34,Phillips County,MT,33.8,1336,1336,40.1,1294,42.9,617,67.4,95.6,1513,38.3,1511,45.4,1450,48.1,665,72.6,Low-Mod,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/23/21,26013,34,Baraga County,MI,48.7,4001,4000,54.4,3926,57.6,1440,77.1,93.8,4225,51.5,4224,57.5,4156,61,1481,79.3,Mod-High,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/23/21,UNK,34,Unknown County,UNK,0,783092,783059,0,728591,0,55262,0,0,1111277,0,1111215,0,1028562,0,74699,0,,,,, +8/21/21,49041,33,Sevier County,UT,30.3,6557,6557,37.1,6295,41,2586,72.5,97.2,7919,36.6,7917,44.8,7477,48.7,2913,81.7,Low-Mod,Low-Mod VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/21/21,26013,33,Baraga County,MI,48.7,3997,3996,54.4,3922,57.6,1438,77,93.8,4224,51.5,4223,57.5,4155,61,1480,79.3,Mod-High,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/21/21,30071,33,Phillips County,MT,33.8,1335,1335,40.1,1293,42.9,617,67.4,95.6,1513,38.3,1511,45.4,1450,48.1,665,72.6,Low-Mod,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/21/21,41029,33,Jackson County,OR,45.7,101069,100918,52.9,96575,54.9,37554,75.3,97.7,114032,51.6,113806,59.6,108142,61.5,40324,80.9,Mod-High,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/21/21,26007,33,Alpena County,MI,44.7,12697,12697,50.9,12320,53.4,5133,75.7,93.8,13418,47.2,13417,53.7,13285,57.5,5592,82.5,Low-Mod,Mod-High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/21/21,UNK,33,Unknown County,UNK,0,777853,777820,0,724853,0,55045,0,0,1103847,0,1103785,0,1023256,0,74303,0,,,,, +8/19/21,26013,33,Baraga County,MI,48.6,3991,3990,54.3,3916,57.5,1437,77,93.8,4220,51.4,4219,57.4,4151,60.9,1480,79.3,Mod-High,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/19/21,41029,33,Jackson County,OR,45.6,100654,100503,52.6,96215,54.7,37479,75.2,97.7,113175,51.2,112949,59.2,107380,61.1,40201,80.6,Mod-High,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/19/21,UNK,33,Unknown County,UNK,0,772959,772926,0,720903,0,54789,0,0,1096323,0,1096261,0,1017125,0,73976,0,,,,, +8/19/21,30071,33,Phillips County,MT,33.5,1326,1326,39.8,1284,42.6,615,67.1,95.6,1501,38,1499,45,1438,47.7,664,72.5,Low-Mod,Low-Mod VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/19/21,49041,33,Sevier County,UT,30.2,6526,6526,37,6267,40.8,2576,72.2,97.1,7827,36.2,7825,44.3,7395,48.1,2904,81.4,Low-Mod,Low-Mod VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/19/21,26007,33,Alpena County,MI,44.6,12662,12662,50.7,12296,53.3,5130,75.7,93.8,13406,47.2,13405,53.7,13276,57.5,5591,82.5,Low-Mod,Mod-High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI \ No newline at end of file diff --git a/cdc_vaccines/tests/test_data/small.csv b/cdc_vaccines/tests/test_data/small.csv new file mode 100644 index 000000000..d4243a035 --- /dev/null +++ b/cdc_vaccines/tests/test_data/small.csv @@ -0,0 +1,109 @@ +Date,FIPS,MMWR_week,Recip_County,Recip_State,Series_Complete_Pop_Pct,Series_Complete_Yes,Series_Complete_12Plus,Series_Complete_12PlusPop_Pct,Series_Complete_18Plus,Series_Complete_18PlusPop_Pct,Series_Complete_65Plus,Series_Complete_65PlusPop_Pct,Completeness_pct,Administered_Dose1_Recip,Administered_Dose1_Pop_Pct,Administered_Dose1_Recip_12Plus,Administered_Dose1_Recip_12PlusPop_Pct,Administered_Dose1_Recip_18Plus,Administered_Dose1_Recip_18PlusPop_Pct,Administered_Dose1_Recip_65Plus,Administered_Dose1_Recip_65PlusPop_Pct,SVI_CTGY,Series_Complete_Pop_Pct_SVI,Series_Complete_12PlusPop_Pct_SVI,Series_Complete_18PlusPop_Pct_SVI,Series_Complete_65PlusPop_Pct_SVI +8/19/21,72121,33,Sabana Grande Municipio,PR,66.1,14360,14360,74.2,13402,75.2,4236,99.9,96,16305,75.1,16305,84.2,15052,84.5,4587,99.9,Mod-High,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/19/21,72129,33,San Lorenzo Municipio,PR,56.9,20489,20481,63.8,18994,64.3,4771,78,96,24048,66.8,24031,74.9,22111,74.9,5805,94.9,Low-Mod,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/19/21,55031,33,Douglas County,WI,35.2,15169,15169,40.3,14557,41.9,5178,62.5,97,18005,41.7,18005,47.9,17155,49.4,5778,69.7,Low-Mod,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/19/21,47067,33,Hancock County,TN,24.7,1634,1634,28.6,1613,30.8,676,47,97.8,1818,27.5,1818,31.8,1789,34.2,726,50.5,High,Low VC/High SVI,Low VC/High SVI,Low-Mod VC/High SVI,Low-Mod VC/High SVI +8/19/21,UNK,33,Unknown County,UNK,0,772959,772926,0,720903,0,54789,0,0,1096323,0,1096261,0,1017125,0,73976,0,,,,, +8/19/21,48153,33,Floyd County,TX,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,High,,,, +8/19/21,49031,33,Piute County,UT,29.7,439,439,33.7,435,38.7,244,58.7,97.1,527,35.6,527,40.5,518,46.1,275,66.1,Low-Mod,Low VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/19/21,1043,33,Cullman County,AL,27.7,23211,23210,32.5,22877,35.2,9906,63,91.9,29475,35.2,29470,41.3,28641,44.1,11151,70.9,Mod-High,Low VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI +8/19/21,UNK,33,Unknown County,TN,0,59660,59642,0,58874,0,15125,0,97.8,74682,0,74626,0,72349,0,17334,0,,,,, +8/19/21,18109,33,Morgan County,IN,44.5,31398,31397,51.9,30057,55,10392,85.2,98.6,33772,47.9,33771,55.8,32057,58.6,10663,87.4,Low,Mod-High VC/Low SVI,High VC/Low SVI,High VC/Low SVI,High VC/Low SVI +8/19/21,56009,33,Converse County,WY,25.1,3466,3466,29.9,3397,32.5,1436,60.4,96.4,3971,28.7,3970,34.2,3864,37,1604,67.4,Low,Low VC/Low SVI,Low VC/Low SVI,Low-Mod VC/Low SVI,Mod-High VC/Low SVI +8/19/21,18099,33,Marshall County,IN,36.7,16967,16967,43.6,16139,46.5,6135,72.6,98.6,18507,40,18505,47.6,17320,49.9,6355,75.2,Mod-High,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI +8/18/21,48153,33,Floyd County,TX,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,High,,,, +8/18/21,49031,33,Piute County,UT,29.7,439,439,33.7,435,38.7,244,58.7,97.1,527,35.6,527,40.5,518,46.1,275,66.1,Low-Mod,Low VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/18/21,55031,33,Douglas County,WI,35.1,15136,15136,40.2,14529,41.9,5171,62.4,97,17954,41.6,17954,47.7,17116,49.3,5773,69.7,Low-Mod,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/18/21,72129,33,San Lorenzo Municipio,PR,56.9,20465,20457,63.7,18973,64.2,4768,77.9,96,23962,66.6,23945,74.6,22040,74.6,5801,94.8,Low-Mod,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/18/21,56009,33,Converse County,WY,25.1,3465,3465,29.8,3396,32.5,1436,60.4,96.4,3963,28.7,3962,34.1,3856,36.9,1604,67.4,Low,Low VC/Low SVI,Low VC/Low SVI,Low-Mod VC/Low SVI,Mod-High VC/Low SVI +8/18/21,1043,33,Cullman County,AL,27.6,23088,23087,32.4,22765,35,9883,62.8,91.9,29328,35,29323,41.1,28502,43.9,11133,70.8,Mod-High,Low VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI +8/18/21,18109,33,Morgan County,IN,44.5,31348,31347,51.8,30021,54.9,10388,85.1,98.6,33713,47.8,33712,55.7,32002,58.5,10656,87.3,Low,Mod-High VC/Low SVI,High VC/Low SVI,High VC/Low SVI,High VC/Low SVI +8/18/21,72121,33,Sabana Grande Municipio,PR,65.9,14319,14319,73.9,13369,75,4233,99.9,96,16232,74.8,16232,83.8,14988,84.1,4574,99.9,Mod-High,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/18/21,18099,33,Marshall County,IN,36.6,16939,16939,43.5,16112,46.4,6128,72.5,98.6,18474,39.9,18472,47.5,17293,49.8,6355,75.2,Mod-High,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI +8/18/21,UNK,33,Unknown County,UNK,0,770751,770718,0,719193,0,54698,0,0,1092878,0,1092816,0,1014393,0,73827,0,,,,, +8/18/21,UNK,33,Unknown County,TN,0,59506,59488,0,58728,0,15089,0,97.8,74350,0,74295,0,72040,0,17267,0,,,,, +8/18/21,47067,33,Hancock County,TN,24.6,1631,1631,28.5,1610,30.7,675,46.9,97.8,1810,27.3,1810,31.6,1783,34,724,50.3,High,Low VC/High SVI,Low VC/High SVI,Low-Mod VC/High SVI,Low-Mod VC/High SVI +8/17/21,UNK,33,Unknown County,UNK,0,768634,768601,0,717447,0,54645,0,0,1089178,0,1089116,0,1011387,0,73711,0,,,,, +8/17/21,18099,33,Marshall County,IN,36.5,16891,16891,43.4,16078,46.3,6123,72.4,98.6,18392,39.8,18390,47.3,17259,49.7,6354,75.2,Mod-High,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI +8/17/21,55031,33,Douglas County,WI,35,15121,15121,40.2,14515,41.8,5168,62.4,97,17936,41.6,17936,47.7,17098,49.3,5771,69.6,Low-Mod,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/17/21,49031,33,Piute County,UT,29.1,431,431,33.1,427,38,238,57.2,97.1,521,35.2,521,40,514,45.8,275,66.1,Low-Mod,Low VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/17/21,72129,33,San Lorenzo Municipio,PR,56.9,20465,20457,63.7,18973,64.2,4768,77.9,96,23962,66.6,23945,74.6,22040,74.6,5801,94.8,Low-Mod,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/17/21,UNK,33,Unknown County,TN,0,59345,59327,0,58576,0,15053,0,97.8,74078,0,74023,0,71776,0,17214,0,,,,, +8/17/21,56009,33,Converse County,WY,25.1,3463,3463,29.8,3394,32.5,1436,60.4,96.4,3961,28.7,3960,34.1,3854,36.9,1604,67.4,Low,Low VC/Low SVI,Low VC/Low SVI,Low-Mod VC/Low SVI,Mod-High VC/Low SVI +8/17/21,47067,33,Hancock County,TN,24.6,1629,1629,28.5,1608,30.7,675,46.9,97.8,1806,27.3,1806,31.6,1779,34,724,50.3,High,Low VC/High SVI,Low VC/High SVI,Low-Mod VC/High SVI,Low-Mod VC/High SVI +8/17/21,18109,33,Morgan County,IN,44.4,31316,31315,51.7,29996,54.9,10387,85.1,98.6,33662,47.8,33661,55.6,31960,58.4,10651,87.3,Low,Mod-High VC/Low SVI,High VC/Low SVI,High VC/Low SVI,High VC/Low SVI +8/17/21,48153,33,Floyd County,TX,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,High,,,, +8/17/21,1043,33,Cullman County,AL,27.5,23032,23031,32.3,22712,35,9875,62.8,91.9,29254,34.9,29249,41,28431,43.8,11126,70.7,Mod-High,Low VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI +8/17/21,72121,33,Sabana Grande Municipio,PR,65.9,14319,14319,73.9,13369,75,4233,99.9,96,16232,74.8,16232,83.8,14988,84.1,4574,99.9,Mod-High,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/16/21,UNK,33,Unknown County,TN,0,59321,59303,0,58555,0,15048,0,97.8,73946,0,73891,0,71657,0,17203,0,,,,, +8/16/21,18099,33,Marshall County,IN,36.5,16879,16879,43.4,16068,46.3,6122,72.4,98.6,18369,39.7,18367,47.2,17239,49.7,6351,75.1,Mod-High,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI +8/16/21,1043,33,Cullman County,AL,27.4,22971,22970,32.2,22657,34.9,9869,62.7,91.9,29137,34.8,29132,40.9,28333,43.6,11111,70.6,Mod-High,Low VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI +8/16/21,72129,33,San Lorenzo Municipio,PR,56.8,20426,20418,63.6,18941,64.1,4761,77.8,96,23869,66.3,23852,74.3,21971,74.4,5797,94.8,Low-Mod,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/16/21,55031,33,Douglas County,WI,35,15120,15120,40.2,14515,41.8,5168,62.4,97,17928,41.5,17928,47.7,17090,49.2,5771,69.6,Low-Mod,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/16/21,72121,33,Sabana Grande Municipio,PR,65.9,14305,14305,73.9,13359,75,4231,99.9,96,16159,74.4,16159,83.4,14924,83.8,4561,99.9,Mod-High,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/16/21,56009,33,Converse County,WY,24.8,3433,3433,29.6,3369,32.2,1431,60.2,96.4,3902,28.2,3901,33.6,3809,36.5,1590,66.8,Low,Low VC/Low SVI,Low VC/Low SVI,Low-Mod VC/Low SVI,Mod-High VC/Low SVI +8/16/21,18109,33,Morgan County,IN,44.4,31271,31270,51.6,29963,54.8,10384,85.1,98.6,33622,47.7,33621,55.5,31929,58.4,10648,87.3,Low,Mod-High VC/Low SVI,High VC/Low SVI,High VC/Low SVI,High VC/Low SVI +8/16/21,UNK,33,Unknown County,UNK,0,766588,766555,0,716121,0,54544,0,0,1085417,0,1085355,0,1008952,0,73510,0,,,,, +8/16/21,47067,33,Hancock County,TN,24.6,1629,1629,28.5,1608,30.7,676,47,97.8,1805,27.3,1805,31.6,1778,34,724,50.3,High,Low VC/High SVI,Low VC/High SVI,Low-Mod VC/High SVI,Low-Mod VC/High SVI +8/16/21,48153,33,Floyd County,TX,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,High,,,, +8/16/21,49031,33,Piute County,UT,29.1,431,431,33.1,427,38,238,57.2,97.1,521,35.2,521,40,514,45.8,275,66.1,Low-Mod,Low VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/15/21,72129,33,San Lorenzo Municipio,PR,56.7,20413,20405,63.6,18928,64.1,4755,77.7,96,23830,66.2,23813,74.2,21945,74.3,5792,94.7,Low-Mod,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/15/21,48153,33,Floyd County,TX,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,High,,,, +8/15/21,47067,33,Hancock County,TN,24.6,1628,1628,28.5,1607,30.7,676,47,97.8,1804,27.3,1804,31.5,1777,33.9,723,50.2,High,Low VC/High SVI,Low VC/High SVI,Low-Mod VC/High SVI,Low-Mod VC/High SVI +8/15/21,1043,33,Cullman County,AL,27.3,22861,22860,32.1,22570,34.7,9861,62.7,91.9,28943,34.6,28938,40.6,28169,43.4,11095,70.5,Mod-High,Low VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI +8/15/21,18109,33,Morgan County,IN,44.3,31220,31219,51.6,29919,54.7,10381,85.1,98.6,33573,47.6,33572,55.5,31893,58.3,10645,87.2,Low,Mod-High VC/Low SVI,High VC/Low SVI,High VC/Low SVI,High VC/Low SVI +8/15/21,55031,33,Douglas County,WI,34.9,15080,15080,40.1,14483,41.7,5162,62.3,97,17875,41.4,17875,47.5,17057,49.1,5765,69.6,Low-Mod,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/15/21,72121,33,Sabana Grande Municipio,PR,65.9,14299,14299,73.8,13355,75,4230,99.9,96,16119,74.2,16119,83.2,14893,83.6,4555,99.9,Mod-High,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/15/21,56009,33,Converse County,WY,24.8,3433,3433,29.6,3369,32.2,1431,60.2,96.4,3901,28.2,3900,33.6,3808,36.4,1590,66.8,Low,Low VC/Low SVI,Low VC/Low SVI,Low-Mod VC/Low SVI,Mod-High VC/Low SVI +8/15/21,49031,33,Piute County,UT,29.1,431,431,33.1,427,38,238,57.2,97.1,521,35.2,521,40,514,45.8,275,66.1,Low-Mod,Low VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/15/21,UNK,33,Unknown County,UNK,0,764575,764542,0,714649,0,54426,0,0,1081257,0,1081195,0,1005831,0,73305,0,,,,, +8/15/21,UNK,33,Unknown County,TN,0,59136,59118,0,58379,0,15004,0,97.8,73626,0,73571,0,71349,0,17149,0,,,,, +8/15/21,18099,33,Marshall County,IN,36.5,16868,16868,43.3,16059,46.3,6122,72.4,98.6,18335,39.6,18333,47.1,17209,49.6,6350,75.1,Mod-High,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI +8/14/21,47067,32,Hancock County,TN,24.6,1626,1626,28.4,1605,30.6,676,47,97.8,1797,27.1,1797,31.4,1771,33.8,721,50.1,High,Low VC/High SVI,Low VC/High SVI,Low-Mod VC/High SVI,Low-Mod VC/High SVI +8/14/21,18099,32,Marshall County,IN,36.4,16854,16854,43.3,16047,46.2,6120,72.4,98.6,18308,39.6,18306,47,17186,49.5,6347,75.1,Mod-High,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI +8/14/21,72121,32,Sabana Grande Municipio,PR,65.8,14282,14282,73.8,13340,74.9,4230,99.9,96,16094,74.1,16094,83.1,14873,83.5,4554,99.9,Mod-High,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/14/21,55031,32,Douglas County,WI,34.9,15080,15080,40.1,14483,41.7,5162,62.3,97,17875,41.4,17875,47.5,17057,49.1,5765,69.6,Low-Mod,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/14/21,18109,32,Morgan County,IN,44.2,31191,31190,51.5,29898,54.7,10380,85.1,98.6,33520,47.6,33519,55.4,31853,58.3,10643,87.2,Low,Mod-High VC/Low SVI,High VC/Low SVI,High VC/Low SVI,High VC/Low SVI +8/14/21,72129,32,San Lorenzo Municipio,PR,56.6,20380,20372,63.5,18902,64,4751,77.7,96,23744,66,23727,73.9,21886,74.1,5789,94.6,Low-Mod,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/14/21,UNK,32,Unknown County,UNK,0,762688,762656,0,713187,0,54336,0,0,1077619,0,1077559,0,1002992,0,73097,0,,,,, +8/14/21,48153,32,Floyd County,TX,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,High,,,, +8/14/21,56009,32,Converse County,WY,24.8,3433,3433,29.6,3369,32.2,1431,60.2,96.4,3901,28.2,3900,33.6,3808,36.4,1590,66.8,Low,Low VC/Low SVI,Low VC/Low SVI,Low-Mod VC/Low SVI,Mod-High VC/Low SVI +8/14/21,1043,32,Cullman County,AL,27.2,22777,22776,31.9,22497,34.6,9848,62.6,91.8,28740,34.3,28735,40.3,27994,43.1,11077,70.4,Mod-High,Low VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI +8/14/21,UNK,32,Unknown County,TN,0,59055,59037,0,58308,0,14997,0,97.8,73414,0,73359,0,71149,0,17126,0,,,,, +8/14/21,49031,32,Piute County,UT,29.1,431,431,33.1,427,38,238,57.2,97.1,521,35.2,521,40,514,45.8,275,66.1,Low-Mod,Low VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/13/21,18099,32,Marshall County,IN,36.4,16832,16832,43.3,16028,46.2,6117,72.3,98.6,18263,39.5,18261,46.9,17147,49.4,6343,75,Mod-High,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI +8/13/21,1043,32,Cullman County,AL,27.2,22758,22757,31.9,22480,34.6,9843,62.6,91.8,28693,34.3,28688,40.2,27952,43,11073,70.4,Mod-High,Low VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI +8/13/21,47067,32,Hancock County,TN,24.5,1624,1624,28.4,1605,30.6,676,47,97.8,1797,27.1,1797,31.4,1771,33.8,721,50.1,High,Low VC/High SVI,Low VC/High SVI,Low-Mod VC/High SVI,Low-Mod VC/High SVI +8/13/21,56009,32,Converse County,WY,24.8,3433,3433,29.6,3369,32.2,1431,60.2,96.4,3900,28.2,3899,33.6,3807,36.4,1590,66.8,Low,Low VC/Low SVI,Low VC/Low SVI,Low-Mod VC/Low SVI,Mod-High VC/Low SVI +8/13/21,UNK,32,Unknown County,TN,0,58888,58870,0,58148,0,14972,0,97.8,73059,0,73004,0,70807,0,17061,0,,,,, +8/13/21,18109,32,Morgan County,IN,44.2,31134,31133,51.4,29852,54.6,10377,85.1,98.6,33443,47.4,33442,55.2,31787,58.1,10635,87.2,Low,Mod-High VC/Low SVI,High VC/Low SVI,High VC/Low SVI,High VC/Low SVI +8/13/21,49031,32,Piute County,UT,29.1,431,431,33.1,427,38,238,57.2,97.1,521,35.2,521,40,514,45.8,275,66.1,Low-Mod,Low VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/13/21,72129,32,San Lorenzo Municipio,PR,56.5,20335,20327,63.3,18865,63.9,4746,77.6,96,23666,65.8,23649,73.7,21826,73.9,5788,94.6,Low-Mod,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/13/21,48153,32,Floyd County,TX,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,High,,,, +8/13/21,55031,32,Douglas County,WI,34.9,15058,15058,40,14466,41.7,5158,62.2,97,17847,41.4,17847,47.5,17031,49.1,5762,69.5,Low-Mod,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/13/21,72121,32,Sabana Grande Municipio,PR,65.6,14253,14253,73.6,13316,74.7,4225,99.9,96,16071,74,16071,83,14852,83.4,4550,99.9,Mod-High,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/13/21,UNK,32,Unknown County,UNK,0,760315,760283,0,711222,0,54262,0,0,1072813,0,1072753,0,998950,0,72929,0,,,,, +8/12/21,UNK,32,Unknown County,UNK,0,758305,758273,0,709538,0,54190,0,0,1068845,0,1068785,0,995682,0,72750,0,,,,, +8/12/21,18099,32,Marshall County,IN,36.4,16817,16817,43.2,16013,46.1,6116,72.3,98.6,18242,39.4,18240,46.9,17129,49.4,6341,75,Mod-High,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI +8/12/21,49031,32,Piute County,UT,29.1,431,431,33.1,427,38,238,57.2,97.1,521,35.2,521,40,514,45.8,275,66.1,Low-Mod,Low VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/12/21,72129,32,San Lorenzo Municipio,PR,56.4,20296,20288,63.2,18833,63.8,4740,77.5,96,23615,65.6,23598,73.5,21786,73.8,5784,94.5,Low-Mod,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/12/21,72121,32,Sabana Grande Municipio,PR,65.6,14234,14234,73.5,13303,74.7,4220,99.9,96,16057,74,16057,82.9,14840,83.3,4548,99.9,Mod-High,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/12/21,48153,32,Floyd County,TX,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,High,,,, +8/12/21,55031,32,Douglas County,WI,34.9,15040,15040,40,14452,41.6,5153,62.2,97,17820,41.3,17820,47.4,17007,49,5756,69.4,Low-Mod,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/12/21,18109,32,Morgan County,IN,44.1,31079,31078,51.3,29808,54.5,10372,85,98.6,33362,47.3,33361,55.1,31719,58,10630,87.1,Low,Mod-High VC/Low SVI,High VC/Low SVI,High VC/Low SVI,High VC/Low SVI +8/12/21,56009,32,Converse County,WY,24.8,3433,3433,29.6,3369,32.2,1431,60.2,96.4,3899,28.2,3898,33.6,3806,36.4,1589,66.8,Low,Low VC/Low SVI,Low VC/Low SVI,Low-Mod VC/Low SVI,Mod-High VC/Low SVI +8/12/21,UNK,32,Unknown County,TN,0,58763,58745,0,58026,0,14940,0,97.8,72726,0,72672,0,70489,0,17016,0,,,,, +8/12/21,1043,32,Cullman County,AL,27.1,22693,22692,31.8,22421,34.5,9833,62.5,91.8,28535,34.1,28530,40,27817,42.8,11062,70.3,Mod-High,Low VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI +8/12/21,47067,32,Hancock County,TN,24.5,1623,1623,28.4,1604,30.6,676,47,97.8,1795,27.1,1795,31.4,1769,33.8,720,50,High,Low VC/High SVI,Low VC/High SVI,Low-Mod VC/High SVI,Low-Mod VC/High SVI +8/11/21,18099,32,Marshall County,IN,36.3,16794,16794,43.2,15996,46.1,6113,72.3,98.6,18199,39.3,18197,46.8,17097,49.3,6338,75,Mod-High,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI,Mod-High VC/Mod-High SVI,High VC/Mod-High SVI +8/11/21,72121,32,Sabana Grande Municipio,PR,65.2,14166,14166,73.2,13266,74.5,4214,99.9,96,16023,73.8,16023,82.7,14818,83.2,4545,99.9,Mod-High,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI,High VC/Mod-High SVI +8/11/21,72129,32,San Lorenzo Municipio,PR,56.3,20279,20271,63.2,18821,63.7,4738,77.4,96,23592,65.6,23575,73.4,21767,73.7,5783,94.5,Low-Mod,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI,High VC/Low-Mod SVI +8/11/21,UNK,32,Unknown County,TN,0,58601,58583,0,57870,0,14895,0,97.8,72472,0,72418,0,70251,0,16956,0,,,,, +8/11/21,47067,32,Hancock County,TN,24.5,1622,1622,28.4,1603,30.6,675,46.9,97.8,1794,27.1,1794,31.4,1768,33.8,720,50,High,Low VC/High SVI,Low VC/High SVI,Low-Mod VC/High SVI,Low-Mod VC/High SVI +8/11/21,48153,32,Floyd County,TX,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,High,,,, +8/11/21,UNK,32,Unknown County,UNK,0,756368,756338,0,707922,0,54140,0,0,1065083,0,1065026,0,992587,0,72616,0,,,,, +8/11/21,55031,32,Douglas County,WI,34.8,15014,15014,39.9,14434,41.6,5147,62.1,97,17792,41.2,17792,47.3,16986,48.9,5754,69.4,Low-Mod,Low-Mod VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/11/21,56009,32,Converse County,WY,24.8,3429,3429,29.5,3365,32.2,1429,60.1,96.4,3895,28.2,3894,33.5,3802,36.4,1587,66.7,Low,Low VC/Low SVI,Low VC/Low SVI,Low-Mod VC/Low SVI,Mod-High VC/Low SVI +8/11/21,18109,32,Morgan County,IN,44,31047,31046,51.3,29782,54.5,10371,85,98.6,33318,47.3,33317,55,31682,57.9,10627,87.1,Low,Mod-High VC/Low SVI,High VC/Low SVI,High VC/Low SVI,High VC/Low SVI +8/11/21,49031,32,Piute County,UT,29.1,431,431,33.1,427,38,238,57.2,97.1,521,35.2,521,40,514,45.8,275,66.1,Low-Mod,Low VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Low-Mod VC/Low-Mod SVI,Mod-High VC/Low-Mod SVI +8/11/21,1043,32,Cullman County,AL,27,22603,22602,31.7,22338,34.4,9821,62.4,91.8,28324,33.8,28319,39.7,27622,42.5,11036,70.1,Mod-High,Low VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI \ No newline at end of file diff --git a/cdc_vaccines/tests/test_data/small_confirmed.csv b/cdc_vaccines/tests/test_data/small_confirmed.csv new file mode 100644 index 000000000..e69de29bb diff --git a/cdc_vaccines/tests/test_data/small_pull.csv b/cdc_vaccines/tests/test_data/small_pull.csv new file mode 100644 index 000000000..812835e37 --- /dev/null +++ b/cdc_vaccines/tests/test_data/small_pull.csv @@ -0,0 +1,4 @@ +Date,FIPS,MMWR_week,Recip_County,Recip_State,Series_Complete_Pop_Pct,Series_Complete_Yes,Series_Complete_12Plus,Series_Complete_12PlusPop_Pct,Series_Complete_18Plus,Series_Complete_18PlusPop_Pct,Series_Complete_65Plus,Series_Complete_65PlusPop_Pct,Completeness_pct,Administered_Dose1_Recip,Administered_Dose1_Pop_Pct,Administered_Dose1_Recip_12Plus,Administered_Dose1_Recip_12PlusPop_Pct,Administered_Dose1_Recip_18Plus,Administered_Dose1_Recip_18PlusPop_Pct,Administered_Dose1_Recip_65Plus,Administered_Dose1_Recip_65PlusPop_Pct,SVI_CTGY,Series_Complete_Pop_Pct_SVI,Series_Complete_12PlusPop_Pct_SVI,Series_Complete_18PlusPop_Pct_SVI,Series_Complete_65PlusPop_Pct_SVI +8/26/21,UNK,34,Unknown County,UNK,0,789625,789591,0,733809,0,55620,0,0,1119266,0,1119203,0,1035082,0,75596,0,,,,, +8/26/21,32013,34,Humboldt County,NV,32.9,5537,5535,40.2,5368,43.6,1696,69.9,94.9,6293,37.4,6290,45.6,6014,48.9,1877,77.3,Mod-High,Low-Mod VC/Mod-High SVI,Mod-High VC/Mod-High SVI,Mod-High VC/Mod-High SVI,Mod-High VC/Mod-High SVI +8/26/21,48305,34,Lynn County,TX,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,High,,,, \ No newline at end of file diff --git a/cdc_vaccines/tests/test_pull.py b/cdc_vaccines/tests/test_pull.py new file mode 100644 index 000000000..f49d0eff6 --- /dev/null +++ b/cdc_vaccines/tests/test_pull.py @@ -0,0 +1,71 @@ +"""Tests for running the CDC Vaccine indicator.""" +import pytest +import logging +from unittest.mock import patch + +import pandas as pd +import numpy as np +from delphi_cdc_vaccines.pull import pull_cdcvacc_data + +from test_run import local_fetch + +BASE_URL_GOOD = "test_data/small_pull.csv" + +BASE_URL_BAD = { + "missing_days": "test_data/bad_missing_days.csv", + "missing_cols": "test_data/bad_missing_cols.csv", + "extra_cols": "test_data/bad_extra_cols.csv" +} + +TEST_LOGGER = logging.getLogger() + +class TestPullCDCVaccines: + """Tests for the `pull_cdcvacc_data()` function.""" + def test_good_file(self): + """Test the expected output from a smaller file.""" + df = pull_cdcvacc_data(BASE_URL_GOOD, TEST_LOGGER) + expected_df = pd.DataFrame({ + "fips": ["00000","00000","32013","32013","48305","48305"], + "timestamp": [pd.Timestamp("2021-08-25"), pd.Timestamp("2021-08-26"), + pd.Timestamp("2021-08-25"), pd.Timestamp("2021-08-26"), + pd.Timestamp("2021-08-25"), pd.Timestamp("2021-08-26")], + "cumulative_counts_tot_vaccine": [np.nan,789625.0,np.nan,5537.0,np.nan,0.0], + "counts_tot_vaccine": [np.nan,789625.0,np.nan,5537.0,np.nan,0.0], + "cumulative_counts_tot_vaccine_12P": [np.nan,789591.0,np.nan,5535.0,np.nan,0.0], + "counts_tot_vaccine_12P": [np.nan,789591.0,np.nan,5535.0,np.nan,0.0], + "cumulative_counts_tot_vaccine_18P": [np.nan,733809.0,np.nan,5368.0,np.nan,0.0], + "counts_tot_vaccine_18P": [np.nan,733809.0,np.nan,5368.0,np.nan,0.0], + "cumulative_counts_tot_vaccine_65P": [np.nan,55620.0,np.nan,1696.0,np.nan,0.0], + "counts_tot_vaccine_65P": [np.nan,55620.0,np.nan,1696.0,np.nan,0.0], + "cumulative_counts_part_vaccine": [np.nan,1119266.0,np.nan,6293.0,np.nan,0.0], + "counts_part_vaccine": [np.nan,1119266.0,np.nan,6293.0,np.nan,0.0], + "cumulative_counts_part_vaccine_12P": [np.nan,1119203.0,np.nan,6290.0,np.nan,0.0], + "counts_part_vaccine_12P": [np.nan,1119203.0,np.nan,6290.0,np.nan,0.0], + "cumulative_counts_part_vaccine_18P": [np.nan,1035082.0,np.nan,6014.0,np.nan,0.0], + "counts_part_vaccine_18P": [np.nan,1035082.0,np.nan,6014.0,np.nan,0.0], + "cumulative_counts_part_vaccine_65P": [np.nan,75596.0,np.nan,1877.0,np.nan,0.0], + "counts_part_vaccine_65P": [np.nan,75596.0,np.nan,1877.0,np.nan,0.0]}, + index=[0, 1, 2, 3, 4, 5]) + # sort since rows order doesn't matter + pd.testing.assert_frame_equal(df.sort_index(), expected_df.sort_index()) + + def test_missing_days(self): + """Test if error is raised when there are missing days.""" + with pytest.raises(ValueError): + pull_cdcvacc_data( + BASE_URL_BAD["missing_days"], TEST_LOGGER + ) + + def test_missing_cols(self): + """Test if error is raised when there are missing columns.""" + with pytest.raises(ValueError): + pull_cdcvacc_data( + BASE_URL_BAD["missing_cols"],TEST_LOGGER + ) + + def test_extra_cols(self): + """Test if error is raised when there are extra columns.""" + with pytest.raises(ValueError): + pull_cdcvacc_data( + BASE_URL_BAD["extra_cols"], TEST_LOGGER + ) \ No newline at end of file diff --git a/cdc_vaccines/tests/test_run.py b/cdc_vaccines/tests/test_run.py new file mode 100644 index 000000000..f65f00764 --- /dev/null +++ b/cdc_vaccines/tests/test_run.py @@ -0,0 +1,80 @@ +"""Tests for running the CDC Vaccine indicator.""" +from itertools import product +from os import listdir +from os.path import join +from unittest.mock import patch + +import pandas as pd + +from delphi_cdc_vaccines.run import run_module + +def local_fetch(url, cache): + return pd.read_csv(url) + +class TestRun: + """Tests for the `run_module()` function.""" + PARAMS = { + "common": { + "export_dir": "./receiving", + "input_dir": "./input_cache" + }, + "indicator": { + "base_url": "./test_data/small.csv", + "export_start_date": "2021-05-01" + } + } + + def test_output_files_exist(self): + """Test that the expected output files exist.""" + run_module(self.PARAMS) + + csv_files = [f for f in listdir("receiving") if f.endswith(".csv")] + + dates = [ + "20210810", + "20210811", + "20210812", + "20210813", + "20210814", + "20210815", + "20210816", + "20210817", + "20210818", + "20210819", + ] + geos = ["state_code", "hrr", "hhs", "nation"] + + expected_files = [] + for metric in ["cumulative_counts_tot_vaccine", + "counts_tot_vaccine", + "cumulative_counts_tot_vaccine_12P", + "counts_tot_vaccine_12P", + "cumulative_counts_tot_vaccine_18P", + "counts_tot_vaccine_18P", + "cumulative_counts_tot_vaccine_65P", + "counts_tot_vaccine_65P", + "cumulative_counts_part_vaccine", + "counts_part_vaccine", + "cumulative_counts_part_vaccine_12P", + "counts_part_vaccine_12P", + "cumulative_counts_part_vaccine_18P", + "counts_part_vaccine_18P", + "cumulative_counts_part_vaccine_65P", + "counts_part_vaccine_65P"]: + for date in dates: + for geo in geos: + expected_files += [date + "_" + geo + "_" + metric + ".csv"] + if not("cumulative" in metric) and not (date in dates[:6]): + expected_files += [date + "_" + geo + "_" + metric + "_7dav.csv"] + + + assert set(csv_files) == set(expected_files) + + def test_output_file_format(self): + """Test that the output files have the proper format.""" + run_module(self.PARAMS) + + df = pd.read_csv( + join("receiving", "20210819_state_code_counts_tot_vaccine.csv") + ) + assert (df.columns.values == ["geo_id", "val", "se", "sample_size"]).all() \ No newline at end of file From 47991394932b1d94cdf83300e83a2c805b6a832e Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Thu, 9 Sep 2021 11:31:42 -0400 Subject: [PATCH 002/133] added explicit dictionary creation --- cdc_vaccines/delphi_cdc_vaccines/run.py | 6 ++++++ cdc_vaccines/tests/test_run.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/cdc_vaccines/delphi_cdc_vaccines/run.py b/cdc_vaccines/delphi_cdc_vaccines/run.py index 455ca44d2..93ee75886 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/run.py +++ b/cdc_vaccines/delphi_cdc_vaccines/run.py @@ -43,6 +43,11 @@ def run_module(params): all_data = pull_cdcvacc_data(base_url, logger) run_stats = [] ## aggregate & smooth + + + if not os.path.exists(params["common"]["export_dir"]): + os.makedirs(params["common"]["export_dir"]) + for (sensor, smoother, geo) in product(SIGNALS, SMOOTHERS, GEOS): logger.info("Running on ", sensor=sensor, @@ -60,6 +65,7 @@ def run_module(params): df["se"] = np.nan df["sample_size"] = np.nan sensor_name = sensor + smoother[1] + if not(("cumulative" in sensor_name) and ("7dav" in sensor_name)): # don't export first 6 days for smoothed signals since they'll be nan. start_date = min(df.timestamp) + timedelta(6) if smoother[1] else min(df.timestamp) diff --git a/cdc_vaccines/tests/test_run.py b/cdc_vaccines/tests/test_run.py index f65f00764..e1ecbb17f 100644 --- a/cdc_vaccines/tests/test_run.py +++ b/cdc_vaccines/tests/test_run.py @@ -20,7 +20,7 @@ class TestRun: }, "indicator": { "base_url": "./test_data/small.csv", - "export_start_date": "2021-05-01" + "export_start_date": "2021-08-10" } } From 5d92ed4859b2170254a08fb23aa0b32dccae5074 Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Thu, 9 Sep 2021 11:36:00 -0400 Subject: [PATCH 003/133] added os import --- cdc_vaccines/delphi_cdc_vaccines/run.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cdc_vaccines/delphi_cdc_vaccines/run.py b/cdc_vaccines/delphi_cdc_vaccines/run.py index 93ee75886..9a6f9cdae 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/run.py +++ b/cdc_vaccines/delphi_cdc_vaccines/run.py @@ -18,6 +18,7 @@ from itertools import product import time as tm import numpy as np +import os from delphi_utils.export import create_export_csv from delphi_utils.geomap import GeoMapper from delphi_utils import get_structured_logger From 7836d23041cfef9fe472277991212cb0774107ec Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Thu, 9 Sep 2021 11:43:08 -0400 Subject: [PATCH 004/133] Minor changes for the linter - tests pass locally --- cdc_vaccines/Makefile | 6 +++++- cdc_vaccines/delphi_cdc_vaccines/run.py | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/cdc_vaccines/Makefile b/cdc_vaccines/Makefile index ca3013248..5d1101c53 100644 --- a/cdc_vaccines/Makefile +++ b/cdc_vaccines/Makefile @@ -3,7 +3,7 @@ dir = $(shell find ./delphi_* -name __init__.py | grep -o 'delphi_[_[:alnum:]]*') venv: - python -m venv env + python3.8 -m venv env install: venv . env/bin/activate; \ @@ -23,3 +23,7 @@ clean: rm -rf env rm -f params.json +run: + env/bin/python -m $(dir) + env/bin/python -m delphi_utils.validator --dry_run + env/bin/python -m delphi_utils.archive \ No newline at end of file diff --git a/cdc_vaccines/delphi_cdc_vaccines/run.py b/cdc_vaccines/delphi_cdc_vaccines/run.py index 9a6f9cdae..c82ee3b16 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/run.py +++ b/cdc_vaccines/delphi_cdc_vaccines/run.py @@ -17,8 +17,8 @@ from datetime import timedelta, datetime from itertools import product import time as tm -import numpy as np import os +import numpy as np from delphi_utils.export import create_export_csv from delphi_utils.geomap import GeoMapper from delphi_utils import get_structured_logger From 52e04c2f8d324c20e888af20a6b12ed180af6d0d Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Fri, 10 Sep 2021 13:49:39 -0400 Subject: [PATCH 005/133] Update cdc_vaccines/delphi_cdc_vaccines/__main__.py Co-authored-by: Katie Mazaitis --- cdc_vaccines/delphi_cdc_vaccines/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdc_vaccines/delphi_cdc_vaccines/__main__.py b/cdc_vaccines/delphi_cdc_vaccines/__main__.py index 32fc0eecc..0aa3f6ac1 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/__main__.py +++ b/cdc_vaccines/delphi_cdc_vaccines/__main__.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Call the function run_module when executed. -This file indicates that calling the module (`python -m MODULE_NAME`) will +This file indicates that calling the module (`python -m delphi_cdc_vaccines`) will call the function `run_module` found within the run.py file. There should be no need to change this template. """ From 16c105032c5757f7ca9b602cba8fc5497d5e5de7 Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Fri, 10 Sep 2021 13:49:51 -0400 Subject: [PATCH 006/133] Update cdc_vaccines/delphi_cdc_vaccines/constants.py Co-authored-by: Katie Mazaitis --- cdc_vaccines/delphi_cdc_vaccines/constants.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cdc_vaccines/delphi_cdc_vaccines/constants.py b/cdc_vaccines/delphi_cdc_vaccines/constants.py index 113ecb69e..82f517512 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/constants.py +++ b/cdc_vaccines/delphi_cdc_vaccines/constants.py @@ -45,7 +45,8 @@ "nation", "state_code", "hrr", - "hhs" + "hhs", + "msa" ] SMOOTHERS = [ From 350f91cd1922ed6b1ac128483ac799fba9da15b5 Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Fri, 10 Sep 2021 13:50:41 -0400 Subject: [PATCH 007/133] Update cdc_vaccines/README.md Co-authored-by: Katie Mazaitis --- cdc_vaccines/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdc_vaccines/README.md b/cdc_vaccines/README.md index b56682d0f..bcbcee972 100644 --- a/cdc_vaccines/README.md +++ b/cdc_vaccines/README.md @@ -2,7 +2,7 @@ This indicator provides the number official vaccinations in the US. We export the county-level daily vaccination rates data as-is, and publishes the result as a COVIDcast signal. -We also aggregate the data to the HHS, State, and Nation levels. +We also aggregate the data to the MSA, HRR, State, HHS Region, and Nation levels. For detailed information see the files DETAILS.md contained in this directory. Note that individuals could be vaccinated outside of the US. Additionally, From 9b102dbe4d541a33eefe10da1d0f0862fdba2221 Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Fri, 10 Sep 2021 13:51:55 -0400 Subject: [PATCH 008/133] Update cdc_vaccines/README.md Co-authored-by: Katie Mazaitis --- cdc_vaccines/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdc_vaccines/README.md b/cdc_vaccines/README.md index bcbcee972..3423ca851 100644 --- a/cdc_vaccines/README.md +++ b/cdc_vaccines/README.md @@ -1,7 +1,7 @@ # CDC Vaccinations This indicator provides the number official vaccinations in the US. We export the county-level -daily vaccination rates data as-is, and publishes the result as a COVIDcast signal. +daily vaccination rates data as-is, and publish the result as a COVIDcast signal. We also aggregate the data to the MSA, HRR, State, HHS Region, and Nation levels. For detailed information see the files DETAILS.md contained in this directory. From f08c9b1d2dc708ebc619f03f628ba4ad9c44683b Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Fri, 10 Sep 2021 13:52:19 -0400 Subject: [PATCH 009/133] Update cdc_vaccines/params.json.template Co-authored-by: Katie Mazaitis --- cdc_vaccines/params.json.template | 9 --------- 1 file changed, 9 deletions(-) diff --git a/cdc_vaccines/params.json.template b/cdc_vaccines/params.json.template index 3d5337846..bfc654514 100644 --- a/cdc_vaccines/params.json.template +++ b/cdc_vaccines/params.json.template @@ -23,13 +23,4 @@ }, "dynamic": {} }, - "archive": { - "aws_credentials": { - "aws_access_key_id": "", - "aws_secret_access_key": "" - }, - "bucket_name": "", - "indicator_prefix": "usafacts", - "cache_dir": "./cache" - } } From 2a0dcae387c503e5f29e8dc77f6c7b64ff72b4f7 Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Fri, 10 Sep 2021 15:03:37 -0400 Subject: [PATCH 010/133] Update cdc_vaccines/README.md Co-authored-by: Katie Mazaitis --- cdc_vaccines/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdc_vaccines/README.md b/cdc_vaccines/README.md index 3423ca851..ea076dc1e 100644 --- a/cdc_vaccines/README.md +++ b/cdc_vaccines/README.md @@ -1,6 +1,6 @@ # CDC Vaccinations -This indicator provides the number official vaccinations in the US. We export the county-level +This indicator provides the official vaccination counts in the US. We export the county-level daily vaccination rates data as-is, and publish the result as a COVIDcast signal. We also aggregate the data to the MSA, HRR, State, HHS Region, and Nation levels. For detailed information see the files DETAILS.md contained in this directory. From e1187f3c6ea6ce482cad3c007440125b4bad9e0c Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Fri, 10 Sep 2021 15:10:39 -0400 Subject: [PATCH 011/133] Update cdc_vaccines/delphi_cdc_vaccines/run.py Co-authored-by: Katie Mazaitis --- cdc_vaccines/delphi_cdc_vaccines/run.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cdc_vaccines/delphi_cdc_vaccines/run.py b/cdc_vaccines/delphi_cdc_vaccines/run.py index c82ee3b16..f639a7f95 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/run.py +++ b/cdc_vaccines/delphi_cdc_vaccines/run.py @@ -55,7 +55,8 @@ def run_module(params): smoother=smoother, geo=geo) df = GeoMapper().replace_geocode( - all_data[['timestamp','fips', sensor]],from_col='fips', + all_data[['timestamp','fips', sensor]], + from_col='fips', from_code="fips", new_col="geo_id", new_code=geo, From 04fbc1d60945e957cd87873757b85834cdf77efb Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Fri, 10 Sep 2021 15:12:35 -0400 Subject: [PATCH 012/133] Update cdc_vaccines/delphi_cdc_vaccines/pull.py Co-authored-by: Katie Mazaitis --- cdc_vaccines/delphi_cdc_vaccines/pull.py | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/cdc_vaccines/delphi_cdc_vaccines/pull.py b/cdc_vaccines/delphi_cdc_vaccines/pull.py index e19043163..47e95aa1b 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/pull.py +++ b/cdc_vaccines/delphi_cdc_vaccines/pull.py @@ -139,24 +139,6 @@ def pull_cdcvacc_data(base_url: str, logger: Logger) -> pd.DataFrame: ) return df.loc[ df["timestamp"] >= min(df["timestamp"]), - [ # Reorder - "fips", - "timestamp", - "cumulative_counts_tot_vaccine", - "counts_tot_vaccine", - "cumulative_counts_tot_vaccine_12P", - "counts_tot_vaccine_12P", - "cumulative_counts_tot_vaccine_18P", - "counts_tot_vaccine_18P", - "cumulative_counts_tot_vaccine_65P", - "counts_tot_vaccine_65P", - "cumulative_counts_part_vaccine", - "counts_part_vaccine", - "cumulative_counts_part_vaccine_12P", - "counts_part_vaccine_12P", - "cumulative_counts_part_vaccine_18P", - "counts_part_vaccine_18P", - "cumulative_counts_part_vaccine_65P", - "counts_part_vaccine_65P" - ], + # Reorder + ["fips", "timestamp"] + SIGNALS, ].reset_index(drop=True) From ba11d3c4f394dfd6a4cec67867f50008eaeb5356 Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Fri, 10 Sep 2021 15:17:55 -0400 Subject: [PATCH 013/133] minor changes --- cdc_vaccines/delphi_cdc_vaccines/constants.py | 9 ++++++++- cdc_vaccines/delphi_cdc_vaccines/pull.py | 11 ++--------- cdc_vaccines/delphi_cdc_vaccines/run.py | 7 ++++++- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/cdc_vaccines/delphi_cdc_vaccines/constants.py b/cdc_vaccines/delphi_cdc_vaccines/constants.py index 113ecb69e..2896a1f8a 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/constants.py +++ b/cdc_vaccines/delphi_cdc_vaccines/constants.py @@ -43,7 +43,7 @@ GEOS = [ "nation", - "state_code", + "state", "hrr", "hhs" ] @@ -52,3 +52,10 @@ (Smoother("identity", impute_method=None), ""), (Smoother("moving_average", window_length=7), "_7dav"), ] + + +DIFFERENCE_MAPPING = { + f"{INCIDENCE}_counts_{completeness}_vaccine{age}": f"{CUMULATIVE}_counts_{completeness}_vaccine{age}" + for completeness, age in product(COMPLETENESS, AGE) +} +SIGNALS = list(DIFFERENCE_MAPPING.keys()) + list(DIFFERENCE_MAPPING.values()) \ No newline at end of file diff --git a/cdc_vaccines/delphi_cdc_vaccines/pull.py b/cdc_vaccines/delphi_cdc_vaccines/pull.py index e19043163..32a53a4d7 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/pull.py +++ b/cdc_vaccines/delphi_cdc_vaccines/pull.py @@ -112,20 +112,13 @@ def pull_cdcvacc_data(base_url: str, logger: Logger) -> pd.DataFrame: df =pd.concat([df_dummy, df]) # Obtain new_counts df.sort_values(["fips", "timestamp"], inplace=True) - df["counts_tot_vaccine"] = df["cumulative_counts_tot_vaccine"].diff() # 1st discrete difference - df["counts_tot_vaccine_12P"] = df["cumulative_counts_tot_vaccine_12P"].diff() - df["counts_tot_vaccine_18P"] = df["cumulative_counts_tot_vaccine_18P"].diff() - df["counts_tot_vaccine_65P"] = df["cumulative_counts_tot_vaccine_65P"].diff() - df["counts_part_vaccine"] = df["cumulative_counts_part_vaccine"].diff() - df["counts_part_vaccine_12P"] = df["cumulative_counts_part_vaccine_12P"].diff() - df["counts_part_vaccine_18P"] = df["cumulative_counts_part_vaccine_18P"].diff() - df["counts_part_vaccine_65P"] = df["cumulative_counts_part_vaccine_65P"].diff() + for to, from in DIFFERENCE_MAPPING.items(): + df[to] = df[from].diff() rem_list = [ x for x in list(df.columns) if x not in ['timestamp', 'fips'] ] # Handle edge cases where we diffed across fips mask = df["fips"] != df["fips"].shift(1) df.loc[mask, rem_list] = np.nan - print(rem_list) df.reset_index(inplace=True, drop=True) # Final sanity checks unique_days = df["timestamp"].unique() diff --git a/cdc_vaccines/delphi_cdc_vaccines/run.py b/cdc_vaccines/delphi_cdc_vaccines/run.py index c82ee3b16..f5e4751ac 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/run.py +++ b/cdc_vaccines/delphi_cdc_vaccines/run.py @@ -50,15 +50,20 @@ def run_module(params): os.makedirs(params["common"]["export_dir"]) for (sensor, smoother, geo) in product(SIGNALS, SMOOTHERS, GEOS): + logger.info("Running on ", sensor=sensor, smoother=smoother, geo=geo) + geo_map = geo + if geo=='state': + geo_map='state_code' + df = GeoMapper().replace_geocode( all_data[['timestamp','fips', sensor]],from_col='fips', from_code="fips", new_col="geo_id", - new_code=geo, + new_code=geo_map, date_col="timestamp") df["val"] = df[["geo_id", sensor]].groupby("geo_id")[sensor].transform( smoother[0].smooth From ff808a462e024c8a30ab60e63fa36b924772a65a Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Fri, 10 Sep 2021 15:22:05 -0400 Subject: [PATCH 014/133] changes to the json file --- cdc_vaccines/params.json.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdc_vaccines/params.json.template b/cdc_vaccines/params.json.template index bfc654514..3e6af1c23 100644 --- a/cdc_vaccines/params.json.template +++ b/cdc_vaccines/params.json.template @@ -22,5 +22,5 @@ "missing_sample_size_allowed": true }, "dynamic": {} - }, + } } From 675106c990f3e3be00648be51141359529f441f3 Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Sat, 11 Sep 2021 13:22:43 -0400 Subject: [PATCH 015/133] changed the signal name generation --- cdc_vaccines/delphi_cdc_vaccines/pull.py | 7 +++---- cdc_vaccines/delphi_cdc_vaccines/run.py | 2 +- cdc_vaccines/tests/test_pull.py | 23 ++++++++++++++--------- cdc_vaccines/tests/test_run.py | 21 ++++++++++----------- 4 files changed, 28 insertions(+), 25 deletions(-) diff --git a/cdc_vaccines/delphi_cdc_vaccines/pull.py b/cdc_vaccines/delphi_cdc_vaccines/pull.py index e158a0b8c..b8e8c6387 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/pull.py +++ b/cdc_vaccines/delphi_cdc_vaccines/pull.py @@ -5,8 +5,7 @@ from delphi_utils.geomap import GeoMapper import numpy as np import pandas as pd - - +from .constants import SIGNALS, DIFFERENCE_MAPPING @@ -112,8 +111,8 @@ def pull_cdcvacc_data(base_url: str, logger: Logger) -> pd.DataFrame: df =pd.concat([df_dummy, df]) # Obtain new_counts df.sort_values(["fips", "timestamp"], inplace=True) - for to, from in DIFFERENCE_MAPPING.items(): - df[to] = df[from].diff() + for to, from_d in DIFFERENCE_MAPPING.items(): + df[to] = df[from_d].diff() rem_list = [ x for x in list(df.columns) if x not in ['timestamp', 'fips'] ] # Handle edge cases where we diffed across fips diff --git a/cdc_vaccines/delphi_cdc_vaccines/run.py b/cdc_vaccines/delphi_cdc_vaccines/run.py index 0e52a9584..48c0f24f9 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/run.py +++ b/cdc_vaccines/delphi_cdc_vaccines/run.py @@ -72,7 +72,7 @@ def run_module(params): df["se"] = np.nan df["sample_size"] = np.nan sensor_name = sensor + smoother[1] - + print(sensor_name) if not(("cumulative" in sensor_name) and ("7dav" in sensor_name)): # don't export first 6 days for smoothed signals since they'll be nan. start_date = min(df.timestamp) + timedelta(6) if smoother[1] else min(df.timestamp) diff --git a/cdc_vaccines/tests/test_pull.py b/cdc_vaccines/tests/test_pull.py index f49d0eff6..644f1226c 100644 --- a/cdc_vaccines/tests/test_pull.py +++ b/cdc_vaccines/tests/test_pull.py @@ -29,22 +29,27 @@ def test_good_file(self): "timestamp": [pd.Timestamp("2021-08-25"), pd.Timestamp("2021-08-26"), pd.Timestamp("2021-08-25"), pd.Timestamp("2021-08-26"), pd.Timestamp("2021-08-25"), pd.Timestamp("2021-08-26")], + + "incidence_counts_tot_vaccine": [np.nan,789625.0,np.nan,5537.0,np.nan,0.0], + "incidence_counts_tot_vaccine_12P": [np.nan,789591.0,np.nan,5535.0,np.nan,0.0], + "incidence_counts_tot_vaccine_18P": [np.nan,733809.0,np.nan,5368.0,np.nan,0.0], + "incidence_counts_tot_vaccine_65P": [np.nan,55620.0,np.nan,1696.0,np.nan,0.0], + "incidence_counts_part_vaccine": [np.nan,1119266.0,np.nan,6293.0,np.nan,0.0], + "incidence_counts_part_vaccine_12P": [np.nan,1119203.0,np.nan,6290.0,np.nan,0.0], + "incidence_counts_part_vaccine_18P": [np.nan,1035082.0,np.nan,6014.0,np.nan,0.0], + "incidence_counts_part_vaccine_65P": [np.nan,75596.0,np.nan,1877.0,np.nan,0.0], + + + "cumulative_counts_tot_vaccine": [np.nan,789625.0,np.nan,5537.0,np.nan,0.0], - "counts_tot_vaccine": [np.nan,789625.0,np.nan,5537.0,np.nan,0.0], "cumulative_counts_tot_vaccine_12P": [np.nan,789591.0,np.nan,5535.0,np.nan,0.0], - "counts_tot_vaccine_12P": [np.nan,789591.0,np.nan,5535.0,np.nan,0.0], "cumulative_counts_tot_vaccine_18P": [np.nan,733809.0,np.nan,5368.0,np.nan,0.0], - "counts_tot_vaccine_18P": [np.nan,733809.0,np.nan,5368.0,np.nan,0.0], "cumulative_counts_tot_vaccine_65P": [np.nan,55620.0,np.nan,1696.0,np.nan,0.0], - "counts_tot_vaccine_65P": [np.nan,55620.0,np.nan,1696.0,np.nan,0.0], "cumulative_counts_part_vaccine": [np.nan,1119266.0,np.nan,6293.0,np.nan,0.0], - "counts_part_vaccine": [np.nan,1119266.0,np.nan,6293.0,np.nan,0.0], "cumulative_counts_part_vaccine_12P": [np.nan,1119203.0,np.nan,6290.0,np.nan,0.0], - "counts_part_vaccine_12P": [np.nan,1119203.0,np.nan,6290.0,np.nan,0.0], "cumulative_counts_part_vaccine_18P": [np.nan,1035082.0,np.nan,6014.0,np.nan,0.0], - "counts_part_vaccine_18P": [np.nan,1035082.0,np.nan,6014.0,np.nan,0.0], - "cumulative_counts_part_vaccine_65P": [np.nan,75596.0,np.nan,1877.0,np.nan,0.0], - "counts_part_vaccine_65P": [np.nan,75596.0,np.nan,1877.0,np.nan,0.0]}, + "cumulative_counts_part_vaccine_65P": [np.nan,75596.0,np.nan,1877.0,np.nan,0.0]}, + index=[0, 1, 2, 3, 4, 5]) # sort since rows order doesn't matter pd.testing.assert_frame_equal(df.sort_index(), expected_df.sort_index()) diff --git a/cdc_vaccines/tests/test_run.py b/cdc_vaccines/tests/test_run.py index e1ecbb17f..abc966c25 100644 --- a/cdc_vaccines/tests/test_run.py +++ b/cdc_vaccines/tests/test_run.py @@ -42,32 +42,31 @@ def test_output_files_exist(self): "20210818", "20210819", ] - geos = ["state_code", "hrr", "hhs", "nation"] + geos = ["state", "hrr", "hhs", "nation", "msa"] expected_files = [] for metric in ["cumulative_counts_tot_vaccine", - "counts_tot_vaccine", + "incidence_counts_tot_vaccine", "cumulative_counts_tot_vaccine_12P", - "counts_tot_vaccine_12P", + "incidence_counts_tot_vaccine_12P", "cumulative_counts_tot_vaccine_18P", - "counts_tot_vaccine_18P", + "incidence_counts_tot_vaccine_18P", "cumulative_counts_tot_vaccine_65P", - "counts_tot_vaccine_65P", + "incidence_counts_tot_vaccine_65P", "cumulative_counts_part_vaccine", - "counts_part_vaccine", + "incidence_counts_part_vaccine", "cumulative_counts_part_vaccine_12P", - "counts_part_vaccine_12P", + "incidence_counts_part_vaccine_12P", "cumulative_counts_part_vaccine_18P", - "counts_part_vaccine_18P", + "incidence_counts_part_vaccine_18P", "cumulative_counts_part_vaccine_65P", - "counts_part_vaccine_65P"]: + "incidence_counts_part_vaccine_65P"]: for date in dates: for geo in geos: expected_files += [date + "_" + geo + "_" + metric + ".csv"] if not("cumulative" in metric) and not (date in dates[:6]): expected_files += [date + "_" + geo + "_" + metric + "_7dav.csv"] - assert set(csv_files) == set(expected_files) def test_output_file_format(self): @@ -75,6 +74,6 @@ def test_output_file_format(self): run_module(self.PARAMS) df = pd.read_csv( - join("receiving", "20210819_state_code_counts_tot_vaccine.csv") + join("receiving", "20210819_state_cumulative_counts_tot_vaccine.csv") ) assert (df.columns.values == ["geo_id", "val", "se", "sample_size"]).all() \ No newline at end of file From 0804d121a8f458f7aedcaae72982a08552e1a43e Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Sat, 11 Sep 2021 13:25:47 -0400 Subject: [PATCH 016/133] committed constants --- cdc_vaccines/delphi_cdc_vaccines/constants.py | 55 +++++-------------- 1 file changed, 13 insertions(+), 42 deletions(-) diff --git a/cdc_vaccines/delphi_cdc_vaccines/constants.py b/cdc_vaccines/delphi_cdc_vaccines/constants.py index 6e8a9620c..b8ff83d06 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/constants.py +++ b/cdc_vaccines/delphi_cdc_vaccines/constants.py @@ -1,45 +1,23 @@ """Registry for variations.""" - +from itertools import product from delphi_utils import Smoother -FULL_VAC_SUM = "cumulative_counts_tot_vaccine" -FULL_VAC = "counts_tot_vaccine" -FULL_VAC_SUM_12P = "cumulative_counts_tot_vaccine_12P" -FULL_VAC_12P = "counts_tot_vaccine_12P" -FULL_VAC_SUM_18P = "cumulative_counts_tot_vaccine_18P" -FULL_VAC_18P = "counts_tot_vaccine_18P" -FULL_VAC_SUM_65P = "cumulative_counts_tot_vaccine_65P" -FULL_VAC_65P = "counts_tot_vaccine_65P" -PART_VAC_SUM = "cumulative_counts_part_vaccine" -PART_VAC = "counts_part_vaccine" -PART_VAC_SUM_12P = "cumulative_counts_part_vaccine_12P" -PART_VAC_12P = "counts_part_vaccine_12P" -PART_VAC_SUM_18P = "cumulative_counts_part_vaccine_18P" -PART_VAC_18P = "counts_part_vaccine_18P" -PART_VAC_SUM_65P = "cumulative_counts_part_vaccine_65P" -PART_VAC_65P = "counts_part_vaccine_65P" +CUMULATIVE = 'cumulative' +INCIDENCE ='incidence' +FREQUENCY = [CUMULATIVE, INCIDENCE] +STATUS = ["tot", "part"] +AGE = ["", "_12P", "_18P", "_65P"] +SIGNALS = [f"{frequency}_counts_{status}_vaccine{AGE}" for + frequency, status, age in product(FREQUENCY, STATUS, AGE)] +DIFFERENCE_MAPPING = { + f"{INCIDENCE}_counts_{status}_vaccine{age}": f"{CUMULATIVE}_counts_{status}_vaccine{age}" + for status, age in product(STATUS, AGE) +} +SIGNALS = list(DIFFERENCE_MAPPING.keys()) + list(DIFFERENCE_MAPPING.values()) -SIGNALS = [ - FULL_VAC_SUM , - FULL_VAC , - FULL_VAC_SUM_12P , - FULL_VAC_12P , - FULL_VAC_SUM_18P , - FULL_VAC_18P , - FULL_VAC_SUM_65P , - FULL_VAC_65P , - PART_VAC_SUM , - PART_VAC , - PART_VAC_SUM_12P , - PART_VAC_12P , - PART_VAC_SUM_18P , - PART_VAC_18P , - PART_VAC_SUM_65P , - PART_VAC_65P -] GEOS = [ "nation", @@ -53,10 +31,3 @@ (Smoother("identity", impute_method=None), ""), (Smoother("moving_average", window_length=7), "_7dav"), ] - - -DIFFERENCE_MAPPING = { - f"{INCIDENCE}_counts_{completeness}_vaccine{age}": f"{CUMULATIVE}_counts_{completeness}_vaccine{age}" - for completeness, age in product(COMPLETENESS, AGE) -} -SIGNALS = list(DIFFERENCE_MAPPING.keys()) + list(DIFFERENCE_MAPPING.values()) \ No newline at end of file From 896374823e8f82252a2bbdc2a57a48855147a136 Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Mon, 13 Sep 2021 14:08:57 -0400 Subject: [PATCH 017/133] Update cdc_vaccines/README.md Co-authored-by: Katie Mazaitis --- cdc_vaccines/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cdc_vaccines/README.md b/cdc_vaccines/README.md index ea076dc1e..792f9070c 100644 --- a/cdc_vaccines/README.md +++ b/cdc_vaccines/README.md @@ -6,8 +6,7 @@ We also aggregate the data to the MSA, HRR, State, HHS Region, and Nation levels For detailed information see the files DETAILS.md contained in this directory. Note that individuals could be vaccinated outside of the US. Additionally, -there is no county level data for counties in Texas and Hawaii. There are unknown -counties in each state and a row for unknown county and unknown state. +there is no county level data for counties in Texas and Hawaii. Each state has some vaccination counts assigned to "unknown county". Some vaccination counts are assigned to "unknown state, unknown county". ## Running the Indicator From b2769e63313151fe9a01a161ed71384431e382a3 Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Fri, 17 Sep 2021 06:30:41 -0400 Subject: [PATCH 018/133] Modified run.py to have the right NaN codes --- cdc_vaccines/delphi_cdc_vaccines/run.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cdc_vaccines/delphi_cdc_vaccines/run.py b/cdc_vaccines/delphi_cdc_vaccines/run.py index 48c0f24f9..3013c2c5a 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/run.py +++ b/cdc_vaccines/delphi_cdc_vaccines/run.py @@ -21,7 +21,7 @@ import numpy as np from delphi_utils.export import create_export_csv from delphi_utils.geomap import GeoMapper -from delphi_utils import get_structured_logger +from delphi_utils import get_structured_logger, nancodes from .constants import GEOS, SIGNALS, SMOOTHERS from .pull import pull_cdcvacc_data @@ -69,8 +69,8 @@ def run_module(params): df["val"] = df[["geo_id", sensor]].groupby("geo_id")[sensor].transform( smoother[0].smooth ) - df["se"] = np.nan - df["sample_size"] = np.nan + df["se"] = nancodes.Nans.NOT_APPLICABLE + df["sample_size"] = nancodes.Nans.NOT_APPLICABLE sensor_name = sensor + smoother[1] print(sensor_name) if not(("cumulative" in sensor_name) and ("7dav" in sensor_name)): From d0349a6ddccbea1fac92864f0541a29e20125fca Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Sun, 19 Sep 2021 11:28:00 -0400 Subject: [PATCH 019/133] Added appropriate NaN codes --- cdc_vaccines/delphi_cdc_vaccines/run.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cdc_vaccines/delphi_cdc_vaccines/run.py b/cdc_vaccines/delphi_cdc_vaccines/run.py index 3013c2c5a..43dee11f5 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/run.py +++ b/cdc_vaccines/delphi_cdc_vaccines/run.py @@ -18,7 +18,6 @@ from itertools import product import time as tm import os -import numpy as np from delphi_utils.export import create_export_csv from delphi_utils.geomap import GeoMapper from delphi_utils import get_structured_logger, nancodes From e9b4a6ac8c2758298fffc0f53cb1ac63a4d737d2 Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Tue, 21 Sep 2021 10:12:13 -0400 Subject: [PATCH 020/133] Update cdc_vaccines/delphi_cdc_vaccines/run.py Co-authored-by: Dmitry Shemetov --- cdc_vaccines/delphi_cdc_vaccines/run.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cdc_vaccines/delphi_cdc_vaccines/run.py b/cdc_vaccines/delphi_cdc_vaccines/run.py index 43dee11f5..d22dfd76d 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/run.py +++ b/cdc_vaccines/delphi_cdc_vaccines/run.py @@ -69,7 +69,10 @@ def run_module(params): smoother[0].smooth ) df["se"] = nancodes.Nans.NOT_APPLICABLE - df["sample_size"] = nancodes.Nans.NOT_APPLICABLE + df["se"] = np.nan + df["sample_size"] = np.nan + df["missing_se"] = nancodes.Nans.NOT_APPLICABLE + df["missing_sample_size"] = nancodes.Nans.NOT_APPLICABLE sensor_name = sensor + smoother[1] print(sensor_name) if not(("cumulative" in sensor_name) and ("7dav" in sensor_name)): From 652664a95dff3780280f41eddc091037bedc7051 Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Tue, 21 Sep 2021 10:24:48 -0400 Subject: [PATCH 021/133] added back appropriate nan codes --- cdc_vaccines/delphi_cdc_vaccines/run.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/cdc_vaccines/delphi_cdc_vaccines/run.py b/cdc_vaccines/delphi_cdc_vaccines/run.py index d22dfd76d..43dee11f5 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/run.py +++ b/cdc_vaccines/delphi_cdc_vaccines/run.py @@ -69,10 +69,7 @@ def run_module(params): smoother[0].smooth ) df["se"] = nancodes.Nans.NOT_APPLICABLE - df["se"] = np.nan - df["sample_size"] = np.nan - df["missing_se"] = nancodes.Nans.NOT_APPLICABLE - df["missing_sample_size"] = nancodes.Nans.NOT_APPLICABLE + df["sample_size"] = nancodes.Nans.NOT_APPLICABLE sensor_name = sensor + smoother[1] print(sensor_name) if not(("cumulative" in sensor_name) and ("7dav" in sensor_name)): From 3401d71f6f5705a5159717072e4a76ed5e09625b Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Tue, 21 Sep 2021 18:15:41 -0400 Subject: [PATCH 022/133] changes to run.py --- cdc_vaccines/delphi_cdc_vaccines/run.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cdc_vaccines/delphi_cdc_vaccines/run.py b/cdc_vaccines/delphi_cdc_vaccines/run.py index 43dee11f5..51ab3688b 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/run.py +++ b/cdc_vaccines/delphi_cdc_vaccines/run.py @@ -68,8 +68,8 @@ def run_module(params): df["val"] = df[["geo_id", sensor]].groupby("geo_id")[sensor].transform( smoother[0].smooth ) - df["se"] = nancodes.Nans.NOT_APPLICABLE - df["sample_size"] = nancodes.Nans.NOT_APPLICABLE + df["missing_se"] = nancodes.Nans.NOT_APPLICABLE + df["missing_sample_size"] = nancodes.Nans.NOT_APPLICABLE sensor_name = sensor + smoother[1] print(sensor_name) if not(("cumulative" in sensor_name) and ("7dav" in sensor_name)): From 58ee0e2a5dd2db3afc9c46a9cb4bc4f26b1c2931 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Wed, 10 Feb 2021 13:32:17 -0800 Subject: [PATCH 023/133] Update utilities for NAN codes: * update export utility to export, validate, and test the missing cols * handle deleted rows: replaced with nan values * handle deleted files: replace with an empty CSV file * handle comparisons between CSVs with/without missing cols --- _delphi_utils_python/delphi_utils/archive.py | 52 ++++-- _delphi_utils_python/delphi_utils/export.py | 42 ++++- _delphi_utils_python/tests/test_archive.py | 172 ++++++++++++++++--- _delphi_utils_python/tests/test_export.py | 76 +++++++- 4 files changed, 298 insertions(+), 44 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/archive.py b/_delphi_utils_python/delphi_utils/archive.py index 5d1036bcd..31b88a1d1 100644 --- a/_delphi_utils_python/delphi_utils/archive.py +++ b/_delphi_utils_python/delphi_utils/archive.py @@ -40,9 +40,11 @@ from git import Repo from git.refs.head import Head import pandas as pd +import numpy as np from .utils import read_params from .logger import get_structured_logger +from .nancodes import Nans Files = List[str] FileDiffMap = Dict[str, Optional[str]] @@ -73,8 +75,10 @@ def diff_export_csv( changed_df is the pd.DataFrame of common rows from after_csv with changed values. added_df is the pd.DataFrame of added rows from after_csv. """ - export_csv_dtypes = {"geo_id": str, "val": float, - "se": float, "sample_size": float} + export_csv_dtypes = { + "geo_id": str, "val": float, "se": float, "sample_size": float, + "missing_val": int, "missing_se": int, "missing_sample_size": int + } before_df = pd.read_csv(before_csv, dtype=export_csv_dtypes) before_df.set_index("geo_id", inplace=True) @@ -89,12 +93,22 @@ def diff_export_csv( before_df_cmn = before_df.reindex(common_idx) after_df_cmn = after_df.reindex(common_idx) - # Exact comparisons, treating NA == NA as True - same_mask = before_df_cmn == after_df_cmn - same_mask |= pd.isna(before_df_cmn) & pd.isna(after_df_cmn) + # If CSVs have different columns (no missingness), mark all values as new + if ("missing_val" in before_df_cmn.columns) ^ ("missing_val" in after_df_cmn.columns): + same_mask = after_df_cmn.copy() + same_mask.loc[:] = False + else: + # Exact comparisons, treating NA == NA as True + same_mask = before_df_cmn == after_df_cmn + same_mask |= pd.isna(before_df_cmn) & pd.isna(after_df_cmn) + + # Code deleted entries as nans with the deleted missing code + deleted_df = before_df.loc[deleted_idx, :].copy() + deleted_df[["val", "se", "sample_size"]] = np.nan + deleted_df[["missing_val", "missing_se", "missing_sample_size"]] = Nans.DELETED return ( - before_df.loc[deleted_idx, :], + deleted_df, after_df_cmn.loc[~(same_mask.all(axis=1)), :], after_df.loc[added_idx, :]) @@ -227,11 +241,11 @@ def diff_exports(self) -> Tuple[Files, FileDiffMap, Files]: deleted_df, changed_df, added_df = diff_export_csv( before_file, after_file) - new_issues_df = pd.concat([changed_df, added_df], axis=0) + new_issues_df = pd.concat([deleted_df, changed_df, added_df], axis=0) if len(deleted_df) > 0: print( - f"Warning, diff has deleted indices in {after_file} that will be ignored") + f"Diff has deleted indices in {after_file} that have been coded as nans.") # Write the diffs to diff_file, if applicable if len(new_issues_df) > 0: @@ -240,6 +254,17 @@ def diff_exports(self) -> Tuple[Files, FileDiffMap, Files]: new_issues_df.to_csv(diff_file, na_rep="NA") common_diffs[after_file] = diff_file + # Replace deleted files with empty versions, but only if the cached version is not + # already empty + for deleted_file in deleted_files: + deleted_df = pd.read_csv(deleted_file) + if not deleted_df.empty: + print( + f"Diff has deleted {deleted_file} and replaced it with an empty CSV.") + empty_df = deleted_df[0:0] + new_deleted_filename = join(self.export_dir, basename(deleted_file)) + empty_df.to_csv(new_deleted_filename, index=False) + return deleted_files, common_diffs, new_files def archive_exports(self, exported_files: Files) -> Tuple[Files, Files]: @@ -266,9 +291,10 @@ def filter_exports(self, common_diffs: FileDiffMap): Filter export directory to only contain relevant files. Filters down the export_dir to only contain: - 1) New files, 2) Changed files, filtered-down to the ADDED and CHANGED rows only. - Should be called after archive_exports() so we archive the raw exports before - potentially modifying them. + 1) New files, 2) Changed files, filtered-down to the ADDED and CHANGED rows + only, and 3) Deleted files replaced with empty CSVs with the same name. Should + be called after archive_exports() so we archive the raw exports before potentially + modifying them. Parameters ---------- @@ -297,9 +323,9 @@ def run(self): self.update_cache() # Diff exports, and make incremental versions - _, common_diffs, new_files = self.diff_exports() + deleted_files, common_diffs, new_files = self.diff_exports() - # Archive changed and new files only + # Archive changed, new, and emptied deleted files to_archive = [f for f, diff in common_diffs.items() if diff is not None] to_archive += new_files diff --git a/_delphi_utils_python/delphi_utils/export.py b/_delphi_utils_python/delphi_utils/export.py index 5a3b804b2..afc1a4c8a 100644 --- a/_delphi_utils_python/delphi_utils/export.py +++ b/_delphi_utils_python/delphi_utils/export.py @@ -3,10 +3,32 @@ from datetime import datetime from os.path import join from typing import Optional +import logging import numpy as np import pandas as pd +from .nancodes import Nans + +def filter_contradicting_missing_codes(df, sensor, metric, date, logger=None): + """Find values with contradictory missingness codes, filter them, and log.""" + columns = ["val", "se", "sample_size"] + # Get indicies where the XNOR is true (i.e. both are true or both are false). + masks = [ + ~(df[column].isna() ^ df["missing_" + column].eq(Nans.NOT_MISSING)) + for column in columns + ] + for mask in masks: + if not logger is None and df.loc[mask].size > 0: + logger.info( + "Filtering contradictory missing code in " + + "{0}_{1}_{2}.".format(sensor, metric, date.strftime(format="%Y-%m-%d")) + ) + df = df.loc[~mask] + elif logger is None and df.loc[mask].size > 0: + df = df.loc[~mask] + return df + def create_export_csv( df: pd.DataFrame, export_dir: str, @@ -16,7 +38,8 @@ def create_export_csv( start_date: Optional[datetime] = None, end_date: Optional[datetime] = None, remove_null_samples: Optional[bool] = False, - write_empty_days: Optional[bool] = False + write_empty_days: Optional[bool] = False, + logger: Optional[logging.Logger] = None ): """Export data in the format expected by the Delphi API. @@ -43,6 +66,8 @@ def create_export_csv( write_empty_days: Optional[bool] If true, every day in between start_date and end_date will have a CSV file written even if there is no data for the day. If false, only the days present are written. + logger: Optional[logging.Logger] + Pass a logger object here to log information about contradictory missing codes. Returns --------- @@ -70,7 +95,20 @@ def create_export_csv( else: export_filename = f"{date.strftime('%Y%m%d')}_{geo_res}_{metric}_{sensor}.csv" export_file = join(export_dir, export_filename) - export_df = df[df["timestamp"] == date][["geo_id", "val", "se", "sample_size",]] + expected_columns = [ + "geo_id", + "val", + "se", + "sample_size", + "missing_val", + "missing_se", + "missing_sample_size" + ] + export_df = df[df["timestamp"] == date].filter(items=expected_columns) + if "missing_val" in export_df.columns: + export_df = filter_contradicting_missing_codes( + export_df, sensor, metric, date, logger=logger + ) if remove_null_samples: export_df = export_df[export_df["sample_size"].notnull()] export_df = export_df.round({"val": 7, "se": 7}) diff --git a/_delphi_utils_python/tests/test_archive.py b/_delphi_utils_python/tests/test_archive.py index 1b068f898..4c7d1fc57 100644 --- a/_delphi_utils_python/tests/test_archive.py +++ b/_delphi_utils_python/tests/test_archive.py @@ -14,8 +14,12 @@ from delphi_utils.archive import ArchiveDiffer, GitArchiveDiffer, S3ArchiveDiffer,\ archiver_from_params +from delphi_utils.nancodes import Nans -CSV_DTYPES = {"geo_id": str, "val": float, "se": float, "sample_size": float} +CSV_DTYPES = { + "geo_id": str, "val": float, "se": float, "sample_size": float, + "missing_val": int, "missing_se":int, "missing_sample_size": int + } CSVS_BEFORE = { # Common @@ -23,20 +27,40 @@ "geo_id": ["1", "2", "3"], "val": [1.000000001, 2.00000002, 3.00000003], "se": [0.1, 0.2, 0.3], - "sample_size": [10.0, 20.0, 30.0]}), + "sample_size": [10.0, 20.0, 30.0], + "missing_val": [Nans.NOT_MISSING] * 3, + "missing_se": [Nans.NOT_MISSING] * 3, + "missing_sample_size": [Nans.NOT_MISSING] * 3, + }), "csv1": pd.DataFrame({ "geo_id": ["1", "2", "3"], "val": [1.0, 2.0, 3.0], "se": [np.nan, 0.20000002, 0.30000003], - "sample_size": [10.0, 20.0, 30.0]}), + "sample_size": [10.0, 20.0, 30.0], + "missing_val": [Nans.NOT_MISSING] * 3, + "missing_se": [Nans.NOT_MISSING] * 3, + "missing_sample_size": [Nans.NOT_MISSING] * 3, + }), # Deleted "csv2": pd.DataFrame({ "geo_id": ["1"], "val": [1.0], "se": [0.1], - "sample_size": [10.0]}), + "sample_size": [10.0], + "missing_val": [Nans.NOT_MISSING], + "missing_se": [Nans.NOT_MISSING], + "missing_sample_size": [Nans.NOT_MISSING], + }), + + # Common, but updated with missing columns + "csv4": pd.DataFrame({ + "geo_id": ["1"], + "val": [1.0], + "se": [0.1], + "sample_size": [10.0] + }), } CSVS_AFTER = { @@ -45,23 +69,45 @@ "geo_id": ["1", "2", "3"], "val": [1.0, 2.0, 3.0], "se": [0.10000001, 0.20000002, 0.30000003], - "sample_size": [10.0, 20.0, 30.0]}), + "sample_size": [10.0, 20.0, 30.0], + "missing_val": [Nans.NOT_MISSING] * 3, + "missing_se": [Nans.NOT_MISSING] * 3, + "missing_sample_size": [Nans.NOT_MISSING] * 3, + }), "csv1": pd.DataFrame({ "geo_id": ["1", "2", "4"], "val": [1.0, 2.1, 4.0], "se": [np.nan, 0.21, np.nan], - "sample_size": [10.0, 21.0, 40.0]}), + "sample_size": [10.0, 21.0, 40.0], + "missing_val": [Nans.NOT_MISSING] * 3, + "missing_se": [Nans.NOT_MISSING] * 3, + "missing_sample_size": [Nans.NOT_MISSING] * 3, + }), # Added "csv3": pd.DataFrame({ "geo_id": ["2"], "val": [2.0000002], "se": [0.2], - "sample_size": [20.0]}), + "sample_size": [20.0], + "missing_val": [Nans.NOT_MISSING], + "missing_se": [Nans.NOT_MISSING], + "missing_sample_size": [Nans.NOT_MISSING], + }), + + # Common, but updated with missing columns + "csv4": pd.DataFrame({ + "geo_id": ["1"], + "val": [1.0], + "se": [0.1], + "sample_size": [10.0], + "missing_val": [Nans.NOT_MISSING], + "missing_se": [Nans.NOT_MISSING], + "missing_sample_size": [Nans.NOT_MISSING], + }), } - class TestArchiveDiffer: def test_stubs(self): @@ -80,10 +126,27 @@ def test_diff_and_filter_exports(self, tmp_path): mkdir(export_dir) csv1_diff = pd.DataFrame({ - "geo_id": ["2", "4"], - "val": [2.1, 4.0], - "se": [0.21, np.nan], - "sample_size": [21.0, 40.0]}) + "geo_id": ["3", "2", "4"], + "val": [np.nan, 2.1, 4.0], + "se": [np.nan, 0.21, np.nan], + "sample_size": [np.nan, 21.0, 40.0], + "missing_val": [Nans.DELETED] + [Nans.NOT_MISSING] * 2, + "missing_se": [Nans.DELETED] + [Nans.NOT_MISSING] * 2, + "missing_sample_size": [Nans.DELETED] + [Nans.NOT_MISSING] * 2, + }) + + csv2_deleted = pd.DataFrame( + np.empty(0, dtype=[ + ("geo_id", str), + ("val", float), + ("se", float), + ("sample_size", float), + ("missing_val", int), + ("missing_se", int), + ("missing_sample_size", int) + ]), + index=[] + ) arch_diff = ArchiveDiffer(cache_dir, export_dir) @@ -106,7 +169,7 @@ def test_diff_and_filter_exports(self, tmp_path): # Check return values assert set(deleted_files) == {join(cache_dir, "csv2.csv")} assert set(common_diffs.keys()) == { - join(export_dir, f) for f in ["csv0.csv", "csv1.csv"]} + join(export_dir, f) for f in ["csv0.csv", "csv1.csv", "csv4.csv"]} assert set(new_files) == {join(export_dir, "csv3.csv")} assert common_diffs[join(export_dir, "csv0.csv")] is None assert common_diffs[join(export_dir, "csv1.csv")] == join( @@ -114,7 +177,10 @@ def test_diff_and_filter_exports(self, tmp_path): # Check filesystem for actual files assert set(listdir(export_dir)) == { - "csv0.csv", "csv1.csv", "csv1.csv.diff", "csv3.csv"} + "csv0.csv", "csv1.csv", "csv1.csv.diff", + "csv3.csv", "csv4.csv", "csv4.csv.diff", + "csv2.csv" + } assert_frame_equal( pd.read_csv(join(export_dir, "csv1.csv.diff"), dtype=CSV_DTYPES), csv1_diff) @@ -131,8 +197,11 @@ def test_diff_and_filter_exports(self, tmp_path): arch_diff.filter_exports(common_diffs) - # Check exports directory just has incremental changes - assert set(listdir(export_dir)) == {"csv1.csv", "csv3.csv"} + # Check exports directory just has incremental and deleted changes + assert set(listdir(export_dir)) == {"csv1.csv", "csv2.csv", "csv3.csv", "csv4.csv"} + assert_frame_equal( + pd.read_csv(join(export_dir, "csv2.csv"), dtype=CSV_DTYPES), + csv2_deleted) assert_frame_equal( pd.read_csv(join(export_dir, "csv1.csv"), dtype=CSV_DTYPES), csv1_diff) @@ -259,15 +328,34 @@ def test_run(self, tmp_path, s3_client): assert_frame_equal(pd.read_csv(body, dtype=CSV_DTYPES), df) # Check exports directory just has incremental changes - assert set(listdir(export_dir)) == {"csv1.csv", "csv3.csv"} + assert set(listdir(export_dir)) == {"csv1.csv", "csv2.csv", "csv3.csv", "csv4.csv"} csv1_diff = pd.DataFrame({ - "geo_id": ["2", "4"], - "val": [2.1, 4.0], - "se": [0.21, np.nan], - "sample_size": [21.0, 40.0]}) + "geo_id": ["3", "2", "4"], + "val": [np.nan, 2.1, 4.0], + "se": [np.nan, 0.21, np.nan], + "sample_size": [np.nan, 21.0, 40.0], + "missing_val": [Nans.DELETED] + [Nans.NOT_MISSING] * 2, + "missing_se": [Nans.DELETED] + [Nans.NOT_MISSING] * 2, + "missing_sample_size": [Nans.DELETED] + [Nans.NOT_MISSING] * 2, + }) assert_frame_equal( pd.read_csv(join(export_dir, "csv1.csv"), dtype=CSV_DTYPES), csv1_diff) + csv2_deleted = pd.DataFrame( + np.empty(0, dtype=[ + ("geo_id", str), + ("val", float), + ("se", float), + ("sample_size", float), + ("missing_val", int), + ("missing_se", int), + ("missing_sample_size", int) + ]), + index=[] + ) + assert_frame_equal( + pd.read_csv(join(export_dir, "csv2.csv"), dtype=CSV_DTYPES), + csv2_deleted) class TestGitArchiveDiffer: @@ -346,7 +434,11 @@ def test_diff_exports(self, tmp_path): "geo_id": ["1", "2", "3"], "val": [1.0, 2.0, 3.0], "se": [0.1, 0.2, 0.3], - "sample_size": [10.0, 20.0, 30.0]}) + "sample_size": [10.0, 20.0, 30.0], + "missing_val": [Nans.NOT_MISSING] * 3, + "missing_se": [Nans.NOT_MISSING] * 3, + "missing_sample_size": [Nans.NOT_MISSING] * 3, + }) # Write exact same CSV into cache and export, so no diffs expected csv1.to_csv(join(cache_dir, "csv1.csv"), index=False) @@ -383,7 +475,11 @@ def test_archive_exports(self, tmp_path): "geo_id": ["1", "2", "3"], "val": [1.0, 2.0, 3.0], "se": [0.1, 0.2, 0.3], - "sample_size": [10.0, 20.0, 30.0]}) + "sample_size": [10.0, 20.0, 30.0], + "missing_val": [Nans.NOT_MISSING] * 3, + "missing_se": [Nans.NOT_MISSING] * 3, + "missing_sample_size": [Nans.NOT_MISSING] * 3, + }) # csv1.csv is now a dirty edit in the repo, and to be exported too csv1.to_csv(join(cache_dir, "csv1.csv"), index=False) @@ -460,15 +556,35 @@ def test_run(self, tmp_path): original_branch.checkout() # Check exports directory just has incremental changes - assert set(listdir(export_dir)) == {"csv1.csv", "csv3.csv"} + assert set(listdir(export_dir)) == {"csv1.csv", "csv2.csv", "csv3.csv", "csv4.csv"} csv1_diff = pd.DataFrame({ - "geo_id": ["2", "4"], - "val": [2.1, 4.0], - "se": [0.21, np.nan], - "sample_size": [21.0, 40.0]}) + "geo_id": ["3", "2", "4"], + "val": [np.nan, 2.1, 4.0], + "se": [np.nan, 0.21, np.nan], + "sample_size": [np.nan, 21.0, 40.0], + "missing_val": [Nans.DELETED] + [Nans.NOT_MISSING] * 2, + "missing_se": [Nans.DELETED] + [Nans.NOT_MISSING] * 2, + "missing_sample_size": [Nans.DELETED] + [Nans.NOT_MISSING] * 2, + }) assert_frame_equal( pd.read_csv(join(export_dir, "csv1.csv"), dtype=CSV_DTYPES), csv1_diff) + csv2_deleted = pd.DataFrame( + np.empty(0, dtype=[ + ("geo_id", str), + ("val", float), + ("se", float), + ("sample_size", float), + ("missing_val", int), + ("missing_se", int), + ("missing_sample_size", int) + ]), + index=[] + ) + assert_frame_equal( + pd.read_csv(join(export_dir, "csv2.csv"), dtype=CSV_DTYPES), + csv2_deleted) + class TestFromParams: diff --git a/_delphi_utils_python/tests/test_export.py b/_delphi_utils_python/tests/test_export.py index 31ec5c113..b22a710cd 100644 --- a/_delphi_utils_python/tests/test_export.py +++ b/_delphi_utils_python/tests/test_export.py @@ -3,8 +3,11 @@ from os import listdir, remove from os.path import join +import mock +import numpy as np import pandas as pd -from delphi_utils import create_export_csv + +from delphi_utils import create_export_csv, Nans def _clean_directory(directory): """Clean files out of a directory.""" @@ -43,6 +46,34 @@ class TestExport: } ) + # A sample data frame with missingness. + DF2 = pd.DataFrame( + { + "geo_id": ["51093", "51175", "51175", "51620"], + "timestamp": TIMES, + "val": [3.12345678910, np.nan, 2.2, 2.6], + "se": [0.15, 0.22, np.nan, 0.34], + "sample_size": [100, 100, 101, None], + "missing_val": [Nans.NOT_MISSING, Nans.OTHER, Nans.NOT_MISSING, Nans.NOT_MISSING], + "missing_se": [Nans.NOT_MISSING, Nans.NOT_MISSING, Nans.OTHER, Nans.NOT_MISSING], + "missing_sample_size": [Nans.NOT_MISSING] * 3 + [Nans.OTHER] + } + ) + + # A sample data frame with contradictory missing codes. + DF3 = pd.DataFrame( + { + "geo_id": ["51093", "51175", "51175", "51620"], + "timestamp": TIMES, + "val": [np.nan, np.nan, 2.2, 2.6], + "se": [0.15, 0.22, np.nan, 0.34], + "sample_size": [100, 100, 101, None], + "missing_val": [Nans.NOT_MISSING, Nans.OTHER, Nans.NOT_MISSING, Nans.NOT_MISSING], + "missing_se": [Nans.NOT_MISSING, Nans.NOT_MISSING, Nans.OTHER, Nans.NOT_MISSING], + "missing_sample_size": [Nans.NOT_MISSING] * 3 + [Nans.OTHER] + } + ) + # Directory in which to store tests. TEST_DIR = "test_dir" @@ -235,3 +266,46 @@ def test_export_without_null_removal(self): ] ) assert pd.read_csv(join(self.TEST_DIR, "20200606_state_test.csv")).size > 0 + + def test_export_df_with_missingness(self): + _clean_directory(self.TEST_DIR) + + create_export_csv( + df=self.DF2.copy(), + export_dir=self.TEST_DIR, + geo_res="state", + sensor="test", + remove_null_samples=False + ) + assert _non_ignored_files_set(self.TEST_DIR) == set( + [ + "20200215_state_test.csv", + "20200301_state_test.csv", + "20200315_state_test.csv", + ] + ) + assert pd.read_csv(join(self.TEST_DIR, "20200315_state_test.csv")).size > 0 + + @mock.patch("delphi_utils.logger") + def test_export_df_with_contradictory_missingness(self, mock_logger): + _clean_directory(self.TEST_DIR) + + create_export_csv( + df=self.DF3.copy(), + export_dir=self.TEST_DIR, + geo_res="state", + sensor="test", + remove_null_samples=False, + logger=mock_logger + ) + assert _non_ignored_files_set(self.TEST_DIR) == set( + [ + "20200215_state_test.csv", + "20200301_state_test.csv", + "20200315_state_test.csv", + ] + ) + assert pd.read_csv(join(self.TEST_DIR, "20200315_state_test.csv")).size > 0 + mock_logger.info.assert_called_once_with( + "Filtering contradictory missing code in test_None_2020-02-15." + ) From e035a214fd8f7294e6bb78567da9e7c60de22e85 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Wed, 12 May 2021 14:29:50 -0700 Subject: [PATCH 024/133] Nans: update archiver deletion handling --- _delphi_utils_python/delphi_utils/archive.py | 6 +++++- _delphi_utils_python/tests/test_archive.py | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/_delphi_utils_python/delphi_utils/archive.py b/_delphi_utils_python/delphi_utils/archive.py index 31b88a1d1..0eb302e7d 100644 --- a/_delphi_utils_python/delphi_utils/archive.py +++ b/_delphi_utils_python/delphi_utils/archive.py @@ -256,7 +256,9 @@ def diff_exports(self) -> Tuple[Files, FileDiffMap, Files]: # Replace deleted files with empty versions, but only if the cached version is not # already empty + new_deleted_files = [] for deleted_file in deleted_files: + breakpoint() deleted_df = pd.read_csv(deleted_file) if not deleted_df.empty: print( @@ -264,8 +266,9 @@ def diff_exports(self) -> Tuple[Files, FileDiffMap, Files]: empty_df = deleted_df[0:0] new_deleted_filename = join(self.export_dir, basename(deleted_file)) empty_df.to_csv(new_deleted_filename, index=False) + new_deleted_files.append(deleted_file) - return deleted_files, common_diffs, new_files + return new_deleted_files, common_diffs, new_files def archive_exports(self, exported_files: Files) -> Tuple[Files, Files]: """ @@ -329,6 +332,7 @@ def run(self): to_archive = [f for f, diff in common_diffs.items() if diff is not None] to_archive += new_files + to_archive += deleted_files _, fails = self.archive_exports(to_archive) # Filter existing exports to exclude those that failed to archive diff --git a/_delphi_utils_python/tests/test_archive.py b/_delphi_utils_python/tests/test_archive.py index 4c7d1fc57..092d4d8a8 100644 --- a/_delphi_utils_python/tests/test_archive.py +++ b/_delphi_utils_python/tests/test_archive.py @@ -298,6 +298,7 @@ def test_run(self, tmp_path, s3_client): export_dir = join(str(tmp_path), "export") mkdir(cache_dir) mkdir(export_dir) + breakpoint() # Set up current buckets to be `CSVS_BEFORE`. s3_client.create_bucket(Bucket=self.bucket_name) From 292084be6c8ae56609601483982c191c4aabd0bb Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Thu, 13 May 2021 15:51:13 -0700 Subject: [PATCH 025/133] Nans: update archiver deletion --- _delphi_utils_python/delphi_utils/archive.py | 32 ++++++---- _delphi_utils_python/tests/test_archive.py | 66 +++++++++----------- 2 files changed, 48 insertions(+), 50 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/archive.py b/_delphi_utils_python/delphi_utils/archive.py index 0eb302e7d..ce6553018 100644 --- a/_delphi_utils_python/delphi_utils/archive.py +++ b/_delphi_utils_python/delphi_utils/archive.py @@ -254,21 +254,26 @@ def diff_exports(self) -> Tuple[Files, FileDiffMap, Files]: new_issues_df.to_csv(diff_file, na_rep="NA") common_diffs[after_file] = diff_file + export_csv_dtypes = { + "geo_id": str, "val": float, "se": float, "sample_size": float, + "missing_val": int, "missing_se": int, "missing_sample_size": int + } + # Replace deleted files with empty versions, but only if the cached version is not # already empty - new_deleted_files = [] + deleted_files_export = [] for deleted_file in deleted_files: - breakpoint() - deleted_df = pd.read_csv(deleted_file) - if not deleted_df.empty: - print( - f"Diff has deleted {deleted_file} and replaced it with an empty CSV.") - empty_df = deleted_df[0:0] - new_deleted_filename = join(self.export_dir, basename(deleted_file)) - empty_df.to_csv(new_deleted_filename, index=False) - new_deleted_files.append(deleted_file) - - return new_deleted_files, common_diffs, new_files + deleted_df = pd.read_csv(deleted_file, dtype=export_csv_dtypes) + print( + f"Diff has deleted {deleted_file}; generating a CSV with deleted rows." + ) + deleted_df[["val", "se", "sample_size"]] = np.nan + deleted_df[["missing_val", "missing_se", "missing_sample_size"]] = Nans.DELETED + filename = join(self.export_dir, basename(deleted_file)) + deleted_df.to_csv(filename, index=False) + deleted_files_export.append(filename) + + return deleted_files_export, common_diffs, new_files def archive_exports(self, exported_files: Files) -> Tuple[Files, Files]: """ @@ -444,6 +449,9 @@ def archive_exports(self, # pylint: disable=arguments-differ archive_success.append(exported_file) except FileNotFoundError: archive_fail.append(exported_file) + except shutil.SameFileError: + # no need to copy if the cached file is the same + archive_success.append(exported_file) self._exports_archived = True diff --git a/_delphi_utils_python/tests/test_archive.py b/_delphi_utils_python/tests/test_archive.py index 092d4d8a8..0a21ecbb9 100644 --- a/_delphi_utils_python/tests/test_archive.py +++ b/_delphi_utils_python/tests/test_archive.py @@ -135,18 +135,15 @@ def test_diff_and_filter_exports(self, tmp_path): "missing_sample_size": [Nans.DELETED] + [Nans.NOT_MISSING] * 2, }) - csv2_deleted = pd.DataFrame( - np.empty(0, dtype=[ - ("geo_id", str), - ("val", float), - ("se", float), - ("sample_size", float), - ("missing_val", int), - ("missing_se", int), - ("missing_sample_size", int) - ]), - index=[] - ) + csv2_deleted = pd.DataFrame({ + "geo_id": ["1"], + "val": [np.nan], + "se": [np.nan], + "sample_size": [np.nan], + "missing_val": [Nans.DELETED], + "missing_se": [Nans.DELETED], + "missing_sample_size": [Nans.DELETED], + }) arch_diff = ArchiveDiffer(cache_dir, export_dir) @@ -167,7 +164,7 @@ def test_diff_and_filter_exports(self, tmp_path): deleted_files, common_diffs, new_files = arch_diff.diff_exports() # Check return values - assert set(deleted_files) == {join(cache_dir, "csv2.csv")} + assert set(deleted_files) == {join(export_dir, "csv2.csv")} assert set(common_diffs.keys()) == { join(export_dir, f) for f in ["csv0.csv", "csv1.csv", "csv4.csv"]} assert set(new_files) == {join(export_dir, "csv3.csv")} @@ -298,7 +295,6 @@ def test_run(self, tmp_path, s3_client): export_dir = join(str(tmp_path), "export") mkdir(cache_dir) mkdir(export_dir) - breakpoint() # Set up current buckets to be `CSVS_BEFORE`. s3_client.create_bucket(Bucket=self.bucket_name) @@ -342,18 +338,15 @@ def test_run(self, tmp_path, s3_client): assert_frame_equal( pd.read_csv(join(export_dir, "csv1.csv"), dtype=CSV_DTYPES), csv1_diff) - csv2_deleted = pd.DataFrame( - np.empty(0, dtype=[ - ("geo_id", str), - ("val", float), - ("se", float), - ("sample_size", float), - ("missing_val", int), - ("missing_se", int), - ("missing_sample_size", int) - ]), - index=[] - ) + csv2_deleted = pd.DataFrame({ + "geo_id": ["1"], + "val": [np.nan], + "se": [np.nan], + "sample_size": [np.nan], + "missing_val": [Nans.DELETED], + "missing_se": [Nans.DELETED], + "missing_sample_size": [Nans.DELETED], + }) assert_frame_equal( pd.read_csv(join(export_dir, "csv2.csv"), dtype=CSV_DTYPES), csv2_deleted) @@ -570,18 +563,15 @@ def test_run(self, tmp_path): assert_frame_equal( pd.read_csv(join(export_dir, "csv1.csv"), dtype=CSV_DTYPES), csv1_diff) - csv2_deleted = pd.DataFrame( - np.empty(0, dtype=[ - ("geo_id", str), - ("val", float), - ("se", float), - ("sample_size", float), - ("missing_val", int), - ("missing_se", int), - ("missing_sample_size", int) - ]), - index=[] - ) + csv2_deleted = pd.DataFrame({ + "geo_id": ["1"], + "val": [np.nan], + "se": [np.nan], + "sample_size": [np.nan], + "missing_val": [Nans.DELETED], + "missing_se": [Nans.DELETED], + "missing_sample_size": [Nans.DELETED], + }) assert_frame_equal( pd.read_csv(join(export_dir, "csv2.csv"), dtype=CSV_DTYPES), csv2_deleted) From 8c9f41f279e5cc5b3c3d9f5874f7100a6a2ea42a Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Tue, 31 Aug 2021 11:50:29 -0700 Subject: [PATCH 026/133] Nancodes archiver: rename variable for clarity --- _delphi_utils_python/delphi_utils/archive.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/archive.py b/_delphi_utils_python/delphi_utils/archive.py index ce6553018..994dfd7df 100644 --- a/_delphi_utils_python/delphi_utils/archive.py +++ b/_delphi_utils_python/delphi_utils/archive.py @@ -261,19 +261,19 @@ def diff_exports(self) -> Tuple[Files, FileDiffMap, Files]: # Replace deleted files with empty versions, but only if the cached version is not # already empty - deleted_files_export = [] + deleted_files_nanfilled = [] for deleted_file in deleted_files: deleted_df = pd.read_csv(deleted_file, dtype=export_csv_dtypes) print( - f"Diff has deleted {deleted_file}; generating a CSV with deleted rows." + f"Diff has deleted {deleted_file}; generating a CSV with corresponding deleted rows." ) deleted_df[["val", "se", "sample_size"]] = np.nan deleted_df[["missing_val", "missing_se", "missing_sample_size"]] = Nans.DELETED filename = join(self.export_dir, basename(deleted_file)) deleted_df.to_csv(filename, index=False) - deleted_files_export.append(filename) + deleted_files_nanfilled.append(filename) - return deleted_files_export, common_diffs, new_files + return deleted_files_nanfilled, common_diffs, new_files def archive_exports(self, exported_files: Files) -> Tuple[Files, Files]: """ From 738b2012d0eae87008a6533bfb1a40474eed79b1 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Tue, 31 Aug 2021 12:03:22 -0700 Subject: [PATCH 027/133] Nancodes archiver: small formatting change --- _delphi_utils_python/tests/test_archive.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_delphi_utils_python/tests/test_archive.py b/_delphi_utils_python/tests/test_archive.py index 0a21ecbb9..111acf92f 100644 --- a/_delphi_utils_python/tests/test_archive.py +++ b/_delphi_utils_python/tests/test_archive.py @@ -133,7 +133,7 @@ def test_diff_and_filter_exports(self, tmp_path): "missing_val": [Nans.DELETED] + [Nans.NOT_MISSING] * 2, "missing_se": [Nans.DELETED] + [Nans.NOT_MISSING] * 2, "missing_sample_size": [Nans.DELETED] + [Nans.NOT_MISSING] * 2, - }) + }) csv2_deleted = pd.DataFrame({ "geo_id": ["1"], From f67925b1a6a39a217fb84150b56d2ff082837632 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Wed, 15 Sep 2021 13:00:45 -0700 Subject: [PATCH 028/133] Nancodes: make linter happy --- _delphi_utils_python/delphi_utils/archive.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_delphi_utils_python/delphi_utils/archive.py b/_delphi_utils_python/delphi_utils/archive.py index 994dfd7df..ea8f27ac4 100644 --- a/_delphi_utils_python/delphi_utils/archive.py +++ b/_delphi_utils_python/delphi_utils/archive.py @@ -265,7 +265,7 @@ def diff_exports(self) -> Tuple[Files, FileDiffMap, Files]: for deleted_file in deleted_files: deleted_df = pd.read_csv(deleted_file, dtype=export_csv_dtypes) print( - f"Diff has deleted {deleted_file}; generating a CSV with corresponding deleted rows." + f"Diff deleted {deleted_file}; generating corresponding CSV with deleted rows." ) deleted_df[["val", "se", "sample_size"]] = np.nan deleted_df[["missing_val", "missing_se", "missing_sample_size"]] = Nans.DELETED From 661fab902b4d1d50addc10c9c292b43bf0302611 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 9 Jul 2021 10:44:42 -0400 Subject: [PATCH 029/133] create dockerfile and dockerignore to host survey pipeline --- .dockerignore | 34 ++++++++++++++++++++++++++++++++++ Dockerfile | 19 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..7ddb2616b --- /dev/null +++ b/.dockerignore @@ -0,0 +1,34 @@ +/ansible/ +/cdc_covidnet/ +/changehc/ +/claims_hosp/ +/combo_cases_and_deaths/ +/covid_act_now/ +/doctor_visits/ +/google_health/ +/google_symptoms/ +/hhs_facilities/ +/hhs_hosp/ +/jenkins/ +/Jenkinsfile/ +/jhu/ +/nchs_mortality/ +/nowcast/ +/quidel/ +/quidel_covidtest/ +/README.md +/safegraph_patterns/ +/sir_complainsalot/ +/testing_utils/ +/usafacts/ +/validator/ + +/*/*.tgz +/*/receiving/ +/*/archive/ +/*/contingency_receiving/ +/*/tidy* +/*/individual/ +/*/*.R +/*/params* + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..0e41b92af --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM rocker/tidyverse:latest + +# use delphi's timezome +RUN ln -s -f /usr/share/zoneinfo/America/New_York /etc/localtime + +RUN install2.r --error \ + jsonlite \ + stringr \ + stringi \ + data.table \ + roxygen2 +RUN apt-get update && apt-get install -qq -y python3-venv + +ADD ./_delphi_utils_python/ /_delphi_utils_python/ +ADD ./facebook/delphiFacebook /facebook/delphiFacebook/ +ADD ./facebook/Makefile /facebook/Makefile +WORKDIR /facebook/ +RUN make lib +RUN make install From 3043cb40ddec004be65846a9e634319deb54eb72 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 9 Jul 2021 11:25:48 -0400 Subject: [PATCH 030/133] force Rcpp update and install utils via pip --- Dockerfile | 4 ++-- facebook/Makefile | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0e41b92af..65238698f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,10 +8,10 @@ RUN install2.r --error \ stringr \ stringi \ data.table \ - roxygen2 + roxygen2 \ + Rcpp RUN apt-get update && apt-get install -qq -y python3-venv -ADD ./_delphi_utils_python/ /_delphi_utils_python/ ADD ./facebook/delphiFacebook /facebook/delphiFacebook/ ADD ./facebook/Makefile /facebook/Makefile WORKDIR /facebook/ diff --git a/facebook/Makefile b/facebook/Makefile index 5e0219ce2..93a203a3b 100644 --- a/facebook/Makefile +++ b/facebook/Makefile @@ -55,7 +55,7 @@ clean-archive: install-python: python3.8 -m venv env source env/bin/activate && \ - pip install -e ../_delphi_utils_python && \ + pip install delphi_utils && \ pip install -e delphiFacebook/python install-R:dev From 46e2d47412e5596a53305ee979f1e5c1bbf166db Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 9 Jul 2021 11:29:47 -0400 Subject: [PATCH 031/133] install wheel dependency --- facebook/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/facebook/Makefile b/facebook/Makefile index 93a203a3b..3d23db25c 100644 --- a/facebook/Makefile +++ b/facebook/Makefile @@ -55,6 +55,7 @@ clean-archive: install-python: python3.8 -m venv env source env/bin/activate && \ + pip install wheel && \ pip install delphi_utils && \ pip install -e delphiFacebook/python From 1365da1b8ccc5ce69bb648c5f4530594710b4bea Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 9 Jul 2021 14:52:02 -0400 Subject: [PATCH 032/133] move docker files to facebook dir --- .dockerignore | 34 ------------------------------- facebook/.dockerignore | 6 ++++++ Dockerfile => facebook/Dockerfile | 5 +++-- 3 files changed, 9 insertions(+), 36 deletions(-) delete mode 100644 .dockerignore create mode 100644 facebook/.dockerignore rename Dockerfile => facebook/Dockerfile (75%) diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 7ddb2616b..000000000 --- a/.dockerignore +++ /dev/null @@ -1,34 +0,0 @@ -/ansible/ -/cdc_covidnet/ -/changehc/ -/claims_hosp/ -/combo_cases_and_deaths/ -/covid_act_now/ -/doctor_visits/ -/google_health/ -/google_symptoms/ -/hhs_facilities/ -/hhs_hosp/ -/jenkins/ -/Jenkinsfile/ -/jhu/ -/nchs_mortality/ -/nowcast/ -/quidel/ -/quidel_covidtest/ -/README.md -/safegraph_patterns/ -/sir_complainsalot/ -/testing_utils/ -/usafacts/ -/validator/ - -/*/*.tgz -/*/receiving/ -/*/archive/ -/*/contingency_receiving/ -/*/tidy* -/*/individual/ -/*/*.R -/*/params* - diff --git a/facebook/.dockerignore b/facebook/.dockerignore new file mode 100644 index 000000000..95354f587 --- /dev/null +++ b/facebook/.dockerignore @@ -0,0 +1,6 @@ +/*/*.tgz +/*/receiving/ +/*/contingency_receiving/ +/*/tidy* +/*/individual/ +/*/params* diff --git a/Dockerfile b/facebook/Dockerfile similarity index 75% rename from Dockerfile rename to facebook/Dockerfile index 65238698f..6b6f0872c 100644 --- a/Dockerfile +++ b/facebook/Dockerfile @@ -12,8 +12,9 @@ RUN install2.r --error \ Rcpp RUN apt-get update && apt-get install -qq -y python3-venv -ADD ./facebook/delphiFacebook /facebook/delphiFacebook/ -ADD ./facebook/Makefile /facebook/Makefile +ADD ./delphiFacebook /facebook/delphiFacebook/ +ADD ./static /facebook/static/ +ADD ./Makefile /facebook/Makefile WORKDIR /facebook/ RUN make lib RUN make install From 55ed2320c977c03b6fbea585d66bf84dcb397cae Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 12 Jul 2021 16:02:35 -0400 Subject: [PATCH 033/133] add more package requirements --- facebook/Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/facebook/Dockerfile b/facebook/Dockerfile index 6b6f0872c..ac98a4866 100644 --- a/facebook/Dockerfile +++ b/facebook/Dockerfile @@ -15,6 +15,10 @@ RUN apt-get update && apt-get install -qq -y python3-venv ADD ./delphiFacebook /facebook/delphiFacebook/ ADD ./static /facebook/static/ ADD ./Makefile /facebook/Makefile +ADD ./run.R /facebook/run.R +ADD ./monthly-files.R /facebook/monthly-files.R +ADD ./contingency_tables.R /facebook/contingency_tables.R +ADD ./contingency-combine.R /facebook/contingency-combine.R WORKDIR /facebook/ RUN make lib RUN make install From 583c5e161605e5f2aca7b57b65fe9021d7fe4db0 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 15 Jul 2021 17:47:05 -0400 Subject: [PATCH 034/133] remove dockerignore --- facebook/.dockerignore | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 facebook/.dockerignore diff --git a/facebook/.dockerignore b/facebook/.dockerignore deleted file mode 100644 index 95354f587..000000000 --- a/facebook/.dockerignore +++ /dev/null @@ -1,6 +0,0 @@ -/*/*.tgz -/*/receiving/ -/*/contingency_receiving/ -/*/tidy* -/*/individual/ -/*/params* From 11186b9fa585ab3144e9911e19275e21721ce4b9 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 2 Sep 2021 11:06:19 -0400 Subject: [PATCH 035/133] specify readr version Newest readr versions contain bugs that either cause tests to fail (2.0.0) or cause `read_csv` to hang when empty locale is specified (2.0.1). 1.4.0 is the lastest version that does not cause errors. --- facebook/Dockerfile | 1 + facebook/delphiFacebook/DESCRIPTION | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/facebook/Dockerfile b/facebook/Dockerfile index ac98a4866..d7e97a5e6 100644 --- a/facebook/Dockerfile +++ b/facebook/Dockerfile @@ -10,6 +10,7 @@ RUN install2.r --error \ data.table \ roxygen2 \ Rcpp +RUN R --no-restore --no-save -e 'devtools::install_version("readr", version="1.4.0")' RUN apt-get update && apt-get install -qq -y python3-venv ADD ./delphiFacebook /facebook/delphiFacebook/ diff --git a/facebook/delphiFacebook/DESCRIPTION b/facebook/delphiFacebook/DESCRIPTION index 85939741f..2a5bf172d 100644 --- a/facebook/delphiFacebook/DESCRIPTION +++ b/facebook/delphiFacebook/DESCRIPTION @@ -13,7 +13,7 @@ Depends: Imports: stats, rlang, - readr, + readr (<= 1.4.0), dplyr, stringi, jsonlite, From 21b908d232afde9441b142674f0a7b0c9f5c14e2 Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Wed, 8 Sep 2021 14:57:29 -0400 Subject: [PATCH 036/133] - Adds BH dependency - Adds apt packages for sending mail and connecting to sftp --- facebook/Dockerfile | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/facebook/Dockerfile b/facebook/Dockerfile index d7e97a5e6..c17d0724d 100644 --- a/facebook/Dockerfile +++ b/facebook/Dockerfile @@ -9,9 +9,15 @@ RUN install2.r --error \ stringi \ data.table \ roxygen2 \ - Rcpp + Rcpp \ + BH + RUN R --no-restore --no-save -e 'devtools::install_version("readr", version="1.4.0")' -RUN apt-get update && apt-get install -qq -y python3-venv +RUN apt-get update && apt-get install -qq -y \ + python3-venv \ + sshpass \ + openssh-server \ + sendmail ADD ./delphiFacebook /facebook/delphiFacebook/ ADD ./static /facebook/static/ From 6e783c47b9c8f56a4e3fde45e80b93e22664253c Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Thu, 9 Sep 2021 12:29:46 -0400 Subject: [PATCH 037/133] Add ssmtp config - Add the ssmtp package and a simple config file --- facebook/Dockerfile | 3 ++- facebook/ssmtp.conf | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 facebook/ssmtp.conf diff --git a/facebook/Dockerfile b/facebook/Dockerfile index c17d0724d..d78599349 100644 --- a/facebook/Dockerfile +++ b/facebook/Dockerfile @@ -17,7 +17,7 @@ RUN apt-get update && apt-get install -qq -y \ python3-venv \ sshpass \ openssh-server \ - sendmail + ssmtp ADD ./delphiFacebook /facebook/delphiFacebook/ ADD ./static /facebook/static/ @@ -26,6 +26,7 @@ ADD ./run.R /facebook/run.R ADD ./monthly-files.R /facebook/monthly-files.R ADD ./contingency_tables.R /facebook/contingency_tables.R ADD ./contingency-combine.R /facebook/contingency-combine.R +ADD ./ssmtp.conf /etc/ssmtp/ssmtp.conf WORKDIR /facebook/ RUN make lib RUN make install diff --git a/facebook/ssmtp.conf b/facebook/ssmtp.conf new file mode 100644 index 000000000..4122d9b0e --- /dev/null +++ b/facebook/ssmtp.conf @@ -0,0 +1,21 @@ +# +# Config file for sSMTP sendmail +# +# The person who gets all mail for userids < 1000 +# Make this empty to disable rewriting. +root=postmaster + +# The place where the mail goes. The actual machine name is required no +# MX records are consulted. Commonly mailhosts are named mail.domain.com +mailhub=localhost + +# Where will the mail seem to come from? +#rewriteDomain= + +# The full hostname +hostname=delphi.cmu.edu + +# Are users allowed to set their own From: address? +# YES - Allow the user to specify their own From: address +# NO - Use the system generated From: address +#FromLineOverride=YES From 2f339680d9615d052219d35b558473c269aa1896 Mon Sep 17 00:00:00 2001 From: QX Teo <37101453+qx-teo@users.noreply.github.com> Date: Wed, 4 Aug 2021 15:25:30 -0400 Subject: [PATCH 038/133] Change geo_sig call Check with API if the signal is active before returning geo_signal combos, also updated tests to using actual signal/datasource names since we need validity for API. --- .../delphi_utils/validator/datafetcher.py | 40 +++++++++++++++++-- .../tests/validator/test_datafetcher.py | 29 +++++++++----- 2 files changed, 56 insertions(+), 13 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index 8c60e6ef5..d88400afe 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -8,6 +8,7 @@ import warnings import pandas as pd import numpy as np +from delphi_epidata import Epidata import covidcast from .errors import APIDataFetchError, ValidationFailure @@ -109,14 +110,47 @@ def get_geo_signal_combos(data_source): Cross references based on combinations reported available by COVIDcast metadata. """ + # Maps data_source name with what's in the API, lists used in case of multiple names + source_signal_mappings = { + 'chng': ['chng-cli', 'chng-covid'], + 'indicator-combination': ['indicator-combination-cases-deaths'], + 'quidel': ['quidel-covid-ag'], + 'safegraph': ['safegraph-weekly'] + } meta = covidcast.metadata() source_meta = meta[meta['data_source'] == data_source] # Need to convert np.records to tuples so they are hashable and can be used in sets and dicts. geo_signal_combos = list(map(tuple, source_meta[["geo_type", "signal"]].to_records(index=False))) - - return geo_signal_combos - + # Changing base URL to search for each signal + Epidata.BASE_URL = "https://api.covidcast.cmu.edu/epidata/covidcast/meta" + # Only add new geo_sig combos if status is active + new_geo_signal_combos = [] + # Use a seen dict to save on multiple calls: + # True/False indicate if status is active, "unknown" means we should check + geo_seen = dict() + for combo in geo_signal_combos: + if source_signal_mappings.get(data_source): + src_list = source_signal_mappings.get(data_source) + else: + src_list = [data_source] + for src in src_list: + geo = combo[1] + geo_status = geo_seen.get(geo, "unknown") + if geo_status is True: + new_geo_signal_combos.append(combo) + elif geo_status == "unknown": + epidata_signal = Epidata._request({'signal': f"{src}:{geo}"}) + # Not an active signal + if len(epidata_signal) == 0: + continue + active_status = (epidata_signal[0])["active"] + geo_seen[geo] = active_status + if active_status: + new_geo_signal_combos.append(combo) + # Change base URL back to original + Epidata.BASE_URL = "https://api.covidcast.cmu.edu/epidata/api.php" + return new_geo_signal_combos def fetch_api_reference(data_source, start_date, end_date, geo_type, signal_type): """ diff --git a/_delphi_utils_python/tests/validator/test_datafetcher.py b/_delphi_utils_python/tests/validator/test_datafetcher.py index 8d83f9a16..524b34e83 100644 --- a/_delphi_utils_python/tests/validator/test_datafetcher.py +++ b/_delphi_utils_python/tests/validator/test_datafetcher.py @@ -24,20 +24,29 @@ def test_make_date_filter(self): @mock.patch("covidcast.metadata") def test_get_geo_signal_combos(self, mock_metadata): """Test that the geo signal combos are correctly pulled from the covidcast metadata.""" - mock_metadata.return_value = pd.DataFrame({"data_source": ["a", "a", "a", - "b", "b", "b"], - "signal": ["w", "x", "x", - "y", "y", "z"], + # Need to use actual data_source and signal names since we reference the API + mock_metadata.return_value = pd.DataFrame({"data_source": ["chng", "chng", "chng", + "covid-act-now", + "covid-act-now", + "covid-act-now"], + "signal": ["smoothed_outpatient_cli", + "smoothed_outpatient_covid", + "smoothed_outpatient_covid", + "pcr_specimen_positivity_rate", + "pcr_specimen_positivity_rate", + "pcr_specimen_total_tests"], "geo_type": ["state", "state", "county", "hrr", "msa", "msa"] }) - assert set(get_geo_signal_combos("a")) == set([("state", "w"), - ("state", "x"), - ("county", "x")]) - assert set(get_geo_signal_combos("b")) == set([("hrr", "y"), - ("msa", "y"), - ("msa", "z")]) + assert set(get_geo_signal_combos("chng")) == set( + [("state", "smoothed_outpatient_cli"), + ("state", "smoothed_outpatient_covid"), + ("county", "smoothed_outpatient_covid")]) + assert set(get_geo_signal_combos("covid-act-now")) == set( + [("hrr", "pcr_specimen_positivity_rate"), + ("msa", "pcr_specimen_positivity_rate"), + ("msa", "pcr_specimen_total_tests")]) @mock.patch("covidcast.signal") def test_threaded_api_calls(self, mock_signal): From 06276830ded900685d94bd4ba9cd7690fbb6fe9d Mon Sep 17 00:00:00 2001 From: QX Teo <37101453+qx-teo@users.noreply.github.com> Date: Wed, 4 Aug 2021 15:44:29 -0400 Subject: [PATCH 039/133] Changing to using requests module Using requests module rather than client-side Epidata _requests() method --- .../delphi_utils/validator/datafetcher.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index d88400afe..5df4b3c86 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -3,12 +3,12 @@ import re import threading +import requests from os import listdir from os.path import isfile, join import warnings import pandas as pd import numpy as np -from delphi_epidata import Epidata import covidcast from .errors import APIDataFetchError, ValidationFailure @@ -122,8 +122,6 @@ def get_geo_signal_combos(data_source): # Need to convert np.records to tuples so they are hashable and can be used in sets and dicts. geo_signal_combos = list(map(tuple, source_meta[["geo_type", "signal"]].to_records(index=False))) - # Changing base URL to search for each signal - Epidata.BASE_URL = "https://api.covidcast.cmu.edu/epidata/covidcast/meta" # Only add new geo_sig combos if status is active new_geo_signal_combos = [] # Use a seen dict to save on multiple calls: @@ -140,16 +138,17 @@ def get_geo_signal_combos(data_source): if geo_status is True: new_geo_signal_combos.append(combo) elif geo_status == "unknown": - epidata_signal = Epidata._request({'signal': f"{src}:{geo}"}) + epidata_signal = requests.get( + "https://api.covidcast.cmu.edu/epidata/covidcast/meta", + params={'signal': f"{src}:{geo}"}) # Not an active signal - if len(epidata_signal) == 0: + active_status = [i['active'] for i in epidata_signal.json()] + if active_status == []: + geo_seen[geo] = False continue - active_status = (epidata_signal[0])["active"] - geo_seen[geo] = active_status - if active_status: + geo_seen[geo] = active_status[0] + if active_status[0] is True: new_geo_signal_combos.append(combo) - # Change base URL back to original - Epidata.BASE_URL = "https://api.covidcast.cmu.edu/epidata/api.php" return new_geo_signal_combos def fetch_api_reference(data_source, start_date, end_date, geo_type, signal_type): From a8ef938c55eee3d60ce94fcb46cd39a7e98f4589 Mon Sep 17 00:00:00 2001 From: QX Teo <37101453+qx-teo@users.noreply.github.com> Date: Mon, 9 Aug 2021 17:35:15 -0400 Subject: [PATCH 040/133] Fix imports --- _delphi_utils_python/delphi_utils/validator/datafetcher.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index 5df4b3c86..e80c6eb90 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -3,10 +3,10 @@ import re import threading -import requests from os import listdir from os.path import isfile, join import warnings +import requests import pandas as pd import numpy as np From 7e8dff678704f400174554597b2e38de9432e443 Mon Sep 17 00:00:00 2001 From: QX Teo <37101453+qx-teo@users.noreply.github.com> Date: Mon, 9 Aug 2021 18:40:09 -0400 Subject: [PATCH 041/133] Fix geo_combos Using nested list comprehensions since 'active' has been placed in a different subheading Using unique (geo_src) key for indicators with multiple db_source names --- .../delphi_utils/validator/datafetcher.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index e80c6eb90..c6c65470b 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -134,7 +134,7 @@ def get_geo_signal_combos(data_source): src_list = [data_source] for src in src_list: geo = combo[1] - geo_status = geo_seen.get(geo, "unknown") + geo_status = geo_seen.get((geo, src), "unknown") if geo_status is True: new_geo_signal_combos.append(combo) elif geo_status == "unknown": @@ -142,11 +142,12 @@ def get_geo_signal_combos(data_source): "https://api.covidcast.cmu.edu/epidata/covidcast/meta", params={'signal': f"{src}:{geo}"}) # Not an active signal - active_status = [i['active'] for i in epidata_signal.json()] + active_status = [val['active'] for i in epidata_signal.json() + for val in i['signals']] if active_status == []: - geo_seen[geo] = False + geo_seen[(geo, src)] = False continue - geo_seen[geo] = active_status[0] + geo_seen[(geo, src)] = active_status[0] if active_status[0] is True: new_geo_signal_combos.append(combo) return new_geo_signal_combos From a0366c4d3596e9a2f158bc0bb8857f9316e2e66a Mon Sep 17 00:00:00 2001 From: QX Teo <37101453+qx-teo@users.noreply.github.com> Date: Mon, 9 Aug 2021 23:44:57 -0400 Subject: [PATCH 042/133] Include indicator name Include indicator name in dict of seen signals to avoid overlaps --- _delphi_utils_python/delphi_utils/validator/datafetcher.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index c6c65470b..65b51d8e1 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -134,7 +134,7 @@ def get_geo_signal_combos(data_source): src_list = [data_source] for src in src_list: geo = combo[1] - geo_status = geo_seen.get((geo, src), "unknown") + geo_status = geo_seen.get((combo[0], geo, src), "unknown") if geo_status is True: new_geo_signal_combos.append(combo) elif geo_status == "unknown": @@ -145,9 +145,9 @@ def get_geo_signal_combos(data_source): active_status = [val['active'] for i in epidata_signal.json() for val in i['signals']] if active_status == []: - geo_seen[(geo, src)] = False + geo_seen[(combo[0], geo, src)] = False continue - geo_seen[(geo, src)] = active_status[0] + geo_seen[(combo[0], geo, src)] = active_status[0] if active_status[0] is True: new_geo_signal_combos.append(combo) return new_geo_signal_combos From 8fbf23b194e2a87106dbcc13e5ead3b3696aabeb Mon Sep 17 00:00:00 2001 From: QX Teo <37101453+qx-teo@users.noreply.github.com> Date: Tue, 31 Aug 2021 12:52:48 -0400 Subject: [PATCH 043/133] Improve clarity Renamed dict to sig_combo_seen, since we use unique (signal, source) pairs as keys --- .../delphi_utils/validator/datafetcher.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index 65b51d8e1..75a726af5 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -126,28 +126,28 @@ def get_geo_signal_combos(data_source): new_geo_signal_combos = [] # Use a seen dict to save on multiple calls: # True/False indicate if status is active, "unknown" means we should check - geo_seen = dict() + sig_combo_seen = dict() for combo in geo_signal_combos: if source_signal_mappings.get(data_source): src_list = source_signal_mappings.get(data_source) else: src_list = [data_source] for src in src_list: - geo = combo[1] - geo_status = geo_seen.get((combo[0], geo, src), "unknown") + sig = combo[1] + geo_status = sig_combo_seen.get(sig, src), "unknown") if geo_status is True: new_geo_signal_combos.append(combo) elif geo_status == "unknown": epidata_signal = requests.get( "https://api.covidcast.cmu.edu/epidata/covidcast/meta", - params={'signal': f"{src}:{geo}"}) + params={'signal': f"{src}:{sig}"}) # Not an active signal active_status = [val['active'] for i in epidata_signal.json() for val in i['signals']] if active_status == []: - geo_seen[(combo[0], geo, src)] = False + sig_combo_seen[(sig, src)] = False continue - geo_seen[(combo[0], geo, src)] = active_status[0] + sig_combo_seen[(sig, src)] = active_status[0] if active_status[0] is True: new_geo_signal_combos.append(combo) return new_geo_signal_combos From 80c67d8cc376fabaf966e14179aded2701037b0e Mon Sep 17 00:00:00 2001 From: QX Teo <37101453+qx-teo@users.noreply.github.com> Date: Tue, 31 Aug 2021 14:42:44 -0400 Subject: [PATCH 044/133] Fix syntax --- _delphi_utils_python/delphi_utils/validator/datafetcher.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index 75a726af5..5a0cd67d6 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -134,7 +134,7 @@ def get_geo_signal_combos(data_source): src_list = [data_source] for src in src_list: sig = combo[1] - geo_status = sig_combo_seen.get(sig, src), "unknown") + geo_status = sig_combo_seen.get((sig, src), "unknown") if geo_status is True: new_geo_signal_combos.append(combo) elif geo_status == "unknown": From db508d25645a41456f874880e5f514c406e1e233 Mon Sep 17 00:00:00 2001 From: QX Teo <37101453+qx-teo@users.noreply.github.com> Date: Fri, 20 Aug 2021 17:55:21 -0400 Subject: [PATCH 045/133] Update README Fixed bug about delphi_validator module name - since validator has been shifted under utils Added new params(dry_run) Updated new params (min/max expected lag, end date, ref window size) Removed unnecessary pip install since validator is now housed under delphi_utils --- .../delphi_utils/validator/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/validator/README.md b/_delphi_utils_python/delphi_utils/validator/README.md index 69fd54c97..9982bd36e 100644 --- a/_delphi_utils_python/delphi_utils/validator/README.md +++ b/_delphi_utils_python/delphi_utils/validator/README.md @@ -26,7 +26,6 @@ python -m venv env source env/bin/activate pip install ../_delphi_utils_python/. pip install . -pip install ../validator ``` To execute the module and validate source data (by default, in `receiving`), run the indicator to generate data files, then run @@ -34,7 +33,7 @@ the validator, as follows: ``` env/bin/python -m delphi_INDICATORNAME -env/bin/python -m delphi_validator +env/bin/python -m delphi_utils.validator ``` Once you are finished with the code, you can deactivate the virtual environment @@ -53,7 +52,10 @@ Please update the follow settings: * `common`: global validation settings * `data_source`: should match the [formatting](https://cmu-delphi.github.io/delphi-epidata/api/covidcast_signals.html) as used in COVIDcast API calls - * `end_date`: specifies the last date to be checked; this can be specified as `YYYY-MM-DD`, `today`, or `today-{num}`. The latter is interpretted as `num` days before the current date. + * `dry_run`: boolean; `true` prevent system exit with error and ensures that the success() method of the ValidationReport always returns true. + * `end_date`: specifies the last date to be checked; this can be specified as `YYYY-MM-DD`, `today`, `today-{num}`, or `sunday+{num}`. `today-num` is interpretted as `num` days before the current date. `sunday+{num}` sets the end date as the most recent day of the week prior to today (as specified by the user). The numeric input represents the day of the week (`sunday+1` denotes Monday, and so on, with 0 or 7 both indicating Sunday). Defaults to the global minimum of `min_expected_lag` days behind today. + * `max_expected_lag` (default: 10 for all unspecified signals): dictionary of signal name-string pairs specifying the maximum number of days of expected lag (time between event occurrence and when data about that event was published) for that signal. Values are either numeric or `sunday+{num},{num}`. `sunday+{num},{num}` is used for indicators that update data on a regular weekly basis. The first number denotes the day of the week (with Monday = 1 and so on, and Sunday taking either 0 or 7). The second number denotes the expected lag for the data upon upload date. In other words, if the signal updates weekly on Wednesday's for the past week's data up til Sunday, the correct parameter would be something like `sunday+3,3`. + * `min_expected_lag` (default: 1 for all unspecified signals): dictionary of signal name-string pairs specifying the minimum number of days of expected lag (time between event occurrence and when data about that event was published) for that signal. See `max_expected_lag` for further details. * `span_length`: specifies the number of days before the `end_date` to check. `span_length` should be long enough to contain all recent source data that is still in the process of being updated (i.e. in the backfill period), for example, if the data source of interest has a 2-week lag before all reports are in for a given date, `span_length` should be 14 days * `suppressed_errors`: list of objects specifying errors that have been manually verified as false positives or acceptable deviations from expected. These errors can be specified with the following variables, where omitted values are interpreted as a wildcard, i.e., not specifying a date applies to all dates: * `check_name`: name of the check, as specified in the validation output @@ -67,9 +69,8 @@ Please update the follow settings: * `missing_sample_size_allowed` (default: False): whether signals with missing sample sizes are valid * `additional_valid_geo_values` (default: `{}`): map of geo type names to lists of geo values that are not recorded in the GeoMapper but are nonetheless valid for this indicator * `dynamic`: settings for validations that require comparison with external COVIDcast API data - * `ref_window_size` (default: 7): number of days over which to look back for comparison + * `ref_window_size` (default: 14): number of days over which to look back for comparison * `smoothed_signals`: list of the names of the signals that are smoothed (e.g. 7-day average) - * `expected_lag` (default: 1 for all unspecified signals): dictionary of signal name-int pairs specifying the number of days of expected lag (time between event occurrence and when data about that event was published) for that signal ## Testing the code @@ -80,14 +81,13 @@ To test the code, please create a new virtual environment in the main module dir python -m venv env source env/bin/activate pip install ../_delphi_utils_python/. -pip install . ``` To do a static test of the code style, it is recommended to run **pylint** on the module. To do this, run the following from the main module directory: ``` -env/bin/pylint delphi_validator +env/bin/pylint delphi_utils.validator ``` The most aggressive checks are turned off; only relatively important issues @@ -96,7 +96,7 @@ should be raised and they should be manually checked (or better, fixed). Unit tests are also included in the module. To execute these, run the following command from this directory: ``` -(cd tests && ../env/bin/pytest --cov=delphi_validator --cov-report=term-missing) +(cd tests && ../env/bin/pytest --cov=delphi_utils.validator --cov-report=term-missing) ``` The output will show the number of unit tests that passed and failed, along with the percentage of code covered by the tests. None of the tests should fail and the code lines that are not covered by unit tests should be small and should not include critical sub-routines. From d8c0ec527ab45f7b1457b19023e85cce515b1bd3 Mon Sep 17 00:00:00 2001 From: QX Teo <37101453+qx-teo@users.noreply.github.com> Date: Fri, 20 Aug 2021 18:19:01 -0400 Subject: [PATCH 046/133] Update PLANS.md --- _delphi_utils_python/delphi_utils/validator/PLANS.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/validator/PLANS.md b/_delphi_utils_python/delphi_utils/validator/PLANS.md index d24adb22f..df50233c9 100644 --- a/_delphi_utils_python/delphi_utils/validator/PLANS.md +++ b/_delphi_utils_python/delphi_utils/validator/PLANS.md @@ -30,11 +30,12 @@ ## Current features -* Errors and warnings are summarized in class attribute and printed on exit -* If any non-suppressed errors are raised, the validation process exits with non-zero status +* Errors and warnings are summarized in class attribute and stored in log files (file path to be specified in params) +* If any non-suppressed errors are raised and dry-run is set to False, the validation process exits with non-zero status * Various check settings are controllable via indicator-specific params.json files * User can manually disable specific checks for specific datasets using a field in the params.json file * User can enable test mode (checks only a small number of data files) using a field in the params.json file +* User can enable dry-run mode (prevents system exit with error and ensures that success() method returns True) using a field in the params.json file ## Checks + features wishlist, and problems to think about @@ -45,9 +46,6 @@ ### Larger issues -* Set up validator to use Sir-complains-a-lot alerting functionality on a signal-by-signal basis (should send alert output as a slack message and "@" a set person), as a stop-gap before the logging server is ready - * This is [how Sir-CAL works](https://github.com/benjaminysmith/covidcast-indicators/blob/main/sir_complainsalot/delphi_sir_complainsalot/run.py) - * [Example output](https://delphi-org.slack.com/archives/C01E81A3YKF/p1605793508000100) * Expand framework to support nchs_mortality, which is provided on a weekly basis and has some differences from the daily data. E.g. filenames use a different format ("weekly_YYYYWW_geotype_signalname.csv") * Make backtesting framework so new checks can be run individually on historical indicator data to tune false positives, output verbosity, understand frequency of error raising, etc. Should pull data from API the first time and save locally in `cache` dir. * Add DETAILS.md doc with detailed descriptions of what each check does and how. Will be especially important for statistical/anomaly detection checks. @@ -58,6 +56,7 @@ * Nicer formatting for error “report”. * Potentially set `__print__()` method in ValidationError class * E.g. if a single type of error is raised for many different datasets, summarize all error messages into a single message? But it still has to be clear how to suppress each individually + * Consider adding summary counts of each type of error, rather than just a combined number * Check for erratic data sources that wrongly report all zeroes * E.g. the error with the Wisconsin data for the 10/26 forecasts * Wary of a purely static check for this @@ -65,9 +64,6 @@ * This test is partially captured by checking avgs in source vs reference data, unless erroneous zeroes continue for more than a week * Also partially captured by outlier checking, depending on `size_cut` setting. If zeroes aren't outliers, then it's hard to say that they're erroneous at all. * Use known erroneous/anomalous days of source data to tune static thresholds and test behavior -* If can't get data from API, do we want to use substitute data for the comparative checks instead? - * Currently, any API fetch problems just doesn't do comparative checks at all. - * E.g. most recent successful API pull -- might end up being a couple weeks older * Improve performance and reduce runtime (no particular goal, just avoid being painfully slow!) * Profiling (iterate) * Save intermediate files? From 4d9d214505df12ea5a575ff94b9eda2c1572485d Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 31 Aug 2021 17:28:01 -0400 Subject: [PATCH 047/133] remove more addressed issues --- .../delphi_utils/validator/PLANS.md | 31 ++++++++----------- .../delphi_utils/validator/README.md | 5 ++- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/validator/PLANS.md b/_delphi_utils_python/delphi_utils/validator/PLANS.md index df50233c9..721e8db01 100644 --- a/_delphi_utils_python/delphi_utils/validator/PLANS.md +++ b/_delphi_utils_python/delphi_utils/validator/PLANS.md @@ -12,7 +12,6 @@ * Negative ‘val’ values * Out-of-range ‘val’ values (>0 for all signals, <=100 for percents, <=100 000 for proportions) * Missing ‘se’ values -* Appropriate ‘se’ values, within a calculated reasonable range * Stderr != 0 * If signal and stderr both = 0 (seen in Quidel data due to lack of Jeffreys correction, [issue 255](https://github.com/cmu-delphi/covidcast-indicators/issues/255#issuecomment-692196541)) * Missing ‘sample_size’ values @@ -37,6 +36,7 @@ * User can enable test mode (checks only a small number of data files) using a field in the params.json file * User can enable dry-run mode (prevents system exit with error and ensures that success() method returns True) using a field in the params.json file + ## Checks + features wishlist, and problems to think about ### Starter/small issues @@ -49,29 +49,24 @@ * Expand framework to support nchs_mortality, which is provided on a weekly basis and has some differences from the daily data. E.g. filenames use a different format ("weekly_YYYYWW_geotype_signalname.csv") * Make backtesting framework so new checks can be run individually on historical indicator data to tune false positives, output verbosity, understand frequency of error raising, etc. Should pull data from API the first time and save locally in `cache` dir. * Add DETAILS.md doc with detailed descriptions of what each check does and how. Will be especially important for statistical/anomaly detection checks. -* Improve errors and error report - * Check if [errors raised from validating all signals](https://docs.google.com/spreadsheets/d/1_aRBDrNeaI-3ZwuvkRNSZuZ2wfHJk6Bxj35Ol_XZ9yQ/edit#gid=1226266834) are correct, not false positives, not overly verbose or repetitive - * Easier suppression of many errors at once - * Maybe store errors as dict of dicts. Keys could be check strings (e.g. "check_bad_se"), then next layer geo type, etc - * Nicer formatting for error “report”. - * Potentially set `__print__()` method in ValidationError class - * E.g. if a single type of error is raised for many different datasets, summarize all error messages into a single message? But it still has to be clear how to suppress each individually - * Consider adding summary counts of each type of error, rather than just a combined number -* Check for erratic data sources that wrongly report all zeroes - * E.g. the error with the Wisconsin data for the 10/26 forecasts +* Easier-to-read error report + * Potentially set `__print__()` method in ValidationError class + * E.g. if a single type of error is raised for many different datasets, summarize all error messages into a single message? But it still has to be clear how to suppress each individually + * Consider adding summary counts of each type of error, rather than just a combined number +* Check for data sources that wrongly report all zeroes + * E.g. the error with the Wisconsin data for the 10/26/2020 forecasts * Wary of a purely static check for this - * Are there any geo regions where this might cause false positives? E.g. small counties or MSAs, certain signals (deaths, since it's << cases) - * This test is partially captured by checking avgs in source vs reference data, unless erroneous zeroes continue for more than a week - * Also partially captured by outlier checking, depending on `size_cut` setting. If zeroes aren't outliers, then it's hard to say that they're erroneous at all. -* Use known erroneous/anomalous days of source data to tune static thresholds and test behavior -* Improve performance and reduce runtime (no particular goal, just avoid being painfully slow!) + * Regions with small populations (e.g. small counties or MSAs) and rare signals (e.g. deaths, since it's << cases) likely to cause false positives + * This test is captured by `check_avg_val_vs_reference`, as long as erroneous zeroes occur for less than the reference period (1-2 weeks) + * Also partially captured by `check_positive_negative_spikes`, depending on `size_cut` setting. However, `check_positive_negative_spikes` has limited applicability and only applies to incident cases and deaths signals. +* Instead of failing validation for a single check error, compare rate of check failures to historical rate? Requires caching and updating historical failure rates by signal, data source, and geo region. Unclear if worthwhile. +* Improve performance and reduce runtime (no particular goal, just handle low-hanging fruit and avoid being painfully slow!) * Profiling (iterate) * Save intermediate files? * Currently a bottleneck at "individual file checks" section. Parallelize? * Make `all_frames` MultiIndex-ed by geo type and signal name? Make a dict of data indexed by geo type and signal name? May improve performance or may just make access more readable. -* Ensure validator runs on signals that require AWS credentials (iterate) -### Longer-term issues +### Longer-term features * Data correctness and consistency over longer time periods (weeks to months). Compare data against long-ago (3 months?) API data for changes in trends. * Long-term trends and correlations between time series. Currently, checks only look at a data window of a few days diff --git a/_delphi_utils_python/delphi_utils/validator/README.md b/_delphi_utils_python/delphi_utils/validator/README.md index 9982bd36e..0c99eff4a 100644 --- a/_delphi_utils_python/delphi_utils/validator/README.md +++ b/_delphi_utils_python/delphi_utils/validator/README.md @@ -15,9 +15,8 @@ The validator is run by executing the Python module contained in this directory from the main directory of the indicator of interest. The safest way to do this is to create a virtual environment, -install the common DELPHI tools, install the indicator module and its -dependencies, and then install the validator module and its -dependencies to the virtual environment. +and install the common DELPHI tools, including the validator, and the +validator module and its dependencies to the virtual environment. To do this, navigate to the main directory of the indicator of interest and run the following code: From a1b443bce96afe9ec4beee24bfae5c6cce5fca6c Mon Sep 17 00:00:00 2001 From: QX Teo <37101453+qx-teo@users.noreply.github.com> Date: Tue, 31 Aug 2021 20:16:20 -0400 Subject: [PATCH 048/133] Update _delphi_utils_python/delphi_utils/validator/README.md fix spelling Co-authored-by: nmdefries <42820733+nmdefries@users.noreply.github.com> --- _delphi_utils_python/delphi_utils/validator/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_delphi_utils_python/delphi_utils/validator/README.md b/_delphi_utils_python/delphi_utils/validator/README.md index 0c99eff4a..0dd5df1c7 100644 --- a/_delphi_utils_python/delphi_utils/validator/README.md +++ b/_delphi_utils_python/delphi_utils/validator/README.md @@ -52,7 +52,7 @@ Please update the follow settings: * `common`: global validation settings * `data_source`: should match the [formatting](https://cmu-delphi.github.io/delphi-epidata/api/covidcast_signals.html) as used in COVIDcast API calls * `dry_run`: boolean; `true` prevent system exit with error and ensures that the success() method of the ValidationReport always returns true. - * `end_date`: specifies the last date to be checked; this can be specified as `YYYY-MM-DD`, `today`, `today-{num}`, or `sunday+{num}`. `today-num` is interpretted as `num` days before the current date. `sunday+{num}` sets the end date as the most recent day of the week prior to today (as specified by the user). The numeric input represents the day of the week (`sunday+1` denotes Monday, and so on, with 0 or 7 both indicating Sunday). Defaults to the global minimum of `min_expected_lag` days behind today. + * `end_date`: specifies the last date to be checked; this can be specified as `YYYY-MM-DD`, `today`, `today-{num}`, or `sunday+{num}`. `today-num` is interpreted as `num` days before the current date. `sunday+{num}` sets the end date as the most recent day of the week prior to today (as specified by the user). The numeric input represents the day of the week (`sunday+1` denotes Monday, and so on, with 0 or 7 both indicating Sunday). Defaults to the global minimum of `min_expected_lag` days behind today. * `max_expected_lag` (default: 10 for all unspecified signals): dictionary of signal name-string pairs specifying the maximum number of days of expected lag (time between event occurrence and when data about that event was published) for that signal. Values are either numeric or `sunday+{num},{num}`. `sunday+{num},{num}` is used for indicators that update data on a regular weekly basis. The first number denotes the day of the week (with Monday = 1 and so on, and Sunday taking either 0 or 7). The second number denotes the expected lag for the data upon upload date. In other words, if the signal updates weekly on Wednesday's for the past week's data up til Sunday, the correct parameter would be something like `sunday+3,3`. * `min_expected_lag` (default: 1 for all unspecified signals): dictionary of signal name-string pairs specifying the minimum number of days of expected lag (time between event occurrence and when data about that event was published) for that signal. See `max_expected_lag` for further details. * `span_length`: specifies the number of days before the `end_date` to check. `span_length` should be long enough to contain all recent source data that is still in the process of being updated (i.e. in the backfill period), for example, if the data source of interest has a 2-week lag before all reports are in for a given date, `span_length` should be 14 days From 04bf3f9aaca74614c8357975a0611e1ac6dec5cb Mon Sep 17 00:00:00 2001 From: QX Teo <37101453+qx-teo@users.noreply.github.com> Date: Tue, 31 Aug 2021 21:48:22 -0400 Subject: [PATCH 049/133] Update README.md --- _delphi_utils_python/delphi_utils/validator/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/validator/README.md b/_delphi_utils_python/delphi_utils/validator/README.md index 0dd5df1c7..37c41ad11 100644 --- a/_delphi_utils_python/delphi_utils/validator/README.md +++ b/_delphi_utils_python/delphi_utils/validator/README.md @@ -53,8 +53,8 @@ Please update the follow settings: * `data_source`: should match the [formatting](https://cmu-delphi.github.io/delphi-epidata/api/covidcast_signals.html) as used in COVIDcast API calls * `dry_run`: boolean; `true` prevent system exit with error and ensures that the success() method of the ValidationReport always returns true. * `end_date`: specifies the last date to be checked; this can be specified as `YYYY-MM-DD`, `today`, `today-{num}`, or `sunday+{num}`. `today-num` is interpreted as `num` days before the current date. `sunday+{num}` sets the end date as the most recent day of the week prior to today (as specified by the user). The numeric input represents the day of the week (`sunday+1` denotes Monday, and so on, with 0 or 7 both indicating Sunday). Defaults to the global minimum of `min_expected_lag` days behind today. - * `max_expected_lag` (default: 10 for all unspecified signals): dictionary of signal name-string pairs specifying the maximum number of days of expected lag (time between event occurrence and when data about that event was published) for that signal. Values are either numeric or `sunday+{num},{num}`. `sunday+{num},{num}` is used for indicators that update data on a regular weekly basis. The first number denotes the day of the week (with Monday = 1 and so on, and Sunday taking either 0 or 7). The second number denotes the expected lag for the data upon upload date. In other words, if the signal updates weekly on Wednesday's for the past week's data up til Sunday, the correct parameter would be something like `sunday+3,3`. - * `min_expected_lag` (default: 1 for all unspecified signals): dictionary of signal name-string pairs specifying the minimum number of days of expected lag (time between event occurrence and when data about that event was published) for that signal. See `max_expected_lag` for further details. + * `max_expected_lag` (default: 10 for all unspecified signals): dictionary of signal name-string pairs specifying the maximum number of days of expected lag (time between event occurrence and when data about that event was published) for that signal. Default values can also be set using 'all' as the key: individually setting keys on top of this will override the default. Values are either numeric or `sunday+{num},{num}`. `sunday+{num},{num}` is used for indicators that update data on a regular weekly basis. The first number denotes the day of the week (with Monday = 1 and so on, and Sunday taking either 0 or 7). The second number denotes the expected lag for the data upon upload date. In other words, if the signal updates weekly on Wednesday's for the past week's data up til Sunday, the correct parameter would be something like `sunday+3,3`. + * `min_expected_lag` (default: 1 for all unspecified signals): dictionary of signal name-string pairs specifying the minimum number of days of expected lag (time between event occurrence and when data about that event was published) for that signal. Default values can be changed by using the 'all' key. See `max_expected_lag` for further details. * `span_length`: specifies the number of days before the `end_date` to check. `span_length` should be long enough to contain all recent source data that is still in the process of being updated (i.e. in the backfill period), for example, if the data source of interest has a 2-week lag before all reports are in for a given date, `span_length` should be 14 days * `suppressed_errors`: list of objects specifying errors that have been manually verified as false positives or acceptable deviations from expected. These errors can be specified with the following variables, where omitted values are interpreted as a wildcard, i.e., not specifying a date applies to all dates: * `check_name`: name of the check, as specified in the validation output From b3c9325ea468d9a7730fffa097c9b8fbe3ae3523 Mon Sep 17 00:00:00 2001 From: QX Teo <37101453+qx-teo@users.noreply.github.com> Date: Tue, 31 Aug 2021 21:56:45 -0400 Subject: [PATCH 050/133] Update PLANS.md --- _delphi_utils_python/delphi_utils/validator/PLANS.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/_delphi_utils_python/delphi_utils/validator/PLANS.md b/_delphi_utils_python/delphi_utils/validator/PLANS.md index 721e8db01..d7ca0c263 100644 --- a/_delphi_utils_python/delphi_utils/validator/PLANS.md +++ b/_delphi_utils_python/delphi_utils/validator/PLANS.md @@ -65,6 +65,12 @@ * Save intermediate files? * Currently a bottleneck at "individual file checks" section. Parallelize? * Make `all_frames` MultiIndex-ed by geo type and signal name? Make a dict of data indexed by geo type and signal name? May improve performance or may just make access more readable. +* Revisit tuning of thresholds for outlier-related checks (`check_positive_negative_spikes`, `check_avg_val_vs_reference`) or parameters set in params.json.template + * Currently using manually tuned z-score thresholds using 1-2 months of data (June-July 2021), but signal behavior may change + * Certain signals (e.g. locally monotonic signals, sparse signals) exhibit different behavior and may require signal-specific paramters for checks such as z-scores. + * Use caching to store params and update these dynamically using recent data? +* Create different error levels for checks beyond warning and critical: useful because certain checks clearly indicate some form of data corruption (e.g. `check_missing_date_files` identifying missing data), while other checks just report abnormal behavior that may be able to be explained. +* Compare current validator model against known instances of data issues to evaluate performance (may be difficult if data corrections are issued) ### Longer-term features From ec51e1ae9786894b191f381bb402113896a697c7 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 26 Aug 2021 16:38:07 -0400 Subject: [PATCH 051/133] remove us territories from valid zips list --- facebook/delphiFacebook/R/geo.R | 5 +++++ facebook/delphiFacebook/man/produce_zip_metadata.Rd | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/facebook/delphiFacebook/R/geo.R b/facebook/delphiFacebook/R/geo.R index 8657d5e88..e96e17407 100644 --- a/facebook/delphiFacebook/R/geo.R +++ b/facebook/delphiFacebook/R/geo.R @@ -1,9 +1,12 @@ #' Returns metadata about each U.S. Zip Code +#' +#' Drops information about US territories, which FB does not provide weights for. #' #' @param static_dir local directory containing the file "02_20_uszips.csv" #' #' @importFrom stringi stri_trans_tolower #' @importFrom readr read_csv cols +#' @importFrom dplyr filter #' @export produce_zip_metadata <- function(static_dir) { @@ -19,6 +22,8 @@ produce_zip_metadata <- function(static_dir) zip_metadata$fips <- sprintf("%05d", zip_metadata$fips) zip_metadata$zip5 <- sprintf("%05d", zip_metadata$zip) zip_metadata$keep_in_agg <- (zip_metadata$population > 100) + + zip_metadata <- filter(zip_metadata, !(state_id %in% c("as", "gu", "pr", "vi", "mp"))) return(zip_metadata) } diff --git a/facebook/delphiFacebook/man/produce_zip_metadata.Rd b/facebook/delphiFacebook/man/produce_zip_metadata.Rd index dab256989..b770a372f 100644 --- a/facebook/delphiFacebook/man/produce_zip_metadata.Rd +++ b/facebook/delphiFacebook/man/produce_zip_metadata.Rd @@ -10,5 +10,5 @@ produce_zip_metadata(static_dir) \item{static_dir}{local directory containing the file "02_20_uszips.csv"} } \description{ -Returns metadata about each U.S. Zip Code +Drops information about US territories, which FB does not provide weights for. } From c10adcc9cdb31012ce0e3dbc9d71b801840df1bb Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 27 Aug 2021 16:10:20 -0400 Subject: [PATCH 052/133] fix tests --- .../unit-tests/testthat/test-contingency-utils.R | 2 +- facebook/delphiFacebook/unit-tests/testthat/test-geo.R | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/facebook/delphiFacebook/unit-tests/testthat/test-contingency-utils.R b/facebook/delphiFacebook/unit-tests/testthat/test-contingency-utils.R index 5738cce71..6e7c9f27d 100644 --- a/facebook/delphiFacebook/unit-tests/testthat/test-contingency-utils.R +++ b/facebook/delphiFacebook/unit-tests/testthat/test-contingency-utils.R @@ -101,7 +101,7 @@ test_that("testing get_sparse_filenames command", { create_dir_not_exist(tdir) for (filename in files) { - write_csv(data.frame(), path = file.path(tdir, filename)) + write_csv(data.frame(), file.path(tdir, filename)) } params <- list( diff --git a/facebook/delphiFacebook/unit-tests/testthat/test-geo.R b/facebook/delphiFacebook/unit-tests/testthat/test-geo.R index 49a2b2f42..30e477acb 100644 --- a/facebook/delphiFacebook/unit-tests/testthat/test-geo.R +++ b/facebook/delphiFacebook/unit-tests/testthat/test-geo.R @@ -5,11 +5,15 @@ context("Testing geographic crosswalk file creation") static_dir <- "static" test_that("testing zip codes metadata", { - + # Number of Puerto Rico zip codes to ignore; other territories not included in zips file. + n_pr <- 131L + zip_metadata <- produce_zip_metadata(static_dir) + expect_equal(class(zip_metadata$zip5), "character") expect_true(all(nchar(zip_metadata$zip5) == 5L)) - expect_equal(nrow(zip_metadata), 33099L) + expect_equal(nrow(zip_metadata), 33099L - n_pr) + expect_equal(length(unique(zip_metadata$state_id)), 51) # 50 states + DC expect_equal(zip_metadata$keep_in_agg, zip_metadata$population > 100) }) From c450e3b69feac3b060f7b6ae243ca12d757bedbb Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 18 Aug 2021 13:24:32 -0400 Subject: [PATCH 053/133] stop supporting non-default aggs; revert #977 --- facebook/delphiFacebook/R/contingency_run.R | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_run.R b/facebook/delphiFacebook/R/contingency_run.R index 512a26829..86cb3c26e 100644 --- a/facebook/delphiFacebook/R/contingency_run.R +++ b/facebook/delphiFacebook/R/contingency_run.R @@ -14,21 +14,6 @@ run_contingency_tables <- function(params) { warning(debug_msg) } - if ( !is.null(params$aggs_in) ) { - if ( !file.exists(params$aggs_in) ) { - stop("requested aggregate-setting file does not exist") - } - - # Run non-default aggregates. File should create an object called `aggs`. - source(params$aggs_in) - - if ( !exists("aggs") || !inherits(aggs, "data.frame") ) { - stop("external aggregate-setting file must create a dataframe `aggs`") - } - } else { - aggs <- get_aggs() - } - ## Set default number of cores for mclapply to the total available number, ## because we are greedy and this will typically run on a server. if (params$parallel) { @@ -43,6 +28,8 @@ run_contingency_tables <- function(params) { } } + aggs <- get_aggs() + if (params$aggregate_range == "week") { run_contingency_tables_many_periods(params, aggs$week) } else if (params$aggregate_range == "month") { From 85dd31f1bdced8eca9941b237a7e649c9e952a8e Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 18 Aug 2021 13:50:26 -0400 Subject: [PATCH 054/133] simplify aggregate range selection; drop support for 'both' --- facebook/delphiFacebook/R/contingency_run.R | 27 ++++++++------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_run.R b/facebook/delphiFacebook/R/contingency_run.R index 86cb3c26e..4bf5af8a6 100644 --- a/facebook/delphiFacebook/R/contingency_run.R +++ b/facebook/delphiFacebook/R/contingency_run.R @@ -30,20 +30,12 @@ run_contingency_tables <- function(params) { aggs <- get_aggs() - if (params$aggregate_range == "week") { - run_contingency_tables_many_periods(params, aggs$week) - } else if (params$aggregate_range == "month") { - run_contingency_tables_many_periods(params, aggs$month) - } else if (params$aggregate_range == "both") { - params$aggregate_range <- "week" - run_contingency_tables_many_periods(params, aggs$week) - - params$aggregate_range <- "month" - run_contingency_tables_many_periods(params, aggs$month) - } else { + if ( length(params[["aggregate_range"]]) != 1 || !(params$aggregate_range %in% c("week", "month")) ) { stop(paste0("aggregate_range setting must be provided in params and be one", - " of 'week', 'month', or 'both'")) + " of 'week' or 'month'")) } + + run_contingency_tables_many_periods(params, aggs[[params$aggregate_range]]) } @@ -69,17 +61,18 @@ run_contingency_tables_many_periods <- function(params, aggregations) { if (!is.null(params$n_periods)) { msg_plain(paste0("Producing CSVs for ", params$n_periods, " time periods")) - + + params$end_date <- ifelse( + is.null(params$end_date), as.character(Sys.Date()), params$end_date + ) + + # Make list of dates to aggregate over. if (params$aggregate_range == "month") { period_step <- months(1) } else { period_step <- days(7) } - params$end_date <- ifelse( - is.null(params$end_date), as.character(Sys.Date()), params$end_date - ) - # Make list of dates to aggregate over. end_dates <- as.character(sort( ymd(params$end_date) - period_step * seq(0, params$n_periods - 1) )) From 643bef9a5ef8ed3ccfc2fccbd17864a89bf5497c Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 18 Aug 2021 13:57:59 -0400 Subject: [PATCH 055/133] remove mc_ agg processing --- facebook/delphiFacebook/R/contingency_aggregate.R | 9 --------- 1 file changed, 9 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_aggregate.R b/facebook/delphiFacebook/R/contingency_aggregate.R index d58485069..1e3b76ede 100644 --- a/facebook/delphiFacebook/R/contingency_aggregate.R +++ b/facebook/delphiFacebook/R/contingency_aggregate.R @@ -151,15 +151,6 @@ post_process_aggs <- function(df, aggregations, cw_list) { } aggregations$geo_level[agg_ind] <- geo_level - - # Multiple choice metrics should also be included in the group_by vars - if (startsWith(aggregations$metric[agg_ind], "mc_")) { - if ( !(aggregations$metric[agg_ind] %in% - aggregations$group_by[agg_ind][[1]]) ) { - aggregations$group_by[agg_ind][[1]] <- - c(aggregations$group_by[agg_ind][[1]], aggregations$metric[agg_ind]) - } - } } # Remove aggregations using unavailable variables. From 1b1bc5e904b46c946cdc11bd863c36b1eb4e1a31 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 18 Aug 2021 16:06:29 -0400 Subject: [PATCH 056/133] add default contingency Rprof command --- facebook/contingency_tables.R | 1 + 1 file changed, 1 insertion(+) diff --git a/facebook/contingency_tables.R b/facebook/contingency_tables.R index 759098652..9491c8ce1 100644 --- a/facebook/contingency_tables.R +++ b/facebook/contingency_tables.R @@ -1,4 +1,5 @@ library(delphiFacebook) +#Rprof(interval = 0.5) params <- read_contingency_params("params.json") run_contingency_tables(params) From 8e0ebde5ce4dc1ad502113203dfdacf54c5e5190 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 19 Aug 2021 11:37:04 -0400 Subject: [PATCH 057/133] remove missing weights up front Contingency indicators are all calculated using FB-provided weights, so we don't need to carry those obs around. --- facebook/delphiFacebook/R/contingency_aggregate.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_aggregate.R b/facebook/delphiFacebook/R/contingency_aggregate.R index 1e3b76ede..f13ed7dbc 100644 --- a/facebook/delphiFacebook/R/contingency_aggregate.R +++ b/facebook/delphiFacebook/R/contingency_aggregate.R @@ -34,7 +34,7 @@ produce_aggregates <- function(df, aggregations, cw_list, params) { ## table in sorted order so data.table can use a binary search to find ## matching dates, rather than a linear scan, and is important for very large ## input files. - df <- as.data.table(df) + df <- as.data.table(df)[!is.na(weight), ] setkeyv(df, "start_dt") # Keep only obs in desired date range. @@ -337,7 +337,7 @@ summarize_aggregations_group <- function(group_df, aggregations, target_group, g var_weight <- aggregations$var_weight[row] compute_fn <- aggregations$compute_fn[[row]] - agg_df <- group_df[!is.na(group_df[[var_weight]]) & !is.na(group_df[[metric]]), ] + agg_df <- group_df[!is.na(group_df[[metric]]), ] if (nrow(agg_df) > 0) { s_mix_coef <- params$s_mix_coef From 3b69c28a647d4f7c3c963b63d2c3417e761eb96f Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 20 Aug 2021 20:03:00 -0400 Subject: [PATCH 058/133] make clear that add_geo_vars acts on cols --- facebook/delphiFacebook/R/contingency_write.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/facebook/delphiFacebook/R/contingency_write.R b/facebook/delphiFacebook/R/contingency_write.R index e3c5d990e..4d6a1d001 100644 --- a/facebook/delphiFacebook/R/contingency_write.R +++ b/facebook/delphiFacebook/R/contingency_write.R @@ -114,8 +114,8 @@ add_geo_vars <- function(data, params, geo_type) { # Insert the geographic variables in place of the "geo_id" variable. index <- which(names(data) == "geo_id") - before <- if (index > 1) data[1:(index-1)] else NULL - after <- data[(index+1):ncol(data)] + before <- if (index > 1) data[, 1:(index-1)] else NULL + after <- data[, (index+1):ncol(data)] result <- bind_cols(before, geo_vars, after) return(result) From a41b6b458d0a420c4632ed9ae3d9992b5a112c8d Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 18 Aug 2021 18:21:34 -0400 Subject: [PATCH 059/133] create Cpp is_selected; R vers only on uniques --- facebook/delphiFacebook/NAMESPACE | 1 + .../delphiFacebook/R/contingency_variables.R | 18 ++--- facebook/delphiFacebook/R/variables.R | 74 ++++++++++++++----- facebook/delphiFacebook/man/is_selected.Rd | 2 +- 4 files changed, 68 insertions(+), 27 deletions(-) diff --git a/facebook/delphiFacebook/NAMESPACE b/facebook/delphiFacebook/NAMESPACE index 9603b097c..194b65af0 100644 --- a/facebook/delphiFacebook/NAMESPACE +++ b/facebook/delphiFacebook/NAMESPACE @@ -55,6 +55,7 @@ export(write_contingency_tables) export(write_data_api) export(write_individual) import(data.table) +importFrom(Rcpp,cppFunction) importFrom(dplyr,"%>%") importFrom(dplyr,across) importFrom(dplyr,all_of) diff --git a/facebook/delphiFacebook/R/contingency_variables.R b/facebook/delphiFacebook/R/contingency_variables.R index 8ddb27f8b..0ec2935a9 100644 --- a/facebook/delphiFacebook/R/contingency_variables.R +++ b/facebook/delphiFacebook/R/contingency_variables.R @@ -180,16 +180,16 @@ code_health <- function(input_data, wave) { if ("C1" %in% names(input_data)) { comorbidities <- split_options(input_data$C1) - input_data$comorbidheartdisease <- is_selected(comorbidities, 3) - input_data$comorbidcancer <- is_selected(comorbidities, 2) - input_data$comorbidkidneydisease <- is_selected(comorbidities, 7) - input_data$comorbidlungdisease <- is_selected(comorbidities, 6) + input_data$comorbidheartdisease <- is_selected(comorbidities, "3") + input_data$comorbidcancer <- is_selected(comorbidities, "2") + input_data$comorbidkidneydisease <- is_selected(comorbidities, "7") + input_data$comorbidlungdisease <- is_selected(comorbidities, "6") input_data$comorbiddiabetes <- - is_selected(comorbidities, 1) | - is_selected(comorbidities, 12) | - is_selected(comorbidities, 10) - input_data$comorbidimmuno <- is_selected(comorbidities, 11) - input_data$comorbidobese <- is_selected(comorbidities, 13) + is_selected(comorbidities, "1") | + is_selected(comorbidities, "12") | + is_selected(comorbidities, "10") + input_data$comorbidimmuno <- is_selected(comorbidities, "11") + input_data$comorbidobese <- is_selected(comorbidities, "13") # Combo vaccine-eligibility input_data$eligible <- diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index 359c8800f..8da4a3cd9 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -27,24 +27,64 @@ split_options <- function(column) { #' @return a logical vector; for each list entry, whether selection is contained #' in the character vector. #' -#' @importFrom parallel mclapply -is_selected <- function(vec, selection) { - map_fn <- ifelse( is.null(getOption("mc.cores")) , lapply, mclapply) - selections <- unlist(map_fn( - vec, - function(resp) { - if (length(resp) == 0 || all(is.na(resp))) { - # Qualtrics files code no selection as "" (empty string), which is - # parsed by `read_csv` as `NA` (missing) by default. Since all our - # selection items include "None of the above" or similar, treat both no - # selection ("") or missing (NA) as missing, for generality. - NA - } else { - selection %in% resp - } - })) +#' @importFrom Rcpp cppFunction +is_selected <- function(vec, selection, use_cpp=TRUE) { + + cppFunction(" +LogicalVector is_selected_cpp(List responses, String target) { + LogicalVector out(responses.size()); + + for (int i = 0; i < responses.size(); ++i) { + if (responses[i] == R_NilValue) { + out[i] = NA_LOGICAL; + continue; + } - return(selections) + StringVector response(responses[i]); + if (response.size() == 0) { + out[i] = NA_LOGICAL; + continue; + } + + for (int j = 0; j < response.size(); ++j ) { + if(StringVector::is_na(response[j])) { + out[i] = NA_LOGICAL; + break; + } + if(response[j] == target) { + out[i] = true; + break; + } + } + } + return out; +}") + + is_selected_r <- function(vec, selection) { + vec_unique <- unique(vec) + + selections <- unlist(lapply( + vec_unique, + function(resp) { + if (length(resp) == 0 || all(is.na(resp))) { + # Qualtrics files code no selection as "" (empty string), which is + # parsed by `read_csv` as `NA` (missing) by default. Since all our + # selection items include "None of the above" or similar, treat both no + # selection ("") or missing (NA) as missing, for generality. + NA + } else { + selection %in% resp + } + })) + + names(selections) <- vec_unique + names(vec) <- vec + + return( as.logical(selections[names(vec)]) ) + } + + split_fn <- ifelse(use_cpp, is_selected_cpp, is_selected_r) + return(split_fn(vec, selection)) } #' Activities outside the home diff --git a/facebook/delphiFacebook/man/is_selected.Rd b/facebook/delphiFacebook/man/is_selected.Rd index dfd7fdfc7..00f2863da 100644 --- a/facebook/delphiFacebook/man/is_selected.Rd +++ b/facebook/delphiFacebook/man/is_selected.Rd @@ -4,7 +4,7 @@ \alias{is_selected} \title{Test if a specific selection is selected} \usage{ -is_selected(vec, selection) +is_selected(vec, selection, use_cpp = TRUE) } \arguments{ \item{vec}{A list whose entries are character vectors, such as c("14", "15").} From ce4634bab65c0a43cf8e2f4c5cb63419a804637d Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 20 Aug 2021 21:05:49 -0400 Subject: [PATCH 060/133] deduplicate preparing group agg output --- facebook/delphiFacebook/NAMESPACE | 1 - .../delphiFacebook/R/contingency_aggregate.R | 28 ++++++++----------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/facebook/delphiFacebook/NAMESPACE b/facebook/delphiFacebook/NAMESPACE index 194b65af0..ec73ea2af 100644 --- a/facebook/delphiFacebook/NAMESPACE +++ b/facebook/delphiFacebook/NAMESPACE @@ -117,5 +117,4 @@ importFrom(stringi,stri_sub) importFrom(stringi,stri_trans_tolower) importFrom(stringi,stri_trim) importFrom(tibble,add_column) -importFrom(tibble,as_tibble) importFrom(tibble,tribble) diff --git a/facebook/delphiFacebook/R/contingency_aggregate.R b/facebook/delphiFacebook/R/contingency_aggregate.R index f13ed7dbc..6b76bb9aa 100644 --- a/facebook/delphiFacebook/R/contingency_aggregate.R +++ b/facebook/delphiFacebook/R/contingency_aggregate.R @@ -311,26 +311,22 @@ summarize_aggs <- function(df, crosswalk_data, aggregations, geo_level, params) #' being used #' @param params Named list of configuration options. #' -#' @importFrom tibble add_column as_tibble +#' @importFrom tibble add_column #' @importFrom dplyr %>% #' #' @export summarize_aggregations_group <- function(group_df, aggregations, target_group, geo_level, params) { - ## Prepare outputs. - dfs_out <- list() - for (row in seq_along(aggregations$id)) { - aggregation <- aggregations$id[row] - - dfs_out[[aggregation]] <- target_group %>% - as.list %>% - as_tibble %>% - add_column(val=NA_real_, - se=NA_real_, - sample_size=NA_real_, - effective_sample_size=NA_real_, - represented=NA_real_) - } - + # Prepare outputs. + fill_df <- target_group %>% + add_column(val=NA_real_, + se=NA_real_, + sample_size=NA_real_, + effective_sample_size=NA_real_, + represented=NA_real_) + dfs_out <- setNames( + rep(list(fill_df), times=length(aggregations$id)), + aggregations$id) + for (row in seq_along(aggregations$id)) { aggregation <- aggregations$id[row] metric <- aggregations$metric[row] From 2ad7b4cbbd943d124f823a72880fa33d10348155 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Sun, 22 Aug 2021 22:16:53 -0400 Subject: [PATCH 061/133] switch na filter to use data.table with --- facebook/delphiFacebook/NAMESPACE | 1 + facebook/delphiFacebook/R/contingency_aggregate.R | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/facebook/delphiFacebook/NAMESPACE b/facebook/delphiFacebook/NAMESPACE index ec73ea2af..7554f7716 100644 --- a/facebook/delphiFacebook/NAMESPACE +++ b/facebook/delphiFacebook/NAMESPACE @@ -108,6 +108,7 @@ importFrom(readr,write_rds) importFrom(rlang,.data) importFrom(stats,complete.cases) importFrom(stats,na.omit) +importFrom(stats,setNames) importFrom(stats,weighted.mean) importFrom(stringi,stri_extract) importFrom(stringi,stri_replace) diff --git a/facebook/delphiFacebook/R/contingency_aggregate.R b/facebook/delphiFacebook/R/contingency_aggregate.R index 6b76bb9aa..5af9a7c8e 100644 --- a/facebook/delphiFacebook/R/contingency_aggregate.R +++ b/facebook/delphiFacebook/R/contingency_aggregate.R @@ -313,6 +313,7 @@ summarize_aggs <- function(df, crosswalk_data, aggregations, geo_level, params) #' #' @importFrom tibble add_column #' @importFrom dplyr %>% +#' @importFrom stats setNames #' #' @export summarize_aggregations_group <- function(group_df, aggregations, target_group, geo_level, params) { @@ -333,7 +334,8 @@ summarize_aggregations_group <- function(group_df, aggregations, target_group, g var_weight <- aggregations$var_weight[row] compute_fn <- aggregations$compute_fn[[row]] - agg_df <- group_df[!is.na(group_df[[metric]]), ] + select_cols <- c(metric, var_weight, "weight_in_location") + agg_df <- group_df[, select_cols, with=FALSE][!is.na(eval(as.name(metric))), ] if (nrow(agg_df) > 0) { s_mix_coef <- params$s_mix_coef From 868aa208a1448bb76ed228fe31aada0ea5a3a31f Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 23 Aug 2021 17:28:20 -0400 Subject: [PATCH 062/133] update documentation --- facebook/delphiFacebook/DESCRIPTION | 3 ++- facebook/delphiFacebook/R/variables.R | 6 ++++-- facebook/delphiFacebook/man/is_selected.Rd | 3 +++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/facebook/delphiFacebook/DESCRIPTION b/facebook/delphiFacebook/DESCRIPTION index 2a5bf172d..061a6b50f 100644 --- a/facebook/delphiFacebook/DESCRIPTION +++ b/facebook/delphiFacebook/DESCRIPTION @@ -20,7 +20,8 @@ Imports: lubridate, data.table, tibble, - purrr + purrr, + Rcpp Suggests: knitr (>= 1.15), rmarkdown (>= 1.4), diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index 8da4a3cd9..6263a9e5e 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -24,12 +24,14 @@ split_options <- function(column) { #' #' @param vec A list whose entries are character vectors, such as c("14", "15"). #' @param selection one string, such as "14" +#' @param use_cpp boolean indicating whether to use the C++ verion or the R +#' version of this function +#' #' @return a logical vector; for each list entry, whether selection is contained #' in the character vector. -#' +#' #' @importFrom Rcpp cppFunction is_selected <- function(vec, selection, use_cpp=TRUE) { - cppFunction(" LogicalVector is_selected_cpp(List responses, String target) { LogicalVector out(responses.size()); diff --git a/facebook/delphiFacebook/man/is_selected.Rd b/facebook/delphiFacebook/man/is_selected.Rd index 00f2863da..5f7eebfdb 100644 --- a/facebook/delphiFacebook/man/is_selected.Rd +++ b/facebook/delphiFacebook/man/is_selected.Rd @@ -10,6 +10,9 @@ is_selected(vec, selection, use_cpp = TRUE) \item{vec}{A list whose entries are character vectors, such as c("14", "15").} \item{selection}{one string, such as "14"} + +\item{use_cpp}{boolean indicating whether to use the C++ verion or the R +version of this function} } \value{ a logical vector; for each list entry, whether selection is contained From ed93b3c5b3769fc12a7a0b83391bfbf95da6b8fb Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 24 Aug 2021 16:02:29 -0400 Subject: [PATCH 063/133] apply contingency changes to API agg func --- facebook/delphiFacebook/R/aggregate.R | 32 +++++++++++++++------------ 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/facebook/delphiFacebook/R/aggregate.R b/facebook/delphiFacebook/R/aggregate.R index e1c82817b..1738ecb79 100644 --- a/facebook/delphiFacebook/R/aggregate.R +++ b/facebook/delphiFacebook/R/aggregate.R @@ -146,23 +146,25 @@ summarize_indicators <- function(df, crosswalk_data, indicators, geo_level, #' @param geo_level Name of the geo level (county, state, etc.) for which we are #' aggregating. #' @param params Named list of configuration options. +#' #' @importFrom dplyr mutate filter +#' @importFrom stats setNames #' @importFrom rlang .data summarize_indicators_day <- function(day_df, indicators, target_day, geo_level, params) { ## Prepare outputs. - dfs_out <- list() geo_ids <- unique(day_df$geo_id) - for (indicator in indicators$name) { - dfs_out[[indicator]] <- tibble( - geo_id = geo_ids, - day = target_day, - val = NA_real_, - se = NA_real_, - sample_size = NA_real_, - effective_sample_size = NA_real_ - ) - } - + fill_df <- tibble( + geo_id = geo_ids, + day = target_day, + val = NA_real_, + se = NA_real_, + sample_size = NA_real_, + effective_sample_size = NA_real_ + ) + dfs_out <- setNames( + rep(list(fill_df), times=length(indicators$name)), + indicators$name) + for (ii in seq_along(geo_ids)) { target_geo <- geo_ids[ii] @@ -175,8 +177,10 @@ summarize_indicators_day <- function(day_df, indicators, target_day, geo_level, var_weight <- indicators$var_weight[row] compute_fn <- indicators$compute_fn[[row]] - ind_df <- sub_df[!is.na(sub_df[[var_weight]]) & !is.na(sub_df[[metric]]), ] - + # Copy only columns we're using. Makes filter on missing values faster. + select_cols <- c(metric, var_weight, "weight_in_location") + ind_df <- sub_df[, select_cols, with=FALSE][!is.na(sub_df[[var_weight]]) & !is.na(sub_df[[metric]]), ] + if (nrow(ind_df) > 0) { s_mix_coef <- params$s_mix_coef From 309a0132dc02e0f8ab74540f98333ed97f854423 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 24 Aug 2021 18:33:04 -0400 Subject: [PATCH 064/133] switch weights handling to use data.table --- facebook/delphiFacebook/NAMESPACE | 1 + facebook/delphiFacebook/R/weights.R | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/facebook/delphiFacebook/NAMESPACE b/facebook/delphiFacebook/NAMESPACE index 7554f7716..3117dced1 100644 --- a/facebook/delphiFacebook/NAMESPACE +++ b/facebook/delphiFacebook/NAMESPACE @@ -56,6 +56,7 @@ export(write_data_api) export(write_individual) import(data.table) importFrom(Rcpp,cppFunction) +importFrom(data.table,fread) importFrom(dplyr,"%>%") importFrom(dplyr,across) importFrom(dplyr,all_of) diff --git a/facebook/delphiFacebook/R/weights.R b/facebook/delphiFacebook/R/weights.R index a420398d1..30dcaf8de 100644 --- a/facebook/delphiFacebook/R/weights.R +++ b/facebook/delphiFacebook/R/weights.R @@ -46,6 +46,8 @@ write_cid <- function(data, type_name, params) #' @param weights Which weights to use -- step1 or full? #' #' @importFrom dplyr bind_rows left_join +#' @importFrom data.table fread +#' #' @export join_weights <- function(data, params, weights = c("step1", "full")) { @@ -59,8 +61,12 @@ join_weights <- function(data, params, weights = c("step1", "full")) weights_files <- dir(params$weights_in_dir, pattern = pattern, full.names = TRUE) weights_files <- sort(weights_files) - agg_weights <- bind_rows(lapply(weights_files, read_csv, col_types = "cd")) - agg_weights <- agg_weights[!duplicated(agg_weights$cid),] + agg_weights <- bind_rows(lapply( + weights_files, + fread, + colClasses = c(cid="character", weight="double")) + ) + agg_weights <- agg_weights[!duplicated(cid),] data <- left_join(data, agg_weights, by = c("token" = "cid")) return(data) From 37f97bcd2ca72da23f99c1b1f5b49b5a9a142382 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 26 Aug 2021 16:18:22 -0400 Subject: [PATCH 065/133] misc cleanup --- facebook/contingency_tables.R | 1 + facebook/delphiFacebook/R/dates.R | 2 +- facebook/delphiFacebook/R/responses.R | 10 ++++------ facebook/delphiFacebook/R/variables.R | 6 +++--- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/facebook/contingency_tables.R b/facebook/contingency_tables.R index 9491c8ce1..654407dd8 100644 --- a/facebook/contingency_tables.R +++ b/facebook/contingency_tables.R @@ -3,3 +3,4 @@ library(delphiFacebook) #Rprof(interval = 0.5) params <- read_contingency_params("params.json") run_contingency_tables(params) +message("run_contingency_tables completed successfully") diff --git a/facebook/delphiFacebook/R/dates.R b/facebook/delphiFacebook/R/dates.R index 84b96da09..6576b5efd 100644 --- a/facebook/delphiFacebook/R/dates.R +++ b/facebook/delphiFacebook/R/dates.R @@ -1,6 +1,6 @@ # Time zone to use throughout package. tz_to <- "America/Los_Angeles" -wave6_mod_date <- ymd("2021-01-06", tz=tz_to) +wave6_mod_date <- lubridate::ymd("2021-01-06", tz=tz_to) #' Get the date of the first day of the previous month. #' diff --git a/facebook/delphiFacebook/R/responses.R b/facebook/delphiFacebook/R/responses.R index 4df87a8f8..e20e39599 100644 --- a/facebook/delphiFacebook/R/responses.R +++ b/facebook/delphiFacebook/R/responses.R @@ -17,12 +17,10 @@ #' @importFrom parallel mclapply #' @export load_responses_all <- function(params, contingency_run = FALSE) { - input_data <- vector("list", length(params$input)) - msg_plain(paste0("Loading ", length(params$input), " CSVs")) map_fn <- if (params$parallel) { mclapply } else { lapply } - input_data <- map_fn(seq_along(input_data), function(i) { + input_data <- map_fn(seq_along(params$input), function(i) { load_response_one(params$input[i], params, contingency_run) }) @@ -58,7 +56,7 @@ load_response_one <- function(input_filename, params, contingency_run) { col_names <- stri_split(read_lines(full_path, n_max = 1L), fixed = ",")[[1]] col_names <- stri_replace_all(col_names, "", fixed = "\"") - + ## The CSVs have some columns with column-separated fields showing which of ## multiple options a user selected; readr would interpret these as thousand ## separators by default, so we tell it that no thousands separators are used. @@ -363,7 +361,7 @@ filter_data_for_aggregation <- function(df, params, lead_days = 12L) dplyr::between(.data$hh_number_sick, 0L, 30L), dplyr::between(.data$hh_number_total, 1L, 30L), .data$hh_number_sick <= .data$hh_number_total, - .data$day >= (as.Date(params$start_date) - lead_days), + .data$day >= (as.Date(params$start_date) - lead_days) ) msg_plain(paste0("Finished filtering data for aggregations")) @@ -612,7 +610,7 @@ surveyID_to_wave <- Vectorize(function(surveyID) { "SV_6PADB8DyF9SIyXk" = 10, "SV_4VEaeffqQtDo33M" = 11) - if (surveyID %in% names(waves)) { + if ( any(names(waves) == surveyID) ) { return(waves[[surveyID]]) } diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index 6263a9e5e..c8b73848a 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -75,7 +75,7 @@ LogicalVector is_selected_cpp(List responses, String target) { # selection ("") or missing (NA) as missing, for generality. NA } else { - selection %in% resp + any(resp == selection) } })) @@ -85,8 +85,8 @@ LogicalVector is_selected_cpp(List responses, String target) { return( as.logical(selections[names(vec)]) ) } - split_fn <- ifelse(use_cpp, is_selected_cpp, is_selected_r) - return(split_fn(vec, selection)) + select_fn <- ifelse(use_cpp, is_selected_cpp, is_selected_r) + return(select_fn(vec, selection)) } #' Activities outside the home From a663f19377d37ac7d6f663280086f0405fce7159 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 30 Aug 2021 17:09:31 -0400 Subject: [PATCH 066/133] set up C++ package structure so can use in parallel Defining a C++ function using Rcpp::cppFunction is slow and causes errors when running in parallel since the C++ function is compiled and cached (under the same and thus conflicting names) in each thread. Defining the function in a .cpp file and pre-compiling fixes these issues. --- facebook/delphiFacebook/DESCRIPTION | 1 + facebook/delphiFacebook/NAMESPACE | 2 +- facebook/delphiFacebook/R/RcppExports.R | 7 ++ facebook/delphiFacebook/R/variables.R | 87 +++++++----------- facebook/delphiFacebook/man/is_selected_r.Rd | 22 +++++ facebook/delphiFacebook/src/RcppExports.cpp | 34 +++++++ facebook/delphiFacebook/src/RcppExports.o | Bin 0 -> 861360 bytes .../delphiFacebook/src/is_selected_cpp.cpp | 32 +++++++ facebook/delphiFacebook/src/is_selected_cpp.o | Bin 0 -> 644392 bytes 9 files changed, 131 insertions(+), 54 deletions(-) create mode 100644 facebook/delphiFacebook/R/RcppExports.R create mode 100644 facebook/delphiFacebook/man/is_selected_r.Rd create mode 100644 facebook/delphiFacebook/src/RcppExports.cpp create mode 100644 facebook/delphiFacebook/src/RcppExports.o create mode 100644 facebook/delphiFacebook/src/is_selected_cpp.cpp create mode 100644 facebook/delphiFacebook/src/is_selected_cpp.o diff --git a/facebook/delphiFacebook/DESCRIPTION b/facebook/delphiFacebook/DESCRIPTION index 061a6b50f..f9c2a08c4 100644 --- a/facebook/delphiFacebook/DESCRIPTION +++ b/facebook/delphiFacebook/DESCRIPTION @@ -27,5 +27,6 @@ Suggests: rmarkdown (>= 1.4), testthat (>= 1.0.1), covr (>= 2.2.2) +LinkingTo: Rcpp RoxygenNote: 7.1.1 Encoding: UTF-8 diff --git a/facebook/delphiFacebook/NAMESPACE b/facebook/delphiFacebook/NAMESPACE index 3117dced1..4495d210f 100644 --- a/facebook/delphiFacebook/NAMESPACE +++ b/facebook/delphiFacebook/NAMESPACE @@ -55,7 +55,6 @@ export(write_contingency_tables) export(write_data_api) export(write_individual) import(data.table) -importFrom(Rcpp,cppFunction) importFrom(data.table,fread) importFrom(dplyr,"%>%") importFrom(dplyr,across) @@ -120,3 +119,4 @@ importFrom(stringi,stri_trans_tolower) importFrom(stringi,stri_trim) importFrom(tibble,add_column) importFrom(tibble,tribble) +useDynLib(delphiFacebook, .registration = TRUE) diff --git a/facebook/delphiFacebook/R/RcppExports.R b/facebook/delphiFacebook/R/RcppExports.R new file mode 100644 index 000000000..b99bbaca0 --- /dev/null +++ b/facebook/delphiFacebook/R/RcppExports.R @@ -0,0 +1,7 @@ +# Generated by using Rcpp::compileAttributes() -> do not edit by hand +# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 + +is_selected_cpp <- function(responses, target) { + .Call(`_delphiFacebook_is_selected_cpp`, responses, target) +} + diff --git a/facebook/delphiFacebook/R/variables.R b/facebook/delphiFacebook/R/variables.R index c8b73848a..888e94059 100644 --- a/facebook/delphiFacebook/R/variables.R +++ b/facebook/delphiFacebook/R/variables.R @@ -29,64 +29,45 @@ split_options <- function(column) { #' #' @return a logical vector; for each list entry, whether selection is contained #' in the character vector. -#' -#' @importFrom Rcpp cppFunction +#' +#' @useDynLib delphiFacebook, .registration = TRUE is_selected <- function(vec, selection, use_cpp=TRUE) { - cppFunction(" -LogicalVector is_selected_cpp(List responses, String target) { - LogicalVector out(responses.size()); - - for (int i = 0; i < responses.size(); ++i) { - if (responses[i] == R_NilValue) { - out[i] = NA_LOGICAL; - continue; - } - - StringVector response(responses[i]); - if (response.size() == 0) { - out[i] = NA_LOGICAL; - continue; - } + select_fn <- ifelse(use_cpp, is_selected_cpp, is_selected_r) + return(select_fn(vec, selection)) +} - for (int j = 0; j < response.size(); ++j ) { - if(StringVector::is_na(response[j])) { - out[i] = NA_LOGICAL; - break; - } - if(response[j] == target) { - out[i] = true; - break; +#' Test if a specific selection is selected, R implementation +#' +#' Checking whether a specific selection is selected in either "" (empty +#' string) or `NA` responses will produce `NA`s. Looks only at unique values in +#' the input vector. +#' +#' @param vec A list whose entries are character vectors, such as c("14", "15"). +#' @param selection one string, such as "14" +#' +#' @return a logical vector; for each list entry, whether selection is contained +#' in the character vector. +is_selected_r <- function(vec, selection) { + vec_unique <- unique(vec) + + selections <- unlist(lapply( + vec_unique, + function(resp) { + if (length(resp) == 0 || all(is.na(resp))) { + # Qualtrics files code no selection as "" (empty string), which is + # parsed by `read_csv` as `NA` (missing) by default. Since all our + # selection items include "None of the above" or similar, treat both no + # selection ("") or missing (NA) as missing, for generality. + NA + } else { + any(resp == selection) } - } - } - return out; -}") + })) - is_selected_r <- function(vec, selection) { - vec_unique <- unique(vec) - - selections <- unlist(lapply( - vec_unique, - function(resp) { - if (length(resp) == 0 || all(is.na(resp))) { - # Qualtrics files code no selection as "" (empty string), which is - # parsed by `read_csv` as `NA` (missing) by default. Since all our - # selection items include "None of the above" or similar, treat both no - # selection ("") or missing (NA) as missing, for generality. - NA - } else { - any(resp == selection) - } - })) - - names(selections) <- vec_unique - names(vec) <- vec - - return( as.logical(selections[names(vec)]) ) - } + names(selections) <- vec_unique + names(vec) <- vec - select_fn <- ifelse(use_cpp, is_selected_cpp, is_selected_r) - return(select_fn(vec, selection)) + return( as.logical(selections[names(vec)]) ) } #' Activities outside the home diff --git a/facebook/delphiFacebook/man/is_selected_r.Rd b/facebook/delphiFacebook/man/is_selected_r.Rd new file mode 100644 index 000000000..a39da3af4 --- /dev/null +++ b/facebook/delphiFacebook/man/is_selected_r.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/variables.R +\name{is_selected_r} +\alias{is_selected_r} +\title{Test if a specific selection is selected, R implementation} +\usage{ +is_selected_r(vec, selection) +} +\arguments{ +\item{vec}{A list whose entries are character vectors, such as c("14", "15").} + +\item{selection}{one string, such as "14"} +} +\value{ +a logical vector; for each list entry, whether selection is contained + in the character vector. +} +\description{ +Checking whether a specific selection is selected in either "" (empty +string) or `NA` responses will produce `NA`s. Looks only at unique values in +the input vector. +} diff --git a/facebook/delphiFacebook/src/RcppExports.cpp b/facebook/delphiFacebook/src/RcppExports.cpp new file mode 100644 index 000000000..e21e5728d --- /dev/null +++ b/facebook/delphiFacebook/src/RcppExports.cpp @@ -0,0 +1,34 @@ +// Generated by using Rcpp::compileAttributes() -> do not edit by hand +// Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 + +#include + +using namespace Rcpp; + +#ifdef RCPP_USE_GLOBAL_ROSTREAM +Rcpp::Rostream& Rcpp::Rcout = Rcpp::Rcpp_cout_get(); +Rcpp::Rostream& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get(); +#endif + +// is_selected_cpp +LogicalVector is_selected_cpp(List responses, String target); +RcppExport SEXP _delphiFacebook_is_selected_cpp(SEXP responsesSEXP, SEXP targetSEXP) { +BEGIN_RCPP + Rcpp::RObject rcpp_result_gen; + Rcpp::RNGScope rcpp_rngScope_gen; + Rcpp::traits::input_parameter< List >::type responses(responsesSEXP); + Rcpp::traits::input_parameter< String >::type target(targetSEXP); + rcpp_result_gen = Rcpp::wrap(is_selected_cpp(responses, target)); + return rcpp_result_gen; +END_RCPP +} + +static const R_CallMethodDef CallEntries[] = { + {"_delphiFacebook_is_selected_cpp", (DL_FUNC) &_delphiFacebook_is_selected_cpp, 2}, + {NULL, NULL, 0} +}; + +RcppExport void R_init_delphiFacebook(DllInfo *dll) { + R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); + R_useDynamicSymbols(dll, FALSE); +} diff --git a/facebook/delphiFacebook/src/RcppExports.o b/facebook/delphiFacebook/src/RcppExports.o new file mode 100644 index 0000000000000000000000000000000000000000..0286385e05fd40d8d7fa4dbb4e533e472742e51d GIT binary patch literal 861360 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

    g01v$pwl?Sy}Didq-ex!>K0W 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

    gAKq#`cUjJbWL>R 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%0A5bH3-Mj=|EykHyW#Bo1{}vBH-Y0m3qJS2uFKhX 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 literal 0 HcmV?d00001 diff --git a/facebook/delphiFacebook/src/is_selected_cpp.cpp b/facebook/delphiFacebook/src/is_selected_cpp.cpp new file mode 100644 index 000000000..b30912ddd --- /dev/null +++ b/facebook/delphiFacebook/src/is_selected_cpp.cpp @@ -0,0 +1,32 @@ +#include +using namespace Rcpp; + +// [[Rcpp::export]] +LogicalVector is_selected_cpp(List responses, String target) { + LogicalVector out(responses.size()); + + for (int i = 0; i < responses.size(); ++i) { + if (responses[i] == R_NilValue) { + out[i] = NA_LOGICAL; + continue; + } + + StringVector response(responses[i]); + if (response.size() == 0) { + out[i] = NA_LOGICAL; + continue; + } + + for (int j = 0; j < response.size(); ++j ) { + if(StringVector::is_na(response[j])) { + out[i] = NA_LOGICAL; + break; + } + if(response[j] == target) { + out[i] = true; + break; + } + } + } + return out; +} \ No newline at end of file diff --git a/facebook/delphiFacebook/src/is_selected_cpp.o b/facebook/delphiFacebook/src/is_selected_cpp.o new file mode 100644 index 0000000000000000000000000000000000000000..8efcff86708b97b1678d4edade4cd0e2201be0b2 GIT binary patch literal 644392 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%0A0G2_3I;g@IN z_c7d_9*HBRM}9{c|4+F8lpDu>@4o^5)&tWHZt2Vv2;Ex`%w*tI!1KO$Pl3Nufxkh4 z-v{_x5BNAWJD)#d_(Enr4}U!MKaznzpW#04%#L#(;0F&}gFSGc$K=A0e>u>S-jSTnk8W#RXO8;w~K;w{ijr`dDKg@6+4`R>t zKPdfAJdwt^F*DBV75Enze$w@~l=OlpQC?>6w|2

    +yge4B~)3W#G?YxQ{ov!N7kI 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 B>~a7A literal 0 HcmV?d00001 From 0a4dc61f8cfaa6f5ee004eafcaba4dcca5f102a5 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 31 Aug 2021 10:32:12 -0400 Subject: [PATCH 067/133] store output in list of lists --- facebook/delphiFacebook/R/aggregate.R | 37 ++++++++++++++++----------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/facebook/delphiFacebook/R/aggregate.R b/facebook/delphiFacebook/R/aggregate.R index 1738ecb79..0250a94d1 100644 --- a/facebook/delphiFacebook/R/aggregate.R +++ b/facebook/delphiFacebook/R/aggregate.R @@ -147,22 +147,24 @@ summarize_indicators <- function(df, crosswalk_data, indicators, geo_level, #' aggregating. #' @param params Named list of configuration options. #' -#' @importFrom dplyr mutate filter +#' @importFrom dplyr mutate filter bind_rows #' @importFrom stats setNames #' @importFrom rlang .data summarize_indicators_day <- function(day_df, indicators, target_day, geo_level, params) { - ## Prepare outputs. + ## Prepare outputs as list of lists. Saves some time and memory since lists + ## are not copied on modify. geo_ids <- unique(day_df$geo_id) - fill_df <- tibble( - geo_id = geo_ids, - day = target_day, - val = NA_real_, - se = NA_real_, - sample_size = NA_real_, - effective_sample_size = NA_real_ + n_geo_ids <- length(geo_ids) + fill_list <- list(geo_id = geo_ids, + day = rep(target_day, n_geo_ids), + val = rep(NA_real_, n_geo_ids), + se = rep(NA_real_, n_geo_ids), + sample_size = rep(NA_real_, n_geo_ids), + effective_sample_size = rep(NA_real_, n_geo_ids) ) + dfs_out <- setNames( - rep(list(fill_df), times=length(indicators$name)), + rep(list(fill_list), times=length(indicators$name)), indicators$name) for (ii in seq_along(geo_ids)) @@ -177,7 +179,7 @@ summarize_indicators_day <- function(day_df, indicators, target_day, geo_level, var_weight <- indicators$var_weight[row] compute_fn <- indicators$compute_fn[[row]] - # Copy only columns we're using. Makes filter on missing values faster. + # Copy only columns we're using. select_cols <- c(metric, var_weight, "weight_in_location") ind_df <- sub_df[, select_cols, with=FALSE][!is.na(sub_df[[var_weight]]) & !is.na(sub_df[[metric]]), ] @@ -195,13 +197,18 @@ summarize_indicators_day <- function(day_df, indicators, target_day, geo_level, weight = if (indicators$skip_mixing[row]) { mixing$normalized_preweights } else { mixing$weights }, sample_size = sample_size) - dfs_out[[indicator]]$val[ii] <- new_row$val - dfs_out[[indicator]]$se[ii] <- new_row$se - dfs_out[[indicator]]$sample_size[ii] <- sample_size - dfs_out[[indicator]]$effective_sample_size[ii] <- new_row$effective_sample_size + dfs_out[[indicator]][["val"]][ii] <- new_row$val + dfs_out[[indicator]][["se"]][ii] <- new_row$se + dfs_out[[indicator]][["sample_size"]][ii] <- sample_size + dfs_out[[indicator]][["effective_sample_size"]][ii] <- new_row$effective_sample_size } } } + + # Convert list of lists to list of tibbles. + for (indicator in indicators$name) { + dfs_out[[indicator]] <- bind_rows(dfs_out[[indicator]]) + } for (row in seq_len(nrow(indicators))) { indicator <- indicators$name[row] From f548c6a70ed3f01f220903b0718ec44acac15105 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 1 Sep 2021 12:18:18 -0400 Subject: [PATCH 068/133] comments --- facebook/delphiFacebook/R/contingency_aggregate.R | 1 + 1 file changed, 1 insertion(+) diff --git a/facebook/delphiFacebook/R/contingency_aggregate.R b/facebook/delphiFacebook/R/contingency_aggregate.R index 5af9a7c8e..26db6ed4d 100644 --- a/facebook/delphiFacebook/R/contingency_aggregate.R +++ b/facebook/delphiFacebook/R/contingency_aggregate.R @@ -334,6 +334,7 @@ summarize_aggregations_group <- function(group_df, aggregations, target_group, g var_weight <- aggregations$var_weight[row] compute_fn <- aggregations$compute_fn[[row]] + # Copy only columns we're using. select_cols <- c(metric, var_weight, "weight_in_location") agg_df <- group_df[, select_cols, with=FALSE][!is.na(eval(as.name(metric))), ] From 5567ba0ab54f75dc01105ac6c5194e42b5df47ae Mon Sep 17 00:00:00 2001 From: nmdefries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 1 Sep 2021 16:58:37 -0400 Subject: [PATCH 069/133] cpp style Co-authored-by: Alex Reinhart --- facebook/delphiFacebook/src/is_selected_cpp.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/facebook/delphiFacebook/src/is_selected_cpp.cpp b/facebook/delphiFacebook/src/is_selected_cpp.cpp index b30912ddd..6d1d80657 100644 --- a/facebook/delphiFacebook/src/is_selected_cpp.cpp +++ b/facebook/delphiFacebook/src/is_selected_cpp.cpp @@ -18,11 +18,11 @@ LogicalVector is_selected_cpp(List responses, String target) { } for (int j = 0; j < response.size(); ++j ) { - if(StringVector::is_na(response[j])) { + if (StringVector::is_na(response[j])) { out[i] = NA_LOGICAL; break; } - if(response[j] == target) { + if (response[j] == target) { out[i] = true; break; } From d88262251579c38cbced91ba7194610f62196121 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 1 Sep 2021 17:03:48 -0400 Subject: [PATCH 070/133] remove test code --- facebook/contingency_tables.R | 1 - facebook/run.R | 1 - 2 files changed, 2 deletions(-) diff --git a/facebook/contingency_tables.R b/facebook/contingency_tables.R index 654407dd8..7928660ef 100644 --- a/facebook/contingency_tables.R +++ b/facebook/contingency_tables.R @@ -1,6 +1,5 @@ library(delphiFacebook) -#Rprof(interval = 0.5) params <- read_contingency_params("params.json") run_contingency_tables(params) message("run_contingency_tables completed successfully") diff --git a/facebook/run.R b/facebook/run.R index 7a11615bd..722848031 100644 --- a/facebook/run.R +++ b/facebook/run.R @@ -1,6 +1,5 @@ library(delphiFacebook) -#Rprof(interval = 0.005) params <- read_params("params.json") delphiFacebook::run_facebook(params) message("run_facebook completed successfully") From 0080d6e9f6f7d1ab9fdb9e816ab8c2ff95355b70 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 1 Sep 2021 17:06:23 -0400 Subject: [PATCH 071/133] rm cpp compile files --- facebook/delphiFacebook/src/RcppExports.o | Bin 861360 -> 0 bytes facebook/delphiFacebook/src/is_selected_cpp.o | Bin 644392 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 facebook/delphiFacebook/src/RcppExports.o delete mode 100644 facebook/delphiFacebook/src/is_selected_cpp.o diff --git a/facebook/delphiFacebook/src/RcppExports.o b/facebook/delphiFacebook/src/RcppExports.o deleted file mode 100644 index 0286385e05fd40d8d7fa4dbb4e533e472742e51d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 861360 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

      g01v$pwl?Sy}Didq-ex!>K0W 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

      gAKq#`cUjJbWL>R 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%0A5bH3-Mj=|EykHyW#Bo1{}vBH-Y0m3qJS2uFKhX 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 diff --git a/facebook/delphiFacebook/src/is_selected_cpp.o b/facebook/delphiFacebook/src/is_selected_cpp.o deleted file mode 100644 index 8efcff86708b97b1678d4edade4cd0e2201be0b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 644392 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%0A0G2_3I;g@IN z_c7d_9*HBRM}9{c|4+F8lpDu>@4o^5)&tWHZt2Vv2;Ex`%w*tI!1KO$Pl3Nufxkh4 z-v{_x5BNAWJD)#d_(Enr4}U!MKaznzpW#04%#L#(;0F&}gFSGc$K=A0e>u>S-jSTnk8W#RXO8;w~K;w{ijr`dDKg@6+4`R>t zKPdfAJdwt^F*DBV75Enze$w@~l=OlpQC?>6w|2

      +yge4B~)3W#G?YxQ{ov!N7kI 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 B>~a7A From 693a25e5acfe4a31fc482b1b05af378505d963fb Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 3 Sep 2021 11:34:07 -0400 Subject: [PATCH 072/133] prevent raceeth missing error --- facebook/delphiFacebook/R/responses.R | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/facebook/delphiFacebook/R/responses.R b/facebook/delphiFacebook/R/responses.R index e20e39599..a6a92a7a2 100644 --- a/facebook/delphiFacebook/R/responses.R +++ b/facebook/delphiFacebook/R/responses.R @@ -544,6 +544,12 @@ create_complete_responses <- function(input_data, county_crosswalk) "zip5" # temporarily; we'll filter by this column later and then drop it before writing ) + # Remove "raceethnicity" from cols_to_report if not producing race-ethnicity + # microdata so we don't get an error that the field doesn't exist. + if (is.null(params$produce_individual_raceeth) || !params$produce_individual_raceeth) { + cols_to_report <- cols_to_report[cols_to_report != "raceethnicity"] + } + # Not all cols are present in all waves; if our data does not include some # questions, don't report them. if (any(!(cols_to_report %in% names(input_data)))) { From 9dca6cbd2def751e4abf315f12010053da48a7e3 Mon Sep 17 00:00:00 2001 From: Kathryn M Mazaitis Date: Fri, 3 Sep 2021 13:31:58 -0400 Subject: [PATCH 073/133] [hhs_hosp] Permit generating backissues * Optional param common.epidata for dict of extra parameters to send to Epidata.covid_hosp * Special handling of common.epidata.as_of, if it exists, so that we only generate data up to the as-of date --- hhs_hosp/delphi_hhs/run.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/hhs_hosp/delphi_hhs/run.py b/hhs_hosp/delphi_hhs/run.py index eea1afaa8..6af654845 100644 --- a/hhs_hosp/delphi_hhs/run.py +++ b/hhs_hosp/delphi_hhs/run.py @@ -75,6 +75,7 @@ def run_module(params): - "common": - "export_dir": str, directory to write output - "log_filename" (optional): str, name of file to write logs + - "epidata" (optional): dict, extra parameters to send to Epidata.covid_hosp """ start_time = time.time() logger = get_structured_logger( @@ -82,15 +83,21 @@ def run_module(params): log_exceptions=params["common"].get("log_exceptions", True)) mapper = GeoMapper() request_all_states = ",".join(mapper.get_geo_values("state_id")) - today = date.today() + end_day = date.today() + if "epidata" in params["common"] and \ + "as_of" in params["common"]["epidata"]: + end_day = min( + end_day, + datetime.strptime(str(params["common"]["epidata"]["as_of"]), "%Y%m%d").date() + ) past_reference_day = date(year=2020, month=1, day=1) # first available date in DB - date_range = generate_date_ranges(past_reference_day, today) + date_range = generate_date_ranges(past_reference_day, end_day) dfs = [] for r in date_range: - response = Epidata.covid_hosp(request_all_states, r) + response = Epidata.covid_hosp(request_all_states, r, **params["common"].get("epidata", {})) # The last date range might only have recent days that don't have any data, so don't error. if response["result"] != 1 and r != date_range[-1]: - raise Exception(f"Bad result from Epidata: {response['message']}") + raise Exception(f"Bad result from Epidata for {r}: {response['message']}") if response["result"] == -2 and r == date_range[-1]: # -2 code means no results continue dfs.append(pd.DataFrame(response['epidata'])) From 7338a9662046b32be628a0df40e9e7ba68716b57 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 7 Sep 2021 13:00:16 -0400 Subject: [PATCH 074/133] ignore msa vaccine barriers "tried" --- ansible/templates/sir_complainsalot-params-prod.json.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible/templates/sir_complainsalot-params-prod.json.j2 b/ansible/templates/sir_complainsalot-params-prod.json.j2 index 9706c467f..0076bcc82 100644 --- a/ansible/templates/sir_complainsalot-params-prod.json.j2 +++ b/ansible/templates/sir_complainsalot-params-prod.json.j2 @@ -37,7 +37,7 @@ "fb-survey": { "max_age": 3, "maintainers": ["U01069KCRS7"], - "retired-signals": ["smoothed_anxious_5d", "smoothed_wanxious_5d", "smoothed_depressed_5d", "smoothed_wdepressed_5d", "smoothed_felt_isolated_5d", "smoothed_wfelt_isolated_5d", "smoothed_large_event_1d", "smoothed_wlarge_event_1d", "smoothed_restaurant_1d", "smoothed_wrestaurant_1d", "smoothed_shop_1d", "smoothed_wshop_1d", "smoothed_spent_time_1d", "smoothed_wspent_time_1d", "smoothed_travel_outside_state_5d", "smoothed_wtravel_outside_state_5d", "smoothed_work_outside_home_1d", "smoothed_wwork_outside_home_1d", "smoothed_wearing_mask", "smoothed_wwearing_mask", "smoothed_vaccine_likely_local_health", "smoothed_wvaccine_likely_local_health", "smoothed_others_masked", "smoothed_wothers_masked", "smoothed_wanted_test_14d", "smoothed_wwanted_test_14d", "smoothed_covid_vaccinated_or_accept", "smoothed_wcovid_vaccinated_or_accept", "smoothed_accept_covid_vaccine", "smoothed_waccept_covid_vaccine", "smoothed_hesitancy_reason_allergic", "smoothed_whesitancy_reason_allergic", "smoothed_hesitancy_reason_not_recommended", "smoothed_whesitancy_reason_not_recommended", "smoothed_hesitancy_reason_distrust_vaccines", "smoothed_whesitancy_reason_distrust_vaccines", "smoothed_hesitancy_reason_health_condition", "smoothed_whesitancy_reason_health_condition", "smoothed_hesitancy_reason_pregnant", "smoothed_whesitancy_reason_pregnant", "smoothed_vaccine_likely_friends", "smoothed_wvaccine_likely_friends", "smoothed_vaccine_likely_who", "smoothed_wvaccine_likely_who", "smoothed_vaccine_likely_govt_health", "smoothed_wvaccine_likely_govt_health", "smoothed_vaccine_likely_politicians", "smoothed_wvaccine_likely_politicians", "smoothed_vaccine_likely_doctors", "smoothed_wvaccine_likely_doctors", "smoothed_felt_isolated_7d", "smoothed_wfelt_isolated_7d", "smoothed_worried_become_ill", "smoothed_wworried_become_ill", "smoothed_inperson_school_fulltime", "smoothed_winperson_school_fulltime", "smoothed_inperson_school_parttime", "smoothed_winperson_school_parttime"] + "retired-signals": ["smoothed_anxious_5d", "smoothed_wanxious_5d", "smoothed_depressed_5d", "smoothed_wdepressed_5d", "smoothed_felt_isolated_5d", "smoothed_wfelt_isolated_5d", "smoothed_large_event_1d", "smoothed_wlarge_event_1d", "smoothed_restaurant_1d", "smoothed_wrestaurant_1d", "smoothed_shop_1d", "smoothed_wshop_1d", "smoothed_spent_time_1d", "smoothed_wspent_time_1d", "smoothed_travel_outside_state_5d", "smoothed_wtravel_outside_state_5d", "smoothed_work_outside_home_1d", "smoothed_wwork_outside_home_1d", "smoothed_wearing_mask", "smoothed_wwearing_mask", "smoothed_vaccine_likely_local_health", "smoothed_wvaccine_likely_local_health", "smoothed_others_masked", "smoothed_wothers_masked", "smoothed_wanted_test_14d", "smoothed_wwanted_test_14d", "smoothed_covid_vaccinated_or_accept", "smoothed_wcovid_vaccinated_or_accept", "smoothed_accept_covid_vaccine", "smoothed_waccept_covid_vaccine", "smoothed_hesitancy_reason_allergic", "smoothed_whesitancy_reason_allergic", "smoothed_hesitancy_reason_not_recommended", "smoothed_whesitancy_reason_not_recommended", "smoothed_hesitancy_reason_distrust_vaccines", "smoothed_whesitancy_reason_distrust_vaccines", "smoothed_hesitancy_reason_health_condition", "smoothed_whesitancy_reason_health_condition", "smoothed_hesitancy_reason_pregnant", "smoothed_whesitancy_reason_pregnant", "smoothed_vaccine_likely_friends", "smoothed_wvaccine_likely_friends", "smoothed_vaccine_likely_who", "smoothed_wvaccine_likely_who", "smoothed_vaccine_likely_govt_health", "smoothed_wvaccine_likely_govt_health", "smoothed_vaccine_likely_politicians", "smoothed_wvaccine_likely_politicians", "smoothed_vaccine_likely_doctors", "smoothed_wvaccine_likely_doctors", "smoothed_felt_isolated_7d", "smoothed_wfelt_isolated_7d", "smoothed_worried_become_ill", "smoothed_wworried_become_ill", "smoothed_inperson_school_fulltime", "smoothed_winperson_school_fulltime", "smoothed_inperson_school_parttime", "smoothed_winperson_school_parttime", ["smoothed_vaccine_barrier_appointment_time_tried", "msa"], ["smoothed_vaccine_barrier_childcare_tried", "msa"], ["smoothed_vaccine_barrier_document_tried", "msa"], ["smoothed_vaccine_barrier_eligible_tried", "msa"], ["smoothed_vaccine_barrier_language_tried", "msa"], ["smoothed_vaccine_barrier_no_appointments_tried", "msa"], ["smoothed_vaccine_barrier_none_tried", "msa"], ["smoothed_vaccine_barrier_technical_difficulties_tried", "msa"], ["smoothed_vaccine_barrier_technology_access_tried", "msa"], ["smoothed_vaccine_barrier_time_tried", "msa"], ["smoothed_vaccine_barrier_travel_tried", "msa"], ["smoothed_vaccine_barrier_type_tried", "msa"], ["smoothed_wvaccine_barrier_appointment_time_tried", "msa"], ["smoothed_wvaccine_barrier_childcare_tried", "msa"], ["smoothed_wvaccine_barrier_document_tried", "msa"], ["smoothed_wvaccine_barrier_eligible_tried", "msa"], ["smoothed_wvaccine_barrier_language_tried", "msa"], ["smoothed_wvaccine_barrier_no_appointments_tried", "msa"], ["smoothed_wvaccine_barrier_none_tried", "msa"], ["smoothed_wvaccine_barrier_technical_difficulties_tried", "msa"], ["smoothed_wvaccine_barrier_technology_access_tried", "msa"], ["smoothed_wvaccine_barrier_time_tried", "msa"], ["smoothed_wvaccine_barrier_travel_tried", "msa"], ["smoothed_wvaccine_barrier_type_tried", "msa"]] }, "indicator-combination": { "max_age": 4, From c2bcb477955a9ccc8eb7755b6a5b2d9927b26b99 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Fri, 3 Sep 2021 12:50:59 -0400 Subject: [PATCH 075/133] set weight field names in fread --- facebook/delphiFacebook/R/weights.R | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/facebook/delphiFacebook/R/weights.R b/facebook/delphiFacebook/R/weights.R index 30dcaf8de..67814f1d1 100644 --- a/facebook/delphiFacebook/R/weights.R +++ b/facebook/delphiFacebook/R/weights.R @@ -61,10 +61,15 @@ join_weights <- function(data, params, weights = c("step1", "full")) weights_files <- dir(params$weights_in_dir, pattern = pattern, full.names = TRUE) weights_files <- sort(weights_files) + + col_types <- c("character", "double") + col_names <- c("cid", "weight") agg_weights <- bind_rows(lapply( weights_files, fread, - colClasses = c(cid="character", weight="double")) + colClasses = col_types, + col.names = col_names + ) ) agg_weights <- agg_weights[!duplicated(cid),] data <- left_join(data, agg_weights, by = c("token" = "cid")) From d420a2e83f3069f200ab55c46937ac4da2ccc4e2 Mon Sep 17 00:00:00 2001 From: Delphi Deploy Bot Date: Tue, 7 Sep 2021 19:59:22 +0000 Subject: [PATCH 076/133] chore: bump delphi_utils to 0.1.11 --- _delphi_utils_python/.bumpversion.cfg | 2 +- _delphi_utils_python/delphi_utils/__init__.py | 2 +- _delphi_utils_python/setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/_delphi_utils_python/.bumpversion.cfg b/_delphi_utils_python/.bumpversion.cfg index 2e807e6e0..cc436606c 100644 --- a/_delphi_utils_python/.bumpversion.cfg +++ b/_delphi_utils_python/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.1.10 +current_version = 0.1.11 commit = True message = chore: bump delphi_utils to {new_version} tag = False diff --git a/_delphi_utils_python/delphi_utils/__init__.py b/_delphi_utils_python/delphi_utils/__init__.py index 7c4b19eb1..0c6a51026 100644 --- a/_delphi_utils_python/delphi_utils/__init__.py +++ b/_delphi_utils_python/delphi_utils/__init__.py @@ -14,4 +14,4 @@ from .signal import add_prefix from .nancodes import Nans -__version__ = "0.1.10" +__version__ = "0.1.11" diff --git a/_delphi_utils_python/setup.py b/_delphi_utils_python/setup.py index 86a76ab9d..805755ee2 100644 --- a/_delphi_utils_python/setup.py +++ b/_delphi_utils_python/setup.py @@ -24,7 +24,7 @@ setup( name="delphi_utils", - version="0.1.10", + version="0.1.11", description="Shared Utility Functions for Indicators", long_description=long_description, long_description_content_type="text/markdown", From 2657fdb5cb810b0c868ed135b0f7033d92ef56a3 Mon Sep 17 00:00:00 2001 From: Delphi Deploy Bot Date: Tue, 7 Sep 2021 19:59:22 +0000 Subject: [PATCH 077/133] chore: bump covidcast-indicators to 0.1.14 --- .bumpversion.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 4f428631d..cc9020acd 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.1.13 +current_version = 0.1.14 commit = True message = chore: bump covidcast-indicators to {new_version} tag = False From fc09f497af42f4975f1c155def8bc12ea0c2d59a Mon Sep 17 00:00:00 2001 From: alexcoda Date: Thu, 2 Sep 2021 18:32:31 -0700 Subject: [PATCH 078/133] clean up organization and docstring for get_geos_within method --- _delphi_utils_python/delphi_utils/geomap.py | 63 ++++++++++----------- 1 file changed, 29 insertions(+), 34 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/geomap.py b/_delphi_utils_python/delphi_utils/geomap.py index 366272d24..435228a70 100644 --- a/_delphi_utils_python/delphi_utils/geomap.py +++ b/_delphi_utils_python/delphi_utils/geomap.py @@ -44,8 +44,8 @@ "pop": join(DATA_PATH, "state_pop.csv") }, "jhu_uid": {"fips": join(DATA_PATH, "jhu_uid_fips_table.csv")}, - "hhs": {"pop": join(DATA_PATH, "hhs_pop.csv"),}, - "nation": {"pop": join(DATA_PATH, "nation_pop.csv"),}, + "hhs": {"pop": join(DATA_PATH, "hhs_pop.csv")}, + "nation": {"pop": join(DATA_PATH, "nation_pop.csv")}, } @@ -195,10 +195,10 @@ def _load_crosswalk_from_file(self, from_code, to_code): } elif (from_code, to_code) == ("fips", "state"): dtype = { - "fips": str, - "state_code": str, - "state_id": str, - "state_name": str, + "fips": str, + "state_code": str, + "state_id": str, + "state_name": str, } # Population tables @@ -556,6 +556,7 @@ def as_mapper_name(self, geo_type, state="state_id"): if geo_type == "county": return "fips" return geo_type + def get_geo_values(self, geo_type): """ Return a set of all values for a given geography type. @@ -596,50 +597,44 @@ def get_geo_values(self, geo_type): self.geo_lists[geo_type] = set(crosswalk[geo_type]) return self.geo_lists[geo_type] - def get_geos_within(self, container_geocode, contained_geocode_type,container_geocode_type): + def get_geos_within(self, container_geocode, contained_geocode_type, container_geocode_type): """ - Return all contained regions within same container geocode. + Return all contained regions of the given type within the given container geocode. + + Given a container_geocode (e.g "ca" for California) of a container_geocode_type + (e.g "state"), return: + - all (contained_geocode_type) within that (container_geocode_type) - Given a container geocode (e.g. "ca" for California, a state) - and an enclosed contained geocode type (e.g. "county"). - return a set of container geocode value of the specified type that - lie within the specified geo code (e.g. all counties within California) - Support these 3 types: + Supports these 3 combinations: - all states within a nation - all counties within a state - all states within an hhs region Parameters ---------- - container_geocode: str of identity of nation/state/hhs - "fips" for return container_geocode of state - "state_id" for return container_geocode of nation and hhs + container_geocode: str + Instance of nation/state/hhs to find the sub-regions of contained_geocode_type: str - One of "state","county" + The subregion type to get all instance of. One of "state", "county" container_geocode_type: str - One of "state","nation","hhs" + The parent region type. One of "state", "nation", "hhs" Returns ------- - Set of geo ids of the specified type that lie within the specified container geocode, - all in string format. + Set of geo code strings of the given type that lie within the given container geocode. """ - if contained_geocode_type not in ("county","state"): - raise ValueError("contained_geocode_type must be one of state, nation and hhs") - geo_values=set() - if contained_geocode_type=="state": - if container_geocode_type=="nation" and container_geocode=="us": + if contained_geocode_type == "state": + if container_geocode_type == "nation" and container_geocode == "us": crosswalk = self._load_crosswalk_from_file("state", "state") - geo_values=set(crosswalk["state_id"]) - if container_geocode_type=="hhs": + return set(crosswalk["state_id"]) + if container_geocode_type == "hhs": crosswalk_hhs = self._load_crosswalk_from_file("fips", "hhs") crosswalk_state = self._load_crosswalk_from_file("fips", "state") - fips_hhs=crosswalk_hhs[crosswalk_hhs["hhs"] == container_geocode]["fips"] - fips_state_id=crosswalk_state[crosswalk_state["fips"].isin(fips_hhs)]["state_id"] - geo_values.update(fips_state_id) - elif contained_geocode_type=="county" and container_geocode_type=="state": + fips_hhs = crosswalk_hhs[crosswalk_hhs["hhs"] == container_geocode]["fips"] + return set(crosswalk_state[crosswalk_state["fips"].isin(fips_hhs)]["state_id"]) + elif contained_geocode_type == "county" and container_geocode_type == "state": crosswalk = self._load_crosswalk_from_file("fips", "state") - geo_values=crosswalk[crosswalk["state_id"]==container_geocode]["fips"] + return set(crosswalk[crosswalk["state_id"] == container_geocode]["fips"]) else: - raise ValueError("Do not satisfied the reqirement") - return geo_values + raise ValueError("(contained_geocode_type, container_geocode_type) must be one of " + "(state, nation), (state, hhs), (county, state)") From a358dcd51435a05b176de812a196d1ade4f172bd Mon Sep 17 00:00:00 2001 From: alexcoda Date: Thu, 2 Sep 2021 18:37:49 -0700 Subject: [PATCH 079/133] Make docstring arguments up-to-date. --- _delphi_utils_python/delphi_utils/geomap.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/geomap.py b/_delphi_utils_python/delphi_utils/geomap.py index 435228a70..f069cc3cf 100644 --- a/_delphi_utils_python/delphi_utils/geomap.py +++ b/_delphi_utils_python/delphi_utils/geomap.py @@ -107,11 +107,6 @@ def __init__(self): """Initialize geomapper. Holds loading the crosswalk tables until a conversion function is first used. - - Parameters - --------- - crosswalk_files : dict - A dictionary of the filenames for the crosswalk tables. """ self.crosswalk_filepaths = CROSSWALK_FILEPATHS self.crosswalks = { @@ -464,6 +459,8 @@ def add_population_column(self, data, geocode_type, geocode_col=None, dropna=Tru geocode_col: str, default None The name of the column containing the geocodes. If None, uses the geocode_type as the name. + dropna: bool, default True + Determine whether to drop rows with no population data. Returns -------- From 198dd29fe64de2fd509b23b70081cbb4cc2c6855 Mon Sep 17 00:00:00 2001 From: alexcoda Date: Thu, 2 Sep 2021 18:56:21 -0700 Subject: [PATCH 080/133] fix lint --- _delphi_utils_python/delphi_utils/geomap.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/geomap.py b/_delphi_utils_python/delphi_utils/geomap.py index f069cc3cf..c1dd7aa7c 100644 --- a/_delphi_utils_python/delphi_utils/geomap.py +++ b/_delphi_utils_python/delphi_utils/geomap.py @@ -632,6 +632,5 @@ def get_geos_within(self, container_geocode, contained_geocode_type, container_g elif contained_geocode_type == "county" and container_geocode_type == "state": crosswalk = self._load_crosswalk_from_file("fips", "state") return set(crosswalk[crosswalk["state_id"] == container_geocode]["fips"]) - else: - raise ValueError("(contained_geocode_type, container_geocode_type) must be one of " - "(state, nation), (state, hhs), (county, state)") + raise ValueError("(contained_geocode_type, container_geocode_type) must be one of " + "(state, nation), (state, hhs), (county, state)") From 180ed9a0a71f0afad12c9695c963bc5c5b3ea83c Mon Sep 17 00:00:00 2001 From: Alex Coda Date: Mon, 6 Sep 2021 16:06:22 -0700 Subject: [PATCH 081/133] Update _delphi_utils_python/delphi_utils/geomap.py Co-authored-by: Katie Mazaitis --- _delphi_utils_python/delphi_utils/geomap.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/geomap.py b/_delphi_utils_python/delphi_utils/geomap.py index c1dd7aa7c..944d040dd 100644 --- a/_delphi_utils_python/delphi_utils/geomap.py +++ b/_delphi_utils_python/delphi_utils/geomap.py @@ -598,9 +598,9 @@ def get_geos_within(self, container_geocode, contained_geocode_type, container_g """ Return all contained regions of the given type within the given container geocode. - Given a container_geocode (e.g "ca" for California) of a container_geocode_type + Given container_geocode (e.g "ca" for California) of type container_geocode_type (e.g "state"), return: - - all (contained_geocode_type) within that (container_geocode_type) + - all (contained_geocode_type)s within container_geocode Supports these 3 combinations: - all states within a nation From 9ce067069f0cd112c7c179a20a35d023422d019e Mon Sep 17 00:00:00 2001 From: Alex Coda Date: Mon, 6 Sep 2021 16:06:37 -0700 Subject: [PATCH 082/133] Update _delphi_utils_python/delphi_utils/geomap.py Co-authored-by: Katie Mazaitis --- _delphi_utils_python/delphi_utils/geomap.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_delphi_utils_python/delphi_utils/geomap.py b/_delphi_utils_python/delphi_utils/geomap.py index 944d040dd..e6d95b2e1 100644 --- a/_delphi_utils_python/delphi_utils/geomap.py +++ b/_delphi_utils_python/delphi_utils/geomap.py @@ -612,7 +612,7 @@ def get_geos_within(self, container_geocode, contained_geocode_type, container_g container_geocode: str Instance of nation/state/hhs to find the sub-regions of contained_geocode_type: str - The subregion type to get all instance of. One of "state", "county" + The subregion type to retrieve. One of "state", "county" container_geocode_type: str The parent region type. One of "state", "nation", "hhs" From d4f8bf1f839b647cb0b631086715a848d7470113 Mon Sep 17 00:00:00 2001 From: alexcoda Date: Mon, 6 Sep 2021 16:11:24 -0700 Subject: [PATCH 083/133] Include given values in get_geos_within error message --- _delphi_utils_python/delphi_utils/geomap.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_delphi_utils_python/delphi_utils/geomap.py b/_delphi_utils_python/delphi_utils/geomap.py index e6d95b2e1..9ee5dfc4e 100644 --- a/_delphi_utils_python/delphi_utils/geomap.py +++ b/_delphi_utils_python/delphi_utils/geomap.py @@ -632,5 +632,6 @@ def get_geos_within(self, container_geocode, contained_geocode_type, container_g elif contained_geocode_type == "county" and container_geocode_type == "state": crosswalk = self._load_crosswalk_from_file("fips", "state") return set(crosswalk[crosswalk["state_id"] == container_geocode]["fips"]) - raise ValueError("(contained_geocode_type, container_geocode_type) must be one of " + raise ValueError("(contained_geocode_type, container_geocode_type) was " + f"({contained_geocode_type}, {container_geocode_type}), but must be one of " "(state, nation), (state, hhs), (county, state)") From 6573b0848c55d4403a42f3a1bd9fde8655387ae6 Mon Sep 17 00:00:00 2001 From: alexcoda Date: Mon, 6 Sep 2021 17:34:33 -0700 Subject: [PATCH 084/133] Remove caching in geomap.py For both the crosswalk data and geo values, we now load these fully when the class is initialized, and store them for later use. Co-Authored-By: chinandrew <20176218+chinandrew@users.noreply.github.com> --- _delphi_utils_python/delphi_utils/geomap.py | 196 +++++++++--------- _delphi_utils_python/tests/test_geomap.py | 133 ++++++------ .../delphi_combo_cases_and_deaths/run.py | 2 +- google_symptoms/delphi_google_symptoms/geo.py | 4 +- .../delphi_quidel_covidtest/geo_maps.py | 4 +- 5 files changed, 167 insertions(+), 172 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/geomap.py b/_delphi_utils_python/delphi_utils/geomap.py index 9ee5dfc4e..186f3cc65 100644 --- a/_delphi_utils_python/delphi_utils/geomap.py +++ b/_delphi_utils_python/delphi_utils/geomap.py @@ -14,40 +14,6 @@ import pkg_resources from pandas.api.types import is_string_dtype -DATA_PATH = "data" -CROSSWALK_FILEPATHS = { - "zip": { - "fips": join(DATA_PATH, "zip_fips_table.csv"), - "hrr": join(DATA_PATH, "zip_hrr_table.csv"), - "msa": join(DATA_PATH, "zip_msa_table.csv"), - "pop": join(DATA_PATH, "zip_pop.csv"), - "state": join(DATA_PATH, "zip_state_code_table.csv"), - "hhs": join(DATA_PATH, "zip_hhs_table.csv") - }, - "fips": { - "zip": join(DATA_PATH, "fips_zip_table.csv"), - "hrr": join(DATA_PATH, "fips_hrr_table.csv"), - "msa": join(DATA_PATH, "fips_msa_table.csv"), - "pop": join(DATA_PATH, "fips_pop.csv"), - "state": join(DATA_PATH, "fips_state_table.csv"), - "hhs": join(DATA_PATH, "fips_hhs_table.csv"), - }, - "state": {"state": join(DATA_PATH, "state_codes_table.csv")}, - "state_code": { - "hhs": join(DATA_PATH, "state_code_hhs_table.csv"), - "pop": join(DATA_PATH, "state_pop.csv") - }, - "state_id": { - "pop": join(DATA_PATH, "state_pop.csv") - }, - "state_name": { - "pop": join(DATA_PATH, "state_pop.csv") - }, - "jhu_uid": {"fips": join(DATA_PATH, "jhu_uid_fips_table.csv")}, - "hhs": {"pop": join(DATA_PATH, "hhs_pop.csv")}, - "nation": {"pop": join(DATA_PATH, "nation_pop.csv")}, -} - class GeoMapper: # pylint: disable=too-many-public-methods """Geo mapping tools commonly used in Delphi. @@ -103,13 +69,43 @@ class GeoMapper: # pylint: disable=too-many-public-methods date_col="timestamp", dropna=False) """ - def __init__(self): - """Initialize geomapper. + DATA_PATH = "data" + CROSSWALK_FILEPATHS = { + "zip": { + "fips": join(DATA_PATH, "zip_fips_table.csv"), + "hrr": join(DATA_PATH, "zip_hrr_table.csv"), + "msa": join(DATA_PATH, "zip_msa_table.csv"), + "pop": join(DATA_PATH, "zip_pop.csv"), + "state": join(DATA_PATH, "zip_state_code_table.csv"), + "hhs": join(DATA_PATH, "zip_hhs_table.csv") + }, + "fips": { + "zip": join(DATA_PATH, "fips_zip_table.csv"), + "hrr": join(DATA_PATH, "fips_hrr_table.csv"), + "msa": join(DATA_PATH, "fips_msa_table.csv"), + "pop": join(DATA_PATH, "fips_pop.csv"), + "state": join(DATA_PATH, "fips_state_table.csv"), + "hhs": join(DATA_PATH, "fips_hhs_table.csv"), + }, + "state": {"state": join(DATA_PATH, "state_codes_table.csv")}, + "state_code": { + "hhs": join(DATA_PATH, "state_code_hhs_table.csv"), + "pop": join(DATA_PATH, "state_pop.csv") + }, + "state_id": { + "pop": join(DATA_PATH, "state_pop.csv") + }, + "state_name": { + "pop": join(DATA_PATH, "state_pop.csv") + }, + "jhu_uid": {"fips": join(DATA_PATH, "jhu_uid_fips_table.csv")}, + "hhs": {"pop": join(DATA_PATH, "hhs_pop.csv")}, + "nation": {"pop": join(DATA_PATH, "nation_pop.csv")}, + } - Holds loading the crosswalk tables until a conversion function is first used. - """ - self.crosswalk_filepaths = CROSSWALK_FILEPATHS - self.crosswalks = { + def __init__(self): + """Initialize geomapper.""" + self._crosswalks = { "zip": { geo: None for geo in ["fips", "hrr", "msa", "pop", "state", "hhs"] }, @@ -124,29 +120,21 @@ def __init__(self): "nation": {"pop": None}, "jhu_uid": {"fips": None}, } - self.geo_lists = { + self._geo_sets = { geo: None for geo in ["zip", "fips", "hrr", "state_id", "state_code", - "state_name", "hhs", "msa"] + "state_name", "hhs", "msa", "nation"] } - self.geo_lists["nation"] = {"us"} - - # Utility functions - def _load_crosswalk(self, from_code, to_code): - """Load the crosswalk from from_code -> to_code.""" - assert from_code in self.crosswalk_filepaths, \ - f"No crosswalk files for {from_code}; try {'; '.join(self.crosswalk_filepaths.keys())}" - assert to_code in self.crosswalk_filepaths[from_code], \ - f"No crosswalk file from {from_code} to {to_code}; try " \ - f"{'; '.join(self.crosswalk_filepaths[from_code].keys())}" - - if self.crosswalks[from_code][to_code] is None: - self.crosswalks[from_code][to_code] = self._load_crosswalk_from_file(from_code, to_code) - return self.crosswalks[from_code][to_code] - - def _load_crosswalk_from_file(self, from_code, to_code): - stream = pkg_resources.resource_stream( - __name__, self.crosswalk_filepaths[from_code][to_code] - ) + + for from_code, to_codes in self.CROSSWALK_FILEPATHS.items(): + for to_code, file_path in to_codes.items(): + self._crosswalks[from_code][to_code] = \ + self._load_crosswalk_from_file(from_code, to_code, file_path) + + for geo_type in self._geo_sets: + self._geo_sets[geo_type] = self._load_geo_values(geo_type) + + def _load_crosswalk_from_file(self, from_code, to_code, data_path): + stream = pkg_resources.resource_stream(__name__, data_path) usecols = None dtype = None # Weighted crosswalks @@ -208,6 +196,22 @@ def _load_crosswalk_from_file(self, from_code, to_code): ] return pd.read_csv(stream, dtype=dtype, usecols=usecols) + def _load_geo_values(self, geo_type): + if geo_type == "nation": + return {"us"} + + if geo_type.startswith("state"): + to_code = from_code = "state" + elif geo_type == "fips": + from_code = "fips" + to_code = "pop" + else: + from_code = "fips" + to_code = geo_type + + crosswalk = self._crosswalks[from_code][to_code] + return set(crosswalk[geo_type]) + @staticmethod def convert_fips_to_mega(data, fips_col="fips", mega_col="megafips"): """Convert fips string to a megafips string.""" @@ -325,17 +329,17 @@ def add_geocode( # state codes are all stored in one table if from_code in state_codes and new_code in state_codes: - crosswalk = self._load_crosswalk(from_code="state", to_code="state") + crosswalk = self._crosswalks["state"]["state"] crosswalk = crosswalk.rename( columns={from_code: from_col, new_code: new_col} ) elif new_code in state_codes: - crosswalk = self._load_crosswalk(from_code=from_code, to_code="state") + crosswalk = self._crosswalks[from_code]["state"] crosswalk = crosswalk.rename( columns={from_code: from_col, new_code: new_col} ) else: - crosswalk = self._load_crosswalk(from_code=from_code, to_code=new_code) + crosswalk = self._crosswalks[from_code][new_code] crosswalk = crosswalk.rename( columns={from_code: from_col, new_code: new_col} ) @@ -474,7 +478,7 @@ def add_population_column(self, data, geocode_type, geocode_col=None, dropna=Tru raise ValueError( f"Only {supported_geos} geocodes supported. For other codes, aggregate those." ) - pop_df = self._load_crosswalk(from_code=geocode_type, to_code="pop") + pop_df = self._crosswalks[geocode_type]["pop"] if not is_string_dtype(data[geocode_col]): if geocode_type in ["zip", "fips"]: data[geocode_col] = data[geocode_col].astype(str).str.zfill(5) @@ -554,19 +558,29 @@ def as_mapper_name(self, geo_type, state="state_id"): return "fips" return geo_type + def get_crosswalk(self, from_code, to_code): + """Return a dataframe mapping the given geocodes. + + Parameters + ---------- + from_code: str + The geo type to translate from. + to_code: str + The geo type (or "pop" for population) to translate to. + + Returns + ------- + A dataframe containing columbs with the two specified geo types. + """ + try: + return self._crosswalks[from_code][to_code] + except KeyError as e: + raise ValueError(f'Mapping from "{from_code}" to "{to_code}" not found.') from e + def get_geo_values(self, geo_type): """ Return a set of all values for a given geography type. - Uses the same caching paradigm as _load_crosswalks, storing the value from previous calls - and not re-reading the CSVs if the same geo type is requested multiple times. Does not - share the same crosswalk cache to keep complexity down. - - Reads the FIPS crosswalk files by default for reference data since those have mappings to - all other geos. Exceptions are nation, which has no mapping file and is hard-coded as 'us', - and state, which uses the state codes table since the fips/state mapping doesn't include - all territories. - Parameters ---------- geo_type: str @@ -577,22 +591,10 @@ def get_geo_values(self, geo_type): ------- Set of geo values, all in string format. """ - if self.geo_lists[geo_type]: # pylint: disable=no-else-return - return self.geo_lists[geo_type] - else: - from_code = "fips" - if geo_type.startswith("state"): - to_code = from_code = "state" - elif geo_type == "fips": - to_code = "pop" - else: - to_code = geo_type - stream = pkg_resources.resource_stream( - __name__, self.crosswalk_filepaths[from_code][to_code] - ) - crosswalk = pd.read_csv(stream, dtype=str) - self.geo_lists[geo_type] = set(crosswalk[geo_type]) - return self.geo_lists[geo_type] + try: + return self._geo_sets[geo_type] + except KeyError as e: + raise ValueError(f'Given geo type "{geo_type}" not found') from e def get_geos_within(self, container_geocode, contained_geocode_type, container_geocode_type): """ @@ -622,16 +624,16 @@ def get_geos_within(self, container_geocode, contained_geocode_type, container_g """ if contained_geocode_type == "state": if container_geocode_type == "nation" and container_geocode == "us": - crosswalk = self._load_crosswalk_from_file("state", "state") - return set(crosswalk["state_id"]) + crosswalk = self._crosswalks["state"]["state"] + return set(crosswalk["state_id"]) # pylint: disable=unsubscriptable-object if container_geocode_type == "hhs": - crosswalk_hhs = self._load_crosswalk_from_file("fips", "hhs") - crosswalk_state = self._load_crosswalk_from_file("fips", "state") + crosswalk_hhs = self._crosswalks["fips"]["hhs"] + crosswalk_state = self._crosswalks["fips"]["state"] fips_hhs = crosswalk_hhs[crosswalk_hhs["hhs"] == container_geocode]["fips"] return set(crosswalk_state[crosswalk_state["fips"].isin(fips_hhs)]["state_id"]) elif contained_geocode_type == "county" and container_geocode_type == "state": - crosswalk = self._load_crosswalk_from_file("fips", "state") + crosswalk = self._crosswalks["fips"]["state"] return set(crosswalk[crosswalk["state_id"] == container_geocode]["fips"]) raise ValueError("(contained_geocode_type, container_geocode_type) was " - f"({contained_geocode_type}, {container_geocode_type}), but must be one of " - "(state, nation), (state, hhs), (county, state)") + f"({contained_geocode_type}, {container_geocode_type}), but " + f"must be one of (state, nation), (state, hhs), (county, state)") diff --git a/_delphi_utils_python/tests/test_geomap.py b/_delphi_utils_python/tests/test_geomap.py index b738d5808..67751dafa 100644 --- a/_delphi_utils_python/tests/test_geomap.py +++ b/_delphi_utils_python/tests/test_geomap.py @@ -6,6 +6,11 @@ import numpy as np +@pytest.fixture(scope="class") +def geomapper(): + return GeoMapper() + + class TestGeoMapper: fips_data = pd.DataFrame( { @@ -135,117 +140,107 @@ class TestGeoMapper: # jhu_big_data = pd.read_csv("test_dir/small_deaths.csv") # Loading tests updated 8/26 - def test_crosswalks(self): + def test_crosswalks(self, geomapper): # These tests ensure that the one-to-many crosswalks have properly normalized weights - gmpr = GeoMapper() # FIPS -> HRR is allowed to be an incomplete mapping, since only a fraction of a FIPS # code can not belong to an HRR - cw = gmpr._load_crosswalk(from_code="fips", to_code="hrr") + cw = geomapper.get_crosswalk(from_code="fips", to_code="hrr") assert ( cw.groupby("fips")["weight"].sum().round(5).ge(0.95).all() ) # some weight discrepancy is fine for HRR - cw = gmpr._load_crosswalk(from_code="fips", to_code="zip") + cw = geomapper.get_crosswalk(from_code="fips", to_code="zip") assert cw.groupby("fips")["weight"].sum().round(5).eq(1.0).all() - cw = gmpr._load_crosswalk(from_code="jhu_uid", to_code="fips") + cw = geomapper.get_crosswalk(from_code="jhu_uid", to_code="fips") assert cw.groupby("jhu_uid")["weight"].sum().round(5).eq(1.0).all() - cw = gmpr._load_crosswalk(from_code="zip", to_code="fips") + cw = geomapper.get_crosswalk(from_code="zip", to_code="fips") assert cw.groupby("zip")["weight"].sum().round(5).eq(1.0).all() # weight discrepancy is fine for MSA, for the same reasons as HRR - # cw = gmpr.load_crosswalk(from_code="zip", to_code="msa") + # cw = geomapper.get_crosswalk(from_code="zip", to_code="msa") # assert cw.groupby("zip")["weight"].sum().round(5).eq(1.0).all() - cw = gmpr._load_crosswalk(from_code="zip", to_code="state") + cw = geomapper.get_crosswalk(from_code="zip", to_code="state") assert cw.groupby("zip")["weight"].sum().round(5).eq(1.0).all() - cw = gmpr._load_crosswalk(from_code="zip", to_code="hhs") + cw = geomapper.get_crosswalk(from_code="zip", to_code="hhs") assert cw.groupby("zip")["weight"].sum().round(5).eq(1.0).all() - def test_load_zip_fips_table(self): - gmpr = GeoMapper() - fips_data = gmpr._load_crosswalk(from_code="zip", to_code="fips") + def test_load_zip_fips_table(self, geomapper): + fips_data = geomapper.get_crosswalk(from_code="zip", to_code="fips") assert set(fips_data.columns) == set(["zip", "fips", "weight"]) assert pd.api.types.is_string_dtype(fips_data.zip) assert pd.api.types.is_string_dtype(fips_data.fips) assert pd.api.types.is_float_dtype(fips_data.weight) - def test_load_state_table(self): - gmpr = GeoMapper() - state_data = gmpr._load_crosswalk(from_code="state", to_code="state") + def test_load_state_table(self, geomapper): + state_data = geomapper.get_crosswalk(from_code="state", to_code="state") assert tuple(state_data.columns) == ("state_code", "state_id", "state_name") assert state_data.shape[0] == 60 - def test_load_fips_msa_table(self): - gmpr = GeoMapper() - msa_data = gmpr._load_crosswalk(from_code="fips", to_code="msa") + def test_load_fips_msa_table(self, geomapper): + msa_data = geomapper.get_crosswalk(from_code="fips", to_code="msa") assert tuple(msa_data.columns) == ("fips", "msa") - def test_load_jhu_uid_fips_table(self): - gmpr = GeoMapper() - jhu_data = gmpr._load_crosswalk(from_code="jhu_uid", to_code="fips") + def test_load_jhu_uid_fips_table(self, geomapper): + jhu_data = geomapper.get_crosswalk(from_code="jhu_uid", to_code="fips") assert np.allclose(jhu_data.groupby("jhu_uid").sum(), 1.0) - def test_load_zip_hrr_table(self): - gmpr = GeoMapper() - zip_data = gmpr._load_crosswalk(from_code="zip", to_code="hrr") + def test_load_zip_hrr_table(self, geomapper): + zip_data = geomapper.get_crosswalk(from_code="zip", to_code="hrr") assert pd.api.types.is_string_dtype(zip_data["zip"]) assert pd.api.types.is_string_dtype(zip_data["hrr"]) - def test_megacounty(self): - gmpr = GeoMapper() - new_data = gmpr.fips_to_megacounty(self.mega_data, 6, 50) + def test_megacounty(self, geomapper): + new_data = geomapper.fips_to_megacounty(self.mega_data, 6, 50) assert ( new_data[["count", "visits"]].sum() - self.mega_data[["count", "visits"]].sum() ).sum() < 1e-3 with pytest.raises(ValueError): - new_data = gmpr.megacounty_creation( + new_data = geomapper.megacounty_creation( self.mega_data_2, 6, 50, thr_col="_thr_col_roll" ) - new_data = gmpr.fips_to_megacounty( + new_data = geomapper.fips_to_megacounty( self.mega_data, 6, 50, count_cols=["count", "visits"] ) assert ( new_data[["count"]].sum() - self.mega_data[["count"]].sum() ).sum() < 1e-3 - def test_add_population_column(self): - gmpr = GeoMapper() - new_data = gmpr.add_population_column(self.fips_data_3, "fips") + def test_add_population_column(self, geomapper): + new_data = geomapper.add_population_column(self.fips_data_3, "fips") assert new_data.shape == (5, 5) - new_data = gmpr.add_population_column(self.zip_data, "zip") + new_data = geomapper.add_population_column(self.zip_data, "zip") assert new_data.shape == (6, 5) with pytest.raises(ValueError): - new_data = gmpr.add_population_column(self.zip_data, "hrr") - new_data = gmpr.add_population_column(self.fips_data_5, "fips") + new_data = geomapper.add_population_column(self.zip_data, "hrr") + new_data = geomapper.add_population_column(self.fips_data_5, "fips") assert new_data.shape == (4, 5) - new_data = gmpr.add_population_column(self.state_data, "state_code") + new_data = geomapper.add_population_column(self.state_data, "state_code") assert new_data.shape == (3, 3) - new_data = gmpr.add_population_column(self.hhs_data, "hhs") + new_data = geomapper.add_population_column(self.hhs_data, "hhs") assert new_data.shape == (3, 3) - new_data = gmpr.add_population_column(self.nation_data, "nation") + new_data = geomapper.add_population_column(self.nation_data, "nation") assert new_data.shape == (1, 3) - def test_add_geocode(self): - gmpr = GeoMapper() - + def test_add_geocode(self, geomapper): # state_code -> nation - new_data = gmpr.add_geocode(self.zip_data, "zip", "state_code") - new_data2 = gmpr.add_geocode(new_data, "state_code", "nation") + new_data = geomapper.add_geocode(self.zip_data, "zip", "state_code") + new_data2 = geomapper.add_geocode(new_data, "state_code", "nation") assert new_data2["nation"].unique()[0] == "us" # state_code -> hhs - new_data = gmpr.add_geocode(self.zip_data, "zip", "state_code") - new_data2 = gmpr.add_geocode(new_data, "state_code", "hhs") + new_data = geomapper.add_geocode(self.zip_data, "zip", "state_code") + new_data2 = geomapper.add_geocode(new_data, "state_code", "hhs") assert new_data2["hhs"].unique().size == 2 # state_name -> state_id - new_data = gmpr.replace_geocode(self.zip_data, "zip", "state_name") - new_data2 = gmpr.add_geocode(new_data, "state_name", "state_id") + new_data = geomapper.replace_geocode(self.zip_data, "zip", "state_name") + new_data2 = geomapper.add_geocode(new_data, "state_name", "state_id") assert new_data2.shape == (4, 5) - new_data2 = gmpr.replace_geocode(new_data, "state_name", "state_id", new_col="abbr") + new_data2 = geomapper.replace_geocode(new_data, "state_name", "state_id", new_col="abbr") assert "abbr" in new_data2.columns # fips -> nation - new_data = gmpr.replace_geocode(self.fips_data_5, "fips", "nation", new_col="NATION") + new_data = geomapper.replace_geocode(self.fips_data_5, "fips", "nation", new_col="NATION") pd.testing.assert_frame_equal( new_data, pd.DataFrame().from_dict( @@ -259,7 +254,7 @@ def test_add_geocode(self): ) # zip -> nation - new_data = gmpr.replace_geocode(self.zip_data, "zip", "nation") + new_data = geomapper.replace_geocode(self.zip_data, "zip", "nation") pd.testing.assert_frame_equal( new_data, pd.DataFrame().from_dict( @@ -277,15 +272,15 @@ def test_add_geocode(self): # hrr -> nation with pytest.raises(ValueError): - new_data = gmpr.replace_geocode(self.zip_data, "zip", "hrr") - new_data2 = gmpr.replace_geocode(new_data, "hrr", "nation") + new_data = geomapper.replace_geocode(self.zip_data, "zip", "hrr") + new_data2 = geomapper.replace_geocode(new_data, "hrr", "nation") # fips -> hrr (dropna=True/False check) - assert not gmpr.add_geocode(self.fips_data_3, "fips", "hrr").isna().any().any() - assert gmpr.add_geocode(self.fips_data_3, "fips", "hrr", dropna=False).isna().any().any() + assert not geomapper.add_geocode(self.fips_data_3, "fips", "hrr").isna().any().any() + assert geomapper.add_geocode(self.fips_data_3, "fips", "hrr", dropna=False).isna().any().any() # fips -> zip (date_col=None chech) - new_data = gmpr.replace_geocode(self.fips_data_5.drop(columns=["date"]), "fips", "hrr", date_col=None) + new_data = geomapper.replace_geocode(self.fips_data_5.drop(columns=["date"]), "fips", "hrr", date_col=None) pd.testing.assert_frame_equal( new_data, pd.DataFrame().from_dict( @@ -298,7 +293,7 @@ def test_add_geocode(self): ) # fips -> hhs - new_data = gmpr.replace_geocode(self.fips_data_3.drop(columns=["date"]), + new_data = geomapper.replace_geocode(self.fips_data_3.drop(columns=["date"]), "fips", "hhs", date_col=None) pd.testing.assert_frame_equal( new_data, @@ -312,7 +307,7 @@ def test_add_geocode(self): ) # zip -> hhs - new_data = gmpr.replace_geocode(self.zip_data, "zip", "hhs") + new_data = geomapper.replace_geocode(self.zip_data, "zip", "hhs") new_data = new_data.round(10) # get rid of a floating point error with 99.00000000000001 pd.testing.assert_frame_equal( new_data, @@ -327,17 +322,15 @@ def test_add_geocode(self): ) ) - def test_get_geos(self): - gmpr = GeoMapper() - assert gmpr.get_geo_values("nation") == {"us"} - assert gmpr.get_geo_values("hhs") == set(str(i) for i in range(1, 11)) - assert len(gmpr.get_geo_values("fips")) == 3235 - assert len(gmpr.get_geo_values("state_id")) == 60 - assert len(gmpr.get_geo_values("zip")) == 32976 + def test_get_geos(self, geomapper): + assert geomapper.get_geo_values("nation") == {"us"} + assert geomapper.get_geo_values("hhs") == set(str(i) for i in range(1, 11)) + assert len(geomapper.get_geo_values("fips")) == 3235 + assert len(geomapper.get_geo_values("state_id")) == 60 + assert len(geomapper.get_geo_values("zip")) == 32976 - def test_get_geos_within(self): - gmpr = GeoMapper() - assert len(gmpr.get_geos_within("us","state","nation")) == 60 - assert len(gmpr.get_geos_within("al","county","state")) == 68 - assert len(gmpr.get_geos_within("4","state","hhs")) == 8 - assert gmpr.get_geos_within("4","state","hhs") =={'al', 'fl', 'ga', 'ky', 'ms', 'nc', "tn", "sc"} + def test_get_geos_within(self, geomapper): + assert len(geomapper.get_geos_within("us","state","nation")) == 60 + assert len(geomapper.get_geos_within("al","county","state")) == 68 + assert len(geomapper.get_geos_within("4","state","hhs")) == 8 + assert geomapper.get_geos_within("4","state","hhs") =={'al', 'fl', 'ga', 'ky', 'ms', 'nc', "tn", "sc"} diff --git a/combo_cases_and_deaths/delphi_combo_cases_and_deaths/run.py b/combo_cases_and_deaths/delphi_combo_cases_and_deaths/run.py index f46567616..c54f3f3be 100755 --- a/combo_cases_and_deaths/delphi_combo_cases_and_deaths/run.py +++ b/combo_cases_and_deaths/delphi_combo_cases_and_deaths/run.py @@ -105,7 +105,7 @@ def merge_dfs_by_geos(usafacts_df, jhu_df, geo): jhu_df if jhu_df is None else jhu_df[jhu_df["geo_value"].str.startswith("72")]) # For MSA and HRR level, they are the same elif geo == 'msa': - df = GMPR._load_crosswalk("fips", "msa") # pylint: disable=protected-access + df = GMPR.get_crosswalk("fips", "msa") puerto_rico_mask = df["fips"].str.startswith("72") puerto_rico_msas = df[puerto_rico_mask]["msa"].unique() combined_df = maybe_append( diff --git a/google_symptoms/delphi_google_symptoms/geo.py b/google_symptoms/delphi_google_symptoms/geo.py index 1af3f3ce7..416869c08 100644 --- a/google_symptoms/delphi_google_symptoms/geo.py +++ b/google_symptoms/delphi_google_symptoms/geo.py @@ -23,7 +23,7 @@ def generate_transition_matrix(geo_res): The first is a data frame for HRR regions and the second are MSA regions. """ - map_df = gmpr._load_crosswalk("fips", geo_res) # pylint: disable=protected-access + map_df = gmpr.get_crosswalk("fips", geo_res) # Add population as weights map_df = gmpr.add_population_column(map_df, "fips") if geo_res == "hrr": @@ -58,7 +58,7 @@ def geo_map(df, geo_res): and columns for signal vals. The geo_id has been converted from fips to HRRs/MSAs """ - if geo_res in set(["county", "state"]): + if geo_res in {"county", "state"}: return df map_df = generate_transition_matrix(geo_res) diff --git a/quidel_covidtest/delphi_quidel_covidtest/geo_maps.py b/quidel_covidtest/delphi_quidel_covidtest/geo_maps.py index 91d3a7c70..406799c0f 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/geo_maps.py +++ b/quidel_covidtest/delphi_quidel_covidtest/geo_maps.py @@ -38,11 +38,11 @@ def add_parent_state(data, geo_res, geo_key): population (since a msa/hrr may span multiple states) - map from county to the corresponding state """ - fips_to_state = GMPR._load_crosswalk(from_code="fips", to_code="state") # pylint: disable=protected-access + fips_to_state = GMPR.get_crosswalk(from_code="fips", to_code="state") if geo_res == "county": mix_map = fips_to_state[["fips", "state_id"]] # pylint: disable=unsubscriptable-object else: - fips_to_geo_res = GMPR._load_crosswalk(from_code="fips", to_code=geo_res) # pylint: disable=protected-access + fips_to_geo_res = GMPR.get_crosswalk(from_code="fips", to_code=geo_res) mix_map = fips_to_geo_res[["fips", geo_res]].merge( fips_to_state[["fips", "state_id"]], # pylint: disable=unsubscriptable-object on="fips", From bf28950d3b4b6dacd59c899f44094575c92c10b2 Mon Sep 17 00:00:00 2001 From: alexcoda Date: Tue, 7 Sep 2021 17:46:27 -0700 Subject: [PATCH 085/133] Simplify _load_crosswalk_from_file method --- _delphi_utils_python/delphi_utils/geomap.py | 74 +++++---------------- 1 file changed, 15 insertions(+), 59 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/geomap.py b/_delphi_utils_python/delphi_utils/geomap.py index 186f3cc65..2781e3956 100644 --- a/_delphi_utils_python/delphi_utils/geomap.py +++ b/_delphi_utils_python/delphi_utils/geomap.py @@ -135,65 +135,21 @@ def __init__(self): def _load_crosswalk_from_file(self, from_code, to_code, data_path): stream = pkg_resources.resource_stream(__name__, data_path) - usecols = None - dtype = None - # Weighted crosswalks - if (from_code, to_code) in [ - ("zip", "fips"), - ("fips", "zip"), - ("jhu_uid", "fips"), - ("zip", "msa"), - ("fips", "hrr"), - ("zip", "hhs") - ]: - dtype = { - from_code: str, - to_code: str, - "weight": float, - } - - # Unweighted crosswalks - elif (from_code, to_code) in [ - ("zip", "hrr"), - ("fips", "msa"), - ("fips", "hhs"), - ("state_code", "hhs") - ]: - dtype = {from_code: str, to_code: str} - - # Special table of state codes, state IDs, and state names - elif (from_code, to_code) == ("state", "state"): - dtype = { - "state_code": str, - "state_id": str, - "state_name": str, - } - elif (from_code, to_code) == ("zip", "state"): - dtype = { - "zip": str, - "weight": float, - "state_code": str, - "state_id": str, - "state_name": str, - } - elif (from_code, to_code) == ("fips", "state"): - dtype = { - "fips": str, - "state_code": str, - "state_id": str, - "state_name": str, - } - - # Population tables - elif to_code == "pop": - dtype = { - from_code: str, - "pop": int, - } - usecols = [ - from_code, - "pop" - ] + dtype = { + from_code: str, + to_code: str, + "fips": str, + "zip": str, + "hrr": str, + "hhs": str, + "msa": str, + "state_code": str, + "state_id": str, + "state_name": str, + "pop": int, + "weight": float + } + usecols = [from_code, "pop"] if to_code == "pop" else None return pd.read_csv(stream, dtype=dtype, usecols=usecols) def _load_geo_values(self, geo_type): From 2e4c4c403fc4aba1d1642062745d5d04a9a8ea35 Mon Sep 17 00:00:00 2001 From: alexcoda Date: Tue, 7 Sep 2021 18:56:27 -0700 Subject: [PATCH 086/133] Add missing imports to run.py template --- _template_python/delphi_NAME/run.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/_template_python/delphi_NAME/run.py b/_template_python/delphi_NAME/run.py index 2ce037d8a..f57899ba4 100644 --- a/_template_python/delphi_NAME/run.py +++ b/_template_python/delphi_NAME/run.py @@ -14,16 +14,18 @@ unpublished signals are. See `delphi_utils.add_prefix()` - Any other indicator-specific settings """ -from datetime import timedelta -import pandas as pd import time +from datetime import timedelta, datetime +from itertools import product +import pandas as pd +from delphi_utils import get_structured_logger from delphi_utils.export import create_export_csv from delphi_utils.geomap import GeoMapper -from delphi_utils import get_structured_logger from .constants import GEOS, SIGNALS, SMOOTHERS + def run_module(params): """ Runs the indicator From cb34ad09df6d54717c83cd571f8e9b9239dfbf62 Mon Sep 17 00:00:00 2001 From: Delphi Deploy Bot Date: Wed, 8 Sep 2021 19:44:57 +0000 Subject: [PATCH 087/133] chore: bump delphi_utils to 0.1.12 --- _delphi_utils_python/.bumpversion.cfg | 2 +- _delphi_utils_python/delphi_utils/__init__.py | 2 +- _delphi_utils_python/setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/_delphi_utils_python/.bumpversion.cfg b/_delphi_utils_python/.bumpversion.cfg index cc436606c..2d7554882 100644 --- a/_delphi_utils_python/.bumpversion.cfg +++ b/_delphi_utils_python/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.1.11 +current_version = 0.1.12 commit = True message = chore: bump delphi_utils to {new_version} tag = False diff --git a/_delphi_utils_python/delphi_utils/__init__.py b/_delphi_utils_python/delphi_utils/__init__.py index 0c6a51026..6d0b523fd 100644 --- a/_delphi_utils_python/delphi_utils/__init__.py +++ b/_delphi_utils_python/delphi_utils/__init__.py @@ -14,4 +14,4 @@ from .signal import add_prefix from .nancodes import Nans -__version__ = "0.1.11" +__version__ = "0.1.12" diff --git a/_delphi_utils_python/setup.py b/_delphi_utils_python/setup.py index 805755ee2..906bd0a4e 100644 --- a/_delphi_utils_python/setup.py +++ b/_delphi_utils_python/setup.py @@ -24,7 +24,7 @@ setup( name="delphi_utils", - version="0.1.11", + version="0.1.12", description="Shared Utility Functions for Indicators", long_description=long_description, long_description_content_type="text/markdown", From 225e16dcab8f7a095e0934ce1606e45a0bfe7ee5 Mon Sep 17 00:00:00 2001 From: Delphi Deploy Bot Date: Wed, 8 Sep 2021 19:44:57 +0000 Subject: [PATCH 088/133] chore: bump covidcast-indicators to 0.1.15 --- .bumpversion.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index cc9020acd..b5d759551 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.1.14 +current_version = 0.1.15 commit = True message = chore: bump covidcast-indicators to {new_version} tag = False From 6cfe2bc2d546a0882a39e2ff1670245e7bd8a773 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 7 Sep 2021 17:41:39 -0400 Subject: [PATCH 089/133] use recoded values, where available, for response choice codes --- facebook/qsf-tools/generate-codebook.R | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/facebook/qsf-tools/generate-codebook.R b/facebook/qsf-tools/generate-codebook.R index a126162b1..5d0955210 100644 --- a/facebook/qsf-tools/generate-codebook.R +++ b/facebook/qsf-tools/generate-codebook.R @@ -92,6 +92,17 @@ process_qsf <- function(path_to_qsf, choices <- displayed_questions %>% map(~ .x$Payload$Choices) %>% map(~ map(.x, "Display")) + recode_map <- displayed_questions %>% + map(~ .x$Payload$RecodeValues) + + # Recode response options if overriding Qualtrics auto-assigned coding. + ii_recode <- recode_map %>% + map(~ !is.null(.x)) %>% + unlist() %>% + which() + choices[ii_recode] <- map2(.x=choices[ii_recode], .y=recode_map[ii_recode], + ~ setNames(.x, .y[names(.x)]) + ) # derive from choices where users can fill in "Other" response with free text other_text_option <- displayed_questions %>% From 2e3ef74a59ea21d0b13d694f911c57191a812636 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 8 Sep 2021 14:59:41 -0400 Subject: [PATCH 090/133] recode values in display logic --- facebook/qsf-tools/generate-codebook.R | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/facebook/qsf-tools/generate-codebook.R b/facebook/qsf-tools/generate-codebook.R index 5d0955210..f59ac23aa 100644 --- a/facebook/qsf-tools/generate-codebook.R +++ b/facebook/qsf-tools/generate-codebook.R @@ -169,11 +169,25 @@ process_qsf <- function(path_to_qsf, map(.x, "Operator"), map(.x, "RightOperand") )) %>% + # Remove empty logic map(~ gsub(" Is ", "", .x)) %>% map(~ gsub("NULL NULL Is NULL NULL", "", .x)) %>% map(~ gsub(" ?NULL ?", "", .x)) %>% + # Remove QID flag map(~ gsub("q://", "", .x)) %>% + # Recode choice numbers + map(~ gsubfn("(QID[0-9]+)(/SelectableChoice/)([0-9]+)", function(qid, selectable_text, option_code) { + curr_map <- recode_map[qids == qid][[1]] + + if ( !is.null(curr_map) ) { + option_code <- curr_map[names(curr_map) == option_code] + } + + paste(c(qid, selectable_text, option_code), collapse="") + }, .x)) %>% + # Replace QID with question number (A2, etc) map(~ gsubfn("(QID[0-9]+)", function(qid) {items[qids == qid]}, .x)) %>% + # Collapse logic into a single string. map(~ paste(.x, collapse=" ")) logic_type <- displayed_questions %>% From bfb81f57690a612fdee13f1f8562598ca7a3fc75 Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Wed, 8 Sep 2021 16:13:35 -0400 Subject: [PATCH 091/133] Makefile changes - Move dry-run section until after variable declarations. - Helpful when testing, but it is fine to move it back if preferred. - Move messages file into its own directory. - Helpful when we run the container and mount this directory as it allows both the container and the host to more reliably write to the file. - Replace hard-coded SFTP and email accounts with entries from params file. - Adds flexibility for testing and hotfix scenarios. - Switch to sshpass for SFTP connections. - Simplifies some complexity in maintaining a full keypair for SFTP connectivity from the container. - Add scratch directory creation section to the Makefile. - Serves as a safe place to temporarily write files that can be available to both the container and the host. - Modify tidy section to only purge specific dirs/files, leaving the parent directory intact between runs. - There can be access contention between the host and the container when accessing mounted/shared directories. - Removed `git show -s --oneline HEAD >> $(MESSAGES)` as we won't be working out of a cloned repo anymore. - Add a Makefile line to modify permissions on the messages file so scripts on the host can make changes to the file. --- facebook/Makefile | 50 ++++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/facebook/Makefile b/facebook/Makefile index 3d23db25c..e6d5de787 100644 --- a/facebook/Makefile +++ b/facebook/Makefile @@ -1,23 +1,12 @@ SHELL:=/bin/bash --rcfile bash-init.sh -# dry-run mode: generate all files, but do not post them anywhere, and disable all emails to outside parties. -DRY:=yes -ifeq ($(DRY),yes) - EMAIL_SEND:=echo -e "Would send mail: echo -e \"Subject: $${SUBJECT}\n\n$${MSG}\" | sendmail krivard@cs.cmu.edu" - SFTP_POST:=echo -e "Would run: sftp -b <(echo -e \"\$${BATCH}\") -P 2222 fb-automation@ftp.delphi.cmu.edu\n$${BATCH}" - DRY_MESSAGE:="[DRY-RUN] " -else - EMAIL_SEND:=echo -e "Subject: $${SUBJECT}\n\n$${MSG}" | sendmail krivard@cs.cmu.edu - SFTP_POST:=sftp -b <(echo -e "$${BATCH}") -P 2222 fb-automation@ftp.delphi.cmu.edu -endif - EPOCH:=2020-04-06 TODAY:=$(shell date +"%Y-%m-%d") YESTERDAY:=$(shell date --date "$(TODAY) -1 day" +"%Y-%m-%d") ONEWEEK:=$(shell date --date "$(TODAY) -7 day" +"%Y-%m-%d") THREEWEEK:=$(shell date --date "$(TODAY) -21 day" +"%Y-%m-%d") -MESSAGES:=$(TODAY).messages +MESSAGES:="messages/$(TODAY).messages" PYTHON:=env/bin/python QUALTRICS=$(shell $(PYTHON) -m delphi_utils get input_dir) @@ -27,6 +16,10 @@ INDIVIDUAL=$(shell $(PYTHON) -m delphi_utils get individual_dir) ARCHIVE=$(shell $(PYTHON) -m delphi_utils get archive_dir) RECEIVING=$(shell $(PYTHON) -m delphi_utils get export_dir) FB_CC=$(shell $(PYTHON) -m delphi_utils get qualtrics.notify-bad-weights) +DELPHI_SURVEY_SFTP_PASSWORD=$(shell $(PYTHON) -m delphi_utils get delphi_survey_sftp_password) +DELPHI_SURVEY_SFTP_USER=$(shell $(PYTHON) -m delphi_utils get delphi_survey_sftp_user) +DELPHI_SURVEY_EMAIL_USER=$(shell $(PYTHON) -m delphi_utils get delphi_survey_email_user) +SFTP_OPTIONS=$(shell $(PYTHON) -m delphi_utils get sftp_options) MAX_WEIGHTED=ls -1 $(WEIGHTS) | grep dap | tail -1 | sed 's/_.*//;s/-//g;' @@ -35,16 +28,34 @@ CIDS_DEST:="fb-interchange/cmu_respondent_ids" INDIVID_DEST:="fb-public-results/" RAW_DEST:="raw" +# dry-run mode: generate all files, but do not post them anywhere, and disable all emails to outside parties. +DRY:=yes +ifeq ($(DRY),yes) + EMAIL_SEND:=echo -e "Would send mail: echo -e \"Subject: $${SUBJECT}\n\n$${MSG}\" | sendmail $(DELPHI_SURVEY_EMAIL_USER)" + SFTP_POST:=echo -e "Would run: sshpass -p $(DELPHI_SURVEY_SFTP_PASSWORD) sftp $(SFTP_OPTIONS) -b <(echo -e \"\$${BATCH}\") -P 2222 $(DELPHI_SURVEY_SFTP_USER)\n$${BATCH}" + DRY_MESSAGE:="[DRY-RUN] " +else + EMAIL_SEND:=echo -e "Subject: $${SUBJECT}\n\n$${MSG}" | sendmail $(DELPHI_SURVEY_EMAIL_USER) + SFTP_POST:=sshpass -p $(DELPHI_SURVEY_SFTP_PASSWORD) sftp $(SFTP_OPTIONS) -b <(echo -e "$${BATCH}") -P 2222 $(DELPHI_SURVEY_SFTP_USER) +endif + default: @echo No default implemented yet +scratch: + mkdir scratch + rm -rf scratch/* + tidy: receiving - rm -rf tidy + rm -rf tidy/$(RECEIVING) + rm -rf tidy/$(INDIVIDUAL) + rm -f tidy/params.json mkdir -p tidy tidy/$(RECEIVING) tidy/$(INDIVIDUAL) cp params.json tidy/ mv $(RECEIVING)/*.csv tidy/$(RECEIVING) mv $(INDIVIDUAL)/*.csv* tidy/$(INDIVIDUAL) - tar -czf tidy-`date +"%Y-%m-%d-%H%M%S"`.tgz tidy + tar -czf scratch/tidy-`date +"%Y-%m-%d-%H%M%S"`.tgz tidy + mv scratch/*.tgz tidy/ clean: rm -f $(RECEIVING)/*.csv $(INDIVIDUAL)/*.csv $(CIDS)/*.csv @@ -55,8 +66,7 @@ clean-archive: install-python: python3.8 -m venv env source env/bin/activate && \ - pip install wheel && \ - pip install delphi_utils && \ + pip install delphi-utils && \ pip install -e delphiFacebook/python install-R:dev @@ -68,7 +78,6 @@ $(CIDS): init-qualtrics: grep '"token": "..*"' params.json - git show -s --oneline HEAD >> $(MESSAGES) $(TODAY): [ -f $(QUALTRICS) ] || mkdir -p $(QUALTRICS) @@ -100,13 +109,13 @@ $(WEIGHTS): $(TODAY) [ -f $(WEIGHTS) ] || mkdir -p $(WEIGHTS) cd "$(WEIGHTS)"; \ BATCH="cd fb-interchange/cmu_respondent_weights\nls -1"; \ - NEW=`LC_ALL=C comm -23 <(sftp -b <(echo -e "$${BATCH}") -P 2222 fb-automation@ftp.delphi.cmu.edu | grep "^202" | LC_ALL=C sort) <(ls -1 | LC_ALL=C sort)`; \ + NEW=`LC_ALL=C comm -23 <(sshpass -p $(DELPHI_SURVEY_SFTP_PASSWORD) sftp $(SFTP_OPTIONS) -b <(echo -e "$${BATCH}") -P 2222 $(DELPHI_SURVEY_SFTP_USER) | grep "^202" | LC_ALL=C sort) <(ls -1 | LC_ALL=C sort)`; \ echo "New weights files:"; \ echo $${NEW}; \ for f in $${NEW}; do \ BATCH="$${BATCH}\nget $$f"; \ done; \ - sftp -b <(echo -e "$${BATCH}") -P 2222 fb-automation@ftp.delphi.cmu.edu || exit 90; \ + sshpass -p $(DELPHI_SURVEY_SFTP_PASSWORD) sftp $(SFTP_OPTIONS) -b <(echo -e "$${BATCH}") -P 2222 $(DELPHI_SURVEY_SFTP_USER) || exit 90; \ cd -; \ MAX_WEIGHTED=`$(MAX_WEIGHTED)`; \ EXPECTED_MAX_WEIGHTED=`date --date='$(TODAY) -3 day' +'%Y%m%d'`; \ @@ -130,11 +139,12 @@ run-R: $(CIDS) grep "scheduled core" tmp ; \ [ "$$?" -eq 1 ] -pipeline: init-qualtrics params.json $(WEIGHTS) run-R post-cids post-individual post-done tidy +pipeline: scratch init-qualtrics params.json $(WEIGHTS) run-R post-cids post-individual post-done tidy grep $(TODAY) params.json [ -f $(YESTERDAY) ] && rm $(YESTERDAY) || true touch $@ echo "SUCCESS: $(DRY_MESSAGE)pipeline complete" >> $(MESSAGES) + chmod o+w $(MESSAGES) coverage: Rscript -e 'covr::package_coverage("delphiFacebook")' From a762ca7ca041fd9c32d6e8ef72cbe5fd6258bea3 Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Thu, 9 Sep 2021 13:52:51 -0400 Subject: [PATCH 092/133] Adds new params to template --- ansible/templates/facebook-params-prod.json.j2 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ansible/templates/facebook-params-prod.json.j2 b/ansible/templates/facebook-params-prod.json.j2 index eb90a5186..70e2c4f76 100644 --- a/ansible/templates/facebook-params-prod.json.j2 +++ b/ansible/templates/facebook-params-prod.json.j2 @@ -4,6 +4,10 @@ "backfill_days": 4, "cache_dir": "./cache", "debug": false, + "delphi_survey_email_user": "{{ fb_survey_email_user }}", + "delphi_survey_sftp_password": "{{ fb_survey_sftp_password }}", + "delphi_survey_sftp_user": "{{ fb_survey_sftp_user }}", + "sftp_options": "-o 'BatchMode=no' -o 'StrictHostKeyChecking=no' -o 'PubkeyAuthentication=no' -o 'PreferredAuthentications=password'", "end_date": "2021-08-16", "export_dir": "./receiving", "individual_dir": "./individual", From e132c7d20b37e2b4eede55514234e4ae85e3eb32 Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Thu, 9 Sep 2021 13:55:20 -0400 Subject: [PATCH 093/133] vars changes - Adds vars references. - Adds a comment header for each indicator's vars section. --- ansible/vars.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ansible/vars.yaml b/ansible/vars.yaml index 0d2a97b4c..eaeff437d 100644 --- a/ansible/vars.yaml +++ b/ansible/vars.yaml @@ -10,22 +10,32 @@ python_version: "3.8.2" pyenv_python_path: "/home/{{ runtime_user }}/.pyenv/versions/{{ python_version }}/bin/python" # Indicators variables +# Google Health google_health_api_key: "{{ vault_google_health_api_key }}" delphi_aws_access_key_id: "{{ vault_delphi_aws_access_key_id }}" delphi_aws_secret_access_key: "{{ vault_delphi_aws_secret_access_key }}" +# SafeGraph safegraph_aws_access_key_id: "{{ vault_safegraph_aws_access_key_id }}" safegraph_aws_secret_access_key: "{{ vault_safegraph_aws_secret_access_key }}" +# Quidel quidel_aws_access_key_id: "{{ vault_quidel_aws_access_key_id }}" quidel_aws_secret_access_key: "{{ vault_quidel_aws_secret_access_key }}" quidel_aws_bucket_name: 'delphi-quidel-data' +# Change Healthcare changehc_sftp_host: "{{ vault_changehc_sftp_host }}" changehc_sftp_port: "{{ vault_changehc_sftp_port }}" changehc_sftp_user: "{{ vault_changehc_sftp_user }}" changehc_sftp_password: "{{ vault_changehc_sftp_password }}" +# NCHS nchs_mortality_token: "{{ vault_nchs_mortality_token }}" +# SirCAL sir_complainsalot_slack_token: "{{ vault_sir_complainsalot_slack_token }}" +# Survey fb_qualtrics_token: "{{ vault_fb_qualtrics_token }}" fb_notify_weights_email_list: "{{ vault_fb_notify_weights_email_list }}" +fb_survey_email_user: "{{ vault_fb_survey_email_user }}" +fb_survey_sftp_password: "{{ vault_fb_survey_sftp_password }}" +fb_survey_sftp_user: "{{ vault_fb_survey_sftp_user }}" ## Google Symptoms google_symptoms_account_type: "{{ vault_google_symptoms_account_type }}" google_symptoms_project_id: "{{ vault_google_symptoms_project_id }}" From fe3d9c3da23ffa751bad012bc6e7bc43d89a1748 Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Thu, 9 Sep 2021 14:19:32 -0400 Subject: [PATCH 094/133] Add new secrets to vault --- ansible/vault.yaml | 440 +++++++++++++++++++++++---------------------- 1 file changed, 224 insertions(+), 216 deletions(-) diff --git a/ansible/vault.yaml b/ansible/vault.yaml index 2405ab2d9..950d0ed51 100644 --- a/ansible/vault.yaml +++ b/ansible/vault.yaml @@ -1,217 +1,225 @@ $ANSIBLE_VAULT;1.1;AES256 -61383236643364383630393365343634623139306666376163663062353666363035383663643064 -3766633462616163653263343565363363353739306361650a383162373564636264383035323337 -30376365353665393064353932343335626339366262356439393331333266303532653333393166 -3262313530326136370a303833626437323662323564363464333663313331613864656236373235 -35376439383965356530333365666532353236633238336535373461386638373663303531633634 -32366638306161626138653438316139323037633936386462353762636365316361333233643062 -34623334663039366166316663333165633033646434353930663865336336663839646464653430 -61383535303934633735306561613562333432643138373936303938343662633562656230653661 -38623962396363636633363636646530323264383939393331336237376539333830653563303165 -66363338313063653962653935373735356362306334333063653434616534663435326232616637 -32316638356466313437626166623864326130613432313061396533613830623865386262346463 -35333838633663343131333462623561646264386131353537316131353832616536353637643238 -39336539396266623430326635333565653564663733656165303538323166373834613130363662 -33346132313837373061303331666137303361633334623164343362396362316664616634396665 -37313865663536623764396333383261376366386565656232636535336163326531373330653237 -36313263363730336135326530613563633435363436316462353663663662616336646166336362 -62666234343630353664333739623766623134613865623235353962376266643634616162363033 -31343338303765636133363430633436666264656463393238393766323731383434663166356630 -38656265653835613930633961653462323135656434376334326265336366363930383738616134 -65336630376466623839363266353438633261643737666437366462646532383637643435663731 -33323433366663643638313366643765356636316632366132313665616366353463373137383130 -34653831303031646632386437636637373731363636303630383536316662376536653536356231 -63373266623862396164333134343134656364353130663263376435303230326633643964353539 -34613930363838313039333632363637343532613739663335383133366338343631623139303831 -66636534636563643332393734306231393239656263333862316634386235303338316136313533 -36636139393462303831343461373166613261666534323966313931303363383432393238326339 -33633533343263613765343532656161613862336565616463346563343262343130323164623262 -31396164343932626266623930326330316331643561616562333466663736336231626661303035 -38633634663535383866376235636662623632613939663639366235303465373964373465356664 -30316233306136333732646431633063393238333266633864376666666635363666333566373538 -34396434393039633736316339306464656165396237353136333565353136356336656161633235 -38343032353061323964363436636664383631326633303633613533613666316437303565383135 -38623536356332306562636633326530386262656135303033336463326139383533656266306239 -30306565623532396635366363396238303131333833376564643165663330343338373863353363 -32663964333135383434376133363037303536636664366337633330316437613437653761303733 -35663637653935346232343738653135333962383262316464393736616333656234366461656564 -30336337633337373233303232333566323562303834323236663934653234616666633364613934 -33303134383036666539633066376564366433363834363365643839326636306432323531636439 -33383464633365643130333535646238333938366634663065626635623039356263626166386231 -35613832383463616462393564323230363333623635303737356262653833636438306637666539 -66353230666237323731646465383363376135616134366430316635396365646137303939326362 -62623664316531353331613933353030383032613430303761623730366432353463336531646563 -38336362363131376162393834613365646638643163386333316139636339353835386335363430 -36313034663263616161383034373864383438616164633463336465623063626539646666373135 -37633336383538643732333031383632306363653939306636643237353133343661326337373163 -63636634656539313965363539313261323962666135643535393631656435363234396661623964 -61646432333465356539356235653039346134653732616533376164316536393265616464653136 -33346433346563306438393734663230656338356334633735356162316638326666303639316632 -39616631363539373838633163663932383337663564316533383139653330633733343239623636 -63343237393632666363646562616263616161383537393961383263373633306161396436353861 -33393732306239316334656134616437316634376663373738636330366435373738626261366433 -34366464393163643936393236333262363363383530343765663366356366353331393833383334 -39306637393232396163313337323663616535623264653766313532343530353961323331666335 -31396163663931316466353233623939313437343961313165623536356634663932633938373766 -31646661363932656232396563616135396139303566376230616665373837656633346634653435 -34623163343737353965333533663534366337343739393031326436396632366139666264363430 -30366663346234343534313638396233393536373361383064323461393637326431663035356266 -39343138353262616130616630343463363638383335383430653166333762396166306465303531 -62656463313835383765613535666262366162656161643932646166306562373464373231623138 -66386664626261623530303036356264376532303264356538383938623634633137623761336531 -33333963373533373265613865343431353763336133613230353032383562336433366565393234 -62363865353539636238353937316637653166343266343635666566663832623736376166383364 -65633239326333613332383437316537313230646439343136626661336432346263333336643936 -31323039343639383839356136653439333365613062653237346165663164623239656638373137 -35333530336366666637363863323230376262323934386661663237366263643966326166353938 -34653231643036303537313233343433326636373762363761323766333539636130333431643965 -36343532633365613832333635383435333435383264646661363362376236366366303863653733 -32323239313838653230343466656239326236653233663233313436393664376436366535303633 -37373331343234373031316430386664646430356134346261666530313962326330366139393933 -33313432313635393533363762396366323965643431643439376264333439376162626262303566 -33396661633335353662393231373530396230336365393066313538646636633034613033656434 -63396535313961396566653238363732653633663633626162346535663866323966363131323363 -30376438363139313535653264343336343134656537333730636261623737326234623432623232 -34313339663332353563646532643732346537346238363037323566343334383235373562336130 -62393439626334323866333165666564383639613264343733636166653166633163323663643838 -39313034663231336434633739343834613662393635366362306631326234653832303366613835 -37393837623565613138316561343835626266333136313666656332336362323665356632313731 -63353335653131616265306438616137333566383338373239333732313631653563316165336132 -62326438393939613531353235343434653330393666373232336661303761646365306566363635 -36393937626466633031366266386463626365353532373834393561346338373234333231663765 -31356439373234383036363933343662366333643238393861643463336536633666383235363634 -64316536323265656266313534313837383032646362346435323332633635623330663133303331 -38323564383636656332646361666236653232393039373565636163666439663736663363363937 -63356161393764353066613634353138346564383063343936343432316361366636386237313834 -61613231373562356363663631343337373239643461376366666664373565306362373763363936 -38663465346466353163633235333365383238623538343838306530663736326430363932386662 -33343637393735393034326235336562376432646430336139626637656535663734356530646564 -31376461323566313838303939666161353863636337356334626366383234323765373531363836 -38623930636138306638343830613965386262333438306535626539333832663566636362386638 -31343565643863343634353938643035646337383562363438336361303361613062346266386461 -39383933343261323839653930373138613133396661363964643137383636333837653530373837 -36646263633762646133333333383735306466336166383463383164373463386534623638333433 -64656562303935313837306265666132616435643934346564306462633939653364383032306439 -38336439313266383561323066356533396330303131346462646566313538616139613266323635 -31646563643664373333616461333665633761343430356635613665656431333665376363623462 -35383131633536333963396139656636626634393164323835653437356532316361656338326130 -66643232326236653430616539373361383635643333626161653837656238396236663364613035 -64633862333137353162326531623663613435666634396237623037343231323865636332346139 -65656632313066356265356231396264393233396161633662396535346631303135653631666566 -62663737303634343261346232336132646665313162623332613735616138656266656463316431 -37616561613939656332396434656431363031326262303132323531336530373832373030363339 -39343632356636313062333437353365373063383466393834663837636162373766306430326532 -62623339336338636166316361393933306362336535656266376232613830616331313365353939 -33666266356537343435626338663731333761313636313363326234666330393963393836643135 -33353264393831306166353436346638316164633764643833383531393035643437313764656234 -63663332303861393165363138383338363439386637333831653562346461656630333033663961 -64343432313535613735363838666264656437353930326563303731623939613265636661323530 -30323231616439303764386664386663383634653636393737353839333962663638613334656331 -38396561663737383731373935333931306561656135326434313664616430623336376662353533 -37623531336465636334366665393965323665636266353339393435663835643530363464313861 -35306635633933633866646436613531633664363964643931323739346562383530386134326633 -33366163653938383263333934626438363537383431376562626632323338313537653037636630 -30393339613061313836363638396263623131396264303462353336313461396437353138656136 -39383861643931356366346337333732633436373466633733376230613037393337383237323963 -66343831643765333964636266376466326230373865333364646539376633396264343165623730 -34326337353262393465346330313936653736393437393036313838366332386266626366343339 -63643866613736303361633633336131643035303266376365356336316531336133366130303666 -61653738663934326161663036616230623039373161626237636430653838396464376263316261 -38656233393563653863663833393265333963633833353038376536303266346232666634383437 -39663235393566356138373633633962333835396463323830643365636233346333623036303530 -37613834633935393931653463346536303437333265653965323839643237643065373033353363 -31363462643632323931326432363639636338326162323964363862643131666661636238613333 -33613830356236653534366130663233333436343761383265316438323631383936373538396232 -64376232626636386266366361663866623263333932363935393338653962643837346633323765 -37323964333234333030333139633030666237373462346266393439376430373030626334666265 -36366364363534633165353031666430626433396137663039383766373561323065366265633265 -62373337666531306562333135663061393836376335396338326133336132373934323563626637 -65313633613133616332373865326333623665336238383565373362646438613431353738393036 -35636530636666396566343362353565636636316662383762373334623364323164396238313433 -32623262666665363437343634626133633033323137643138613836623430373238343437303434 -65663261346137393633306337353634643538616333313264353130666261376331383765376363 -35306130353439633261313437303436323661663034646634343336386235303363643036326139 -66353538343661373238323162346431393566643337333830623634343866616135316531303733 -33333831353364386466366534626564663039386334393532636662626236306538346166366630 -32633166393762356635653938373036613562393766626463646363663839336230383362323936 -34343138336462326231303966396163343066633237633263656439363330356663346364663164 -61616561346334393434303866333164633133656537643333376464363133373136623265386431 -32306434656338316436346366393262633439363531313437333538643834343337623434363833 -30336566666430633431663331623438336334373634663634313362383331363731313134383864 -37653532343539366236666134316237383033353639366537396565336665383632393066623737 -61643439666533393733353862316334393163623339366230316631396462623564666163623461 -61356336316233656137393239653762326430343033343430393638616336653630306533306561 -61376139636166353731323537336238363064613432336230623039353432653262383962613661 -31303963653039393335643135393563666261373165396664326235356637326237333964616230 -30303332343631343463376234656330386631363731306561356137356265393863616232373232 -31393339393631623034323132386136396634393564656230623537623562666633626234336165 -64356632316430616537333639626133303834346339633361616132633130303435626331633564 -65656166613863326661653561383762333266383764376264636136343130613463623832353264 -33653235613861616261303561306464326434646532356263656632306637353639346330373335 -37666661656631333865383462613666396363633465366531633334626433383436333635383234 -31336436306530656436363733323663353737393161663436366432333366323031623839343862 -66363663343261633734653861316132393438623664643666353166626135303961363837386132 -35663162333363326235346332623133383935616635303038666338663934613436363539336166 -32353630363639663537663731393031666261316633633538613232313564343637366363646336 -30386634343361383064313533623938313335313030623634323937323831623737646334616434 -62363032323437363937653831656666663239393762353233313363363337323061623035396438 -62343265353739303765303132373461346264353139653739336463343264343731643861333833 -65643966663638633864643236373030366361346435376630316266613466343139383765396261 -64633661633232323732663539663164633164633330343833653334363561326534653265333830 -66363134323637353032303764343666356139373366346535356166313938316638633038323463 -37356231366365393566316439613430383262633935353065653364666461353931343030383765 -34646161306464623861643262316634356530386138663962303961653834643466646564393335 -65326135383139613130353731323262623330646565656234383039303030326664633030363463 -33316235616332613161363936323231643166373032326438613233313366323964616465376666 -31353936353163663265386665626537633338326136393164343865366335663266636139386337 -33613666386263326531633736333966613731313233653135323830353764303761383735386663 -30636539653631316131646264353235396634353733306663633263666331623763323235356137 -31613434346139303338663034366365383133393938353736363165653031316332666230386662 -38303232373436353837646135373835363664313939623863386635363230326339363633623465 -37633135633461346230366262623962633466646162373464376666303330666465633332376263 -31376461376562646366383636626432623933643161616537373331656530343238383037613163 -34396334313831626366663361376361346139363635653831616563376239356430343264663931 -31353066306430323937353661353630363631666231366362383962653136336263616530356366 -61666263363061356631316334613235326631353237376238636662326162306635383234353765 -34643561353438343063396366316564373235393335643139376430396434303363313230396461 -62306566326330623034393639653831356438353535346539616334343032646539396261643738 -33313831633566623637393236626265343566636133333165633736396665386261346464313030 -36363965633336376139393431353662313331636662343465643065333565316331336534323131 -65663832323537633439636438303637383738666262303737633632633564303035643339386363 -38626264353065653638616132336131613664623763623461316533633663326664383364343131 -61373538346363613334323734303832306231366139313564376232643139313431333464643233 -62633862353136356638366330653061623761333063323236666137636139616664616133643566 -37303438666538323233636631353566333065663339613633306464303233353639313463383061 -64363365306665666339303236616137356234643933316431623661343837363139636464376438 -34393237316566363666336532363635666630353537646561393930646438353532353564383761 -62306662303962363165316536656538313966373336326633653162616166363765306663636564 -64316537386339663661663034653034663933386536366134356437313261353931376634326162 -34616666393363333666383266346364313535343132613863303538646266373862623632616234 -31373766326431393331316333623630333963366436623065303438656137306430343033626231 -32346463366638613061663865313565663737323636353035623762373465373739666636343063 -37383531323533373737653835313964653462623439653565336232323465326636633538646633 -64333837343164343832643538363039616334393933376262646331393365663262646332616365 -39346436636132653733643430303435666130663664323565353434646630343862616665303761 -30333831303530333462306464313431633262346232663734353433303933353064633736653765 -33383163613565323437663064653465373238333932323964633435396631303461666165316431 -30383738636266633137383939626536643464616630363330326434653135346465653139656361 -30646265363465623665623630323738666637336664333165623530313737613139613464323663 -31303336366364626635666664613461353831376235346236656563656261613631326136396466 -38353034653132633663343234366531383964326461306535346463323361636136613565343565 -62313366373736643434346136376633313837393765346632343230653635666335343532376434 -34316635303135353163333265316435343064303637343437346666326662646434633564363535 -65363036616132336639653863343937373638316530653134616564663432306162633936613237 -64363861623066656665646261623831343837636363326339626563373262333530333632636537 -65613763633030333439346266333434303332616163326638633666313232353862323438393664 -37396332616133366266333930316137636433353437333061323137396266313463643634303766 -61616263623730333437323332653431313038383565306332323037643936653266393766336663 -32326439353365303939326166306361303138343535623938383733323835336365623633343761 -62656435663661366238303238633935376434353935383938323231353863393964393966333765 -64616233383961653239643163343363383861373132383339313434313633643532626166326431 -62396135396436613531626536633464366638373363333863346634643334626236343336663964 -35376537343838396465363364333466316530613032626665343531646132373265346334346433 -39323835353937663137313731393533383738303239313335656537313939633566306331646439 -37343866326337383232313936613362346334316462373436643966353136336161613438623431 -62613834343166646135353762663437356635353132366434656639386362393130326334643636 -31316334363339333733363561353461336164373830333763633831376334643638643430623237 -37393232353030393665 +63316430313534303165663533363834353939653931383036363236343034666463366362303263 +3732646465653464336239613162343439323734636430660a393334323166376563653037303336 +63303663346462653963326361313238633263663133383965393431613139333432323139636361 +3130343634663234390a663433383962663438643434316433653762663330383437383432363730 +65313561343261613833343063626334333934613666333164306664363861376561343162616337 +31316266646439346533343934363262396538623836333465656536666465346564646563353338 +35326563303134616336393931313334616439383366343064643833363532353236393138393562 +62333034663932626438633836316130323964636439316265303230393735363637306438613662 +30333666663562663931346662353930386566316236303937333136353563303938393533643166 +63623262396661373137323839316530396365626334653262386539336162306335313035643364 +65343233643930653632303734663234643363323732653766383934373539393063643132623336 +36323433656234636130376238336132353364653664383238343337653436623838663036616639 +37343061373964366636313834613439343035306630353563396533313737643663623665333663 +63323834633661306336633062636666663536396435373234323032323234336632343266363536 +64316132366335356233393038346436643338356263666464316530653438656434323938633833 +65333461663636306133313662346466323431376639343438663135626265323965303462623965 +63383761376438623566636139303536383233356137626464393362646339393331653131313539 +30306235343938363038346361393735623033346531366330653939613437633136353163346234 +39363763353537353961366164346161646261653166653363393062343866336535306131323364 +65656535663337376138653236373762366463323962653064306436616439646132666633653438 +31383663386635643837383332643665643134656637306565346630386135366137383334323533 +36366130656238326532616165643664666464616331363038623764386232333733373630396434 +38626366346464616565343963313664616135643266346239316166393734613232666430306465 +38643762653039646630666362643264643636356662396230643539323965623863643435303161 +38303037653436643739623166363062356638333733653961386138616539653265306636316564 +32366231313366313932653933393636393438656639653837363431383931623139616432613737 +66343966646532613633663536363639393966356335343836343536393132636663613738653763 +63666139356537633735393262663239313766366533633432383864313565393739313631313661 +66346136363233323861633061663934633264613763383635653763656435346365313261323765 +66643837636138623436653430643734396534346238626337326337363932393137613764333938 +39646439626435623433303561656165663037313136636532663166643734623937313834643464 +61613931323738636263653033343832326437666233313434376262323433353535653235613766 +64336431363862616230363135333732636436393033363564626338373237313333323531373064 +66303939326530393638633631346666316263316437363463646537333363323965616134386162 +34653734356165613262386432653965613833353830383531613061623031343535373638383233 +66663463383230663561373237333435613661653662376139356132643133373333313163636436 +66663666653638373431633930346164333962323235313432306330363663303064383837633664 +35366164656663306165323130376333333064383864656263323934616637313031336330326136 +66333664626437386537353266623631633462386562623738633834313364663961353963653366 +38646238373663383638626131346363656530653638653466616364373565646639383232653363 +36633837363161626338326364383433356630626435383063623133393132323363303939393565 +30333863663563313464613534383035666435663231323135376338663035373231343035623962 +34613365626266313237346232636562386136353636313263626538343864346564336532636365 +62623262326633656261383136393066636432353764623337616564313933313639313735646138 +34386539643230393836623739643130366339663762386436616365303164313831303033633564 +61656230613235636466346134336665343062346333393230353435666361643264343434333231 +35646361653831643866316335633934356534346232656462336233373865333139386637333764 +65373630366235363332373832303630323938316162656239653033623162356531333161323936 +34316335613462613062613763366234636234663864313237643137396461313365653835346265 +32663036353734366661323434653865336437313338313335353566373462363266656661643466 +66666335313439303730656565373034643062333762666538643535623764376465353731336534 +39306365383331323338356266633230643336643439363865366630626339656236366635613735 +36626530356562613564303034616634633635383239646166663036373736626334383239646464 +36636233386631383134386665613036616534306330366436653063376362343462363932303931 +62633065613332303062333366636539323337663865306431303866393737346564336265356331 +38316136653932653634383530346465393337643732653039333732343933663238636534613535 +30353563383136656264636237613164663134613639616563323933646262303731333134346266 +32383166663934303030313062666232303064393862356337313466343964346564363531616662 +62616235353733373839626362613932663932666636363134313761336633373736313362333636 +65663533343736323966376436373930653061363030656464333163303238633932306438346433 +39373265613836343132626335353133386566656161393931313865643839613163643563376434 +62633666356261616666353463393663616431396438376462313865356161333264333530313931 +65646439323861653235346134326366393535636430346438656666633438316364316661313939 +63666464663431656531336638633531306365663266643838636339346330303533613138653665 +32326135326232336236653531363237383465303637393433386133323036333162353266306335 +31316531656634323835383533366137353937646266623837326465316266326464633638366164 +64663066653435626632633962313765613765373835623263613666313039663762646139343666 +39646131373337303434613363616330393634313765316634383238313337623863373339353863 +61313532396434656139636564306462346535386236616535353365643437633139333436616639 +33643331643937323562633034383263646438393731323366313765633439326463633934636137 +39613735373763386136323634343536383432333463393136383830303863376432633137623137 +38313335623735643132326430613661623164373364343666386638363562333438663031613135 +30313239613137383133623963656461336439376339656330663234653361306538323762646637 +65653436393635373139363466616336633337396539346237663564616130656135393032386239 +62336338326261346235376238613435653930656338376464616461393463613639393263366634 +32376237353765393936313430653636323365336539333732393637363734343238376234643835 +61383262336163626233333130663639396661313432666331333366623662646637333162623463 +30616638633239373462393463653165393735643435343637643735333561373333636438386633 +30323230366662353565383662363464616237333339373331613734623061353636313231306333 +32336339663536393462333865613035393135343836303935623434306334396366383863643732 +39396134353138376538623738353163336633323533376534393139666261346362626332393833 +32663335336161646230326630343163646333626130646562396632626638643565613630336437 +65316132393764303333653831393366326137323163643563376433316534373330626266373839 +64393966643538323133306662653861623839626466336566303832356530616438366338336335 +63393230643737306436363062666664386535383865373365363065343165383132623563666437 +62653933653637613263363165666163396261313531303938323361616461633236353663366466 +64623866653839303036623737616539363933376431646532663761646630396163393537626433 +37613334316336313236666266316364666333623432636466396334646230343730386635363161 +37396238353131373734393335383366633261626230633566326332376264393534346233396265 +36663465366666333135343338346438373163343934376563306137666334643535616133393261 +30373934343666356562653634623433626465666562666262356535643230366132396634363363 +63346635663237636231313032666531353230636363666437363037636530343064623231393361 +66346634383935653564313134306333363063313762383131336263333763656532393235383432 +65363234356136363039383333313530383633353761616162643331356335633130333161623163 +31333437623837653230313736366565663238663064646332353236303434383966323135343563 +36663463353432353464323332303031646231656535303764396134656632386265363263353366 +33643131623664306330633962363337613264623762323765643162623734356336356536396363 +63303036333366323165613238623362306536383933383763623835653537366534313361376233 +33336432306266626465656661326531326362346137336639323165323936346539396331326133 +38653333643462623461633966313531343833303434613366663736396562646536323433616630 +64323765333132346239663538663263336131376261353039373061343532666465313537313734 +38636233316335363137366635616363623839626665646630623930303031393665393165616439 +31613566383831336631383239646638643665383937343364313539393932363036323134383934 +38653533326233383430376233326132616133626365653237363965306563366634633334336434 +66653939363531323937623833343366363066323131333838636561363930626266613230373966 +30373336343266333931633031636330323030613532623563346539386264663035336433363765 +38306539373530653536666162643238623265326663653238663765613562366334643435616233 +37333333653866383939303064383265346561636430623661613861376134623864356132323636 +37613633343035656262653731623633353737633133613133363164313835373964376138313637 +38366465333536656633346139386237336166333966636661373034313731626333313136646266 +35313136626664633436366439306130633165633064366461653132373831613265323830303230 +31383235303263343636393562313733666266333939613834643630646164653162323930383361 +61666564663563336234383136343363346631366531356439643963643631396336616162626138 +63653430653761383361316238353465363036633562373839363337333236383735333636653138 +64303536323931303833386433653864653361383763323565643335353863613866313361356234 +34376363303436323033313038356462623034396363353466636639623836623266373337346538 +65663365646534613232303162356361353636316364366338353033353930643930343734616433 +36303634383133643164323565353137386632613039343238303061356638663734383135346437 +32326639363738643338366330343034343462636564346535303537346234656335343766333732 +38356237363361646334646336343964333731656635346139353464346238353562633366363837 +36356331323561643638316265626561306139643738653832323761613666343738336462353432 +33666235306562386134643330636663633832663831613864643839306161336265353566393438 +32393166353266383630303462363037663336663932623235393536653466343264376631343465 +63313862363666643666666138346364303462633033366363626266313462633539663035666432 +37643636333761336239626663346434383264666162323964323230663061613834393430633339 +63386264366437356636316662396234393734356564653564366234663030303262333366663666 +32623633373461356265663132643564366466303435366234626361373030316333323062623639 +31666565343338613863616364323564336565356139626565363665363761376230383130386235 +38343134326136366236386162346262663936633336633363316234333066343462363466393436 +31633938626433303662366532376562303737623735353365656233666637316263623031306131 +36346663336333663731353333313465396565346237613433653734313961623539653566343561 +30346335333064613236343932666532616364383763356636343232386235303465643465616530 +31333333393636393764643434646536373563303735353238626637303632353233613630666533 +66613265323632336237326137363330336631353265316161613337356232326235356163303431 +31633231356564346437353063616330663937333964356638376432316563303161316230373534 +31353938386130393734663939656664663830316537393764643163303964326335336533313566 +31616530336465333538366535343938323865663932333735653135393533363164633762376566 +39636134366333383538316130363835323937343764623033376362316438373436316630333361 +31363834343466363339333935386264656239653562316261363737356361303461333238316233 +39343731623730333236616464356464633431613835366364663436666363393130613339613965 +33343166616236616464393036303939613863396661633735633263306232356131636662323037 +30363863656266303933346633393066386235313838643835386363313532656530626164303730 +31333434386631633234323064383233363935383162666134326339333966333633343764346262 +65383462663131623933353432363566363038366438613366313730613130643438656236363136 +65643538346335316334666434356532643239346163626563336561373836613038613834383465 +37353930383038353865303766306232636536333738336130313831616262656362353734343634 +35363233396161356665663031376266336231633462373034336639343563333938383133646435 +62666438386638333130336333393837626531306266356566613866303032646263326634366333 +30343863306237333133393636616533633661643663636232316537633964363532366132383734 +38373166303662343963303132353831663736393165316335333232356535386433666366666362 +62353030333763356162626361633962626264313761613466346537643137326164323265346339 +38333931653130323965333734373762393561643630363261366536353137383361623734386165 +64343139613364383361303639303236336561336233396530393331353638343031353136623863 +35343663343965646537643835336330653636313133616538353165323366333037636438353234 +35613864313962386536323238663461303139333533363836613237643561366236653231616166 +36353533306334356533393564303839646661313634656633623737393337663866303366313331 +61376536353163306135646465373565326539633030653535393565306437386661353564623137 +39383534653663653262623331316139353265363063346530303131613965643566313161613335 +31373434386266383331626339346463356566313263316330376230363531303536303937303335 +61323333623930663837643837373136393365653839323036323335616330393164356662656137 +32323933303239383934643362376637376466613365373765666434313361626533653834306164 +35326432323137363734326339623732353964666232366465663934353939643363663435643461 +61616637313430326438633036646335346366366561333031643532613131393163613261313233 +62313264353764356136303737316266363338316164376235633761613236343333616431366432 +62643131656539376163653161326164336439666332653433336130326263663364306165613931 +33396136363739353132646666343537366231636135313238613461336563346339646530353631 +31653866633939663063636362613430383462343362653064363538343434346336346438373639 +32666430323836646336363961393065303838306461393064663563383262333631363334653637 +35656233633438613535336339333535306431646263376563306266346633373130343230386530 +66373330653138336534333330366537613836616238373335656465313739663236393364323633 +64383164613961636635633963363630626336393165396162313736643532376537306262616233 +36663530386162663264326533303736623063303335336665356161626232303039626338303539 +64366336663966653239663130336436373735316130613366396263363534333330383966363663 +62386165333330616236666332653237346637336262393838636130333738353733363730316432 +38663036363066613130393730656164333463666130346534663538643833616234386539333633 +62623635336635363938633534633032366266393336613564333131323865636532313238383464 +33336666323065323633333566313634366663383932623864336635643061346663643738333537 +35336530373330323033363333663036623237306632316661336430376434323737346630666234 +32646630643463323636323666373762323638386631353964386337656563363239623334363033 +35313738666264663663343064653863346161396239646233343964383066333432306434323861 +35386233303734646264383638376633366263636239653466316531396666616239363430383261 +37626264653130653639346237333530383766643238396232313635653930656266343034313766 +34653530343363643235663562616364343962393036663637363833383665666662393630383666 +35376135363837613538303039386438613632653464643361316265373837623932663535363236 +33333038356664323133303930333836386437656265383631343565663563646130366265383137 +36366262373935356331636662356232623837383361656636313234666361386662393533306238 +64396464323263313731313731386161636266366231306639303536616165613831626231303834 +65346361383237643433656135333739396130356631326539343662633032616264326330373730 +63326432356139663637306431393839303465363634326663346461646663643537356338623939 +62663731323730346635396338313735653932633536363864313164336436323936343164376461 +63393230306234616561653834396537313166633465336461623462303135303063643438363631 +36336164626134643462353738383163326236383237353730373430396134623662386663666639 +62303634646631656330646436626461376664636535653631356566616232376664343335373439 +64663465306336663661363061336531636534613736373737303462383534663661316166323762 +33616234373236363661326534663161636162333765636462383962373833346337653262303261 +30333662323563356665303761393936393832306430336437663066643834353039663639373964 +64653365346631303939666130666461353032663462613936343266356365626437656338616166 +30326563636138643665373063326439396566306533363364353837306530643138366135663564 +65303233643930663530643135623332666336656166643033323463353863386636643635626562 +30323664373137313130363266366466326437613630613363336431366433366132343433626130 +32613663303261633164363533636164653932313336343763633264353633656132333333663061 +61373130663737386231383866653066626564396364323131653134376638323237316234666164 +32623432326537636361323939373332646562316535333562643330363133396234633962653762 +36623138356131333331643963303635656431396463396231343365393830653432333235316464 +36393434643732656362376138383635343636636463646335363763346666393830323435666335 +65643335373362646263646634313032333435323334343062326165653233373264316435653764 +37346564323435386335663632633035326366323861663233316166643662306136303366376337 +65313164323461656264646163356563313162396434383639326431353530373335326164333964 +64373831626539393362313733626135633133353332613036383937666663663739643336613733 +66353661356165633733646135313636316161363264633030663231386432343532633037623833 +36616266613261376432353164343162663063353232343763336466323138343731313639373039 +64643533326631393465333439363966616163336137633236336636653130346333633631333361 +64396333396235643335623831666232376232636131656162323532386562666563303764613137 +39386531303938623033383836356639306533376130383963393331363762643433366461336236 +33323836323966636437663939626132343537663237636137323939363639323133326533366162 +34653539373938303237636332313535653437616537663231613466376538323364643334633435 +39613665653335666431303163653662376263623234613639313132613236373332353839346335 +64633233326632653634383831316266386438623939386433346563366461653565393763616239 +31613931653865313566313036623736353333643763316166343131383566373239396435353136 +32306237313363376364383463373238353739623331356465393236646232623561323962666537 +65633437313962636337626530653536386264383537643266663863633532353234386236636537 +62663632633564376438646232363962376665393566393834376264363531363438306566653234 +34333332653162346339353762386135363039333463353435303239396239636561643839313566 +35356433616239616234 From 8f9d38f86e9d3e3441a9464f7a8d6d87f3ff1d1c Mon Sep 17 00:00:00 2001 From: Delphi Deploy Bot Date: Tue, 14 Sep 2021 18:59:43 +0000 Subject: [PATCH 095/133] chore: bump covidcast-indicators to 0.1.16 --- .bumpversion.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index b5d759551..97256893a 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.1.15 +current_version = 0.1.16 commit = True message = chore: bump covidcast-indicators to {new_version} tag = False From bc083b789c7f3cc61dfeb51ad69855498d8cf496 Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Wed, 15 Sep 2021 09:37:56 -0400 Subject: [PATCH 096/133] Build facebook container image --- .github/workflows/build-container-images.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-container-images.yml b/.github/workflows/build-container-images.yml index e32b58093..c01460c87 100644 --- a/.github/workflows/build-container-images.yml +++ b/.github/workflows/build-container-images.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - packages: [ "" ] + packages: [ facebook ] steps: - name: Checkout code uses: actions/checkout@v2 From 01d142b437d5f3834709e0eb10525ad93429c340 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Tue, 14 Sep 2021 17:43:41 -0400 Subject: [PATCH 097/133] un-retire schooling indicators from sirCAL Revert #1192 --- ansible/templates/sir_complainsalot-params-prod.json.j2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible/templates/sir_complainsalot-params-prod.json.j2 b/ansible/templates/sir_complainsalot-params-prod.json.j2 index 0076bcc82..de4b732e6 100644 --- a/ansible/templates/sir_complainsalot-params-prod.json.j2 +++ b/ansible/templates/sir_complainsalot-params-prod.json.j2 @@ -37,7 +37,7 @@ "fb-survey": { "max_age": 3, "maintainers": ["U01069KCRS7"], - "retired-signals": ["smoothed_anxious_5d", "smoothed_wanxious_5d", "smoothed_depressed_5d", "smoothed_wdepressed_5d", "smoothed_felt_isolated_5d", "smoothed_wfelt_isolated_5d", "smoothed_large_event_1d", "smoothed_wlarge_event_1d", "smoothed_restaurant_1d", "smoothed_wrestaurant_1d", "smoothed_shop_1d", "smoothed_wshop_1d", "smoothed_spent_time_1d", "smoothed_wspent_time_1d", "smoothed_travel_outside_state_5d", "smoothed_wtravel_outside_state_5d", "smoothed_work_outside_home_1d", "smoothed_wwork_outside_home_1d", "smoothed_wearing_mask", "smoothed_wwearing_mask", "smoothed_vaccine_likely_local_health", "smoothed_wvaccine_likely_local_health", "smoothed_others_masked", "smoothed_wothers_masked", "smoothed_wanted_test_14d", "smoothed_wwanted_test_14d", "smoothed_covid_vaccinated_or_accept", "smoothed_wcovid_vaccinated_or_accept", "smoothed_accept_covid_vaccine", "smoothed_waccept_covid_vaccine", "smoothed_hesitancy_reason_allergic", "smoothed_whesitancy_reason_allergic", "smoothed_hesitancy_reason_not_recommended", "smoothed_whesitancy_reason_not_recommended", "smoothed_hesitancy_reason_distrust_vaccines", "smoothed_whesitancy_reason_distrust_vaccines", "smoothed_hesitancy_reason_health_condition", "smoothed_whesitancy_reason_health_condition", "smoothed_hesitancy_reason_pregnant", "smoothed_whesitancy_reason_pregnant", "smoothed_vaccine_likely_friends", "smoothed_wvaccine_likely_friends", "smoothed_vaccine_likely_who", "smoothed_wvaccine_likely_who", "smoothed_vaccine_likely_govt_health", "smoothed_wvaccine_likely_govt_health", "smoothed_vaccine_likely_politicians", "smoothed_wvaccine_likely_politicians", "smoothed_vaccine_likely_doctors", "smoothed_wvaccine_likely_doctors", "smoothed_felt_isolated_7d", "smoothed_wfelt_isolated_7d", "smoothed_worried_become_ill", "smoothed_wworried_become_ill", "smoothed_inperson_school_fulltime", "smoothed_winperson_school_fulltime", "smoothed_inperson_school_parttime", "smoothed_winperson_school_parttime", ["smoothed_vaccine_barrier_appointment_time_tried", "msa"], ["smoothed_vaccine_barrier_childcare_tried", "msa"], ["smoothed_vaccine_barrier_document_tried", "msa"], ["smoothed_vaccine_barrier_eligible_tried", "msa"], ["smoothed_vaccine_barrier_language_tried", "msa"], ["smoothed_vaccine_barrier_no_appointments_tried", "msa"], ["smoothed_vaccine_barrier_none_tried", "msa"], ["smoothed_vaccine_barrier_technical_difficulties_tried", "msa"], ["smoothed_vaccine_barrier_technology_access_tried", "msa"], ["smoothed_vaccine_barrier_time_tried", "msa"], ["smoothed_vaccine_barrier_travel_tried", "msa"], ["smoothed_vaccine_barrier_type_tried", "msa"], ["smoothed_wvaccine_barrier_appointment_time_tried", "msa"], ["smoothed_wvaccine_barrier_childcare_tried", "msa"], ["smoothed_wvaccine_barrier_document_tried", "msa"], ["smoothed_wvaccine_barrier_eligible_tried", "msa"], ["smoothed_wvaccine_barrier_language_tried", "msa"], ["smoothed_wvaccine_barrier_no_appointments_tried", "msa"], ["smoothed_wvaccine_barrier_none_tried", "msa"], ["smoothed_wvaccine_barrier_technical_difficulties_tried", "msa"], ["smoothed_wvaccine_barrier_technology_access_tried", "msa"], ["smoothed_wvaccine_barrier_time_tried", "msa"], ["smoothed_wvaccine_barrier_travel_tried", "msa"], ["smoothed_wvaccine_barrier_type_tried", "msa"]] + "retired-signals": ["smoothed_anxious_5d", "smoothed_wanxious_5d", "smoothed_depressed_5d", "smoothed_wdepressed_5d", "smoothed_felt_isolated_5d", "smoothed_wfelt_isolated_5d", "smoothed_large_event_1d", "smoothed_wlarge_event_1d", "smoothed_restaurant_1d", "smoothed_wrestaurant_1d", "smoothed_shop_1d", "smoothed_wshop_1d", "smoothed_spent_time_1d", "smoothed_wspent_time_1d", "smoothed_travel_outside_state_5d", "smoothed_wtravel_outside_state_5d", "smoothed_work_outside_home_1d", "smoothed_wwork_outside_home_1d", "smoothed_wearing_mask", "smoothed_wwearing_mask", "smoothed_vaccine_likely_local_health", "smoothed_wvaccine_likely_local_health", "smoothed_others_masked", "smoothed_wothers_masked", "smoothed_wanted_test_14d", "smoothed_wwanted_test_14d", "smoothed_covid_vaccinated_or_accept", "smoothed_wcovid_vaccinated_or_accept", "smoothed_accept_covid_vaccine", "smoothed_waccept_covid_vaccine", "smoothed_hesitancy_reason_allergic", "smoothed_whesitancy_reason_allergic", "smoothed_hesitancy_reason_not_recommended", "smoothed_whesitancy_reason_not_recommended", "smoothed_hesitancy_reason_distrust_vaccines", "smoothed_whesitancy_reason_distrust_vaccines", "smoothed_hesitancy_reason_health_condition", "smoothed_whesitancy_reason_health_condition", "smoothed_hesitancy_reason_pregnant", "smoothed_whesitancy_reason_pregnant", "smoothed_vaccine_likely_friends", "smoothed_wvaccine_likely_friends", "smoothed_vaccine_likely_who", "smoothed_wvaccine_likely_who", "smoothed_vaccine_likely_govt_health", "smoothed_wvaccine_likely_govt_health", "smoothed_vaccine_likely_politicians", "smoothed_wvaccine_likely_politicians", "smoothed_vaccine_likely_doctors", "smoothed_wvaccine_likely_doctors", "smoothed_felt_isolated_7d", "smoothed_wfelt_isolated_7d", "smoothed_worried_become_ill", "smoothed_wworried_become_ill", ["smoothed_vaccine_barrier_appointment_time_tried", "msa"], ["smoothed_vaccine_barrier_childcare_tried", "msa"], ["smoothed_vaccine_barrier_document_tried", "msa"], ["smoothed_vaccine_barrier_eligible_tried", "msa"], ["smoothed_vaccine_barrier_language_tried", "msa"], ["smoothed_vaccine_barrier_no_appointments_tried", "msa"], ["smoothed_vaccine_barrier_none_tried", "msa"], ["smoothed_vaccine_barrier_technical_difficulties_tried", "msa"], ["smoothed_vaccine_barrier_technology_access_tried", "msa"], ["smoothed_vaccine_barrier_time_tried", "msa"], ["smoothed_vaccine_barrier_travel_tried", "msa"], ["smoothed_vaccine_barrier_type_tried", "msa"], ["smoothed_wvaccine_barrier_appointment_time_tried", "msa"], ["smoothed_wvaccine_barrier_childcare_tried", "msa"], ["smoothed_wvaccine_barrier_document_tried", "msa"], ["smoothed_wvaccine_barrier_eligible_tried", "msa"], ["smoothed_wvaccine_barrier_language_tried", "msa"], ["smoothed_wvaccine_barrier_no_appointments_tried", "msa"], ["smoothed_wvaccine_barrier_none_tried", "msa"], ["smoothed_wvaccine_barrier_technical_difficulties_tried", "msa"], ["smoothed_wvaccine_barrier_technology_access_tried", "msa"], ["smoothed_wvaccine_barrier_time_tried", "msa"], ["smoothed_wvaccine_barrier_travel_tried", "msa"], ["smoothed_wvaccine_barrier_type_tried", "msa"]] }, "indicator-combination": { "max_age": 4, From 372ecaba1c638886866c3abcc3e438f80e3cd7c5 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 15 Sep 2021 11:48:48 -0400 Subject: [PATCH 098/133] break line --- .../sir_complainsalot-params-prod.json.j2 | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/ansible/templates/sir_complainsalot-params-prod.json.j2 b/ansible/templates/sir_complainsalot-params-prod.json.j2 index de4b732e6..9cc9a8250 100644 --- a/ansible/templates/sir_complainsalot-params-prod.json.j2 +++ b/ansible/templates/sir_complainsalot-params-prod.json.j2 @@ -37,7 +37,46 @@ "fb-survey": { "max_age": 3, "maintainers": ["U01069KCRS7"], - "retired-signals": ["smoothed_anxious_5d", "smoothed_wanxious_5d", "smoothed_depressed_5d", "smoothed_wdepressed_5d", "smoothed_felt_isolated_5d", "smoothed_wfelt_isolated_5d", "smoothed_large_event_1d", "smoothed_wlarge_event_1d", "smoothed_restaurant_1d", "smoothed_wrestaurant_1d", "smoothed_shop_1d", "smoothed_wshop_1d", "smoothed_spent_time_1d", "smoothed_wspent_time_1d", "smoothed_travel_outside_state_5d", "smoothed_wtravel_outside_state_5d", "smoothed_work_outside_home_1d", "smoothed_wwork_outside_home_1d", "smoothed_wearing_mask", "smoothed_wwearing_mask", "smoothed_vaccine_likely_local_health", "smoothed_wvaccine_likely_local_health", "smoothed_others_masked", "smoothed_wothers_masked", "smoothed_wanted_test_14d", "smoothed_wwanted_test_14d", "smoothed_covid_vaccinated_or_accept", "smoothed_wcovid_vaccinated_or_accept", "smoothed_accept_covid_vaccine", "smoothed_waccept_covid_vaccine", "smoothed_hesitancy_reason_allergic", "smoothed_whesitancy_reason_allergic", "smoothed_hesitancy_reason_not_recommended", "smoothed_whesitancy_reason_not_recommended", "smoothed_hesitancy_reason_distrust_vaccines", "smoothed_whesitancy_reason_distrust_vaccines", "smoothed_hesitancy_reason_health_condition", "smoothed_whesitancy_reason_health_condition", "smoothed_hesitancy_reason_pregnant", "smoothed_whesitancy_reason_pregnant", "smoothed_vaccine_likely_friends", "smoothed_wvaccine_likely_friends", "smoothed_vaccine_likely_who", "smoothed_wvaccine_likely_who", "smoothed_vaccine_likely_govt_health", "smoothed_wvaccine_likely_govt_health", "smoothed_vaccine_likely_politicians", "smoothed_wvaccine_likely_politicians", "smoothed_vaccine_likely_doctors", "smoothed_wvaccine_likely_doctors", "smoothed_felt_isolated_7d", "smoothed_wfelt_isolated_7d", "smoothed_worried_become_ill", "smoothed_wworried_become_ill", ["smoothed_vaccine_barrier_appointment_time_tried", "msa"], ["smoothed_vaccine_barrier_childcare_tried", "msa"], ["smoothed_vaccine_barrier_document_tried", "msa"], ["smoothed_vaccine_barrier_eligible_tried", "msa"], ["smoothed_vaccine_barrier_language_tried", "msa"], ["smoothed_vaccine_barrier_no_appointments_tried", "msa"], ["smoothed_vaccine_barrier_none_tried", "msa"], ["smoothed_vaccine_barrier_technical_difficulties_tried", "msa"], ["smoothed_vaccine_barrier_technology_access_tried", "msa"], ["smoothed_vaccine_barrier_time_tried", "msa"], ["smoothed_vaccine_barrier_travel_tried", "msa"], ["smoothed_vaccine_barrier_type_tried", "msa"], ["smoothed_wvaccine_barrier_appointment_time_tried", "msa"], ["smoothed_wvaccine_barrier_childcare_tried", "msa"], ["smoothed_wvaccine_barrier_document_tried", "msa"], ["smoothed_wvaccine_barrier_eligible_tried", "msa"], ["smoothed_wvaccine_barrier_language_tried", "msa"], ["smoothed_wvaccine_barrier_no_appointments_tried", "msa"], ["smoothed_wvaccine_barrier_none_tried", "msa"], ["smoothed_wvaccine_barrier_technical_difficulties_tried", "msa"], ["smoothed_wvaccine_barrier_technology_access_tried", "msa"], ["smoothed_wvaccine_barrier_time_tried", "msa"], ["smoothed_wvaccine_barrier_travel_tried", "msa"], ["smoothed_wvaccine_barrier_type_tried", "msa"]] + "retired-signals": [ + "smoothed_anxious_5d", "smoothed_wanxious_5d", + "smoothed_depressed_5d", "smoothed_wdepressed_5d", + "smoothed_felt_isolated_5d", "smoothed_wfelt_isolated_5d", + "smoothed_large_event_1d", "smoothed_wlarge_event_1d", + "smoothed_restaurant_1d", "smoothed_wrestaurant_1d", + "smoothed_shop_1d", "smoothed_wshop_1d", + "smoothed_spent_time_1d", "smoothed_wspent_time_1d", + "smoothed_travel_outside_state_5d", "smoothed_wtravel_outside_state_5d", + "smoothed_work_outside_home_1d", "smoothed_wwork_outside_home_1d", + "smoothed_wearing_mask", "smoothed_wwearing_mask", + "smoothed_vaccine_likely_local_health", "smoothed_wvaccine_likely_local_health", + "smoothed_others_masked", "smoothed_wothers_masked", + "smoothed_wanted_test_14d", "smoothed_wwanted_test_14d", + "smoothed_covid_vaccinated_or_accept", "smoothed_wcovid_vaccinated_or_accept", + "smoothed_accept_covid_vaccine", "smoothed_waccept_covid_vaccine", + "smoothed_hesitancy_reason_allergic", "smoothed_whesitancy_reason_allergic", + "smoothed_hesitancy_reason_not_recommended", "smoothed_whesitancy_reason_not_recommended", + "smoothed_hesitancy_reason_distrust_vaccines", "smoothed_whesitancy_reason_distrust_vaccines", + "smoothed_hesitancy_reason_health_condition", "smoothed_whesitancy_reason_health_condition", + "smoothed_hesitancy_reason_pregnant", "smoothed_whesitancy_reason_pregnant", + "smoothed_vaccine_likely_friends", "smoothed_wvaccine_likely_friends", + "smoothed_vaccine_likely_who", "smoothed_wvaccine_likely_who", + "smoothed_vaccine_likely_govt_health", "smoothed_wvaccine_likely_govt_health", + "smoothed_vaccine_likely_politicians", "smoothed_wvaccine_likely_politicians", + "smoothed_vaccine_likely_doctors", "smoothed_wvaccine_likely_doctors", + "smoothed_felt_isolated_7d", "smoothed_wfelt_isolated_7d", + "smoothed_worried_become_ill", "smoothed_wworried_become_ill", + ["smoothed_vaccine_barrier_appointment_time_tried", "msa"], ["smoothed_wvaccine_barrier_appointment_time_tried", "msa"], + ["smoothed_vaccine_barrier_childcare_tried", "msa"], ["smoothed_wvaccine_barrier_childcare_tried", "msa"], + ["smoothed_vaccine_barrier_document_tried", "msa"], ["smoothed_wvaccine_barrier_document_tried", "msa"], + ["smoothed_vaccine_barrier_eligible_tried", "msa"], ["smoothed_wvaccine_barrier_eligible_tried", "msa"], + ["smoothed_vaccine_barrier_language_tried", "msa"], ["smoothed_wvaccine_barrier_language_tried", "msa"], + ["smoothed_vaccine_barrier_no_appointments_tried", "msa"], ["smoothed_wvaccine_barrier_no_appointments_tried", "msa"], + ["smoothed_vaccine_barrier_none_tried", "msa"], ["smoothed_wvaccine_barrier_none_tried", "msa"], + ["smoothed_wvaccine_barrier_technical_difficulties_tried", "msa"], ["smoothed_vaccine_barrier_technical_difficulties_tried", "msa"], + ["smoothed_wvaccine_barrier_technology_access_tried", "msa"], ["smoothed_wvaccine_barrier_technology_access_tried", "msa"], + ["smoothed_vaccine_barrier_time_tried", "msa"], ["smoothed_wvaccine_barrier_time_tried", "msa"], + ["smoothed_vaccine_barrier_travel_tried", "msa"], ["smoothed_wvaccine_barrier_travel_tried", "msa"], + ["smoothed_vaccine_barrier_type_tried", "msa"], ["smoothed_wvaccine_barrier_type_tried", "msa"] }, "indicator-combination": { "max_age": 4, From 0204d883f8a6ad5271fe1a7b4a8b80474c0d1ba3 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 15 Sep 2021 11:51:14 -0400 Subject: [PATCH 099/133] add closing bracket --- ansible/templates/sir_complainsalot-params-prod.json.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/ansible/templates/sir_complainsalot-params-prod.json.j2 b/ansible/templates/sir_complainsalot-params-prod.json.j2 index 9cc9a8250..7a1f5dddd 100644 --- a/ansible/templates/sir_complainsalot-params-prod.json.j2 +++ b/ansible/templates/sir_complainsalot-params-prod.json.j2 @@ -77,6 +77,7 @@ ["smoothed_vaccine_barrier_time_tried", "msa"], ["smoothed_wvaccine_barrier_time_tried", "msa"], ["smoothed_vaccine_barrier_travel_tried", "msa"], ["smoothed_wvaccine_barrier_travel_tried", "msa"], ["smoothed_vaccine_barrier_type_tried", "msa"], ["smoothed_wvaccine_barrier_type_tried", "msa"] + ] }, "indicator-combination": { "max_age": 4, From f36167627a050349f007f2e3f6def7107910747b Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Wed, 22 Sep 2021 15:44:13 -0700 Subject: [PATCH 100/133] Nancodes archiver: remove deleted file nan replacements --- _delphi_utils_python/delphi_utils/archive.py | 24 +-------- _delphi_utils_python/tests/test_archive.py | 51 +++----------------- 2 files changed, 8 insertions(+), 67 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/archive.py b/_delphi_utils_python/delphi_utils/archive.py index ea8f27ac4..e2e826396 100644 --- a/_delphi_utils_python/delphi_utils/archive.py +++ b/_delphi_utils_python/delphi_utils/archive.py @@ -254,26 +254,7 @@ def diff_exports(self) -> Tuple[Files, FileDiffMap, Files]: new_issues_df.to_csv(diff_file, na_rep="NA") common_diffs[after_file] = diff_file - export_csv_dtypes = { - "geo_id": str, "val": float, "se": float, "sample_size": float, - "missing_val": int, "missing_se": int, "missing_sample_size": int - } - - # Replace deleted files with empty versions, but only if the cached version is not - # already empty - deleted_files_nanfilled = [] - for deleted_file in deleted_files: - deleted_df = pd.read_csv(deleted_file, dtype=export_csv_dtypes) - print( - f"Diff deleted {deleted_file}; generating corresponding CSV with deleted rows." - ) - deleted_df[["val", "se", "sample_size"]] = np.nan - deleted_df[["missing_val", "missing_se", "missing_sample_size"]] = Nans.DELETED - filename = join(self.export_dir, basename(deleted_file)) - deleted_df.to_csv(filename, index=False) - deleted_files_nanfilled.append(filename) - - return deleted_files_nanfilled, common_diffs, new_files + return deleted_files, common_diffs, new_files def archive_exports(self, exported_files: Files) -> Tuple[Files, Files]: """ @@ -331,13 +312,12 @@ def run(self): self.update_cache() # Diff exports, and make incremental versions - deleted_files, common_diffs, new_files = self.diff_exports() + _, common_diffs, new_files = self.diff_exports() # Archive changed, new, and emptied deleted files to_archive = [f for f, diff in common_diffs.items() if diff is not None] to_archive += new_files - to_archive += deleted_files _, fails = self.archive_exports(to_archive) # Filter existing exports to exclude those that failed to archive diff --git a/_delphi_utils_python/tests/test_archive.py b/_delphi_utils_python/tests/test_archive.py index 111acf92f..ece76f556 100644 --- a/_delphi_utils_python/tests/test_archive.py +++ b/_delphi_utils_python/tests/test_archive.py @@ -135,16 +135,6 @@ def test_diff_and_filter_exports(self, tmp_path): "missing_sample_size": [Nans.DELETED] + [Nans.NOT_MISSING] * 2, }) - csv2_deleted = pd.DataFrame({ - "geo_id": ["1"], - "val": [np.nan], - "se": [np.nan], - "sample_size": [np.nan], - "missing_val": [Nans.DELETED], - "missing_se": [Nans.DELETED], - "missing_sample_size": [Nans.DELETED], - }) - arch_diff = ArchiveDiffer(cache_dir, export_dir) # Test diff_exports @@ -164,7 +154,7 @@ def test_diff_and_filter_exports(self, tmp_path): deleted_files, common_diffs, new_files = arch_diff.diff_exports() # Check return values - assert set(deleted_files) == {join(export_dir, "csv2.csv")} + assert set(deleted_files) == {join(cache_dir, "csv2.csv")} assert set(common_diffs.keys()) == { join(export_dir, f) for f in ["csv0.csv", "csv1.csv", "csv4.csv"]} assert set(new_files) == {join(export_dir, "csv3.csv")} @@ -175,8 +165,7 @@ def test_diff_and_filter_exports(self, tmp_path): # Check filesystem for actual files assert set(listdir(export_dir)) == { "csv0.csv", "csv1.csv", "csv1.csv.diff", - "csv3.csv", "csv4.csv", "csv4.csv.diff", - "csv2.csv" + "csv3.csv", "csv4.csv", "csv4.csv.diff" } assert_frame_equal( pd.read_csv(join(export_dir, "csv1.csv.diff"), dtype=CSV_DTYPES), @@ -194,11 +183,8 @@ def test_diff_and_filter_exports(self, tmp_path): arch_diff.filter_exports(common_diffs) - # Check exports directory just has incremental and deleted changes - assert set(listdir(export_dir)) == {"csv1.csv", "csv2.csv", "csv3.csv", "csv4.csv"} - assert_frame_equal( - pd.read_csv(join(export_dir, "csv2.csv"), dtype=CSV_DTYPES), - csv2_deleted) + # Check exports directory just has incremental changes + assert set(listdir(export_dir)) == {"csv1.csv", "csv3.csv", "csv4.csv"} assert_frame_equal( pd.read_csv(join(export_dir, "csv1.csv"), dtype=CSV_DTYPES), csv1_diff) @@ -325,7 +311,7 @@ def test_run(self, tmp_path, s3_client): assert_frame_equal(pd.read_csv(body, dtype=CSV_DTYPES), df) # Check exports directory just has incremental changes - assert set(listdir(export_dir)) == {"csv1.csv", "csv2.csv", "csv3.csv", "csv4.csv"} + assert set(listdir(export_dir)) == {"csv1.csv", "csv3.csv", "csv4.csv"} csv1_diff = pd.DataFrame({ "geo_id": ["3", "2", "4"], "val": [np.nan, 2.1, 4.0], @@ -338,18 +324,6 @@ def test_run(self, tmp_path, s3_client): assert_frame_equal( pd.read_csv(join(export_dir, "csv1.csv"), dtype=CSV_DTYPES), csv1_diff) - csv2_deleted = pd.DataFrame({ - "geo_id": ["1"], - "val": [np.nan], - "se": [np.nan], - "sample_size": [np.nan], - "missing_val": [Nans.DELETED], - "missing_se": [Nans.DELETED], - "missing_sample_size": [Nans.DELETED], - }) - assert_frame_equal( - pd.read_csv(join(export_dir, "csv2.csv"), dtype=CSV_DTYPES), - csv2_deleted) class TestGitArchiveDiffer: @@ -550,7 +524,7 @@ def test_run(self, tmp_path): original_branch.checkout() # Check exports directory just has incremental changes - assert set(listdir(export_dir)) == {"csv1.csv", "csv2.csv", "csv3.csv", "csv4.csv"} + assert set(listdir(export_dir)) == {"csv1.csv", "csv3.csv", "csv4.csv"} csv1_diff = pd.DataFrame({ "geo_id": ["3", "2", "4"], "val": [np.nan, 2.1, 4.0], @@ -563,19 +537,6 @@ def test_run(self, tmp_path): assert_frame_equal( pd.read_csv(join(export_dir, "csv1.csv"), dtype=CSV_DTYPES), csv1_diff) - csv2_deleted = pd.DataFrame({ - "geo_id": ["1"], - "val": [np.nan], - "se": [np.nan], - "sample_size": [np.nan], - "missing_val": [Nans.DELETED], - "missing_se": [Nans.DELETED], - "missing_sample_size": [Nans.DELETED], - }) - assert_frame_equal( - pd.read_csv(join(export_dir, "csv2.csv"), dtype=CSV_DTYPES), - csv2_deleted) - class TestFromParams: From ea68224f113b3192617231833c215c00986f12d1 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Mon, 27 Sep 2021 13:42:06 -0700 Subject: [PATCH 101/133] Update archiver docstrings Co-authored-by: Katie Mazaitis --- _delphi_utils_python/delphi_utils/archive.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/archive.py b/_delphi_utils_python/delphi_utils/archive.py index e2e826396..7f75c8cab 100644 --- a/_delphi_utils_python/delphi_utils/archive.py +++ b/_delphi_utils_python/delphi_utils/archive.py @@ -280,10 +280,9 @@ def filter_exports(self, common_diffs: FileDiffMap): Filter export directory to only contain relevant files. Filters down the export_dir to only contain: - 1) New files, 2) Changed files, filtered-down to the ADDED and CHANGED rows - only, and 3) Deleted files replaced with empty CSVs with the same name. Should - be called after archive_exports() so we archive the raw exports before potentially - modifying them. + 1) New files, 2) Changed files, filtered-down to the ADDED and CHANGED rows only. + Should be called after archive_exports() so we archive the raw exports before + potentially modifying them. Parameters ---------- From b873a95b686b8e9a797da262892bd36142e21510 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Mon, 27 Sep 2021 13:42:12 -0700 Subject: [PATCH 102/133] Update archiver docstrings Co-authored-by: Katie Mazaitis --- _delphi_utils_python/delphi_utils/archive.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_delphi_utils_python/delphi_utils/archive.py b/_delphi_utils_python/delphi_utils/archive.py index 7f75c8cab..eb8aac8d2 100644 --- a/_delphi_utils_python/delphi_utils/archive.py +++ b/_delphi_utils_python/delphi_utils/archive.py @@ -313,7 +313,7 @@ def run(self): # Diff exports, and make incremental versions _, common_diffs, new_files = self.diff_exports() - # Archive changed, new, and emptied deleted files + # Archive changed and new files only to_archive = [f for f, diff in common_diffs.items() if diff is not None] to_archive += new_files From 49a5766d0739dd3055cd08d74e0b30ba33ce31dc Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Mon, 27 Sep 2021 14:22:00 -0700 Subject: [PATCH 103/133] Nancodes archiver/export: explicit tests --- _delphi_utils_python/tests/test_archive.py | 30 ++++- _delphi_utils_python/tests/test_export.py | 125 ++++++++++++++++----- 2 files changed, 119 insertions(+), 36 deletions(-) diff --git a/_delphi_utils_python/tests/test_archive.py b/_delphi_utils_python/tests/test_archive.py index ece76f556..3050908f2 100644 --- a/_delphi_utils_python/tests/test_archive.py +++ b/_delphi_utils_python/tests/test_archive.py @@ -61,6 +61,17 @@ "se": [0.1], "sample_size": [10.0] }), + + # Common, but missing columns removed + "csv5": pd.DataFrame({ + "geo_id": ["1"], + "val": [1.0], + "se": [0.1], + "sample_size": [10.0], + "missing_val": [Nans.NOT_MISSING], + "missing_se": [Nans.NOT_MISSING], + "missing_sample_size": [Nans.NOT_MISSING], + }), } CSVS_AFTER = { @@ -106,6 +117,14 @@ "missing_se": [Nans.NOT_MISSING], "missing_sample_size": [Nans.NOT_MISSING], }), + + # Common, but missing columns removed + "csv5": pd.DataFrame({ + "geo_id": ["1"], + "val": [1.0], + "se": [0.1], + "sample_size": [10.0] + }), } class TestArchiveDiffer: @@ -156,7 +175,7 @@ def test_diff_and_filter_exports(self, tmp_path): # Check return values assert set(deleted_files) == {join(cache_dir, "csv2.csv")} assert set(common_diffs.keys()) == { - join(export_dir, f) for f in ["csv0.csv", "csv1.csv", "csv4.csv"]} + join(export_dir, f) for f in ["csv0.csv", "csv1.csv", "csv4.csv", "csv5.csv"]} assert set(new_files) == {join(export_dir, "csv3.csv")} assert common_diffs[join(export_dir, "csv0.csv")] is None assert common_diffs[join(export_dir, "csv1.csv")] == join( @@ -165,7 +184,8 @@ def test_diff_and_filter_exports(self, tmp_path): # Check filesystem for actual files assert set(listdir(export_dir)) == { "csv0.csv", "csv1.csv", "csv1.csv.diff", - "csv3.csv", "csv4.csv", "csv4.csv.diff" + "csv3.csv", "csv4.csv", "csv4.csv.diff", + "csv5.csv", "csv5.csv.diff" } assert_frame_equal( pd.read_csv(join(export_dir, "csv1.csv.diff"), dtype=CSV_DTYPES), @@ -184,7 +204,7 @@ def test_diff_and_filter_exports(self, tmp_path): arch_diff.filter_exports(common_diffs) # Check exports directory just has incremental changes - assert set(listdir(export_dir)) == {"csv1.csv", "csv3.csv", "csv4.csv"} + assert set(listdir(export_dir)) == {"csv1.csv", "csv3.csv", "csv4.csv", "csv5.csv"} assert_frame_equal( pd.read_csv(join(export_dir, "csv1.csv"), dtype=CSV_DTYPES), csv1_diff) @@ -311,7 +331,7 @@ def test_run(self, tmp_path, s3_client): assert_frame_equal(pd.read_csv(body, dtype=CSV_DTYPES), df) # Check exports directory just has incremental changes - assert set(listdir(export_dir)) == {"csv1.csv", "csv3.csv", "csv4.csv"} + assert set(listdir(export_dir)) == {"csv1.csv", "csv3.csv", "csv4.csv", "csv5.csv"} csv1_diff = pd.DataFrame({ "geo_id": ["3", "2", "4"], "val": [np.nan, 2.1, 4.0], @@ -524,7 +544,7 @@ def test_run(self, tmp_path): original_branch.checkout() # Check exports directory just has incremental changes - assert set(listdir(export_dir)) == {"csv1.csv", "csv3.csv", "csv4.csv"} + assert set(listdir(export_dir)) == {"csv1.csv", "csv3.csv", "csv4.csv", "csv5.csv"} csv1_diff = pd.DataFrame({ "geo_id": ["3", "2", "4"], "val": [np.nan, 2.1, 4.0], diff --git a/_delphi_utils_python/tests/test_export.py b/_delphi_utils_python/tests/test_export.py index b22a710cd..d9906300d 100644 --- a/_delphi_utils_python/tests/test_export.py +++ b/_delphi_utils_python/tests/test_export.py @@ -9,6 +9,7 @@ from delphi_utils import create_export_csv, Nans + def _clean_directory(directory): """Clean files out of a directory.""" for fname in listdir(directory): @@ -29,6 +30,7 @@ def _non_ignored_files_set(directory): class TestExport: """Tests for exporting CSVs.""" + # List of times for data points. TIMES = [ datetime.strptime(x, "%Y-%m-%d") @@ -54,9 +56,19 @@ class TestExport: "val": [3.12345678910, np.nan, 2.2, 2.6], "se": [0.15, 0.22, np.nan, 0.34], "sample_size": [100, 100, 101, None], - "missing_val": [Nans.NOT_MISSING, Nans.OTHER, Nans.NOT_MISSING, Nans.NOT_MISSING], - "missing_se": [Nans.NOT_MISSING, Nans.NOT_MISSING, Nans.OTHER, Nans.NOT_MISSING], - "missing_sample_size": [Nans.NOT_MISSING] * 3 + [Nans.OTHER] + "missing_val": [ + Nans.NOT_MISSING, + Nans.OTHER, + Nans.NOT_MISSING, + Nans.NOT_MISSING, + ], + "missing_se": [ + Nans.NOT_MISSING, + Nans.NOT_MISSING, + Nans.OTHER, + Nans.NOT_MISSING, + ], + "missing_sample_size": [Nans.NOT_MISSING] * 3 + [Nans.OTHER], } ) @@ -68,9 +80,19 @@ class TestExport: "val": [np.nan, np.nan, 2.2, 2.6], "se": [0.15, 0.22, np.nan, 0.34], "sample_size": [100, 100, 101, None], - "missing_val": [Nans.NOT_MISSING, Nans.OTHER, Nans.NOT_MISSING, Nans.NOT_MISSING], - "missing_se": [Nans.NOT_MISSING, Nans.NOT_MISSING, Nans.OTHER, Nans.NOT_MISSING], - "missing_sample_size": [Nans.NOT_MISSING] * 3 + [Nans.OTHER] + "missing_val": [ + Nans.NOT_MISSING, + Nans.OTHER, + Nans.NOT_MISSING, + Nans.NOT_MISSING, + ], + "missing_se": [ + Nans.NOT_MISSING, + Nans.NOT_MISSING, + Nans.OTHER, + Nans.NOT_MISSING, + ], + "missing_sample_size": [Nans.NOT_MISSING] * 3 + [Nans.OTHER], } ) @@ -116,10 +138,14 @@ def test_export_rounding(self): ) pd.testing.assert_frame_equal( pd.read_csv(join(self.TEST_DIR, "20200215_county_deaths_test.csv")), - pd.DataFrame({"geo_id": [51093, 51175], - "val": [round(3.12345678910, 7), 2.1], - "se": [0.15, 0.22], - "sample_size": [100, 100]}) + pd.DataFrame( + { + "geo_id": [51093, 51175], + "val": [round(3.12345678910, 7), 2.1], + "se": [0.15, 0.22], + "sample_size": [100, 100], + } + ), ) def test_export_without_metric(self): @@ -211,13 +237,16 @@ def test_export_with_null_removal(self): """Test that `remove_null_samples = True` removes entries with null samples.""" _clean_directory(self.TEST_DIR) - df_with_nulls = self.DF.copy().append({ - "geo_id": "66666", - "timestamp": datetime(2020, 6, 6), - "val": 10, - "se": 0.2, - "sample_size": pd.NA}, - ignore_index=True) + df_with_nulls = self.DF.copy().append( + { + "geo_id": "66666", + "timestamp": datetime(2020, 6, 6), + "val": 10, + "se": 0.2, + "sample_size": pd.NA, + }, + ignore_index=True, + ) create_export_csv( df=df_with_nulls, @@ -241,13 +270,16 @@ def test_export_without_null_removal(self): """Test that `remove_null_samples = False` does not remove entries with null samples.""" _clean_directory(self.TEST_DIR) - df_with_nulls = self.DF.copy().append({ - "geo_id": "66666", - "timestamp": datetime(2020, 6, 6), - "val": 10, - "se": 0.2, - "sample_size": pd.NA}, - ignore_index=True) + df_with_nulls = self.DF.copy().append( + { + "geo_id": "66666", + "timestamp": datetime(2020, 6, 6), + "val": 10, + "se": 0.2, + "sample_size": pd.NA, + }, + ignore_index=True, + ) create_export_csv( df=df_with_nulls, @@ -267,24 +299,56 @@ def test_export_without_null_removal(self): ) assert pd.read_csv(join(self.TEST_DIR, "20200606_state_test.csv")).size > 0 + def test_export_df_without_missingness(self): + _clean_directory(self.TEST_DIR) + + create_export_csv( + df=self.DF.copy(), export_dir=self.TEST_DIR, geo_res="county", sensor="test" + ) + df = pd.read_csv(join(self.TEST_DIR, "20200215_county_test.csv")).astype( + {"geo_id": str, "sample_size": int} + ) + expected_df = pd.DataFrame( + { + "geo_id": ["51093", "51175"], + "val": [3.12345678910, 2.1], + "se": [0.15, 0.22], + "sample_size": [100, 100], + } + ).astype({"geo_id": str, "sample_size": int}) + pd.testing.assert_frame_equal(df, expected_df) + def test_export_df_with_missingness(self): _clean_directory(self.TEST_DIR) create_export_csv( df=self.DF2.copy(), export_dir=self.TEST_DIR, - geo_res="state", + geo_res="county", sensor="test", - remove_null_samples=False ) assert _non_ignored_files_set(self.TEST_DIR) == set( [ - "20200215_state_test.csv", - "20200301_state_test.csv", - "20200315_state_test.csv", + "20200215_county_test.csv", + "20200301_county_test.csv", + "20200315_county_test.csv", ] ) - assert pd.read_csv(join(self.TEST_DIR, "20200315_state_test.csv")).size > 0 + df = pd.read_csv(join(self.TEST_DIR, "20200215_county_test.csv")).astype( + {"geo_id": str, "sample_size": int} + ) + expected_df = pd.DataFrame( + { + "geo_id": ["51093", "51175"], + "val": [3.12345678910, np.nan], + "se": [0.15, 0.22], + "sample_size": [100, 100], + "missing_val": [Nans.NOT_MISSING, Nans.OTHER], + "missing_se": [Nans.NOT_MISSING] * 2, + "missing_sample_size": [Nans.NOT_MISSING] * 2, + } + ).astype({"geo_id": str, "sample_size": int}) + pd.testing.assert_frame_equal(df, expected_df) @mock.patch("delphi_utils.logger") def test_export_df_with_contradictory_missingness(self, mock_logger): @@ -295,7 +359,6 @@ def test_export_df_with_contradictory_missingness(self, mock_logger): export_dir=self.TEST_DIR, geo_res="state", sensor="test", - remove_null_samples=False, logger=mock_logger ) assert _non_ignored_files_set(self.TEST_DIR) == set( From 874623e64b46d7b5fa81179cc3396d0eff26347d Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Wed, 15 Sep 2021 14:48:54 -0700 Subject: [PATCH 104/133] Update setup.py files to "Python :: 3.8" annotation --- _delphi_utils_python/setup.py | 2 +- changehc/setup.py | 2 +- claims_hosp/setup.py | 2 +- combo_cases_and_deaths/setup.py | 2 +- doctor_visits/setup.py | 2 +- google_symptoms/setup.py | 2 +- jhu/setup.py | 2 +- nchs_mortality/setup.py | 2 +- nowcast/setup.py | 2 +- quidel/setup.py | 2 +- quidel_covidtest/setup.py | 2 +- safegraph_patterns/setup.py | 2 +- sir_complainsalot/setup.py | 2 +- usafacts/setup.py | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/_delphi_utils_python/setup.py b/_delphi_utils_python/setup.py index 906bd0a4e..731d7e957 100644 --- a/_delphi_utils_python/setup.py +++ b/_delphi_utils_python/setup.py @@ -35,7 +35,7 @@ classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", ], packages=find_packages(), package_data={'': ['data/*.csv']} diff --git a/changehc/setup.py b/changehc/setup.py index 6edef8528..d702874b3 100644 --- a/changehc/setup.py +++ b/changehc/setup.py @@ -27,7 +27,7 @@ classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", ], packages=find_packages(), ) diff --git a/claims_hosp/setup.py b/claims_hosp/setup.py index c7527193b..6c88e4383 100644 --- a/claims_hosp/setup.py +++ b/claims_hosp/setup.py @@ -24,7 +24,7 @@ classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", ], packages=find_packages(), ) diff --git a/combo_cases_and_deaths/setup.py b/combo_cases_and_deaths/setup.py index 8ea4b187b..db97840a7 100644 --- a/combo_cases_and_deaths/setup.py +++ b/combo_cases_and_deaths/setup.py @@ -22,7 +22,7 @@ classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", ], packages=find_packages(), ) diff --git a/doctor_visits/setup.py b/doctor_visits/setup.py index 3c74af4b6..d7c0fe0a9 100644 --- a/doctor_visits/setup.py +++ b/doctor_visits/setup.py @@ -23,7 +23,7 @@ classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", ], packages=find_packages(), ) diff --git a/google_symptoms/setup.py b/google_symptoms/setup.py index 16a5aaecc..8cd7590ca 100644 --- a/google_symptoms/setup.py +++ b/google_symptoms/setup.py @@ -25,7 +25,7 @@ classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", ], packages=find_packages(), ) diff --git a/jhu/setup.py b/jhu/setup.py index 9f17f34f4..4c015a7c7 100644 --- a/jhu/setup.py +++ b/jhu/setup.py @@ -22,7 +22,7 @@ classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", ], packages=find_packages(), ) diff --git a/nchs_mortality/setup.py b/nchs_mortality/setup.py index 6ae6bfbf7..76915936b 100644 --- a/nchs_mortality/setup.py +++ b/nchs_mortality/setup.py @@ -25,7 +25,7 @@ classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", ], packages=find_packages(), ) diff --git a/nowcast/setup.py b/nowcast/setup.py index 6a2ebc88f..54e88ee80 100644 --- a/nowcast/setup.py +++ b/nowcast/setup.py @@ -25,7 +25,7 @@ classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", ], packages=find_packages(), ) diff --git a/quidel/setup.py b/quidel/setup.py index f912aa0d0..2fddc0cdd 100644 --- a/quidel/setup.py +++ b/quidel/setup.py @@ -26,7 +26,7 @@ classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", ], packages=find_packages(), ) diff --git a/quidel_covidtest/setup.py b/quidel_covidtest/setup.py index 9537a175b..4c01e8593 100644 --- a/quidel_covidtest/setup.py +++ b/quidel_covidtest/setup.py @@ -26,7 +26,7 @@ classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", ], packages=find_packages(), ) diff --git a/safegraph_patterns/setup.py b/safegraph_patterns/setup.py index 4053b622e..5ead94b33 100644 --- a/safegraph_patterns/setup.py +++ b/safegraph_patterns/setup.py @@ -22,7 +22,7 @@ classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", ], packages=find_packages(), ) diff --git a/sir_complainsalot/setup.py b/sir_complainsalot/setup.py index 3b18b5f19..c51253104 100644 --- a/sir_complainsalot/setup.py +++ b/sir_complainsalot/setup.py @@ -22,7 +22,7 @@ classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", ], packages=find_packages(), ) diff --git a/usafacts/setup.py b/usafacts/setup.py index b11951c7f..e15cae933 100644 --- a/usafacts/setup.py +++ b/usafacts/setup.py @@ -22,7 +22,7 @@ classifiers=[ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", ], packages=find_packages(), ) From f350dd60ff53d9dd8f46d1f6f166045b08c4977d Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Wed, 15 Sep 2021 14:42:04 -0700 Subject: [PATCH 105/133] Correctly ignore all receiving/*.csv files --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 94dfe3178..e664af2da 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ params.json # Do not commit output files -receiving/*.csv +**/receiving/*.csv # Do not commit hidden macOS files .DS_Store From d8274802ffad232f4f39cafb964f8263ff11ae62 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Thu, 16 Sep 2021 10:27:08 -0400 Subject: [PATCH 106/133] check if readr is installed --- .github/workflows/r-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/r-ci.yml b/.github/workflows/r-ci.yml index 116537194..6a196a3b2 100644 --- a/.github/workflows/r-ci.yml +++ b/.github/workflows/r-ci.yml @@ -48,7 +48,7 @@ jobs: ${{ runner.os }}-r-facebook-survey- - name: Install R dependencies run: | - if ( packageVersion("readr") != "1.4.0" ) { + if ( !require("readr") || packageVersion("readr") != "1.4.0" ) { install.packages("devtools") devtools::install_version("readr", version = "1.4.0") } From 3397277d8b073114e900f21736c0ccbeee7c8195 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 20 Sep 2021 12:07:35 -0400 Subject: [PATCH 107/133] only install remotes if not avail; upgrade as needed --- .github/workflows/r-ci.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/r-ci.yml b/.github/workflows/r-ci.yml index 6a196a3b2..9f81ca991 100644 --- a/.github/workflows/r-ci.yml +++ b/.github/workflows/r-ci.yml @@ -52,8 +52,11 @@ jobs: install.packages("devtools") devtools::install_version("readr", version = "1.4.0") } - install.packages("remotes") - remotes::update_packages(c("rcmdcheck", "mockr"), upgrade="always") + + if ( !require("remotes") ) { + install.packages("remotes") + } + remotes::update_packages(c("rcmdcheck", "mockr", "remotes"), upgrade="always") dependency_list <- remotes::dev_package_deps(dependencies=TRUE) remotes::update_packages(dependency_list$package[dependency_list$package != "readr"], upgrade="always") shell: Rscript {0} From 4b8ee7a36d881a7dbb611db8f6bf991c551bdc89 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 20 Sep 2021 12:08:18 -0400 Subject: [PATCH 108/133] test run with no cache --- .github/workflows/r-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/r-ci.yml b/.github/workflows/r-ci.yml index 9f81ca991..40d76986f 100644 --- a/.github/workflows/r-ci.yml +++ b/.github/workflows/r-ci.yml @@ -43,9 +43,9 @@ jobs: uses: actions/cache@v2 with: path: ${{ env.R_LIBS_USER }} - key: ${{ runner.os }}-r-facebook-survey-${{ steps.get-date.outputs.date }} + key: ${{ runner.os }}-r-facebook-survey-${{ steps.get-date.outputs.date }}-testcache restore-keys: | - ${{ runner.os }}-r-facebook-survey- + ${{ runner.os }}-r-facebook-survey-testcache - name: Install R dependencies run: | if ( !require("readr") || packageVersion("readr") != "1.4.0" ) { From b043d54cdeaaab8ab3bd068c1ae0ae214477246c Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 20 Sep 2021 12:40:32 -0400 Subject: [PATCH 109/133] Revert "test run with no cache" This reverts commit b32ed7f343c75835a6f47cd12120ca2f2588947d. --- .github/workflows/r-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/r-ci.yml b/.github/workflows/r-ci.yml index 40d76986f..68f175983 100644 --- a/.github/workflows/r-ci.yml +++ b/.github/workflows/r-ci.yml @@ -43,12 +43,12 @@ jobs: uses: actions/cache@v2 with: path: ${{ env.R_LIBS_USER }} - key: ${{ runner.os }}-r-facebook-survey-${{ steps.get-date.outputs.date }}-testcache + key: ${{ runner.os }}-r-facebook-survey-${{ steps.get-date.outputs.date }} restore-keys: | - ${{ runner.os }}-r-facebook-survey-testcache + ${{ runner.os }}-r-facebook-survey- - name: Install R dependencies run: | - if ( !require("readr") || packageVersion("readr") != "1.4.0" ) { + if ( packageVersion("readr") != "1.4.0" ) { install.packages("devtools") devtools::install_version("readr", version = "1.4.0") } From e40cd559632c0e80d60189434e6dab9579396776 Mon Sep 17 00:00:00 2001 From: alexcoda Date: Sun, 19 Sep 2021 11:35:05 -0700 Subject: [PATCH 110/133] Fix value check in quidel data_tools --- quidel/delphi_quidel/data_tools.py | 9 ++++----- quidel_covidtest/delphi_quidel_covidtest/data_tools.py | 9 ++++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/quidel/delphi_quidel/data_tools.py b/quidel/delphi_quidel/data_tools.py index 5d67dd812..6f9cb45c9 100644 --- a/quidel/delphi_quidel/data_tools.py +++ b/quidel/delphi_quidel/data_tools.py @@ -290,11 +290,10 @@ def raw_tests_per_device(devices, tests, min_obs): """ devices = devices.astype(float) tests = tests.astype(float) - if (np.any(np.isnan(devices)) or np.any(np.isnan(tests))): - print(devices) - print(tests) - raise ValueError('devices and tests should be non-negative ' - 'with no np.nan') + if np.any(np.isnan(devices)) or np.any(d < 0 for d in devices): + raise ValueError("devices should be non-negative with no np.nan") + if np.any(np.isnan(tests)) or np.any(d < 0 for d in tests): + raise ValueError("tests should be non-negative with no np.nan") if min_obs <= 0: raise ValueError('min_obs should be positive') tests[tests < min_obs] = np.nan diff --git a/quidel_covidtest/delphi_quidel_covidtest/data_tools.py b/quidel_covidtest/delphi_quidel_covidtest/data_tools.py index 18898ec8e..54995dc90 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/data_tools.py +++ b/quidel_covidtest/delphi_quidel_covidtest/data_tools.py @@ -296,11 +296,10 @@ def raw_tests_per_device(devices, tests, min_obs): """ devices = devices.astype(float) tests = tests.astype(float) - if (np.any(np.isnan(devices)) or np.any(np.isnan(tests))): - print(devices) - print(tests) - raise ValueError('devices and tests should be non-negative ' - 'with no np.nan') + if np.any(np.isnan(devices)) or np.any(d < 0 for d in devices): + raise ValueError("devices should be non-negative with no np.nan") + if np.any(np.isnan(tests)) or np.any(d < 0 for d in tests): + raise ValueError("tests should be non-negative with no np.nan") if min_obs <= 0: raise ValueError('min_obs should be positive') tests[tests < min_obs] = np.nan From 68490045804f7ce6d975181ba63bc2a0d7f9ba81 Mon Sep 17 00:00:00 2001 From: alexcoda Date: Sun, 19 Sep 2021 11:38:24 -0700 Subject: [PATCH 111/133] Replace print statements with logging And add log statements for data export variants --- .../delphi_combo_cases_and_deaths/run.py | 19 +++++------ covid_act_now/delphi_covid_act_now/run.py | 7 ++-- hhs_facilities/delphi_hhs_facilities/run.py | 3 ++ hhs_hosp/delphi_hhs/run.py | 4 +++ .../delphi_nchs_mortality/archive_diffs.py | 8 +++-- nchs_mortality/delphi_nchs_mortality/run.py | 7 ++-- quidel/delphi_quidel/data_tools.py | 3 -- quidel/delphi_quidel/pull.py | 34 +++++++++---------- quidel/delphi_quidel/run.py | 9 ++--- .../delphi_quidel_covidtest/data_tools.py | 3 -- .../delphi_quidel_covidtest/pull.py | 31 +++++++++-------- .../delphi_quidel_covidtest/run.py | 12 ++++--- .../delphi_safegraph_patterns/process.py | 16 ++++++--- .../delphi_safegraph_patterns/run.py | 3 +- usafacts/delphi_usafacts/run.py | 2 +- 15 files changed, 90 insertions(+), 71 deletions(-) diff --git a/combo_cases_and_deaths/delphi_combo_cases_and_deaths/run.py b/combo_cases_and_deaths/delphi_combo_cases_and_deaths/run.py index c54f3f3be..bddd1833f 100755 --- a/combo_cases_and_deaths/delphi_combo_cases_and_deaths/run.py +++ b/combo_cases_and_deaths/delphi_combo_cases_and_deaths/run.py @@ -33,14 +33,6 @@ covidcast.covidcast._ASYNC_CALL = True # pylint: disable=protected-access -def check_none_data_frame(data_frame, label, date_range): - """Log and return True when a data frame is None.""" - if data_frame is None: - print(f"{label} completely unavailable in range {date_range}") - return True - return False - - def maybe_append(usa_facts, jhu): """ Append dataframes if available, otherwise return USAFacts. @@ -133,7 +125,7 @@ def get_updated_dates(signal, geo, date_range, issue_range=None, fetcher=covidca issues=issue_range ) - if check_none_data_frame(usafacts_df, "USA-FACTS", date_range): + if usafacts_df is None: return None merged_df = merge_dfs_by_geos(usafacts_df, jhu_df, geo) @@ -142,7 +134,7 @@ def get_updated_dates(signal, geo, date_range, issue_range=None, fetcher=covidca return unique_dates -def combine_usafacts_and_jhu(signal, geo, date_range, issue_range=None, fetcher=covidcast.signal): +def combine_usafacts_and_jhu(signal, geo, date_range, logger, issue_range=None, fetcher=covidcast.signal): """Add rows for PR from JHU signals to USA-FACTS signals. For hhs and nation, fetch the county `num` data so we can compute the proportions correctly @@ -158,6 +150,7 @@ def combine_usafacts_and_jhu(signal, geo, date_range, issue_range=None, fetcher= # This occurs if the usafacts ~and the jhu query were empty if unique_dates is None: + logger.info("USA-FACTS completely unavailable for dates", date_range=date_range) return EMPTY_FRAME # Query only the represented window so that every geo is represented; a single window call is @@ -329,9 +322,15 @@ def run_module(params): log_exceptions=params["common"].get("log_exceptions", True)) for metric, geo_res, sensor_name, signal in variants: + logger.info("Generating signal and exporting to CSV", + geo_res = geo_res, + metric = metric, + sensor = sensor_name, + signal = signal) df = combine_usafacts_and_jhu(signal, geo_res, extend_raw_date_range(params, sensor_name), + logger, params['indicator']['issue_range']) df["timestamp"] = pd.to_datetime(df["timestamp"]) start_date = pd.to_datetime(params['indicator']['export_start_date']) diff --git a/covid_act_now/delphi_covid_act_now/run.py b/covid_act_now/delphi_covid_act_now/run.py index d9d983f0d..7cc96f6e4 100644 --- a/covid_act_now/delphi_covid_act_now/run.py +++ b/covid_act_now/delphi_covid_act_now/run.py @@ -45,7 +45,7 @@ def run_module(params): parquet_url = params["indicator"]["parquet_url"] # Load CAN county-level testing data - print("Pulling CAN data") + logger.info("Pulling CAN data") df_pq = load_data(parquet_url) df_county_testing = extract_testing_metrics(df_pq) @@ -54,7 +54,8 @@ def run_module(params): max_dates_exported = [] # Perform geo aggregations and export to receiving for geo_res in GEO_RESOLUTIONS: - print(f"Processing {geo_res}") + logger.info("Generating signal and exporting to CSV", + geo_res = geo_res) df = geo_map(df_county_testing, geo_res) # Export 'pcr_specimen_positivity_rate' @@ -79,7 +80,7 @@ def run_module(params): max_dates_exported.append(latest) # x2 to count both positivity and tests signals num_exported_files += exported_csv_dates.size * 2 - print(f"Exported dates: {earliest} to {latest}") + logger.info("Exported for dates between", earliest=earliest, latest=latest) elapsed_time_in_seconds = round(time.time() - start_time, 2) max_lag_in_days = (datetime.now() - min(max_dates_exported)).days diff --git a/hhs_facilities/delphi_hhs_facilities/run.py b/hhs_facilities/delphi_hhs_facilities/run.py index b41df5bcc..43d3a9bdd 100644 --- a/hhs_facilities/delphi_hhs_facilities/run.py +++ b/hhs_facilities/delphi_hhs_facilities/run.py @@ -36,6 +36,9 @@ def run_module(params) -> None: filled_fips_df = fill_missing_fips(raw_df, gmpr) stats = [] for geo, (sig_name, sig_cols, sig_func, sig_offset) in product(GEO_RESOLUTIONS, SIGNALS): + logger.info("Generating signal and exporting to CSV", + geo_res = geo, + signal_name = sig_name) mapped_df = convert_geo(filled_fips_df, geo, gmpr) output_df = generate_signal(mapped_df, sig_cols, sig_func, sig_offset) dates = create_export_csv(output_df, params["common"]["export_dir"], geo, sig_name) diff --git a/hhs_hosp/delphi_hhs/run.py b/hhs_hosp/delphi_hhs/run.py index 6af654845..45c2f5bc1 100644 --- a/hhs_hosp/delphi_hhs/run.py +++ b/hhs_hosp/delphi_hhs/run.py @@ -105,6 +105,10 @@ def run_module(params): geo_mapper = GeoMapper() stats = [] for sensor, smoother, geo in product(SIGNALS, SMOOTHERS, GEOS): + logger.info("Generating signal and exporting to CSV", + geo_res = geo, + sensor = sensor, + smoother = smoother) df = geo_mapper.add_geocode(make_signal(all_columns, sensor), "state_id", "state_code", diff --git a/nchs_mortality/delphi_nchs_mortality/archive_diffs.py b/nchs_mortality/delphi_nchs_mortality/archive_diffs.py index 6524203b3..e8b790cee 100644 --- a/nchs_mortality/delphi_nchs_mortality/archive_diffs.py +++ b/nchs_mortality/delphi_nchs_mortality/archive_diffs.py @@ -8,7 +8,7 @@ from delphi_utils import S3ArchiveDiffer -def arch_diffs(params, daily_arch_diff): +def arch_diffs(params, daily_arch_diff, logger): """ Archive differences between new updates and existing data. @@ -23,6 +23,8 @@ def arch_diffs(params, daily_arch_diff): Read from params.json daily_arch_diff: S3ArchiveDiffer Used to store and update cache + logger: logging.Logger + The structured logger. """ weekly_export_dir = params["common"]["weekly_export_dir"] daily_export_dir = params["common"]["daily_export_dir"] @@ -59,7 +61,7 @@ def arch_diffs(params, daily_arch_diff): # Report failures: someone should probably look at them for exported_file in fails: - print(f"Failed to archive (weekly) '{exported_file}'") + logger.info("Failed to archive (weekly)", filename={exported_file}) # Daily run of archiving utility # - Uploads changed files to S3 @@ -83,4 +85,4 @@ def arch_diffs(params, daily_arch_diff): # Report failures: someone should probably look at them for exported_file in fails: - print(f"Failed to archive (daily) '{exported_file}'") + logger.info("Failed to archive (daily)", filename={exported_file}) diff --git a/nchs_mortality/delphi_nchs_mortality/run.py b/nchs_mortality/delphi_nchs_mortality/run.py index fa0226fcb..1673e79c1 100644 --- a/nchs_mortality/delphi_nchs_mortality/run.py +++ b/nchs_mortality/delphi_nchs_mortality/run.py @@ -62,7 +62,8 @@ def run_module(params: Dict[str, Any]): df_pull = pull_nchs_mortality_data(token, test_file) for metric in METRICS: if metric == 'percent_of_expected_deaths': - print(metric) + logger.info("Generating signal and exporting to CSV", + metric = metric) df = df_pull.copy() df["val"] = df[metric] df["se"] = np.nan @@ -80,7 +81,9 @@ def run_module(params: Dict[str, Any]): stats.append((max(dates), len(dates))) else: for sensor in SENSORS: - print(metric, sensor) + logger.info("Generating signal and exporting to CSV", + metric = metric, + sensor = sensor) df = df_pull.copy() if sensor == "num": df["val"] = df[metric] diff --git a/quidel/delphi_quidel/data_tools.py b/quidel/delphi_quidel/data_tools.py index 6f9cb45c9..c0ebeb750 100644 --- a/quidel/delphi_quidel/data_tools.py +++ b/quidel/delphi_quidel/data_tools.py @@ -86,8 +86,6 @@ def _geographical_pooling(tpooled_tests, tpooled_ptests, min_obs, max_borrow_obs Same length as tests; proportion of parent observations to borrow. """ if (np.any(np.isnan(tpooled_tests)) or np.any(np.isnan(tpooled_ptests))): - print(tpooled_tests) - print(tpooled_ptests) raise ValueError('[parent] tests should be non-negative ' 'with no np.nan') if max_borrow_obs > min_obs: @@ -153,7 +151,6 @@ def raw_positive_prop(positives, tests, min_obs): positives = positives.astype(float) tests = tests.astype(float) if np.any(np.isnan(positives)) or np.any(np.isnan(tests)): - print(positives, tests) raise ValueError('positives and tests should be non-negative ' 'with no np.nan') if np.any(positives > tests): diff --git a/quidel/delphi_quidel/pull.py b/quidel/delphi_quidel/pull.py index 6132ffe40..3a0c6f25f 100644 --- a/quidel/delphi_quidel/pull.py +++ b/quidel/delphi_quidel/pull.py @@ -82,7 +82,7 @@ def regulate_column_names(df, test_type): return df def get_from_email(column_names, start_dates, end_dates, mail_server, - account, sender, password): + account, sender, password, logger): """ Get raw data from email account. @@ -98,6 +98,8 @@ def get_from_email(column_names, start_dates, end_dates, mail_server, email account of the sender password: str password of the datadrop email + logger: logging.Logger + The structured logger. Returns: df: pd.DataFrame @@ -131,7 +133,7 @@ def get_from_email(column_names, start_dates, end_dates, mail_server, if not whether_in_range: continue - print(f"Pulling {test} data received on %s"%search_date.date()) + logger.info(f"Pulling data", test=test, date=search_date.date()) toread = io.BytesIO() toread.write(att.payload) toread.seek(0) # reset the pointer @@ -153,10 +155,9 @@ def fix_zipcode(df): zipcode = int(float(zipcode)) zipcode5.append(zipcode) df['zip'] = zipcode5 - # print('Fixing %.2f %% of the data' % (fixnum * 100 / len(zipcode5))) return df -def fix_date(df): +def fix_date(df, logger): """ Remove invalid dates and select correct test date to use. @@ -175,16 +176,16 @@ def fix_date(df): df.insert(2, "timestamp", df["TestDate"]) mask = df["TestDate"] <= df["StorageDate"] - print("Removing %.2f%% of unusual data" % ((len(df) - np.sum(mask)) * 100 / len(df))) + logger.info(f"Removing {((len(df) - np.sum(mask)) * 100 / len(df)):.2f} of unusual data") df = df[mask] mask = df["StorageDate"] - df["TestDate"] > pd.Timedelta(days=90) - print("Fixing %.2f%% of outdated data" % (np.sum(mask) * 100 / len(df))) + logger.info(f"Fixing {(np.sum(mask) * 100 / len(df)):.2f} of outdated data") df["timestamp"].values[mask] = df["StorageDate"].values[mask] return df def preprocess_new_data(start_dates, end_dates, mail_server, account, - sender, password, test_mode): + sender, password, test_mode, logger): """ Pull and pre-process Quidel Antigen Test data from datadrop email. @@ -206,6 +207,8 @@ def preprocess_new_data(start_dates, end_dates, mail_server, account, password of the datadrop email test_mode: bool pull raw data from email or not + logger: logging.Logger + The structured logger. Returns: df: pd.DataFrame time_flag: datetime.date: @@ -220,7 +223,7 @@ def preprocess_new_data(start_dates, end_dates, mail_server, account, else: # Get new data from email dfs, time_flag = get_from_email(COLUMN_NAMES, start_dates, end_dates, - mail_server, account, sender, password) + mail_server, account, sender, password, logger) # No new data can be pulled if time_flag is None: @@ -228,13 +231,12 @@ def preprocess_new_data(start_dates, end_dates, mail_server, account, df_finals = {} for test_type in TEST_TYPES: - print(f"For {test_type}:") + logger.info(f"For {test_type}:") df = dfs[test_type] # Fix some of the fipcodes that are 9 digit instead of 5 digit df = fix_zipcode(df) # Create a column CanonicalDate according to StarageDate and TestDate - df = fix_date(df) - + df = fix_date(df, logger) # Compute numUniqueDevices numUniqueDevices = df.groupby( by=["timestamp", "zip"], @@ -309,17 +311,15 @@ def check_intermediate_file(cache_dir, pull_start_dates): sep=",", parse_dates=["timestamp"]) return previous_dfs, pull_start_dates -def pull_quidel_data(params): +def pull_quidel_data(params, logger): """ Pull new quidel test data and decide whether to combine it with historical records in ./cache. Parameters: params: dict including all the information read from params.json - END_FROM_TODAY_MINUS: int - report data until - X days - EXPORT_DAY_RANGE: int - number of dates to report + logger: logging.Logger + The structured logger. Returns: DataFrame: @@ -355,7 +355,7 @@ def pull_quidel_data(params): # Use _end_date to check the most recent date that we received data dfs, _end_date = preprocess_new_data( pull_start_dates, pull_end_dates, mail_server, - account, sender, password, test_mode) + account, sender, password, test_mode, logger) # Utilize previously stored data for test_type in TEST_TYPES: diff --git a/quidel/delphi_quidel/run.py b/quidel/delphi_quidel/run.py index 49f6ec66b..cd83d746a 100644 --- a/quidel/delphi_quidel/run.py +++ b/quidel/delphi_quidel/run.py @@ -63,9 +63,9 @@ def run_module(params: Dict[str, Any]): ) # Pull data and update export date - dfs, _end_date = pull_quidel_data(params["indicator"]) + dfs, _end_date = pull_quidel_data(params["indicator"], logger) if _end_date is None: - print("The data is up-to-date. Currently, no new data to be ingested.") + logger.info("The data is up-to-date. Currently, no new data to be ingested.") return export_end_dates = check_export_end_date(export_end_dates, _end_date, END_FROM_TODAY_MINUS) @@ -81,7 +81,6 @@ def run_module(params: Dict[str, Any]): for sensor in sensors: # Check either covid_ag or flu_ag test_type = "covid_ag" if "covid_ag" in sensor else "flu_ag" - print("state", sensor) data = dfs[test_type].copy() state_groups = geo_map("state", data, map_df).groupby("state_id") first_date, last_date = data["timestamp"].min(), data["timestamp"].max() @@ -97,7 +96,9 @@ def run_module(params: Dict[str, Any]): # County/HRR/MSA level for geo_res in GEO_RESOLUTIONS: - print(geo_res, sensor) + logger.info("Generating signal and exporting to CSV", + geo_res = geo_res, + sensor = sensor) data = dfs[test_type].copy() data, res_key = geo_map(geo_res, data, map_df) res_df = generate_sensor_for_other_geores( diff --git a/quidel_covidtest/delphi_quidel_covidtest/data_tools.py b/quidel_covidtest/delphi_quidel_covidtest/data_tools.py index 54995dc90..fac0b58b2 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/data_tools.py +++ b/quidel_covidtest/delphi_quidel_covidtest/data_tools.py @@ -92,8 +92,6 @@ def _geographical_pooling(tpooled_tests, tpooled_ptests, min_obs): """ if (np.any(np.isnan(tpooled_tests)) or np.any(np.isnan(tpooled_ptests))): - print(tpooled_tests) - print(tpooled_ptests) raise ValueError('[parent] tests should be non-negative ' 'with no np.nan') # STEP 1: "TOP UP" USING PARENT LOCATION @@ -156,7 +154,6 @@ def raw_positive_prop(positives, tests, min_obs): positives = positives.astype(float) tests = tests.astype(float) if np.any(np.isnan(positives)) or np.any(np.isnan(tests)): - print(positives, tests) raise ValueError('positives and tests should be non-negative ' 'with no np.nan') if np.any(positives > tests): diff --git a/quidel_covidtest/delphi_quidel_covidtest/pull.py b/quidel_covidtest/delphi_quidel_covidtest/pull.py index fe042ed38..9ce036e10 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/pull.py +++ b/quidel_covidtest/delphi_quidel_covidtest/pull.py @@ -8,7 +8,7 @@ import pandas as pd import numpy as np -def get_from_s3(start_date, end_date, bucket): +def get_from_s3(start_date, end_date, bucket, logger): """ Get raw data from aws s3 bucket. @@ -19,6 +19,8 @@ def get_from_s3(start_date, end_date, bucket): pull data from file tagged with date on/before the end date bucket: s3.Bucket the aws s3 bucket that stores quidel data + logger: logging.Logger + The structured logger. output: df: pd.DataFrame time_flag: datetime.datetime @@ -49,7 +51,7 @@ def get_from_s3(start_date, end_date, bucket): for search_date in [start_date + timedelta(days=x) for x in range(n_days)]: if search_date in s3_files.keys(): # Avoid appending duplicate datasets - print("Pulling data received on %s"%search_date.date()) + logger.info(f"Pulling data received on {search_date.date()}") # Fetch data received on the same day for fn in s3_files[search_date]: @@ -76,10 +78,9 @@ def fix_zipcode(df): zipcode = int(float(zipcode)) zipcode5.append(zipcode) df['zip'] = zipcode5 - # print('Fixing %.2f %% of the data' % (fixnum * 100 / len(zipcode5))) return df -def fix_date(df): +def fix_date(df, logger): """ Remove invalid dates and select correct test date to use. @@ -98,15 +99,15 @@ def fix_date(df): df.insert(2, "timestamp", df["TestDate"]) mask = df["TestDate"] <= df["StorageDate"] - print("Removing %.2f%% of unusual data" % ((len(df) - np.sum(mask)) * 100 / len(df))) + logger.info(f"Removing {((len(df) - np.sum(mask)) * 100 / len(df)):.2f} of unusual data") df = df[mask] mask = df["StorageDate"] - df["TestDate"] > pd.Timedelta(days=90) - print("Fixing %.2f%% of outdated data" % (np.sum(mask) * 100 / len(df))) + logger.info(f"Fixing {(np.sum(mask) * 100 / len(df)):.2f} of outdated data") df["timestamp"].values[mask] = df["StorageDate"].values[mask] return df -def preprocess_new_data(start_date, end_date, params, test_mode): +def preprocess_new_data(start_date, end_date, params, test_mode, logger): """ Pull and pre-process Quidel Covid Test data. @@ -123,6 +124,8 @@ def preprocess_new_data(start_date, end_date, params, test_mode): read from params.json test_mode: bool pull raw data from s3 or not + logger: logging.Logger + The structured logger. output: df: pd.DataFrame time_flag: datetime.date: @@ -144,7 +147,7 @@ def preprocess_new_data(start_date, end_date, params, test_mode): aws_secret_access_key=aws_secret_access_key) bucket = s3.Bucket(bucket_name) # Get new data from s3 - df, time_flag = get_from_s3(start_date, end_date, bucket) + df, time_flag = get_from_s3(start_date, end_date, bucket, logger) # No new data can be pulled if time_flag is None: @@ -154,7 +157,7 @@ def preprocess_new_data(start_date, end_date, params, test_mode): df = fix_zipcode(df) # Create a column CanonicalDate according to StarageDate and TestDate - df = fix_date(df) + df = fix_date(df, logger) # Compute overallPositive overall_pos = df[df["OverallResult"] == "positive"].groupby( @@ -197,7 +200,7 @@ def check_intermediate_file(cache_dir, pull_start_date): return previous_df, pull_start_date return None, pull_start_date -def pull_quidel_covidtest(params): +def pull_quidel_covidtest(params, logger): """Pull the quidel covid test data. Conditionally merge new data with historical data from ./cache. @@ -205,10 +208,8 @@ def pull_quidel_covidtest(params): Parameters: params: dict including all the information read from params.json - end_from_today_minus: int - report data until - X days - export_day_range: int - number of dates to report + logger: logging.Logger + The structured logger. Returns: DataFrame: @@ -237,7 +238,7 @@ def pull_quidel_covidtest(params): # Pull data from the file at 5 digit zipcode level # Use _end_date to check the most recent date that we received data df, _end_date = preprocess_new_data( - pull_start_date, pull_end_date, params, test_mode) + pull_start_date, pull_end_date, params, test_mode, logger) # Utilize previously stored data if previous_df is not None: diff --git a/quidel_covidtest/delphi_quidel_covidtest/run.py b/quidel_covidtest/delphi_quidel_covidtest/run.py index d82f80135..5f084440c 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/run.py +++ b/quidel_covidtest/delphi_quidel_covidtest/run.py @@ -76,9 +76,9 @@ def run_module(params: Dict[str, Any]): export_day_range = params["indicator"]["export_day_range"] # Pull data and update export date - df, _end_date = pull_quidel_covidtest(params["indicator"]) + df, _end_date = pull_quidel_covidtest(params["indicator"], logger) if _end_date is None: - print("The data is up-to-date. Currently, no new data to be ingested.") + logger.info("The data is up-to-date. Currently, no new data to be ingested.") return export_end_date = check_export_end_date(export_end_date, _end_date, END_FROM_TODAY_MINUS) @@ -98,7 +98,9 @@ def run_module(params: Dict[str, Any]): geo_data, res_key = geo_map(geo_res, data) geo_groups = geo_data.groupby(res_key) for sensor in sensors: - print(geo_res, sensor) + logger.info("Generating signal and exporting to CSV", + geo_res=geo_res, + sensor=sensor) if sensor.endswith(SMOOTHED_POSITIVE): smoothers[sensor] = smoothers.pop(SMOOTHED_POSITIVE) elif sensor.endswith(RAW_POSITIVE): @@ -125,7 +127,9 @@ def run_module(params: Dict[str, Any]): for geo_res in PARENT_GEO_RESOLUTIONS: geo_data, res_key = geo_map(geo_res, data) for sensor in sensors: - print(geo_res, sensor) + logger.info("Generating signal and exporting to CSV", + geo_res=geo_res, + sensor=sensor) res_df = generate_sensor_for_parent_geo( geo_groups, geo_data, res_key, smooth=smoothers[sensor][1], device=smoothers[sensor][0], first_date=first_date, diff --git a/safegraph_patterns/delphi_safegraph_patterns/process.py b/safegraph_patterns/delphi_safegraph_patterns/process.py index 1445ce028..330cf6762 100644 --- a/safegraph_patterns/delphi_safegraph_patterns/process.py +++ b/safegraph_patterns/delphi_safegraph_patterns/process.py @@ -125,7 +125,7 @@ def aggregate(df, metric, geo_res): return df.rename({geo_key: "geo_id"}, axis=1) def process(fname, sensors, metrics, geo_resolutions, - export_dir, brand_df, stats): + export_dir, brand_df, stats, logger): """ Process an input census block group-level CSV and export it. @@ -135,16 +135,20 @@ def process(fname, sensors, metrics, geo_resolutions, ---------- fname: str Input filename. - metrics: List[Tuple[str, bool]] - List of (metric_name, wip). sensors: List[str] List of (sensor) + metrics: List[Tuple[str, bool]] + List of (metric_name, wip). geo_resolutions: List[str] List of geo resolutions to export the data. + export_dir: str + The directory to export files to. brand_df: pd.DataFrame mapping info from naics_code to safegraph_brand_id stats: List[Tuple[datetime, int]] List to which we will add (max export date, number of export dates) + logger: logging.Logger + The structured logger. Returns ------- @@ -164,7 +168,7 @@ def process(fname, sensors, metrics, geo_resolutions, usecols=used_cols, parse_dates=["date_range_start", "date_range_end"]) dfs = construct_signals(df, metric_names, naics_codes, brand_df) - print("Finished pulling data from " + fname) + logger.info("Finished pulling data.", filename=fname) else: files = glob.glob(f'{fname}/**/*.csv.gz', recursive=True) dfs_dict = {"bars_visit": [], "restaurants_visit": []} @@ -180,9 +184,11 @@ def process(fname, sensors, metrics, geo_resolutions, ).groupby(["timestamp", "zip"]).sum().reset_index() dfs["restaurants_visit"] = pd.concat(dfs_dict["restaurants_visit"] ).groupby(["timestamp", "zip"]).sum().reset_index() - print("Finished pulling data from " + fname) + logger.info("Finished pulling data.", filename=fname) for geo_res, sensor in product(geo_resolutions, sensors): for metric, wip in zip(metric_names, wips): + logger.info("Generating signal and exporting to CSV", + geo_res=geo_res, metric=metric, sensor=sensor) df_export = aggregate(dfs[metric], metric, geo_res) df_export["val"] = df_export["_".join([metric, sensor])] df_export["se"] = np.nan diff --git a/safegraph_patterns/delphi_safegraph_patterns/run.py b/safegraph_patterns/delphi_safegraph_patterns/run.py index ffb0e4eb7..6eb474b9b 100644 --- a/safegraph_patterns/delphi_safegraph_patterns/run.py +++ b/safegraph_patterns/delphi_safegraph_patterns/run.py @@ -101,7 +101,8 @@ def run_module(params): sensors=SENSORS, geo_resolutions=GEO_RESOLUTIONS, export_dir=export_dir, - stats=stats + stats=stats, + logger=logger, ) with mp.Pool(n_core) as pool: diff --git a/usafacts/delphi_usafacts/run.py b/usafacts/delphi_usafacts/run.py index 90c11e28a..4c659679a 100644 --- a/usafacts/delphi_usafacts/run.py +++ b/usafacts/delphi_usafacts/run.py @@ -98,7 +98,7 @@ def run_module(params: Dict[str, Dict[str, Any]]): METRICS, GEO_RESOLUTIONS, SENSORS, SMOOTHERS): if "cumulative" in sensor and "seven_day_average" in smoother: continue - logger.info("generating signal and exporting to CSV", + logger.info("Generating signal and exporting to CSV", geo_res = geo_res, metric = metric, sensor = sensor, From ff84e3ae668978396a258fa9c34715e0801c4663 Mon Sep 17 00:00:00 2001 From: alexcoda Date: Sun, 19 Sep 2021 12:00:16 -0700 Subject: [PATCH 112/133] lint --- nchs_mortality/delphi_nchs_mortality/run.py | 2 +- quidel/delphi_quidel/pull.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/nchs_mortality/delphi_nchs_mortality/run.py b/nchs_mortality/delphi_nchs_mortality/run.py index 1673e79c1..1cf3d36d5 100644 --- a/nchs_mortality/delphi_nchs_mortality/run.py +++ b/nchs_mortality/delphi_nchs_mortality/run.py @@ -110,7 +110,7 @@ def run_module(params: Dict[str, Any]): # - Uploads changed files to S3 # - Does not export any issues into receiving if "archive" in params: - arch_diffs(params, daily_arch_diff) + arch_diffs(params, daily_arch_diff, logger) elapsed_time_in_seconds = round(time.time() - start_time, 2) min_max_date = stats and min(s[0] for s in stats) diff --git a/quidel/delphi_quidel/pull.py b/quidel/delphi_quidel/pull.py index 3a0c6f25f..1643f9304 100644 --- a/quidel/delphi_quidel/pull.py +++ b/quidel/delphi_quidel/pull.py @@ -133,7 +133,7 @@ def get_from_email(column_names, start_dates, end_dates, mail_server, if not whether_in_range: continue - logger.info(f"Pulling data", test=test, date=search_date.date()) + logger.info("Pulling data", test=test, date=search_date.date()) toread = io.BytesIO() toread.write(att.payload) toread.seek(0) # reset the pointer From 74a84e45dc2ac25dd4b90c0fe252d240628463d3 Mon Sep 17 00:00:00 2001 From: alexcoda Date: Sun, 19 Sep 2021 12:04:01 -0700 Subject: [PATCH 113/133] lint --- combo_cases_and_deaths/delphi_combo_cases_and_deaths/run.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/combo_cases_and_deaths/delphi_combo_cases_and_deaths/run.py b/combo_cases_and_deaths/delphi_combo_cases_and_deaths/run.py index bddd1833f..7fbaa2898 100755 --- a/combo_cases_and_deaths/delphi_combo_cases_and_deaths/run.py +++ b/combo_cases_and_deaths/delphi_combo_cases_and_deaths/run.py @@ -134,7 +134,8 @@ def get_updated_dates(signal, geo, date_range, issue_range=None, fetcher=covidca return unique_dates -def combine_usafacts_and_jhu(signal, geo, date_range, logger, issue_range=None, fetcher=covidcast.signal): +def combine_usafacts_and_jhu(signal, geo, date_range, logger, + issue_range=None, fetcher=covidcast.signal): """Add rows for PR from JHU signals to USA-FACTS signals. For hhs and nation, fetch the county `num` data so we can compute the proportions correctly From 6bfd72436370272e538969a204e5abc4b828ab56 Mon Sep 17 00:00:00 2001 From: alexcoda Date: Sun, 19 Sep 2021 12:10:44 -0700 Subject: [PATCH 114/133] Fix missing logger in tests --- quidel/tests/test_pull.py | 5 ++++- quidel_covidtest/tests/test_pull.py | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/quidel/tests/test_pull.py b/quidel/tests/test_pull.py index 435624f7e..bf27b0bd6 100644 --- a/quidel/tests/test_pull.py +++ b/quidel/tests/test_pull.py @@ -1,3 +1,4 @@ +import logging from datetime import datetime import pandas as pd @@ -36,6 +37,8 @@ def test_fix_date(self): class TestingPullData: def test_pull_quidel_data(self): + logger = logging.Logger("test_logger") + dfs, _ = pull_quidel_data({ "static_file_dir": "../static", "input_cache_dir": "./cache", @@ -49,7 +52,7 @@ def test_pull_quidel_data(self): "sender": "", "wip_signal": [""], "test_mode": True - }) + }, logger) # For covid_ag df = dfs["covid_ag"] diff --git a/quidel_covidtest/tests/test_pull.py b/quidel_covidtest/tests/test_pull.py index 48bb48d14..acdae32fe 100644 --- a/quidel_covidtest/tests/test_pull.py +++ b/quidel_covidtest/tests/test_pull.py @@ -1,3 +1,4 @@ +import logging from datetime import datetime import pandas as pd @@ -36,6 +37,8 @@ def test_fix_date(self): class TestingPullData: def test_pull_quidel_covidtest(self): + logger = logging.Logger("test_logger") + df, _ = pull_quidel_covidtest({ "static_file_dir": "../static", "input_cache_dir": "./cache", @@ -50,7 +53,7 @@ def test_pull_quidel_covidtest(self): "bucket_name": "", "wip_signal": "", "test_mode": True - }) + }, logger) first_date = df["timestamp"].min().date() last_date = df["timestamp"].max().date() From 50fd522605e0c43364f15b20f98aa16de798a433 Mon Sep 17 00:00:00 2001 From: alexcoda Date: Sun, 19 Sep 2021 12:22:02 -0700 Subject: [PATCH 115/133] Fix missing logger in tests --- combo_cases_and_deaths/tests/test_run.py | 14 ++++++++------ quidel/tests/test_pull.py | 7 +++---- quidel_covidtest/tests/test_pull.py | 8 ++++---- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/combo_cases_and_deaths/tests/test_run.py b/combo_cases_and_deaths/tests/test_run.py index 8d03627d4..3432d22d1 100644 --- a/combo_cases_and_deaths/tests/test_run.py +++ b/combo_cases_and_deaths/tests/test_run.py @@ -1,4 +1,5 @@ """Tests for running combo cases and deaths indicator.""" +import logging from datetime import date from itertools import product import os @@ -17,6 +18,7 @@ COLUMN_MAPPING) from delphi_combo_cases_and_deaths.constants import METRICS, SMOOTH_TYPES, SENSORS +LOGGER = logging.Logger("test_logger") def test_issue_dates(): """The smoothed value for a particular date is computed from the raw @@ -98,7 +100,7 @@ def make_mock(geo): ("1 1", 4, 1 if geo in ["nation", "hhs"] else 2), ("0 0", 2, 0) ]: - df = combine_usafacts_and_jhu("", geo, date_range, fetcher=mock_covidcast_signal) + df = combine_usafacts_and_jhu("", geo, date_range, LOGGER, fetcher=mock_covidcast_signal) assert df.size == expected_size * len(COLUMN_MAPPING), f""" Wrong number of rows in combined data frame for the number of available signals. @@ -126,7 +128,7 @@ def test_multiple_issues(mock_covidcast_signal): }), None ] * 2 - result = combine_usafacts_and_jhu("confirmed_incidence_num", "county", date_range=(0, 1), fetcher=mock_covidcast_signal) + result = combine_usafacts_and_jhu("confirmed_incidence_num", "county", date_range=(0, 1), logger=LOGGER, fetcher=mock_covidcast_signal) pd.testing.assert_frame_equal( result, pd.DataFrame( @@ -186,7 +188,7 @@ def test_combine_usafacts_and_jhu_special_geos(mock_covidcast_signal): ] * 6 # each call to combine_usafacts_and_jhu makes (2 + 2 * len(unique_timestamps)) = 12 calls to the fetcher pd.testing.assert_frame_equal( - combine_usafacts_and_jhu("confirmed_incidence_num", "nation", date_range=(0, 1), fetcher=mock_covidcast_signal), + combine_usafacts_and_jhu("confirmed_incidence_num", "nation", date_range=(0, 1), logger=LOGGER, fetcher=mock_covidcast_signal), pd.DataFrame({"timestamp": [20200101], "geo_id": ["us"], "val": [50 + 100 + 200], @@ -194,7 +196,7 @@ def test_combine_usafacts_and_jhu_special_geos(mock_covidcast_signal): "sample_size": [None]}) ) pd.testing.assert_frame_equal( - combine_usafacts_and_jhu("confirmed_incidence_prop", "nation", date_range=(0, 1), fetcher=mock_covidcast_signal), + combine_usafacts_and_jhu("confirmed_incidence_prop", "nation", date_range=(0, 1), logger=LOGGER, fetcher=mock_covidcast_signal), pd.DataFrame({"timestamp": [20200101], "geo_id": ["us"], "val": [(50 + 100 + 200) / (4903185 + 3723066) * 100000], @@ -202,7 +204,7 @@ def test_combine_usafacts_and_jhu_special_geos(mock_covidcast_signal): "sample_size": [None]}) ) pd.testing.assert_frame_equal( - combine_usafacts_and_jhu("confirmed_incidence_num", "county", date_range=(0, 1), fetcher=mock_covidcast_signal), + combine_usafacts_and_jhu("confirmed_incidence_num", "county", date_range=(0, 1), logger=LOGGER, fetcher=mock_covidcast_signal), pd.DataFrame({"geo_id": ["01000", "01001", "72001"], "val": [50, 100, 200], "timestamp": [20200101, 20200101, 20200101]}, @@ -229,7 +231,7 @@ def test_no_nation_jhu(mock_covidcast_signal): "value": [1], "timestamp": [20200101]}) ] - result = combine_usafacts_and_jhu("_num", "nation", date_range=(0, 1), fetcher=mock_covidcast_signal) + result = combine_usafacts_and_jhu("_num", "nation", date_range=(0, 1), logger=LOGGER, fetcher=mock_covidcast_signal) assert mock_covidcast_signal.call_args_list[-1] == call( "jhu-csse", diff --git a/quidel/tests/test_pull.py b/quidel/tests/test_pull.py index bf27b0bd6..1f36fb85e 100644 --- a/quidel/tests/test_pull.py +++ b/quidel/tests/test_pull.py @@ -14,6 +14,7 @@ END_FROM_TODAY_MINUS = 5 EXPORT_DAY_RANGE = 40 +LOGGER = logging.Logger("test_logger") class TestFixData: def test_fix_zipcode(self): @@ -29,7 +30,7 @@ def test_fix_date(self): datetime(2020, 6, 14), datetime(2020, 7, 10)], "TestDate":[datetime(2020, 1, 19), datetime(2020, 6, 10), datetime(2020, 6, 11), datetime(2020, 7, 2)]}) - df = fix_date(df) + df = fix_date(df, LOGGER) assert set(df["timestamp"]) == set([datetime(2020, 5, 19), datetime(2020, 6, 11), datetime(2020, 7, 2)]) @@ -37,8 +38,6 @@ def test_fix_date(self): class TestingPullData: def test_pull_quidel_data(self): - logger = logging.Logger("test_logger") - dfs, _ = pull_quidel_data({ "static_file_dir": "../static", "input_cache_dir": "./cache", @@ -52,7 +51,7 @@ def test_pull_quidel_data(self): "sender": "", "wip_signal": [""], "test_mode": True - }, logger) + }, LOGGER) # For covid_ag df = dfs["covid_ag"] diff --git a/quidel_covidtest/tests/test_pull.py b/quidel_covidtest/tests/test_pull.py index acdae32fe..01df4c7c6 100644 --- a/quidel_covidtest/tests/test_pull.py +++ b/quidel_covidtest/tests/test_pull.py @@ -15,6 +15,8 @@ END_FROM_TODAY_MINUS = 5 EXPORT_DAY_RANGE = 40 +LOGGER = logging.Logger("test_logger") + class TestFixData: def test_fix_zipcode(self): @@ -29,7 +31,7 @@ def test_fix_date(self): datetime(2020, 6, 14), datetime(2020, 7, 10)], "TestDate":[datetime(2020, 1, 19), datetime(2020, 6, 10), datetime(2020, 6, 11), datetime(2020, 7, 2)]}) - df = fix_date(df) + df = fix_date(df, LOGGER) assert set(df["timestamp"]) == set([datetime(2020, 5, 19), datetime(2020, 6, 11), datetime(2020, 7, 2)]) @@ -37,8 +39,6 @@ def test_fix_date(self): class TestingPullData: def test_pull_quidel_covidtest(self): - logger = logging.Logger("test_logger") - df, _ = pull_quidel_covidtest({ "static_file_dir": "../static", "input_cache_dir": "./cache", @@ -53,7 +53,7 @@ def test_pull_quidel_covidtest(self): "bucket_name": "", "wip_signal": "", "test_mode": True - }, logger) + }, LOGGER) first_date = df["timestamp"].min().date() last_date = df["timestamp"].max().date() From d6d05345bd0ba220a64679a3e5fead100c26f95b Mon Sep 17 00:00:00 2001 From: alexcoda Date: Sun, 19 Sep 2021 12:33:18 -0700 Subject: [PATCH 116/133] Instantiate logger correctly in tests --- combo_cases_and_deaths/tests/test_run.py | 14 +++++++------- quidel/tests/test_pull.py | 6 +++--- quidel_covidtest/tests/test_pull.py | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/combo_cases_and_deaths/tests/test_run.py b/combo_cases_and_deaths/tests/test_run.py index 3432d22d1..e83af9abb 100644 --- a/combo_cases_and_deaths/tests/test_run.py +++ b/combo_cases_and_deaths/tests/test_run.py @@ -18,7 +18,7 @@ COLUMN_MAPPING) from delphi_combo_cases_and_deaths.constants import METRICS, SMOOTH_TYPES, SENSORS -LOGGER = logging.Logger("test_logger") +TEST_LOGGER = logging.getLogger() def test_issue_dates(): """The smoothed value for a particular date is computed from the raw @@ -100,7 +100,7 @@ def make_mock(geo): ("1 1", 4, 1 if geo in ["nation", "hhs"] else 2), ("0 0", 2, 0) ]: - df = combine_usafacts_and_jhu("", geo, date_range, LOGGER, fetcher=mock_covidcast_signal) + df = combine_usafacts_and_jhu("", geo, date_range, TEST_LOGGER, fetcher=mock_covidcast_signal) assert df.size == expected_size * len(COLUMN_MAPPING), f""" Wrong number of rows in combined data frame for the number of available signals. @@ -128,7 +128,7 @@ def test_multiple_issues(mock_covidcast_signal): }), None ] * 2 - result = combine_usafacts_and_jhu("confirmed_incidence_num", "county", date_range=(0, 1), logger=LOGGER, fetcher=mock_covidcast_signal) + result = combine_usafacts_and_jhu("confirmed_incidence_num", "county", date_range=(0, 1), logger=TEST_LOGGER, fetcher=mock_covidcast_signal) pd.testing.assert_frame_equal( result, pd.DataFrame( @@ -188,7 +188,7 @@ def test_combine_usafacts_and_jhu_special_geos(mock_covidcast_signal): ] * 6 # each call to combine_usafacts_and_jhu makes (2 + 2 * len(unique_timestamps)) = 12 calls to the fetcher pd.testing.assert_frame_equal( - combine_usafacts_and_jhu("confirmed_incidence_num", "nation", date_range=(0, 1), logger=LOGGER, fetcher=mock_covidcast_signal), + combine_usafacts_and_jhu("confirmed_incidence_num", "nation", date_range=(0, 1), logger=TEST_LOGGER, fetcher=mock_covidcast_signal), pd.DataFrame({"timestamp": [20200101], "geo_id": ["us"], "val": [50 + 100 + 200], @@ -196,7 +196,7 @@ def test_combine_usafacts_and_jhu_special_geos(mock_covidcast_signal): "sample_size": [None]}) ) pd.testing.assert_frame_equal( - combine_usafacts_and_jhu("confirmed_incidence_prop", "nation", date_range=(0, 1), logger=LOGGER, fetcher=mock_covidcast_signal), + combine_usafacts_and_jhu("confirmed_incidence_prop", "nation", date_range=(0, 1), logger=TEST_LOGGER, fetcher=mock_covidcast_signal), pd.DataFrame({"timestamp": [20200101], "geo_id": ["us"], "val": [(50 + 100 + 200) / (4903185 + 3723066) * 100000], @@ -204,7 +204,7 @@ def test_combine_usafacts_and_jhu_special_geos(mock_covidcast_signal): "sample_size": [None]}) ) pd.testing.assert_frame_equal( - combine_usafacts_and_jhu("confirmed_incidence_num", "county", date_range=(0, 1), logger=LOGGER, fetcher=mock_covidcast_signal), + combine_usafacts_and_jhu("confirmed_incidence_num", "county", date_range=(0, 1), logger=TEST_LOGGER, fetcher=mock_covidcast_signal), pd.DataFrame({"geo_id": ["01000", "01001", "72001"], "val": [50, 100, 200], "timestamp": [20200101, 20200101, 20200101]}, @@ -231,7 +231,7 @@ def test_no_nation_jhu(mock_covidcast_signal): "value": [1], "timestamp": [20200101]}) ] - result = combine_usafacts_and_jhu("_num", "nation", date_range=(0, 1), logger=LOGGER, fetcher=mock_covidcast_signal) + result = combine_usafacts_and_jhu("_num", "nation", date_range=(0, 1), logger=TEST_LOGGER, fetcher=mock_covidcast_signal) assert mock_covidcast_signal.call_args_list[-1] == call( "jhu-csse", diff --git a/quidel/tests/test_pull.py b/quidel/tests/test_pull.py index 1f36fb85e..17f596ce9 100644 --- a/quidel/tests/test_pull.py +++ b/quidel/tests/test_pull.py @@ -14,7 +14,7 @@ END_FROM_TODAY_MINUS = 5 EXPORT_DAY_RANGE = 40 -LOGGER = logging.Logger("test_logger") +TEST_LOGGER = logging.getLogger() class TestFixData: def test_fix_zipcode(self): @@ -30,7 +30,7 @@ def test_fix_date(self): datetime(2020, 6, 14), datetime(2020, 7, 10)], "TestDate":[datetime(2020, 1, 19), datetime(2020, 6, 10), datetime(2020, 6, 11), datetime(2020, 7, 2)]}) - df = fix_date(df, LOGGER) + df = fix_date(df, TEST_LOGGER) assert set(df["timestamp"]) == set([datetime(2020, 5, 19), datetime(2020, 6, 11), datetime(2020, 7, 2)]) @@ -51,7 +51,7 @@ def test_pull_quidel_data(self): "sender": "", "wip_signal": [""], "test_mode": True - }, LOGGER) + }, TEST_LOGGER) # For covid_ag df = dfs["covid_ag"] diff --git a/quidel_covidtest/tests/test_pull.py b/quidel_covidtest/tests/test_pull.py index 01df4c7c6..17ddbb6fd 100644 --- a/quidel_covidtest/tests/test_pull.py +++ b/quidel_covidtest/tests/test_pull.py @@ -15,7 +15,7 @@ END_FROM_TODAY_MINUS = 5 EXPORT_DAY_RANGE = 40 -LOGGER = logging.Logger("test_logger") +TEST_LOGGER = logging.getLogger() class TestFixData: def test_fix_zipcode(self): @@ -31,7 +31,7 @@ def test_fix_date(self): datetime(2020, 6, 14), datetime(2020, 7, 10)], "TestDate":[datetime(2020, 1, 19), datetime(2020, 6, 10), datetime(2020, 6, 11), datetime(2020, 7, 2)]}) - df = fix_date(df, LOGGER) + df = fix_date(df, TEST_LOGGER) assert set(df["timestamp"]) == set([datetime(2020, 5, 19), datetime(2020, 6, 11), datetime(2020, 7, 2)]) @@ -53,7 +53,7 @@ def test_pull_quidel_covidtest(self): "bucket_name": "", "wip_signal": "", "test_mode": True - }, LOGGER) + }, TEST_LOGGER) first_date = df["timestamp"].min().date() last_date = df["timestamp"].max().date() From 52f8cb26d25274b553c7e8322c6297347cff1924 Mon Sep 17 00:00:00 2001 From: alexcoda Date: Sun, 19 Sep 2021 12:38:08 -0700 Subject: [PATCH 117/133] Fix error check --- quidel/delphi_quidel/data_tools.py | 4 ++-- quidel_covidtest/delphi_quidel_covidtest/data_tools.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/quidel/delphi_quidel/data_tools.py b/quidel/delphi_quidel/data_tools.py index c0ebeb750..92afb2159 100644 --- a/quidel/delphi_quidel/data_tools.py +++ b/quidel/delphi_quidel/data_tools.py @@ -287,9 +287,9 @@ def raw_tests_per_device(devices, tests, min_obs): """ devices = devices.astype(float) tests = tests.astype(float) - if np.any(np.isnan(devices)) or np.any(d < 0 for d in devices): + if np.any(np.isnan(devices)) or np.any(devices < 0): raise ValueError("devices should be non-negative with no np.nan") - if np.any(np.isnan(tests)) or np.any(d < 0 for d in tests): + if np.any(np.isnan(tests)) or np.any(tests < 0): raise ValueError("tests should be non-negative with no np.nan") if min_obs <= 0: raise ValueError('min_obs should be positive') diff --git a/quidel_covidtest/delphi_quidel_covidtest/data_tools.py b/quidel_covidtest/delphi_quidel_covidtest/data_tools.py index fac0b58b2..f89a353ed 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/data_tools.py +++ b/quidel_covidtest/delphi_quidel_covidtest/data_tools.py @@ -293,9 +293,9 @@ def raw_tests_per_device(devices, tests, min_obs): """ devices = devices.astype(float) tests = tests.astype(float) - if np.any(np.isnan(devices)) or np.any(d < 0 for d in devices): + if np.any(np.isnan(devices)) or np.any(devices < 0): raise ValueError("devices should be non-negative with no np.nan") - if np.any(np.isnan(tests)) or np.any(d < 0 for d in tests): + if np.any(np.isnan(tests)) or np.any(tests < 0): raise ValueError("tests should be non-negative with no np.nan") if min_obs <= 0: raise ValueError('min_obs should be positive') From 511bf2ee250d6ac892885952b280542d99cb93a8 Mon Sep 17 00:00:00 2001 From: Alex Coda Date: Tue, 21 Sep 2021 17:34:46 -0700 Subject: [PATCH 118/133] Update quidel/delphi_quidel/pull.py Co-authored-by: Katie Mazaitis --- quidel/delphi_quidel/pull.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quidel/delphi_quidel/pull.py b/quidel/delphi_quidel/pull.py index 1643f9304..ffbba3283 100644 --- a/quidel/delphi_quidel/pull.py +++ b/quidel/delphi_quidel/pull.py @@ -176,7 +176,7 @@ def fix_date(df, logger): df.insert(2, "timestamp", df["TestDate"]) mask = df["TestDate"] <= df["StorageDate"] - logger.info(f"Removing {((len(df) - np.sum(mask)) * 100 / len(df)):.2f} of unusual data") + logger.info(f"Removing {((len(df) - np.sum(mask)) * 100 / len(df)):.2f}% of unusual data") df = df[mask] mask = df["StorageDate"] - df["TestDate"] > pd.Timedelta(days=90) From d572e260250d55709193eb0c2a4b16a82d55caa5 Mon Sep 17 00:00:00 2001 From: Alex Coda Date: Tue, 21 Sep 2021 17:34:50 -0700 Subject: [PATCH 119/133] Update quidel/delphi_quidel/pull.py Co-authored-by: Katie Mazaitis --- quidel/delphi_quidel/pull.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quidel/delphi_quidel/pull.py b/quidel/delphi_quidel/pull.py index ffbba3283..f168b3355 100644 --- a/quidel/delphi_quidel/pull.py +++ b/quidel/delphi_quidel/pull.py @@ -180,7 +180,7 @@ def fix_date(df, logger): df = df[mask] mask = df["StorageDate"] - df["TestDate"] > pd.Timedelta(days=90) - logger.info(f"Fixing {(np.sum(mask) * 100 / len(df)):.2f} of outdated data") + logger.info(f"Fixing {(np.sum(mask) * 100 / len(df)):.2f}% of outdated data") df["timestamp"].values[mask] = df["StorageDate"].values[mask] return df From 33e93252682db1668345d44eedc492e01d339767 Mon Sep 17 00:00:00 2001 From: Alex Coda Date: Tue, 21 Sep 2021 17:34:57 -0700 Subject: [PATCH 120/133] Update quidel_covidtest/delphi_quidel_covidtest/pull.py Co-authored-by: Katie Mazaitis --- quidel_covidtest/delphi_quidel_covidtest/pull.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quidel_covidtest/delphi_quidel_covidtest/pull.py b/quidel_covidtest/delphi_quidel_covidtest/pull.py index 9ce036e10..b5f9eb9d0 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/pull.py +++ b/quidel_covidtest/delphi_quidel_covidtest/pull.py @@ -99,7 +99,7 @@ def fix_date(df, logger): df.insert(2, "timestamp", df["TestDate"]) mask = df["TestDate"] <= df["StorageDate"] - logger.info(f"Removing {((len(df) - np.sum(mask)) * 100 / len(df)):.2f} of unusual data") + logger.info(f"Removing {((len(df) - np.sum(mask)) * 100 / len(df)):.2f}% of unusual data") df = df[mask] mask = df["StorageDate"] - df["TestDate"] > pd.Timedelta(days=90) From 775d125c9a2cf7f4932b156f0405aa9bedfc5b91 Mon Sep 17 00:00:00 2001 From: Alex Coda Date: Tue, 21 Sep 2021 17:35:03 -0700 Subject: [PATCH 121/133] Update quidel_covidtest/delphi_quidel_covidtest/pull.py Co-authored-by: Katie Mazaitis --- quidel_covidtest/delphi_quidel_covidtest/pull.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quidel_covidtest/delphi_quidel_covidtest/pull.py b/quidel_covidtest/delphi_quidel_covidtest/pull.py index b5f9eb9d0..3efa9ed23 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/pull.py +++ b/quidel_covidtest/delphi_quidel_covidtest/pull.py @@ -103,7 +103,7 @@ def fix_date(df, logger): df = df[mask] mask = df["StorageDate"] - df["TestDate"] > pd.Timedelta(days=90) - logger.info(f"Fixing {(np.sum(mask) * 100 / len(df)):.2f} of outdated data") + logger.info(f"Fixing {(np.sum(mask) * 100 / len(df)):.2f}% of outdated data") df["timestamp"].values[mask] = df["StorageDate"].values[mask] return df From e6ade5aca939c01f9b459d9ea5c8564909e34a1b Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Tue, 21 Sep 2021 15:54:08 -0400 Subject: [PATCH 122/133] Add new host to inventory --- ansible/inventory | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ansible/inventory b/ansible/inventory index 424d05c3d..acabbb490 100644 --- a/ansible/inventory +++ b/ansible/inventory @@ -1,5 +1,5 @@ [runtime_host] -delphi-master-prod-01.delphi.cmu.edu +bigchunk-dev-02.delphi.cmu.edu [runtime_host_staging] app-mono-dev-01.delphi.cmu.edu From 2f1927a43c5603d95297690319fb45cc0f7ef25c Mon Sep 17 00:00:00 2001 From: Brian Clark Date: Tue, 21 Sep 2021 17:09:06 -0400 Subject: [PATCH 123/133] Re-add primary back to inventory --- ansible/inventory | 1 + 1 file changed, 1 insertion(+) diff --git a/ansible/inventory b/ansible/inventory index acabbb490..d67b775c6 100644 --- a/ansible/inventory +++ b/ansible/inventory @@ -1,4 +1,5 @@ [runtime_host] +delphi-master-prod-01.delphi.cmu.edu bigchunk-dev-02.delphi.cmu.edu [runtime_host_staging] From 9a3f4f1a382fb6dc7ac3934cd00f4d102881fe89 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Tue, 21 Sep 2021 23:53:14 -0400 Subject: [PATCH 124/133] Remove bare except in DV --- doctor_visits/delphi_doctor_visits/weekday.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doctor_visits/delphi_doctor_visits/weekday.py b/doctor_visits/delphi_doctor_visits/weekday.py index 86e5278b2..bb1c4bf5e 100644 --- a/doctor_visits/delphi_doctor_visits/weekday.py +++ b/doctor_visits/delphi_doctor_visits/weekday.py @@ -9,6 +9,7 @@ # third party import cvxpy as cp +from cvxpy.error import SolverError import numpy as np # first party @@ -92,7 +93,7 @@ def get_params(data): _ = prob.solve() params[i,:] = b.value break - except: + except SolverError: # If the magnitude of the objective function is too large, an error is # thrown; Rescale the objective function by going through loop pass From 000dc8b025e9039a68615e49be2bb512f0546453 Mon Sep 17 00:00:00 2001 From: Nat DeFries <42820733+nmdefries@users.noreply.github.com> Date: Mon, 20 Sep 2021 16:16:39 -0400 Subject: [PATCH 125/133] set E2 to integer on read --- facebook/delphiFacebook/R/responses.R | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/facebook/delphiFacebook/R/responses.R b/facebook/delphiFacebook/R/responses.R index a6a92a7a2..bca1d72a8 100644 --- a/facebook/delphiFacebook/R/responses.R +++ b/facebook/delphiFacebook/R/responses.R @@ -129,7 +129,10 @@ load_response_one <- function(input_filename, params, contingency_run) { Q79 = col_integer(), Q80 = col_integer(), I5 = col_character(), - I7 = col_character()), + I7 = col_character(), + E2_1 = col_integer(), + E2_2 = col_integer() + ), locale = locale(grouping_mark = "")) if (nrow(input_data) == 0) { return(tibble()) From 9b00342d1b0dfbcbff93c8f52a63c8367e814a43 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Tue, 21 Sep 2021 21:42:20 -0400 Subject: [PATCH 126/133] Switch CDC Covidnet to use structed logger --- cdc_covidnet/delphi_cdc_covidnet/covidnet.py | 6 +++--- cdc_covidnet/delphi_cdc_covidnet/run.py | 22 ++++++++++++-------- cdc_covidnet/tests/test_covidnet.py | 6 ++++-- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/cdc_covidnet/delphi_cdc_covidnet/covidnet.py b/cdc_covidnet/delphi_cdc_covidnet/covidnet.py index 03c2b7775..b202e2fa3 100644 --- a/cdc_covidnet/delphi_cdc_covidnet/covidnet.py +++ b/cdc_covidnet/delphi_cdc_covidnet/covidnet.py @@ -6,7 +6,7 @@ """ import json -import logging +from logging import Logger import os from typing import Tuple, List from multiprocessing import cpu_count, Pool @@ -100,7 +100,7 @@ def download_hosp_data( @staticmethod def download_all_hosp_data( - mappings_file: str, cache_path: str, parallel: bool = False + mappings_file: str, cache_path: str, logger: Logger, parallel: bool = False ) -> List[str]: """ Download hospitalization data for all states listed in the mappings JSON file to disk. @@ -146,7 +146,7 @@ def download_all_hosp_data( else: for args in state_args: CovidNet.download_hosp_data(*args) - logging.debug("Downloading for nid=%s, cid=%s", args[0], args[1]) + logger.debug("Downloading for nid=%s, cid=%s", args[0], args[1]) return state_files diff --git a/cdc_covidnet/delphi_cdc_covidnet/run.py b/cdc_covidnet/delphi_cdc_covidnet/run.py index 87e1419ce..0214d52ae 100644 --- a/cdc_covidnet/delphi_cdc_covidnet/run.py +++ b/cdc_covidnet/delphi_cdc_covidnet/run.py @@ -4,12 +4,13 @@ This module should contain a function called `run_module`, that is executed when the module is run with `python -m delphi_cdc_covidnet`. """ -import logging from datetime import datetime from os import remove from os.path import join from typing import Dict, Any +from delphi_utils import get_structured_logger + from .covidnet import CovidNet from .update_sensor import update_sensor @@ -32,7 +33,9 @@ def run_module(params: Dict[str, Dict[str, Any]]): - "wip_signal": list of str or bool, to be passed to delphi_utils.add_prefix. - "input_cache_dir": str, directory to download source files. """ - logging.basicConfig(level=logging.DEBUG) + logger = get_structured_logger( + __name__, filename=params["common"].get("log_filename"), + log_exceptions=params["common"].get("log_exceptions", True)) start_date = datetime.strptime(params["indicator"]["start_date"], "%Y-%m-%d") @@ -42,15 +45,15 @@ def run_module(params: Dict[str, Dict[str, Any]]): else: end_date = datetime.strptime(params["indicator"]["end_date"], "%Y-%m-%d") - logging.info("start date:\t%s", start_date.date()) - logging.info("end date:\t%s", end_date.date()) + logger.info("start date:\t%s", start_date.date()) + logger.info("end date:\t%s", end_date.date()) - logging.info("outpath:\t%s", params["common"]["export_dir"]) - logging.info("parallel:\t%s", params["indicator"]["parallel"]) + logger.info("outpath:\t%s", params["common"]["export_dir"]) + logger.info("parallel:\t%s", params["indicator"]["parallel"]) # Only geo is state, and no weekday adjustment for now # COVID-NET data is by weeks anyway, not daily - logging.info("starting state, no adj") + logger.info("starting state, no adj") # Download latest COVID-NET files into the cache directory first mappings_file = join(params["indicator"]["input_cache_dir"], "init.json") @@ -58,7 +61,8 @@ def run_module(params: Dict[str, Dict[str, Any]]): _, mmwr_info, _ = CovidNet.read_mappings(mappings_file) state_files = CovidNet.download_all_hosp_data( mappings_file, params["indicator"]["input_cache_dir"], - parallel=params["indicator"]["parallel"]) + parallel=params["indicator"]["parallel"], + logger=logger) update_sensor( state_files, @@ -73,4 +77,4 @@ def run_module(params: Dict[str, Dict[str, Any]]): for state_file in state_files: remove(state_file) - logging.info("finished all") + logger.info("finished all") diff --git a/cdc_covidnet/tests/test_covidnet.py b/cdc_covidnet/tests/test_covidnet.py index 6846b9f5e..efe03fe29 100644 --- a/cdc_covidnet/tests/test_covidnet.py +++ b/cdc_covidnet/tests/test_covidnet.py @@ -1,4 +1,5 @@ import json +import logging from os.path import join, exists from tempfile import TemporaryDirectory @@ -7,6 +8,7 @@ from delphi_cdc_covidnet.api_config import APIConfig from delphi_cdc_covidnet.covidnet import CovidNet +TEST_LOGGER = logging.getLogger() class TestCovidNet: @@ -65,14 +67,14 @@ def test_hosp_data(self): # Non-parallel state_files = CovidNet.download_all_hosp_data( - init_file, temp_dir, parallel=False) + init_file, temp_dir, TEST_LOGGER, parallel=False) assert len(state_files) == num_states for state_file in state_files: assert exists(state_file) # Parallel state_files_par = CovidNet.download_all_hosp_data( - init_file, temp_dir, parallel=True) + init_file, temp_dir, TEST_LOGGER, parallel=True) assert set(state_files) == set(state_files_par) assert len(state_files_par) == num_states for state_file in state_files_par: From c7d7ce0aced7cf11a548a811a3b364636b58ac87 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Tue, 21 Sep 2021 22:04:21 -0400 Subject: [PATCH 127/133] Switch to structed logger for ChangeHC --- changehc/delphi_changehc/run.py | 3 ++- changehc/delphi_changehc/sensor.py | 4 ++-- changehc/delphi_changehc/update_sensor.py | 26 +++++++++++++---------- changehc/tests/test_sensor.py | 4 +++- changehc/tests/test_update_sensor.py | 26 ++++++++++++++++------- 5 files changed, 40 insertions(+), 23 deletions(-) diff --git a/changehc/delphi_changehc/run.py b/changehc/delphi_changehc/run.py index c9b340403..9580b5728 100644 --- a/changehc/delphi_changehc/run.py +++ b/changehc/delphi_changehc/run.py @@ -173,7 +173,8 @@ def run_module(params: Dict[str, Dict[str, Any]]): weekday, numtype, params["indicator"]["se"], - params["indicator"]["wip_signal"] + params["indicator"]["wip_signal"], + logger ) if numtype == "covid": data = load_combined_data(file_dict["denom"], diff --git a/changehc/delphi_changehc/sensor.py b/changehc/delphi_changehc/sensor.py index f4a8934ab..d1422567b 100644 --- a/changehc/delphi_changehc/sensor.py +++ b/changehc/delphi_changehc/sensor.py @@ -87,7 +87,7 @@ def backfill( return new_num, new_den @staticmethod - def fit(y_data, first_sensor_date, geo_id, num_col="num", den_col="den"): + def fit(y_data, first_sensor_date, geo_id, logger, num_col="num", den_col="den"): """Fitting routine. Args: @@ -121,7 +121,7 @@ def fit(y_data, first_sensor_date, geo_id, num_col="num", den_col="den"): se_valid = valid_rates.eval('sqrt(rate * (1 - rate) / den)') rate_data['se'] = se_valid - logging.debug("{0}: {1:.3f},[{2:.3f}]".format( + logger.debug("{0}: {1:.3f},[{2:.3f}]".format( geo_id, rate_data['rate'][-1], rate_data['se'][-1] )) return {"geo_id": geo_id, diff --git a/changehc/delphi_changehc/update_sensor.py b/changehc/delphi_changehc/update_sensor.py index a87ea853f..95de8fe21 100644 --- a/changehc/delphi_changehc/update_sensor.py +++ b/changehc/delphi_changehc/update_sensor.py @@ -20,7 +20,7 @@ from .weekday import Weekday -def write_to_csv(df, geo_level, write_se, day_shift, out_name, output_path=".", start_date=None, end_date=None): +def write_to_csv(df, geo_level, write_se, day_shift, out_name, logger, output_path=".", start_date=None, end_date=None): """Write sensor values to csv. Args: @@ -47,7 +47,7 @@ def write_to_csv(df, geo_level, write_se, day_shift, out_name, output_path=".", assert df[suspicious_se_mask].empty, " se contains suspiciously large values" assert not df["se"].isna().any(), " se contains nan values" if write_se: - logging.info("========= WARNING: WRITING SEs TO {0} =========".format(out_name)) + logger.info("========= WARNING: WRITING SEs TO {0} =========".format(out_name)) else: df.loc[:, "se"] = np.nan @@ -55,7 +55,7 @@ def write_to_csv(df, geo_level, write_se, day_shift, out_name, output_path=".", suspicious_val_mask = df["val"].gt(90) if not df[suspicious_val_mask].empty: for geo in df.loc[suspicious_val_mask, "geo_id"]: - logging.warning("value suspiciously high, {0}: {1}".format( + logger.warning("value suspiciously high, {0}: {1}".format( geo, out_name )) @@ -68,10 +68,10 @@ def write_to_csv(df, geo_level, write_se, day_shift, out_name, output_path=".", sensor=out_name, write_empty_days=True ) - logging.debug("wrote {0} rows for {1} {2}".format( + logger.debug("wrote {0} rows for {1} {2}".format( df.size, df["geo_id"].unique().size, geo_level )) - logging.debug("wrote files to {0}".format(output_path)) + logger.debug("wrote files to {0}".format(output_path)) return dates @@ -87,7 +87,8 @@ def __init__(self, weekday, numtype, se, - wip_signal): + wip_signal, + logger): """Init Sensor Updator. Args: @@ -100,7 +101,9 @@ def __init__(self, numtype: type of count data used, one of ["covid", "cli"] se: boolean to write out standard errors, if true, use an obfuscated name wip_signal: Prefix for WIP signals + logger: the structured logger """ + self.logger = logger self.startdate, self.enddate, self.dropdate = [ pd.to_datetime(t) for t in (startdate, enddate, dropdate)] # handle dates @@ -149,7 +152,7 @@ def geo_reindex(self, data): geo = self.geo gmpr = GeoMapper() if geo not in {"county", "state", "msa", "hrr", "nation", "hhs"}: - logging.error("{0} is invalid, pick one of 'county', " + self.logger.error("{0} is invalid, pick one of 'county', " "'state', 'msa', 'hrr', 'hss','nation'".format(geo)) return False if geo == "county": @@ -201,12 +204,12 @@ def update_sensor(self, sub_data.reset_index(level=0,inplace=True) if self.weekday: sub_data = Weekday.calc_adjustment(wd_params, sub_data) - res = CHCSensor.fit(sub_data, self.burnindate, geo_id) + res = CHCSensor.fit(sub_data, self.burnindate, geo_id, self.logger) res = pd.DataFrame(res).loc[final_sensor_idxs] dfs.append(res) else: n_cpu = min(10, cpu_count()) - logging.debug("starting pool with {0} workers".format(n_cpu)) + self.logger.debug("starting pool with {0} workers".format(n_cpu)) with Pool(n_cpu) as pool: pool_results = [] for geo_id, sub_data in data_frame.groupby(level=0,as_index=False): @@ -215,7 +218,7 @@ def update_sensor(self, sub_data = Weekday.calc_adjustment(wd_params, sub_data) pool_results.append( pool.apply_async( - CHCSensor.fit, args=(sub_data, self.burnindate, geo_id,), + CHCSensor.fit, args=(sub_data, self.burnindate, geo_id, self.logger), ) ) pool_results = [proc.get() for proc in pool_results] @@ -244,7 +247,8 @@ def update_sensor(self, write_se=self.se, day_shift=Config.DAY_SHIFT, out_name=signal, - output_path=output_path + output_path=output_path, + logger=self.logger ) if len(dates) > 0: stats.append((max(dates), len(dates))) diff --git a/changehc/tests/test_sensor.py b/changehc/tests/test_sensor.py index 7c4aef01d..32afc3081 100644 --- a/changehc/tests/test_sensor.py +++ b/changehc/tests/test_sensor.py @@ -1,4 +1,5 @@ # standard +import logging import numpy as np import numpy.random as nr @@ -19,6 +20,7 @@ COVID_FILEPATH = PARAMS["indicator"]["input_covid_file"] DENOM_FILEPATH = PARAMS["indicator"]["input_denom_file"] DROP_DATE = pd.to_datetime(PARAMS["indicator"]["drop_date"]) +TEST_LOGGER = logging.getLogger() class TestLoadData: combined_data = load_combined_data(DENOM_FILEPATH, COVID_FILEPATH, DROP_DATE, @@ -56,7 +58,7 @@ def test_fit_fips(self): for fips in all_fips: sub_data = self.combined_data.loc[fips] sub_data = sub_data.reindex(date_range, fill_value=0) - res0 = CHCSensor.fit(sub_data, date_range[0], fips) + res0 = CHCSensor.fit(sub_data, date_range[0], fips, TEST_LOGGER) if np.isnan(res0["rate"]).all(): assert res0["incl"].sum() == 0 diff --git a/changehc/tests/test_update_sensor.py b/changehc/tests/test_update_sensor.py index 779960bf7..c202c4325 100644 --- a/changehc/tests/test_update_sensor.py +++ b/changehc/tests/test_update_sensor.py @@ -1,4 +1,5 @@ # standard +import logging from copy import deepcopy import os from os.path import join, exists @@ -27,6 +28,7 @@ DENOM_FILEPATH = PARAMS["indicator"]["input_denom_file"] DROP_DATE = pd.to_datetime(PARAMS["indicator"]["drop_date"]) OUTPATH="test_data/" +TEST_LOGGER = logging.getLogger() class TestCHCSensorUpdator: """Tests for updating the sensors.""" @@ -53,7 +55,8 @@ def test_shift_dates(self): self.weekday, self.numtype, self.se, - "" + "", + TEST_LOGGER ) ## Test init assert su_inst.startdate.month == 2 @@ -77,7 +80,8 @@ def test_geo_reindex(self): self.weekday, self.numtype, self.se, - "" + "", + TEST_LOGGER ) su_inst.shift_dates() test_data = pd.DataFrame({ @@ -103,7 +107,8 @@ def test_update_sensor(self): self.weekday, self.numtype, self.se, - "" + "", + TEST_LOGGER ) # As of 3/3/21 (40c258a), this set of data has county outputting data, state and hhs not # outputting data, and nation outputting data, which is undesirable. Ideal behaviour @@ -149,7 +154,8 @@ def test_write_to_csv_results(self): write_se=False, day_shift=CONFIG.DAY_SHIFT, out_name="name_of_signal", - output_path=td.name + output_path=td.name, + logger=TEST_LOGGER ) # check outputs @@ -203,7 +209,8 @@ def test_write_to_csv_with_se_results(self): write_se=True, day_shift=CONFIG.DAY_SHIFT, out_name="name_of_signal", - output_path=td.name + output_path=td.name, + logger=TEST_LOGGER ) # check outputs @@ -243,7 +250,8 @@ def test_write_to_csv_wrong_results(self): write_se=False, day_shift=CONFIG.DAY_SHIFT, out_name="name_of_signal", - output_path=td.name + output_path=td.name, + logger=TEST_LOGGER ) # nan se for included loc-date @@ -258,7 +266,8 @@ def test_write_to_csv_wrong_results(self): write_se=True, day_shift=CONFIG.DAY_SHIFT, out_name="name_of_signal", - output_path=td.name + output_path=td.name, + logger=TEST_LOGGER ) # large se value @@ -273,7 +282,8 @@ def test_write_to_csv_wrong_results(self): write_se=True, day_shift=CONFIG.DAY_SHIFT, out_name="name_of_signal", - output_path=td.name + output_path=td.name, + logger=TEST_LOGGER ) td.cleanup() From 02f70805e372343cb695b4195eeb48d5f0cb7df8 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Tue, 21 Sep 2021 22:22:17 -0400 Subject: [PATCH 128/133] switch doctor visits to structured logger --- doctor_visits/delphi_doctor_visits/run.py | 44 ++++++++++--------- doctor_visits/delphi_doctor_visits/sensor.py | 10 ++--- .../delphi_doctor_visits/update_sensor.py | 18 ++++---- doctor_visits/delphi_doctor_visits/weekday.py | 7 ++- doctor_visits/tests/test_update_sensor.py | 7 ++- 5 files changed, 46 insertions(+), 40 deletions(-) diff --git a/doctor_visits/delphi_doctor_visits/run.py b/doctor_visits/delphi_doctor_visits/run.py index 65f30ed69..84bc1af0e 100644 --- a/doctor_visits/delphi_doctor_visits/run.py +++ b/doctor_visits/delphi_doctor_visits/run.py @@ -6,10 +6,11 @@ """ # standard packages -import logging from datetime import datetime, timedelta from pathlib import Path +from delphi_utils import get_structured_logger + # first party from .update_sensor import update_sensor, write_to_csv @@ -37,7 +38,9 @@ def run_module(params): - "obfuscated_prefix": str, prefix for signal name if write_se is True. - "parallel": bool, whether to update sensor in parallel. """ - logging.basicConfig(level=logging.DEBUG) + logger = get_structured_logger( + __name__, filename=params["common"].get("log_filename"), + log_exceptions=params["common"].get("log_exceptions", True)) ## get end date from input file # the filename is expected to be in the format: @@ -61,30 +64,30 @@ def run_module(params): startdate_dt = enddate_dt - timedelta(days=n_backfill_days) enddate = str(enddate_dt.date()) startdate = str(startdate_dt.date()) - logging.info("drop date:\t\t%s", dropdate) - logging.info("first sensor date:\t%s", startdate) - logging.info("last sensor date:\t%s", enddate) - logging.info("n_backfill_days:\t%s", n_backfill_days) - logging.info("n_waiting_days:\t%s", n_waiting_days) + logger.info("drop date:\t\t%s", dropdate) + logger.info("first sensor date:\t%s", startdate) + logger.info("last sensor date:\t%s", enddate) + logger.info("n_backfill_days:\t%s", n_backfill_days) + logger.info("n_waiting_days:\t%s", n_waiting_days) ## geographies geos = ["state", "msa", "hrr", "county", "hhs", "nation"] ## print out other vars - logging.info("outpath:\t\t%s", export_dir) - logging.info("parallel:\t\t%s", params["indicator"]["parallel"]) - logging.info("weekday:\t\t%s", params["indicator"]["weekday"]) - logging.info("write se:\t\t%s", se) - logging.info("obfuscated prefix:\t%s", prefix) + logger.info("outpath:\t\t%s", export_dir) + logger.info("parallel:\t\t%s", params["indicator"]["parallel"]) + logger.info("weekday:\t\t%s", params["indicator"]["weekday"]) + logger.info("write se:\t\t%s", se) + logger.info("obfuscated prefix:\t%s", prefix) ## start generating for geo in geos: for weekday in params["indicator"]["weekday"]: if weekday: - logging.info("starting %s, weekday adj", geo) + logger.info("starting %s, weekday adj", geo) else: - logging.info("starting %s, no adj", geo) + logger.info("starting %s, no adj", geo) sensor = update_sensor( filepath=params["indicator"]["input_file"], startdate=startdate, @@ -93,10 +96,11 @@ def run_module(params): geo=geo, parallel=params["indicator"]["parallel"], weekday=weekday, - se=params["indicator"]["se"] + se=params["indicator"]["se"], + logger=logger, ) if sensor is None: - logging.error("No sensors calculated, no output will be produced") + logger.error("No sensors calculated, no output will be produced") continue # write out results out_name = "smoothed_adj_cli" if weekday else "smoothed_cli" @@ -104,8 +108,8 @@ def run_module(params): assert prefix is not None, "template has no obfuscated prefix" out_name = prefix + "_" + out_name - write_to_csv(sensor, geo, se, out_name, export_dir) - logging.debug(f"wrote files to {export_dir}") - logging.info("finished %s", geo) + write_to_csv(sensor, geo, se, out_name, logger, export_dir) + logger.debug(f"wrote files to {export_dir}") + logger.info("finished %s", geo) - logging.info("finished all") + logger.info("finished all") diff --git a/doctor_visits/delphi_doctor_visits/sensor.py b/doctor_visits/delphi_doctor_visits/sensor.py index 22690f916..e96c8bfe0 100644 --- a/doctor_visits/delphi_doctor_visits/sensor.py +++ b/doctor_visits/delphi_doctor_visits/sensor.py @@ -6,9 +6,6 @@ """ -# standard packages -import logging - # third party import numpy as np import pandas as pd @@ -162,7 +159,8 @@ def fit(y_data, geo_id, recent_min_visits, min_recent_obs, - jeffreys): + jeffreys, + logger): """Fitting routine. Args: @@ -217,7 +215,7 @@ def fit(y_data, # if all rates are zero, don't bother if code_vals.sum() == 0: if jeffreys: - logging.error("p is 0 even though we used Jefferys estimate") + logger.error("p is 0 even though we used Jefferys estimate") new_rates.append(np.zeros((n_dates,))) continue @@ -240,7 +238,7 @@ def fit(y_data, se[include] = np.sqrt( np.divide((new_rates[include] * (1 - new_rates[include])), den[include])) - logging.debug(f"{geo_id}: {new_rates[-1]:.3f},[{se[-1]:.3f}]") + logger.debug(f"{geo_id}: {new_rates[-1]:.3f},[{se[-1]:.3f}]") included_indices = [x for x in final_sensor_idxs if include[x]] diff --git a/doctor_visits/delphi_doctor_visits/update_sensor.py b/doctor_visits/delphi_doctor_visits/update_sensor.py index 931ec3afa..068d2a058 100644 --- a/doctor_visits/delphi_doctor_visits/update_sensor.py +++ b/doctor_visits/delphi_doctor_visits/update_sensor.py @@ -9,7 +9,6 @@ """ # standard packages -import logging from datetime import timedelta from multiprocessing import Pool, cpu_count @@ -24,7 +23,7 @@ from .weekday import Weekday -def write_to_csv(output_df: pd.DataFrame, geo_level, se, out_name, output_path="."): +def write_to_csv(output_df: pd.DataFrame, geo_level, se, out_name, logger, output_path="."): """Write sensor values to csv. Args: @@ -34,7 +33,7 @@ def write_to_csv(output_df: pd.DataFrame, geo_level, se, out_name, output_path=" output_path: outfile path to write the csv (default is current directory) """ if se: - logging.info(f"========= WARNING: WRITING SEs TO {out_name} =========") + logger.info(f"========= WARNING: WRITING SEs TO {out_name} =========") out_n = 0 for d in set(output_df["date"]): @@ -64,12 +63,12 @@ def write_to_csv(output_df: pd.DataFrame, geo_level, se, out_name, output_path=" outfile.write( "%s,%f,%s,%s,%s\n" % (geo_id, sensor, "NA", "NA", "NA")) out_n += 1 - logging.debug(f"wrote {out_n} rows for {geo_level}") + logger.debug(f"wrote {out_n} rows for {geo_level}") def update_sensor( filepath, startdate, enddate, dropdate, geo, parallel, - weekday, se + weekday, se, logger ): """Generate sensor values. @@ -82,6 +81,7 @@ def update_sensor( parallel: boolean to run the sensor update in parallel weekday: boolean to adjust for weekday effects se: boolean to write out standard errors, if true, use an obfuscated name + logger: the structured logger """ # as of 2020-05-11, input file expected to have 10 columns # id cols: ServiceDate, PatCountyFIPS, PatAgeGroup, Pat HRR ID/Pat HRR Name @@ -125,7 +125,7 @@ def update_sensor( (burn_in_dates >= startdate) & (burn_in_dates <= enddate))[0][:len(sensor_dates)] # handle if we need to adjust by weekday - params = Weekday.get_params(data) if weekday else None + params = Weekday.get_params(data, logger) if weekday else None if weekday and np.any(np.all(params == 0,axis=1)): # Weekday correction failed for at least one count type return None @@ -155,13 +155,14 @@ def update_sensor( geo_id, Config.MIN_RECENT_VISITS, Config.MIN_RECENT_OBS, - jeffreys + jeffreys, + logger ) out.append(res) else: n_cpu = min(10, cpu_count()) - logging.debug(f"starting pool with {n_cpu} workers") + logger.debug(f"starting pool with {n_cpu} workers") with Pool(n_cpu) as pool: pool_results = [] @@ -182,6 +183,7 @@ def update_sensor( Config.MIN_RECENT_VISITS, Config.MIN_RECENT_OBS, jeffreys, + logger ), ) ) diff --git a/doctor_visits/delphi_doctor_visits/weekday.py b/doctor_visits/delphi_doctor_visits/weekday.py index bb1c4bf5e..529454f80 100644 --- a/doctor_visits/delphi_doctor_visits/weekday.py +++ b/doctor_visits/delphi_doctor_visits/weekday.py @@ -4,8 +4,7 @@ Created: 2020-05-06 """ -# standard packages -import logging + # third party import cvxpy as cp @@ -20,7 +19,7 @@ class Weekday: """Class to handle weekday effects.""" @staticmethod - def get_params(data): + def get_params(data, logger): r"""Correct a signal estimated as numerator/denominator for weekday effects. The ordinary estimate would be numerator_t/denominator_t for each time point @@ -99,7 +98,7 @@ def get_params(data): pass else: # Leaving params[i,:] = 0 is equivalent to not performing weekday correction - logging.error("Unable to calculate weekday correction") + logger.error("Unable to calculate weekday correction") return params diff --git a/doctor_visits/tests/test_update_sensor.py b/doctor_visits/tests/test_update_sensor.py index 4e504e19c..ab74c1c90 100644 --- a/doctor_visits/tests/test_update_sensor.py +++ b/doctor_visits/tests/test_update_sensor.py @@ -1,9 +1,11 @@ """Tests for update_sensor.py.""" - +import logging import pandas as pd from delphi_doctor_visits.update_sensor import update_sensor +TEST_LOGGER = logging.getLogger() + class TestUpdateSensor: def test_update_sensor(self): actual = update_sensor( @@ -14,7 +16,8 @@ def test_update_sensor(self): geo="state", parallel=False, weekday=False, - se=False + se=False, + logger=TEST_LOGGER, ) comparison = pd.read_csv("./comparison/update_sensor/all.csv", parse_dates=["date"]) From c21b5448e0ec9c3874918a42f035fd63040d10de Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Fri, 24 Sep 2021 23:21:11 -0400 Subject: [PATCH 129/133] Refactor NCHS mortality to use delphi export util --- _delphi_utils_python/delphi_utils/export.py | 12 +++++-- _delphi_utils_python/setup.py | 1 + .../delphi_nchs_mortality/export.py | 36 ------------------- nchs_mortality/delphi_nchs_mortality/run.py | 13 +++---- 4 files changed, 17 insertions(+), 45 deletions(-) delete mode 100644 nchs_mortality/delphi_nchs_mortality/export.py diff --git a/_delphi_utils_python/delphi_utils/export.py b/_delphi_utils_python/delphi_utils/export.py index afc1a4c8a..614d06779 100644 --- a/_delphi_utils_python/delphi_utils/export.py +++ b/_delphi_utils_python/delphi_utils/export.py @@ -5,6 +5,7 @@ from typing import Optional import logging +from epiweeks import Week import numpy as np import pandas as pd @@ -39,7 +40,7 @@ def create_export_csv( end_date: Optional[datetime] = None, remove_null_samples: Optional[bool] = False, write_empty_days: Optional[bool] = False, - logger: Optional[logging.Logger] = None + weekly_dates = False, ): """Export data in the format expected by the Delphi API. @@ -90,10 +91,15 @@ def create_export_csv( dates = pd.date_range(start_date, end_date) for date in dates: + if weekly_dates: + t = Week.fromdate(pd.to_datetime(str(date))) + date_str = "weekly_" + str(t.year) + str(t.week).zfill(2) + else: + date_str = date.strftime('%Y%m%d') if metric is None: - export_filename = f"{date.strftime('%Y%m%d')}_{geo_res}_{sensor}.csv" + export_filename = f"{date_str}_{geo_res}_{sensor}.csv" else: - export_filename = f"{date.strftime('%Y%m%d')}_{geo_res}_{metric}_{sensor}.csv" + export_filename = f"{date_str}_{geo_res}_{metric}_{sensor}.csv" export_file = join(export_dir, export_filename) expected_columns = [ "geo_id", diff --git a/_delphi_utils_python/setup.py b/_delphi_utils_python/setup.py index 731d7e957..016263c32 100644 --- a/_delphi_utils_python/setup.py +++ b/_delphi_utils_python/setup.py @@ -7,6 +7,7 @@ required = [ "boto3", "covidcast", + "epiweeks", "freezegun", "gitpython", "mock", diff --git a/nchs_mortality/delphi_nchs_mortality/export.py b/nchs_mortality/delphi_nchs_mortality/export.py deleted file mode 100644 index 47033a50a..000000000 --- a/nchs_mortality/delphi_nchs_mortality/export.py +++ /dev/null @@ -1,36 +0,0 @@ -# -*- coding: utf-8 -*- -"""Function to export the dataset in the format expected of the API.""" -import pandas as pd -from epiweeks import Week - -def export_csv(df, geo_name, sensor, export_dir, start_date): - """Export data set in format expected for ingestion by the API. - - Parameters - ---------- - df: pd.DataFrame - data frame with columns "geo_id", "timestamp", and "val" - geo_name: str - name of the geographic region, such as "state" or "hrr" - sensor: str - name of the sensor; only used for naming the output file - export_dir: str - path to location where the output CSV files to be uploaded should be stored - start_date: datetime.datetime - The first date to report - end_date: datetime.datetime - The last date to report - """ - df = df.copy() - df = df[df["timestamp"] >= start_date] - - dates = df["timestamp"].unique() - for date in dates: - t = Week.fromdate(pd.to_datetime(str(date))) - date_short = "weekly_" + str(t.year) + str(t.week).zfill(2) - export_fn = f"{date_short}_{geo_name}_{sensor}.csv" - result_df = df[df["timestamp"] == date][["geo_id", "val", "se", "sample_size"]] - result_df.to_csv(f"{export_dir}/{export_fn}", - index=False, - float_format="%.8f") - return pd.to_datetime(dates) diff --git a/nchs_mortality/delphi_nchs_mortality/run.py b/nchs_mortality/delphi_nchs_mortality/run.py index 1cf3d36d5..ec5416bb2 100644 --- a/nchs_mortality/delphi_nchs_mortality/run.py +++ b/nchs_mortality/delphi_nchs_mortality/run.py @@ -9,12 +9,11 @@ from typing import Dict, Any import numpy as np -from delphi_utils import S3ArchiveDiffer, get_structured_logger +from delphi_utils import S3ArchiveDiffer, get_structured_logger, create_export_csv from .archive_diffs import arch_diffs from .constants import (METRICS, SENSOR_NAME_MAP, SENSORS, INCIDENCE_BASE, GEO_RES) -from .export import export_csv from .pull import pull_nchs_mortality_data @@ -70,12 +69,13 @@ def run_module(params: Dict[str, Any]): df["sample_size"] = np.nan df = df[~df["val"].isnull()] sensor_name = "_".join([SENSOR_NAME_MAP[metric]]) - dates = export_csv( + dates = create_export_csv( df, - geo_name=GEO_RES, + geo_res=GEO_RES, export_dir=daily_export_dir, start_date=datetime.strptime(export_start_date, "%Y-%m-%d"), sensor=sensor_name, + weekly_dates=True ) if len(dates) > 0: stats.append((max(dates), len(dates))) @@ -93,12 +93,13 @@ def run_module(params: Dict[str, Any]): df["sample_size"] = np.nan df = df[~df["val"].isnull()] sensor_name = "_".join([SENSOR_NAME_MAP[metric], sensor]) - dates = export_csv( + dates = create_export_csv( df, - geo_name=GEO_RES, + geo_res=GEO_RES, export_dir=daily_export_dir, start_date=datetime.strptime(export_start_date, "%Y-%m-%d"), sensor=sensor_name, + weekly_dates=True ) if len(dates) > 0: stats.append((max(dates), len(dates))) From ca09586880d0ab0ca200109f0fe3fedbdf5b17ae Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Fri, 24 Sep 2021 23:28:40 -0400 Subject: [PATCH 130/133] Remove test for old export func --- nchs_mortality/tests/test_export.py | 51 ----------------------------- 1 file changed, 51 deletions(-) delete mode 100644 nchs_mortality/tests/test_export.py diff --git a/nchs_mortality/tests/test_export.py b/nchs_mortality/tests/test_export.py deleted file mode 100644 index c05f287ca..000000000 --- a/nchs_mortality/tests/test_export.py +++ /dev/null @@ -1,51 +0,0 @@ -from datetime import datetime -from os.path import join, exists - -import pandas as pd - -from delphi_nchs_mortality.export import export_csv - - -class TestExport: - def test_export(self): - - # create fake dataset and save in a temporary directory - input_data = pd.DataFrame( - { - "geo_id": ["a", "a", "b", "b", "c", "c"], - "val": [0, 2, 3, 5, 10, 12], - "timestamp": [datetime(2020, 6, 2), datetime(2020, 6, 9)] * 3, - "se": [0.01, 0.02, 0.01, 0.01, 0.005, 0.01], - "sample_size": [100, 200, 500, 50, 80, 10] - } - ) - - export_csv( - input_data, - geo_name = "state", - sensor="region_thing", - export_dir="./receiving", - start_date = datetime(2020, 6, 2), - ) - - # check data for 2020-06-02 - expected_name = "weekly_202023_state_region_thing.csv" - assert exists(join("./receiving", expected_name)) - - output_data = pd.read_csv(join("./receiving", expected_name)) - - assert (output_data.columns == ["geo_id", "val", "se", "sample_size"]).all() - assert (output_data.geo_id == ["a", "b", "c"]).all() - assert (output_data.se.values == [0.01, 0.01, 0.005]).all() - assert (output_data.sample_size.values == [100, 500, 80]).all() - - # check data for 2020-06-03 - expected_name = "weekly_202024_state_region_thing.csv" - assert exists(join("./receiving", expected_name)) - - output_data = pd.read_csv(join("./receiving", expected_name)) - - assert (output_data.columns == ["geo_id", "val", "se", "sample_size"]).all() - assert (output_data.geo_id == ["a", "b", "c"]).all() - assert (output_data.se.values == [0.02, 0.01, 0.01]).all() - assert (output_data.sample_size.values == [200, 50, 10]).all() From 90ea6536b13fb22f3e195b488b310b9db9fddc7a Mon Sep 17 00:00:00 2001 From: Ananya-Joshi Date: Tue, 28 Sep 2021 15:06:40 -0400 Subject: [PATCH 131/133] resolved misssing name issue with another PR, retrying this one. --- cdc_vaccines/tests/test_run.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdc_vaccines/tests/test_run.py b/cdc_vaccines/tests/test_run.py index abc966c25..c96e90112 100644 --- a/cdc_vaccines/tests/test_run.py +++ b/cdc_vaccines/tests/test_run.py @@ -76,4 +76,4 @@ def test_output_file_format(self): df = pd.read_csv( join("receiving", "20210819_state_cumulative_counts_tot_vaccine.csv") ) - assert (df.columns.values == ["geo_id", "val", "se", "sample_size"]).all() \ No newline at end of file + assert (df.columns.values == ["geo_id", "val", "missing_se", "missing_sample_size"]).all() \ No newline at end of file From d3544d04d0928eb0ebb78bd8511ac094bbabb1e0 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Wed, 29 Sep 2021 15:10:47 -0700 Subject: [PATCH 132/133] Cdc vaccines: add basic nancodes --- cdc_vaccines/delphi_cdc_vaccines/run.py | 23 ++++++++++++++++++++--- cdc_vaccines/tests/test_run.py | 4 ++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/cdc_vaccines/delphi_cdc_vaccines/run.py b/cdc_vaccines/delphi_cdc_vaccines/run.py index 51ab3688b..8d2e8ba6c 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/run.py +++ b/cdc_vaccines/delphi_cdc_vaccines/run.py @@ -18,13 +18,29 @@ from itertools import product import time as tm import os + +from pandas import DataFrame + from delphi_utils.export import create_export_csv from delphi_utils.geomap import GeoMapper -from delphi_utils import get_structured_logger, nancodes +from delphi_utils import get_structured_logger +from delphi_utils.nancodes import Nans from .constants import GEOS, SIGNALS, SMOOTHERS from .pull import pull_cdcvacc_data +def add_nancodes(df: DataFrame) -> DataFrame: + # Default nancodes for a non-survey indicator + df["missing_val"] = Nans.NOT_MISSING + df["missing_se"] = Nans.NOT_APPLICABLE + df["missing_sample_size"] = Nans.NOT_APPLICABLE + + # Mark an values found null to the catch-all category + remaining_nans_mask = df["val"].isnull() & df["missing_val"].eq(Nans.NOT_MISSING) + df.loc[remaining_nans_mask, "missing_val"] = Nans.OTHER + + return df + def run_module(params): """ Run the indicator. @@ -68,8 +84,9 @@ def run_module(params): df["val"] = df[["geo_id", sensor]].groupby("geo_id")[sensor].transform( smoother[0].smooth ) - df["missing_se"] = nancodes.Nans.NOT_APPLICABLE - df["missing_sample_size"] = nancodes.Nans.NOT_APPLICABLE + df["se"] = None + df["sample_size"] = None + df = add_nancodes(df) sensor_name = sensor + smoother[1] print(sensor_name) if not(("cumulative" in sensor_name) and ("7dav" in sensor_name)): diff --git a/cdc_vaccines/tests/test_run.py b/cdc_vaccines/tests/test_run.py index c96e90112..e7151b4fc 100644 --- a/cdc_vaccines/tests/test_run.py +++ b/cdc_vaccines/tests/test_run.py @@ -60,7 +60,7 @@ def test_output_files_exist(self): "cumulative_counts_part_vaccine_18P", "incidence_counts_part_vaccine_18P", "cumulative_counts_part_vaccine_65P", - "incidence_counts_part_vaccine_65P"]: + "incidence_counts_part_vaccine_65P"]: for date in dates: for geo in geos: expected_files += [date + "_" + geo + "_" + metric + ".csv"] @@ -76,4 +76,4 @@ def test_output_file_format(self): df = pd.read_csv( join("receiving", "20210819_state_cumulative_counts_tot_vaccine.csv") ) - assert (df.columns.values == ["geo_id", "val", "missing_se", "missing_sample_size"]).all() \ No newline at end of file + assert (df.columns.values == ["geo_id", "val", "se", "sample_size", "missing_val", "missing_se", "missing_sample_size"]).all() From ea6587d7c6022aac8eea3ad1fdd7fd27d2fe8b25 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Wed, 29 Sep 2021 15:14:46 -0700 Subject: [PATCH 133/133] Cdc vaccines: add docstring for linter --- cdc_vaccines/delphi_cdc_vaccines/run.py | 1 + cdc_vaccines/tests/test_run.py | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/cdc_vaccines/delphi_cdc_vaccines/run.py b/cdc_vaccines/delphi_cdc_vaccines/run.py index 8d2e8ba6c..685fef5d9 100644 --- a/cdc_vaccines/delphi_cdc_vaccines/run.py +++ b/cdc_vaccines/delphi_cdc_vaccines/run.py @@ -30,6 +30,7 @@ def add_nancodes(df: DataFrame) -> DataFrame: + """Add nancode annotations to the indicator.""" # Default nancodes for a non-survey indicator df["missing_val"] = Nans.NOT_MISSING df["missing_se"] = Nans.NOT_APPLICABLE diff --git a/cdc_vaccines/tests/test_run.py b/cdc_vaccines/tests/test_run.py index e7151b4fc..2b95913a1 100644 --- a/cdc_vaccines/tests/test_run.py +++ b/cdc_vaccines/tests/test_run.py @@ -76,4 +76,13 @@ def test_output_file_format(self): df = pd.read_csv( join("receiving", "20210819_state_cumulative_counts_tot_vaccine.csv") ) - assert (df.columns.values == ["geo_id", "val", "se", "sample_size", "missing_val", "missing_se", "missing_sample_size"]).all() + expected_columns = [ + "geo_id", + "val", + "se", + "sample_size", + "missing_val", + "missing_se", + "missing_sample_size" + ] + assert (df.columns.values == expected_columns).all()