From 9feb971d5b5b252e13b7633df8b3fc11b7d880ed Mon Sep 17 00:00:00 2001 From: nmdefries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 17 Sep 2025 18:59:26 -0400 Subject: [PATCH 1/3] add rvdss endpoint and basic tests --- epidatpy/_endpoints.py | 74 +++++++++++++++++++++++++++++++++++++ tests/test_epidata_calls.py | 68 ++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+) diff --git a/epidatpy/_endpoints.py b/epidatpy/_endpoints.py index bd42bd8..81efc01 100644 --- a/epidatpy/_endpoints.py +++ b/epidatpy/_endpoints.py @@ -870,6 +870,80 @@ def pvt_quidel(self, auth: str, locations: StringParam, epiweeks: EpiRangeParam ], ) + def pub_rvdss( + self, + geo_type: GeoType, + geo_values: Union[str, Sequence[str]] = "*", + time_values: EpiRangeParam = "*", + as_of: Union[None, str, int] = None, + issues: Optional[EpiRangeParam] = None, + ) -> CALL_TYPE: + """Fetch Canadian respiratory data""" + if sum([issues is not None, as_of is not None]) > 1: + raise InvalidArgumentException("`issues` and `as_of` are mutually exclusive.") + + return self._create_call( + "rvdss/", + { + "geo_type": geo_type, + "geo_values": geo_values, + "time_values": time_values, + "as_of": as_of, + "issues": issues, + }, + # descriptive fields + EpidataFieldInfo("geo_type", EpidataFieldType.categorical, categories=list("nation", "region", "province", "lab")), + EpidataFieldInfo("geo_value", EpidataFieldInfo.text), + EpidataFieldInfo("region", EpidataFieldInfo.text), + EpidataFieldInfo("time_type", EpidataFieldType.categorical, categories=list("week")), + EpidataFieldInfo("epiweek", EpidataFieldInfo.epiweek), # Stored as an int in YYYYWW format + EpidataFieldInfo("time_value", EpidataFieldInfo.epiweek), # Stored as a date + EpidataFieldInfo("issue", EpidataFieldInfo.epiweek), # Stored as a date + EpidataFieldInfo("week", EpidataFieldInfo.int), + EpidataFieldInfo("weekorder", EpidataFieldInfo.int), + EpidataFieldInfo("year", EpidataFieldInfo.int), + + # value fields + EpidataFieldInfo("adv_pct_positive", EpidataFieldInfo.float), + EpidataFieldInfo("adv_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("adv_tests", EpidataFieldInfo.float), + EpidataFieldInfo("evrv_pct_positive", EpidataFieldInfo.float), + EpidataFieldInfo("evrv_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("evrv_tests", EpidataFieldInfo.float), + EpidataFieldInfo("flu_pct_positive", EpidataFieldInfo.float), + EpidataFieldInfo("flu_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("flu_tests", EpidataFieldInfo.float), + EpidataFieldInfo("flua_pct_positive", EpidataFieldInfo.float), + EpidataFieldInfo("flua_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("flua_tests", EpidataFieldInfo.float), + EpidataFieldInfo("fluah1n1pdm09_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("fluah3_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("fluauns_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("flub_pct_positive", EpidataFieldInfo.float), + EpidataFieldInfo("flub_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("flub_tests", EpidataFieldInfo.float), + EpidataFieldInfo("hcov_pct_positive", EpidataFieldInfo.float), + EpidataFieldInfo("hcov_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("hcov_tests", EpidataFieldInfo.float), + EpidataFieldInfo("hmpv_pct_positive", EpidataFieldInfo.float), + EpidataFieldInfo("hmpv_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("hmpv_tests", EpidataFieldInfo.float), + EpidataFieldInfo("hpiv1_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("hpiv2_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("hpiv3_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("hpiv4_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("hpiv_pct_positive", EpidataFieldInfo.float), + EpidataFieldInfo("hpiv_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("hpiv_tests", EpidataFieldInfo.float), + EpidataFieldInfo("hpivother_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("rsv_pct_positive", EpidataFieldInfo.float), + EpidataFieldInfo("rsv_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("rsv_tests", EpidataFieldInfo.float), + EpidataFieldInfo("sarscov2_pct_positive", EpidataFieldInfo.float), + EpidataFieldInfo("sarscov2_positive_tests", EpidataFieldInfo.float), + EpidataFieldInfo("sarscov2_tests", EpidataFieldInfo.float) + ) + def pvt_sensors( self, auth: str, diff --git a/tests/test_epidata_calls.py b/tests/test_epidata_calls.py index b827225..399e353 100644 --- a/tests/test_epidata_calls.py +++ b/tests/test_epidata_calls.py @@ -367,6 +367,74 @@ def test_pvt_quidel(self) -> None: assert str(data["epiweek"].dtype) == "string" assert str(data["value"].dtype) == "Float64" + def test_pub_rvdss(self) -> None: + apicall = EpiDataContext().pub_rvdss( + geo_type="province", + geo_values=["yu", "on"], + time_values=EpiRange(20200601, 20200801), + ) + data = apicall.df() + + assert len(data) > 0 + + apicall = EpiDataContext().pub_covidcast( + geo_type="region", + geo_values="*", + time_values=EpiRange(20200601, 20200801), + ) + data = apicall.df() + + assert len(data) > 0 + + assert str(data["geo_type"].dtype) == "string" + assert str(data["geo_value"].dtype) == "string" + assert str(data["region"].dtype) == "string" + assert str(data["time_type"].dtype) == "string" + assert str(data["epiweek"].dtype) == "Int64" + assert str(data["time_value""datetime64].dtype) == [ns]" + assert str(data["issue""datetime64].dtype) == [ns]" + assert str(data["week"].dtype) == "Int64" + assert str(data["weekorder"].dtype) == "Int64" + assert str(data["year"].dtype) == "Int64" + assert str(data["adv_pct_positive"].dtype) == "Float64" + assert str(data["adv_positive_tests"].dtype) == "Float64" + assert str(data["adv_tests"].dtype) == "Float64" + assert str(data["evrv_pct_positive"].dtype) == "Float64" + assert str(data["evrv_positive_tests"].dtype) == "Float64" + assert str(data["evrv_tests"].dtype) == "Float64" + assert str(data["flu_pct_positive"].dtype) == "Float64" + assert str(data["flu_positive_tests"].dtype) == "Float64" + assert str(data["flu_tests"].dtype) == "Float64" + assert str(data["flua_pct_positive"].dtype) == "Float64" + assert str(data["flua_positive_tests"].dtype) == "Float64" + assert str(data["flua_tests"].dtype) == "Float64" + assert str(data["fluah1n1pdm09_positive_tests"].dtype) == "Float64" + assert str(data["fluah3_positive_tests"].dtype) == "Float64" + assert str(data["fluauns_positive_tests"].dtype) == "Float64" + assert str(data["flub_pct_positive"].dtype) == "Float64" + assert str(data["flub_positive_tests"].dtype) == "Float64" + assert str(data["flub_tests"].dtype) == "Float64" + assert str(data["hcov_pct_positive"].dtype) == "Float64" + assert str(data["hcov_positive_tests"].dtype) == "Float64" + assert str(data["hcov_tests"].dtype) == "Float64" + assert str(data["hmpv_pct_positive"].dtype) == "Float64" + assert str(data["hmpv_positive_tests"].dtype) == "Float64" + assert str(data["hmpv_tests"].dtype) == "Float64" + assert str(data["hpiv1_positive_tests"].dtype) == "Float64" + assert str(data["hpiv2_positive_tests"].dtype) == "Float64" + assert str(data["hpiv3_positive_tests"].dtype) == "Float64" + assert str(data["hpiv4_positive_tests"].dtype) == "Float64" + assert str(data["hpiv_pct_positive"].dtype) == "Float64" + assert str(data["hpiv_positive_tests"].dtype) == "Float64" + assert str(data["hpiv_tests"].dtype) == "Float64" + assert str(data["hpivother_positive_tests"].dtype) == "Float64" + assert str(data["rsv_pct_positive"].dtype) == "Float64" + assert str(data["rsv_positive_tests"].dtype) == "Float64" + assert str(data["rsv_tests"].dtype) == "Float64" + assert str(data["sarscov2_pct_positive"].dtype) == "Float64" + assert str(data["sarscov2_positive_tests"].dtype) == "Float64" + assert str(data["sarscov2_tests"].dtype) == "Float64" + @pytest.mark.skipif(not secret_sensors, reason="Sensors key not available.") def test_pvt_sensors(self) -> None: apicall = EpiDataContext().pvt_sensors( From 38a99b732b45166aec34dd0e3a98faf1c73b31da Mon Sep 17 00:00:00 2001 From: nmdefries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 17 Sep 2025 19:03:18 -0400 Subject: [PATCH 2/3] datetime test format fix --- tests/test_epidata_calls.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_epidata_calls.py b/tests/test_epidata_calls.py index 399e353..297be08 100644 --- a/tests/test_epidata_calls.py +++ b/tests/test_epidata_calls.py @@ -391,8 +391,8 @@ def test_pub_rvdss(self) -> None: assert str(data["region"].dtype) == "string" assert str(data["time_type"].dtype) == "string" assert str(data["epiweek"].dtype) == "Int64" - assert str(data["time_value""datetime64].dtype) == [ns]" - assert str(data["issue""datetime64].dtype) == [ns]" + assert str(data["time_value"].dtype) == "datetime64[ns]" + assert str(data["issue"].dtype) == "datetime64[ns]" assert str(data["week"].dtype) == "Int64" assert str(data["weekorder"].dtype) == "Int64" assert str(data["year"].dtype) == "Int64" From b6972d92a8388f6782b721ce00ee81dd5e36475e Mon Sep 17 00:00:00 2001 From: nmdefries <42820733+nmdefries@users.noreply.github.com> Date: Wed, 17 Sep 2025 19:11:27 -0400 Subject: [PATCH 3/3] linting linting linting linting formating --- epidatpy/_endpoints.py | 114 ++++++++++++++++++++---------------- tests/test_epidata_calls.py | 3 +- 2 files changed, 64 insertions(+), 53 deletions(-) diff --git a/epidatpy/_endpoints.py b/epidatpy/_endpoints.py index 81efc01..d7060ae 100644 --- a/epidatpy/_endpoints.py +++ b/epidatpy/_endpoints.py @@ -872,7 +872,7 @@ def pvt_quidel(self, auth: str, locations: StringParam, epiweeks: EpiRangeParam def pub_rvdss( self, - geo_type: GeoType, + geo_type: StringParam, geo_values: Union[str, Sequence[str]] = "*", time_values: EpiRangeParam = "*", as_of: Union[None, str, int] = None, @@ -891,57 +891,67 @@ def pub_rvdss( "as_of": as_of, "issues": issues, }, - # descriptive fields - EpidataFieldInfo("geo_type", EpidataFieldType.categorical, categories=list("nation", "region", "province", "lab")), - EpidataFieldInfo("geo_value", EpidataFieldInfo.text), - EpidataFieldInfo("region", EpidataFieldInfo.text), - EpidataFieldInfo("time_type", EpidataFieldType.categorical, categories=list("week")), - EpidataFieldInfo("epiweek", EpidataFieldInfo.epiweek), # Stored as an int in YYYYWW format - EpidataFieldInfo("time_value", EpidataFieldInfo.epiweek), # Stored as a date - EpidataFieldInfo("issue", EpidataFieldInfo.epiweek), # Stored as a date - EpidataFieldInfo("week", EpidataFieldInfo.int), - EpidataFieldInfo("weekorder", EpidataFieldInfo.int), - EpidataFieldInfo("year", EpidataFieldInfo.int), - - # value fields - EpidataFieldInfo("adv_pct_positive", EpidataFieldInfo.float), - EpidataFieldInfo("adv_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("adv_tests", EpidataFieldInfo.float), - EpidataFieldInfo("evrv_pct_positive", EpidataFieldInfo.float), - EpidataFieldInfo("evrv_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("evrv_tests", EpidataFieldInfo.float), - EpidataFieldInfo("flu_pct_positive", EpidataFieldInfo.float), - EpidataFieldInfo("flu_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("flu_tests", EpidataFieldInfo.float), - EpidataFieldInfo("flua_pct_positive", EpidataFieldInfo.float), - EpidataFieldInfo("flua_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("flua_tests", EpidataFieldInfo.float), - EpidataFieldInfo("fluah1n1pdm09_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("fluah3_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("fluauns_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("flub_pct_positive", EpidataFieldInfo.float), - EpidataFieldInfo("flub_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("flub_tests", EpidataFieldInfo.float), - EpidataFieldInfo("hcov_pct_positive", EpidataFieldInfo.float), - EpidataFieldInfo("hcov_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("hcov_tests", EpidataFieldInfo.float), - EpidataFieldInfo("hmpv_pct_positive", EpidataFieldInfo.float), - EpidataFieldInfo("hmpv_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("hmpv_tests", EpidataFieldInfo.float), - EpidataFieldInfo("hpiv1_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("hpiv2_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("hpiv3_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("hpiv4_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("hpiv_pct_positive", EpidataFieldInfo.float), - EpidataFieldInfo("hpiv_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("hpiv_tests", EpidataFieldInfo.float), - EpidataFieldInfo("hpivother_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("rsv_pct_positive", EpidataFieldInfo.float), - EpidataFieldInfo("rsv_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("rsv_tests", EpidataFieldInfo.float), - EpidataFieldInfo("sarscov2_pct_positive", EpidataFieldInfo.float), - EpidataFieldInfo("sarscov2_positive_tests", EpidataFieldInfo.float), - EpidataFieldInfo("sarscov2_tests", EpidataFieldInfo.float) + [ + # descriptive fields + EpidataFieldInfo( + "geo_type", + EpidataFieldType.categorical, + categories=["nation", "region", "province", "lab"] + ), + EpidataFieldInfo("geo_value",EpidataFieldType.text), + EpidataFieldInfo("region", EpidataFieldType.text), + EpidataFieldInfo( + "time_type", + EpidataFieldType.categorical, + categories=["week"] + ), + EpidataFieldInfo("epiweek", EpidataFieldType.epiweek), # Stored as an int in YYYYWW format + EpidataFieldInfo("time_value", EpidataFieldType.epiweek), # Stored as a date + EpidataFieldInfo("issue", EpidataFieldType.epiweek), # Stored as a date + EpidataFieldInfo("week", EpidataFieldType.int), + EpidataFieldInfo("weekorder", EpidataFieldType.int), + EpidataFieldInfo("year", EpidataFieldType.int), + + # value fields + EpidataFieldInfo("adv_pct_positive", EpidataFieldType.float), + EpidataFieldInfo("adv_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("adv_tests", EpidataFieldType.float), + EpidataFieldInfo("evrv_pct_positive", EpidataFieldType.float), + EpidataFieldInfo("evrv_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("evrv_tests", EpidataFieldType.float), + EpidataFieldInfo("flu_pct_positive", EpidataFieldType.float), + EpidataFieldInfo("flu_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("flu_tests", EpidataFieldType.float), + EpidataFieldInfo("flua_pct_positive", EpidataFieldType.float), + EpidataFieldInfo("flua_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("flua_tests", EpidataFieldType.float), + EpidataFieldInfo("fluah1n1pdm09_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("fluah3_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("fluauns_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("flub_pct_positive", EpidataFieldType.float), + EpidataFieldInfo("flub_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("flub_tests", EpidataFieldType.float), + EpidataFieldInfo("hcov_pct_positive", EpidataFieldType.float), + EpidataFieldInfo("hcov_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("hcov_tests", EpidataFieldType.float), + EpidataFieldInfo("hmpv_pct_positive", EpidataFieldType.float), + EpidataFieldInfo("hmpv_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("hmpv_tests", EpidataFieldType.float), + EpidataFieldInfo("hpiv1_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("hpiv2_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("hpiv3_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("hpiv4_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("hpiv_pct_positive", EpidataFieldType.float), + EpidataFieldInfo("hpiv_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("hpiv_tests", EpidataFieldType.float), + EpidataFieldInfo("hpivother_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("rsv_pct_positive", EpidataFieldType.float), + EpidataFieldInfo("rsv_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("rsv_tests", EpidataFieldType.float), + EpidataFieldInfo("sarscov2_pct_positive", EpidataFieldType.float), + EpidataFieldInfo("sarscov2_positive_tests", EpidataFieldType.float), + EpidataFieldInfo("sarscov2_tests", EpidataFieldType.float), + ] ) def pvt_sensors( diff --git a/tests/test_epidata_calls.py b/tests/test_epidata_calls.py index 297be08..cc0e9c4 100644 --- a/tests/test_epidata_calls.py +++ b/tests/test_epidata_calls.py @@ -368,6 +368,7 @@ def test_pvt_quidel(self) -> None: assert str(data["value"].dtype) == "Float64" def test_pub_rvdss(self) -> None: + # pylint: disable=too-many-statements apicall = EpiDataContext().pub_rvdss( geo_type="province", geo_values=["yu", "on"], @@ -377,7 +378,7 @@ def test_pub_rvdss(self) -> None: assert len(data) > 0 - apicall = EpiDataContext().pub_covidcast( + apicall = EpiDataContext().pub_rvdss( geo_type="region", geo_values="*", time_values=EpiRange(20200601, 20200801),