diff --git a/.bumpversion.cfg b/.bumpversion.cfg index e1ea1c4ed..51ac1e747 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.3.28 +current_version = 0.3.29 commit = True message = chore: bump covidcast-indicators to {new_version} tag = False diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-ci.yml index 403f14a8d..284b6049a 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, doctor_visits, dsew_community_profile, 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, doctor_visits, dsew_community_profile, google_symptoms, hhs_hosp, hhs_facilities, jhu, nchs_mortality, nowcast, quidel, quidel_covidtest, safegraph_patterns, sir_complainsalot] defaults: run: working-directory: ${{ matrix.packages }} diff --git a/Jenkinsfile b/Jenkinsfile index 93d2b7366..6353fb715 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -9,26 +9,43 @@ - Keep in sync with '.github/workflows/python-ci.yml'. - TODO: #527 Get this list automatically from python-ci.yml at runtime. */ -def indicator_list = ["backfill_corrections", "changehc", "claims_hosp", "google_symptoms", "hhs_hosp", "jhu", "nchs_mortality", "quidel", "quidel_covidtest", "safegraph_patterns", "sir_complainsalot", "usafacts", "dsew_community_profile", "doctor_visits"] -def build_package = [:] + +def indicator_list = ["backfill_corrections", "changehc", "claims_hosp", "google_symptoms", "hhs_hosp", "jhu", "nchs_mortality", "quidel", "quidel_covidtest", "safegraph_patterns", "sir_complainsalot", "dsew_community_profile", "doctor_visits"] +def build_package_main = [:] +def build_package_prod = [:] def deploy_staging = [:] def deploy_production = [:] pipeline { agent any stages { - stage('Build and Package') { + stage('Build and Package main') { when { branch "main"; } steps { script { indicator_list.each { indicator -> - build_package[indicator] = { - sh "jenkins/build-and-package.sh ${indicator}" + build_package_main[indicator] = { + sh "jenkins/build-and-package.sh ${indicator} main" + } + } + parallel build_package_main + } + } + } + stage('Build and Package prod') { + when { + branch "prod"; + } + steps { + script { + indicator_list.each { indicator -> + build_package_prod[indicator] = { + sh "jenkins/build-and-package.sh ${indicator} prod" } } - parallel build_package + parallel build_package_prod } } } diff --git a/_delphi_utils_python/.bumpversion.cfg b/_delphi_utils_python/.bumpversion.cfg index 96378d0b8..421f79f74 100644 --- a/_delphi_utils_python/.bumpversion.cfg +++ b/_delphi_utils_python/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.3.7 +current_version = 0.3.8 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 6320c4a83..9bb5524b6 100644 --- a/_delphi_utils_python/delphi_utils/__init__.py +++ b/_delphi_utils_python/delphi_utils/__init__.py @@ -15,4 +15,4 @@ from .nancodes import Nans from .weekday import Weekday -__version__ = "0.3.7" +__version__ = "0.3.8" diff --git a/_delphi_utils_python/delphi_utils/validator/params.json.template b/_delphi_utils_python/delphi_utils/validator/params.json.template index 1b4a953a6..284599fad 100644 --- a/_delphi_utils_python/delphi_utils/validator/params.json.template +++ b/_delphi_utils_python/delphi_utils/validator/params.json.template @@ -1,7 +1,7 @@ { "validation": { "global": { - "data_source": "usa-facts", + "data_source": "jhu-csse", "end_date": "2020-09-08", "span_length": 3, "suppressed_errors": [ diff --git a/_delphi_utils_python/delphi_utils/validator/static.py b/_delphi_utils_python/delphi_utils/validator/static.py index 48b17b888..d58096d97 100644 --- a/_delphi_utils_python/delphi_utils/validator/static.py +++ b/_delphi_utils_python/delphi_utils/validator/static.py @@ -90,28 +90,34 @@ def check_missing_date_files(self, daily_filenames, report): Returns: - None """ - # Create set of all dates seen in CSV names. - unique_dates = {datetime.strptime( - daily_filename[0][0:8], '%Y%m%d').date() for daily_filename in daily_filenames} - - # Diff expected and observed dates. - expected_dates = self.params.time_window.date_seq - - if len(self.params.max_expected_lag) == 0: - max_expected_lag_overall = 10 - else: - max_expected_lag_overall = max(self.params.max_expected_lag.values()) - - # Only check for date if it should definitely be present, - # i.e if it is more than max_expected_lag since the checking date - expected_dates = [date for date in expected_dates if - ((datetime.today().date() - date).days) > max_expected_lag_overall] - check_dateholes = list(set(expected_dates).difference(unique_dates)) - check_dateholes.sort() - - if check_dateholes: + # Check to see if there are any files in the export directory + # Validator will throw an error if the directory is empty, which can be suppressed + if len(daily_filenames) == 0: report.add_raised_error( - ValidationFailure("check_missing_date_files", + ValidationFailure("check_empty_filelist", + message="No files found in export directory")) + # Check for missing date only happens when files are found + else: + # Create set of all dates seen in CSV names. + unique_dates = {datetime.strptime( + daily_filename[0][0:8], '%Y%m%d').date() for daily_filename in daily_filenames} + # Diff expected and observed dates. + expected_dates = self.params.time_window.date_seq + if len(self.params.max_expected_lag) == 0: + max_expected_lag_overall = 10 + else: + max_expected_lag_overall = max(self.params.max_expected_lag.values()) + + # Only check for date if it should definitely be present, + # i.e if it is more than max_expected_lag since the checking date + expected_dates = [date for date in expected_dates if + ((datetime.today().date() - date).days) > max_expected_lag_overall] + check_dateholes = list(set(expected_dates).difference(unique_dates)) + check_dateholes.sort() + + if check_dateholes: + report.add_raised_error( + ValidationFailure("check_missing_date_files", message="Missing dates are observed; if these dates are already " "in the API they would not be updated")) diff --git a/_delphi_utils_python/delphi_utils/validator/validate.py b/_delphi_utils_python/delphi_utils/validator/validate.py index 9c4861b76..d03d7e3c2 100644 --- a/_delphi_utils_python/delphi_utils/validator/validate.py +++ b/_delphi_utils_python/delphi_utils/validator/validate.py @@ -58,6 +58,10 @@ def validate(self): frames_list = load_all_files(self.export_dir, self.time_window.start_date, self.time_window.end_date) self.static_validation.validate(frames_list, report) - all_frames = aggregate_frames(frames_list) + # Check if frames_list is empty before calling aggregate_frames + if len(frames_list) == 0: + all_frames = [] + else: + all_frames = aggregate_frames(frames_list) self.dynamic_validation.validate(all_frames, report) return report diff --git a/_delphi_utils_python/setup.py b/_delphi_utils_python/setup.py index 34f8da84c..fe215ef63 100644 --- a/_delphi_utils_python/setup.py +++ b/_delphi_utils_python/setup.py @@ -26,7 +26,7 @@ setup( name="delphi_utils", - version="0.3.7", + version="0.3.8", description="Shared Utility Functions for Indicators", long_description=long_description, long_description_content_type="text/markdown", diff --git a/_delphi_utils_python/tests/validator/test_static.py b/_delphi_utils_python/tests/validator/test_static.py index bf270b4fd..ea3d44b1a 100644 --- a/_delphi_utils_python/tests/validator/test_static.py +++ b/_delphi_utils_python/tests/validator/test_static.py @@ -27,9 +27,29 @@ def test_empty_filelist(self): filenames = list() validator.check_missing_date_files(filenames, report) + assert len(report.raised_errors) == 1 + assert report.raised_errors[0].check_name == "check_empty_filelist" + + def test_missing_date_files(self): + params = { + "common": { + "data_source": "", + "span_length": 5, + "end_date": "2020-09-05", + "max_expected_lag": {"all": "1"} + } + } + validator = StaticValidator(params) + report = ValidationReport([]) + filenames = [("20200901_county_signal_signal.csv", "match_obj"), + ("20200903_county_signal_signal.csv", "match_obj"), + ("20200904_county_signal_signal.csv", "match_obj"), + ("20200905_county_signal_signal.csv", "match_obj")] + validator.check_missing_date_files(filenames, report) assert len(report.raised_errors) == 1 assert report.raised_errors[0].check_name == "check_missing_date_files" + def test_same_day(self): params = { "common": { diff --git a/ansible/ansible-deploy-staging.yaml b/ansible/ansible-deploy-staging.yaml index 3056d79f2..0196dc7d1 100644 --- a/ansible/ansible-deploy-staging.yaml +++ b/ansible/ansible-deploy-staging.yaml @@ -6,7 +6,7 @@ tasks: - name: Copy and unarchive the package into the indicators runtime host directory. unarchive: - src: "{{ jenkins_artifact_dir }}/{{ package }}" + src: "{{ jenkins_artifact_dir }}/{{ package_staging }}" dest: "{{ indicators_runtime_dir }}" owner: "{{ runtime_user }}" group: "{{ runtime_user }}" diff --git a/ansible/ansible-deploy.yaml b/ansible/ansible-deploy.yaml index f35aa40f8..eff65c892 100644 --- a/ansible/ansible-deploy.yaml +++ b/ansible/ansible-deploy.yaml @@ -6,7 +6,7 @@ tasks: - name: Copy and unarchive the package into the indicators runtime host directory. unarchive: - src: "{{ jenkins_artifact_dir }}/{{ package }}" + src: "{{ jenkins_artifact_dir }}/{{ package_production }}" dest: "{{ indicators_runtime_dir }}" owner: "{{ runtime_user }}" group: "{{ runtime_user }}" diff --git a/ansible/templates/claims_hosp-params-prod.json.j2 b/ansible/templates/claims_hosp-params-prod.json.j2 index dd4c884d9..851951133 100644 --- a/ansible/templates/claims_hosp-params-prod.json.j2 +++ b/ansible/templates/claims_hosp-params-prod.json.j2 @@ -8,6 +8,8 @@ "start_date": "2020-02-01", "end_date": null, "drop_date": null, + "backfill_dir": "/common/backfill/claims_hosp", + "backfill_merge_day": 0, "n_backfill_days": 70, "n_waiting_days": 3, "write_se": false, diff --git a/ansible/templates/covid_act_now-params-prod.json.j2 b/ansible/templates/covid_act_now-params-prod.json.j2 deleted file mode 100644 index c1821a540..000000000 --- a/ansible/templates/covid_act_now-params-prod.json.j2 +++ /dev/null @@ -1,51 +0,0 @@ -{ - "common": { - "export_dir": "./receiving", - "log_filename": "/var/log/indicators/covid_act_now.log" - }, - "indicator": { - "parquet_url": "https://storage.googleapis.com/can-scrape-outputs/final/can_scrape_api_covid_us.parquet" - }, - "archive": { - "cache_dir": "./cache", - "bucket_name": "delphi-covidcast-indicator-output", - "indicator_prefix": "CAN", - "aws_credentials": { - "aws_access_key_id": "{{ delphi_aws_access_key_id }}", - "aws_secret_access_key": "{{ delphi_aws_secret_access_key }}" - } - }, - "validation": { - "common": { - "data_source": "covid-act-now", - "span_length": 14, - "min_expected_lag": {"all": "3"}, - "max_expected_lag": {"all": "9"}, - "dry_run": true, - "suppressed_errors": [ - {"check_name": "check_se_many_missing", - "signal": "pcr_specimen_total_tests"}, - {"check_name": "check_se_not_missing_and_in_range", - "signal": "pcr_specimen_total_tests"}, - {"check_name": "check_n_missing", - "signal": "pcr_specimen_total_tests"}, - {"check_name": "check_se_0_when_val_0"}, - {"check_name": "check_test_vs_reference_avg_changed", - "signal": "pcr_specimen_positivity_rate"} - ] - }, - "static": { - "minimum_sample_size": 0, - "missing_se_allowed": false, - "missing_sample_size_allowed": false - }, - "dynamic": { - "ref_window_size": 7, - "smoothed_signals": [ - ] - } - }, - "delivery": { - "delivery_dir": "/common/covidcast/receiving/covid-act-now" - } -} diff --git a/ansible/templates/sir_complainsalot-params-prod.json.j2 b/ansible/templates/sir_complainsalot-params-prod.json.j2 index 92e9ff2fb..3ad576d2b 100644 --- a/ansible/templates/sir_complainsalot-params-prod.json.j2 +++ b/ansible/templates/sir_complainsalot-params-prod.json.j2 @@ -28,11 +28,6 @@ "sum_anosmia_ageusia_smoothed_search" ] }, - "usa-facts": { - "max_age": 5, - "maintainers": ["U01AP8GSWG3","U01069KCRS7"], - "retired-signals": ["confirmed_7dav_cumulative_num", "confirmed_7dav_cumulative_prop", "deaths_7dav_cumulative_num", "deaths_7dav_cumulative_prop"] - }, "jhu-csse": { "max_age": 2, "maintainers": ["U01AP8GSWG3","U01069KCRS7"], diff --git a/ansible/templates/usafacts-params-prod.json.j2 b/ansible/templates/usafacts-params-prod.json.j2 deleted file mode 100644 index e796868e7..000000000 --- a/ansible/templates/usafacts-params-prod.json.j2 +++ /dev/null @@ -1,55 +0,0 @@ -{ - "common": { - "export_dir": "./receiving", - "input_dir": "./input-cache", - "log_filename": "/var/log/indicators/usafacts.log" - }, - "indicator": { - "base_url": "https://static.usafacts.org/public/data/covid-19/covid_{metric}_usafacts.csv", - "export_start_date": "2020-02-01" - }, - "archive": { - "aws_credentials": { - "aws_access_key_id": "{{ delphi_aws_access_key_id }}", - "aws_secret_access_key": "{{ delphi_aws_secret_access_key }}" - }, - "bucket_name": "delphi-covidcast-indicator-output", - "indicator_prefix": "usafacts", - "cache_dir": "./cache" - }, - "validation": { - "common": { - "data_source": "usa-facts", - "span_length": 14, - "min_expected_lag": {"all": "1"}, - "max_expected_lag": {"all": "5"}, - "dry_run": true, - "suppressed_errors": [ - {"check_name": "check_val_lt_0"}, - {"check_name": "check_test_vs_reference_avg_changed", - "signal": "deaths_7dav_incidence_prop", - "geo_type": "county"} - ] - }, - "static": { - "minimum_sample_size": 100, - "missing_se_allowed": true, - "missing_sample_size_allowed": true - }, - "dynamic": { - "ref_window_size": 7, - "smoothed_signals": [ - "confirmed_7dav_cumulative_num", - "confirmed_7dav_cumulative_prop", - "confirmed_7dav_incidence_num", - "confirmed_7dav_incidence_prop", - "deaths_7dav_cumulative_num", - "deaths_7dav_cumulative_prop", - "deaths_7dav_incidence_num", - "deaths_7dav_incidence_prop"] - } - }, - "delivery": { - "delivery_dir": "/common/covidcast/receiving/usa-facts" - } -} diff --git a/ansible/vars.yaml b/ansible/vars.yaml index 6fd93a028..125ed857b 100644 --- a/ansible/vars.yaml +++ b/ansible/vars.yaml @@ -6,7 +6,8 @@ runtime_user: "indicators" jenkins_user: "jenkins" jenkins_artifact_dir: "/var/lib/jenkins/artifacts" indicators_runtime_dir: "/home/{{ runtime_user }}/runtime" -package: "{{ indicator }}.tar.gz" # {{ indicator }} is passed in from the Jenkins shell script wrapper. +package_staging: "main_{{ indicator }}.tar.gz" # {{ indicator }} is passed in from the Jenkins shell script wrapper. +package_production: "prod_{{ indicator }}.tar.gz" # {{ indicator }} is passed in from the Jenkins shell script wrapper. python_version: "3.8.2" pyenv_python_path: "/home/{{ runtime_user }}/.pyenv/versions/{{ python_version }}/bin/python" diff --git a/backfill_corrections/Makefile b/backfill_corrections/Makefile index 1d6a3dbed..8becdb790 100644 --- a/backfill_corrections/Makefile +++ b/backfill_corrections/Makefile @@ -5,9 +5,9 @@ SHELL:=/bin/bash OPTIONS= PYTHON:=env/bin/python -USR_INPUT_DIR=$(shell $(PYTHON) -m delphi_utils get input_dir) -USR_CACHE_DIR=$(shell $(PYTHON) -m delphi_utils get cache_dir) -USR_EXPORT_DIR=$(shell $(PYTHON) -m delphi_utils get export_dir) +USR_INPUT_DIR:=$(shell $(PYTHON) -m delphi_utils get input_dir) +USR_CACHE_DIR:=$(shell $(PYTHON) -m delphi_utils get cache_dir) +USR_EXPORT_DIR:=$(shell $(PYTHON) -m delphi_utils get export_dir) # Gurobi license GRB_LICENSE_FILE=./gurobi.lic @@ -53,7 +53,7 @@ install-python: python3 -m venv env source env/bin/activate && \ pip install wheel && \ - pip install delphi_utils + pip install --timeout 1000 delphi_utils lib: R -e 'roxygen2::roxygenise("delphiBackfillCorrection")' @@ -75,10 +75,10 @@ run: -v "`realpath $(USR_EXPORT_DIR)`:/backfill_corrections/${EXPORT_DIR}" \ -v "`realpath $(USR_INPUT_DIR)`:/backfill_corrections/${INPUT_DIR}" \ -v "`realpath $(USR_CACHE_DIR)`:/backfill_corrections/${CACHE_DIR}" \ - -v "${PWD}"/params.json:/backfill_corrections/params.json \ + -v "${PWD}"/params.json:/backfill_corrections/params.host.json \ --env GRB_LICENSE_FILE=$(GRB_LICENSE_FILE) \ -it "${DOCKER_IMAGE}:${DOCKER_TAG}" \ - /bin/bash -c "make gurobi.lic && make run-local OPTIONS=\"${OPTIONS}\"" + /bin/bash -c "cp params.host.json params.json && make gurobi.lic && make standardize-dirs && make run-local OPTIONS=\"${OPTIONS}\"" publish: aws configure set aws_access_key_id $(AWS_KEY_ID) @@ -86,7 +86,7 @@ publish: aws s3 cp $(USR_INPUT_DIR) $(S3_BUCKET)/ --recursive --exclude "*" --include "*.csv.gz" --acl public-read echo "SUCCESS: published `ls -1 $(USR_EXPORT_DIR)/*.csv.gz | wc -l` files to the S3 bucket" >> $(LOG_FILE) -pipeline: setup-dirs standardize-dirs run publish teardown clean +pipeline: setup-dirs run publish clean # Make sure all user-specified dirs exist locally; create them if not. setup-dirs: @@ -115,12 +115,6 @@ standardize-dirs: clean: rm -f $(USR_EXPORT_DIR)/*.csv.gz -# Restore dir names in params to user-provided values. -teardown: - $(PYTHON) -m delphi_utils set input_dir $(USR_INPUT_DIR) - $(PYTHON) -m delphi_utils set cache_dir $(USR_CACHE_DIR) - $(PYTHON) -m delphi_utils set export_dir $(USR_EXPORT_DIR) - coverage: Rscript -e 'covr::package_coverage("delphiBackfillCorrection")' diff --git a/backfill_corrections/delphiBackfillCorrection/NAMESPACE b/backfill_corrections/delphiBackfillCorrection/NAMESPACE index f1700be96..cb7c0f66b 100644 --- a/backfill_corrections/delphiBackfillCorrection/NAMESPACE +++ b/backfill_corrections/delphiBackfillCorrection/NAMESPACE @@ -34,6 +34,7 @@ importFrom(dplyr,group_split) importFrom(dplyr,if_else) importFrom(dplyr,mutate) importFrom(dplyr,pull) +importFrom(dplyr,rename) importFrom(dplyr,select) importFrom(dplyr,summarize) importFrom(dplyr,ungroup) @@ -47,6 +48,7 @@ importFrom(lubridate,year) importFrom(parallel,detectCores) importFrom(quantgen,quantile_lasso) importFrom(readr,write_csv) +importFrom(rlang,":=") importFrom(rlang,.data) importFrom(rlang,.env) importFrom(stats,coef) diff --git a/backfill_corrections/delphiBackfillCorrection/R/io.R b/backfill_corrections/delphiBackfillCorrection/R/io.R index e16c90f0e..d8bf1bb2c 100644 --- a/backfill_corrections/delphiBackfillCorrection/R/io.R +++ b/backfill_corrections/delphiBackfillCorrection/R/io.R @@ -1,15 +1,31 @@ #' Read a parquet file into a dataframe #' -#' @template input_dir-template +#' @template input_file-template #' #' @importFrom arrow read_parquet #' #' @export -read_data <- function(input_dir) { - df <- read_parquet(input_dir, as_data_frame = TRUE) +read_data <- function(input_file) { + df <- read_parquet(input_file, as_data_frame = TRUE) return (df) } +#' Make sure data contains a `geo_value` field +#' +#' @template df-template +#' +#' @importFrom dplyr rename %>% +#' @importFrom rlang .data +fips_to_geovalue <- function(df) { + if ( !("geo_value" %in% colnames(df)) ) { + if ( !("fips" %in% colnames(df)) ) { + stop("Either `fips` or `geo_value` field must be available") + } + df <- rename(df, geo_value = .data$fips) + } + return(df) +} + #' Export the result to customized directory #' #' @param test_data test data containing prediction results diff --git a/backfill_corrections/delphiBackfillCorrection/R/main.R b/backfill_corrections/delphiBackfillCorrection/R/main.R index 8a67cb6e7..481632ab4 100644 --- a/backfill_corrections/delphiBackfillCorrection/R/main.R +++ b/backfill_corrections/delphiBackfillCorrection/R/main.R @@ -226,13 +226,17 @@ run_backfill <- function(df, params, #' Perform backfill correction on all desired signals and geo levels #' #' @template params-template +#' @template refd_col-template +#' @template lag_col-template +#' @template issued_col-template #' -#' @importFrom dplyr bind_rows mutate +#' @importFrom dplyr bind_rows mutate %>% #' @importFrom parallel detectCores -#' @importFrom rlang .data +#' @importFrom rlang .data := #' #' @export -main <- function(params) { +main <- function(params, + refd_col = "time_value", lag_col = "lag", issued_col = "issue_date") { if (!params$train_models && !params$make_predictions) { msg_ts("both model training and prediction generation are turned off; exiting") return(NULL) @@ -287,7 +291,16 @@ main <- function(params) { msg_ts("Reading in and combining associated files") input_data <- lapply( files_list, - function(file) {read_data(file)} + function(file) { + read_data(file) %>% + fips_to_geovalue() %>% + mutate( + # Use `glue` syntax to construct a new field by variable, + # from https://stackoverflow.com/a/26003971/14401472 + "{refd_col}" := as.Date(.data[[refd_col]], "%Y-%m-%d"), + "{issued_col}" := as.Date(.data[[issued_col]], "%Y-%m-%d") + ) + } ) %>% bind_rows() @@ -304,16 +317,18 @@ main <- function(params) { msg_ts(str_interp("for ${value_type}")) result <- validity_checks( input_data, value_type, - params$num_col, params$denom_col, input_group$name_suffix + params$num_col, params$denom_col, input_group$name_suffix, + refd_col = refd_col, lag_col = lag_col, issued_col = issued_col ) input_data <- result[["df"]] } # Check available training days - training_days_check(input_data$issue_date, params$training_days) + training_days_check(input_data[[issued_col]], params$training_days) # Perform backfill corrections and save result run_backfill(input_data, params, + refd_col = refd_col, lag_col = lag_col, issued_col = issued_col, indicator = input_group$indicator, signal = input_group$signal, signal_suffixes = input_group$name_suffix) } diff --git a/backfill_corrections/delphiBackfillCorrection/R/utils.R b/backfill_corrections/delphiBackfillCorrection/R/utils.R index 550b84f50..e9a52cf42 100644 --- a/backfill_corrections/delphiBackfillCorrection/R/utils.R +++ b/backfill_corrections/delphiBackfillCorrection/R/utils.R @@ -119,6 +119,7 @@ create_dir_not_exist <- function(path) #' @template num_col-template #' @template denom_col-template #' @template signal_suffixes-template +#' @template refd_col-template #' @template lag_col-template #' @template issued_col-template #' @@ -126,7 +127,7 @@ create_dir_not_exist <- function(path) #' didn't already exist, and character vector of one or two value #' column names, depending on requested `value_type` validity_checks <- function(df, value_type, num_col, denom_col, signal_suffixes, - lag_col = "lag", issued_col = "issue_date") { + refd_col = "time_value", lag_col = "lag", issued_col = "issue_date") { if (!missing(signal_suffixes) && !is.na(signal_suffixes) && !all(signal_suffixes == "") && !all(is.na(signal_suffixes))) { num_col <- paste(num_col, signal_suffixes, sep = "_") denom_col <- paste(num_col, signal_suffixes, sep = "_") @@ -144,16 +145,22 @@ validity_checks <- function(df, value_type, num_col, denom_col, signal_suffixes, } # time_value must exist in the dataset - if ( !"time_value" %in% colnames(df) ) { - stop("No 'time_value' column detected for the reference date!") + if ( !(refd_col %in% colnames(df)) ) { + stop("No reference date column detected for the reference date!") + } + + if (!(inherits(df[[refd_col]], "Date"))) { + stop("Reference date column must be of `Date` type") } - # issue_date or lag should exist in the dataset - if ( !lag_col %in% colnames(df) ) { - if ( issued_col %in% colnames(df) ) { - df$lag = as.integer(df$issue_date - df$time_value) - } - else {stop("No issue_date or lag exists!")} + # issue_date and lag should exist in the dataset + if ( !(lag_col %in% colnames(df)) || !(issued_col %in% colnames(df)) ) { + stop("Issue date and lag fields must exist in the input data") + } + + if ( any(is.na(df[[lag_col]])) || any(is.na(df[[issued_col]])) || + any(is.na(df[[refd_col]])) ) { + stop("Issue date, lag, or reference date fields contain missing values") } return(list(df = df, value_cols = value_cols)) diff --git a/backfill_corrections/delphiBackfillCorrection/man-roxygen/input_file-template.R b/backfill_corrections/delphiBackfillCorrection/man-roxygen/input_file-template.R new file mode 100644 index 000000000..02634dc14 --- /dev/null +++ b/backfill_corrections/delphiBackfillCorrection/man-roxygen/input_file-template.R @@ -0,0 +1 @@ +#' @param input_file path to input data file in parquet format diff --git a/backfill_corrections/delphiBackfillCorrection/man/fips_to_geovalue.Rd b/backfill_corrections/delphiBackfillCorrection/man/fips_to_geovalue.Rd new file mode 100644 index 000000000..83a155301 --- /dev/null +++ b/backfill_corrections/delphiBackfillCorrection/man/fips_to_geovalue.Rd @@ -0,0 +1,15 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/io.R +\name{fips_to_geovalue} +\alias{fips_to_geovalue} +\title{Make sure data contains a `geo_value` field} +\usage{ +fips_to_geovalue(df) +} +\arguments{ +\item{df}{Data Frame of aggregated counts within a single location +reported for each reference date and issue date.} +} +\description{ +Make sure data contains a `geo_value` field +} diff --git a/backfill_corrections/delphiBackfillCorrection/man/main.Rd b/backfill_corrections/delphiBackfillCorrection/man/main.Rd index ae211b289..28c1ff8d6 100644 --- a/backfill_corrections/delphiBackfillCorrection/man/main.Rd +++ b/backfill_corrections/delphiBackfillCorrection/man/main.Rd @@ -4,13 +4,27 @@ \alias{main} \title{Perform backfill correction on all desired signals and geo levels} \usage{ -main(params) +main( + params, + refd_col = "time_value", + lag_col = "lag", + issued_col = "issue_date" +) } \arguments{ \item{params}{named list containing modeling and data settings. Must include the following elements: `ref_lag`, `testing_window`, `test_dates`, `training_days`, `num_col`, `denom_col`, `taus`, `lambda`, `export_dir`, `lp_solver`, `input_dir`, `cache_dir`, `geo_levels`, and `value_types`.} + +\item{refd_col}{string specifying name of reference date field within +the input dataframe.} + +\item{lag_col}{string specifying name of lag field within +the input dataframe.} + +\item{issued_col}{string specifying name of issue date (version) field within +the input dataframe.} } \description{ Perform backfill correction on all desired signals and geo levels diff --git a/backfill_corrections/delphiBackfillCorrection/man/read_data.Rd b/backfill_corrections/delphiBackfillCorrection/man/read_data.Rd index 1b5f24726..ae5be4035 100644 --- a/backfill_corrections/delphiBackfillCorrection/man/read_data.Rd +++ b/backfill_corrections/delphiBackfillCorrection/man/read_data.Rd @@ -4,10 +4,10 @@ \alias{read_data} \title{Read a parquet file into a dataframe} \usage{ -read_data(input_dir) +read_data(input_file) } \arguments{ -\item{input_dir}{path to the directory containing input data} +\item{input_file}{path to input data file in parquet format} } \description{ Read a parquet file into a dataframe diff --git a/backfill_corrections/delphiBackfillCorrection/man/validity_checks.Rd b/backfill_corrections/delphiBackfillCorrection/man/validity_checks.Rd index ada2c5142..d162b338b 100644 --- a/backfill_corrections/delphiBackfillCorrection/man/validity_checks.Rd +++ b/backfill_corrections/delphiBackfillCorrection/man/validity_checks.Rd @@ -10,6 +10,7 @@ validity_checks( num_col, denom_col, signal_suffixes, + refd_col = "time_value", lag_col = "lag", issued_col = "issue_date" ) @@ -30,6 +31,9 @@ endings to be appended to standard value column names from value column names and when processing multiple signals from a single input dataframe, as with `quidel`'s age buckets.} +\item{refd_col}{string specifying name of reference date field within +the input dataframe.} + \item{lag_col}{string specifying name of lag field within the input dataframe.} diff --git a/changehc/delphi_changehc/backfill.py b/changehc/delphi_changehc/backfill.py index 8b9ea8491..7338c4c40 100644 --- a/changehc/delphi_changehc/backfill.py +++ b/changehc/delphi_changehc/backfill.py @@ -46,6 +46,18 @@ def store_backfill_file(df, _end_date, backfill_dir, numtype, geo, weekday): 'num', 'den'] backfilldata = backfilldata.loc[backfilldata["time_value"] >= _start_date, selected_columns] + + backfilldata["lag"] = [(_end_date - x).days for x in backfilldata["time_value"]] + backfilldata["time_value"] = backfilldata.time_value.dt.strftime("%Y-%m-%d") + backfilldata["issue_date"] = datetime.strftime(_end_date, "%Y-%m-%d") + + backfilldata = backfilldata.astype({ + "time_value": "string", + "issue_date": "string", + "fips": "string", + "state_id": "string" + }) + path = backfill_dir + \ "/changehc_%s_as_of_%s.parquet"%(numtype, datetime.strftime(_end_date, "%Y%m%d")) # Store intermediate file into the backfill folder @@ -109,9 +121,6 @@ def get_date(file_link): pdList = [] for fn in new_files: df = pd.read_parquet(fn, engine='pyarrow') - issue_date = get_date(fn) - df["issue_date"] = issue_date - df["lag"] = [(issue_date - x).days for x in df["time_value"]] pdList.append(df) merged_file = pd.concat(pdList).sort_values(["time_value", "fips"]) path = backfill_dir + "/changehc_%s_from_%s_to_%s.parquet"%( diff --git a/changehc/tests/test_backfill.py b/changehc/tests/test_backfill.py index 58e76b9db..c7c8796d4 100644 --- a/changehc/tests/test_backfill.py +++ b/changehc/tests/test_backfill.py @@ -40,7 +40,7 @@ class TestBackfill: def test_store_backfill_file(self): - + fn = "changehc_covid_as_of_20200101.parquet" dropdate = datetime(2020, 1, 1) numtype = "covid" @@ -69,7 +69,7 @@ def test_store_backfill_file(self): backfill_df = pd.read_parquet(backfill_dir + "/"+ fn, engine='pyarrow') selected_columns = ['time_value', 'fips', 'state_id', - 'num', 'den'] + 'num', 'den', 'lag', 'issue_date'] assert set(selected_columns) == set(backfill_df.columns) os.remove(backfill_dir + "/" + fn) @@ -114,9 +114,6 @@ def test_merge_backfill_file(self): if "from" in file: continue df = pd.read_parquet(file, engine='pyarrow') - issue_date = datetime.strptime(file[-16:-8], "%Y%m%d") - df["issue_date"] = issue_date - df["lag"] = [(issue_date - x).days for x in df["time_value"]] pdList.append(df) os.remove(file) new_files = glob.glob(backfill_dir + "/changehc_%s*.parquet"%numtype) diff --git a/changehc/version.cfg b/changehc/version.cfg index f3216a611..5cc332fe2 100644 --- a/changehc/version.cfg +++ b/changehc/version.cfg @@ -1 +1 @@ -current_version = 0.3.28 +current_version = 0.3.29 diff --git a/claims_hosp/delphi_claims_hosp/backfill.py b/claims_hosp/delphi_claims_hosp/backfill.py new file mode 100644 index 000000000..a282be9f7 --- /dev/null +++ b/claims_hosp/delphi_claims_hosp/backfill.py @@ -0,0 +1,127 @@ +""" +Store backfill data. + +Author: Jingjing Tang +Created: 2022-08-03 + +""" +import os +import glob +from datetime import datetime + +# third party +import pandas as pd +from delphi_utils import GeoMapper + + +from .config import Config + +gmpr = GeoMapper() + +def store_backfill_file(claims_filepath, _end_date, backfill_dir): + """ + Store county level backfill data into backfill_dir. + + Parameter: + claims_filepath: str + path to the aggregated claims data + _end_date: datetime + The most recent date when the raw data is received + backfill_dir: str + specified path to store backfill files. + """ + backfilldata = pd.read_csv( + claims_filepath, + usecols=Config.CLAIMS_DTYPES.keys(), + dtype=Config.CLAIMS_DTYPES, + parse_dates=[Config.CLAIMS_DATE_COL], + ) + backfilldata.rename({"ServiceDate": "time_value", + "PatCountyFIPS": "fips", + "Denominator": "den", + "Covid_like": "num"}, + axis=1, inplace=True) + backfilldata = gmpr.add_geocode(backfilldata, from_code="fips", new_code="state_id", + from_col="fips", new_col="state_id") + #Store one year's backfill data + _start_date = _end_date.replace(year=_end_date.year-1) + selected_columns = ['time_value', 'fips', 'state_id', + 'den', 'num'] + backfilldata = backfilldata.loc[(backfilldata["time_value"] >= _start_date) + & (~backfilldata["fips"].isnull()), + selected_columns] + + backfilldata["lag"] = [(_end_date - x).days for x in backfilldata["time_value"]] + backfilldata["time_value"] = backfilldata.time_value.dt.strftime("%Y-%m-%d") + backfilldata["issue_date"] = datetime.strftime(_end_date, "%Y-%m-%d") + + backfilldata = backfilldata.astype({ + "time_value": "string", + "issue_date": "string", + "fips": "string", + "state_id": "string" + }) + + path = backfill_dir + \ + "/claims_hosp_as_of_%s.parquet"%datetime.strftime(_end_date, "%Y%m%d") + # Store intermediate file into the backfill folder + backfilldata.to_parquet(path, index=False) + +def merge_backfill_file(backfill_dir, backfill_merge_day, today, + test_mode=False, check_nd=25): + """ + Merge ~4 weeks' backfill data into one file. + + Usually this function should merge 28 days' data into a new file so as to + save the reading time when running the backfill pipelines. We set a softer + threshold to allow flexibility in data delivery. + Parameters + ---------- + today : datetime + The most recent date when the raw data is received + backfill_dir : str + specified path to store backfill files. + backfill_merge_day: int + The day of a week that we used to merge the backfill files. e.g. 0 + is Monday. + test_mode: bool + check_nd: int + The criteria of the number of unmerged files. Ideally, we want the + number to be 28, but we use a looser criteria from practical + considerations + """ + new_files = glob.glob(backfill_dir + "/claims_hosp_as_of_*") + if len(new_files) == 0: # if no any daily file is stored + return + + def get_date(file_link): + # Keep the function here consistent with the backfill path in + # function `store_backfill_file` + fn = file_link.split("/")[-1].split(".parquet")[0].split("_")[-1] + return datetime.strptime(fn, "%Y%m%d") + + date_list = list(map(get_date, new_files)) + earliest_date = min(date_list) + latest_date = max(date_list) + + # Check whether to merge + # Check the number of files that are not merged + if today.weekday() != backfill_merge_day or (today-earliest_date).days <= check_nd: + return + + # Start to merge files + pdList = [] + for fn in new_files: + df = pd.read_parquet(fn, engine='pyarrow') + pdList.append(df) + merged_file = pd.concat(pdList).sort_values(["time_value", "fips"]) + path = backfill_dir + "/claims_hosp_from_%s_to_%s.parquet"%( + datetime.strftime(earliest_date, "%Y%m%d"), + datetime.strftime(latest_date, "%Y%m%d")) + merged_file.to_parquet(path, index=False) + + # Delete daily files once we have the merged one. + if not test_mode: + for fn in new_files: + os.remove(fn) + return diff --git a/claims_hosp/delphi_claims_hosp/load_data.py b/claims_hosp/delphi_claims_hosp/load_data.py index 505bfabc9..c2ee07e74 100644 --- a/claims_hosp/delphi_claims_hosp/load_data.py +++ b/claims_hosp/delphi_claims_hosp/load_data.py @@ -5,7 +5,6 @@ Created: 2020-09-27 """ - # third party import pandas as pd @@ -53,7 +52,6 @@ def load_claims_data(claims_filepath, dropdate, base_geo): return claims_data - def load_data(input_filepath, dropdate, base_geo): """ Load in claims data, and combine them. diff --git a/claims_hosp/delphi_claims_hosp/run.py b/claims_hosp/delphi_claims_hosp/run.py index 6c7405a36..b1685cb00 100644 --- a/claims_hosp/delphi_claims_hosp/run.py +++ b/claims_hosp/delphi_claims_hosp/run.py @@ -20,6 +20,7 @@ from .modify_claims_drops import modify_and_write from .get_latest_claims_name import get_latest_filename from .update_indicator import ClaimsHospIndicatorUpdater +from .backfill import (store_backfill_file, merge_backfill_file) def run_module(params): @@ -89,6 +90,12 @@ def run_module(params): if params["indicator"]["start_date"] is not None: startdate = params["indicator"]['start_date'] + # Store backfill data + backfill_dir = params["indicator"]["backfill_dir"] + backfill_merge_day = params["indicator"]["backfill_merge_day"] + merge_backfill_file(backfill_dir, backfill_merge_day, datetime.today()) + store_backfill_file(claims_file, dropdate_dt, backfill_dir) + # print out information logger.info("Loaded params", startdate = startdate, diff --git a/claims_hosp/params.json.template b/claims_hosp/params.json.template index e200fa8fc..67bfd4c43 100644 --- a/claims_hosp/params.json.template +++ b/claims_hosp/params.json.template @@ -9,6 +9,8 @@ "end_date": null, "drop_date": null, "n_backfill_days": 70, + "backfill_dir": "./backfill", + "backfill_merge_day": 0, "n_waiting_days": 3, "write_se": false, "obfuscated_prefix": "foo_obfuscated", diff --git a/claims_hosp/setup.py b/claims_hosp/setup.py index d7e46a13d..bc50a6414 100644 --- a/claims_hosp/setup.py +++ b/claims_hosp/setup.py @@ -4,6 +4,7 @@ required = [ "numpy", "pandas", + "pyarrow", "paramiko", "pydocstyle", "pytest", diff --git a/combo_cases_and_deaths/cache/.gitignore b/claims_hosp/tests/backfill/.gitignore similarity index 100% rename from combo_cases_and_deaths/cache/.gitignore rename to claims_hosp/tests/backfill/.gitignore diff --git a/claims_hosp/tests/test_backfill.py b/claims_hosp/tests/test_backfill.py new file mode 100644 index 000000000..fcd908461 --- /dev/null +++ b/claims_hosp/tests/test_backfill.py @@ -0,0 +1,97 @@ +import os +import glob +from datetime import datetime + +# third party +import pandas as pd +import pytest + +# first party +from delphi_claims_hosp.config import Config, GeoConstants +from delphi_claims_hosp.backfill import store_backfill_file, merge_backfill_file + +CONFIG = Config() +CONSTANTS = GeoConstants() +PARAMS = { + "indicator": { + "input_file": "test_data/SYNEDI_AGG_INPATIENT_11062020_1451CDT.csv.gz", + "backfill_dir": "./backfill", + "drop_date": "2020-06-11", + } +} +DATA_FILEPATH = PARAMS["indicator"]["input_file"] +DROP_DATE = pd.to_datetime(PARAMS["indicator"]["drop_date"]) +backfill_dir = PARAMS["indicator"]["backfill_dir"] + +class TestBackfill: + + def test_store_backfill_file(self): + dropdate = datetime(2020, 1, 1) + fn = "claims_hosp_as_of_20200101.parquet" + assert fn not in os.listdir(backfill_dir) + + # Store backfill file + store_backfill_file(DATA_FILEPATH, dropdate, backfill_dir) + assert fn in os.listdir(backfill_dir) + fn = "claims_hosp_as_of_20200101.parquet" + backfill_df = pd.read_parquet(backfill_dir + "/"+ fn, engine='pyarrow') + + selected_columns = ['time_value', 'fips', 'state_id', + 'num', 'den', 'lag', 'issue_date'] + assert set(selected_columns) == set(backfill_df.columns) + + os.remove(backfill_dir + "/" + fn) + assert fn not in os.listdir(backfill_dir) + + def test_merge_backfill_file(self): + + today = datetime.today() + + fn = "claims_hosp_from_20200611_to_20200614.parquet" + assert fn not in os.listdir(backfill_dir) + + # Check when there is no daily file to merge. + today = datetime(2020, 6, 14) + merge_backfill_file(backfill_dir, today.weekday(), today, + test_mode=True, check_nd=8) + assert fn not in os.listdir(backfill_dir) + + # Generate backfill daily files + for d in range(11, 15): + dropdate = datetime(2020, 6, d) + store_backfill_file(DATA_FILEPATH, dropdate, backfill_dir) + + # Check the when the merged file is not generated + today = datetime(2020, 6, 14) + merge_backfill_file(backfill_dir, today.weekday(), today, + test_mode=True, check_nd=8) + assert fn not in os.listdir(backfill_dir) + + # Generate the merged file, but not delete it + merge_backfill_file(backfill_dir, today.weekday(), today, + test_mode=True, check_nd=2) + assert fn in os.listdir(backfill_dir) + + # Read daily file + new_files = glob.glob(backfill_dir + "/claims_hosp*.parquet") + pdList = [] + for file in new_files: + if "from" in file: + continue + df = pd.read_parquet(file, engine='pyarrow') + pdList.append(df) + os.remove(file) + new_files = glob.glob(backfill_dir + "/claims_hosp*.parquet") + assert len(new_files) == 1 + + expected = pd.concat(pdList).sort_values(["time_value", "fips"]) + + # Read the merged file + merged = pd.read_parquet(backfill_dir + "/" + fn, engine='pyarrow') + + assert set(expected.columns) == set(merged.columns) + assert expected.shape[0] == merged.shape[0] + assert expected.shape[1] == merged.shape[1] + + os.remove(backfill_dir + "/" + fn) + assert fn not in os.listdir(backfill_dir) diff --git a/claims_hosp/tests/test_data/SYNEDI_AGG_INPATIENT_11062020_1451CDT.csv.gz b/claims_hosp/tests/test_data/SYNEDI_AGG_INPATIENT_11062020_1451CDT.csv.gz index d932a5874..fab5cbfc3 100644 Binary files a/claims_hosp/tests/test_data/SYNEDI_AGG_INPATIENT_11062020_1451CDT.csv.gz and b/claims_hosp/tests/test_data/SYNEDI_AGG_INPATIENT_11062020_1451CDT.csv.gz differ diff --git a/claims_hosp/version.cfg b/claims_hosp/version.cfg index f3216a611..5cc332fe2 100644 --- a/claims_hosp/version.cfg +++ b/claims_hosp/version.cfg @@ -1 +1 @@ -current_version = 0.3.28 +current_version = 0.3.29 diff --git a/combo_cases_and_deaths/.pylintrc b/combo_cases_and_deaths/.pylintrc deleted file mode 100644 index f30837c7e..000000000 --- a/combo_cases_and_deaths/.pylintrc +++ /dev/null @@ -1,22 +0,0 @@ - -[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/combo_cases_and_deaths/Makefile b/combo_cases_and_deaths/Makefile deleted file mode 100644 index bc88f1fec..000000000 --- a/combo_cases_and_deaths/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -.PHONY = venv, lint, test, clean - -dir = $(shell find ./delphi_* -name __init__.py | grep -o 'delphi_[_[:alnum:]]*' | head -1) -venv: - python3.8 -m venv env - -install: venv - . env/bin/activate; \ - pip install wheel ; \ - pip install -e ../_delphi_utils_python ;\ - pip install -e . - -install-ci: venv - . env/bin/activate; \ - pip install wheel ; \ - pip install ../_delphi_utils_python ;\ - pip install . - -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/combo_cases_and_deaths/README.md b/combo_cases_and_deaths/README.md deleted file mode 100644 index ff0b4bab5..000000000 --- a/combo_cases_and_deaths/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# MODULE NAME - - - -## 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 code 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_combo_cases_and_deaths -``` - -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 .py --cov=delphi_combo_cases_and_deaths --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/combo_cases_and_deaths/REVIEW.md b/combo_cases_and_deaths/REVIEW.md deleted file mode 100644 index 93a5a6579..000000000 --- a/combo_cases_and_deaths/REVIEW.md +++ /dev/null @@ -1,39 +0,0 @@ -## 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 use 4 spaces for indentation; other style decisions are -flexible, but be consistent within a module -- [ ] 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 -- [ ] pylint with the default `.pylint` settings run over the module produces -minimal warnings; warnings that do exist have been confirmed as false positives -- [ ] 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 diff --git a/combo_cases_and_deaths/delphi_combo_cases_and_deaths/README.md b/combo_cases_and_deaths/delphi_combo_cases_and_deaths/README.md deleted file mode 100644 index 859d8a4a0..000000000 --- a/combo_cases_and_deaths/delphi_combo_cases_and_deaths/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# Combined Cases and Deaths - -We create a combined cases and deaths signal for visualization only (not available in covidcast API). -It includes all of the information in usa-facts and Puerto Rico only from jhu-csse. - -## Running the Indicator - -The indicator is run by directly executing the Python script run.py. -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 code from this directory: - -``` -python -m venv env -source env/bin/activate -pip install ../_delphi_utils_python/. -pip install covidcast -``` - -To execute the script and produce the output datasets (by default, in `receiving`), run -the following: - -``` -env/bin/python run.py -``` -By default, the script will generate the combined signal for the most recent data only (usually for yesterday only). -If you want to produce the combined signal for all the dates back to the first valid date, run the following: -``` -env/bin/python run.py --date_range all -``` -If you want to set a specific date range, run the following: -``` -env/bin/python run.py --date_range yyyymmdd-yyyymmdd -``` - -Once you are finished with the code, you can deactivate the virtual environment and (optionally) remove the environment itself. -``` -deactivate -rm -r env -``` - diff --git a/combo_cases_and_deaths/delphi_combo_cases_and_deaths/__init__.py b/combo_cases_and_deaths/delphi_combo_cases_and_deaths/__init__.py deleted file mode 100644 index c8e0a9417..000000000 --- a/combo_cases_and_deaths/delphi_combo_cases_and_deaths/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -"""Module to combine the JHU and USA Facts indicators. - -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 run - -__version__ = "0.1.0" diff --git a/combo_cases_and_deaths/delphi_combo_cases_and_deaths/__main__.py b/combo_cases_and_deaths/delphi_combo_cases_and_deaths/__main__.py deleted file mode 100644 index 143cf09bc..000000000 --- a/combo_cases_and_deaths/delphi_combo_cases_and_deaths/__main__.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -"""Call the function run_module when executed. - -This file indicates that calling the module (`python -m delphi_combo_cases_and_deaths`) 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/combo_cases_and_deaths/delphi_combo_cases_and_deaths/constants.py b/combo_cases_and_deaths/delphi_combo_cases_and_deaths/constants.py deleted file mode 100644 index e1d5724b4..000000000 --- a/combo_cases_and_deaths/delphi_combo_cases_and_deaths/constants.py +++ /dev/null @@ -1,23 +0,0 @@ -"""Registry for signal names, geo types and other constants.""" -METRICS = [ - "confirmed", - "deaths", -] -SMOOTH_TYPES = [ - "", - "7dav", -] -SENSORS = [ - "incidence_num", - "cumulative_num", - "incidence_prop", - "cumulative_prop", -] -GEO_RESOLUTIONS = [ - "county", - "state", - "msa", - "hrr", - "hhs", - "nation" -] 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 deleted file mode 100755 index d2d1229a9..000000000 --- a/combo_cases_and_deaths/delphi_combo_cases_and_deaths/run.py +++ /dev/null @@ -1,353 +0,0 @@ -# -*- 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 delphi_combo_cases_and_deaths`. -This module produces a combined signal for jhu-csse and usa-facts. This signal -is only used for visualization. It sources Puerto Rico from jhu-csse and -everything else from usa-facts. -""" -from datetime import date, timedelta, datetime -from itertools import product -import re -import time - -import covidcast -import pandas as pd - -from delphi_utils import add_prefix, get_structured_logger -from delphi_utils.geomap import GeoMapper -from .constants import METRICS, SMOOTH_TYPES, SENSORS, GEO_RESOLUTIONS - - -GMPR = GeoMapper() - -COLUMN_MAPPING = {"time_value": "timestamp", - "geo_value": "geo_id", - "value": "val", - "stderr": "se", - "sample_size": "sample_size"} - -EMPTY_FRAME = pd.DataFrame({}, columns=COLUMN_MAPPING.values()) - -covidcast.covidcast._ASYNC_CALL = True # pylint: disable=protected-access - - -def maybe_append(usa_facts, jhu): - """ - Append dataframes if available, otherwise return USAFacts. - - If both data frames are available, append them and return. - - If only USAFacts is available, return it. - - If USAFacts is not available, return None. - """ - if usa_facts is None: - return None - if jhu is None: - return usa_facts - return usa_facts.append(jhu) - - -def compute_special_geo_dfs(df, signal, geo): - """Compute the signal values for special geos (HHS and nation). - - For `num` signals, just replace the geocode to the appropriate resolution. - For `prop` signals, replace the geocode and then compute the proportion using the total - population of the us. - - Parameters - ---------- - df: DataFrame - Dataframe with num values at the county level. - signal: str - Signal name, should end with 'num' or 'prop'. - geo: str - Geo level to compute. - Returns - ------- - DataFrame mapped to the 'geo' level with the correct signal values computed. - """ - df = GMPR.replace_geocode(df, - from_col="geo_id", - from_code="fips", - new_code="state_code") - df = GMPR.add_population_column(df, "state_code") # use total state population - df = GMPR.replace_geocode(df, from_code="state_code", new_code=geo) - if signal.endswith("_prop"): - df["val"] = df["val"]/df["population"] * 100000 - df.drop("population", axis=1, inplace=True) - df.rename({geo: "geo_id"}, axis=1, inplace=True) - return df - - -def merge_dfs_by_geos(usafacts_df, jhu_df, geo): - """Combine the queried usafacts and jhu dataframes based on the geo type.""" - # State level - if geo == 'state': - combined_df = maybe_append( - usafacts_df, - jhu_df if jhu_df is None else jhu_df[jhu_df["geo_value"] == 'pr']) # add territories - # County level - elif geo == 'county': - combined_df = maybe_append( - usafacts_df, - 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.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( - usafacts_df, - jhu_df if jhu_df is None else jhu_df[jhu_df["geo_value"].isin(puerto_rico_msas)]) - else: - combined_df = usafacts_df - combined_df.rename(COLUMN_MAPPING, axis=1, inplace=True) - - return combined_df - - -def get_updated_dates(signal, geo, date_range, issue_range=None, fetcher=covidcast.signal): - """Return the unique dates of the values that were updated in a given issue range in a geo.""" - usafacts_df = fetcher( - "usa-facts", signal, - date_range[0], date_range[1], - geo, - issues=issue_range - ) - jhu_df = fetcher( - "jhu-csse", signal, - date_range[0], date_range[1], - geo, - issues=issue_range - ) - - if usafacts_df is None: - return None - - merged_df = merge_dfs_by_geos(usafacts_df, jhu_df, geo) - timestamp_mask = merged_df["timestamp"]<=usafacts_df["timestamp"].max() - unique_dates = merged_df.loc[timestamp_mask]["timestamp"].unique() - return unique_dates - - -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 - and after combining JHU and USAFacts and mapping to the desired geos. - """ - is_special_geo = geo in ["hhs", "nation"] - geo_to_fetch = "county" if is_special_geo else geo - signal_to_fetch = signal.replace("_prop", "_num") if is_special_geo else signal - - unique_dates = get_updated_dates( - signal_to_fetch, geo_to_fetch, date_range, issue_range, 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 - # faster than a fetch for every date in unique_dates even in cases of 1:10 sparsity, - # i.e., len(unique_dates):len(max(unique_dates) - min(unique_dates)) - query_min, query_max = unique_dates.min(), unique_dates.max() - usafacts_df = fetcher( - "usa-facts", signal_to_fetch, - query_min, query_max, - geo_to_fetch, - ) - jhu_df = fetcher( - "jhu-csse", signal_to_fetch, - query_min, query_max, - geo_to_fetch, - ) - combined_df = merge_dfs_by_geos(usafacts_df, jhu_df, geo_to_fetch) - - # default sort from API is ORDER BY signal, time_value, geo_value, issue - # we want to drop all but the most recent (last) issue - combined_df.drop_duplicates( - subset=["geo_id", "timestamp"], - keep="last", - inplace=True - ) - - if is_special_geo: - combined_df = compute_special_geo_dfs(combined_df, signal, geo) - if "se" not in combined_df.columns and "sample_size" not in combined_df.columns: - # if a column has non numeric data including None, they'll be dropped. - # se and sample size are required later so we add them back. - combined_df["se"] = combined_df["sample_size"] = None - combined_df.rename({geo: "geo_id"}, axis=1, inplace=True) - - return combined_df - -def extend_raw_date_range(params, sensor_name): - """Extend the date range of the raw data backwards by 7 days. - - A complete issue includes smoothed signals as well as all raw data - that contributed to the smoothed values, so that it's possible to use - the raw values in the API to reconstruct the smoothed signal at will. - The smoother we're currently using incorporates the previous 7 - days of data, so we must extend the date range of the raw data - backwards by 7 days. - """ - if sensor_name.find("7dav") < 0: - return [ - params['indicator']['date_range'][0] - timedelta(days=7), - params['indicator']['date_range'][-1] - ] - return params['indicator']['date_range'] - -def next_missing_day(source, signals): - """Fetch the first day for which we want to generate new data.""" - meta_df = covidcast.metadata() - meta_df = meta_df[meta_df["data_source"] == source] - meta_df = meta_df[meta_df["signal"].isin(signals)] - # min: use the max_time of the most lagged signal, in case they differ - # +timedelta: the subsequent day is the first day of new data to generate - day = min(meta_df["max_time"]) + timedelta(days=1) - return day - -def sensor_signal(metric, sensor, smoother): - """Generate the signal name for a particular configuration.""" - if smoother == "7dav": - sensor_name = "_".join([smoother, sensor]) - else: - sensor_name = sensor - return sensor_name, "_".join([metric, sensor_name]) - -def configure(variants, params): - """Validate params file and set date range.""" - params['indicator']['export_start_date'] = date(*params['indicator']['export_start_date']) - yesterday = date.today() - timedelta(days=1) - next_day = next_missing_day( - params['indicator']["source"], - set(signal[-1] for signal in variants) - ) - configure_range(params, 'date_range', yesterday, next_day) - # pad issue range in case we caught jhu but not usafacts or v/v in the last N issues; - # issue_days also needs to be set to a value large enough to include values you would like - # to reissue - try: - issue_days = params['indicator']['issue_days'] - except KeyError: - issue_days = 7 - configure_range(params, 'issue_range', yesterday, next_day - timedelta(days=issue_days)) - return params - -def configure_range(params, range_param, yesterday, next_day): - """Configure a parameter which stores a range of dates. - - May be specified in params.json as: - "new" - set to [next_day, yesterday] - "all" - set to [export_start_date, yesterday] - yyyymmdd-yyyymmdd - set to exact range - """ - if range_param not in params['indicator'] or params['indicator'][range_param] == 'new': - # only create combined file for the newest update - # (usually for yesterday, but check just in case) - params['indicator'][range_param] = [ - min( - yesterday, - next_day - ), - yesterday - ] - elif params['indicator'][range_param] == 'all': - # create combined files for all of the historical reports - if range_param == 'date_range': - params['indicator'][range_param] = [params['indicator']['export_start_date'], yesterday] - elif range_param == 'issue_range': - # for issue_range=all we want the latest issue for all requested - # dates, aka the default when issue is unspecified - params['indicator'][range_param] = None - else: - raise ValueError( - f"Bad Programmer: Invalid range_param '{range_param}';" - f"expected 'date_range' or 'issue_range'") - else: - match_res = re.findall(re.compile(r'^\d{8}-\d{8}$'), params['indicator'][range_param]) - if len(match_res) == 0: - raise ValueError( - f"Invalid {range_param} parameter. Try (new, all, yyyymmdd-yyyymmdd).") - try: - date1 = datetime.strptime(params['indicator'][range_param][:8], '%Y%m%d').date() - except ValueError as error: - raise ValueError( - f"Invalid {range_param} parameter. Please check the first date.") from error - try: - date2 = datetime.strptime(params['indicator'][range_param][-8:], '%Y%m%d').date() - except ValueError as error: - raise ValueError( - f"Invalid {range_param} parameter. Please check the second date.") from error - - # ensure valid start date - if date1 < params['indicator']['export_start_date']: - date1 = params['indicator']['export_start_date'] - params['indicator'][range_param] = [date1, date2] - -def run_module(params): - """ - Produce a combined cases and deaths signal using data from JHU and USA Facts. - - Parameters - ---------- - params - Dictionary containing indicator configuration. Expected to have the following structure: - - "common": - - "export_dir": str, directory to write output. - - "log_exceptions" (optional): bool, whether to log exceptions to file. - - "log_filename" (optional): str, name of file to write logs - - "indicator": - - "export_start_date": list of ints, [year, month, day] format, first day to begin - data exports from. - - "date_range": str, YYYYMMDD-YYYYMMDD format, range of dates to generate data for. - - "source": str, name of combo indicator in metadata. - - "wip_signal": list of str or bool, to be passed to delphi_utils.add_prefix. - """ - start_time = time.time() - variants = [tuple((metric, geo_res)+sensor_signal(metric, sensor, smoother)) - for (metric, geo_res, sensor, smoother) in - product(METRICS, GEO_RESOLUTIONS, SENSORS, SMOOTH_TYPES)] - variants = [i for i in variants if not ("7dav" in i[2] and "cumulative" in i[2])] - params = configure(variants, params) - logger = get_structured_logger( - __name__, filename=params["common"].get("log_filename"), - 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']) - export_dir = params["common"]["export_dir"] - dates = pd.Series( - df[df["timestamp"] >= start_date]["timestamp"].unique() - ).sort_values() - - signal_name = add_prefix([signal], - wip_signal=params['indicator']["wip_signal"], - prefix="wip_") - for date_ in dates: - export_fn = f'{date_.strftime("%Y%m%d")}_{geo_res}_{signal_name[0]}.csv' - df[df["timestamp"] == date_][["geo_id", "val", "se", "sample_size", ]].to_csv( - f"{export_dir}/{export_fn}", index=False, na_rep="NA" - ) - - elapsed_time_in_seconds = round(time.time() - start_time, 2) - logger.info("Completed indicator run", - elapsed_time_in_seconds = elapsed_time_in_seconds) diff --git a/combo_cases_and_deaths/params.json.template b/combo_cases_and_deaths/params.json.template deleted file mode 100644 index 9c009e0d5..000000000 --- a/combo_cases_and_deaths/params.json.template +++ /dev/null @@ -1,33 +0,0 @@ -{ - "common": { - "log_exceptions": false, - "export_dir": "./receiving", - "log_filename": "./indicator-combination.log" - }, - "indicator": { - "export_start_date":[2020,4,1], - "date_range":"new", - "issue_days":7, - "source":"indicator-combination", - "wip_signal": "" - }, - "validation": { - "common": { - "data_source": "indicator-combination", - "span_length": 14, - "min_expected_lag": {"all": "2"}, - "max_expected_lag": {"all": "6"}, - "dry_run": true, - "suppressed_errors": [{"check_name": "check_val_lt_0"} ] - }, - "static": { - "minimum_sample_size": 5, - "missing_se_allowed": true, - "missing_sample_size_allowed": true - }, - "dynamic": { - "ref_window_size": 7 - } - } -} - diff --git a/combo_cases_and_deaths/receiving/.gitignore b/combo_cases_and_deaths/receiving/.gitignore deleted file mode 100644 index afed0735d..000000000 --- a/combo_cases_and_deaths/receiving/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.csv diff --git a/combo_cases_and_deaths/setup.py b/combo_cases_and_deaths/setup.py deleted file mode 100644 index db97840a7..000000000 --- a/combo_cases_and_deaths/setup.py +++ /dev/null @@ -1,28 +0,0 @@ -from setuptools import setup -from setuptools import find_packages - -required = [ - "pandas", - "pydocstyle", - "pytest", - "pytest-cov", - "pylint==2.8.3", - "delphi-utils", - "covidcast>=0.1.4" -] - -setup( - name="delphi_combo_cases_and_deaths", - version="0.1.0", - description="A combined signal for cases and deaths using JHU for Puerto Rico and USA Facts everywhere else", - author="Jingjing Tang, Kathryn Mazaitis", - author_email="krivard@cs.cmu.edu", - url="https://github.com/cmu-delphi/covidcast-indicators", - install_requires=required, - classifiers=[ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Programming Language :: Python :: 3.8", - ], - packages=find_packages(), -) diff --git a/combo_cases_and_deaths/static/.gitignore b/combo_cases_and_deaths/static/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/combo_cases_and_deaths/tests/receiving/.gitkeep b/combo_cases_and_deaths/tests/receiving/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/combo_cases_and_deaths/tests/test_run.py b/combo_cases_and_deaths/tests/test_run.py deleted file mode 100644 index c799b6ed3..000000000 --- a/combo_cases_and_deaths/tests/test_run.py +++ /dev/null @@ -1,305 +0,0 @@ -"""Tests for running combo cases and deaths indicator.""" -import logging -from datetime import date -from itertools import product -import os -import unittest -from unittest.mock import patch, call -import pandas as pd -import numpy as np - -from delphi_combo_cases_and_deaths.run import ( - run_module, - extend_raw_date_range, - get_updated_dates, - sensor_signal, - combine_usafacts_and_jhu, - compute_special_geo_dfs, - COLUMN_MAPPING) -from delphi_combo_cases_and_deaths.constants import METRICS, SMOOTH_TYPES, SENSORS -from delphi_utils.geomap import GeoMapper - -TEST_LOGGER = logging.getLogger() - -def test_issue_dates(): - """The smoothed value for a particular date is computed from the raw - values for a span of dates. We want users to be able to see in the - API all the raw values that went into the smoothed computation, - for transparency and peer review. This means that each issue - should contain more days of raw data than smoothed data. - """ - reference_dr = [date.today(), date.today()] - params = {'indicator': {'date_range': reference_dr}} - n_changed = 0 - variants = [sensor_signal(metric, sensor, smoother) for - metric, sensor, smoother in - product(METRICS, SENSORS, SMOOTH_TYPES)] - variants_changed = [] - for sensor_name, _ in variants: - dr = extend_raw_date_range(params, sensor_name) - if dr[0] != reference_dr[0]: - n_changed += 1 - variants_changed.append(sensor_name) - assert n_changed == len(variants) / 2, f""" -Raw variants should post more days than smoothed. -All variants: {variants} -Date-extended variants: {variants_changed} -""" - -@patch("covidcast.covidcast.signal") -def test_unstable_sources(mock_covidcast_signal): - """Verify that combine_usafacts_and_jhu assembles the combined data - frame correctly for all cases where 0, 1, or both signals are - available. - """ - date_count = [1] - def jhu(geo, c=date_count): - if geo == "state": - geo_val = "pr" - elif geo == "msa": - geo_val = "38660" - else: - geo_val = "72001" - return pd.DataFrame( - [(date.fromordinal(c[0]),geo_val,1,1,1)], - columns="timestamp geo_value value stderr sample_size".split()) - def uf(geo, c=date_count): - if geo == "state": - geo_val = "ny" - elif geo == "msa": - geo_val = "10580" - else: - geo_val = "36001" - return pd.DataFrame( - [(date.fromordinal(c[0]),geo_val,1,1,1)], - columns="timestamp geo_value value stderr sample_size".split()) - def make_mock(geo): - # The first two in each row provide a unique_date array of the appropriate length for - # query of the latter two (in combine_usafacts_and_jhu) - return [ - # 1 0 - uf(geo), None, uf(geo), None, - # 0 1 - None, jhu(geo), - # 1 1 - uf(geo), jhu(geo), uf(geo), jhu(geo), - # 0 0 - None, None - ] - - geos = ["state", "county", "msa", "nation", "hhs"] - outputs = [df for g in geos for df in make_mock(g)] - mock_covidcast_signal.side_effect = outputs[:] - - date_range = [date.today(), date.today()] - - calls = 0 - for geo in geos: - for config, call_size, expected_size in [ - ("1 0", 4, 1), - ("0 1", 2, 0), - ("1 1", 4, 1 if geo in ["nation", "hhs"] else 2), - ("0 0", 2, 0) - ]: - 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. - -input for {geo} {config}: -{outputs[calls]} -{outputs[calls + 1]} - -output: -{df} - -expected rows: {expected_size} -""" - calls += call_size - date_count[0] += 1 - -@patch("covidcast.covidcast.signal") -def test_multiple_issues(mock_covidcast_signal): - """Verify that only the most recent issue is retained.""" - mock_covidcast_signal.side_effect = [ - pd.DataFrame({ - "geo_value": ["01000", "01000"], - "value": [1, 10], - "timestamp": [20200101, 20200101], - "issue": [20200102, 20200104] - }), - None - ] * 2 - 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( - { - "geo_id": ["01000"], - "val": [10], - "timestamp": [20200101], - "issue": [20200104] - }, - index=[1] - ) - ) - -def test_compute_special_geo_dfs(): - test_df = pd.DataFrame({"geo_id": ["01000", "01001"], - "val": [50, 100], - "timestamp": [20200101, 20200101]},) - df = compute_special_geo_dfs(test_df, "_prop", "nation") - state_pop = GeoMapper().get_crosswalk("state_code", "pop") - state_pop = int(state_pop.loc[state_pop.state_code == "01", "pop"]) - expected_df = pd.DataFrame({ - "timestamp": [20200101], - "geo_id": ["us"], - "val": [150/state_pop*100000] - }) - pd.testing.assert_frame_equal(df, expected_df) - pd.testing.assert_frame_equal( - compute_special_geo_dfs(test_df, "_num", "nation"), - pd.DataFrame({"timestamp": [20200101], - "geo_id": ["us"], - "val": [150]}) - ) - -@patch("covidcast.covidcast.signal") -def test_get_updated_dates(mock_covidcast_signal): - mock_covidcast_signal.side_effect = [ - pd.DataFrame({"geo_value": ["01000", "01001"], - "value": [50, 100], - "timestamp": [20200101, 20200103]}), - pd.DataFrame({"geo_value": ["72001", "01001"], - "value": [200, 100], - "timestamp": [20200101, 20200101]}) - ] - updated_dates = get_updated_dates( - "confirmed_incidence_num", - "nation", - date_range=(0, 1), - fetcher=mock_covidcast_signal) - assert np.allclose(updated_dates, np.array([20200101, 20200103])) - -@patch("covidcast.covidcast.signal") -def test_combine_usafacts_and_jhu_special_geos(mock_covidcast_signal): - mock_covidcast_signal.side_effect = [ - pd.DataFrame({"geo_value": ["01000", "01001"], - "value": [50, 100], - "timestamp": [20200101, 20200101]}), - pd.DataFrame({"geo_value": ["72001", "01001"], - "value": [200, 100], - "timestamp": [20200101, 20200101]}), - ] * 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=TEST_LOGGER, fetcher=mock_covidcast_signal), - pd.DataFrame({"timestamp": [20200101], - "geo_id": ["us"], - "val": [50 + 100 + 200], - "se": [None], - "sample_size": [None]}) - ) - df = combine_usafacts_and_jhu("confirmed_incidence_prop", "nation", date_range=(0, 1), logger=TEST_LOGGER, fetcher=mock_covidcast_signal) - state_pop = GeoMapper().get_crosswalk("state_code", "pop") - state_pop = int(state_pop.loc[state_pop.state_code.isin(["01", "72"]), "pop"].sum()) - expected_df = pd.DataFrame({ - "timestamp": [20200101], - "geo_id": ["us"], - "val": [(50 + 100 + 200) / state_pop * 100000], - "se": [None], - "sample_size": [None] - }) - pd.testing.assert_frame_equal(df, expected_df) - pd.testing.assert_frame_equal( - 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]}, - index=[0, 1, 0]) - ) - -@patch("covidcast.covidcast.signal") -def test_no_nation_jhu(mock_covidcast_signal): - """ - If we get JHU data that extends farther into the future than USAFacts data, trim it off. - """ - cvc_columns = "time_value geo_value value stderr sample_size".split() - mock_covidcast_signal.side_effect = [ - pd.DataFrame({"geo_value": ["01000"], - "value": [50], - "timestamp": [20200101]},), - pd.DataFrame({"geo_value": ["72001", "72001"], - "value": [1, 1], - "timestamp": [20200101, 20200102]}), - pd.DataFrame({"geo_value": ["01000"], - "value": [50], - "timestamp": [20200101]},), - pd.DataFrame({"geo_value": ["72001"], - "value": [1], - "timestamp": [20200101]}) - ] - 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", - "_num", - 20200101, - 20200101, - "county" - ) - pd.testing.assert_frame_equal( - result, - pd.DataFrame({"timestamp":[20200101], - "geo_id":["us"], - "val":[51], - "se": [None], - "sample_size": [None]},) - ) - -@patch("delphi_combo_cases_and_deaths.run.combine_usafacts_and_jhu") -def test_output_files(mock_combine): - params = { - "common": { - "export_dir": "./receiving" - }, - "indicator": { - "export_start_date": [2020, 4, 1], - "source":"indicator-combination", - "wip_signal": "" - } - } - mock_combine.return_value = pd.DataFrame( - { - "geo_id": ["01000"], - "val": [10], - "timestamp": [pd.to_datetime("2021-01-04")], - "issue": [pd.to_datetime("2021-01-04")], - "se": 0, - "sample_size": 0 - }, - index=[1] - ) - run_module(params) - csv_files = [f for f in os.listdir("receiving") if f.endswith(".csv")] - dates = ["20210104"] - geos = ["county", "hrr", "msa", "state", "hhs", "nation"] - - # enumerate metric names. - metrics = [] - for event, span, stat in product(["deaths", "confirmed"], - ["cumulative", "incidence"], - ["num", "prop"]): - metrics.append("_".join([event, span, stat])) - metrics.append("_".join([event, "7dav", span, stat])) - - expected_files = [] - for date in dates: - for geo in geos: - for metric in metrics: - if "7dav" in metric and "cumulative" in metric: - continue - expected_files += [date + "_" + geo + "_" + metric + ".csv"] - assert set(csv_files) == set(expected_files) - -if __name__ == '__main__': - unittest.main() diff --git a/covid_act_now/.pylintrc b/covid_act_now/.pylintrc deleted file mode 100644 index f30837c7e..000000000 --- a/covid_act_now/.pylintrc +++ /dev/null @@ -1,22 +0,0 @@ - -[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/covid_act_now/Makefile b/covid_act_now/Makefile deleted file mode 100644 index bc88f1fec..000000000 --- a/covid_act_now/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -.PHONY = venv, lint, test, clean - -dir = $(shell find ./delphi_* -name __init__.py | grep -o 'delphi_[_[:alnum:]]*' | head -1) -venv: - python3.8 -m venv env - -install: venv - . env/bin/activate; \ - pip install wheel ; \ - pip install -e ../_delphi_utils_python ;\ - pip install -e . - -install-ci: venv - . env/bin/activate; \ - pip install wheel ; \ - pip install ../_delphi_utils_python ;\ - pip install . - -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/covid_act_now/README.md b/covid_act_now/README.md deleted file mode 100644 index ff16f06ea..000000000 --- a/covid_act_now/README.md +++ /dev/null @@ -1,61 +0,0 @@ -Covid Act Now (CAN) provides several testing metrics at the county and state level from various sources. -This indicator extracts only the county level PCR and specimen-based metrics sourced from the [CDC](https://covid.cdc.gov/covid-data-tracker/#county-view) and additionally aggregates them to state, MSA, HRR, HHS and national levels. - -## 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_covid_act_now -``` - -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 .py --cov=delphi_covid_act_now --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/covid_act_now/REVIEW.md b/covid_act_now/REVIEW.md deleted file mode 100644 index 93a5a6579..000000000 --- a/covid_act_now/REVIEW.md +++ /dev/null @@ -1,39 +0,0 @@ -## 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 use 4 spaces for indentation; other style decisions are -flexible, but be consistent within a module -- [ ] 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 -- [ ] pylint with the default `.pylint` settings run over the module produces -minimal warnings; warnings that do exist have been confirmed as false positives -- [ ] 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 diff --git a/covid_act_now/cache/.gitignore b/covid_act_now/cache/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/covid_act_now/delphi_covid_act_now/__init__.py b/covid_act_now/delphi_covid_act_now/__init__.py deleted file mode 100644 index 800a750a0..000000000 --- a/covid_act_now/delphi_covid_act_now/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -"""Module to pull and clean indicators from Covid Act Now. - -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 run - -__version__ = "0.1.0" diff --git a/covid_act_now/delphi_covid_act_now/__main__.py b/covid_act_now/delphi_covid_act_now/__main__.py deleted file mode 100644 index e79d2ba36..000000000 --- a/covid_act_now/delphi_covid_act_now/__main__.py +++ /dev/null @@ -1,11 +0,0 @@ -# -*- coding: utf-8 -*- -"""Call the function run_module when executed. - -This file indicates that calling the module (`python -m delphi_covid_act_now`) 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/covid_act_now/delphi_covid_act_now/constants.py b/covid_act_now/delphi_covid_act_now/constants.py deleted file mode 100644 index eb26e4460..000000000 --- a/covid_act_now/delphi_covid_act_now/constants.py +++ /dev/null @@ -1,15 +0,0 @@ -"""Registry for signal names.""" - -GEO_RESOLUTIONS = [ - "county", - "state", - "msa", - "hrr", - "hhs", - "nation", -] - -SIGNALS = [ - "pcr_specimen_positivity_rate", - "pcr_specimen_total_tests", -] diff --git a/covid_act_now/delphi_covid_act_now/geo.py b/covid_act_now/delphi_covid_act_now/geo.py deleted file mode 100644 index 691ba9fe7..000000000 --- a/covid_act_now/delphi_covid_act_now/geo.py +++ /dev/null @@ -1,101 +0,0 @@ -"""Geo-aggregation related functions.""" - -import numpy as np -import pandas as pd - -from delphi_utils import GeoMapper - -from .constants import GEO_RESOLUTIONS - -gmpr = GeoMapper() - -def positivity_rate(x): - """ - Find Positivity Rate from binomial counts. - - Assumes input sample_size are all > 0. - - Parameters - ---------- - x: pd.DataFrame - Columns: pcr_tests_positive, sample_size, ... - - Returns - ------- - pd.Series - Positivity Rate of PCR-specimen tests. - """ - p = x.pcr_tests_positive / x.sample_size - - return p - -def std_err(x): - """ - Find Standard Error of a binomial proportion. - - Assumes input sample_size are all > 0. - - Parameters - ---------- - x: pd.DataFrame - Columns: val, sample_size, ... - - Returns - ------- - pd.Series - Standard error of the positivity rate of PCR-specimen tests. - """ - p = x.val - n = x.sample_size - return np.sqrt(p * (1 - p) / n) - -def geo_map(df: pd.DataFrame, geo_res: str) -> pd.DataFrame: - """ - Aggregate county-level PCR testing metrics to other geographical levels specified by `geo_res`. - - Parameters - ---------- - df: pd.DataFrame - Columns: fips, timestamp, pcr_tests_positive, pcr_tests_total, ... - geo_res: str - Geographic resolution to which to aggregate. Valid options: - ("county", "state", "msa", "hrr", "hhs", "nation"). - - Returns - ------- - pd.DataFrame - Dataframe where val is positivity rate and sample_size is total tests. - Columns: geo_id, timestamp, val, sample_size, se - """ - if geo_res not in GEO_RESOLUTIONS: - raise ValueError(f"geo_res must be one of {GEO_RESOLUTIONS}, got '{geo_res}'") - - if (df.pcr_tests_positive > df.pcr_tests_total).any(): - raise ValueError("Found some test positive count greater than the total") - - if (df.pcr_tests_total <= 0).any(): - raise ValueError("Found some test total <= 0") - - if geo_res == "county": - df = (df - .rename(columns={ - "fips": "geo_id", - "pcr_positivity_rate": "val", - "pcr_tests_total": "sample_size"}) - .assign(se=std_err) - ) - - else: - # All other geo_res can be used directly with GeoMapper - if geo_res == "state": - geo_res = "state_id" - - df = (df - .loc[:, ["fips", "timestamp", "pcr_tests_positive", "pcr_tests_total"]] - .pipe(gmpr.replace_geocode, "fips", geo_res, new_col="geo_id") - .rename(columns={"pcr_tests_total": "sample_size"}) - .assign(val=positivity_rate, se=std_err) - .reset_index() - ) - - return df diff --git a/covid_act_now/delphi_covid_act_now/pull.py b/covid_act_now/delphi_covid_act_now/pull.py deleted file mode 100644 index 1a694568f..000000000 --- a/covid_act_now/delphi_covid_act_now/pull.py +++ /dev/null @@ -1,81 +0,0 @@ -"""Functions for downloading CAN data.""" - -import pandas as pd - -RENAME_COLS = { - "dt": "timestamp", - "location": "fips", -} - -def load_data(path: str) -> pd.DataFrame: - """ - Load CAN's data from a local or online parquet file. - - Some important columns are: - - provider: Source of the data - - location_type: State or county level data - - variable_name: Name of available metrics, like pcr_tests_* - - This function also formats and renames the geo and time columns to follow our conventions. - - Parameters - ---------- - path: str - A local path or URL to CAN's parquet file to load from - - Returns - ------- - pd.DataFrame - CAN's data in long format - """ - df_pq = (pd - .read_parquet(path) - .rename(columns=RENAME_COLS) - ) - - # Format fips - df_pq["fips"] = df_pq["fips"].astype(str).str.zfill(5) - - return df_pq - -def extract_testing_metrics(df: pd.DataFrame) -> pd.DataFrame: - """ - Extract just the county-level testing metrics from CAN's data. - - Specifically picks the CDC-sourced metrics only as they are confirmed to be PCR-specimen-based. - Also converts from long to wide format for easier aggregations later on. - - Note that the CDC's metrics are already smoothed (7-day rolling averaged). - - Parameters - ---------- - df: pd.DataFrame - CAN's data in long format - - Returns - ------- - pd.DataFrame - CAN's / CDC's testing data in wide format - Columns: fips, timestamp, pcr_positivity_rate, pcr_tests_positive, pcr_tests_total - """ - # Filter to PCR-specimen rows from CDC and convert from long to wide format - df_tests = ( - df - .query( - """ - age == 'all' and ethnicity == 'all' and sex == 'all' and \ - location_type == 'county' and provider == 'cdc' and \ - variable_name.str.startswith('pcr_tests_') - """) - .pivot(index=["fips", "timestamp"], columns="variable_name", values="value") - .reset_index() - # Filter off rows with 0 sample_size - .query("pcr_tests_total > 0") - # pcr_tests_positive from the CDC is actually positivity rate (percentage) - .rename(columns={"pcr_tests_positive": "pcr_positivity_rate"}) - ) - - df_tests["pcr_positivity_rate"] /= 100 - df_tests["pcr_tests_positive"] = df_tests.pcr_positivity_rate * df_tests.pcr_tests_total - - return df_tests diff --git a/covid_act_now/delphi_covid_act_now/run.py b/covid_act_now/delphi_covid_act_now/run.py deleted file mode 100644 index 7cc96f6e4..000000000 --- a/covid_act_now/delphi_covid_act_now/run.py +++ /dev/null @@ -1,92 +0,0 @@ -# -*- 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 delphi_covid_act_now`. -""" -from datetime import datetime -import time - -import numpy as np - -from delphi_utils import ( - create_export_csv, - get_structured_logger -) - -from .constants import GEO_RESOLUTIONS, SIGNALS -from .geo import geo_map -from .pull import load_data, extract_testing_metrics - -def run_module(params): - """ - Run the CAN testing metrics indicator. - - Parameters - ---------- - params - Dictionary containing indicator configuration. Expected to have the following structure: - - "common": - - "export_dir": str, directory to write output - - "indicator": - - "parquet_url": str, URL of source file in parquet format - - "archive" (optional): if provided, output will be archived with S3 - - "cache_dir": str, directory of locally cached data - - "bucket_name: str, name of S3 bucket to read/write - - "aws_credentials": Dict[str, str], AWS login credentials (see S3 documentation) - """ - start_time = time.time() - logger = get_structured_logger( - __name__, filename=params["common"].get("log_filename"), - log_exceptions=params["common"].get("log_exceptions", True)) - - # Configuration - export_dir = params["common"]["export_dir"] - parquet_url = params["indicator"]["parquet_url"] - - # Load CAN county-level testing data - logger.info("Pulling CAN data") - df_pq = load_data(parquet_url) - df_county_testing = extract_testing_metrics(df_pq) - - num_exported_files = 0 - min_dates_exported = [] - max_dates_exported = [] - # Perform geo aggregations and export to receiving - for geo_res in GEO_RESOLUTIONS: - 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' - exported_csv_dates = create_export_csv( - df, - export_dir=export_dir, - geo_res=geo_res, - sensor=SIGNALS[0]) - - # Export 'pcr_specimen_total_tests' - df["val"] = df["sample_size"] - df["sample_size"] = np.nan - df["se"] = np.nan - exported_csv_dates = create_export_csv( - df, - export_dir=export_dir, - geo_res=geo_res, - sensor=SIGNALS[1]) - - earliest, latest = min(exported_csv_dates), max(exported_csv_dates) - min_dates_exported.append(earliest) - max_dates_exported.append(latest) - # x2 to count both positivity and tests signals - num_exported_files += exported_csv_dates.size * 2 - 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 - logger.info("Completed indicator run", - elapsed_time_in_seconds=elapsed_time_in_seconds, - csv_export_count=num_exported_files, - max_lag_in_days=max_lag_in_days, - earliest_export_date=min(min_dates_exported).strftime("%Y-%m-%d"), - latest_export_date=max(max_dates_exported).strftime("%Y-%m-%d")) diff --git a/covid_act_now/params.json.template b/covid_act_now/params.json.template deleted file mode 100644 index 8774fd064..000000000 --- a/covid_act_now/params.json.template +++ /dev/null @@ -1,51 +0,0 @@ -{ - "common": { - "export_dir": "./receiving", - "log_filename": "./covid_act_now.log" - }, - "indicator": { - "parquet_url": "https://storage.googleapis.com/can-scrape-outputs/final/can_scrape_api_covid_us.parquet" - }, - "archive": { - "cache_dir": "./cache", - "bucket_name": "", - "indicator_prefix": "CAN", - "aws_credentials": { - "aws_access_key_id": "", - "aws_secret_access_key": "" - } - }, - "validation": { - "common": { - "data_source": "covid-act-now", - "span_length": 14, - "min_expected_lag": {"all": "3"}, - "max_expected_lag": {"all": "9"}, - "dry_run": true, - "suppressed_errors": [ - {"check_name": "check_se_many_missing", - "signal": "pcr_specimen_total_tests"}, - {"check_name": "check_se_not_missing_and_in_range", - "signal": "pcr_specimen_total_tests"}, - {"check_name": "check_n_missing", - "signal": "pcr_specimen_total_tests"}, - {"check_name": "check_se_0_when_val_0"}, - {"check_name": "check_test_vs_reference_avg_changed", - "signal": "pcr_specimen_positivity_rate"} - ] - }, - "static": { - "minimum_sample_size": 0, - "missing_se_allowed": false, - "missing_sample_size_allowed": false - }, - "dynamic": { - "ref_window_size": 7, - "smoothed_signals": [ - ] - } - }, - "delivery": { - "delivery_dir": "./receiving" - } -} \ No newline at end of file diff --git a/covid_act_now/setup.py b/covid_act_now/setup.py deleted file mode 100644 index 03ddecc47..000000000 --- a/covid_act_now/setup.py +++ /dev/null @@ -1,30 +0,0 @@ -from setuptools import setup -from setuptools import find_packages - -required = [ - "numpy", - "pandas", - "pydocstyle", - "pytest", - "pytest-cov", - "pylint==2.8.3", - "delphi-utils", - "covidcast", - "pyarrow", -] - -setup( - name="delphi_covid_act_now", - version="0.1.0", - description="Indicators from COVID Act Now", - author="Eu Jing Chua", - author_email="eujingc@andrew.cmu.edu", - url="https://github.com/cmu-delphi/covidcast-indicators", - install_requires=required, - classifiers=[ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Programming Language :: Python :: 3.8", - ], - packages=find_packages(), -) diff --git a/covid_act_now/static/.gitignore b/covid_act_now/static/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/covid_act_now/tests/conftest.py b/covid_act_now/tests/conftest.py deleted file mode 100644 index 486fde6cb..000000000 --- a/covid_act_now/tests/conftest.py +++ /dev/null @@ -1,161 +0,0 @@ -# -*- coding: utf-8 -*- -from os import listdir, remove -from os.path import join - -from boto3 import Session -from moto import mock_s3 -import numpy as np -import pandas as pd -import pytest - - -@pytest.fixture(scope="session") -def clean_receiving_dir(): - # Clean receiving directory - for fname in listdir("receiving"): - if fname not in (".gitkeep", ".gitignore"): - remove(join("receiving", fname)) - - -@pytest.fixture -def CAN_parquet_data(): - columns = ["provider", "dt", "location_id", "location", "location_type", "variable_name", - "measurement", "unit", "age", "race", "ethnicity", "sex", "last_updated", "value"] - data = [ - ["cdc", "2021-01-01", "iso1:us#iso2:us-al#fips:01001", 1001, "county", "pcr_tests_positive", - "rolling_average_7_day", "percentage", "all", "all", "all", "all", "2021-01-02 19:00:00", 50.0], - ["cdc", "2021-01-01", "iso1:us#iso2:us-al#fips:01003", 1003, "county", "pcr_tests_positive", - "rolling_average_7_day", "percentage", "all", "all", "all", "all", "2021-01-02 19:00:00", 25.0], - ["cdc", "2021-01-01", "iso1:us#iso2:us-al#fips:01005", 1005, "county", "pcr_tests_positive", - "rolling_average_7_day", "percentage", "all", "all", "all", "all", "2021-01-02 19:00:00", 50.0], - - ["cdc", "2021-01-01", "iso1:us#iso2:us-al#fips:01001", 1001, "county", "pcr_tests_total", - "rolling_average_7_day", "specimens", "all", "all", "all", "all", "2021-01-02 19:00:00", 10.0], - ["cdc", "2021-01-01", "iso1:us#iso2:us-al#fips:01003", 1003, "county", "pcr_tests_total", - "rolling_average_7_day", "specimens", "all", "all", "all", "all", "2021-01-02 19:00:00", 20.0], - ["cdc", "2021-01-01", "iso1:us#iso2:us-al#fips:01005", 1005, "county", "pcr_tests_total", - "rolling_average_7_day", "specimens", "all", "all", "all", "all", "2021-01-02 19:00:00", 20.0], - - ["cdc", "2021-01-01", "iso1:us#iso2:us-pa#fips:42001", 42001, "county", "pcr_tests_positive", - "rolling_average_7_day", "percentage", "all", "all", "all", "all", "2021-01-02 19:00:00", 50.0], - ["cdc", "2021-01-01", "iso1:us#iso2:us-pa#fips:42003", 42003, "county", "pcr_tests_positive", - "rolling_average_7_day", "percentage", "all", "all", "all", "all", "2021-01-02 19:00:00", 20.0], - ["cdc", "2021-01-01", "iso1:us#iso2:us-pa#fips:42005", 42005, "county", "pcr_tests_positive", - "rolling_average_7_day", "percentage", "all", "all", "all", "all", "2021-01-02 19:00:00", 10.0], - - ["cdc", "2021-01-01", "iso1:us#iso2:us-pa#fips:42001", 42001, "county", "pcr_tests_total", - "rolling_average_7_day", "specimens", "all", "all", "all", "all", "2021-01-02 19:00:00", 10.0], - ["cdc", "2021-01-01", "iso1:us#iso2:us-pa#fips:42003", 42003, "county", "pcr_tests_total", - "rolling_average_7_day", "specimens", "all", "all", "all", "all", "2021-01-02 19:00:00", 20.0], - ["cdc", "2021-01-01", "iso1:us#iso2:us-pa#fips:42005", 42005, "county", "pcr_tests_total", - "rolling_average_7_day", "specimens", "all", "all", "all", "all", "2021-01-02 19:00:00", 10.0], - - ["SOME_SOURCE", "2021-01-15", "iso1:us#iso2:us-fl#fips:12093", 12093, "county", "SOME_OTHER_METRIC", - "SOME_MEASUREMENT", "SOME_UNITS", "all", "all", "all", "all", "2021-01-21 19:00:00", 123.0], - ] - - df_pq = pd.DataFrame(data, columns=columns) - - return df_pq - -@pytest.fixture -def CAN_county_testing_data(): - columns = ["fips", "timestamp", "pcr_tests_positive", "pcr_tests_total", "pcr_positivity_rate"] - data = [ - ["01001", "2021-01-01", 5, 10, 0.5], - ["01003", "2021-01-01", 5, 20, 0.25], - ["01005", "2021-01-01", 10, 20, 0.5], - ["42001", "2021-01-01", 5, 10, 0.5], - ["42003", "2021-01-01", 4, 20, 0.2], - ["42005", "2021-01-01", 1, 10, 0.1], - ] - - df = pd.DataFrame(data, columns=columns) - df["timestamp"] = pd.to_datetime(df["timestamp"]) - p, n = df.pcr_positivity_rate, df.pcr_tests_total - df["se"] = np.sqrt(p * (1 - p) / n) - - return df - -@pytest.fixture -def CAN_state_testing_data(): - columns = ["fips", "timestamp", "pcr_tests_positive", "pcr_tests_total", "pcr_positivity_rate"] - data = [ - ["al", "2021-01-01", 20, 50, 0.4], - ["pa", "2021-01-01", 10, 40, 0.25] - ] - - df = pd.DataFrame(data, columns=columns) - df["timestamp"] = pd.to_datetime(df["timestamp"]) - p, n = df.pcr_positivity_rate, df.pcr_tests_total - df["se"] = np.sqrt(p * (1 - p) / n) - - return df - -@pytest.fixture -def CAN_msa_testing_data(): - columns = ["fips", "timestamp", "pcr_tests_positive", "pcr_tests_total", "pcr_positivity_rate"] - data = [ - ["19300", "2021-01-01", 5, 20, 0.25], - ["23900", "2021-01-01", 5, 10, 0.5], - ["33860", "2021-01-01", 5, 10, 0.5], - ["38300", "2021-01-01", 5, 30, 5 / 30], - ] - - df = pd.DataFrame(data, columns=columns) - df["timestamp"] = pd.to_datetime(df["timestamp"]) - p, n = df.pcr_positivity_rate, df.pcr_tests_total - df["se"] = np.sqrt(p * (1 - p) / n) - - return df - -@pytest.fixture -def CAN_hrr_testing_data(): - columns = ["fips", "timestamp", "pcr_tests_positive", "pcr_tests_total", "pcr_positivity_rate"] - data = [ - ["1", "2021-01-01", 0.195525, 0.391050, 0.5], - ["134", "2021-01-01", 0.159989, 0.639958, 0.25], - ["2", "2021-01-01", 9.743599, 19.487198, 0.5], - ["351", "2021-01-01", 0.0145052, 0.145052, 0.1], - ["352", "2021-01-01", 2.690298, 5.380595, 0.5], - ["357", "2021-01-01", 4.985495, 29.854948, 0.166991], - ["363", "2021-01-01", 2.309702, 4.619405, 0.5], - ["6", "2021-01-01", 4.840011, 19.360042, 0.25], - ["7", "2021-01-01", 5.060876, 10.121752, 0.5], - ] - - df = pd.DataFrame(data, columns=columns) - df["timestamp"] = pd.to_datetime(df["timestamp"]) - p, n = df.pcr_positivity_rate, df.pcr_tests_total - df["se"] = np.sqrt(p * (1 - p) / n) - - return df - -@pytest.fixture -def CAN_hhs_testing_data(): - columns = ["fips", "timestamp", "pcr_tests_positive", "pcr_tests_total", "pcr_positivity_rate"] - data = [ - ["3", "2021-01-01", 10, 40, 0.25], - ["4", "2021-01-01", 20, 50, 0.4], - ] - - df = pd.DataFrame(data, columns=columns) - df["timestamp"] = pd.to_datetime(df["timestamp"]) - p, n = df.pcr_positivity_rate, df.pcr_tests_total - df["se"] = np.sqrt(p * (1 - p) / n) - - return df - -@pytest.fixture -def CAN_nation_testing_data(): - columns = ["fips", "timestamp", "pcr_tests_positive", "pcr_tests_total", "pcr_positivity_rate"] - data = [ - ["us", "2021-01-01", 30, 90, 30 / 90], - ] - - df = pd.DataFrame(data, columns=columns) - df["timestamp"] = pd.to_datetime(df["timestamp"]) - p, n = df.pcr_positivity_rate, df.pcr_tests_total - df["se"] = np.sqrt(p * (1 - p) / n) - - return df diff --git a/covid_act_now/tests/receiving/.gitignore b/covid_act_now/tests/receiving/.gitignore deleted file mode 100644 index afed0735d..000000000 --- a/covid_act_now/tests/receiving/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.csv diff --git a/covid_act_now/tests/test_data/small_CAN_data.parquet b/covid_act_now/tests/test_data/small_CAN_data.parquet deleted file mode 100644 index d58e0b46d..000000000 Binary files a/covid_act_now/tests/test_data/small_CAN_data.parquet and /dev/null differ diff --git a/covid_act_now/tests/test_geo.py b/covid_act_now/tests/test_geo.py deleted file mode 100644 index 0707b1642..000000000 --- a/covid_act_now/tests/test_geo.py +++ /dev/null @@ -1,116 +0,0 @@ - -import numpy as np -import pandas as pd -import pytest - -from delphi_covid_act_now.geo import ( - positivity_rate, - std_err, - geo_map -) - -class TestAggregationFunctions: - def test_pos_rate(self): - df = pd.DataFrame({ - "pcr_tests_positive": [0, 1, 2, 3, 4, 5], - "sample_size": [2, 2, 5, 10, 20, 50] - }) - - # The 0 sample_size case is expected to return 0 following the CDC's convention - expected_pos_rate = [0, 0.5, 0.4, 0.3, 0.2, 0.1] - pos_rate = positivity_rate(df) - - assert np.allclose(pos_rate, expected_pos_rate) - - def test_std_err(self): - df = pd.DataFrame({ - "val": [0, 0.5, 0.4, 0.3, 0.2, 0.1], - "sample_size": [2, 2, 5, 10, 20, 50] - }) - - expected_se = np.sqrt(df.val * (1 - df.val) / df.sample_size) - se = std_err(df) - - # 0 se is permitted in this indicator, since applying the Jeffreys prior would violate the mirror - assert (se >= 0).all() - assert not np.isnan(se).any() - assert not np.isinf(se).any() - assert np.allclose(se, expected_se, equal_nan=True) - -class TestGeoMap: - def test_incorrect_geo(self, CAN_county_testing_data): - df_county = CAN_county_testing_data - - with pytest.raises(ValueError): - geo_map(df_county, "INVALID_GEO_RES") - - def test_incorrect_total(self): - columns = ["fips", "timestamp", "pcr_tests_positive", "pcr_tests_total", "pcr_positivity_rate"] - df_county = pd.DataFrame([ - ["01001", "2021-01-01", 20, 10, 2.0] - ], columns=columns) - - with pytest.raises(ValueError): - geo_map(df_county, "county") - - def test_zero_sample_size(self): - columns = ["fips", "timestamp", "pcr_tests_positive", "pcr_tests_total", "pcr_positivity_rate"] - df_county = pd.DataFrame([ - ["01001", "2021-01-01", 0, 0, 0] - ], columns=columns) - - with pytest.raises(ValueError): - geo_map(df_county, "county") - - def test_county(self, CAN_county_testing_data): - df_county = CAN_county_testing_data - df_new = geo_map(df_county, "county") - - assert np.allclose(df_new["val"], df_county["pcr_positivity_rate"]) - assert np.allclose(df_new["sample_size"], df_county["pcr_tests_total"]) - assert np.allclose(df_new["se"], df_county["se"], equal_nan=True) - - def test_state(self, CAN_county_testing_data, CAN_state_testing_data): - df_county = CAN_county_testing_data - df_state = CAN_state_testing_data - df_new = geo_map(df_county, "state") - - assert np.allclose(df_new["val"], df_state["pcr_positivity_rate"]) - assert np.allclose(df_new["sample_size"], df_state["pcr_tests_total"]) - assert np.allclose(df_new["se"], df_state["se"], equal_nan=True) - - def test_msa(self, CAN_county_testing_data, CAN_msa_testing_data): - df_county = CAN_county_testing_data - df_msa = CAN_msa_testing_data - df_new = geo_map(df_county, "msa") - - assert np.allclose(df_new["val"], df_msa["pcr_positivity_rate"]) - assert np.allclose(df_new["sample_size"], df_msa["pcr_tests_total"]) - assert np.allclose(df_new["se"], df_msa["se"], equal_nan=True) - - def test_hrr(self, CAN_county_testing_data, CAN_hrr_testing_data): - df_county = CAN_county_testing_data - df_hrr = CAN_hrr_testing_data - df_new = geo_map(df_county, "hrr") - - assert np.allclose(df_new["val"], df_hrr["pcr_positivity_rate"]) - assert np.allclose(df_new["sample_size"], df_hrr["pcr_tests_total"]) - assert np.allclose(df_new["se"], df_hrr["se"], equal_nan=True) - - def test_hhs(self, CAN_county_testing_data, CAN_hhs_testing_data): - df_county = CAN_county_testing_data - df_hhs = CAN_hhs_testing_data - df_new = geo_map(df_county, "hhs") - - assert np.allclose(df_new["val"], df_hhs["pcr_positivity_rate"]) - assert np.allclose(df_new["sample_size"], df_hhs["pcr_tests_total"]) - assert np.allclose(df_new["se"], df_hhs["se"], equal_nan=True) - - def test_nation(self, CAN_county_testing_data, CAN_nation_testing_data): - df_county = CAN_county_testing_data - df_nation = CAN_nation_testing_data - df_new = geo_map(df_county, "nation") - - assert np.allclose(df_new["val"], df_nation["pcr_positivity_rate"]) - assert np.allclose(df_new["sample_size"], df_nation["pcr_tests_total"]) - assert np.allclose(df_new["se"], df_nation["se"], equal_nan=True) diff --git a/covid_act_now/tests/test_pull.py b/covid_act_now/tests/test_pull.py deleted file mode 100644 index 96593005d..000000000 --- a/covid_act_now/tests/test_pull.py +++ /dev/null @@ -1,62 +0,0 @@ -import numpy as np -import pandas as pd -import pytest - -from delphi_covid_act_now.pull import ( - load_data, - extract_testing_metrics -) - -class TestPull: - def test_load_data(self, CAN_parquet_data, tmp_path): - path = tmp_path / "small_CAN_data.parquet" - CAN_parquet_data.to_parquet(path) - - df_pq = load_data(path) - - impt_cols = set([ - "fips", "timestamp", - "age", "ethnicity", "sex", - "location_type", "provider", "variable_name" - ]) - - assert impt_cols <= set(df_pq.columns) - - def test_zero_sample_size(self): - columns = ["provider", "timestamp", "location_id", "fips", "location_type", "variable_name", - "measurement", "unit", "age", "race", "ethnicity", "sex", "last_updated", "value"] - df_pq = pd.DataFrame([ - # Should become a zero sample_size row - ["cdc", "2021-01-01", "iso1:us#iso2:us-al#fips:01001", 1001, "county", "pcr_tests_positive", - "rolling_average_7_day", "percentage", "all", "all", "all", "all", "2021-01-02 19:00:00", 0.0], - ["cdc", "2021-01-01", "iso1:us#iso2:us-al#fips:01001", 1001, "county", "pcr_tests_total", - "rolling_average_7_day", "specimens", "all", "all", "all", "all", "2021-01-02 19:00:00", 0.0], - - # A non-zero sample_size row - ["cdc", "2021-01-01", "iso1:us#iso2:us-pa#fips:42001", 42001, "county", "pcr_tests_positive", - "rolling_average_7_day", "percentage", "all", "all", "all", "all", "2021-01-02 19:00:00", 50.0], - ["cdc", "2021-01-01", "iso1:us#iso2:us-pa#fips:42001", 42001, "county", "pcr_tests_total", - "rolling_average_7_day", "specimens", "all", "all", "all", "all", "2021-01-02 19:00:00", 10.0], - ], columns=columns) - - df_tests = extract_testing_metrics(df_pq) - - assert (df_tests.pcr_tests_total > 0).all() - - def test_extract_testing_data(self, CAN_parquet_data, tmp_path): - path = tmp_path / "small_CAN_data.parquet" - CAN_parquet_data.to_parquet(path) - - df_pq = load_data(path) - df_tests = extract_testing_metrics(df_pq) - - impt_cols = set([ - "fips", "timestamp", - "pcr_positivity_rate", "pcr_tests_positive", "pcr_tests_total", - ]) - - assert impt_cols <= set(df_tests.columns) - assert df_tests["pcr_positivity_rate"].between(0, 1).all() - assert np.allclose( - df_tests.pcr_tests_positive, - df_tests.pcr_positivity_rate * df_tests.pcr_tests_total) diff --git a/covid_act_now/tests/test_run.py b/covid_act_now/tests/test_run.py deleted file mode 100644 index 7cec2e1dc..000000000 --- a/covid_act_now/tests/test_run.py +++ /dev/null @@ -1,36 +0,0 @@ -from os import listdir -from os.path import join - -import pandas as pd -import pytest - -from delphi_covid_act_now.constants import GEO_RESOLUTIONS, SIGNALS -from delphi_covid_act_now.run import run_module - -class TestRun: - PARAMS = { - "common": { - "export_dir": "./receiving" - }, - "indicator": { - "parquet_url": "./test_data/small_CAN_data.parquet" - } - } - - def test_output_files(self, clean_receiving_dir): - run_module(self.PARAMS) - csv_files = set(listdir("receiving")) - csv_files.discard(".gitignore") - - expected_files = set() - for signal in SIGNALS: - for geo in GEO_RESOLUTIONS: - expected_files.add(f"20210101_{geo}_{signal}.csv") - - # All output files exist - assert csv_files == expected_files - - # All output files have correct columns - for csv_file in csv_files: - df = pd.read_csv(join("receiving", csv_file)) - assert (df.columns.values == ["geo_id", "val", "se", "sample_size"]).all() diff --git a/doctor_visits/version.cfg b/doctor_visits/version.cfg index f3216a611..5cc332fe2 100644 --- a/doctor_visits/version.cfg +++ b/doctor_visits/version.cfg @@ -1 +1 @@ -current_version = 0.3.28 +current_version = 0.3.29 diff --git a/dsew_community_profile/version.cfg b/dsew_community_profile/version.cfg index f3216a611..5cc332fe2 100644 --- a/dsew_community_profile/version.cfg +++ b/dsew_community_profile/version.cfg @@ -1 +1 @@ -current_version = 0.3.28 +current_version = 0.3.29 diff --git a/google_symptoms/version.cfg b/google_symptoms/version.cfg index f3216a611..5cc332fe2 100644 --- a/google_symptoms/version.cfg +++ b/google_symptoms/version.cfg @@ -1 +1 @@ -current_version = 0.3.28 +current_version = 0.3.29 diff --git a/hhs_hosp/version.cfg b/hhs_hosp/version.cfg index f3216a611..5cc332fe2 100644 --- a/hhs_hosp/version.cfg +++ b/hhs_hosp/version.cfg @@ -1 +1 @@ -current_version = 0.3.28 +current_version = 0.3.29 diff --git a/jenkins/build-and-package.sh b/jenkins/build-and-package.sh index 734044a35..c828b7000 100755 --- a/jenkins/build-and-package.sh +++ b/jenkins/build-and-package.sh @@ -8,6 +8,7 @@ source ~/.bash_profile # Vars local_indicator=$1 +branch=$2 # # Build @@ -30,4 +31,4 @@ pip install ../_delphi_utils_python/. --retries 10 --timeout 20 cd "${WORKSPACE}" || exit # Create .tar.gz for deployment -tar -czvf "${JENKINS_HOME}/artifacts/${local_indicator}.tar.gz" "${local_indicator}" +tar -czvf "${JENKINS_HOME}/artifacts/${branch}_${local_indicator}.tar.gz" "${local_indicator}" \ No newline at end of file diff --git a/jenkins/usafacts-jenkins-build.sh b/jenkins/usafacts-jenkins-build.sh deleted file mode 100755 index c8b508981..000000000 --- a/jenkins/usafacts-jenkins-build.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env bash -# -# JHU: Jenkins build -# - -set -exo pipefail -source ~/.bash_profile - -# -# Build -# - -local_indicator="usafacts" - -cd "${WORKSPACE}/${local_indicator}" || exit - -# Set up venv -python -m venv env -source env/bin/activate -pip install ../_delphi_utils_python/. -pip install . diff --git a/jenkins/usafacts-jenkins-deploy.sh b/jenkins/usafacts-jenkins-deploy.sh deleted file mode 100755 index fe72eb6cd..000000000 --- a/jenkins/usafacts-jenkins-deploy.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash -# -# Jenkins deploy -# - -set -exo pipefail -source ~/.bash_profile - -# -# Deploy -# - -local_indicator="usafacts" - -cd "${WORKSPACE}/ansible" || exit - -# Ansible! -ansible-playbook ansible-deploy.yaml --extra-vars "indicator=${local_indicator}" -i inventory diff --git a/jenkins/usafacts-jenkins-package.sh b/jenkins/usafacts-jenkins-package.sh deleted file mode 100755 index 05aa8fd64..000000000 --- a/jenkins/usafacts-jenkins-package.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash -# -# Jenkins package -# - -set -exo pipefail -source ~/.bash_profile - -# -# Package -# - -local_indicator="usafacts" - -cd "${WORKSPACE}" || exit - -# Create .tar.gz for deployment -tar -czvf "${JENKINS_HOME}/artifacts/${local_indicator}.tar.gz" "${local_indicator}" diff --git a/jenkins/usafacts-jenkins-test.sh b/jenkins/usafacts-jenkins-test.sh deleted file mode 100755 index 4a11c5c71..000000000 --- a/jenkins/usafacts-jenkins-test.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env bash -# -# JHU: Jenkins test -# - -set -exo pipefail -source ~/.bash_profile - -# -# Test -# - -local_indicator="usafacts" - -cd "${WORKSPACE}/${local_indicator}" || exit - -# Linter -#env/bin/pylint delphi_"${local_indicator}" -echo "Skip linting because we have weird breakage :( \ - TODO: https://github.com/cmu-delphi/covidcast-indicators/issues/333" - -# Unit tests and code coverage -cd tests || exit && \ - ../env/bin/pytest --cov=delphi_"${local_indicator}" --cov-report=term-missing diff --git a/jhu/version.cfg b/jhu/version.cfg index f3216a611..5cc332fe2 100644 --- a/jhu/version.cfg +++ b/jhu/version.cfg @@ -1 +1 @@ -current_version = 0.3.28 +current_version = 0.3.29 diff --git a/nchs_mortality/version.cfg b/nchs_mortality/version.cfg index f3216a611..5cc332fe2 100644 --- a/nchs_mortality/version.cfg +++ b/nchs_mortality/version.cfg @@ -1 +1 @@ -current_version = 0.3.28 +current_version = 0.3.29 diff --git a/nowcast/version.cfg b/nowcast/version.cfg index f3216a611..5cc332fe2 100644 --- a/nowcast/version.cfg +++ b/nowcast/version.cfg @@ -1 +1 @@ -current_version = 0.3.28 +current_version = 0.3.29 diff --git a/quidel_covidtest/delphi_quidel_covidtest/backfill.py b/quidel_covidtest/delphi_quidel_covidtest/backfill.py index 7e8482551..1c83622ea 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/backfill.py +++ b/quidel_covidtest/delphi_quidel_covidtest/backfill.py @@ -56,6 +56,17 @@ def store_backfill_file(df, _end_date, backfill_dir): 'num_age_0_17', 'den_age_0_17'] backfilldata = backfilldata.loc[backfilldata["time_value"] >= _start_date, selected_columns] + backfilldata["lag"] = [(_end_date - x).days for x in backfilldata["time_value"]] + backfilldata["time_value"] = backfilldata.time_value.dt.strftime("%Y-%m-%d") + backfilldata["issue_date"] = datetime.strftime(_end_date, "%Y-%m-%d") + + backfilldata = backfilldata.astype({ + "time_value": "string", + "issue_date": "string", + "fips": "string", + "state_id": "string" + }) + path = backfill_dir + \ "/quidel_covidtest_as_of_%s.parquet"%datetime.strftime(_end_date, "%Y%m%d") # Store intermediate file into the backfill folder @@ -108,9 +119,6 @@ def get_date(file_link): pdList = [] for fn in new_files: df = pd.read_parquet(fn, engine='pyarrow') - issue_date = get_date(fn) - df["issue_date"] = issue_date - df["lag"] = [(issue_date - x).days for x in df["time_value"]] pdList.append(df) merged_file = pd.concat(pdList).sort_values(["time_value", "fips"]) path = backfill_dir + "/quidel_covidtest_from_%s_to_%s.parquet"%( diff --git a/quidel_covidtest/tests/test_backfill.py b/quidel_covidtest/tests/test_backfill.py index 7a033fb47..27e0d01bc 100644 --- a/quidel_covidtest/tests/test_backfill.py +++ b/quidel_covidtest/tests/test_backfill.py @@ -49,7 +49,8 @@ def test_store_backfill_file(self): 'num_age_18_49', 'den_age_18_49', 'num_age_50_64', 'den_age_50_64', 'num_age_65plus', 'den_age_65plus', - 'num_age_0_17', 'den_age_0_17'] + 'num_age_0_17', 'den_age_0_17', + 'lag', 'issue_date'] assert set(selected_columns) == set(backfill_df.columns) os.remove(backfill_dir + "/" + fn) @@ -86,9 +87,6 @@ def test_merge_backfill_file(self): if "from" in file: continue df = pd.read_parquet(file, engine='pyarrow') - issue_date = datetime.strptime(file[-16:-8], "%Y%m%d") - df["issue_date"] = issue_date - df["lag"] = [(issue_date - x).days for x in df["time_value"]] pdList.append(df) os.remove(file) new_files = glob.glob(backfill_dir + "/quidel_covidtest*.parquet") diff --git a/quidel_covidtest/version.cfg b/quidel_covidtest/version.cfg index f3216a611..5cc332fe2 100644 --- a/quidel_covidtest/version.cfg +++ b/quidel_covidtest/version.cfg @@ -1 +1 @@ -current_version = 0.3.28 +current_version = 0.3.29 diff --git a/sir_complainsalot/params.json.template b/sir_complainsalot/params.json.template index fb6d0d38a..0b245b137 100644 --- a/sir_complainsalot/params.json.template +++ b/sir_complainsalot/params.json.template @@ -28,11 +28,6 @@ "sum_anosmia_ageusia_smoothed_search" ] }, - "usa-facts": { - "max_age": 5, - "maintainers": ["U01AP8GSWG3","U01069KCRS7"], - "retired-signals": ["confirmed_7dav_cumulative_num", "confirmed_7dav_cumulative_prop", "deaths_7dav_cumulative_num", "deaths_7dav_cumulative_prop"] - }, "jhu-csse": { "max_age": 2, "maintainers": ["U01AP8GSWG3","U01069KCRS7"], diff --git a/sir_complainsalot/version.cfg b/sir_complainsalot/version.cfg index f3216a611..5cc332fe2 100644 --- a/sir_complainsalot/version.cfg +++ b/sir_complainsalot/version.cfg @@ -1 +1 @@ -current_version = 0.3.28 +current_version = 0.3.29 diff --git a/testing_utils/indicator_validation.template.ipynb b/testing_utils/indicator_validation.template.ipynb index aa53241fa..8656a82f9 100644 --- a/testing_utils/indicator_validation.template.ipynb +++ b/testing_utils/indicator_validation.template.ipynb @@ -1,41 +1,15 @@ { - "metadata": { - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.5-final" - }, - "orig_nbformat": 2, - "kernelspec": { - "name": "Python 3.8.5 64-bit ('delphi')", - "display_name": "Python 3.8.5 64-bit ('delphi')", - "metadata": { - "interpreter": { - "hash": "caf87e55c8359f697bd94fe1aac5633662441bd3172cf56261450c8476d2e897" - } - } - } - }, - "nbformat": 4, - "nbformat_minor": 2, "cells": [ { + "cell_type": "markdown", + "metadata": {}, "source": [ "# Indicator Validation\n", "This notebook is aimed at assisting developers with tracking large scale indicator changes beyond what can be picked up by the unit tests. While unit tests perform local sanity checks on the operations, the tests here will be more qualitative in nature, comparing the live version of an indicator with the propagating changes.\n", "\n", "## Usage\n", "Since each indicator will have different points of interest, this notebook will only provide a framework to get started. The goal is to support the comparison of the dataframes resulting from the data cleaning and shaping that our indicator code provides." - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -61,12 +35,12 @@ ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "## Installation\n", "Install the utilities and the indicator you plan to test." - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -84,12 +58,12 @@ ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "## Run the indicator\n", "If you are planning on testing your local receiving directory, you will need to generate those files. You can do that by running the cell below." - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -105,21 +79,21 @@ ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "## Qualitative Comparisons\n" - ], - "cell_type": "markdown", - "metadata": {} + ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "### Loading Data\n", "To load a local indicator and a remote `covidcast` indicator as dataframes for comparison use the function `load_signal_data(local_signal_dir, remote_signal_name, signal_type, start_day, end_day, geo_type)`. \n", "\n", "Separate functions for loading just the local and remote data exist as well. **Note that the local and remote values are cached to disk** to speed up computation and reduce API calls. See function docstring for instructions on clearing the cache." - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -128,7 +102,7 @@ "outputs": [], "source": [ "local_signal_dir = \"jhu\"\n", - "remote_signal_name = \"usa-facts\"\n", + "remote_signal_name = \"usa-facts\" #warning: This indicator has been deprecated\n", "signal_type = \"confirmed_incidence_prop\"\n", "start_day = date(2020, 8, 1)\n", "end_day = date.today()\n", @@ -139,12 +113,12 @@ ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "### Comparing Geocode Signals\n", "A simple plotting demo." - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -154,22 +128,24 @@ }, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "Total difference: -0.18981468089412878\n" ] }, { - "output_type": "display_data", "data": { - "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA54AAAF1CAYAAACAkzWPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAADUOklEQVR4nOzdd3zb9bX/8ddXsiRbw3vGIztkJ5ABlFX2KFBK1+3e4/bS23E7b/nd7r1v2wsddNOWTkqBlr13AtmBJM6ynXgPDVuSJX1/f3y+X1myJWt5JTnPx4OHEkmWvzEO+K1zPudouq4jhBBCCCGEEEJMF8tsX4AQQgghhBBCiJObBE8hhBBCCCGEENNKgqcQQgghhBBCiGklwVMIIYQQQgghxLSS4CmEEEIIIYQQYlpJ8BRCCCGEEEIIMa0keAohhBBCCCGEmFYSPIUQQgghhBBCTCsJnkIIIYQQQgghppUETyGEEGIKaJrWrGnaXzVN69E0rU/TtB9qmrZY07QHjd/3app2q6Zp5bN9rUIIIcRMk+AphBBCFEjTNCtwJ3AEWAA0An8ANOCrwDxgBdAMfG5WLlIIIYSYRZqu67N9DUIIIcQJTdO0s4E7gAZd1yOTPO864LO6rp8+U9cmhBBCzAVFs30BQgghxEmgGTgyPnRqmlYHfB84D/CgOo0GZv7yhBBCiNklrbZCCCFE4dqAFk3Txr+h+xVAB9boul4KvBnVfiuEEEKcUiR4CiGEEIV7FjgOfE3TNJemacWapp2DqnL6gSFN0xqBj8/mRQohhBCzRYKnEEIIUSBd16PANcAS4CjQDrwe+DxwBjAE3AX8dbauUQghhJhNMlxICCGEEEIIIcS0koqnEEIIIYQQQohpJcFTCCGEEEIIIcS0kuAphBBCCCGEEGJaSfAUQgghhBBCCDGtJHgKIYQQQgghhJhW4xddT6vq6mp9wYIFM/kphRBCCCGEEELMkK1bt/bqul4z/v4ZDZ4LFixgy5YtM/kphRBCCCGEEELMEE3TjqS6X1pthRBCCCGEEEJMKwmeQgghhBBCCCGmlQRPIYQQQgghhBDTakbPeAohhBBCCCHEiWJ0dJT29naCweBsX8qcU1xcTFNTEzabLavnS/AUQgghhBBCiBTa29vxeDwsWLAATdNm+3LmDF3X6evro729nYULF2b1MdJqK4QQQgghhBApBINBqqqqJHSOo2kaVVVVOVWCJXgKIYQQQgghRBoSOlPL9esiwVMIIYQQQgghTmEPP/wwTz755LR+DgmeQgghhBBCCHEC0HWdWCw25a8rwVMIIYQQQgghTmGHDx/mtNNO461vfSurV6/mi1/8Ips2bWLt2rV89rOfjT9n+fLlvP3tb2fZsmW86U1v4v777+ecc85h6dKlPPvsswD09/dz3XXXsXbtWs466yx27NjB4cOHufnmm/nud7/L+vXreeyxx+jp6eHVr341mzZtYtOmTTzxxBMF/zlkqq0QQgghhBBCZPD5f+xmzzHvlL7mynmlfPaaVRmft3//fn71q1/h9Xr585//zLPPPouu61x77bU8+uijtLS0cODAAf70pz/x85//nE2bNvG73/2Oxx9/nDvuuIOvfOUr3H777Xz2s5/l9NNP5/bbb+fBBx/krW99K9u2beP9738/brebj33sYwC88Y1v5CMf+QjnnnsuR48e5fLLL2fv3r0F/VkleAqRi56XoHoZyCFzIYQQQggxQ+bPn89ZZ53Fxz72Me69915OP/10APx+P/v376elpYWFCxeyZs0aAFatWsXFF1+MpmmsWbOGw4cPA/D444/zl7/8BYCLLrqIvr4+vN6JYfr+++9nz5498d97vV78fj9utzvvP4METyGy1XsAfrQZ3vp3WPTy2b4aIYQQQggxg7KpTE4Xl8sFqDOen/70p3nf+96X9Pjhw4dxOBzx31sslvjvLRYLkUgkp88Xi8V4+umnKS4uLvDKx8gZTyGy5Tuubv3ds3sdQgghhBDilHT55Zfz85//HL/fD0BHRwfd3dn/bHreeedx6623AmqgUHV1NaWlpXg8Hnw+X/x5l112GT/4wQ/iv9+2bVvB1y7BU4hshYw2hLB/dq9DCCGEEEKcki677DLe+MY3cvbZZ7NmzRpe85rXJAXGTD73uc+xdetW1q5dy6c+9Sl+9atfAXDNNdfwt7/9LT5c6H//93/ZsmULa9euZeXKldx8880FX7um63rBL5KtjRs36lu2bJmxzyfElNr+B/jb++CyL8HLPjjbVyOEEEIIIabZ3r17WbFixWxfxpyV6uujadpWXdc3jn+uVDyFyFbIeDcpHJjd6xBCCCGEEOIEI8FTiGwFh9SttNoKIYQQQgiREwmeQmRLKp5CCCGEEELkRYKnENmS4CmEEEIIIURe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", "image/svg+xml": "\n\n\n\n \n \n \n \n 2020-10-18T15:40:09.231808\n image/svg+xml\n \n \n Matplotlib v3.3.2, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA54AAAF1CAYAAACAkzWPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAADUOklEQVR4nOzdd3zb9bX/8ddXsiRbw3vGIztkJ5ABlFX2KFBK1+3e4/bS23E7b/nd7r1v2wsddNOWTkqBlr13AtmBJM6ynXgPDVuSJX1/f3y+X1myJWt5JTnPx4OHEkmWvzEO+K1zPudouq4jhBBCCCGEEEJMF8tsX4AQQgghhBBCiJObBE8hhBBCCCGEENNKgqcQQgghhBBCiGklwVMIIYQQQgghxLSS4CmEEEIIIYQQYlpJ8BRCCCGEEEIIMa0keAohhBBCCCGEmFYSPIUQQgghhBBCTCsJnkIIIYQQQgghppUETyGEEGIKaJrWrGnaXzVN69E0rU/TtB9qmrZY07QHjd/3app2q6Zp5bN9rUIIIcRMk+AphBBCFEjTNCtwJ3AEWAA0An8ANOCrwDxgBdAMfG5WLlIIIYSYRZqu67N9DUIIIcQJTdO0s4E7gAZd1yOTPO864LO6rp8+U9cmhBBCzAVFs30BQgghxEmgGTgyPnRqmlYHfB84D/CgOo0GZv7yhBBCiNklrbZCCCFE4dqAFk3Txr+h+xVAB9boul4KvBnVfiuEEEKcUiR4CiGEEIV7FjgOfE3TNJemacWapp2DqnL6gSFN0xqBj8/mRQohhBCzRYKnEEIIUSBd16PANcAS4CjQDrwe+DxwBjAE3AX8dbauUQghhJhNMlxICCGEEEIIIcS0koqnEEIIIYQQQohpJcFTCCGEEEIIIcS0kuAphBBCCCGEEGJaSfAUQgghhBBCCDGtJHgKIYQQQgghhJhW4xddT6vq6mp9wYIFM/kphRBCCCGEEELMkK1bt/bqul4z/v4ZDZ4LFixgy5YtM/kphRBCCCGEEELMEE3TjqS6X1pthRBCCCGEEEJMKwmeQgghhBBCCCGmlQRPIYQQQgghhBDTakbPeAohhBBCCCHEiWJ0dJT29naCweBsX8qcU1xcTFNTEzabLavnS/AUQgghhBBCiBTa29vxeDwsWLAATdNm+3LmDF3X6evro729nYULF2b1MdJqK4QQQgghhBApBINBqqqqJHSOo2kaVVVVOVWCJXgKIYQQQgghRBoSOlPL9esiwVMIIYQQQgghTmEPP/wwTz755LR+DgmeQgghhBBCCHEC0HWdWCw25a8rwVMIIYQQQgghTmGHDx/mtNNO461vfSurV6/mi1/8Ips2bWLt2rV89rOfjT9n+fLlvP3tb2fZsmW86U1v4v777+ecc85h6dKlPPvsswD09/dz3XXXsXbtWs466yx27NjB4cOHufnmm/nud7/L+vXreeyxx+jp6eHVr341mzZtYtOmTTzxxBMF/zlkqq0QQgghhBBCZPD5f+xmzzHvlL7mynmlfPaaVRmft3//fn71q1/h9Xr585//zLPPPouu61x77bU8+uijtLS0cODAAf70pz/x85//nE2bNvG73/2Oxx9/nDvuuIOvfOUr3H777Xz2s5/l9NNP5/bbb+fBBx/krW99K9u2beP9738/brebj33sYwC88Y1v5CMf+QjnnnsuR48e5fLLL2fv3r0F/VkleAqRi56XoHoZyCFzIYQQQggxQ+bPn89ZZ53Fxz72Me69915OP/10APx+P/v376elpYWFCxeyZs0aAFatWsXFF1+MpmmsWbOGw4cPA/D444/zl7/8BYCLLrqIvr4+vN6JYfr+++9nz5498d97vV78fj9utzvvP4METyGy1XsAfrQZ3vp3WPTy2b4aIYQQQggxg7KpTE4Xl8sFqDOen/70p3nf+96X9Pjhw4dxOBzx31sslvjvLRYLkUgkp88Xi8V4+umnKS4uLvDKx8gZTyGy5Tuubv3ds3sdQgghhBDilHT55Zfz85//HL/fD0BHRwfd3dn/bHreeedx6623AmqgUHV1NaWlpXg8Hnw+X/x5l112GT/4wQ/iv9+2bVvB1y7BU4hshYw2hLB/dq9DCCGEEEKcki677DLe+MY3cvbZZ7NmzRpe85rXJAXGTD73uc+xdetW1q5dy6c+9Sl+9atfAXDNNdfwt7/9LT5c6H//93/ZsmULa9euZeXKldx8880FX7um63rBL5KtjRs36lu2bJmxzyfElNr+B/jb++CyL8HLPjjbVyOEEEIIIabZ3r17WbFixWxfxpyV6uujadpWXdc3jn+uVDyFyFbIeDcpHJjd6xBCCCGEEOIEI8FTiGwFh9SttNoKIYQQQgiREwmeQmRLKp5CCCGEEELkRYKnENmS4CmEEEIIIURe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\n" + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" - } + }, + "output_type": "display_data" } ], "source": [ @@ -185,12 +161,12 @@ ] }, { + "cell_type": "markdown", + "metadata": {}, "source": [ "## Automatically Detecting Outliers\n", "Defining your own comparison statistics, we can automatically plot outlier signals." - ], - "cell_type": "markdown", - "metadata": {} + ] }, { "cell_type": "code", @@ -198,15 +174,17 @@ "metadata": {}, "outputs": [ { - "output_type": "display_data", "data": { - "text/plain": "
", + "image/png": "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", "image/svg+xml": "\n\n\n\n \n \n \n \n 2020-10-18T15:53:15.961372\n image/svg+xml\n \n \n Matplotlib v3.3.2, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", - "image/png": "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\n" + "text/plain": [ + "
" + ] }, "metadata": { "needs_background": "light" - } + }, + "output_type": "display_data" } ], "source": [ @@ -238,5 +216,32 @@ "plot_outliers(ld, rd, simple_outlier_test)" ] } - ] -} \ No newline at end of file + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6 (default, Oct 18 2022, 12:41:40) \n[Clang 14.0.0 (clang-1400.0.29.202)]" + }, + "orig_nbformat": 2, + "vscode": { + "interpreter": { + "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/usafacts/.gitignore b/usafacts/.gitignore deleted file mode 100644 index 53dcaac42..000000000 --- a/usafacts/.gitignore +++ /dev/null @@ -1,124 +0,0 @@ -# You should hard commit a prototype for this file, but we -# want to avoid accidental adding of API tokens and other -# private data parameters -params.json - -# Do not commit output files -receiving/*.csv -receiving\ copy/*.csv - -# Do not commit test files -tests/receiving/*.csv - -# Remove macOS files -.DS_Store - -# virtual environment -dview/ - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -coverage.xml -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -.static_storage/ -.media/ -local_settings.py - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# pyenv -.python-version - -# celery beat schedule file -celerybeat-schedule - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ diff --git a/usafacts/.pylintrc b/usafacts/.pylintrc deleted file mode 100644 index f30837c7e..000000000 --- a/usafacts/.pylintrc +++ /dev/null @@ -1,22 +0,0 @@ - -[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/usafacts/DETAILS.md b/usafacts/DETAILS.md deleted file mode 100644 index 3a6aedb03..000000000 --- a/usafacts/DETAILS.md +++ /dev/null @@ -1,126 +0,0 @@ -# USA Facts Cases and Deaths - -We import the confirmed case and deaths data from USA Facts website and export -the county-level data as-is. We also aggregate the data to the MSA, HRR, HHS, -State, and Nation levels. - -In order to avoid confusing public consumers of the data, we maintain -consistency how USA Facts reports the data, please refer to [Exceptions](#Exceptions). - -## Geographical Levels (`geo`) -* `county`: reported using zero-padded FIPS codes. There are some exceptions - that lead to inconsistency with the other COVIDcast data (but are necessary - for internal consistency), noted below. -* `msa`: reported using cbsa (consistent with all other COVIDcast sensors) -* `hrr`: reported using HRR number (consistent with all other COVIDcast sensors) -* `hhs`: reported using HHS region number -* `state`: reported using two-letter postal code -* `nation`: reported using two-letter nation code. Just 'us' for now - -## Metrics, Level 1 (`m1`) -* `confirmed`: Confirmed cases -* `deaths` - -Recoveries are _not_ reported. - -## Metrics, Level 2 (`m2`) -* `new_counts`: number of new {confirmed cases, deaths} on a given day -* `cumulative_counts`: total number of {confirmed cases, deaths} up until the - first day of data (January 22nd) -* `incidence`: `new_counts` / population * 100000 - -All three `m2` are ultimately derived from `cumulative_counts`, which is first -available on January 22nd. In constructing `new_counts`, we take the first -discrete difference of `cumulative_counts`, and assume that the -`cumulative_counts` for January 21st is uniformly zero. This should not be a -problem, because there there is only one county with a nonzero -`cumulative_count` on January 22nd, with a value of 1. - -For deriving `incidence`, we use the estimated 2019 county population values -from the US Census Bureau. https://www.census.gov/data/tables/time-series/demo/popest/2010s-counties-total.html - -## Exceptions - -At the County (FIPS) level, we report the data _exactly_ as USA Facts reports their -data, to prevent confusing public consumers of the data. -The visualization and modeling teams should take note of these exceptions. - -### New York City - -New York City comprises of five boroughs: - -|Borough Name |County Name |FIPS Code | -|-------------------|-------------------|---------------| -|Manhattan |New York County |36061 | -|The Bronx |Bronx County |36005 | -|Brooklyn |Kings County |36047 | -|Queens |Queens County |36081 | -|Staten Island |Richmond County |36085 | - -**New York City Unallocated cases/deaths are reported by USA Facts independently.** We split them evenly among the five NYC FIPS, which results in float numbers. - -All NYC counts are mapped to the MSA with CBSA ID 35620, which encompasses -all five boroughs. All NYC counts are mapped to HRR 303, which intersects -all five boroughs (297 also intersects the Bronx, 301 also intersects -Brooklyn and Queens, but absent additional information, We are leaving all -counts in 303). - - -### Mismatched FIPS Codes - -There are two FIPS codes that were changed in 2015, leading to -mismatch between us and USA Facts. We report the data using the FIPS code used -by USA Facts, again to promote consistency and avoid confusion by external users -of the dataset. For the mapping to MSA, HRR, these two counties are -included properly. - -|County Name |State |"Our" FIPS |USA Facts FIPS | -|-------------------|---------------|-------------------|---------------| -|Oglala Lakota |South Dakota |46113 |46102 | -|Kusilvak |Alaska |02270 |02158 \& 02270 | - -Documentation for the changes made by the US Census Bureau in 2015: -https://www.census.gov/programs-surveys/geography/technical-documentation/county-changes.html - -Besides, Wade Hampton Census Area and Kusilvak Census Area are reported by USA Facts with FIPS 02270 and 02158 respectively, though there is always 0 cases/deaths reported for Wade Hampton Census Area (02270). According to US Census Bureau, Wade Hampton Census Area has changed name and code from Wade Hampton Census Area, Alaska (02270) to Kusilvak Census Area, Alaska (02158) effective July 1, 2015. -https://www.census.gov/quickfacts/kusilvakcensusareaalaska - -### Grand Princess Cruise Ship -Data from Grand Princess Cruise Ship is given its own dedicated line, with FIPS code 6000. We just ignore these cases/deaths. - - - - -## Negative incidence - -Negative incidence is possible because figures are sometimes revised -downwards, e.g., when a public health authority moves cases from County X -to County Y, County X may have negative incidence. - -## Non-integral counts - -Because the MSA and HRR numbers are computed by taking population-weighted -averages, the count data at those geographical levels may be non-integral. - -## Counties not in our canonical dataset - -Some FIPS codes do not appear as the primary FIPS for any ZIP code in our -canonical `02_20_uszips.csv`; they appear in the `county` exported files, but -for the MSA/HRR mapping, we disburse them equally to the counties with whom -they appear as a secondary FIPS code. The identification of such "secondary" -FIPS codes are documented in `notebooks/create-mappings.ipynb`. The full list -of `secondary, [mapped]` is: - -``` -SECONDARY_FIPS = [ # generated by notebooks/create-mappings.ipynb - ('51620', ['51093', '51175']), - ('51685', ['51153']), - ('28039', ['28059', '28041', '28131', '28045', '28059', '28109', - '28047']), - ('51690', ['51089', '51067']), - ('51595', ['51081', '51025', '51175', '51183']), - ('51600', ['51059', '51059', '51059']), - ('51580', ['51005']), - ('51678', ['51163']), - ] -``` diff --git a/usafacts/Makefile b/usafacts/Makefile deleted file mode 100644 index bc88f1fec..000000000 --- a/usafacts/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -.PHONY = venv, lint, test, clean - -dir = $(shell find ./delphi_* -name __init__.py | grep -o 'delphi_[_[:alnum:]]*' | head -1) -venv: - python3.8 -m venv env - -install: venv - . env/bin/activate; \ - pip install wheel ; \ - pip install -e ../_delphi_utils_python ;\ - pip install -e . - -install-ci: venv - . env/bin/activate; \ - pip install wheel ; \ - pip install ../_delphi_utils_python ;\ - pip install . - -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/usafacts/README.md b/usafacts/README.md deleted file mode 100644 index a2e30c46d..000000000 --- a/usafacts/README.md +++ /dev/null @@ -1,65 +0,0 @@ -# USA Facts Cases and Deaths - -We import the confirmed case and deaths data from USA Facts website and export -the county-level data as-is. We also aggregate the data to the MSA, HRR, HHS, -State, and Nation levels. For detailed information see the files `DETAILS.md` contained -in this directory. - -## 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_usafacts -``` - -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 .py --cov=delphi_usafacts --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/usafacts/REVIEW.md b/usafacts/REVIEW.md deleted file mode 100644 index 93a5a6579..000000000 --- a/usafacts/REVIEW.md +++ /dev/null @@ -1,39 +0,0 @@ -## 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 use 4 spaces for indentation; other style decisions are -flexible, but be consistent within a module -- [ ] 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 -- [ ] pylint with the default `.pylint` settings run over the module produces -minimal warnings; warnings that do exist have been confirmed as false positives -- [ ] 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 diff --git a/usafacts/cache/.gitignore b/usafacts/cache/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/usafacts/delphi_usafacts/__init__.py b/usafacts/delphi_usafacts/__init__.py deleted file mode 100644 index 65b806d9f..000000000 --- a/usafacts/delphi_usafacts/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -"""Module to pull and clean indicators from the USAFacts 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 geo -from . import pull -from . import run diff --git a/usafacts/delphi_usafacts/__main__.py b/usafacts/delphi_usafacts/__main__.py deleted file mode 100644 index 32fc0eecc..000000000 --- a/usafacts/delphi_usafacts/__main__.py +++ /dev/null @@ -1,12 +0,0 @@ -# -*- 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/usafacts/delphi_usafacts/geo.py b/usafacts/delphi_usafacts/geo.py deleted file mode 100644 index 59adcdeb4..000000000 --- a/usafacts/delphi_usafacts/geo.py +++ /dev/null @@ -1,131 +0,0 @@ -# -*- coding: utf-8 -*- -"""Functions for converting geocodes.""" -import pandas as pd - -from delphi_utils import GeoMapper - -INCIDENCE_BASE = 100000 - -SECONDARY_FIPS = [ - ("51620", ["51093", "51175"]), - ("51685", ["51153"]), - ("28039", ["28059", "28041", "28131", "28045", "28059", "28109", "28047"]), - ("51690", ["51089", "51067"]), - ("51595", ["51081", "51025", "51175", "51183"]), - ("51600", ["51059", "51059", "51059"]), - ("51580", ["51005"]), - ("51678", ["51163"]), -] -NYC_FIPS = [ - ("00001", ["36061", "36005", "36047", "36081", "36085"]) -] -REPLACE_FIPS = [ - ("02158", "02270"), - ("46102", "46113"), -] - - -# Valid geographical resolutions output by this indicator. -VALID_GEO_RES = ("county", "state", "msa", "hrr", "hhs", "nation") -# Sensors that report proportions. For geo resolutions with unallocated cases -# or deaths, we avoid reporting these sensors. -PROP_SENSORS = ("incidence", "cumulative_prop") - - -def disburse(df: pd.DataFrame, pooled_fips: str, fips_list: list): - """Disburse counts from POOLED_FIPS equally to the counties in FIPS_LIST. - - Parameters - ---------- - df: pd.DataFrame - Columns: fips, timestamp, new_counts, cumulative_counts, ... - pooled_fips: str - FIPS of county from which to disburse counts - fips_list: list[str] - FIPS of counties to which to disburse counts. - - Results - ------- - pd.DataFrame - Dataframe with same schema as df, with the counts disbursed. - """ - cols = ["new_counts", "cumulative_counts"] - df = df.copy().sort_values(["fips", "timestamp"]) - for col in cols: - # Get values from the aggregated county: - vals = df.loc[df["fips"] == pooled_fips, col].values / len(fips_list) - if len(vals) > 0: - for fips in fips_list: - df.loc[df["fips"] == fips, col] += vals - return df - - -def geo_map(df: pd.DataFrame, geo_res: str, sensor: str): - """ - Map a DataFrame with county level data and aggregate it to the geographic resolution geo_res. - - Parameters - ---------- - df: pd.DataFrame - Columns: fips, timestamp, new_counts, cumulative_counts, population ... - geo_res: str - Geographic resolution to which to aggregate. Valid options: - ("county", "state", "msa", "hrr", "hhs", "nation"). - sensor: str - sensor type. Valid options: - ("new_counts", "cumulative_counts", - "incidence", "cumulative_prop") - - Returns - ------- - pd.DataFrame - Columns: geo_id, timestamp, ... - """ - if geo_res not in VALID_GEO_RES: - raise ValueError(f"geo_res must be one of {VALID_GEO_RES}") - - # State-level records unassigned to specific counties are coded as fake - # counties with fips XX000. - unassigned_counties = df[df["fips"].str.endswith("000")].copy() - df = df[~df["fips"].str.endswith("000")].copy() - # Disburse unallocated cases/deaths in NYC to NYC counties - df = disburse(df, NYC_FIPS[0][0], NYC_FIPS[0][1]) - df = df[df["fips"] != NYC_FIPS[0][0]] - gmpr = GeoMapper() - # The FIPS code 00001 is a dummy for unallocated NYC data. It doesn't have - # a corresponding population entry in the GeoMapper so it will be dropped - # in the call to `add_population_column()`. We pull it out here to - # reinsert it after the population data is added. - nyc_dummy_row = df[df["fips"] == "00001"] - - # Merge in population LOWERCASE, consistent across confirmed and deaths - # Population for unassigned cases/deaths is NAN - df = gmpr.add_population_column(df, "fips") - df = df.append(nyc_dummy_row, ignore_index=True) if not nyc_dummy_row.empty else df - if geo_res == "county": - if sensor not in PROP_SENSORS: - # It is not clear how to calculate the proportion for unallocated - # cases/deaths, so we exclude them for those sensors. - df = df.append(unassigned_counties) if not unassigned_counties.empty else df - df.rename({"fips": "geo_id"}, inplace=True, axis=1) - elif geo_res in ("state", "hhs", "nation"): - state_geo = "state_id" if geo_res == "state" else geo_res - df = df.append(unassigned_counties) if not unassigned_counties.empty else df - df = gmpr.replace_geocode(df, "fips", state_geo, new_col="geo_id") - else: - # Map "missing" secondary FIPS to those that are in our canonical set - for fips, fips_list in SECONDARY_FIPS: - df = disburse(df, fips, fips_list) - for usafacts_fips, our_fips in REPLACE_FIPS: - df.loc[df["fips"] == usafacts_fips, "fips"] = our_fips - merged = gmpr.replace_geocode(df, "fips", geo_res, new_col="geo_id") - if "weight" not in merged.columns: - merged["weight"] = 1 - merged["cumulative_counts"] = merged["cumulative_counts"] * merged["weight"] - merged["new_counts"] = merged["new_counts"] * merged["weight"] - merged["population"] = merged["population"] * merged["weight"] - df = merged.drop(["weight"], axis=1) - df = df.groupby(["geo_id", "timestamp"]).sum().reset_index() - df["incidence"] = df["new_counts"] / df["population"] * INCIDENCE_BASE - df["cumulative_prop"] = df["cumulative_counts"] / df["population"] * INCIDENCE_BASE - return df diff --git a/usafacts/delphi_usafacts/pull.py b/usafacts/delphi_usafacts/pull.py deleted file mode 100644 index 0c2717baa..000000000 --- a/usafacts/delphi_usafacts/pull.py +++ /dev/null @@ -1,177 +0,0 @@ -# -*- coding: utf-8 -*- -"""Functions for pulling data from the USAFacts website.""" -from datetime import date -import hashlib -from logging import Logger -import os - -import numpy as np -import pandas as pd -import requests - -# Columns to drop the the data frame. -DROP_COLUMNS = [ - "countyfips", - "county name", - "state", - "statefips" -] - -def fetch(url: str, cache: str) -> pd.DataFrame: - """Handle network I/O for fetching raw input data file. - - This is necessary because for some reason pd.read_csv is generating - 403:Forbidden on the new URLs. - """ - r = requests.get(url) - r.raise_for_status() - datestamp = date.today().strftime('%Y%m%d') - name = url.split('/')[-1].replace('.csv','') - os.makedirs(cache, exist_ok=True) - filename = os.path.join(cache, f"{datestamp}_{name}.csv") - with open(filename, "w") as f: - f.write(r.text) - return pd.read_csv(filename) - - -def pull_usafacts_data(base_url: str, metric: str, logger: Logger, cache: str=None) -> pd.DataFrame: - """Pull the latest USA Facts data, and conform it into a dataset. - - The output dataset has: - - - Each row corresponds to (County, Date), denoted (FIPS, timestamp) - - Each row additionally has a column `new_counts` corresponding to the new - new_counts (either `confirmed` cases or `deaths`), and a column - `cumulative_counts`, correspond to the aggregate metric from January 22nd - (as of April 27th) until the latest date. - - Note that the raw dataset gives the `cumulative_counts` metric, from which - we compute `new_counts` by taking first differences. Hence, `new_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: - - # - 6000: Grand Princess Cruise Ship - # - 2270: Wade Hampton Census Area in AK, but no cases/deaths were assigned - # - 0: statewise unallocated - # - 1: New York City Unallocated/Probable (only exists for NYC) - - PS: No information for PR - Parameters - ---------- - base_url: str - Base URL for pulling the USA Facts data - metric: str - One of 'confirmed' or 'deaths'. The keys of base_url. - logger: Logger - cache: str - Directory where downloaded csvs should be stashed. - - Returns - ------- - pd.DataFrame - Dataframe as described above. - """ - # Read data - df = fetch(base_url.format(metric=metric), cache) - date_cols = [i for i in df.columns if i.startswith("2")] - logger.info("data retrieved from source", - metric=metric, - num_rows=df.shape[0], - num_cols=df.shape[1], - min_date=min(date_cols), - max_date=max(date_cols), - checksum=hashlib.sha256(pd.util.hash_pandas_object(df).values).hexdigest()) - df.columns = [i.lower() for i in df.columns] - # Clean commas in count fields in case the input file included them - df[df.columns[4:]] = df[df.columns[4:]].applymap( - lambda x: int(x.replace(",", "")) if isinstance(x, str) else x) - # Check missing FIPS - null_mask = pd.isnull(df["countyfips"]) - assert null_mask.sum() == 0 - - unexpected_columns = [x for x in df.columns if "Unnamed" in x] - unexpected_columns.extend(DROP_COLUMNS) - - # Assign Grand Princess Cruise Ship a special FIPS 90000 - # df.loc[df["FIPS"] == 6000, "FIPS"] = 90000 - # df.loc[df["FIPS"] == 6000, "stateFIPS"] = 90 - - # Ignore Grand Princess Cruise Ship and Wade Hampton Census Area in AK - df = df[ - (df["countyfips"] != 6000) - & (df["countyfips"] != 2270) - ] - - # Change FIPS from 0 to XX000 for statewise unallocated cases/deaths - unassigned_index = (df["countyfips"] == 0) - df.loc[unassigned_index, "countyfips"] = df["statefips"].loc[unassigned_index].values * 1000 - - # Conform FIPS - df["fips"] = df["countyfips"].apply(lambda x: f"{int(x):05d}") - - - - # 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 - # Check that columns are either FIPS or dates - try: - columns = list(df.columns) - columns.remove("fips") - # Detects whether there is a non-date string column -- not perfect - # USAFacts has used both / and -, so account for both cases. - _ = [int(x.replace("/", "").replace("-", "")) for x in columns] - except ValueError as e: - raise ValueError( - "Detected unexpected column(s) " - "after dropping DROP_COLUMNS. The dataset " - "schema may have changed. Please investigate and " - "amend DROP_COLUMNS." - ) from e - # Reshape dataframe - df = df.melt( - id_vars=["fips"], - var_name="timestamp", - value_name="cumulative_counts", - ) - # timestamp: str -> datetime - df["timestamp"] = pd.to_datetime(df["timestamp"]) - # Add a dummy first row here on day before first day - min_ts = min(df["timestamp"]) - df_dummy = df.loc[df["timestamp"] == min_ts].copy() - df_dummy.loc[:, "timestamp"] = min_ts - pd.Timedelta(days=1) - df_dummy.loc[:, "cumulative_counts"] = 0 - df = pd.concat([df_dummy, df]) - # Obtain new_counts - df.sort_values(["fips", "timestamp"], inplace=True) - df["new_counts"] = df["cumulative_counts"].diff() # 1st discrete difference - # Handle edge cases where we diffed across fips - mask = df["fips"] != df["fips"].shift(1) - df.loc[mask, "new_counts"] = np.nan - df.reset_index(inplace=True, drop=True) - - # Final sanity checks - days_by_fips = df.groupby("fips").count()["cumulative_counts"].unique() - unique_days = df["timestamp"].unique() - # each FIPS has same number of rows - if (len(days_by_fips) > 1) or (days_by_fips[0] != len(unique_days)): - raise ValueError("Differing number of days by fips") - return df.loc[ - df["timestamp"] >= min_ts, - [ # Reorder - "fips", - "timestamp", - "new_counts", - "cumulative_counts", - ], - ] diff --git a/usafacts/delphi_usafacts/run.py b/usafacts/delphi_usafacts/run.py deleted file mode 100644 index 4c659679a..000000000 --- a/usafacts/delphi_usafacts/run.py +++ /dev/null @@ -1,150 +0,0 @@ -# -*- 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`. -""" -import time as t -from datetime import datetime, date, time, timedelta -from itertools import product -from typing import Dict, Any - -import numpy as np -from delphi_utils import ( - create_export_csv, - get_structured_logger, - Smoother -) - -from .geo import geo_map -from .pull import pull_usafacts_data - -# global constants -METRICS = [ - "confirmed", - "deaths", -] -SENSORS = [ - "new_counts", - "cumulative_counts", - "incidence", # new_counts per 100k people - "cumulative_prop", -] -SMOOTHERS = [ - "unsmoothed", - "seven_day_average", -] -SENSOR_NAME_MAP = { - "new_counts": ("incidence_num", False), - "cumulative_counts": ("cumulative_num", False), - "incidence": ("incidence_prop", False), - "cumulative_prop": ("cumulative_prop", False), -} -# Temporarily added for wip_ signals -# WIP_SENSOR_NAME_MAP = { -# "new_counts": ("incid_num", False), -# "cumulative_counts": ("cumul_num", False), -# "incidence": ("incid_prop", False), -# "cumulative_prop": ("cumul_prop", False), -# } - -SMOOTHERS_MAP = { - "unsmoothed": (Smoother("identity"), "", False, lambda d: d - timedelta(days=7)), - "seven_day_average": (Smoother("moving_average", window_length=7), "7dav_", True, lambda d: d), -} -GEO_RESOLUTIONS = [ - "county", - "state", - "msa", - "hrr", - "hhs", - "nation" -] - - -def run_module(params: Dict[str, Dict[str, Any]]): - """Run the usafacts indicator. - - The `params` argument is expected to have the following structure: - - "common": - - "export_dir": str, directory to write output - - "log_exceptions" (optional): bool, whether to log exceptions to file - - "log_filename" (optional): str, name of file to write logs - - "indicator": - - "base_url": str, URL from which to read upstream data - - "export_start_date": str, date from which to export data in YYYY-MM-DD format - - "archive" (optional): if provided, output will be archived with S3 - - "aws_credentials": Dict[str, str], AWS login credentials (see S3 documentation) - - "bucket_name: str, name of S3 bucket to read/write - - "cache_dir": str, directory of locally cached data - """ - start_time = t.time() - csv_export_count = 0 - oldest_final_export_date = None - logger = get_structured_logger( - __name__, filename=params["common"].get("log_filename"), - log_exceptions=params["common"].get("log_exceptions", True)) - export_start_date = params["indicator"]["export_start_date"] - if export_start_date == "latest": - export_start_date = datetime.combine(date.today(), time(0, 0)) - timedelta(days=1) - else: - export_start_date = datetime.strptime(export_start_date, "%Y-%m-%d") - export_dir = params["common"]["export_dir"] - input_dir = params["common"]["input_dir"] - base_url = params["indicator"]["base_url"] - - dfs = {metric: pull_usafacts_data(base_url, metric, logger, input_dir) for metric in METRICS} - for metric, geo_res, sensor, smoother in product( - METRICS, GEO_RESOLUTIONS, SENSORS, SMOOTHERS): - if "cumulative" in sensor and "seven_day_average" in smoother: - continue - logger.info("Generating signal and exporting to CSV", - geo_res = geo_res, - metric = metric, - sensor = sensor, - smoother = smoother) - df = dfs[metric] - # Aggregate to appropriate geographic resolution - df = geo_map(df, geo_res, sensor) - df["val"] = df[["geo_id", sensor]].groupby("geo_id")[sensor].transform( - SMOOTHERS_MAP[smoother][0].smooth - ) - df["se"] = np.nan - df["sample_size"] = np.nan - # Drop early entries where data insufficient for smoothing - df = df.loc[~df["val"].isnull(), :] - sensor_name = SENSOR_NAME_MAP[sensor][0] - # if (SENSOR_NAME_MAP[sensor][1] or SMOOTHERS_MAP[smoother][2]): - # metric = f"wip_{metric}" - # sensor_name = WIP_SENSOR_NAME_MAP[sensor][0] - sensor_name = SMOOTHERS_MAP[smoother][1] + sensor_name - exported_csv_dates = create_export_csv( - df, - export_dir=export_dir, - start_date=SMOOTHERS_MAP[smoother][3](export_start_date), - metric=metric, - geo_res=geo_res, - sensor=sensor_name, - ) - if not exported_csv_dates.empty: - logger.info("Exported CSV", - csv_export_count = exported_csv_dates.size, - min_csv_export_date = min(exported_csv_dates).strftime("%Y-%m-%d"), - max_csv_export_date = max(exported_csv_dates).strftime("%Y-%m-%d")) - csv_export_count += exported_csv_dates.size - if not oldest_final_export_date: - oldest_final_export_date = max(exported_csv_dates) - oldest_final_export_date = min( - oldest_final_export_date, max(exported_csv_dates)) - - elapsed_time_in_seconds = round(t.time() - start_time, 2) - max_lag_in_days = None - formatted_oldest_final_export_date = None - if oldest_final_export_date: - max_lag_in_days = (datetime.now() - oldest_final_export_date).days - formatted_oldest_final_export_date = oldest_final_export_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_oldest_final_export_date) diff --git a/usafacts/input-cache/.gitignore b/usafacts/input-cache/.gitignore deleted file mode 100644 index 552154e09..000000000 --- a/usafacts/input-cache/.gitignore +++ /dev/null @@ -1,120 +0,0 @@ -# You should hard commit a prototype for this file, but we -# want to avoid accidental adding of API tokens and other -# private data parameters -params.json - -# Do not commit output files -receiving/*.csv - -# Remove macOS files -.DS_Store - -# virtual environment -dview/ - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -coverage.xml -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -.static_storage/ -.media/ -local_settings.py - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# pyenv -.python-version - -# celery beat schedule file -celerybeat-schedule - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ diff --git a/usafacts/params.json.template b/usafacts/params.json.template deleted file mode 100644 index 68594fdc7..000000000 --- a/usafacts/params.json.template +++ /dev/null @@ -1,56 +0,0 @@ -{ - "common": { - "export_dir": "./receiving", - "input_dir": "./input-cache", - "log_exceptions": false, - "log_filename": "./usa-facts.log" - }, - "indicator": { - "base_url": "https://static.usafacts.org/public/data/covid-19/covid_{metric}_usafacts.csv", - "export_start_date": "2020-02-20" - }, - "archive": { - "aws_credentials": { - "aws_access_key_id": "", - "aws_secret_access_key": "" - }, - "bucket_name": "", - "indicator_prefix": "usafacts", - "cache_dir": "./cache" - }, - "validation": { - "common": { - "data_source": "usa-facts", - "span_length": 14, - "min_expected_lag": {"all": "1"}, - "max_expected_lag": {"all": "5"}, - "dry_run": true, - "suppressed_errors": [ - {"check_name": "check_val_lt_0"}, - {"check_name": "check_test_vs_reference_avg_changed", - "signal": "deaths_7dav_incidence_prop", - "geo_type": "county"} - ] - }, - "static": { - "minimum_sample_size": 100, - "missing_se_allowed": true, - "missing_sample_size_allowed": true - }, - "dynamic": { - "ref_window_size": 7, - "smoothed_signals": [ - "confirmed_7dav_cumulative_num", - "confirmed_7dav_cumulative_prop", - "confirmed_7dav_incidence_num", - "confirmed_7dav_incidence_prop", - "deaths_7dav_cumulative_num", - "deaths_7dav_cumulative_prop", - "deaths_7dav_incidence_num", - "deaths_7dav_incidence_prop"] - } - }, - "delivery": { - "delivery_dir": "./receiving" - } -} diff --git a/usafacts/receiving/.gitignore b/usafacts/receiving/.gitignore deleted file mode 100644 index 552154e09..000000000 --- a/usafacts/receiving/.gitignore +++ /dev/null @@ -1,120 +0,0 @@ -# You should hard commit a prototype for this file, but we -# want to avoid accidental adding of API tokens and other -# private data parameters -params.json - -# Do not commit output files -receiving/*.csv - -# Remove macOS files -.DS_Store - -# virtual environment -dview/ - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -coverage.xml -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -.hypothesis/ -.pytest_cache/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -.static_storage/ -.media/ -local_settings.py - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# pyenv -.python-version - -# celery beat schedule file -celerybeat-schedule - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ diff --git a/usafacts/setup.py b/usafacts/setup.py deleted file mode 100644 index e15cae933..000000000 --- a/usafacts/setup.py +++ /dev/null @@ -1,28 +0,0 @@ -from setuptools import setup -from setuptools import find_packages - -required = [ - "numpy", - "pandas", - "pydocstyle", - "pytest", - "pytest-cov", - "pylint==2.8.3", - "delphi-utils" -] - -setup( - name="delphi_usafacts", - version="0.0.1", - description="Indicators from USAFacts website", - author="", - author_email="", - url="https://github.com/cmu-delphi/covidcast-indicators", - install_requires=required, - classifiers=[ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Programming Language :: Python :: 3.8", - ], - packages=find_packages(), -) diff --git a/usafacts/tests/receiving/.gitignore b/usafacts/tests/receiving/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/usafacts/tests/test_data/bad_confirmed_extra_cols.csv b/usafacts/tests/test_data/bad_confirmed_extra_cols.csv deleted file mode 100644 index 6356cd19f..000000000 --- a/usafacts/tests/test_data/bad_confirmed_extra_cols.csv +++ /dev/null @@ -1,150 +0,0 @@ -countyFIPS,County Name,State,stateFIPS,2/29/20,3/1/20,3/2/20,3/3/20,3/4/20,3/5/20,3/6/20,3/7/20,3/8/20,3/9/20,3/10/20,extra -1041,Crenshaw County,AL,1,0,0,0,0,0,0,0,0,0,0,0,0.375787942 -1067,Henry County,AL,1,0,0,0,0,0,0,0,0,0,0,0,0.066511498 -2158,Kusilvak Census Area,AK,2,0,0,0,0,0,0,0,0,0,0,0,0.455249355 -2270,Wade Hampton Census Area,AK,2,0,0,0,0,0,0,0,0,0,0,0,0.996748628 -5043,Drew County,AR,5,0,0,0,0,0,0,0,0,0,0,0,0.666117206 -5053,Grant County,AR,5,0,0,0,0,0,0,0,0,0,0,0,0.366926139 -5075,Lawrence County,AR,5,0,0,0,0,0,0,0,0,0,0,0,0.323615234 -5077,Lee County,AR,5,0,0,0,0,0,0,0,0,0,0,0,0.6081579 -5085,Lonoke County,AR,5,0,0,0,0,0,0,0,0,0,0,0,0.054141562 -5119,Pulaski County,AR,5,0,0,0,0,0,0,0,0,0,0,0,0.224773839 -6051,Mono County,CA,6,0,0,0,0,0,0,0,0,0,0,0,0.990063918 -6071,San Bernardino County,CA,6,0,0,0,0,0,0,0,0,0,0,0,0.59723346 -8014,Broomfield County and City,CO,8,0,0,0,0,0,0,0,0,0,0,0,0.391679582 -8015,Chaffee County,CO,8,0,0,0,0,0,0,0,0,0,0,0,0.827943492 -9011,New London County,CT,9,0,0,0,0,0,0,0,0,0,0,0,0.870062283 -12073,Leon County,FL,12,0,0,0,0,0,0,0,0,0,0,0,0.610998435 -12127,Volusia County,FL,12,0,0,0,0,0,0,0,0,1,2,2,0.057455221 -13043,Candler County,GA,13,0,0,0,0,0,0,0,0,0,0,0,0.381481406 -13167,Johnson County,GA,13,0,0,0,0,0,0,0,0,0,0,0,0.474407949 -13211,Morgan County,GA,13,0,0,0,0,0,0,0,0,0,0,0,0.541769038 -13289,Twiggs County,GA,13,0,0,0,0,0,0,0,0,0,0,0,0.179386589 -13295,Walker County,GA,13,0,0,0,0,0,0,0,0,0,0,0,0.380050517 -13303,Washington County,GA,13,0,0,0,0,0,0,0,0,0,0,0,0.188258 -16033,Clark County,ID,16,0,0,0,0,0,0,0,0,0,0,0,0.590671628 -17043,DuPage County,IL,17,0,0,0,0,0,0,0,0,0,0,0,0.913104276 -17091,Kankakee County,IL,17,0,0,0,0,0,0,0,0,0,0,0,0.849751706 -17129,Menard County,IL,17,0,0,0,0,0,0,0,0,0,0,0,0.441192922 -18055,Greene County,IN,18,0,0,0,0,0,0,0,0,0,0,0,0.439793293 -19047,Crawford County,IA,19,0,0,0,0,0,0,0,0,0,0,0,0.559894716 -19063,Emmet County,IA,19,0,0,0,0,0,0,0,0,0,0,0,0.749048215 -19159,Ringgold County,IA,19,0,0,0,0,0,0,0,0,0,0,0,0.405824907 -20053,Ellsworth County,KS,20,0,0,0,0,0,0,0,0,0,0,0,0.133293501 -20179,Sheridan County,KS,20,0,0,0,0,0,0,0,0,0,0,0,0.009196377 -21037,Campbell County,KY,21,0,0,0,0,0,0,0,0,0,0,0,0.643508283 -21045,Casey County,KY,21,0,0,0,0,0,0,0,0,0,0,0,0.04787821 -21101,Henderson County,KY,21,0,0,0,0,0,0,0,0,0,0,0,0.688646454 -21171,Monroe County,KY,21,0,0,0,0,0,0,0,0,0,0,0,0.956877829 -21207,Russell County,KY,21,0,0,0,0,0,0,0,0,0,0,0,0.724252877 -21211,Shelby County,KY,21,0,0,0,0,0,0,0,0,0,0,0,0.746473025 -22023,Cameron Parish,LA,22,0,0,0,0,0,0,0,0,0,0,0,0.438619356 -22073,Ouachita Parish,LA,22,0,0,0,0,0,0,0,0,0,0,0,0.418155584 -22079,Rapides Parish,LA,22,0,0,0,0,0,0,0,0,0,0,0,0.025580324 -22081,Red River Parish,LA,22,0,0,0,0,0,0,0,0,0,0,0,0.113589984 -24023,Garrett County,MD,24,0,0,0,0,0,0,0,0,0,0,0,0.195743996 -25025,Suffolk County,MA,25,1,1,1,1,1,1,3,3,8,10,20,0.129699433 -26047,Emmet County,MI,26,0,0,0,0,0,0,0,0,0,0,0,0.638499028 -26069,Iosco County,MI,26,0,0,0,0,0,0,0,0,0,0,0,0.776239696 -27025,Chisago County,MN,27,0,0,0,0,0,0,0,0,0,0,0,0.604720039 -28001,Adams County,MS,28,0,0,0,0,0,0,0,0,0,0,0,0.935420125 -28005,Amite County,MS,28,0,0,0,0,0,0,0,0,0,0,0,0.213331478 -28039,George County,MS,28,0,0,0,0,0,0,0,0,0,0,0,0.34302082 -28041,Greene County,MS,28,0,0,0,0,0,0,0,0,0,0,0,0.843846373 -28045,Hancock County,MS,28,0,0,0,0,0,0,0,0,0,0,0,0.055195881 -28047,Harrison County,MS,28,0,0,0,0,0,0,0,0,0,0,0,0.556056038 -28051,Holmes County,MS,28,0,0,0,0,0,0,0,0,0,0,0,0.415691747 -28059,Jackson County,MS,28,0,0,0,0,0,0,0,0,0,0,0,0.445610646 -28107,Panola County,MS,28,0,0,0,0,0,0,0,0,0,0,0,0.618054101 -28109,Pearl River County,MS,28,0,0,0,0,0,0,0,0,0,0,0,0.018010684 -28131,Stone County,MS,28,0,0,0,0,0,0,0,0,0,0,0,0.027833815 -29011,Barton County,MO,29,0,0,0,0,0,0,0,0,0,0,0,0.196346445 -29057,Dade County,MO,29,0,0,0,0,0,0,0,0,0,0,0,0.571409571 -29125,Maries County,MO,29,0,0,0,0,0,0,0,0,0,0,0,0.390961033 -29213,Taney County,MO,29,0,0,0,0,0,0,0,0,0,0,0,0.752934897 -30095,Stillwater County,MT,30,0,0,0,0,0,0,0,0,0,0,0,0.766884174 -31029,Chase County,NE,31,0,0,0,0,0,0,0,0,0,0,0,0.775370468 -31057,Dundy County,NE,31,0,0,0,0,0,0,0,0,0,0,0,0.938416056 -31105,Kimball County,NE,31,0,0,0,0,0,0,0,0,0,0,0,0.865652547 -31115,Loup County,NE,31,0,0,0,0,0,0,0,0,0,0,0,0.839548936 -31165,Sioux County,NE,31,0,0,0,0,0,0,0,0,0,0,0,0.719030732 -32001,Churchill County,NV,32,0,0,0,0,0,0,0,0,0,0,0,0.809140745 -32510,Carson City,NV,32,0,0,0,0,0,0,0,0,0,0,0,0.553552142 -33003,Carroll County,NH,33,0,0,0,0,0,0,0,0,0,0,0,0.014039113 -35045,San Juan County,NM,35,0,0,0,0,0,0,0,0,0,0,0,0.906951537 -1,New York City Unallocated/Probable,NY,36,0,0,0,0,0,0,0,0,0,0,0,0.661171876 -36005,Bronx County,NY,36,0,0,0,0,0,0,0,0,1,2,3,0.849372568 -36009,Cattaraugus County,NY,36,0,0,0,0,0,0,0,0,0,0,0,0.524406259 -36035,Fulton County,NY,36,0,0,0,0,0,0,0,0,0,0,0,0.977151927 -36047,Kings County,NY,36,0,0,0,0,0,1,1,3,3,4,10,0.082690112 -36061,New York County,NY,36,0,0,1,1,1,3,4,8,8,11,17,0.961515156 -36081,Queens County,NY,36,0,0,0,0,0,0,0,1,1,2,4,0.253326779 -36085,Richmond County,NY,36,0,0,0,0,0,0,0,0,0,1,2,0.111593279 -36093,Schenectady County,NY,36,0,0,0,0,0,0,0,0,0,0,0,0.688451563 -37135,Orange County,NC,37,0,0,0,0,0,0,0,0,0,0,0,0.874004855 -38019,Cavalier County,ND,38,0,0,0,0,0,0,0,0,0,0,0,0.853618385 -38031,Foster County,ND,38,0,0,0,0,0,0,0,0,0,0,0,0.477998123 -39075,Holmes County,OH,39,0,0,0,0,0,0,0,0,0,0,0,0.768172331 -40045,Ellis County,OK,40,0,0,0,0,0,0,0,0,0,0,0,0.574251695 -40059,Harper County,OK,40,0,0,0,0,0,0,0,0,0,0,0,0.906817227 -40061,Haskell County,OK,40,0,0,0,0,0,0,0,0,0,0,0,0.083670301 -40079,Le Flore County,OK,40,0,0,0,0,0,0,0,0,0,0,0,0.395117375 -41013,Crook County,OR,41,0,0,0,0,0,0,0,0,0,0,0,0.61269078 -41015,Curry County,OR,41,0,0,0,0,0,0,0,0,0,0,0,0.152169926 -41045,Malheur County,OR,41,0,0,0,0,0,0,0,0,0,0,0,0.015867277 -46021,Campbell County,SD,46,0,0,0,0,0,0,0,0,0,0,0,0.621704912 -46063,Harding County,SD,46,0,0,0,0,0,0,0,0,0,0,0,0.43073374 -46102,Oglala Lakota County,SD,46,0,0,0,0,0,0,0,0,0,0,0,0.558856723 -47031,Coffee County,TN,47,0,0,0,0,0,0,0,0,0,0,0,0.513213487 -47077,Henderson County,TN,47,0,0,0,0,0,0,0,0,0,0,0,0.120434772 -47099,Lawrence County,TN,47,0,0,0,0,0,0,0,0,0,0,0,0.448264508 -47113,Madison County,TN,47,0,0,0,0,0,0,0,0,0,0,0,0.933012241 -47177,Warren County,TN,47,0,0,0,0,0,0,0,0,0,0,0,0.045186278 -47187,Williamson County,TN,47,0,0,0,0,0,1,1,1,1,1,4,0.882893715 -48021,Bastrop County,TX,48,0,0,0,0,0,0,0,0,0,0,0,0.537368768 -48059,Callahan County,TX,48,0,0,0,0,0,0,0,0,0,0,0,0.006211813 -48061,Cameron County,TX,48,0,0,0,0,0,0,0,0,0,0,0,0.5477017 -48143,Erath County,TX,48,0,0,0,0,0,0,0,0,0,0,0,0.374143857 -48151,Fisher County,TX,48,0,0,0,0,0,0,0,0,0,0,0,0.019588993 -48173,Glasscock County,TX,48,0,0,0,0,0,0,0,0,0,0,0,0.787249999 -48263,Kent County,TX,48,0,0,0,0,0,0,0,0,0,0,0,0.729777059 -48303,Lubbock County,TX,48,0,0,0,0,0,0,0,0,0,0,0,0.725433325 -48365,Panola County,TX,48,0,0,0,0,0,0,0,0,0,0,0,0.215021962 -48411,San Saba County,TX,48,0,0,0,0,0,0,0,0,0,0,0,0.350624457 -48425,Somervell County,TX,48,0,0,0,0,0,0,0,0,0,0,0,0.733466401 -48449,Titus County,TX,48,0,0,0,0,0,0,0,0,0,0,0,0.46527388 -48495,Winkler County,TX,48,0,0,0,0,0,0,0,0,0,0,0,0.839100125 -50005,Caledonia County,VT,50,0,0,0,0,0,0,0,0,0,0,0,0.436112894 -50027,Windsor County,VT,50,0,0,0,0,0,0,0,0,0,0,0,0.419253248 -51005,Alleghany County,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.964938849 -51015,Augusta County,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.291844802 -51025,Brunswick County,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.974326893 -51043,Clarke County,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.591362341 -51059,Fairfax County,VA,51,0,0,0,0,0,0,0,0,2,4,4,0.485940359 -51067,Franklin County,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.668380203 -51081,Greensville County,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.330777413 -51089,Henry County,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.863131813 -51093,Isle of Wight County,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.537115632 -51131,Northampton County,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.004090703 -51153,Prince William County,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.131381189 -51163,Rockbridge County,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.629461679 -51175,Southampton County,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.382284867 -51183,Sussex County,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.0099569 -51195,Wise County,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.331588188 -51520,Bristol city,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.091178276 -51540,Charlottesville City,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.163164481 -51580,Covington city,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.307774599 -51595,Emporia city,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.376350363 -51600,Fairfax city,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.427536647 -51620,Franklin city,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.253925287 -51678,Lexington city,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.48266825 -51685,Manassas Park city,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.501915901 -51690,Martinsville city,VA,51,0,0,0,0,0,0,0,0,0,0,0,0.369187756 -53063,Spokane County,WA,53,0,0,0,0,0,0,0,0,0,0,0,0.9956488 -54015,Clay County,WV,54,0,0,0,0,0,0,0,0,0,0,0,0.707045861 -54033,Harrison County,WV,54,0,0,0,0,0,0,0,0,0,0,0,0.367922736 -54087,Roane County,WV,54,0,0,0,0,0,0,0,0,0,0,0,0.913909792 -55009,Brown County,WI,55,0,0,0,0,0,0,0,0,0,0,0,0.637695999 -55071,Manitowoc County,WI,55,0,0,0,0,0,0,0,0,0,0,0,0.384496752 -55107,Rusk County,WI,55,0,0,0,0,0,0,0,0,0,0,0,0.176242413 -55115,Shawano County,WI,55,0,0,0,0,0,0,0,0,0,0,0,0.948897692 \ No newline at end of file diff --git a/usafacts/tests/test_data/bad_confirmed_missing_cols.csv b/usafacts/tests/test_data/bad_confirmed_missing_cols.csv deleted file mode 100644 index c65a21565..000000000 --- a/usafacts/tests/test_data/bad_confirmed_missing_cols.csv +++ /dev/null @@ -1,150 +0,0 @@ -countyFIPS,State,stateFIPS,2/29/20,3/1/20,3/2/20,3/3/20,3/4/20,3/5/20,3/6/20,3/7/20,3/8/20,3/9/20,3/10/20 -1041,AL,1,0,0,0,0,0,0,0,0,0,0,0 -1067,AL,1,0,0,0,0,0,0,0,0,0,0,0 -2158,AK,2,0,0,0,0,0,0,0,0,0,0,0 -2270,AK,2,0,0,0,0,0,0,0,0,0,0,0 -5043,AR,5,0,0,0,0,0,0,0,0,0,0,0 -5053,AR,5,0,0,0,0,0,0,0,0,0,0,0 -5075,AR,5,0,0,0,0,0,0,0,0,0,0,0 -5077,AR,5,0,0,0,0,0,0,0,0,0,0,0 -5085,AR,5,0,0,0,0,0,0,0,0,0,0,0 -5119,AR,5,0,0,0,0,0,0,0,0,0,0,0 -6051,CA,6,0,0,0,0,0,0,0,0,0,0,0 -6071,CA,6,0,0,0,0,0,0,0,0,0,0,0 -8014,CO,8,0,0,0,0,0,0,0,0,0,0,0 -8015,CO,8,0,0,0,0,0,0,0,0,0,0,0 -9011,CT,9,0,0,0,0,0,0,0,0,0,0,0 -12073,FL,12,0,0,0,0,0,0,0,0,0,0,0 -12127,FL,12,0,0,0,0,0,0,0,0,1,2,2 -13043,GA,13,0,0,0,0,0,0,0,0,0,0,0 -13167,GA,13,0,0,0,0,0,0,0,0,0,0,0 -13211,GA,13,0,0,0,0,0,0,0,0,0,0,0 -13289,GA,13,0,0,0,0,0,0,0,0,0,0,0 -13295,GA,13,0,0,0,0,0,0,0,0,0,0,0 -13303,GA,13,0,0,0,0,0,0,0,0,0,0,0 -16033,ID,16,0,0,0,0,0,0,0,0,0,0,0 -17043,IL,17,0,0,0,0,0,0,0,0,0,0,0 -17091,IL,17,0,0,0,0,0,0,0,0,0,0,0 -17129,IL,17,0,0,0,0,0,0,0,0,0,0,0 -18055,IN,18,0,0,0,0,0,0,0,0,0,0,0 -19047,IA,19,0,0,0,0,0,0,0,0,0,0,0 -19063,IA,19,0,0,0,0,0,0,0,0,0,0,0 -19159,IA,19,0,0,0,0,0,0,0,0,0,0,0 -20053,KS,20,0,0,0,0,0,0,0,0,0,0,0 -20179,KS,20,0,0,0,0,0,0,0,0,0,0,0 -21037,KY,21,0,0,0,0,0,0,0,0,0,0,0 -21045,KY,21,0,0,0,0,0,0,0,0,0,0,0 -21101,KY,21,0,0,0,0,0,0,0,0,0,0,0 -21171,KY,21,0,0,0,0,0,0,0,0,0,0,0 -21207,KY,21,0,0,0,0,0,0,0,0,0,0,0 -21211,KY,21,0,0,0,0,0,0,0,0,0,0,0 -22023,LA,22,0,0,0,0,0,0,0,0,0,0,0 -22073,LA,22,0,0,0,0,0,0,0,0,0,0,0 -22079,LA,22,0,0,0,0,0,0,0,0,0,0,0 -22081,LA,22,0,0,0,0,0,0,0,0,0,0,0 -24023,MD,24,0,0,0,0,0,0,0,0,0,0,0 -25025,MA,25,1,1,1,1,1,1,3,3,8,10,20 -26047,MI,26,0,0,0,0,0,0,0,0,0,0,0 -26069,MI,26,0,0,0,0,0,0,0,0,0,0,0 -27025,MN,27,0,0,0,0,0,0,0,0,0,0,0 -28001,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28005,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28039,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28041,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28045,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28047,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28051,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28059,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28107,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28109,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28131,MS,28,0,0,0,0,0,0,0,0,0,0,0 -29011,MO,29,0,0,0,0,0,0,0,0,0,0,0 -29057,MO,29,0,0,0,0,0,0,0,0,0,0,0 -29125,MO,29,0,0,0,0,0,0,0,0,0,0,0 -29213,MO,29,0,0,0,0,0,0,0,0,0,0,0 -30095,MT,30,0,0,0,0,0,0,0,0,0,0,0 -31029,NE,31,0,0,0,0,0,0,0,0,0,0,0 -31057,NE,31,0,0,0,0,0,0,0,0,0,0,0 -31105,NE,31,0,0,0,0,0,0,0,0,0,0,0 -31115,NE,31,0,0,0,0,0,0,0,0,0,0,0 -31165,NE,31,0,0,0,0,0,0,0,0,0,0,0 -32001,NV,32,0,0,0,0,0,0,0,0,0,0,0 -32510,NV,32,0,0,0,0,0,0,0,0,0,0,0 -33003,NH,33,0,0,0,0,0,0,0,0,0,0,0 -35045,NM,35,0,0,0,0,0,0,0,0,0,0,0 -1,NY,36,0,0,0,0,0,0,0,0,0,0,0 -36005,NY,36,0,0,0,0,0,0,0,0,1,2,3 -36009,NY,36,0,0,0,0,0,0,0,0,0,0,0 -36035,NY,36,0,0,0,0,0,0,0,0,0,0,0 -36047,NY,36,0,0,0,0,0,1,1,3,3,4,10 -36061,NY,36,0,0,1,1,1,3,4,8,8,11,17 -36081,NY,36,0,0,0,0,0,0,0,1,1,2,4 -36085,NY,36,0,0,0,0,0,0,0,0,0,1,2 -36093,NY,36,0,0,0,0,0,0,0,0,0,0,0 -37135,NC,37,0,0,0,0,0,0,0,0,0,0,0 -38019,ND,38,0,0,0,0,0,0,0,0,0,0,0 -38031,ND,38,0,0,0,0,0,0,0,0,0,0,0 -39075,OH,39,0,0,0,0,0,0,0,0,0,0,0 -40045,OK,40,0,0,0,0,0,0,0,0,0,0,0 -40059,OK,40,0,0,0,0,0,0,0,0,0,0,0 -40061,OK,40,0,0,0,0,0,0,0,0,0,0,0 -40079,OK,40,0,0,0,0,0,0,0,0,0,0,0 -41013,OR,41,0,0,0,0,0,0,0,0,0,0,0 -41015,OR,41,0,0,0,0,0,0,0,0,0,0,0 -41045,OR,41,0,0,0,0,0,0,0,0,0,0,0 -46021,SD,46,0,0,0,0,0,0,0,0,0,0,0 -46063,SD,46,0,0,0,0,0,0,0,0,0,0,0 -46102,SD,46,0,0,0,0,0,0,0,0,0,0,0 -47031,TN,47,0,0,0,0,0,0,0,0,0,0,0 -47077,TN,47,0,0,0,0,0,0,0,0,0,0,0 -47099,TN,47,0,0,0,0,0,0,0,0,0,0,0 -47113,TN,47,0,0,0,0,0,0,0,0,0,0,0 -47177,TN,47,0,0,0,0,0,0,0,0,0,0,0 -47187,TN,47,0,0,0,0,0,1,1,1,1,1,4 -48021,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48059,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48061,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48143,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48151,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48173,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48263,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48303,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48365,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48411,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48425,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48449,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48495,TX,48,0,0,0,0,0,0,0,0,0,0,0 -50005,VT,50,0,0,0,0,0,0,0,0,0,0,0 -50027,VT,50,0,0,0,0,0,0,0,0,0,0,0 -51005,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51015,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51025,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51043,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51059,VA,51,0,0,0,0,0,0,0,0,2,4,4 -51067,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51081,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51089,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51093,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51131,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51153,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51163,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51175,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51183,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51195,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51520,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51540,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51580,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51595,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51600,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51620,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51678,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51685,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51690,VA,51,0,0,0,0,0,0,0,0,0,0,0 -53063,WA,53,0,0,0,0,0,0,0,0,0,0,0 -54015,WV,54,0,0,0,0,0,0,0,0,0,0,0 -54033,WV,54,0,0,0,0,0,0,0,0,0,0,0 -54087,WV,54,0,0,0,0,0,0,0,0,0,0,0 -55009,WI,55,0,0,0,0,0,0,0,0,0,0,0 -55071,WI,55,0,0,0,0,0,0,0,0,0,0,0 -55107,WI,55,0,0,0,0,0,0,0,0,0,0,0 -55115,WI,55,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/usafacts/tests/test_data/bad_confirmed_missing_days.csv b/usafacts/tests/test_data/bad_confirmed_missing_days.csv deleted file mode 100644 index b256c2ed3..000000000 --- a/usafacts/tests/test_data/bad_confirmed_missing_days.csv +++ /dev/null @@ -1,150 +0,0 @@ -countyFIPS,County Name,State,stateFIPS,2/29/20,3/2/20,3/3/20,3/6/20,3/7/20,3/9/20,3/10/20 -1041,Crenshaw County,AL,1,0,0,0,0,0,0,0 -1067,Henry County,AL,1,0,0,0,0,0,0,0 -2158,Kusilvak Census Area,AK,2,0,0,0,0,0,0,0 -2270,Wade Hampton Census Area,AK,2,0,0,0,0,0,0,0 -5043,Drew County,AR,5,0,0,0,0,0,0,0 -5053,Grant County,AR,5,0,0,0,0,0,0,0 -5075,Lawrence County,AR,5,0,0,0,0,0,0,0 -5077,Lee County,AR,5,0,0,0,0,0,0,0 -5085,Lonoke County,AR,5,0,0,0,0,0,0,0 -5119,Pulaski County,AR,5,0,0,0,0,0,0,0 -6051,Mono County,CA,6,0,0,0,0,0,0,0 -6071,San Bernardino County,CA,6,0,0,0,0,0,0,0 -8014,Broomfield County and City,CO,8,0,0,0,0,0,0,0 -8015,Chaffee County,CO,8,0,0,0,0,0,0,0 -9011,New London County,CT,9,0,0,0,0,0,0,0 -12073,Leon County,FL,12,0,0,0,0,0,0,0 -12127,Volusia County,FL,12,0,0,0,0,0,2,2 -13043,Candler County,GA,13,0,0,0,0,0,0,0 -13167,Johnson County,GA,13,0,0,0,0,0,0,0 -13211,Morgan County,GA,13,0,0,0,0,0,0,0 -13289,Twiggs County,GA,13,0,0,0,0,0,0,0 -13295,Walker County,GA,13,0,0,0,0,0,0,0 -13303,Washington County,GA,13,0,0,0,0,0,0,0 -16033,Clark County,ID,16,0,0,0,0,0,0,0 -17043,DuPage County,IL,17,0,0,0,0,0,0,0 -17091,Kankakee County,IL,17,0,0,0,0,0,0,0 -17129,Menard County,IL,17,0,0,0,0,0,0,0 -18055,Greene County,IN,18,0,0,0,0,0,0,0 -19047,Crawford County,IA,19,0,0,0,0,0,0,0 -19063,Emmet County,IA,19,0,0,0,0,0,0,0 -19159,Ringgold County,IA,19,0,0,0,0,0,0,0 -20053,Ellsworth County,KS,20,0,0,0,0,0,0,0 -20179,Sheridan County,KS,20,0,0,0,0,0,0,0 -21037,Campbell County,KY,21,0,0,0,0,0,0,0 -21045,Casey County,KY,21,0,0,0,0,0,0,0 -21101,Henderson County,KY,21,0,0,0,0,0,0,0 -21171,Monroe County,KY,21,0,0,0,0,0,0,0 -21207,Russell County,KY,21,0,0,0,0,0,0,0 -21211,Shelby County,KY,21,0,0,0,0,0,0,0 -22023,Cameron Parish,LA,22,0,0,0,0,0,0,0 -22073,Ouachita Parish,LA,22,0,0,0,0,0,0,0 -22079,Rapides Parish,LA,22,0,0,0,0,0,0,0 -22081,Red River Parish,LA,22,0,0,0,0,0,0,0 -24023,Garrett County,MD,24,0,0,0,0,0,0,0 -25025,Suffolk County,MA,25,1,1,1,3,3,10,20 -26047,Emmet County,MI,26,0,0,0,0,0,0,0 -26069,Iosco County,MI,26,0,0,0,0,0,0,0 -27025,Chisago County,MN,27,0,0,0,0,0,0,0 -28001,Adams County,MS,28,0,0,0,0,0,0,0 -28005,Amite County,MS,28,0,0,0,0,0,0,0 -28039,George County,MS,28,0,0,0,0,0,0,0 -28041,Greene County,MS,28,0,0,0,0,0,0,0 -28045,Hancock County,MS,28,0,0,0,0,0,0,0 -28047,Harrison County,MS,28,0,0,0,0,0,0,0 -28051,Holmes County,MS,28,0,0,0,0,0,0,0 -28059,Jackson County,MS,28,0,0,0,0,0,0,0 -28107,Panola County,MS,28,0,0,0,0,0,0,0 -28109,Pearl River County,MS,28,0,0,0,0,0,0,0 -28131,Stone County,MS,28,0,0,0,0,0,0,0 -29011,Barton County,MO,29,0,0,0,0,0,0,0 -29057,Dade County,MO,29,0,0,0,0,0,0,0 -29125,Maries County,MO,29,0,0,0,0,0,0,0 -29213,Taney County,MO,29,0,0,0,0,0,0,0 -30095,Stillwater County,MT,30,0,0,0,0,0,0,0 -31029,Chase County,NE,31,0,0,0,0,0,0,0 -31057,Dundy County,NE,31,0,0,0,0,0,0,0 -31105,Kimball County,NE,31,0,0,0,0,0,0,0 -31115,Loup County,NE,31,0,0,0,0,0,0,0 -31165,Sioux County,NE,31,0,0,0,0,0,0,0 -32001,Churchill County,NV,32,0,0,0,0,0,0,0 -32510,Carson City,NV,32,0,0,0,0,0,0,0 -33003,Carroll County,NH,33,0,0,0,0,0,0,0 -35045,San Juan County,NM,35,0,0,0,0,0,0,0 -1,New York City Unallocated/Probable,NY,36,0,0,0,0,0,0,0 -36005,Bronx County,NY,36,0,0,0,0,0,2,3 -36009,Cattaraugus County,NY,36,0,0,0,0,0,0,0 -36035,Fulton County,NY,36,0,0,0,0,0,0,0 -36047,Kings County,NY,36,0,0,0,1,3,4,10 -36061,New York County,NY,36,0,1,1,4,8,11,17 -36081,Queens County,NY,36,0,0,0,0,1,2,4 -36085,Richmond County,NY,36,0,0,0,0,0,1,2 -36093,Schenectady County,NY,36,0,0,0,0,0,0,0 -37135,Orange County,NC,37,0,0,0,0,0,0,0 -38019,Cavalier County,ND,38,0,0,0,0,0,0,0 -38031,Foster County,ND,38,0,0,0,0,0,0,0 -39075,Holmes County,OH,39,0,0,0,0,0,0,0 -40045,Ellis County,OK,40,0,0,0,0,0,0,0 -40059,Harper County,OK,40,0,0,0,0,0,0,0 -40061,Haskell County,OK,40,0,0,0,0,0,0,0 -40079,Le Flore County,OK,40,0,0,0,0,0,0,0 -41013,Crook County,OR,41,0,0,0,0,0,0,0 -41015,Curry County,OR,41,0,0,0,0,0,0,0 -41045,Malheur County,OR,41,0,0,0,0,0,0,0 -46021,Campbell County,SD,46,0,0,0,0,0,0,0 -46063,Harding County,SD,46,0,0,0,0,0,0,0 -46102,Oglala Lakota County,SD,46,0,0,0,0,0,0,0 -47031,Coffee County,TN,47,0,0,0,0,0,0,0 -47077,Henderson County,TN,47,0,0,0,0,0,0,0 -47099,Lawrence County,TN,47,0,0,0,0,0,0,0 -47113,Madison County,TN,47,0,0,0,0,0,0,0 -47177,Warren County,TN,47,0,0,0,0,0,0,0 -47187,Williamson County,TN,47,0,0,0,1,1,1,4 -48021,Bastrop County,TX,48,0,0,0,0,0,0,0 -48059,Callahan County,TX,48,0,0,0,0,0,0,0 -48061,Cameron County,TX,48,0,0,0,0,0,0,0 -48143,Erath County,TX,48,0,0,0,0,0,0,0 -48151,Fisher County,TX,48,0,0,0,0,0,0,0 -48173,Glasscock County,TX,48,0,0,0,0,0,0,0 -48263,Kent County,TX,48,0,0,0,0,0,0,0 -48303,Lubbock County,TX,48,0,0,0,0,0,0,0 -48365,Panola County,TX,48,0,0,0,0,0,0,0 -48411,San Saba County,TX,48,0,0,0,0,0,0,0 -48425,Somervell County,TX,48,0,0,0,0,0,0,0 -48449,Titus County,TX,48,0,0,0,0,0,0,0 -48495,Winkler County,TX,48,0,0,0,0,0,0,0 -50005,Caledonia County,VT,50,0,0,0,0,0,0,0 -50027,Windsor County,VT,50,0,0,0,0,0,0,0 -51005,Alleghany County,VA,51,0,0,0,0,0,0,0 -51015,Augusta County,VA,51,0,0,0,0,0,0,0 -51025,Brunswick County,VA,51,0,0,0,0,0,0,0 -51043,Clarke County,VA,51,0,0,0,0,0,0,0 -51059,Fairfax County,VA,51,0,0,0,0,0,4,4 -51067,Franklin County,VA,51,0,0,0,0,0,0,0 -51081,Greensville County,VA,51,0,0,0,0,0,0,0 -51089,Henry County,VA,51,0,0,0,0,0,0,0 -51093,Isle of Wight County,VA,51,0,0,0,0,0,0,0 -51131,Northampton County,VA,51,0,0,0,0,0,0,0 -51153,Prince William County,VA,51,0,0,0,0,0,0,0 -51163,Rockbridge County,VA,51,0,0,0,0,0,0,0 -51175,Southampton County,VA,51,0,0,0,0,0,0,0 -51183,Sussex County,VA,51,0,0,0,0,0,0,0 -51195,Wise County,VA,51,0,0,0,0,0,0,0 -51520,Bristol city,VA,51,0,0,0,0,0,0,0 -51540,Charlottesville City,VA,51,0,0,0,0,0,0,0 -51580,Covington city,VA,51,0,0,0,0,0,0,0 -51595,Emporia city,VA,51,0,0,0,0,0,0,0 -51600,Fairfax city,VA,51,0,0,0,0,0,0,0 -51620,Franklin city,VA,51,0,0,0,0,0,0,0 -51678,Lexington city,VA,51,0,0,0,0,0,0,0 -51685,Manassas Park city,VA,51,0,0,0,0,0,0,0 -51690,Martinsville city,VA,51,0,0,0,0,0,0,0 -53063,Spokane County,WA,53,0,0,0,0,0,0,0 -54015,Clay County,WV,54,0,0,0,0,0,0,0 -54033,Harrison County,WV,54,0,0,0,0,0,0,0 -54087,Roane County,WV,54,0,0,0,0,0,0,0 -55009,Brown County,WI,55,0,0,0,0,0,0,0 -55071,Manitowoc County,WI,55,0,0,0,0,0,0,0 -55107,Rusk County,WI,55,0,0,0,0,0,0,0 -55115,Shawano County,WI,55,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/usafacts/tests/test_data/small_confirmed.csv b/usafacts/tests/test_data/small_confirmed.csv deleted file mode 100644 index 0ce99b406..000000000 --- a/usafacts/tests/test_data/small_confirmed.csv +++ /dev/null @@ -1,149 +0,0 @@ -countyFIPS,County Name,State,StateFIPS,2/29/20,3/1/20,3/2/20,3/3/20,3/4/20,3/5/20,3/6/20,3/7/20,3/8/20,3/9/20,3/10/20 -1041,Crenshaw County,AL,1,0,0,0,0,0,0,0,0,0,0,0 -1067,Henry County,AL,1,0,0,0,0,0,0,0,0,0,0,0 -2158,Kusilvak Census Area,AK,2,0,0,0,0,0,0,0,0,0,0,0 -2270,Wade Hampton Census Area,AK,2,0,0,0,0,0,0,0,0,0,0,0 -5043,Drew County,AR,5,0,0,0,0,0,0,0,0,0,0,0 -5053,Grant County,AR,5,0,0,0,0,0,0,0,0,0,0,0 -5075,Lawrence County,AR,5,0,0,0,0,0,0,0,0,0,0,0 -5077,Lee County,AR,5,0,0,0,0,0,0,0,0,0,0,0 -5085,Lonoke County,AR,5,0,0,0,0,0,0,0,0,0,0,0 -5119,Pulaski County,AR,5,0,0,0,0,0,0,0,0,0,0,0 -6051,Mono County,CA,6,0,0,0,0,0,0,0,0,0,0,0 -6071,San Bernardino County,CA,6,0,0,0,0,0,0,0,0,0,0,0 -8014,Broomfield County and City,CO,8,0,0,0,0,0,0,0,0,0,0,0 -8015,Chaffee County,CO,8,0,0,0,0,0,0,0,0,0,0,0 -9011,New London County,CT,9,0,0,0,0,0,0,0,0,0,0,0 -12073,Leon County,FL,12,0,0,0,0,0,0,0,0,0,0,0 -12127,Volusia County,FL,12,0,0,0,0,0,0,0,0,1,2,2 -13043,Candler County,GA,13,0,0,0,0,0,0,0,0,0,0,0 -13167,Johnson County,GA,13,0,0,0,0,0,0,0,0,0,0,0 -13211,Morgan County,GA,13,0,0,0,0,0,0,0,0,0,0,0 -13289,Twiggs County,GA,13,0,0,0,0,0,0,0,0,0,0,0 -13295,Walker County,GA,13,0,0,0,0,0,0,0,0,0,0,0 -13303,Washington County,GA,13,0,0,0,0,0,0,0,0,0,0,0 -16033,Clark County,ID,16,0,0,0,0,0,0,0,0,0,0,0 -17043,DuPage County,IL,17,0,0,0,0,0,0,0,0,0,0,0 -17091,Kankakee County,IL,17,0,0,0,0,0,0,0,0,0,0,0 -17129,Menard County,IL,17,0,0,0,0,0,0,0,0,0,0,0 -18055,Greene County,IN,18,0,0,0,0,0,0,0,0,0,0,0 -19047,Crawford County,IA,19,0,0,0,0,0,0,0,0,0,0,0 -19063,Emmet County,IA,19,0,0,0,0,0,0,0,0,0,0,0 -19159,Ringgold County,IA,19,0,0,0,0,0,0,0,0,0,0,0 -20053,Ellsworth County,KS,20,0,0,0,0,0,0,0,0,0,0,0 -20179,Sheridan County,KS,20,0,0,0,0,0,0,0,0,0,0,0 -21037,Campbell County,KY,21,0,0,0,0,0,0,0,0,0,0,0 -21045,Casey County,KY,21,0,0,0,0,0,0,0,0,0,0,0 -21101,Henderson County,KY,21,0,0,0,0,0,0,0,0,0,0,0 -21171,Monroe County,KY,21,0,0,0,0,0,0,0,0,0,0,0 -21207,Russell County,KY,21,0,0,0,0,0,0,0,0,0,0,0 -21211,Shelby County,KY,21,0,0,0,0,0,0,0,0,0,0,0 -22023,Cameron Parish,LA,22,0,0,0,0,0,0,0,0,0,0,0 -22073,Ouachita Parish,LA,22,0,0,0,0,0,0,0,0,0,0,0 -22079,Rapides Parish,LA,22,0,0,0,0,0,0,0,0,0,0,0 -22081,Red River Parish,LA,22,0,0,0,0,0,0,0,0,0,0,0 -24023,Garrett County,MD,24,0,0,0,0,0,0,0,0,0,0,0 -25025,Suffolk County,MA,25,1,1,1,1,1,1,3,3,8,10,20 -26047,Emmet County,MI,26,0,0,0,0,0,0,0,0,0,0,0 -26069,Iosco County,MI,26,0,0,0,0,0,0,0,0,0,0,0 -27025,Chisago County,MN,27,0,0,0,0,0,0,0,0,0,0,0 -28001,Adams County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28005,Amite County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28039,George County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28041,Greene County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28045,Hancock County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28047,Harrison County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28051,Holmes County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28059,Jackson County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28107,Panola County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28109,Pearl River County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28131,Stone County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -29011,Barton County,MO,29,0,0,0,0,0,0,0,0,0,0,0 -29057,Dade County,MO,29,0,0,0,0,0,0,0,0,0,0,0 -29125,Maries County,MO,29,0,0,0,0,0,0,0,0,0,0,0 -29213,Taney County,MO,29,0,0,0,0,0,0,0,0,0,0,0 -30095,Stillwater County,MT,30,0,0,0,0,0,0,0,0,0,0,0 -31029,Chase County,NE,31,0,0,0,0,0,0,0,0,0,0,0 -31057,Dundy County,NE,31,0,0,0,0,0,0,0,0,0,0,0 -31105,Kimball County,NE,31,0,0,0,0,0,0,0,0,0,0,0 -31115,Loup County,NE,31,0,0,0,0,0,0,0,0,0,0,0 -31165,Sioux County,NE,31,0,0,0,0,0,0,0,0,0,0,0 -32001,Churchill County,NV,32,0,0,0,0,0,0,0,0,0,0,0 -32510,Carson City,NV,32,0,0,0,0,0,0,0,0,0,0,0 -33003,Carroll County,NH,33,0,0,0,0,0,0,0,0,0,0,0 -35045,San Juan County,NM,35,0,0,0,0,0,0,0,0,0,0,0 -36005,Bronx County,NY,36,0,0,0,0,0,0,0,0,1,2,3 -36009,Cattaraugus County,NY,36,0,0,0,0,0,0,0,0,0,0,0 -36035,Fulton County,NY,36,0,0,0,0,0,0,0,0,0,0,0 -36047,Kings County,NY,36,0,0,0,0,0,1,1,3,3,4,10 -36061,New York County,NY,36,0,0,1,1,1,3,4,8,8,11,17 -36081,Queens County,NY,36,0,0,0,0,0,0,0,1,1,2,4 -36085,Richmond County,NY,36,0,0,0,0,0,0,0,0,0,1,2 -36093,Schenectady County,NY,36,0,0,0,0,0,0,0,0,0,0,0 -37135,Orange County,NC,37,0,0,0,0,0,0,0,0,0,0,0 -38019,Cavalier County,ND,38,0,0,0,0,0,0,0,0,0,0,0 -38031,Foster County,ND,38,0,0,0,0,0,0,0,0,0,0,0 -39075,Holmes County,OH,39,0,0,0,0,0,0,0,0,0,0,0 -40045,Ellis County,OK,40,0,0,0,0,0,0,0,0,0,0,0 -40059,Harper County,OK,40,0,0,0,0,0,0,0,0,0,0,0 -40061,Haskell County,OK,40,0,0,0,0,0,0,0,0,0,0,0 -40079,Le Flore County,OK,40,0,0,0,0,0,0,0,0,0,0,0 -41013,Crook County,OR,41,0,0,0,0,0,0,0,0,0,0,0 -41015,Curry County,OR,41,0,0,0,0,0,0,0,0,0,0,0 -41045,Malheur County,OR,41,0,0,0,0,0,0,0,0,0,0,0 -46021,Campbell County,SD,46,0,0,0,0,0,0,0,0,0,0,0 -46063,Harding County,SD,46,0,0,0,0,0,0,0,0,0,0,0 -46102,Oglala Lakota County,SD,46,0,0,0,0,0,0,0,0,0,0,0 -47031,Coffee County,TN,47,0,0,0,0,0,0,0,0,0,0,0 -47077,Henderson County,TN,47,0,0,0,0,0,0,0,0,0,0,0 -47099,Lawrence County,TN,47,0,0,0,0,0,0,0,0,0,0,0 -47113,Madison County,TN,47,0,0,0,0,0,0,0,0,0,0,0 -47177,Warren County,TN,47,0,0,0,0,0,0,0,0,0,0,0 -47187,Williamson County,TN,47,0,0,0,0,0,1,1,1,1,1,4 -48021,Bastrop County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48059,Callahan County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48061,Cameron County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48143,Erath County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48151,Fisher County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48173,Glasscock County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48263,Kent County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48303,Lubbock County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48365,Panola County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48411,San Saba County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48425,Somervell County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48449,Titus County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48495,Winkler County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -50005,Caledonia County,VT,50,0,0,0,0,0,0,0,0,0,0,0 -50027,Windsor County,VT,50,0,0,0,0,0,0,0,0,0,0,0 -51005,Alleghany County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51015,Augusta County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51025,Brunswick County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51043,Clarke County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51059,Fairfax County,VA,51,0,0,0,0,0,0,0,0,2,4,4 -51067,Franklin County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51081,Greensville County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51089,Henry County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51093,Isle of Wight County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51131,Northampton County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51153,Prince William County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51163,Rockbridge County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51175,Southampton County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51183,Sussex County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51195,Wise County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51520,Bristol city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51540,Charlottesville City,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51580,Covington city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51595,Emporia city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51600,Fairfax city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51620,Franklin city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51678,Lexington city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51685,Manassas Park city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51690,Martinsville city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -53063,Spokane County,WA,53,0,0,0,0,0,0,0,0,0,0,0 -54015,Clay County,WV,54,0,0,0,0,0,0,0,0,0,0,0 -54033,Harrison County,WV,54,0,0,0,0,0,0,0,0,0,0,0 -54087,Roane County,WV,54,0,0,0,0,0,0,0,0,0,0,0 -55009,Brown County,WI,55,0,0,0,0,0,0,0,0,0,0,0 -55071,Manitowoc County,WI,55,0,0,0,0,0,0,0,0,0,0,0 -55107,Rusk County,WI,55,0,0,0,0,0,0,0,0,0,0,0 -55115,Shawano County,WI,55,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/usafacts/tests/test_data/small_deaths.csv b/usafacts/tests/test_data/small_deaths.csv deleted file mode 100644 index 24d596210..000000000 --- a/usafacts/tests/test_data/small_deaths.csv +++ /dev/null @@ -1,150 +0,0 @@ -countyFIPS,County Name,State,stateFIPS,2-29-20,3-1-20,3-2-20,3-3-20,3-4-20,3-5-20,3-6-20,3-7-20,3-8-20,3-9-20,3-10-20 -1041,Crenshaw County,AL,1,0,0,0,0,0,0,0,0,0,0,0 -1067,Henry County,AL,1,0,0,0,0,0,0,0,0,0,0,0 -2158,Kusilvak Census Area,AK,2,0,0,0,0,0,0,0,0,0,0,0 -2270,Wade Hampton Census Area,AK,2,0,0,0,0,0,0,0,0,0,0,0 -5043,Drew County,AR,5,0,0,0,0,0,0,0,0,0,0,0 -5053,Grant County,AR,5,0,0,0,0,0,0,0,0,0,0,0 -5075,Lawrence County,AR,5,0,0,0,0,0,0,0,0,0,0,0 -5077,Lee County,AR,5,0,0,0,0,0,0,0,0,0,0,0 -5085,Lonoke County,AR,5,0,0,0,0,0,0,0,0,0,0,0 -5119,Pulaski County,AR,5,0,0,0,0,0,0,0,0,0,0,0 -6051,Mono County,CA,6,0,0,0,0,0,0,0,0,0,0,0 -6071,San Bernardino County,CA,6,0,0,0,0,0,0,0,0,0,0,0 -8014,Broomfield County,CO,8,0,0,0,0,0,0,0,0,0,0,0 -8015,Chaffee County,CO,8,0,0,0,0,0,0,0,0,0,0,0 -9011,New London County,CT,9,0,0,0,0,0,0,0,0,0,0,0 -12073,Leon County,FL,12,0,0,0,0,0,0,0,0,0,0,0 -12127,Volusia County,FL,12,0,0,0,0,0,0,0,0,0,0,0 -13043,Candler County,GA,13,0,0,0,0,0,0,0,0,0,0,0 -13167,Johnson County,GA,13,0,0,0,0,0,0,0,0,0,0,0 -13211,Morgan County,GA,13,0,0,0,0,0,0,0,0,0,0,0 -13289,Twiggs County,GA,13,0,0,0,0,0,0,0,0,0,0,0 -13295,Walker County,GA,13,0,0,0,0,0,0,0,0,0,0,0 -13303,Washington County,GA,13,0,0,0,0,0,0,0,0,0,0,0 -16033,Clark County,ID,16,0,0,0,0,0,0,0,0,0,0,0 -17043,DuPage County,IL,17,0,0,0,0,0,0,0,0,0,0,0 -17091,Kankakee County,IL,17,0,0,0,0,0,0,0,0,0,0,0 -17129,Menard County,IL,17,0,0,0,0,0,0,0,0,0,0,0 -18055,Greene County,IN,18,0,0,0,0,0,0,0,0,0,0,0 -19047,Crawford County,IA,19,0,0,0,0,0,0,0,0,0,0,0 -19063,Emmet County,IA,19,0,0,0,0,0,0,0,0,0,0,0 -19159,Ringgold County,IA,19,0,0,0,0,0,0,0,0,0,0,0 -20053,Ellsworth County,KS,20,0,0,0,0,0,0,0,0,0,0,0 -20179,Sheridan County,KS,20,0,0,0,0,0,0,0,0,0,0,0 -21037,Campbell County,KY,21,0,0,0,0,0,0,0,0,0,0,0 -21045,Casey County,KY,21,0,0,0,0,0,0,0,0,0,0,0 -21101,Henderson County,KY,21,0,0,0,0,0,0,0,0,0,0,0 -21171,Monroe County,KY,21,0,0,0,0,0,0,0,0,0,0,0 -21207,Russell County,KY,21,0,0,0,0,0,0,0,0,0,0,0 -21211,Shelby County,KY,21,0,0,0,0,0,0,0,0,0,0,0 -22023,Cameron Parish,LA,22,0,0,0,0,0,0,0,0,0,0,0 -22073,Ouachita Parish,LA,22,0,0,0,0,0,0,0,0,0,0,0 -22079,Rapides Parish,LA,22,0,0,0,0,0,0,0,0,0,0,0 -22081,Red River Parish,LA,22,0,0,0,0,0,0,0,0,0,0,0 -24023,Garrett County,MD,24,0,0,0,0,0,0,0,0,0,0,0 -25025,Suffolk County,MA,25,0,0,0,0,0,0,0,0,0,0,0 -26047,Emmet County,MI,26,0,0,0,0,0,0,0,0,0,0,0 -26069,Iosco County,MI,26,0,0,0,0,0,0,0,0,0,0,0 -27025,Chisago County,MN,27,0,0,0,0,0,0,0,0,0,0,0 -28001,Adams County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28005,Amite County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28039,George County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28041,Greene County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28045,Hancock County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28047,Harrison County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28051,Holmes County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28059,Jackson County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28107,Panola County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28109,Pearl River County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -28131,Stone County,MS,28,0,0,0,0,0,0,0,0,0,0,0 -29011,Barton County,MO,29,0,0,0,0,0,0,0,0,0,0,0 -29057,Dade County,MO,29,0,0,0,0,0,0,0,0,0,0,0 -29125,Maries County,MO,29,0,0,0,0,0,0,0,0,0,0,0 -29213,Taney County,MO,29,0,0,0,0,0,0,0,0,0,0,0 -30095,Stillwater County,MT,30,0,0,0,0,0,0,0,0,0,0,0 -31029,Chase County,NE,31,0,0,0,0,0,0,0,0,0,0,0 -31057,Dundy County,NE,31,0,0,0,0,0,0,0,0,0,0,0 -31105,Kimball County,NE,31,0,0,0,0,0,0,0,0,0,0,0 -31115,Loup County,NE,31,0,0,0,0,0,0,0,0,0,0,0 -31165,Sioux County,NE,31,0,0,0,0,0,0,0,0,0,0,0 -32001,Churchill County,NV,32,0,0,0,0,0,0,0,0,0,0,0 -32510,Carson City,NV,32,0,0,0,0,0,0,0,0,0,0,0 -33003,Carroll County,NH,33,0,0,0,0,0,0,0,0,0,0,0 -35045,San Juan County,NM,35,0,0,0,0,0,0,0,0,0,0,0 -1,New York City Unallocated/Probable,NY,36,0,0,0,0,0,0,0,0,0,0,0 -36005,Bronx County,NY,36,0,0,0,0,0,0,0,0,0,0,0 -36009,Cattaraugus County,NY,36,0,0,0,0,0,0,0,0,0,0,0 -36035,Fulton County,NY,36,0,0,0,0,0,0,0,0,0,0,0 -36047,Kings County,NY,36,0,0,0,0,0,0,0,0,0,0,0 -36061,New York County,NY,36,0,0,0,0,0,0,0,0,0,0,0 -36081,Queens County,NY,36,0,0,0,0,0,0,0,0,0,0,0 -36085,Richmond County,NY,36,0,0,0,0,0,0,0,0,0,0,0 -36093,Schenectady County,NY,36,0,0,0,0,0,0,0,0,0,0,0 -37135,Orange County,NC,37,0,0,0,0,0,0,0,0,0,0,0 -38019,Cavalier County,ND,38,0,0,0,0,0,0,0,0,0,0,0 -38031,Foster County,ND,38,0,0,0,0,0,0,0,0,0,0,0 -39075,Holmes County,OH,39,0,0,0,0,0,0,0,0,0,0,0 -40045,Ellis County,OK,40,0,0,0,0,0,0,0,0,0,0,0 -40059,Harper County,OK,40,0,0,0,0,0,0,0,0,0,0,0 -40061,Haskell County,OK,40,0,0,0,0,0,0,0,0,0,0,0 -40079,Le Flore County,OK,40,0,0,0,0,0,0,0,0,0,0,0 -41013,Crook County,OR,41,0,0,0,0,0,0,0,0,0,0,0 -41015,Curry County,OR,41,0,0,0,0,0,0,0,0,0,0,0 -41045,Malheur County,OR,41,0,0,0,0,0,0,0,0,0,0,0 -46021,Campbell County,SD,46,0,0,0,0,0,0,0,0,0,0,0 -46063,Harding County,SD,46,0,0,0,0,0,0,0,0,0,0,0 -46102,Oglala Lakota County,SD,46,0,0,0,0,0,0,0,0,0,0,0 -47031,Coffee County,TN,47,0,0,0,0,0,0,0,0,0,0,0 -47077,Henderson County,TN,47,0,0,0,0,0,0,0,0,0,0,0 -47099,Lawrence County,TN,47,0,0,0,0,0,0,0,0,0,0,0 -47113,Madison County,TN,47,0,0,0,0,0,0,0,0,0,0,0 -47177,Warren County,TN,47,0,0,0,0,0,0,0,0,0,0,0 -47187,Williamson County,TN,47,0,0,0,0,0,0,0,0,0,0,0 -48021,Bastrop County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48059,Callahan County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48061,Cameron County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48143,Erath County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48151,Fisher County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48173,Glasscock County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48263,Kent County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48303,Lubbock County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48365,Panola County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48411,San Saba County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48425,Somervell County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48449,Titus County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -48495,Winkler County,TX,48,0,0,0,0,0,0,0,0,0,0,0 -50005,Caledonia County,VT,50,0,0,0,0,0,0,0,0,0,0,0 -50027,Windsor County,VT,50,0,0,0,0,0,0,0,0,0,0,0 -51005,Alleghany County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51015,Augusta County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51025,Brunswick County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51043,Clarke County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51059,Fairfax County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51067,Franklin County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51081,Greensville County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51089,Henry County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51093,Isle of Wight County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51131,Northampton County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51153,Prince William County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51163,Rockbridge County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51175,Southampton County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51183,Sussex County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51195,Wise County,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51520,Bristol city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51540,Charlottesville city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51580,Covington city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51595,Emporia city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51600,Fairfax city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51620,Franklin city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51678,Lexington city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51685,Manassas Park city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -51690,Martinsville city,VA,51,0,0,0,0,0,0,0,0,0,0,0 -53063,Spokane County,WA,53,0,0,0,0,0,0,0,0,0,0,0 -54015,Clay County,WV,54,0,0,0,0,0,0,0,0,0,0,0 -54033,Harrison County,WV,54,0,0,0,0,0,0,0,0,0,0,0 -54087,Roane County,WV,54,0,0,0,0,0,0,0,0,0,0,0 -55009,Brown County,WI,55,0,0,0,0,0,0,0,0,0,0,0 -55071,Manitowoc County,WI,55,0,0,0,0,0,0,0,0,0,0,0 -55107,Rusk County,WI,55,0,0,0,0,0,0,0,0,0,0,0 -55115,Shawano County,WI,55,0,0,0,0,0,0,0,0,0,0,0 \ No newline at end of file diff --git a/usafacts/tests/test_data/small_deaths_pull.csv b/usafacts/tests/test_data/small_deaths_pull.csv deleted file mode 100644 index 5b29b18f1..000000000 --- a/usafacts/tests/test_data/small_deaths_pull.csv +++ /dev/null @@ -1,5 +0,0 @@ -countyFIPS,County Name,State,stateFIPS,2/29/20,3/1/20,3/2/20 -1,New York City Unallocated/Probable,NY,36,0,0,1 -6000,Somewhere,NY,36,11,12,13 -2270,Place,NY,36,101,101,"1,0,2" -36009,City,NY,36,2,4,6 \ No newline at end of file diff --git a/usafacts/tests/test_geo.py b/usafacts/tests/test_geo.py deleted file mode 100644 index 43debc3b1..000000000 --- a/usafacts/tests/test_geo.py +++ /dev/null @@ -1,140 +0,0 @@ -import pytest - -import pandas as pd -import numpy as np -from delphi_utils.geomap import GeoMapper -from delphi_usafacts.geo import disburse, geo_map - -SENSOR = "new_counts" - -class TestDisburse: - """Tests for the `geo.disburse()` function.""" - def test_even(self): - """Tests that values are disbursed evenly across recipients.""" - df = pd.DataFrame( - { - "fips": ["51093", "51175", "51620"], - "timestamp": ["2020-02-15", "2020-02-15", "2020-02-15"], - "new_counts": [3, 2, 2], - "cumulative_counts": [13, 12, 12], - "population": [100, 2100, 300], - } - ).sort_values(["fips", "timestamp"]) - - new_df = disburse(df, "51620", ["51093", "51175"]) - - assert new_df["new_counts"].values == pytest.approx([4, 3, 2]) - assert new_df["cumulative_counts"].values == pytest.approx([19, 18, 12]) - - -class TestGeoMap: - """Tests for `geo.geo_map()`.""" - def test_incorrect_geo(self): - """Tests that an invalid resolution raises an error.""" - df = pd.DataFrame( - { - "fips": ["53003", "48027", "50103"], - "timestamp": ["2020-02-15", "2020-02-15", "2020-02-15"], - "new_counts": [10, 15, 2], - "cumulative_counts": [100, 20, 45], - } - ) - - with pytest.raises(ValueError): - geo_map(df, "département", SENSOR) - - def test_county(self): - """Tests that values are correctly aggregated at the county level.""" - df = pd.DataFrame( - { - "fips": ["53003", "48027", "50103"], - "timestamp": ["2020-02-15", "2020-02-15", "2020-02-15"], - "new_counts": [10, 15, 2], - "cumulative_counts": [100, 20, 45], - } - ) - new_df = geo_map(df, "county", SENSOR) - gmpr = GeoMapper() - df = gmpr.add_population_column(df, "fips") - exp_incidence = df["new_counts"] / df["population"] * 100000 - exp_cprop = df["cumulative_counts"] / df["population"] * 100000 - - assert set(new_df["geo_id"].values) == set(df["fips"].values) - assert set(new_df["timestamp"].values) == set(df["timestamp"].values) - assert set(new_df["incidence"].values) == set(exp_incidence.values) - assert set(new_df["cumulative_prop"].values) == set(exp_cprop.values) - - def test_state_hhs_nation(self): - """Tests that values are correctly aggregated at the state, HHS, and nation level.""" - df = pd.DataFrame( - { - "fips": ["04001", "04003", "04009", "25023", "25000"], - "timestamp": ["2020-02-15", "2020-02-15", "2020-02-15", "2020-02-15", "2020-02-15"], - "new_counts": [10, 15, 2, 13, 1], - "cumulative_counts": [100, 20, 45, 60, 1], - } - ) - - state_df = geo_map(df, "state", SENSOR) - gmpr = GeoMapper() - fips_pop = gmpr.get_crosswalk("fips", "pop") - pop04 = float(fips_pop.loc[fips_pop.fips.isin(["04001", "04003", "04009"]), "pop"].sum()) - pop25 = float(fips_pop.loc[fips_pop.fips.isin(["25023", "25000"]), "pop"].sum()) - expected_df = pd.DataFrame({ - "geo_id": ["az", "ma"], - "timestamp": ["2020-02-15"]*2, - "new_counts": [27, 14], - "cumulative_counts": [165, 61], - "population": [pop04, pop25], - "incidence": [27 / pop04 * 100000, 14 / pop25 * 100000], - "cumulative_prop": [165 / pop04 * 100000, 61 / pop25 * 100000] - }) - pd.testing.assert_frame_equal(state_df, expected_df) - - hhs_df = geo_map(df, "hhs", SENSOR) - hhs_pop = gmpr.replace_geocode(gmpr.add_geocode(df, "fips", "pop"), "fips", "hhs") - pop1 = float(hhs_pop.loc[hhs_pop.hhs == "1", "pop"]) - pop9 = float(hhs_pop.loc[hhs_pop.hhs == "9", "pop"]) - expected_df = pd.DataFrame({ - "geo_id": ["1", "9"], - "timestamp": ["2020-02-15"]*2, - "new_counts": [14, 27], - "cumulative_counts": [61, 165], - "population": [pop1, pop9], - "incidence": [14 / pop1 * 100000, 27 / pop9 * 100000], - "cumulative_prop": [61 / pop1 * 100000, 165 / pop9 * 100000] - }) - pd.testing.assert_frame_equal(hhs_df, expected_df) - - nation_df = geo_map(df, "nation", SENSOR) - nation_pop = gmpr.replace_geocode(gmpr.add_geocode(df, "fips", "pop"), "fips", "nation") - us_pop = float(nation_pop.loc[nation_pop.nation == "us", "pop"]) - expected_df = pd.DataFrame({ - "geo_id": ["us"], - "timestamp": ["2020-02-15"], - "new_counts": [41], - "cumulative_counts": [226], - "population": [us_pop], - "incidence": [41 / us_pop * 100000], - "cumulative_prop": [226 / us_pop * 100000] - }) - pd.testing.assert_frame_equal(nation_df, expected_df) - - def test_hrr_msa(self): - """Tests that values are correctly aggregated at the HRR and MSA level.""" - df = pd.DataFrame( - { - "fips": ["13009", "13017", "13021", "09015"], - "timestamp": ["2020-02-15", "2020-02-15", "2020-02-15", "2020-02-15"], - "new_counts": [10, 15, 2, 13], - "cumulative_counts": [100, 20, 45, 60], - } - ) - hrr_df = geo_map(df, "hrr", SENSOR) - msa_df = geo_map(df, "msa", SENSOR) - assert msa_df.shape == (2, 7) - gmpr = GeoMapper() - df = gmpr.add_population_column(df, "fips") - assert np.isclose(hrr_df.new_counts.sum(), df.new_counts.sum()) - assert np.isclose(hrr_df.population.sum(), df.population.sum()) - assert hrr_df.shape == (5, 7) diff --git a/usafacts/tests/test_pull.py b/usafacts/tests/test_pull.py deleted file mode 100644 index 327a53eb3..000000000 --- a/usafacts/tests/test_pull.py +++ /dev/null @@ -1,51 +0,0 @@ -import pytest -import logging -from unittest.mock import patch - -import pandas as pd - -from delphi_usafacts.pull import pull_usafacts_data - -from test_run import local_fetch - -BASE_URL_GOOD = "test_data/small_{metric}_pull.csv" - -BASE_URL_BAD = { - "missing_days": "test_data/bad_{metric}_missing_days.csv", - "missing_cols": "test_data/bad_{metric}_missing_cols.csv", - "extra_cols": "test_data/bad_{metric}_extra_cols.csv" -} - -TEST_LOGGER = logging.getLogger() - -@patch("delphi_usafacts.pull.fetch", local_fetch) -class TestPullUSAFacts: - def test_good_file(self): - metric = "deaths" - df = pull_usafacts_data(BASE_URL_GOOD, metric, TEST_LOGGER) - expected_df = pd.DataFrame({ - "fips": ["00001", "00001", "00001", "36009", "36009", "36009"], - "timestamp": [pd.Timestamp("2020-02-29"), pd.Timestamp("2020-03-01"), - pd.Timestamp("2020-03-02"), pd.Timestamp("2020-02-29"), - pd.Timestamp("2020-03-01"), pd.Timestamp("2020-03-02")], - "new_counts": [0., 0., 1., 2., 2., 2.], - "cumulative_counts": [0, 0, 1, 2, 4, 6]}, - index=[1, 2, 3, 5, 6, 7]) - # sort since rows order doesn't matter - pd.testing.assert_frame_equal(df.sort_index(), expected_df.sort_index()) - - def test_missing_cols(self): - - metric = "confirmed" - with pytest.raises(ValueError): - pull_usafacts_data( - BASE_URL_BAD["missing_cols"], metric, TEST_LOGGER - ) - - def test_extra_cols(self): - - metric = "confirmed" - with pytest.raises(ValueError): - pull_usafacts_data( - BASE_URL_BAD["extra_cols"], metric, TEST_LOGGER - ) diff --git a/usafacts/tests/test_run.py b/usafacts/tests/test_run.py deleted file mode 100644 index 20f4db47e..000000000 --- a/usafacts/tests/test_run.py +++ /dev/null @@ -1,75 +0,0 @@ -"""Tests for running the USAFacts 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_usafacts.run import run_module - -def local_fetch(url, cache): - return pd.read_csv(url) - -@patch("delphi_usafacts.pull.fetch", local_fetch) -class TestRun: - """Tests for the `run_module()` function.""" - PARAMS = { - "common": { - "export_dir": "./receiving", - "input_dir": "./input_cache" - }, - "indicator": { - "base_url": "./test_data/small_{metric}.csv", - "export_start_date": "2020-02-29" - } - } - - 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 = [ - "20200229", - "20200301", - "20200302", - "20200303", - "20200304", - "20200305", - "20200306", - "20200307", - "20200308", - "20200309", - "20200310", - ] - geos = ["county", "hrr", "msa", "state", "hhs", "nation"] - - # enumerate metric names. - metrics = [] - for event, span, stat in product(["deaths", "confirmed"], - ["cumulative", "incidence"], - ["num", "prop"]): - metrics.append("_".join([event, span, stat])) - metrics.append("_".join([event, "7dav", span, stat])) - - expected_files = [] - for date in dates: - for geo in geos: - for metric in metrics: - if "7dav" in metric and date in dates[:6]: - continue # there are no 7dav signals for first 6 days - if "7dav" in metric and "cumulative" in metric: - continue - expected_files += [date + "_" + geo + "_" + metric + ".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", "20200310_state_confirmed_cumulative_num.csv") - ) - assert (df.columns.values == ["geo_id", "val", "se", "sample_size"]).all()