From 9be4c9fb2e151ffd53a20aadb67146d7dd4d70a9 Mon Sep 17 00:00:00 2001 From: Jingjing Tang Date: Mon, 18 Jul 2022 19:17:02 -0400 Subject: [PATCH 01/20] store backfill file --- .../delphi_quidel_covidtest/pull.py | 38 +++++++++++++++++++ .../delphi_quidel_covidtest/run.py | 7 +++- quidel_covidtest/params.json.template | 1 + 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/quidel_covidtest/delphi_quidel_covidtest/pull.py b/quidel_covidtest/delphi_quidel_covidtest/pull.py index ab397ce47..f136e217b 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/pull.py +++ b/quidel_covidtest/delphi_quidel_covidtest/pull.py @@ -8,8 +8,12 @@ import pandas as pd import numpy as np +from delphi_utils import GeoMapper + from .constants import AGE_GROUPS +gmpr = GeoMapper() + def get_from_s3(start_date, end_date, bucket, logger): """ Get raw data from aws s3 bucket. @@ -57,6 +61,8 @@ def get_from_s3(start_date, end_date, bucket, logger): # Fetch data received on the same day for fn in s3_files[search_date]: + if ".csv" not in fn: + continue #Add to avoid that the folder name was readed as a fn. if fn in set(df["fname"].values): continue obj = bucket.Object(key=fn) @@ -370,3 +376,35 @@ def update_cache_file(df, _end_date, cache_dir): if ".csv" in fn: os.remove(join(cache_dir, fn)) df.to_csv(join(cache_dir, "pulled_until_%s.csv") % _end_date.strftime("%Y%m%d"), index=False) + +def store_backfill_file(df, _end_date, backfill_dir): + """ + Store county level backfill data into backfill_dir. + + Parameter: + df: pd.DataFrame + Pre-process file at ZipCode level + _end_date: + The most recent date when the raw data is received + backfill_dir: + specified path to store backfill files. + """ + backfilldata = df.copy() + backfilldata = gmpr.replace_geocode(backfilldata, from_code="zip", new_code="fips", + from_col="zip", new_col="fips", date_col="timestamp") + backfilldata.rename({"timestamp": "time_value"}, axis=1, inplace=True) + _start_date = _end_date.replace(year=_end_date.year-1) + selected_columns = ['time_value', 'fips', + 'totalTest_total', 'positiveTest_total', + 'positiveTest_age_0_4', 'totalTest_age_0_4', + 'positiveTest_age_5_17', 'totalTest_age_5_17', + 'positiveTest_age_18_49', 'totalTest_age_18_49', + 'positiveTest_age_50_64', 'totalTest_age_50_64', + 'positiveTest_age_65plus', 'totalTest_age_65plus', + 'positiveTest_age_0_17', 'totalTest_age_0_17'] + backfilldata = backfilldata.loc[backfilldata["time_value"] >= _start_date, + selected_columns] + path = backfill_dir + \ + "/quidel_covidtest_as_of_%s"%datetime.strftime(_end_date, "%Y%m%d") + ".parquet" + # Store intermediate file into the backfill folder + backfilldata.to_parquet(path) diff --git a/quidel_covidtest/delphi_quidel_covidtest/run.py b/quidel_covidtest/delphi_quidel_covidtest/run.py index fb1a69ac2..bf9289143 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/run.py +++ b/quidel_covidtest/delphi_quidel_covidtest/run.py @@ -25,7 +25,8 @@ from .pull import (pull_quidel_covidtest, check_export_start_date, check_export_end_date, - update_cache_file) + update_cache_file, + store_backfill_file) def log_exit(start_time, stats, logger): @@ -85,6 +86,7 @@ def run_module(params: Dict[str, Any]): stats = [] atexit.register(log_exit, start_time, stats, logger) cache_dir = params["indicator"]["input_cache_dir"] + backfill_dir = params["indicator"]["backfill_dir"] export_dir = params["common"]["export_dir"] export_start_date = params["indicator"]["export_start_date"] export_end_date = params["indicator"]["export_end_date"] @@ -95,6 +97,9 @@ def run_module(params: Dict[str, Any]): if _end_date is None: logger.info("The data is up-to-date. Currently, no new data to be ingested.") return + else: + # Store the backfill intermediate file + store_backfill_file(df, _end_date, backfill_dir) export_end_date = check_export_end_date( export_end_date, _end_date, END_FROM_TODAY_MINUS) export_start_date = check_export_start_date( diff --git a/quidel_covidtest/params.json.template b/quidel_covidtest/params.json.template index e96d2ccbc..ad1755252 100644 --- a/quidel_covidtest/params.json.template +++ b/quidel_covidtest/params.json.template @@ -7,6 +7,7 @@ "indicator": { "static_file_dir": "./static", "input_cache_dir": "./cache", + "backfill_dir": "./backfill", "export_start_date": "2020-05-26", "export_end_date": "", "pull_start_date": "2020-05-26", From c943a2ca250c08b885d26f3c583fb762bb0e11fb Mon Sep 17 00:00:00 2001 From: Jingjing Tang Date: Mon, 18 Jul 2022 19:34:46 -0400 Subject: [PATCH 02/20] add pyarrow as a necessary package --- quidel_covidtest/setup.py | 1 + quidel_covidtest/tests/test_run.py | 1 + 2 files changed, 2 insertions(+) diff --git a/quidel_covidtest/setup.py b/quidel_covidtest/setup.py index 4c01e8593..369ac30c0 100644 --- a/quidel_covidtest/setup.py +++ b/quidel_covidtest/setup.py @@ -4,6 +4,7 @@ required = [ "numpy", "pandas", + "pyarrow", "pydocstyle", "pytest", "pytest-cov", diff --git a/quidel_covidtest/tests/test_run.py b/quidel_covidtest/tests/test_run.py index d9e28108a..16ff0e7bd 100644 --- a/quidel_covidtest/tests/test_run.py +++ b/quidel_covidtest/tests/test_run.py @@ -21,6 +21,7 @@ class TestRun: "indicator": { "static_file_dir": "../static", "input_cache_dir": "./cache", + "backfill_dir": "./backfill", "export_start_date": "2020-06-30", "export_end_date": "", "pull_start_date": "2020-07-09", From 371f85d56e8a3b8da816e0d8e41047cc9be54cbd Mon Sep 17 00:00:00 2001 From: Jingjing Tang Date: Mon, 18 Jul 2022 21:16:10 -0400 Subject: [PATCH 03/20] fix linting errors --- quidel_covidtest/delphi_quidel_covidtest/pull.py | 8 ++++---- quidel_covidtest/delphi_quidel_covidtest/run.py | 5 ++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/quidel_covidtest/delphi_quidel_covidtest/pull.py b/quidel_covidtest/delphi_quidel_covidtest/pull.py index f136e217b..91607c91b 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/pull.py +++ b/quidel_covidtest/delphi_quidel_covidtest/pull.py @@ -394,17 +394,17 @@ def store_backfill_file(df, _end_date, backfill_dir): from_col="zip", new_col="fips", date_col="timestamp") backfilldata.rename({"timestamp": "time_value"}, axis=1, inplace=True) _start_date = _end_date.replace(year=_end_date.year-1) - selected_columns = ['time_value', 'fips', - 'totalTest_total', 'positiveTest_total', + selected_columns = ['time_value', 'fips', + 'totalTest_total', 'positiveTest_total', 'positiveTest_age_0_4', 'totalTest_age_0_4', 'positiveTest_age_5_17', 'totalTest_age_5_17', 'positiveTest_age_18_49', 'totalTest_age_18_49', 'positiveTest_age_50_64', 'totalTest_age_50_64', 'positiveTest_age_65plus', 'totalTest_age_65plus', 'positiveTest_age_0_17', 'totalTest_age_0_17'] - backfilldata = backfilldata.loc[backfilldata["time_value"] >= _start_date, + backfilldata = backfilldata.loc[backfilldata["time_value"] >= _start_date, selected_columns] path = backfill_dir + \ "/quidel_covidtest_as_of_%s"%datetime.strftime(_end_date, "%Y%m%d") + ".parquet" # Store intermediate file into the backfill folder - backfilldata.to_parquet(path) + backfilldata.to_parquet(path) diff --git a/quidel_covidtest/delphi_quidel_covidtest/run.py b/quidel_covidtest/delphi_quidel_covidtest/run.py index bf9289143..db92a7722 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/run.py +++ b/quidel_covidtest/delphi_quidel_covidtest/run.py @@ -97,9 +97,8 @@ def run_module(params: Dict[str, Any]): if _end_date is None: logger.info("The data is up-to-date. Currently, no new data to be ingested.") return - else: - # Store the backfill intermediate file - store_backfill_file(df, _end_date, backfill_dir) + # Store the backfill intermediate file + store_backfill_file(df, _end_date, backfill_dir) export_end_date = check_export_end_date( export_end_date, _end_date, END_FROM_TODAY_MINUS) export_start_date = check_export_start_date( From 36c714cb85542b3cd8537b7cd8c4cfd3b4bb2eaa Mon Sep 17 00:00:00 2001 From: Jingjing Tang Date: Mon, 18 Jul 2022 21:27:44 -0400 Subject: [PATCH 04/20] add the backfill folder for the unit test --- quidel_covidtest/tests/backfill/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 quidel_covidtest/tests/backfill/.gitignore diff --git a/quidel_covidtest/tests/backfill/.gitignore b/quidel_covidtest/tests/backfill/.gitignore new file mode 100644 index 000000000..afed0735d --- /dev/null +++ b/quidel_covidtest/tests/backfill/.gitignore @@ -0,0 +1 @@ +*.csv From 67bf5103325614c73bef6bc692772a22b9ffa24c Mon Sep 17 00:00:00 2001 From: Jingjing Tang Date: Mon, 18 Jul 2022 21:49:33 -0400 Subject: [PATCH 05/20] update the comment for the params argument --- quidel_covidtest/delphi_quidel_covidtest/run.py | 1 + 1 file changed, 1 insertion(+) diff --git a/quidel_covidtest/delphi_quidel_covidtest/run.py b/quidel_covidtest/delphi_quidel_covidtest/run.py index db92a7722..411999d9c 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/run.py +++ b/quidel_covidtest/delphi_quidel_covidtest/run.py @@ -67,6 +67,7 @@ def run_module(params: Dict[str, Any]): - indicator": - "static_file_dir": str, directory name with population information - "input_cache_dir": str, directory in which to cache input data + - "backfill_dir": str, directory in which to store the backfill files - "export_start_date": str, YYYY-MM-DD format of earliest date to create output - "export_end_date": str, YYYY-MM-DD format of latest date to create output or "" to create through the present From 0c4daaf15782eeeb0dadcd22c4c32643030597f3 Mon Sep 17 00:00:00 2001 From: Jingjing Tang Date: Wed, 3 Aug 2022 23:35:13 -0400 Subject: [PATCH 06/20] update code for backfill --- .../delphi_quidel_covidtest/pull.py | 65 ++++++++++++++++++- .../delphi_quidel_covidtest/run.py | 8 ++- quidel_covidtest/params.json.template | 1 + 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/quidel_covidtest/delphi_quidel_covidtest/pull.py b/quidel_covidtest/delphi_quidel_covidtest/pull.py index 91607c91b..eed41316f 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/pull.py +++ b/quidel_covidtest/delphi_quidel_covidtest/pull.py @@ -2,6 +2,7 @@ """Collect and process Quidel export files.""" from os.path import join import os +import glob from datetime import datetime, timedelta import boto3 @@ -384,15 +385,16 @@ def store_backfill_file(df, _end_date, backfill_dir): Parameter: df: pd.DataFrame Pre-process file at ZipCode level - _end_date: + _end_date: datetime The most recent date when the raw data is received - backfill_dir: + backfill_dir: str specified path to store backfill files. """ backfilldata = df.copy() backfilldata = gmpr.replace_geocode(backfilldata, from_code="zip", new_code="fips", from_col="zip", new_col="fips", date_col="timestamp") backfilldata.rename({"timestamp": "time_value"}, axis=1, inplace=True) + #Store one year's backfill data _start_date = _end_date.replace(year=_end_date.year-1) selected_columns = ['time_value', 'fips', 'totalTest_total', 'positiveTest_total', @@ -405,6 +407,63 @@ def store_backfill_file(df, _end_date, backfill_dir): backfilldata = backfilldata.loc[backfilldata["time_value"] >= _start_date, selected_columns] path = backfill_dir + \ - "/quidel_covidtest_as_of_%s"%datetime.strftime(_end_date, "%Y%m%d") + ".parquet" + "/quidel_covidtest_as_of_%s.parquet"%datetime.strftime(_end_date, "%Y%m%d") # Store intermediate file into the backfill folder backfilldata.to_parquet(path) + +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 + + Parameters + ---------- + _end_date : 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 + "/quidel_covidtest_as_of_*") + + 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 + "/quidel_covidtest_from_%s_to_%s.parquet"%( + datetime.strftime(earliest_date, "%Y%m%d"), + datetime.strftime(latest_date, "%Y%m%d")) + merged_file.to_parquet(path) + + # 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/quidel_covidtest/delphi_quidel_covidtest/run.py b/quidel_covidtest/delphi_quidel_covidtest/run.py index 411999d9c..c18a543ed 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/run.py +++ b/quidel_covidtest/delphi_quidel_covidtest/run.py @@ -26,7 +26,8 @@ check_export_start_date, check_export_end_date, update_cache_file, - store_backfill_file) + store_backfill_file, + merge_backfill_file) def log_exit(start_time, stats, logger): @@ -88,6 +89,7 @@ def run_module(params: Dict[str, Any]): atexit.register(log_exit, start_time, stats, logger) cache_dir = params["indicator"]["input_cache_dir"] backfill_dir = params["indicator"]["backfill_dir"] + backfill_merge_day = params["indicator"]["backfill_merge_day"] export_dir = params["common"]["export_dir"] export_start_date = params["indicator"]["export_start_date"] export_end_date = params["indicator"]["export_end_date"] @@ -95,6 +97,10 @@ def run_module(params: Dict[str, Any]): # Pull data and update export date df, _end_date = pull_quidel_covidtest(params["indicator"], logger) + # Merge 4 weeks' data into one file to save runtime + # Notice that here we don't check the _end_date(receive date) + # since we always want such merging happens on a certain day of a week + merge_backfill_file(backfill_dir, backfill_merge_day, datetime.today()) if _end_date is None: logger.info("The data is up-to-date. Currently, no new data to be ingested.") return diff --git a/quidel_covidtest/params.json.template b/quidel_covidtest/params.json.template index ad1755252..d05ecd25e 100644 --- a/quidel_covidtest/params.json.template +++ b/quidel_covidtest/params.json.template @@ -8,6 +8,7 @@ "static_file_dir": "./static", "input_cache_dir": "./cache", "backfill_dir": "./backfill", + "backfill_merge_day": 0, "export_start_date": "2020-05-26", "export_end_date": "", "pull_start_date": "2020-05-26", From 7ab17e8969938755f4fa4164ff747e2f4db4cc49 Mon Sep 17 00:00:00 2001 From: Jingjing Tang Date: Wed, 3 Aug 2022 23:35:39 -0400 Subject: [PATCH 07/20] fx unit tests --- quidel_covidtest/tests/test_pull.py | 71 ++++++++++++++++++++++++++++- quidel_covidtest/tests/test_run.py | 1 + 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/quidel_covidtest/tests/test_pull.py b/quidel_covidtest/tests/test_pull.py index ae35fc68f..df1cbde7b 100644 --- a/quidel_covidtest/tests/test_pull.py +++ b/quidel_covidtest/tests/test_pull.py @@ -1,4 +1,6 @@ import logging +import os +import glob from datetime import datetime import pandas as pd @@ -9,7 +11,9 @@ pull_quidel_covidtest, check_intermediate_file, check_export_end_date, - check_export_start_date + check_export_start_date, + store_backfill_file, + merge_backfill_file ) from delphi_quidel_covidtest.constants import AGE_GROUPS @@ -17,6 +21,7 @@ EXPORT_DAY_RANGE = 40 TEST_LOGGER = logging.getLogger() +backfill_dir="./backfill" class TestFixData: def test_fix_zipcode(self): @@ -103,3 +108,67 @@ def test_check_export_start_date(self): expected = [datetime(2020, 5, 26), datetime(2020, 6, 20), datetime(2020, 5, 26)] assert tested == expected + + def store_backfill_file(self): + df, _end_date = pull_quidel_covidtest({ + "static_file_dir": "../static", + "input_cache_dir": "./cache", + "export_start_date": "2020-06-30", + "export_end_date": "", + "pull_start_date": "2020-07-09", + "pull_end_date":"", + "aws_credentials": { + "aws_access_key_id": "", + "aws_secret_access_key": "" + }, + "bucket_name": "", + "wip_signal": "", + "test_mode": True + }, TEST_LOGGER) + + store_backfill_file(df, _end_date, backfill_dir) + fn = "quidel_covidtest_as_of_20200817.parquet" + backfill_df = pd.read_parquet(backfill_dir + "/"+ fn, engine='pyarrow') + + selected_columns = ['time_value', 'fips', + 'totalTest_total', 'positiveTest_total', + 'positiveTest_age_0_4', 'totalTest_age_0_4', + 'positiveTest_age_5_17', 'totalTest_age_5_17', + 'positiveTest_age_18_49', 'totalTest_age_18_49', + 'positiveTest_age_50_64', 'totalTest_age_50_64', + 'positiveTest_age_65plus', 'totalTest_age_65plus', + 'positiveTest_age_0_17', 'totalTest_age_0_17'] + assert set(selected_columns) == set(backfill_df.columns) + + def test_merge_backfill_file(self): + + today = datetime.today() + new_files = glob.glob(backfill_dir + "/*.parquet") + fn = "quidel_covidtest_from_20200817_to_20200820.parquet" + assert fn not in os.listdir(backfill_dir) + + # Check the when the merged file is not generated + today = datetime(2020, 8, 20) + 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 + pdList = [] + for file in new_files: + df = pd.read_parquet(file, engine='pyarrow') + pdList.append(df) + expected = pd.concat(pdList).sort_values(["time_value", "fips"]) + + # Read the merged file + merged = pd.read_parquet(backfill_dir + "/" + fn, engine='pyarrow') + + 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/quidel_covidtest/tests/test_run.py b/quidel_covidtest/tests/test_run.py index 16ff0e7bd..4e15bea91 100644 --- a/quidel_covidtest/tests/test_run.py +++ b/quidel_covidtest/tests/test_run.py @@ -22,6 +22,7 @@ class TestRun: "static_file_dir": "../static", "input_cache_dir": "./cache", "backfill_dir": "./backfill", + "backfill_merge_day": 0, "export_start_date": "2020-06-30", "export_end_date": "", "pull_start_date": "2020-07-09", From f3049d324680eaced2f1498929f75b5e794315d4 Mon Sep 17 00:00:00 2001 From: Jingjing Tang Date: Wed, 3 Aug 2022 23:39:47 -0400 Subject: [PATCH 08/20] add backfill files for unit tests --- .../quidel_covidtest_as_of_20200817.parquet | Bin 0 -> 14543 bytes .../quidel_covidtest_as_of_20200818.parquet | Bin 0 -> 14543 bytes .../quidel_covidtest_as_of_20200819.parquet | Bin 0 -> 14543 bytes .../quidel_covidtest_as_of_20200820.parquet | Bin 0 -> 14543 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200817.parquet create mode 100644 quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200818.parquet create mode 100644 quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200819.parquet create mode 100644 quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200820.parquet diff --git a/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200817.parquet b/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200817.parquet new file mode 100644 index 0000000000000000000000000000000000000000..008b7f74cc8d4c86bcf991cc29a4968a08ff98fd GIT binary patch literal 14543 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 literal 0 HcmV?d00001 diff --git a/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200818.parquet b/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200818.parquet new file mode 100644 index 0000000000000000000000000000000000000000..008b7f74cc8d4c86bcf991cc29a4968a08ff98fd GIT binary patch literal 14543 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 literal 0 HcmV?d00001 diff --git a/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200819.parquet b/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200819.parquet new file mode 100644 index 0000000000000000000000000000000000000000..008b7f74cc8d4c86bcf991cc29a4968a08ff98fd GIT binary patch literal 14543 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 literal 0 HcmV?d00001 diff --git a/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200820.parquet b/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200820.parquet new file mode 100644 index 0000000000000000000000000000000000000000..008b7f74cc8d4c86bcf991cc29a4968a08ff98fd GIT binary patch literal 14543 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 literal 0 HcmV?d00001 From 199a47356953fade890c12f38e755885d7336408 Mon Sep 17 00:00:00 2001 From: Jingjing Tang Date: Thu, 4 Aug 2022 01:41:22 -0400 Subject: [PATCH 09/20] update column names' --- .../delphi_quidel_covidtest/pull.py | 33 +++++++++++++----- .../quidel_covidtest_as_of_20200817.parquet | Bin 14543 -> 13610 bytes .../quidel_covidtest_as_of_20200818.parquet | Bin 14543 -> 13603 bytes .../quidel_covidtest_as_of_20200819.parquet | Bin 14543 -> 13603 bytes .../quidel_covidtest_as_of_20200820.parquet | Bin 14543 -> 13603 bytes quidel_covidtest/tests/test_pull.py | 25 +++++++------ 6 files changed, 39 insertions(+), 19 deletions(-) diff --git a/quidel_covidtest/delphi_quidel_covidtest/pull.py b/quidel_covidtest/delphi_quidel_covidtest/pull.py index eed41316f..da516cd49 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/pull.py +++ b/quidel_covidtest/delphi_quidel_covidtest/pull.py @@ -393,17 +393,32 @@ def store_backfill_file(df, _end_date, backfill_dir): backfilldata = df.copy() backfilldata = gmpr.replace_geocode(backfilldata, from_code="zip", new_code="fips", from_col="zip", new_col="fips", date_col="timestamp") - backfilldata.rename({"timestamp": "time_value"}, axis=1, inplace=True) + backfilldata.rename({"timestamp": "time_value", + "totalTest_total": "den_total", + "positiveTest_total": "num_total", + "positiveTest_age_0_4": "num_age_0_4", + "totalTest_age_0_4": "den_age_0_4", + "positiveTest_age_5_17": "num_age_5_17", + "totalTest_age_5_17": "den_age_5_17", + "positiveTest_age_18_49": "num_age_18_49", + "totalTest_age_18_49": "den_age_18_49", + "positiveTest_age_50_64": "num_age_50_64", + "totalTest_age_50_64": "den_age_50_64", + "positiveTest_age_65plus": "num_age_65plus", + "totalTest_age_65plus": "den_age_65plus", + "positiveTest_age_0_17": "num_age_0_17", + "totalTest_age_0_17": "den_age_0_17"}, + axis=1, inplace=True) #Store one year's backfill data _start_date = _end_date.replace(year=_end_date.year-1) selected_columns = ['time_value', 'fips', - 'totalTest_total', 'positiveTest_total', - 'positiveTest_age_0_4', 'totalTest_age_0_4', - 'positiveTest_age_5_17', 'totalTest_age_5_17', - 'positiveTest_age_18_49', 'totalTest_age_18_49', - 'positiveTest_age_50_64', 'totalTest_age_50_64', - 'positiveTest_age_65plus', 'totalTest_age_65plus', - 'positiveTest_age_0_17', 'totalTest_age_0_17'] + 'den_total', 'num_total', + 'num_age_0_4', 'den_age_0_4', + 'num_age_5_17', 'den_age_5_17', + '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'] backfilldata = backfilldata.loc[backfilldata["time_value"] >= _start_date, selected_columns] path = backfill_dir + \ @@ -421,7 +436,7 @@ def merge_backfill_file(backfill_dir, backfill_merge_day, today, Parameters ---------- - _end_date : datetime + today : datetime The most recent date when the raw data is received backfill_dir : str specified path to store backfill files. diff --git a/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200817.parquet b/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200817.parquet index 008b7f74cc8d4c86bcf991cc29a4968a08ff98fd..0e730fd5a928c983f46722abc431f27e34e95e08 100644 GIT binary patch delta 3503 zcmbtVUrbY17>C=!6om=eS{y>ddk% z8QFtpTb4a6b1}|sJZ$0?XBIWvvMkO-v$(g#xIHY!WzHBM+(MR}@0@$vt1?};`*3^D zcfQ~E{qFC4zuU`uKivKCqM%+G8IF_Ubv-0s^^x&rUXdoJ(4o%AF4V1zPsIlI@7X^% zt`W3l+M_D%RRMjSi{2#1*11T9danFLK`MI{WDkxE4_F6kS^k|&?VU_CpN~$He2t3~ zWW8-Vp;hG5w)f><5wxcSbXbG#t|bXgBhh8=t+-m40<4xBI0kI>a);}g=&TOiT~BUP z#IC$7@>lj@)51mtN^X-xy(MU05zu@QI!<qu#<({Dq<-tpaQ>SKe{D_ zOCE_;J`yVK%L2ONMDxxf-HHr$ts^h0G{o`bR~0846M>Q#x*SrR7vtIu310&z-LHoauVBBVFma(UqnXUH`#_YyXD>ODa)17IZymy@2pt z!Q%THKF?IqDI~ua=~6BvgZk%G@Iiwp7=it9KvXZ=g8nfWs`Q5F^TXqjf%sr-*sw)! z0LVKVx9jEcUp5K4(Ii%XzW6Ej`%K9W#sb!`PuEb4{iQHdF5l}?$xegZ>mSmf8ckze zF6fKc?+yJ<)&Dr4sFz)obF?P>jnj6J!kVMyXgRX738RPaDDzi9-DRvvIyP$~M zNpE-*Zq2k1y~FK5*PO)yOMe?AB`5$cc;*))(9#ec>~oBTf}_!}H&7Gmn~iqR7-Z1S zl+g$lXMl-x^|Id%OVnbaPa>XWYj`z20Bi|3jNvGygPRG?g_`YbudCi^u>j#V?C-Km z3_BPr-X%qlN<(FVv1u3$)dVOp=d6#tAU+@waO2jV2J%{caiW&yiZC?M{=Ud~aIW7r zi2qPr%?xkAwLlEQXdM?k1*ld}8q~1PASLi+4+2XWzvW{W1%zL;? zs^?e8{V;EZ-aVsHpJ$Ag7WYa7-1yl!&Ku4_sW&~Io*|%t<4NA0k;m|6bE43j8JrdI zZA7w5pHprZJDyjl^0eBYoWG^qWOZ*^k+`3lN|*y-3{I Ozapb7Bcls<+x`ZwSmNIR literal 14543 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 diff --git a/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200818.parquet b/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200818.parquet index 008b7f74cc8d4c86bcf991cc29a4968a08ff98fd..81836d65261903ec20da6ca4d419dd8a1d98ad61 100644 GIT binary patch literal 13603 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 diff --git a/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200819.parquet b/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200819.parquet index 008b7f74cc8d4c86bcf991cc29a4968a08ff98fd..81836d65261903ec20da6ca4d419dd8a1d98ad61 100644 GIT binary patch literal 13603 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 diff --git a/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200820.parquet b/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200820.parquet index 008b7f74cc8d4c86bcf991cc29a4968a08ff98fd..81836d65261903ec20da6ca4d419dd8a1d98ad61 100644 GIT binary patch literal 13603 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 diff --git a/quidel_covidtest/tests/test_pull.py b/quidel_covidtest/tests/test_pull.py index df1cbde7b..27ba1a55d 100644 --- a/quidel_covidtest/tests/test_pull.py +++ b/quidel_covidtest/tests/test_pull.py @@ -126,19 +126,24 @@ def store_backfill_file(self): "test_mode": True }, TEST_LOGGER) - store_backfill_file(df, _end_date, backfill_dir) - fn = "quidel_covidtest_as_of_20200817.parquet" + store_backfill_file(df, datetime(2020, 1, 1), backfill_dir) + fn = "quidel_covidtest_as_of_20200101.parquet" + assert fn in os.listdir(backfill_dir) + backfill_df = pd.read_parquet(backfill_dir + "/"+ fn, engine='pyarrow') selected_columns = ['time_value', 'fips', - 'totalTest_total', 'positiveTest_total', - 'positiveTest_age_0_4', 'totalTest_age_0_4', - 'positiveTest_age_5_17', 'totalTest_age_5_17', - 'positiveTest_age_18_49', 'totalTest_age_18_49', - 'positiveTest_age_50_64', 'totalTest_age_50_64', - 'positiveTest_age_65plus', 'totalTest_age_65plus', - 'positiveTest_age_0_17', 'totalTest_age_0_17'] - assert set(selected_columns) == set(backfill_df.columns) + 'den_total', 'num_total', + 'num_age_0_4', 'den_age_0_4', + 'num_age_5_17', 'den_age_5_17', + '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'] + 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): From 190e21b6102a6c74efdce20e6f339d4920011526 Mon Sep 17 00:00:00 2001 From: Jingjing Tang Date: Thu, 4 Aug 2022 16:58:02 -0400 Subject: [PATCH 10/20] move all the backfill related functions to another script --- .../delphi_quidel_covidtest/backfill.py | 117 ++++++++++++++++++ .../delphi_quidel_covidtest/pull.py | 106 ---------------- .../delphi_quidel_covidtest/run.py | 6 +- quidel_covidtest/tests/test_backfill.py | 88 +++++++++++++ quidel_covidtest/tests/test_pull.py | 73 +---------- 5 files changed, 208 insertions(+), 182 deletions(-) create mode 100644 quidel_covidtest/delphi_quidel_covidtest/backfill.py create mode 100644 quidel_covidtest/tests/test_backfill.py diff --git a/quidel_covidtest/delphi_quidel_covidtest/backfill.py b/quidel_covidtest/delphi_quidel_covidtest/backfill.py new file mode 100644 index 000000000..7ca723130 --- /dev/null +++ b/quidel_covidtest/delphi_quidel_covidtest/backfill.py @@ -0,0 +1,117 @@ +# -*- coding: utf-8 -*- +"""Store backfill data.""" +import os +import glob +from datetime import datetime + +import pandas as pd + +from delphi_utils import GeoMapper + + +gmpr = GeoMapper() + +def store_backfill_file(df, _end_date, backfill_dir): + """ + Store county level backfill data into backfill_dir. + + Parameter: + df: pd.DataFrame + Pre-process file at ZipCode level + _end_date: datetime + The most recent date when the raw data is received + backfill_dir: str + specified path to store backfill files. + """ + backfilldata = df.copy() + backfilldata = gmpr.replace_geocode(backfilldata, from_code="zip", new_code="fips", + from_col="zip", new_col="fips", date_col="timestamp") + backfilldata.rename({"timestamp": "time_value", + "totalTest_total": "den_total", + "positiveTest_total": "num_total", + "positiveTest_age_0_4": "num_age_0_4", + "totalTest_age_0_4": "den_age_0_4", + "positiveTest_age_5_17": "num_age_5_17", + "totalTest_age_5_17": "den_age_5_17", + "positiveTest_age_18_49": "num_age_18_49", + "totalTest_age_18_49": "den_age_18_49", + "positiveTest_age_50_64": "num_age_50_64", + "totalTest_age_50_64": "den_age_50_64", + "positiveTest_age_65plus": "num_age_65plus", + "totalTest_age_65plus": "den_age_65plus", + "positiveTest_age_0_17": "num_age_0_17", + "totalTest_age_0_17": "den_age_0_17"}, + axis=1, inplace=True) + #Store one year's backfill data + _start_date = _end_date.replace(year=_end_date.year-1) + selected_columns = ['time_value', 'fips', + 'den_total', 'num_total', + 'num_age_0_4', 'den_age_0_4', + 'num_age_5_17', 'den_age_5_17', + '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'] + backfilldata = backfilldata.loc[backfilldata["time_value"] >= _start_date, + selected_columns] + path = backfill_dir + \ + "/quidel_covidtest_as_of_%s.parquet"%datetime.strftime(_end_date, "%Y%m%d") + # Store intermediate file into the backfill folder + backfilldata.to_parquet(path) + +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 + + 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 + "/quidel_covidtest_as_of_*") + + 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 + "/quidel_covidtest_from_%s_to_%s.parquet"%( + datetime.strftime(earliest_date, "%Y%m%d"), + datetime.strftime(latest_date, "%Y%m%d")) + merged_file.to_parquet(path) + + # 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/quidel_covidtest/delphi_quidel_covidtest/pull.py b/quidel_covidtest/delphi_quidel_covidtest/pull.py index da516cd49..c2357b64b 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/pull.py +++ b/quidel_covidtest/delphi_quidel_covidtest/pull.py @@ -2,7 +2,6 @@ """Collect and process Quidel export files.""" from os.path import join import os -import glob from datetime import datetime, timedelta import boto3 @@ -377,108 +376,3 @@ def update_cache_file(df, _end_date, cache_dir): if ".csv" in fn: os.remove(join(cache_dir, fn)) df.to_csv(join(cache_dir, "pulled_until_%s.csv") % _end_date.strftime("%Y%m%d"), index=False) - -def store_backfill_file(df, _end_date, backfill_dir): - """ - Store county level backfill data into backfill_dir. - - Parameter: - df: pd.DataFrame - Pre-process file at ZipCode level - _end_date: datetime - The most recent date when the raw data is received - backfill_dir: str - specified path to store backfill files. - """ - backfilldata = df.copy() - backfilldata = gmpr.replace_geocode(backfilldata, from_code="zip", new_code="fips", - from_col="zip", new_col="fips", date_col="timestamp") - backfilldata.rename({"timestamp": "time_value", - "totalTest_total": "den_total", - "positiveTest_total": "num_total", - "positiveTest_age_0_4": "num_age_0_4", - "totalTest_age_0_4": "den_age_0_4", - "positiveTest_age_5_17": "num_age_5_17", - "totalTest_age_5_17": "den_age_5_17", - "positiveTest_age_18_49": "num_age_18_49", - "totalTest_age_18_49": "den_age_18_49", - "positiveTest_age_50_64": "num_age_50_64", - "totalTest_age_50_64": "den_age_50_64", - "positiveTest_age_65plus": "num_age_65plus", - "totalTest_age_65plus": "den_age_65plus", - "positiveTest_age_0_17": "num_age_0_17", - "totalTest_age_0_17": "den_age_0_17"}, - axis=1, inplace=True) - #Store one year's backfill data - _start_date = _end_date.replace(year=_end_date.year-1) - selected_columns = ['time_value', 'fips', - 'den_total', 'num_total', - 'num_age_0_4', 'den_age_0_4', - 'num_age_5_17', 'den_age_5_17', - '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'] - backfilldata = backfilldata.loc[backfilldata["time_value"] >= _start_date, - selected_columns] - path = backfill_dir + \ - "/quidel_covidtest_as_of_%s.parquet"%datetime.strftime(_end_date, "%Y%m%d") - # Store intermediate file into the backfill folder - backfilldata.to_parquet(path) - -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 - - 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 + "/quidel_covidtest_as_of_*") - - 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 + "/quidel_covidtest_from_%s_to_%s.parquet"%( - datetime.strftime(earliest_date, "%Y%m%d"), - datetime.strftime(latest_date, "%Y%m%d")) - merged_file.to_parquet(path) - - # 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/quidel_covidtest/delphi_quidel_covidtest/run.py b/quidel_covidtest/delphi_quidel_covidtest/run.py index c18a543ed..4f7f7fc8e 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/run.py +++ b/quidel_covidtest/delphi_quidel_covidtest/run.py @@ -25,10 +25,8 @@ from .pull import (pull_quidel_covidtest, check_export_start_date, check_export_end_date, - update_cache_file, - store_backfill_file, - merge_backfill_file) - + update_cache_file) +from .backfill import (store_backfill_file, merge_backfill_file) def log_exit(start_time, stats, logger): """Log at program exit.""" diff --git a/quidel_covidtest/tests/test_backfill.py b/quidel_covidtest/tests/test_backfill.py new file mode 100644 index 000000000..b4a89ebe8 --- /dev/null +++ b/quidel_covidtest/tests/test_backfill.py @@ -0,0 +1,88 @@ +import logging +import os +import glob +from datetime import datetime + +import pandas as pd + +from delphi_quidel_covidtest.pull import pull_quidel_covidtest + +from delphi_quidel_covidtest.backfill import (store_backfill_file, + merge_backfill_file) + +END_FROM_TODAY_MINUS = 5 +EXPORT_DAY_RANGE = 40 + +TEST_LOGGER = logging.getLogger() +backfill_dir="./backfill" + +class TestBackfill: + + def test_store_backfill_file(self): + df, _end_date = pull_quidel_covidtest({ + "static_file_dir": "../static", + "input_cache_dir": "./cache", + "export_start_date": "2020-06-30", + "export_end_date": "", + "pull_start_date": "2020-07-09", + "pull_end_date":"", + "aws_credentials": { + "aws_access_key_id": "", + "aws_secret_access_key": "" + }, + "bucket_name": "", + "wip_signal": "", + "test_mode": True + }, TEST_LOGGER) + + store_backfill_file(df, datetime(2020, 1, 1), backfill_dir) + fn = "quidel_covidtest_as_of_20200101.parquet" + assert fn in os.listdir(backfill_dir) + + backfill_df = pd.read_parquet(backfill_dir + "/"+ fn, engine='pyarrow') + + selected_columns = ['time_value', 'fips', + 'den_total', 'num_total', + 'num_age_0_4', 'den_age_0_4', + 'num_age_5_17', 'den_age_5_17', + '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'] + 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() + new_files = glob.glob(backfill_dir + "/*.parquet") + fn = "quidel_covidtest_from_20200817_to_20200820.parquet" + assert fn not in os.listdir(backfill_dir) + + # Check the when the merged file is not generated + today = datetime(2020, 8, 20) + 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 + pdList = [] + for file in new_files: + df = pd.read_parquet(file, engine='pyarrow') + pdList.append(df) + expected = pd.concat(pdList).sort_values(["time_value", "fips"]) + + # Read the merged file + merged = pd.read_parquet(backfill_dir + "/" + fn, engine='pyarrow') + + 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/quidel_covidtest/tests/test_pull.py b/quidel_covidtest/tests/test_pull.py index 27ba1a55d..578401abf 100644 --- a/quidel_covidtest/tests/test_pull.py +++ b/quidel_covidtest/tests/test_pull.py @@ -11,9 +11,7 @@ pull_quidel_covidtest, check_intermediate_file, check_export_end_date, - check_export_start_date, - store_backfill_file, - merge_backfill_file + check_export_start_date ) from delphi_quidel_covidtest.constants import AGE_GROUPS @@ -21,7 +19,6 @@ EXPORT_DAY_RANGE = 40 TEST_LOGGER = logging.getLogger() -backfill_dir="./backfill" class TestFixData: def test_fix_zipcode(self): @@ -109,71 +106,3 @@ def test_check_export_start_date(self): assert tested == expected - def store_backfill_file(self): - df, _end_date = pull_quidel_covidtest({ - "static_file_dir": "../static", - "input_cache_dir": "./cache", - "export_start_date": "2020-06-30", - "export_end_date": "", - "pull_start_date": "2020-07-09", - "pull_end_date":"", - "aws_credentials": { - "aws_access_key_id": "", - "aws_secret_access_key": "" - }, - "bucket_name": "", - "wip_signal": "", - "test_mode": True - }, TEST_LOGGER) - - store_backfill_file(df, datetime(2020, 1, 1), backfill_dir) - fn = "quidel_covidtest_as_of_20200101.parquet" - assert fn in os.listdir(backfill_dir) - - backfill_df = pd.read_parquet(backfill_dir + "/"+ fn, engine='pyarrow') - - selected_columns = ['time_value', 'fips', - 'den_total', 'num_total', - 'num_age_0_4', 'den_age_0_4', - 'num_age_5_17', 'den_age_5_17', - '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'] - 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() - new_files = glob.glob(backfill_dir + "/*.parquet") - fn = "quidel_covidtest_from_20200817_to_20200820.parquet" - assert fn not in os.listdir(backfill_dir) - - # Check the when the merged file is not generated - today = datetime(2020, 8, 20) - 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 - pdList = [] - for file in new_files: - df = pd.read_parquet(file, engine='pyarrow') - pdList.append(df) - expected = pd.concat(pdList).sort_values(["time_value", "fips"]) - - # Read the merged file - merged = pd.read_parquet(backfill_dir + "/" + fn, engine='pyarrow') - - 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) - From bdd2a87a1667df6b7d03289be2c385b26ff2ea12 Mon Sep 17 00:00:00 2001 From: Jingjing Tang Date: Thu, 4 Aug 2022 16:58:40 -0400 Subject: [PATCH 11/20] remove unused import --- quidel_covidtest/tests/test_pull.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/quidel_covidtest/tests/test_pull.py b/quidel_covidtest/tests/test_pull.py index 578401abf..a3436392b 100644 --- a/quidel_covidtest/tests/test_pull.py +++ b/quidel_covidtest/tests/test_pull.py @@ -1,6 +1,4 @@ import logging -import os -import glob from datetime import datetime import pandas as pd From a9cb4915a773c18b69f88646e5dc3f07213b8ec7 Mon Sep 17 00:00:00 2001 From: Jingjing Tang Date: Fri, 12 Aug 2022 14:28:03 -0400 Subject: [PATCH 12/20] add issue_date and lag to backfill file --- quidel_covidtest/delphi_quidel_covidtest/backfill.py | 3 +++ quidel_covidtest/tests/test_backfill.py | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/quidel_covidtest/delphi_quidel_covidtest/backfill.py b/quidel_covidtest/delphi_quidel_covidtest/backfill.py index 7ca723130..9aed3e83f 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/backfill.py +++ b/quidel_covidtest/delphi_quidel_covidtest/backfill.py @@ -103,6 +103,9 @@ def get_date(file_link): pdList = [] for fn in new_files: df = pd.read_parquet(fn, engine='pyarrow') + issue_date = datetime.strptime(fn[-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) 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 b4a89ebe8..35d82bf12 100644 --- a/quidel_covidtest/tests/test_backfill.py +++ b/quidel_covidtest/tests/test_backfill.py @@ -74,12 +74,16 @@ def test_merge_backfill_file(self): pdList = [] for file in new_files: 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) 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] From 331a13817b2180b444bed28d908861888ce58504 Mon Sep 17 00:00:00 2001 From: Jingjing Tang <31444565+jingjtang@users.noreply.github.com> Date: Fri, 19 Aug 2022 21:04:22 -0400 Subject: [PATCH 13/20] Update ansible file for quidel_covidtest --- ansible/templates/quidel_covidtest-params-prod.json.j2 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ansible/templates/quidel_covidtest-params-prod.json.j2 b/ansible/templates/quidel_covidtest-params-prod.json.j2 index fe605206b..c8f7ebf49 100644 --- a/ansible/templates/quidel_covidtest-params-prod.json.j2 +++ b/ansible/templates/quidel_covidtest-params-prod.json.j2 @@ -10,6 +10,8 @@ "export_end_date": "", "pull_start_date": "2020-05-26", "pull_end_date":"", + "backfill_dir": "/common/backfill/quidel_covidtest", + "backfill_merge_day": 0, "export_day_range":40, "aws_credentials": { "aws_access_key_id": "{{ quidel_aws_access_key_id }}", From 7a71cce3951d98fb36745e3ea35fa8a8d6951d07 Mon Sep 17 00:00:00 2001 From: Jingjing Tang <31444565+jingjtang@users.noreply.github.com> Date: Fri, 19 Aug 2022 21:10:55 -0400 Subject: [PATCH 14/20] Use get_date() for issue_date --- quidel_covidtest/delphi_quidel_covidtest/backfill.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quidel_covidtest/delphi_quidel_covidtest/backfill.py b/quidel_covidtest/delphi_quidel_covidtest/backfill.py index 9aed3e83f..fa2b92ecb 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/backfill.py +++ b/quidel_covidtest/delphi_quidel_covidtest/backfill.py @@ -103,7 +103,7 @@ def get_date(file_link): pdList = [] for fn in new_files: df = pd.read_parquet(fn, engine='pyarrow') - issue_date = datetime.strptime(fn[-16:-8], "%Y%m%d") + 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) From 008daa4bb42289461056cc59d39a5a107fffa66c Mon Sep 17 00:00:00 2001 From: Jingjing Tang <31444565+jingjtang@users.noreply.github.com> Date: Fri, 19 Aug 2022 21:21:39 -0400 Subject: [PATCH 15/20] Finish the comment for merging --- quidel_covidtest/delphi_quidel_covidtest/backfill.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/quidel_covidtest/delphi_quidel_covidtest/backfill.py b/quidel_covidtest/delphi_quidel_covidtest/backfill.py index fa2b92ecb..65963612e 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/backfill.py +++ b/quidel_covidtest/delphi_quidel_covidtest/backfill.py @@ -65,7 +65,8 @@ def merge_backfill_file(backfill_dir, backfill_merge_day, today, 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 + save the reading time when running the backfill pipelines. We set a softer + threshold to allow flexibility in data delivery. Parameters ---------- From 1873280b8f599f4a87a92e63cc83417ac8ee9d65 Mon Sep 17 00:00:00 2001 From: Jingjing Tang <31444565+jingjtang@users.noreply.github.com> Date: Tue, 30 Aug 2022 20:13:29 -0400 Subject: [PATCH 16/20] Turn off index arg Co-authored-by: nmdefries <42820733+nmdefries@users.noreply.github.com> --- quidel_covidtest/delphi_quidel_covidtest/backfill.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quidel_covidtest/delphi_quidel_covidtest/backfill.py b/quidel_covidtest/delphi_quidel_covidtest/backfill.py index 65963612e..cbc01e412 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/backfill.py +++ b/quidel_covidtest/delphi_quidel_covidtest/backfill.py @@ -112,7 +112,7 @@ def get_date(file_link): path = backfill_dir + "/quidel_covidtest_from_%s_to_%s.parquet"%( datetime.strftime(earliest_date, "%Y%m%d"), datetime.strftime(latest_date, "%Y%m%d")) - merged_file.to_parquet(path) + merged_file.to_parquet(path, index=False) # Delete daily files once we have the merged one. if not test_mode: From 9fd95aba25377b85d1cad7b94f6c9df158e50143 Mon Sep 17 00:00:00 2001 From: Jingjing Tang Date: Wed, 31 Aug 2022 21:15:40 -0400 Subject: [PATCH 17/20] remove index arg when saving parquet files; add state_id for backfill --- quidel_covidtest/delphi_quidel_covidtest/backfill.py | 6 ++++-- quidel_covidtest/delphi_quidel_covidtest/pull.py | 4 +--- quidel_covidtest/tests/test_backfill.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/quidel_covidtest/delphi_quidel_covidtest/backfill.py b/quidel_covidtest/delphi_quidel_covidtest/backfill.py index cbc01e412..c594bd3c7 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/backfill.py +++ b/quidel_covidtest/delphi_quidel_covidtest/backfill.py @@ -26,6 +26,8 @@ def store_backfill_file(df, _end_date, backfill_dir): backfilldata = df.copy() backfilldata = gmpr.replace_geocode(backfilldata, from_code="zip", new_code="fips", from_col="zip", new_col="fips", date_col="timestamp") + backfilldata = gmpr.add_geocode(backfilldata, from_code="fips", new_code="state_id", + from_col="fips", new_col="state_id") backfilldata.rename({"timestamp": "time_value", "totalTest_total": "den_total", "positiveTest_total": "num_total", @@ -44,7 +46,7 @@ def store_backfill_file(df, _end_date, backfill_dir): axis=1, inplace=True) #Store one year's backfill data _start_date = _end_date.replace(year=_end_date.year-1) - selected_columns = ['time_value', 'fips', + selected_columns = ['time_value', 'fips', 'state_id', 'den_total', 'num_total', 'num_age_0_4', 'den_age_0_4', 'num_age_5_17', 'den_age_5_17', @@ -57,7 +59,7 @@ def store_backfill_file(df, _end_date, backfill_dir): path = backfill_dir + \ "/quidel_covidtest_as_of_%s.parquet"%datetime.strftime(_end_date, "%Y%m%d") # Store intermediate file into the backfill folder - backfilldata.to_parquet(path) + backfilldata.to_parquet(path, index=False) def merge_backfill_file(backfill_dir, backfill_merge_day, today, test_mode=False, check_nd=25): diff --git a/quidel_covidtest/delphi_quidel_covidtest/pull.py b/quidel_covidtest/delphi_quidel_covidtest/pull.py index c2357b64b..2ac5b958f 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/pull.py +++ b/quidel_covidtest/delphi_quidel_covidtest/pull.py @@ -8,11 +8,9 @@ import pandas as pd import numpy as np -from delphi_utils import GeoMapper - from .constants import AGE_GROUPS -gmpr = GeoMapper() + def get_from_s3(start_date, end_date, bucket, logger): """ diff --git a/quidel_covidtest/tests/test_backfill.py b/quidel_covidtest/tests/test_backfill.py index 35d82bf12..4dbe7c70c 100644 --- a/quidel_covidtest/tests/test_backfill.py +++ b/quidel_covidtest/tests/test_backfill.py @@ -41,7 +41,7 @@ def test_store_backfill_file(self): backfill_df = pd.read_parquet(backfill_dir + "/"+ fn, engine='pyarrow') - selected_columns = ['time_value', 'fips', + selected_columns = ['time_value', 'fips', 'state_id', 'den_total', 'num_total', 'num_age_0_4', 'den_age_0_4', 'num_age_5_17', 'den_age_5_17', From 4ea503e8df6da5a58b4dd9fc7fa2a2b69ec361dd Mon Sep 17 00:00:00 2001 From: Jingjing Tang Date: Wed, 31 Aug 2022 21:17:55 -0400 Subject: [PATCH 18/20] update test backfill files --- .../quidel_covidtest_as_of_20200817.parquet | Bin 13610 -> 13042 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200817.parquet b/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200817.parquet index 0e730fd5a928c983f46722abc431f27e34e95e08..2b9a6ffa7c8bdd02cce4a66169cd791881e6bee3 100644 GIT binary patch literal 13042 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 G?eagJ-&}71 literal 13610 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 wi!$Gyi_RZdNEUX)bGaS(y;7U_;;0S3QG$PC0{ Date: Tue, 6 Sep 2022 15:00:04 -0400 Subject: [PATCH 19/20] remove backfill test files --- .../quidel_covidtest_as_of_20200817.parquet | Bin 13042 -> 0 bytes .../quidel_covidtest_as_of_20200818.parquet | Bin 13603 -> 0 bytes .../quidel_covidtest_as_of_20200819.parquet | Bin 13603 -> 0 bytes .../quidel_covidtest_as_of_20200820.parquet | Bin 13603 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200817.parquet delete mode 100644 quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200818.parquet delete mode 100644 quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200819.parquet delete mode 100644 quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200820.parquet diff --git a/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200817.parquet b/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200817.parquet deleted file mode 100644 index 2b9a6ffa7c8bdd02cce4a66169cd791881e6bee3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13042 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 G?eagJ-&}71 diff --git a/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200818.parquet b/quidel_covidtest/tests/backfill/quidel_covidtest_as_of_20200818.parquet deleted file mode 100644 index 81836d65261903ec20da6ca4d419dd8a1d98ad61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13603 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 Date: Tue, 6 Sep 2022 15:00:29 -0400 Subject: [PATCH 20/20] add cases when there is no daily file stored --- .../delphi_quidel_covidtest/backfill.py | 2 ++ quidel_covidtest/tests/test_backfill.py | 28 +++++++++++++++---- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/quidel_covidtest/delphi_quidel_covidtest/backfill.py b/quidel_covidtest/delphi_quidel_covidtest/backfill.py index c594bd3c7..7e8482551 100644 --- a/quidel_covidtest/delphi_quidel_covidtest/backfill.py +++ b/quidel_covidtest/delphi_quidel_covidtest/backfill.py @@ -86,6 +86,8 @@ def merge_backfill_file(backfill_dir, backfill_merge_day, today, considerations """ new_files = glob.glob(backfill_dir + "/quidel_covidtest_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 diff --git a/quidel_covidtest/tests/test_backfill.py b/quidel_covidtest/tests/test_backfill.py index 4dbe7c70c..7a033fb47 100644 --- a/quidel_covidtest/tests/test_backfill.py +++ b/quidel_covidtest/tests/test_backfill.py @@ -17,9 +17,8 @@ backfill_dir="./backfill" class TestBackfill: - - def test_store_backfill_file(self): - df, _end_date = pull_quidel_covidtest({ + + df, _end_date = pull_quidel_covidtest({ "static_file_dir": "../static", "input_cache_dir": "./cache", "export_start_date": "2020-06-30", @@ -34,8 +33,10 @@ def test_store_backfill_file(self): "wip_signal": "", "test_mode": True }, TEST_LOGGER) - - store_backfill_file(df, datetime(2020, 1, 1), backfill_dir) + + def test_store_backfill_file(self): + + store_backfill_file(self.df, datetime(2020, 1, 1), backfill_dir) fn = "quidel_covidtest_as_of_20200101.parquet" assert fn in os.listdir(backfill_dir) @@ -57,10 +58,18 @@ def test_store_backfill_file(self): def test_merge_backfill_file(self): today = datetime.today() - new_files = glob.glob(backfill_dir + "/*.parquet") fn = "quidel_covidtest_from_20200817_to_20200820.parquet" assert fn not in os.listdir(backfill_dir) + # Check the when no daily file stored + today = datetime(2020, 8, 20) + merge_backfill_file(backfill_dir, today.weekday(), today, test_mode=True, check_nd=8) + assert fn not in os.listdir(backfill_dir) + + for d in range(17, 21): + dropdate = datetime(2020, 8, d) + store_backfill_file(self.df, dropdate, backfill_dir) + # Check the when the merged file is not generated today = datetime(2020, 8, 20) merge_backfill_file(backfill_dir, today.weekday(), today, test_mode=True, check_nd=8) @@ -71,13 +80,20 @@ def test_merge_backfill_file(self): assert fn in os.listdir(backfill_dir) # Read daily file + new_files = glob.glob(backfill_dir + "/quidel_covidtest*.parquet") pdList = [] for file in new_files: + 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") + assert len(new_files) == 1 + expected = pd.concat(pdList).sort_values(["time_value", "fips"]) # Read the merged file