Skip to content

Commit 22d064a

Browse files
authored
Merge pull request #223 from cmu-delphi/ndefries/add-missing-epidata-spec
Add missing field specs for endpoints; parse `release_date` as date
2 parents 78c381f + 38a5c1b commit 22d064a

File tree

4 files changed

+247
-18
lines changed

4 files changed

+247
-18
lines changed

R/endpoints.R

+223-9
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,64 @@ pub_covid_hosp_facility <- function(
432432
create_epidata_field_info(
433433
"total_patients_hosp_confirmed_influenza_and_covid_7d_avg",
434434
"float"
435+
),
436+
create_epidata_field_info("geocoded_hospital_address", "text"),
437+
create_epidata_field_info("hhs_ids", "text"),
438+
create_epidata_field_info("is_corrected", "bool"),
439+
create_epidata_field_info(
440+
"previous_day_admission_adult_covid_confirmed_7_day_coverage",
441+
"int"
442+
),
443+
create_epidata_field_info(
444+
"previous_day_admission_adult_covid_suspected_7_day_coverage",
445+
"int"
446+
),
447+
create_epidata_field_info(
448+
"previous_day_admission_pediatric_covid_confirmed_7_day_coverage",
449+
"int"
450+
),
451+
create_epidata_field_info(
452+
"previous_day_admission_pediatric_covid_suspected_7_day_coverage",
453+
"int"
454+
),
455+
create_epidata_field_info(
456+
"previous_week_patients_covid_vaccinated_doses_all_7_day",
457+
"int"
458+
),
459+
create_epidata_field_info(
460+
"previous_week_patients_covid_vaccinated_doses_all_7_day_sum",
461+
"int"
462+
),
463+
create_epidata_field_info(
464+
"previous_week_patients_covid_vaccinated_doses_one_7_day",
465+
"int"
466+
),
467+
create_epidata_field_info(
468+
"previous_week_patients_covid_vaccinated_doses_one_7_day_sum",
469+
"int"
470+
),
471+
create_epidata_field_info(
472+
"previous_week_personnel_covid_vaccd_doses_administered_7_day",
473+
"int"
474+
),
475+
create_epidata_field_info(
476+
"previous_week_personnel_covid_vaccd_doses_administered_7_day_sum",
477+
"int"
478+
),
479+
create_epidata_field_info("total_personnel_covid_vaccinated_doses_all_7_day", "int"),
480+
create_epidata_field_info(
481+
"total_personnel_covid_vaccinated_doses_all_7_day_sum",
482+
"int"
483+
),
484+
create_epidata_field_info("total_personnel_covid_vaccinated_doses_none_7_day", "int"),
485+
create_epidata_field_info(
486+
"total_personnel_covid_vaccinated_doses_none_7_day_sum",
487+
"int"
488+
),
489+
create_epidata_field_info("total_personnel_covid_vaccinated_doses_one_7_day", "int"),
490+
create_epidata_field_info(
491+
"total_personnel_covid_vaccinated_doses_one_7_day_sum",
492+
"int"
435493
)
436494
)
437495
) %>% fetch(fetch_args = fetch_args)
@@ -618,7 +676,157 @@ pub_covid_hosp_state_timeseries <- function(
618676
create_epidata_field_info("percent_of_inpatients_with_covid", "float"),
619677
create_epidata_field_info("inpatient_bed_covid_utilization", "float"),
620678
create_epidata_field_info("adult_icu_bed_covid_utilization", "float"),
621-
create_epidata_field_info("adult_icu_bed_utilization", "float")
679+
create_epidata_field_info("adult_icu_bed_utilization", "float"),
680+
create_epidata_field_info("geocoded_state", "text"),
681+
create_epidata_field_info("deaths_covid", "int"),
682+
create_epidata_field_info("deaths_covid_coverage", "int"),
683+
create_epidata_field_info("icu_patients_confirmed_influenza", "int"),
684+
create_epidata_field_info("icu_patients_confirmed_influenza_coverage", "int"),
685+
create_epidata_field_info(
686+
"on_hand_supply_therapeutic_a_casirivimab_imdevimab_courses",
687+
"int"
688+
),
689+
create_epidata_field_info("on_hand_supply_therapeutic_b_bamlanivimab_courses", "int"),
690+
create_epidata_field_info(
691+
"on_hand_supply_therapeutic_c_bamlanivimab_etesevimab_courses",
692+
"int"
693+
),
694+
create_epidata_field_info("previous_day_admission_adult_covid_confirmed_18_19", "int"),
695+
create_epidata_field_info(
696+
"previous_day_admission_adult_covid_confirmed_18_19_coverage",
697+
"int"
698+
),
699+
create_epidata_field_info("previous_day_admission_adult_covid_confirmed_20_29", "int"),
700+
create_epidata_field_info(
701+
"previous_day_admission_adult_covid_confirmed_20_29_coverage",
702+
"int"
703+
),
704+
create_epidata_field_info("previous_day_admission_adult_covid_confirmed_30_39", "int"),
705+
create_epidata_field_info(
706+
"previous_day_admission_adult_covid_confirmed_30_39_coverage",
707+
"int"
708+
),
709+
create_epidata_field_info("previous_day_admission_adult_covid_confirmed_40_49", "int"),
710+
create_epidata_field_info(
711+
"previous_day_admission_adult_covid_confirmed_40_49_coverage",
712+
"int"
713+
),
714+
create_epidata_field_info("previous_day_admission_adult_covid_confirmed_50_59", "int"),
715+
create_epidata_field_info(
716+
"previous_day_admission_adult_covid_confirmed_50_59_coverage",
717+
"int"
718+
),
719+
create_epidata_field_info("previous_day_admission_adult_covid_confirmed_60_69", "int"),
720+
create_epidata_field_info(
721+
"previous_day_admission_adult_covid_confirmed_60_69_coverage",
722+
"int"
723+
),
724+
create_epidata_field_info("previous_day_admission_adult_covid_confirmed_70_79", "int"),
725+
create_epidata_field_info(
726+
"previous_day_admission_adult_covid_confirmed_70_79_coverage",
727+
"int"
728+
),
729+
create_epidata_field_info(
730+
"previous_day_admission_adult_covid_confirmed_80plus",
731+
"int"
732+
),
733+
create_epidata_field_info(
734+
"previous_day_admission_adult_covid_confirmed_80plus_coverage",
735+
"int"
736+
),
737+
create_epidata_field_info(
738+
"previous_day_admission_adult_covid_confirmed_unknown",
739+
"int"
740+
),
741+
create_epidata_field_info(
742+
"previous_day_admission_adult_covid_confirmed_unknown_coverage",
743+
"int"
744+
),
745+
create_epidata_field_info("previous_day_admission_adult_covid_suspected_18_19", "int"),
746+
create_epidata_field_info(
747+
"previous_day_admission_adult_covid_suspected_18_19_coverage",
748+
"int"
749+
),
750+
create_epidata_field_info("previous_day_admission_adult_covid_suspected_20_29", "int"),
751+
create_epidata_field_info(
752+
"previous_day_admission_adult_covid_suspected_20_29_coverage",
753+
"int"
754+
),
755+
create_epidata_field_info("previous_day_admission_adult_covid_suspected_30_39", "int"),
756+
create_epidata_field_info(
757+
"previous_day_admission_adult_covid_suspected_30_39_coverage",
758+
"int"
759+
),
760+
create_epidata_field_info("previous_day_admission_adult_covid_suspected_40_49", "int"),
761+
create_epidata_field_info(
762+
"previous_day_admission_adult_covid_suspected_40_49_coverage",
763+
"int"
764+
),
765+
create_epidata_field_info("previous_day_admission_adult_covid_suspected_50_59", "int"),
766+
create_epidata_field_info(
767+
"previous_day_admission_adult_covid_suspected_50_59_coverage",
768+
"int"
769+
),
770+
create_epidata_field_info("previous_day_admission_adult_covid_suspected_60_69", "int"),
771+
create_epidata_field_info(
772+
"previous_day_admission_adult_covid_suspected_60_69_coverage",
773+
"int"
774+
),
775+
create_epidata_field_info("previous_day_admission_adult_covid_suspected_70_79", "int"),
776+
create_epidata_field_info(
777+
"previous_day_admission_adult_covid_suspected_70_79_coverage",
778+
"int"
779+
),
780+
create_epidata_field_info(
781+
"previous_day_admission_adult_covid_suspected_80plus",
782+
"int"
783+
),
784+
create_epidata_field_info(
785+
"previous_day_admission_adult_covid_suspected_80plus_coverage",
786+
"int"
787+
),
788+
create_epidata_field_info(
789+
"previous_day_admission_adult_covid_suspected_unknown",
790+
"int"
791+
),
792+
create_epidata_field_info(
793+
"previous_day_admission_adult_covid_suspected_unknown_coverage",
794+
"int"
795+
),
796+
create_epidata_field_info("previous_day_admission_influenza_confirmed", "int"),
797+
create_epidata_field_info(
798+
"previous_day_admission_influenza_confirmed_coverage",
799+
"int"
800+
),
801+
create_epidata_field_info("previous_day_deaths_covid_and_influenza", "int"),
802+
create_epidata_field_info("previous_day_deaths_covid_and_influenza_coverage", "int"),
803+
create_epidata_field_info("previous_day_deaths_influenza", "int"),
804+
create_epidata_field_info("previous_day_deaths_influenza_coverage", "int"),
805+
create_epidata_field_info(
806+
"previous_week_therapeutic_a_casirivimab_imdevimab_courses_used",
807+
"int"
808+
),
809+
create_epidata_field_info(
810+
"previous_week_therapeutic_b_bamlanivimab_courses_used",
811+
"int"
812+
),
813+
create_epidata_field_info(
814+
"previous_week_therapeutic_c_bamlanivimab_etesevimab_courses_used",
815+
"int"
816+
),
817+
create_epidata_field_info(
818+
"total_patients_hospitalized_confirmed_influenza_covid",
819+
"int"
820+
),
821+
create_epidata_field_info(
822+
"total_patients_hospitalized_confirmed_influenza_covid_coverage",
823+
"int"
824+
),
825+
create_epidata_field_info("total_patients_hospitalized_confirmed_influenza", "int"),
826+
create_epidata_field_info(
827+
"total_patients_hospitalized_confirmed_influenza_coverage",
828+
"int"
829+
)
622830
)
623831
) %>% fetch(fetch_args = fetch_args)
624832
}
@@ -656,6 +864,11 @@ pub_covidcast_meta <- function(fetch_args = fetch_args_list()) {
656864
categories =
657865
c("week", "day")
658866
),
867+
create_epidata_field_info(
868+
"geo_type",
869+
"categorical",
870+
categories = c("nation", "msa", "hrr", "hhs", "state", "county", "dma")
871+
),
659872
create_epidata_field_info("min_time", "date"),
660873
create_epidata_field_info("max_time", "date"),
661874
create_epidata_field_info("num_locations", "int"),
@@ -1031,7 +1244,7 @@ pub_flusurv <- function(locations, epiweeks, ..., issues = NULL, lag = NULL, fet
10311244
lag = lag
10321245
),
10331246
list(
1034-
create_epidata_field_info("release_date", "text"),
1247+
create_epidata_field_info("release_date", "date"),
10351248
create_epidata_field_info("location", "text"),
10361249
create_epidata_field_info("issue", "epiweek"),
10371250
create_epidata_field_info("epiweek", "epiweek"),
@@ -1089,7 +1302,7 @@ pub_fluview_clinical <- function(regions, epiweeks, ..., issues = NULL, lag = NU
10891302
lag = lag
10901303
),
10911304
list(
1092-
create_epidata_field_info("release_date", "text"),
1305+
create_epidata_field_info("release_date", "date"),
10931306
create_epidata_field_info("region", "text"),
10941307
create_epidata_field_info("issue", "epiweek"),
10951308
create_epidata_field_info("epiweek", "epiweek"),
@@ -1124,7 +1337,7 @@ pub_fluview_meta <- function(fetch_args = fetch_args_list()) {
11241337
"fluview_meta/",
11251338
list(),
11261339
list(
1127-
create_epidata_field_info("latest_update", "text"),
1340+
create_epidata_field_info("latest_update", "date"),
11281341
create_epidata_field_info("latest_issue", "date"),
11291342
create_epidata_field_info("table_rows", "int")
11301343
)
@@ -1198,13 +1411,14 @@ pub_fluview <- function(
11981411
auth = auth
11991412
),
12001413
list(
1201-
create_epidata_field_info("release_date", "text"),
1414+
create_epidata_field_info("release_date", "date"),
12021415
create_epidata_field_info("region", "text"),
12031416
create_epidata_field_info("issue", "epiweek"),
12041417
create_epidata_field_info("epiweek", "epiweek"),
12051418
create_epidata_field_info("lag", "int"),
12061419
create_epidata_field_info("num_ili", "int"),
12071420
create_epidata_field_info("num_patients", "int"),
1421+
create_epidata_field_info("num_providers", "int"),
12081422
create_epidata_field_info("num_age_0", "int"),
12091423
create_epidata_field_info("num_age_1", "int"),
12101424
create_epidata_field_info("num_age_2", "int"),
@@ -1347,7 +1561,7 @@ pub_kcdc_ili <- function(regions, epiweeks, ..., issues = NULL, lag = NULL, fetc
13471561
lag = lag
13481562
),
13491563
list(
1350-
create_epidata_field_info("release_date", "text"),
1564+
create_epidata_field_info("release_date", "date"),
13511565
create_epidata_field_info("region", "text"),
13521566
create_epidata_field_info("issue", "epiweek"),
13531567
create_epidata_field_info("epiweek", "epiweek"),
@@ -1480,7 +1694,7 @@ pub_nidss_flu <- function(regions, epiweeks, ..., issues = NULL, lag = NULL, fet
14801694
lag = lag
14811695
),
14821696
list(
1483-
create_epidata_field_info("release_date", "text"),
1697+
create_epidata_field_info("release_date", "date"),
14841698
create_epidata_field_info("region", "text"),
14851699
create_epidata_field_info("epiweek", "epiweek"),
14861700
create_epidata_field_info("issue", "epiweek"),
@@ -1530,7 +1744,7 @@ pvt_norostat <- function(auth, locations, epiweeks, fetch_args = fetch_args_list
15301744
epiweeks = epiweeks
15311745
),
15321746
list(
1533-
create_epidata_field_info("release_date", "text"),
1747+
create_epidata_field_info("release_date", "date"),
15341748
create_epidata_field_info("epiweek", "epiweek"),
15351749
create_epidata_field_info("value", "int")
15361750
)
@@ -1611,7 +1825,7 @@ pub_paho_dengue <- function(regions, epiweeks, ..., issues = NULL, lag = NULL, f
16111825
lag = lag
16121826
),
16131827
list(
1614-
create_epidata_field_info("release_date", "text"),
1828+
create_epidata_field_info("release_date", "date"),
16151829
create_epidata_field_info("region", "text"),
16161830
create_epidata_field_info("serotype", "text"),
16171831
create_epidata_field_info("epiweek", "epiweek"),

R/model.R

+1-1
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ parse_data_frame <- function(epidata_call, df, disable_date_parsing = FALSE) {
174174

175175
#' @keywords internal
176176
parse_api_date <- function(value) {
177-
as.Date(as.character(value), format = "%Y%m%d")
177+
as.Date(as.character(value), tryFormats = c("%Y%m%d", "%Y-%m-%d"))
178178
}
179179

180180
#' parse_api_week converts an integer to a date

tests/testthat/test-endpoints.R

+6-6
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,14 @@ test_that("basic_epidata_call", {
3737
fetch_args = fetch_args_list(dry_run = TRUE)
3838
) %>% request_url())
3939
expect_no_error(pub_dengue_nowcast(
40-
locations = "?",
40+
locations = "ca",
4141
epiweeks = epirange(201501, 202001),
4242
fetch_args = fetch_args_list(dry_run = TRUE)
4343
) %>% request_url())
4444
expect_no_error(pvt_dengue_sensors(
4545
auth = "yourkey",
46-
names = "?",
47-
locations = "?",
46+
names = "ght",
47+
locations = "ag",
4848
epiweeks = epirange(201501, 202001),
4949
fetch_args = fetch_args_list(dry_run = TRUE)
5050
) %>% request_url())
@@ -80,11 +80,11 @@ test_that("basic_epidata_call", {
8080
auth = "yourkey",
8181
locations = "ca",
8282
epiweeks = epirange(201201, 202001),
83-
query = "?",
83+
query = "how to get over the flu",
8484
fetch_args = fetch_args_list(dry_run = TRUE)
8585
) %>% request_url())
8686
expect_no_error(pub_kcdc_ili(
87-
regions = "?",
87+
regions = "ROK",
8888
epiweeks = epirange(201201, 202001),
8989
fetch_args = fetch_args_list(dry_run = TRUE)
9090
) %>% request_url())
@@ -213,7 +213,7 @@ test_that("endpoints fail when given args via dots", {
213213
)
214214
expect_error(
215215
pub_kcdc_ili(
216-
regions = "?",
216+
regions = "ROK",
217217
date_range = epirange(201201, 202001)
218218
),
219219
regexp = dots_error

tests/testthat/test-model.R

+17-2
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,12 @@ test_that("null parsing", {
5757
# see generate_test_data.R
5858
mock_df <- as.data.frame(readr::read_rds(testthat::test_path("data/flusurv-epiweeks.rds")))
5959
metadata <- epidata_call$meta
60-
mock_df[[metadata[[1]]$name]][1] <- list(NULL)
60+
mock_df[[metadata[[1]]$name]][1] <- NA
6161
mock_df[[metadata[[2]]$name]] <- c(TRUE)
6262
epidata_call$meta[[2]]$type <- "bool"
63-
res <- parse_data_frame(epidata_call, mock_df) %>% as_tibble()
63+
expect_no_error(res <- parse_data_frame(epidata_call, mock_df) %>% as_tibble())
6464
expect_true(res$location)
65+
expect_identical(res$release_date, as.Date(NA))
6566

6667
# if the call has no metadata, return the whole frame as is
6768
epidata_call$meta <- NULL
@@ -98,3 +99,17 @@ test_that("parse_data_frame warns when df contains fields not listed in meta", {
9899
mock_df$rate_age_0 <- NULL
99100
expect_no_warning(parse_data_frame(epidata_call, mock_df))
100101
})
102+
103+
test_that("parse_api_date accepts str and int input", {
104+
expect_identical(parse_api_date("20200101"), as.Date("2020-01-01"))
105+
expect_identical(parse_api_date(20200101), as.Date("2020-01-01"))
106+
})
107+
108+
test_that("parse_api_date accepts YYYYMMDD and YYYY-MM-DD", {
109+
expect_identical(parse_api_date(20200101), as.Date("2020-01-01"))
110+
expect_identical(parse_api_date("2020-01-01"), as.Date("2020-01-01"))
111+
})
112+
113+
test_that("parse_api_date handles missing values appropriately", {
114+
expect_identical(parse_api_date(NA), as.Date(NA))
115+
})

0 commit comments

Comments
 (0)