Skip to content

Commit c9fcb55

Browse files
committed
Merge branch 'main' into nans_covidactnow
2 parents 20eac44 + ef13336 commit c9fcb55

File tree

131 files changed

+15202
-14896
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

131 files changed

+15202
-14896
lines changed

.bumpversion.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[bumpversion]
2-
current_version = 0.1.16
2+
current_version = 0.1.25
33
commit = True
44
message = chore: bump covidcast-indicators to {new_version}
55
tag = False

.github/workflows/r-ci.yml

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,12 @@ jobs:
4848
${{ runner.os }}-r-facebook-survey-
4949
- name: Install R dependencies
5050
run: |
51-
if ( packageVersion("readr") != "1.4.0" ) {
52-
install.packages("devtools")
53-
devtools::install_version("readr", version = "1.4.0")
51+
if ( !require("remotes") ) {
52+
install.packages("remotes")
5453
}
55-
install.packages("remotes")
56-
remotes::update_packages(c("rcmdcheck", "mockr"), upgrade="always")
54+
remotes::update_packages(c("rcmdcheck", "mockr", "remotes"), upgrade="always")
5755
dependency_list <- remotes::dev_package_deps(dependencies=TRUE)
58-
remotes::update_packages(dependency_list$package[dependency_list$package != "readr"], upgrade="always")
56+
remotes::update_packages(dependency_list$package, upgrade="always")
5957
shell: Rscript {0}
6058
- name: Check
6159
run: |

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
params.json
55

66
# Do not commit output files
7-
receiving/*.csv
7+
**/receiving/*.csv
88

99
# Do not commit hidden macOS files
1010
.DS_Store

_delphi_utils_python/.bumpversion.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[bumpversion]
2-
current_version = 0.1.12
2+
current_version = 0.1.17
33
commit = True
44
message = chore: bump delphi_utils to {new_version}
55
tag = False

_delphi_utils_python/delphi_utils/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@
1414
from .signal import add_prefix
1515
from .nancodes import Nans
1616

17-
__version__ = "0.1.12"
17+
__version__ = "0.1.17"

_delphi_utils_python/delphi_utils/archive.py

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ def diff_export_csv(
105105
# Code deleted entries as nans with the deleted missing code
106106
deleted_df = before_df.loc[deleted_idx, :].copy()
107107
deleted_df[["val", "se", "sample_size"]] = np.nan
108-
deleted_df[["missing_val", "missing_se", "missing_sample_size"]] = Nans.DELETED
108+
if "missing_val" in after_df_cmn.columns:
109+
deleted_df[["missing_val", "missing_se", "missing_sample_size"]] = Nans.DELETED
109110

110111
return (
111112
deleted_df,
@@ -254,26 +255,7 @@ def diff_exports(self) -> Tuple[Files, FileDiffMap, Files]:
254255
new_issues_df.to_csv(diff_file, na_rep="NA")
255256
common_diffs[after_file] = diff_file
256257

257-
export_csv_dtypes = {
258-
"geo_id": str, "val": float, "se": float, "sample_size": float,
259-
"missing_val": int, "missing_se": int, "missing_sample_size": int
260-
}
261-
262-
# Replace deleted files with empty versions, but only if the cached version is not
263-
# already empty
264-
deleted_files_nanfilled = []
265-
for deleted_file in deleted_files:
266-
deleted_df = pd.read_csv(deleted_file, dtype=export_csv_dtypes)
267-
print(
268-
f"Diff deleted {deleted_file}; generating corresponding CSV with deleted rows."
269-
)
270-
deleted_df[["val", "se", "sample_size"]] = np.nan
271-
deleted_df[["missing_val", "missing_se", "missing_sample_size"]] = Nans.DELETED
272-
filename = join(self.export_dir, basename(deleted_file))
273-
deleted_df.to_csv(filename, index=False)
274-
deleted_files_nanfilled.append(filename)
275-
276-
return deleted_files_nanfilled, common_diffs, new_files
258+
return deleted_files, common_diffs, new_files
277259

278260
def archive_exports(self, exported_files: Files) -> Tuple[Files, Files]:
279261
"""
@@ -299,10 +281,9 @@ def filter_exports(self, common_diffs: FileDiffMap):
299281
Filter export directory to only contain relevant files.
300282
301283
Filters down the export_dir to only contain:
302-
1) New files, 2) Changed files, filtered-down to the ADDED and CHANGED rows
303-
only, and 3) Deleted files replaced with empty CSVs with the same name. Should
304-
be called after archive_exports() so we archive the raw exports before potentially
305-
modifying them.
284+
1) New files, 2) Changed files, filtered-down to the ADDED and CHANGED rows only.
285+
Should be called after archive_exports() so we archive the raw exports before
286+
potentially modifying them.
306287
307288
Parameters
308289
----------
@@ -331,13 +312,12 @@ def run(self):
331312
self.update_cache()
332313

333314
# Diff exports, and make incremental versions
334-
deleted_files, common_diffs, new_files = self.diff_exports()
315+
_, common_diffs, new_files = self.diff_exports()
335316

336-
# Archive changed, new, and emptied deleted files
317+
# Archive changed and new files only
337318
to_archive = [f for f, diff in common_diffs.items()
338319
if diff is not None]
339320
to_archive += new_files
340-
to_archive += deleted_files
341321
_, fails = self.archive_exports(to_archive)
342322

343323
# Filter existing exports to exclude those that failed to archive

_delphi_utils_python/delphi_utils/export.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from typing import Optional
66
import logging
77

8+
from epiweeks import Week
89
import numpy as np
910
import pandas as pd
1011

@@ -39,7 +40,8 @@ def create_export_csv(
3940
end_date: Optional[datetime] = None,
4041
remove_null_samples: Optional[bool] = False,
4142
write_empty_days: Optional[bool] = False,
42-
logger: Optional[logging.Logger] = None
43+
logger: Optional[logging.Logger] = None,
44+
weekly_dates = False,
4345
):
4446
"""Export data in the format expected by the Delphi API.
4547
@@ -68,6 +70,9 @@ def create_export_csv(
6870
even if there is no data for the day. If false, only the days present are written.
6971
logger: Optional[logging.Logger]
7072
Pass a logger object here to log information about contradictory missing codes.
73+
weekly_dates: Optional[bool]
74+
Whether the output data are weekly or not. If True, will prefix files with
75+
"weekly_YYYYWW" where WW is the epiweek instead of the usual YYYYMMDD for daily files.
7176
7277
Returns
7378
---------
@@ -90,10 +95,15 @@ def create_export_csv(
9095
dates = pd.date_range(start_date, end_date)
9196

9297
for date in dates:
98+
if weekly_dates:
99+
t = Week.fromdate(pd.to_datetime(str(date)))
100+
date_str = "weekly_" + str(t.year) + str(t.week).zfill(2)
101+
else:
102+
date_str = date.strftime('%Y%m%d')
93103
if metric is None:
94-
export_filename = f"{date.strftime('%Y%m%d')}_{geo_res}_{sensor}.csv"
104+
export_filename = f"{date_str}_{geo_res}_{sensor}.csv"
95105
else:
96-
export_filename = f"{date.strftime('%Y%m%d')}_{geo_res}_{metric}_{sensor}.csv"
106+
export_filename = f"{date_str}_{geo_res}_{metric}_{sensor}.csv"
97107
export_file = join(export_dir, export_filename)
98108
expected_columns = [
99109
"geo_id",

_delphi_utils_python/delphi_utils/geomap.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ def megacounty_creation(
183183
thr_win_len,
184184
thr_col="visits",
185185
fips_col="fips",
186-
date_col="date",
186+
date_col="timestamp",
187187
mega_col="megafips",
188188
):
189189
"""Create megacounty column.
@@ -340,7 +340,7 @@ def replace_geocode(
340340
new_code,
341341
from_col=None,
342342
new_col=None,
343-
date_col="date",
343+
date_col="timestamp",
344344
data_cols=None,
345345
dropna=True,
346346
):
@@ -366,7 +366,7 @@ def replace_geocode(
366366
new_code: {'fips', 'zip', 'state_code', 'state_id', 'state_name', 'hrr', 'msa',
367367
'hhs'}
368368
Specifies the geocode type of the data in new_col.
369-
date_col: str or None, default "date"
369+
date_col: str or None, default "timestamp"
370370
Specify which column contains the date values. Used for value aggregation.
371371
If None, then the aggregation is done only on geo_id.
372372
data_cols: list, default None
@@ -457,7 +457,7 @@ def fips_to_megacounty(
457457
thr_win_len,
458458
thr_col="visits",
459459
fips_col="fips",
460-
date_col="date",
460+
date_col="timestamp",
461461
mega_col="megafips",
462462
count_cols=None,
463463
):

_delphi_utils_python/delphi_utils/runner.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from typing import Any, Callable, Dict, Optional
55
from .archive import ArchiveDiffer, archiver_from_params
66
from .logger import get_structured_logger
7-
from .utils import read_params
7+
from .utils import read_params, transfer_files
88
from .validator.validate import Validator
99
from .validator.run import validator_from_params
1010

@@ -44,8 +44,11 @@ def run_indicator_pipeline(indicator_fn: Callable[[Params], None],
4444
validation_report.log(get_structured_logger(
4545
name = indicator_fn.__module__,
4646
filename=params["common"].get("log_filename", None)))
47-
if archiver and (not validator or validation_report.success()):
48-
archiver.run()
47+
if (not validator or validation_report.success()):
48+
if archiver:
49+
archiver.run()
50+
if "delivery" in params:
51+
transfer_files()
4952

5053

5154
if __name__ == "__main__":

_delphi_utils_python/delphi_utils/utils.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
"""Read parameter files containing configuration information."""
22
# -*- coding: utf-8 -*-
33
from json import load,dump
4-
from os.path import exists
5-
from shutil import copyfile
4+
from shutil import copyfile, move
5+
import os
66
import sys
77

88
def read_params():
@@ -11,7 +11,7 @@ def read_params():
1111
If the file does not exist, it copies the file 'params.json.template' to
1212
'params.json' and then reads the file.
1313
"""
14-
if not exists("params.json"):
14+
if not os.path.exists("params.json"):
1515
copyfile("params.json.template", "params.json")
1616

1717
with open("params.json", "r") as json_file:
@@ -87,3 +87,13 @@ def params_run():
8787
with open("params.json", "w") as f:
8888
dump(params, f, sort_keys=True, indent=2)
8989
print(f"Updated {n} items")
90+
91+
def transfer_files():
92+
"""Transfer files to prepare for acquisition."""
93+
params = read_params()
94+
export_dir = params["common"].get("export_dir", None)
95+
delivery_dir = params["delivery"].get("delivery_dir", None)
96+
files_to_export = os.listdir(export_dir)
97+
for file_name in files_to_export:
98+
if file_name.endswith(".csv") or file_name.endswith(".CSV"):
99+
move(os.path.join(export_dir, file_name), delivery_dir)

_delphi_utils_python/setup.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
required = [
88
"boto3",
99
"covidcast",
10+
"epiweeks",
1011
"freezegun",
1112
"gitpython",
1213
"mock",
@@ -24,7 +25,7 @@
2425

2526
setup(
2627
name="delphi_utils",
27-
version="0.1.12",
28+
version="0.1.17",
2829
description="Shared Utility Functions for Indicators",
2930
long_description=long_description,
3031
long_description_content_type="text/markdown",
@@ -35,7 +36,7 @@
3536
classifiers=[
3637
"Development Status :: 5 - Production/Stable",
3738
"Intended Audience :: Developers",
38-
"Programming Language :: Python :: 3.7",
39+
"Programming Language :: Python :: 3.8",
3940
],
4041
packages=find_packages(),
4142
package_data={'': ['data/*.csv']}

0 commit comments

Comments
 (0)