From 4afe0f058c1f312f074763c05c7a2f5fe12d5188 Mon Sep 17 00:00:00 2001 From: Amaris Sim Date: Tue, 9 Jul 2024 14:54:12 -0400 Subject: [PATCH 01/24] in progress for replacing covidcast --- .../delphi_utils/validator/datafetcher.py | 46 +++++++++++++++++-- .../delphi_utils/validator/dynamic.py | 3 +- .../delphi_utils/validator/run.py | 4 +- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index 39c8555cf..13edc7681 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -10,6 +10,7 @@ import pandas as pd import numpy as np import covidcast +from delphi_epidata import Epidata from .errors import APIDataFetchError, ValidationFailure FILENAME_REGEX = re.compile( @@ -115,7 +116,16 @@ def get_geo_signal_combos(data_source, api_key): meta_response.raise_for_status() source_signal_mappings = {i['source']:i['db_source'] for i in meta_response.json()} - meta = covidcast.metadata() + + response = Epidata._request("covidcast_meta") + + if response["result"] != 1: + # Something failed in the API and we did not get real metadata + raise RuntimeError("Error when fetching metadata from the API", + response["message"]) + + meta = pd.DataFrame.from_dict(response["epidata"]) + source_meta = meta[meta['data_source'] == data_source] # Need to convert np.records to tuples so they are hashable and can be used in sets and dicts. geo_signal_combos = list(map(tuple, @@ -160,8 +170,38 @@ def fetch_api_reference(data_source, start_date, end_date, geo_type, signal_type """ with warnings.catch_warnings(): warnings.simplefilter("ignore") - api_df = covidcast.signal( - data_source, signal_type, start_date, end_date, geo_type) + # api_df = covidcast.signal( + # data_source, signal_type, start_date, end_date, geo_type) + + response = Epidata.covidcast(data_source, signal_type, time_type="day", + geo_type=geo_type, time_values=[start_date, end_date], + geo_value="*", as_of=None, + issues=None, lag=None) + + if response["result"] != 1: + # Something failed in the API and we did not get real metadata + raise RuntimeError("Error when fetching metadata from the API", + response["message"]) + + api_df = pd.DataFrame.from_dict(response["epidata"]) + + # # Two possible error conditions: no data or too much data. + # if day_data["message"] == "no results": + # warnings.warn(f"No {data_source} {signal} data found on {day_str} " + # f"for geography '{geo_type}'", + # NoDataWarning) + # if day_data["message"] not in {"success", "no results"}: + # warnings.warn(f"Problem obtaining {data_source} {signal} data on {day_str} " + # f"for geography '{geo_type}': {day_data['message']}", + # RuntimeWarning) + # + # # In the too-much-data case, we continue to try putting the truncated + # # data in our results. In the no-data case, skip this day entirely, + # # since there is no "epidata" in the response. + # if day_data.get("epidata"): + # dfs.append(pd.DataFrame.from_dict(day_data["epidata"])) + # cur_day += timedelta(1) if time_type == "day" else timedelta(7) + # error_context = f"when fetching reference data from {start_date} to {end_date} " +\ f"for data source: {data_source}, signal type: {signal_type}, geo type: {geo_type}" diff --git a/_delphi_utils_python/delphi_utils/validator/dynamic.py b/_delphi_utils_python/delphi_utils/validator/dynamic.py index 9bc72ec1c..1f3698d69 100644 --- a/_delphi_utils_python/delphi_utils/validator/dynamic.py +++ b/_delphi_utils_python/delphi_utils/validator/dynamic.py @@ -6,6 +6,7 @@ import pandas as pd import numpy as np import covidcast +from delphi_epidata import Epidata from .errors import ValidationFailure from .datafetcher import get_geo_signal_combos, threaded_api_calls from .utils import relative_difference_by_min, TimeWindow, lag_converter @@ -79,7 +80,7 @@ def validate(self, all_frames, report): outlier_lookbehind = timedelta(days=14) # Authenticate API - covidcast.use_api_key(self.params.api_key) + # Epidata.auth = ("epidata", api) # Get all expected combinations of geo_type and signal. geo_signal_combos = get_geo_signal_combos(self.params.data_source, diff --git a/_delphi_utils_python/delphi_utils/validator/run.py b/_delphi_utils_python/delphi_utils/validator/run.py index f26b0ddec..0e80cd8b2 100644 --- a/_delphi_utils_python/delphi_utils/validator/run.py +++ b/_delphi_utils_python/delphi_utils/validator/run.py @@ -5,7 +5,7 @@ when the module is run with `python -m delphi_utils.validator`. """ import argparse as ap -import covidcast +from delphi_epidata import Epidata from .. import read_params, get_structured_logger from .validate import Validator @@ -18,7 +18,7 @@ def run_module(): args = parser.parse_args() params = read_params() assert "validation" in params - covidcast.use_api_key(params["validation"]["common"]["api_credentials"]) + Epidata.auth = ("epidata", params["validation"]["common"]["api_credentials"]) dry_run_param = params["validation"]["common"].get("dry_run", False) params["validation"]["common"]["dry_run"] = args.dry_run or dry_run_param validator = Validator(params) From 67a312c007d555dbd0b40457ca6dce491705f085 Mon Sep 17 00:00:00 2001 From: Amaris Sim Date: Thu, 25 Jul 2024 13:56:56 -0400 Subject: [PATCH 02/24] moving wrapper in seperate module --- .../delphi_utils/covidcast_wrapper.py | 202 ++++++++++++++++++ .../delphi_utils/validator/datafetcher.py | 48 +---- 2 files changed, 207 insertions(+), 43 deletions(-) create mode 100644 _delphi_utils_python/delphi_utils/covidcast_wrapper.py diff --git a/_delphi_utils_python/delphi_utils/covidcast_wrapper.py b/_delphi_utils_python/delphi_utils/covidcast_wrapper.py new file mode 100644 index 000000000..13d288fd4 --- /dev/null +++ b/_delphi_utils_python/delphi_utils/covidcast_wrapper.py @@ -0,0 +1,202 @@ +from datetime import datetime, date, timedelta +from typing import List, Tuple, Union, Iterable + +import pandas as pd + +from delphi_epidata import Epidata + +def date_generator(startdate, enddate): + while startdate <= enddate: + yield startdate.strftime('%Y-%m-%d') + startdate = startdate + timedelta(days=1) + + + +def metadata(): + response = Epidata._request("covidcast_meta") + + if response["result"] != 1: + # Something failed in the API and we did not get real metadata + raise RuntimeError("Error when fetching metadata from the API", + response["message"]) + + df = pd.DataFrame.from_dict(response["epidata"]) + return df + + +def signal( + data_source: str, + signal: str, # pylint: disable=W0621 + start_day: date = None, + end_day: date = None, + geo_type: str = "county", + geo_values: Union[str, Iterable[str]] = "*", + as_of: date = None, + issues: Union[date, Tuple[date], List[date]] = None, + lag: int = None, + time_type: str = "day", +) -> Union[pd.DataFrame, None]: + """Download a Pandas data frame for one signal. + + Obtains data for selected date ranges for all geographic regions of the + United States. Available data sources and signals are documented in the + `COVIDcast signal documentation + `_. + Most (but not all) data sources are available at the county level, but the + API can also return data aggregated to metropolitan statistical areas, + hospital referral regions, or states, as desired, by using the ``geo_type`` + argument. + + The COVIDcast API tracks updates and changes to its underlying data, and + records the first date each observation became available. For example, a + data source may report its estimate for a specific state on June 3rd on June + 5th, once records become available. This data is considered "issued" on June + 5th. Later, the data source may update its estimate for June 3rd based on + revised data, creating a new issue on June 8th. By default, ``signal()`` + returns the most recent issue available for every observation. The + ``as_of``, ``issues``, and ``lag`` parameters allow the user to select + specific issues instead, or to see all updates to observations. These + options are mutually exclusive; if you specify more than one, ``as_of`` will + take priority over ``issues``, which will take priority over ``lag``. + + Note that the API only tracks the initial value of an estimate and *changes* + to that value. If a value was first issued on June 5th and never updated, + asking for data issued on June 6th (using ``issues`` or ``lag``) would *not* + return that value, though asking for data ``as_of`` June 6th would. + + Note also that the API enforces a maximum result row limit; results beyond + the maximum limit are truncated. This limit is sufficient to fetch + observations in all counties in the United States on one day. This client + automatically splits queries for multiple days across multiple API calls. + However, if data for one day has been issued many times, using the + ``issues`` argument may return more results than the query limit. A warning + will be issued in this case. To see all results, split your query across + multiple calls with different ``issues`` arguments. + + See the `COVIDcast API documentation + `_ for more + information on available geography types, signals, and data formats, and + further discussion of issue dates and data versioning. + + :param data_source: String identifying the data source to query, such as + ``"fb-survey"``. + :param signal: String identifying the signal from that source to query, + such as ``"smoothed_cli"``. + :param start_day: Query data beginning on this date. Provided as a + ``datetime.date`` object. If ``start_day`` is ``None``, defaults to the + first day data is available for this signal. If ``time_type == "week"``, then + this is rounded to the epiweek containing the day (i.e. the previous Sunday). + :param end_day: Query data up to this date, inclusive. Provided as a + ``datetime.date`` object. If ``end_day`` is ``None``, defaults to the most + recent day data is available for this signal. If ``time_type == "week"``, then + this is rounded to the epiweek containing the day (i.e. the previous Sunday). + :param geo_type: The geography type for which to request this data, such as + ``"county"`` or ``"state"``. Available types are described in the + COVIDcast signal documentation. Defaults to ``"county"``. + :param geo_values: The geographies to fetch data for. The default, ``"*"``, + fetches all geographies. To fetch one geography, specify its ID as a + string; multiple geographies can be provided as an iterable (list, tuple, + ...) of strings. + :param as_of: Fetch only data that was available on or before this date, + provided as a ``datetime.date`` object. If ``None``, the default, return + the most recent available data. If ``time_type == "week"``, then + this is rounded to the epiweek containing the day (i.e. the previous Sunday). + :param issues: Fetch only data that was published or updated ("issued") on + these dates. Provided as either a single ``datetime.date`` object, + indicating a single date to fetch data issued on, or a tuple or list + specifying (start, end) dates. In this case, return all data issued in + this range. There may be multiple rows for each observation, indicating + several updates to its value. If ``None``, the default, return the most + recently issued data. If ``time_type == "week"``, then these are rounded to + the epiweek containing the day (i.e. the previous Sunday). + :param lag: Integer. If, for example, ``lag=3``, fetch only data that was + published or updated exactly 3 days after the date. For example, a row + with ``time_value`` of June 3 will only be included in the results if its + data was issued or updated on June 6. If ``None``, the default, return the + most recently issued data regardless of its lag. + :param time_type: The temporal resolution to request this data. Most signals + are available at the "day" resolution (the default); some are only + available at the "week" resolution, representing an MMWR week ("epiweek"). + :returns: A Pandas data frame with matching data, or ``None`` if no data is + returned. Each row is one observation on one day in one geographic location. + Contains the following columns: + + ``geo_value`` + Identifies the location, such as a state name or county FIPS code. The + geographic coding used by COVIDcast is described in the `API + documentation here + `_. + + ``signal`` + Name of the signal, same as the value of the ``signal`` input argument. Used for + downstream functions to recognize where this signal is from. + + ``time_value`` + Contains a `pandas Timestamp object + `_ + identifying the date this estimate is for. For data with ``time_type = "week"``, this + is the first day of the corresponding epiweek. + + ``issue`` + Contains a `pandas Timestamp object + `_ + identifying the date this estimate was issued. For example, an estimate + with a ``time_value`` of June 3 might have been issued on June 5, after + the data for June 3rd was collected and ingested into the API. + + ``lag`` + Integer giving the difference between ``issue`` and ``time_value``, + in days. + + ``value`` + The signal quantity requested. For example, in a query for the + ``confirmed_cumulative_num`` signal from the ``usa-facts`` source, + this would be the cumulative number of confirmed cases in the area, as + of the ``time_value``. + + ``stderr`` + The value's standard error, if available. + + ``sample_size`` + Indicates the sample size available in that geography on that day; + sample size may not be available for all signals, due to privacy or + other constraints. + + ``geo_type`` + Geography type for the signal, same as the value of the ``geo_type`` input argument. + Used for downstream functions to parse ``geo_value`` correctly + + ``data_source`` + Name of the signal source, same as the value of the ``data_source`` input argument. Used for + downstream functions to recognize where this signal is from. + + Consult the `signal documentation + `_ + for more details on how values and standard errors are calculated for + specific signals. + + """ + if start_day > end_day: + raise ValueError( + "end_day must be on or after start_day, but " f"start_day = '{start_day}', end_day = '{end_day}'" + ) + + time_values = list(date_generator(start_day, end_day)) + issues = list(date_generator(start_day, end_day)) #TODO placesholder + response = Epidata.covidcast(data_source, signal, time_type=time_type, + geo_type=geo_type, time_values=time_values, + geo_value=geo_values, as_of=as_of, + issues=issues, lag=lag) + if response["result"] != 1: + # Something failed in the API and we did not get real metadata + raise RuntimeError("Error when fetching metadata from the API", + response["message"]) + + api_df = pd.DataFrame.from_dict(response["epidata"]) + api_df["issue"] = pd.to_datetime(api_df["issue"], format='%Y%m%d') + api_df["time_value"] = pd.to_datetime(api_df["time_value"], format='%Y%m%d') + api_df.drop("direction", axis=1, inplace=True) + api_df["data_source"] = data_source + api_df["signal"] = signal + + return api_df diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index 13edc7681..61ec2ac9d 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -9,8 +9,8 @@ import requests import pandas as pd import numpy as np -import covidcast -from delphi_epidata import Epidata + +from ..covidcast_wrapper import metadata, signal from .errors import APIDataFetchError, ValidationFailure FILENAME_REGEX = re.compile( @@ -117,14 +117,7 @@ def get_geo_signal_combos(data_source, api_key): source_signal_mappings = {i['source']:i['db_source'] for i in meta_response.json()} - response = Epidata._request("covidcast_meta") - - if response["result"] != 1: - # Something failed in the API and we did not get real metadata - raise RuntimeError("Error when fetching metadata from the API", - response["message"]) - - meta = pd.DataFrame.from_dict(response["epidata"]) + meta = metadata() source_meta = meta[meta['data_source'] == data_source] # Need to convert np.records to tuples so they are hashable and can be used in sets and dicts. @@ -169,39 +162,8 @@ def fetch_api_reference(data_source, start_date, end_date, geo_type, signal_type Formatting is changed to match that of source data CSVs. """ with warnings.catch_warnings(): - warnings.simplefilter("ignore") - # api_df = covidcast.signal( - # data_source, signal_type, start_date, end_date, geo_type) - - response = Epidata.covidcast(data_source, signal_type, time_type="day", - geo_type=geo_type, time_values=[start_date, end_date], - geo_value="*", as_of=None, - issues=None, lag=None) - - if response["result"] != 1: - # Something failed in the API and we did not get real metadata - raise RuntimeError("Error when fetching metadata from the API", - response["message"]) - - api_df = pd.DataFrame.from_dict(response["epidata"]) - - # # Two possible error conditions: no data or too much data. - # if day_data["message"] == "no results": - # warnings.warn(f"No {data_source} {signal} data found on {day_str} " - # f"for geography '{geo_type}'", - # NoDataWarning) - # if day_data["message"] not in {"success", "no results"}: - # warnings.warn(f"Problem obtaining {data_source} {signal} data on {day_str} " - # f"for geography '{geo_type}': {day_data['message']}", - # RuntimeWarning) - # - # # In the too-much-data case, we continue to try putting the truncated - # # data in our results. In the no-data case, skip this day entirely, - # # since there is no "epidata" in the response. - # if day_data.get("epidata"): - # dfs.append(pd.DataFrame.from_dict(day_data["epidata"])) - # cur_day += timedelta(1) if time_type == "day" else timedelta(7) - # + api_df = signal(data_source, signal_type, start_date, end_date, geo_type) + error_context = f"when fetching reference data from {start_date} to {end_date} " +\ f"for data source: {data_source}, signal type: {signal_type}, geo type: {geo_type}" From e4f2679c6b069f41c26b40f7674532e5d368a075 Mon Sep 17 00:00:00 2001 From: Amaris Sim Date: Mon, 29 Jul 2024 17:02:11 -0400 Subject: [PATCH 03/24] working on test --- _delphi_utils_python/setup.py | 1 + .../tests/test_covidcast_wrapper.py | 40 ++++++++++++++++++ .../tests/test_data/covidcast_metadata.pkl | Bin 0 -> 368298 bytes .../doctor-visits_smoothed_adj_cli.pkl | Bin 0 -> 63570 bytes .../test_data/doctor-visits_smoothed_cli.pkl | Bin 0 -> 63566 bytes .../google-symptoms_s01_raw_search.pkl | Bin 0 -> 69123 bytes .../google-symptoms_s01_smoothed_search.pkl | Bin 0 -> 69128 bytes .../google-symptoms_s02_raw_search.pkl | Bin 0 -> 69123 bytes .../google-symptoms_s02_smoothed_search.pkl | Bin 0 -> 69128 bytes .../google-symptoms_s03_raw_search.pkl | Bin 0 -> 69123 bytes .../google-symptoms_s03_smoothed_search.pkl | Bin 0 -> 69128 bytes .../google-symptoms_s04_raw_search.pkl | Bin 0 -> 69123 bytes .../google-symptoms_s04_smoothed_search.pkl | Bin 0 -> 69128 bytes .../google-symptoms_s05_raw_search.pkl | Bin 0 -> 29830 bytes .../google-symptoms_s05_smoothed_search.pkl | Bin 0 -> 47117 bytes .../google-symptoms_s06_raw_search.pkl | Bin 0 -> 69123 bytes .../google-symptoms_s06_smoothed_search.pkl | Bin 0 -> 69128 bytes .../google-symptoms_scontrol_raw_search.pkl | Bin 0 -> 69128 bytes ...ogle-symptoms_scontrol_smoothed_search.pkl | Bin 0 -> 69133 bytes ...sions_smoothed_adj_covid19_from_claims.pkl | Bin 0 -> 64288 bytes ...dmissions_smoothed_covid19_from_claims.pkl | Bin 0 -> 64284 bytes 21 files changed, 41 insertions(+) create mode 100644 _delphi_utils_python/tests/test_covidcast_wrapper.py create mode 100644 _delphi_utils_python/tests/test_data/covidcast_metadata.pkl create mode 100644 _delphi_utils_python/tests/test_data/doctor-visits_smoothed_adj_cli.pkl create mode 100644 _delphi_utils_python/tests/test_data/doctor-visits_smoothed_cli.pkl create mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s01_raw_search.pkl create mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s01_smoothed_search.pkl create mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s02_raw_search.pkl create mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s02_smoothed_search.pkl create mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s03_raw_search.pkl create mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s03_smoothed_search.pkl create mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s04_raw_search.pkl create mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s04_smoothed_search.pkl create mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s05_raw_search.pkl create mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s05_smoothed_search.pkl create mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s06_raw_search.pkl create mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s06_smoothed_search.pkl create mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_scontrol_raw_search.pkl create mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_scontrol_smoothed_search.pkl create mode 100644 _delphi_utils_python/tests/test_data/hospital-admissions_smoothed_adj_covid19_from_claims.pkl create mode 100644 _delphi_utils_python/tests/test_data/hospital-admissions_smoothed_covid19_from_claims.pkl diff --git a/_delphi_utils_python/setup.py b/_delphi_utils_python/setup.py index 3dee89b53..0bb38ad8a 100644 --- a/_delphi_utils_python/setup.py +++ b/_delphi_utils_python/setup.py @@ -7,6 +7,7 @@ required = [ "boto3", "covidcast", + "delphi-epidata", "cvxpy", "scs<3.2.6", # TODO: remove this ; it is a cvxpy dependency, and the excluded version appears to break our jenkins build. see: https://github.com/cvxgrp/scs/issues/283 "darker[isort]~=2.1.1", diff --git a/_delphi_utils_python/tests/test_covidcast_wrapper.py b/_delphi_utils_python/tests/test_covidcast_wrapper.py new file mode 100644 index 000000000..986e31297 --- /dev/null +++ b/_delphi_utils_python/tests/test_covidcast_wrapper.py @@ -0,0 +1,40 @@ +from datetime import datetime, timedelta +from pathlib import Path +import pandas as pd +from delphi_utils import covidcast_wrapper +import covidcast +from freezegun import freeze_time +import os +from pandas.testing import assert_frame_equal + +TEST_DIR = Path(__file__).parent +API_KEY = os.environ.get('DELPHI_API_KEY') +covidcast.use_api_key(API_KEY) +class TestCovidcastWrapper: + API_KEY = os.environ.get('DELPHI_API_KEY') + covidcast.use_api_key(API_KEY) + def test_metadata(self): + expected_df = pd.read_pickle(f"{TEST_DIR}/test_data/covidcast_metadata.pkl") + df = covidcast_wrapper.metadata() + assert_frame_equal(expected_df, df) + + @freeze_time("2024-07-29") + def test_signal(self): + meta_df = covidcast_wrapper.metadata() + data_filter = ((meta_df["max_time"] >= datetime(year=2024, month=6, day=1)) & (meta_df["time_type"] == "day")) + signal_df = meta_df[data_filter].groupby("data_source")["signal"].agg(['unique']) + enddate = datetime.today() + startdate = enddate - timedelta(days=15) + for data_source, row in signal_df.iterrows(): + signals = list(row[0]) + for signal in signals: + # expected_df = covidcast.signal(data_source, signal, start_day=startdate, end_day=enddate, geo_type="state") + expected_df = pd.read_pickle(f"{TEST_DIR}/test_data/{data_source}_{signal}.pkl") + if expected_df is None: + print("%s %s %s %s not existing", data_source, signal, startdate, enddate) + continue + df = covidcast_wrapper.signal(data_source, signal, start_day=startdate, end_day=enddate, geo_type="state") + + check = df.merge(expected_df, indicator=True) + assert (check["_merge"] == "both").all() + diff --git a/_delphi_utils_python/tests/test_data/covidcast_metadata.pkl b/_delphi_utils_python/tests/test_data/covidcast_metadata.pkl new file mode 100644 index 0000000000000000000000000000000000000000..55b3c7677cdf5423745a05ead28e4801580c8c51 GIT binary patch literal 368298 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 UsR>?=o-8Mhr$8Ji@O3i(59B(<-T(jq literal 0 HcmV?d00001 diff --git a/_delphi_utils_python/tests/test_data/doctor-visits_smoothed_cli.pkl b/_delphi_utils_python/tests/test_data/doctor-visits_smoothed_cli.pkl new file mode 100644 index 0000000000000000000000000000000000000000..504df73c4510c914169b876b0b96a2a68ddce8fc GIT binary patch literal 63566 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 literal 0 HcmV?d00001 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_s01_raw_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_s01_raw_search.pkl new file mode 100644 index 0000000000000000000000000000000000000000..9a906d11eab7005ba9c2f940ada5554086a96c10 GIT binary patch literal 69123 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 literal 0 HcmV?d00001 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_s01_smoothed_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_s01_smoothed_search.pkl new file mode 100644 index 0000000000000000000000000000000000000000..d0243dc9bae379286408548fafb861548b618c92 GIT binary patch literal 69128 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 literal 0 HcmV?d00001 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_s02_smoothed_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_s02_smoothed_search.pkl new file mode 100644 index 0000000000000000000000000000000000000000..b46fbe539a8f73e4613d42992274df6a5471f533 GIT binary patch literal 69128 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 fRB9&Zr17aKN<|#`8KzVzi|V!l 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 literal 0 HcmV?d00001 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_s03_smoothed_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_s03_smoothed_search.pkl new file mode 100644 index 0000000000000000000000000000000000000000..d26b467efc4870d561699597f9b28b0dc899419a GIT binary patch literal 69128 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 V#MED4MpO2zlXCr6+`{bizX5PDHlY9j literal 0 HcmV?d00001 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_s04_smoothed_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_s04_smoothed_search.pkl new file mode 100644 index 0000000000000000000000000000000000000000..bd8ec7ab146e99b28c11ab56407160f891a36117 GIT binary patch literal 69128 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 Tm!%~Zy=>&nvaR;n&D{9k_c!?7 literal 0 HcmV?d00001 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_s05_smoothed_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_s05_smoothed_search.pkl new file mode 100644 index 0000000000000000000000000000000000000000..ab23a83f1dd3ba9db4e151141eda2708a95159fb GIT binary patch literal 47117 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 R!gB}YVkMv&)oQf3@PBg3_lW=i literal 0 HcmV?d00001 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_s06_raw_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_s06_raw_search.pkl new file mode 100644 index 0000000000000000000000000000000000000000..68d37e961d1e437edc24d6a3de8c06bea7e2ba80 GIT binary patch literal 69123 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 a$6Hky@Rjht!1M%+Vl!Ylbyihz;eP;FLaP}7 literal 0 HcmV?d00001 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_s06_smoothed_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_s06_smoothed_search.pkl new file mode 100644 index 0000000000000000000000000000000000000000..b550bbceae941856f30d5a12b69177148f2a3f65 GIT binary patch literal 69128 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 MD(wPQQcT#t0Gb%BZU6uP literal 0 HcmV?d00001 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_scontrol_raw_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_scontrol_raw_search.pkl new file mode 100644 index 0000000000000000000000000000000000000000..1350a0758607607452f79ac4a7a9610d580d0ce3 GIT binary patch literal 69128 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 QGoDDAz4Y4N{KVKl0cVY-SpWb4 literal 0 HcmV?d00001 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_scontrol_smoothed_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_scontrol_smoothed_search.pkl new file mode 100644 index 0000000000000000000000000000000000000000..af604c852ac6d13a544162abf99c2ef9ceb9666e GIT binary patch literal 69133 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 TTTHD{7p^zjoMUVW;eP)G-jKuH literal 0 HcmV?d00001 diff --git a/_delphi_utils_python/tests/test_data/hospital-admissions_smoothed_adj_covid19_from_claims.pkl b/_delphi_utils_python/tests/test_data/hospital-admissions_smoothed_adj_covid19_from_claims.pkl new file mode 100644 index 0000000000000000000000000000000000000000..041ceda55cbbb205b28eb734e131159a49de82ab GIT binary patch literal 64288 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 G>OTO05*&sA literal 0 HcmV?d00001 diff --git a/_delphi_utils_python/tests/test_data/hospital-admissions_smoothed_covid19_from_claims.pkl b/_delphi_utils_python/tests/test_data/hospital-admissions_smoothed_covid19_from_claims.pkl new file mode 100644 index 0000000000000000000000000000000000000000..f369f6b0e7370ff9f68459a6f45296439059efeb GIT binary patch literal 64284 zcmeHQ2UHVVyQSI?5s@OGA~tM*SFv9=AXaQxunU0%2#^GlAT|WCYpevjpk5WbUatiU z*s&LShY(^w1nJHCX2^KG{{MYzz5lKC9=`XVxYpT2a^_@apL6!v^Evq@OgmElqgvBT zq94HGvsof*Pl1qQ?ImRKI8sS#CzhBsu4y|$+Gn*iL~13`a^ramrIIdxt*z1=^qZpkTN**_X~gW}=FjyIS^v3@RHEk=#1G(l`uTI*Jm{UM z+7d&45HDbv>S%aD{$egmC}b_8nspO$JOzA_SQz9frYmYURg_9vQb*rZB|_?~woW=m z-9x%TIzwvZtnREirH96PsgIsSn=M`zz@hijm^MthX``xwrbK8)G=$Y{He+;>V!2|%c;VXMHd3P5K{%)lP)NxG`#3~-t?zFT&m#GTU<6>&>wL5 zRN+UlqTxrKgN8r-DX*!ZtI$+y@aWxmbUhy3Jddu-qrZbse+Qqg$EWM@edxlME_igY zgf8et1@s33Kf0g~H-K(lNH;2?8xYYAi0S6VOQ|A=Zg~k^WeL3%Om79#m4oT_g6a0i znUg-JhXon!WS$d+Bic?$0a?|^dj8*YGXIt)rkPIKz(*ho;EGxP16XVxS0v(6c3CPR z?-Cx!cp&qFC;?GKvNDhrl6V5*jfh7iu9&!D;);nYCa##cV&aO4D<-a(xMJdpi7O_q zn7Cr%iis;Gu9&!D;);nYCa##cV&aO4D<-a(xMJdpo5dA#tjIlV9XHK!QQE0%L+d3l9YjX~X4Ie-QjRc(6_O-AMNb!JmVNQ1;g}x<3g1 z96Y?Njp$iO^#{S9gNM!=ti*JG5d1lK@HdIONB0N8pM!^+r(E0AYYIKo}ql5C#YX zgaN|9zbymJ6(1wts~U2I2f_o*02v2l9FTE9<^joKy-lU0MP-W1I?)eP3dR3-_y@({$09QD&>i@ zR#S3WiTW5S0m=-iD)~uEXPqCDpZMOOen)7vTa`za%2adq#Jf%BW$3V^8ZrFHV?I(VV z3C0Ip+pNyS$EC$L7tG7Wj6?0%zh244?8(QY1D4!G?70D>Y$A(b*XzN;8CMcvdGB^B z(?N19urxk+H@^TET1LnV4cCTF4NtJ;uZ6AJMxbL4O5CZ(au(xAex z$93q>d70OVSA$LQej5C!78Oy0bGS_&FDw&QxV$;4CM z$1b($`55fgp*DP4Efy9}(mEX)i@U) z{t-Mby9VpGb)F@^QHI~%ma+q+U$DbRV{CtqR8(uuS*B4?2G;Zwi3+(Ki)##zbFpAng`F*K_lA(z2x{nksX2325U$N6cWJ+I?Z>Kkd8Ndczq$avqyLWxm1D2HgxTT2DONpR!DwpIr-A1Rux{D* zK~pl~;d}Je_)dWZaP@5M=Xtgc@493zw9~6c_%OZRww=pxFlL0pYuG0kjGd7CGCmu+ z#@A!cj4a1}kCZEQqm`I5e_YA0ktJZC9rE?Uh-7q<&o#c5_!JfQ()`~XFT@19()tG@ zQjl`MrFyndhTmNG#;5NngkN&TVx12%lzEMV>C1OmH%3rd5tWDD^mNK?0E=HQj5dD( z!@^HftekFPp354pNjx=t2$f;lTlde=_cM`_l+%V~R{(Zb_B`9lBD9u|I(SEX z14E5Ew&0lN;_k^~Q|%*^xYHxDkJ2IsA$w-*k$Aqw@3K{QG}kEMgBeciXD7kQww-ln zQ6ebu`gkhv9du_8j9led3^UK(x3prCuzUB;<VsPkWzZZC#v$FdQZ#nY)MV`wYH3bvf8 zF?h*;g7D5?wZp>-Vb!K))2NAeu%MN2`n}1yn0~4QN6@DMt1tDLvy>X2ZzouP?G{oD zTfKc%-K-kne6HTCEVdA{kCqO2bE^VD^g`fJ0#nmzT7g~4VAqmXz(m+Nq=cx=NJQXV z(*_q^IgB>7_H8gq$A>Y4rk(F2$LS=a^oGew2*!GZn~s*lq?HD{cy1YnUw*tKzH1?V z?Z4AC;HGifRZJyz%#Fm&Y+<*lcc-=1c{9gU%NbgYP z@Jd;Tu;iOd!B0e}ZAH$C*hEa}UtyU0;XQ8Z+4~ywev9@kTf4*`PKNT=mxEa=su+H& z5v^!<;PLYe=KN9-=~U;iTRR_jG&Ngwo%9^RnHNUpF3ZIe&7EWSQ@U*ayHT`;dj_^e z+`IK?Up7iRq%P20@DL`8^32btDo`0l6Mq+R!xx_UwKNL{H@$T{`=uUn!Z_XujRvsK z9Z6a2^ah7NPtfnQyA~t2b?v)#Z!tvr`J3k1RH4A(k9T>S%OJScqh+aYIYykzK3uop zH8RG>oL{*+1p;S9_@D+#2ZzONsV_{0Q*KL(E3FmKpJ};iae@*X2HoDTxmJ#`u}@C^ zBB{i5*S2$7+LvM%OqRY6`Gm;vL+>56OhlCX*C2k@WmIbq=;2;dgj3E519!!}#d1m2 z^JlDVc#fl#IQ$JJM!P0<-Jb=ya@H?uv*Iwh)3C$G`=x{Pb(F5ju_E+3HF;o5hg5vI zk$k9k)GO4z^f|MOTKDiUP?jpB#(&Y>+<7-su-wj`d(x!>w$ySX+ENTHN}gFUDfm)R zoxjGo3hm!*ozGhS9)dJk$ZYF;oc$`I1S$j5T8w{kMwE+c@p-GBT2FB2Sz9yC=Pbkx zG3z&QngXuTXU=7~W#Uri&XSS0WzZRWBYNhJ7q}g^I99|`AXX7ObHv>HSYm9|=b~CR zdX$apTJ7)=Z>qW`3G!<(XU|Lxk6mvtpj+1(|J_yi{lq1!(xattI(A~wRL|a%`uTp%Dp*_+xJdrN~M|*4SPi zF(bY7Dw*p){Afpr{6-y-jthYVQ!u}N#8uIchFye{p zo|)k#(A@KA|4xS_oS%5Dr%=5L6%BRg9rBB?I4gisfPBO$LaTzy^U$rujXLd`T&y}P zyVfn?5uW$;ZxL&ejsY4<6M}#QAdWT~H#&dT=_oM+JJB>0Qm>y@%RY zX@ zvy@OAo$u6#}%lJpB^;qhzRxoB$HHKxjpjOOJm>`K-P)zx?lakQr zz=F$o_a=D%^M*GtYcksJ(fSvSzUB^j=s#|eUwK3Y>^HI>|6ZGprDIGDhh^S@#ia=b zZjLyXUR-kYVIK?%gf%S@8AIyr{093tKN|*Re}0 zF+5iMeA&2iG2-Z*;9^W8-2l{&>Xl{j#KWW#{2EI2^*b`$l#$@ z=Ba)A5l*MhnWOESf{RMEyXJ8UY=cYY#S@vha<3+Cy}J?yV}!p1o=L}vJtog;oC|Py zUhVa)%`b3nP`r(Gsti_EWBb(~)v!ObdgmUyz)H-amfiN|MJP-ArPDU=x8NL~*r#|% z1@dJ&5vMfj5kGDAk=1ica3N86ctch>(&Oogm!$HqBcjAbLOMfjOft1r&XQTc|dySQT7 zp?>a%RFqSfSJem0(fU+&=A15>P>%_&T$NLZ5zqG+yGP5=vAeT!?&1Qhpe|pubmSNp z$;#0^S_uosg~M0$uEg9TlO1t+&oJBOb}~Dm3J=emzuL@qE9BHLtdA)VJnl+sQ32Tg*Anc9_f1`X<7zc+YPvMsJs|)`96^n*taM;u)w?{%P zR@AKj_?Y(r150gteU8gVNU8Po8SYoW?>NuT>PittTfE+PxzAhNTQ@4)>}?&4+t1f? zJE6eDu>JF|rrk%Utt%H-rX*vG^6B9$_X^y%qObgNuzsFT(O?}V_WJAyk7-{3t=YfL z(d?)|o3P5Zrpt@*HdXETkrtJp7Q-s3VHKX;nw@@R|6|5?R>C$sVe-+%DHvvZ-GzNF z6F2E)=#O&DdZIS{;npH-=tLWvEEIm}o_r)Z5$!l9H=hz0;LsXx$A|}M7+LsHKEtpC z9yeEny?>SufBUtu!X-+igd2xwbF*+?|JaPuVg)`?E-Y|{rhV$Km#+IpRpRu)I_W`! za;z~(yl^f$2|248*$*o!5f&mYc^X6c;hEc>$X6AjO>K>S!pO=Le69%ug z++BtYPs`((w@RQ>k*nMqk&KM=8!4?mXM?&5k1E-bk8Y10S`XsoU`y`kGtX1%5Tg{X zIr6d=v*wI`RxPWC_qE+m0&dArICNcPo4!}!zv5=k;qH{5*1oMfaB-o^_juRhOaI-L zjZaIl$nfMt87l$PaB@q>r%AYAzj;bI6A5VlQ&*J=6jRUqo(Vu1o#bj?l`ij0#V(o7EM}2`H`mUt1O)I zIs5rgSv78~r#qko(&--@A1}*+p@7|`aZM6-rZ_%Pq~v4Sr30Nl`=nvROr_E+@h$dp zKhAMAm7^*6;`Lt$zNnt;<9nBiu6&Qa=s36iG5Ye)PXy9XJrT%k(;}%A^#~yHA`B1) z{+~0z`5&L@^yAc20pPaI?S7OX-$+WLeD_ktfBt~8zl$*c?>^y7ag;SwNo7(eNO&OQ zfXoA;14IXi4iFt6IzV)Q=m60Hq60(+hz<}P`1jNS)f3Jn+SDVZ$iqUk&OZ2c#ezka0k!0g(ctghUC65)vgOO89ds;rIXD z)O6PRm;A1Qk3bZ_6|?*Yu-H7VNW>NJMN(f~x}!-!I3VMIOameXLx1F=zzvO<+MLdB(?89NZc?yqNThpKAEtTjt1*7@i z-`Z^V?QfBo%@GQv5`#bAVDSR{Ic_5Ea%yMoKM#SarX%|6$2#r*BjkEgR88cIhYbD;H@>}SN&GQ~lqx-#nwmPZp~0XggWn!Z z|1FUk_0yxK7u8bJs}+N-8EnI#4ufqO)Mc<8gL(|MXHcKP4h$MF*pWd)28|e`eqPk{ zGGVY2gQg6cF=)q6$zXQ|dob9O!CnmZX3&bkJ`DC{upfi{863c% zHG?(`+A=th!EZqNL&XH?4;2q&eter5DkSrR%nzCYvVN$>0a-s(JXokejjZP?BFOwu z@j&K>iU$i7kom#zK<0;v2r@rZJXkQ}qPf=(<}k>0IYUHqT?a~i Date: Mon, 29 Jul 2024 17:35:46 -0400 Subject: [PATCH 04/24] post process for metadata --- .../delphi_utils/covidcast_wrapper.py | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/covidcast_wrapper.py b/_delphi_utils_python/delphi_utils/covidcast_wrapper.py index 13d288fd4..9a22e47cf 100644 --- a/_delphi_utils_python/delphi_utils/covidcast_wrapper.py +++ b/_delphi_utils_python/delphi_utils/covidcast_wrapper.py @@ -1,9 +1,11 @@ -from datetime import datetime, date, timedelta +from datetime import date, timedelta from typing import List, Tuple, Union, Iterable +import numpy as np import pandas as pd from delphi_epidata import Epidata +from epiweeks import Week def date_generator(startdate, enddate): while startdate <= enddate: @@ -11,6 +13,27 @@ def date_generator(startdate, enddate): startdate = startdate + timedelta(days=1) +def _parse_datetimes(date_int: int, + time_type: str, + date_format: str = "%Y%m%d") -> Union[pd.Timestamp]: # annotating nan errors + """Convert a date or epiweeks string into timestamp objects. + + Datetimes (length 8) are converted to their corresponding date, while epiweeks (length 6) + are converted to the date of the start of the week. Returns nan otherwise + + Epiweeks use the CDC format. + + :param date_int: Int representation of date. + :param date_format: String of the date format to parse. + :returns: Timestamp. + """ + date_str = str(date_int) + if time_type == "day": + return pd.to_datetime(date_str, format=date_format) + if time_type == "week": + epiwk = Week(int(date_str[:4]), int(date_str[-2:])) + return pd.to_datetime(epiwk.startdate()) + return np.nan def metadata(): response = Epidata._request("covidcast_meta") @@ -21,6 +44,9 @@ def metadata(): response["message"]) df = pd.DataFrame.from_dict(response["epidata"]) + df["min_time"] = df.apply(lambda x: _parse_datetimes(x.min_time, x.time_type), axis=1) + df["max_time"] = df.apply(lambda x: _parse_datetimes(x.max_time, x.time_type), axis=1) + df["last_update"] = pd.to_datetime(df["last_update"], unit="s") return df @@ -182,7 +208,7 @@ def signal( ) time_values = list(date_generator(start_day, end_day)) - issues = list(date_generator(start_day, end_day)) #TODO placesholder + issues = list(date_generator(start_day, end_day)) #TODO placesholder need to see how the issues params are coming in response = Epidata.covidcast(data_source, signal, time_type=time_type, geo_type=geo_type, time_values=time_values, geo_value=geo_values, as_of=as_of, From a5628acc9967493a5985fc40f708d14b3883f24b Mon Sep 17 00:00:00 2001 From: Amaris Sim Date: Tue, 30 Jul 2024 16:12:07 -0400 Subject: [PATCH 05/24] lint and cleanup --- .../delphi_utils/covidcast_wrapper.py | 71 ++++++++++++------- .../delphi_utils/validator/dynamic.py | 13 ++-- .../delphi_utils/validator/run.py | 4 +- 3 files changed, 57 insertions(+), 31 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/covidcast_wrapper.py b/_delphi_utils_python/delphi_utils/covidcast_wrapper.py index 9a22e47cf..14d628f04 100644 --- a/_delphi_utils_python/delphi_utils/covidcast_wrapper.py +++ b/_delphi_utils_python/delphi_utils/covidcast_wrapper.py @@ -1,21 +1,32 @@ +"""module for covidcast api call wrapper.""" + from datetime import date, timedelta -from typing import List, Tuple, Union, Iterable +from typing import Iterable, Union -import numpy as np import pandas as pd - from delphi_epidata import Epidata from epiweeks import Week -def date_generator(startdate, enddate): - while startdate <= enddate: - yield startdate.strftime('%Y-%m-%d') - startdate = startdate + timedelta(days=1) + +def date_generator(startdate: date, enddate: date) -> Iterable[date]: + """ + Take start date and end date and generates date string. + + Parameters + ---------- + startdate: date + enddate: date + + Returns + ------- + generator of str + """ + while startdate <= enddate: + yield startdate.strftime("%Y-%m-%d") + startdate = startdate + timedelta(days=1) -def _parse_datetimes(date_int: int, - time_type: str, - date_format: str = "%Y%m%d") -> Union[pd.Timestamp]: # annotating nan errors +def _parse_datetimes(date_int: int, time_type: str, date_format: str = "%Y%m%d") -> Union[pd.Timestamp, None]: """Convert a date or epiweeks string into timestamp objects. Datetimes (length 8) are converted to their corresponding date, while epiweeks (length 6) @@ -33,15 +44,23 @@ def _parse_datetimes(date_int: int, if time_type == "week": epiwk = Week(int(date_str[:4]), int(date_str[-2:])) return pd.to_datetime(epiwk.startdate()) - return np.nan + return None + + +def metadata() -> Union[pd.DataFrame, None]: + """ + Make covidcast metadata api call. -def metadata(): + Returns + ------- + pd.DataFrame of covidcast metadata. + """ + # pylint: disable=W0212 response = Epidata._request("covidcast_meta") if response["result"] != 1: # Something failed in the API and we did not get real metadata - raise RuntimeError("Error when fetching metadata from the API", - response["message"]) + raise RuntimeError("Error when fetching metadata from the API", response["message"]) df = pd.DataFrame.from_dict(response["epidata"]) df["min_time"] = df.apply(lambda x: _parse_datetimes(x.min_time, x.time_type), axis=1) @@ -58,7 +77,6 @@ def signal( geo_type: str = "county", geo_values: Union[str, Iterable[str]] = "*", as_of: date = None, - issues: Union[date, Tuple[date], List[date]] = None, lag: int = None, time_type: str = "day", ) -> Union[pd.DataFrame, None]: @@ -208,19 +226,24 @@ def signal( ) time_values = list(date_generator(start_day, end_day)) - issues = list(date_generator(start_day, end_day)) #TODO placesholder need to see how the issues params are coming in - response = Epidata.covidcast(data_source, signal, time_type=time_type, - geo_type=geo_type, time_values=time_values, - geo_value=geo_values, as_of=as_of, - issues=issues, lag=lag) + + response = Epidata.covidcast( + data_source, + signal, + time_type=time_type, + geo_type=geo_type, + time_values=time_values, + geo_value=geo_values, + as_of=as_of, + lag=lag, + ) if response["result"] != 1: # Something failed in the API and we did not get real metadata - raise RuntimeError("Error when fetching metadata from the API", - response["message"]) + raise RuntimeError("Error when fetching metadata from the API", response["message"]) api_df = pd.DataFrame.from_dict(response["epidata"]) - api_df["issue"] = pd.to_datetime(api_df["issue"], format='%Y%m%d') - api_df["time_value"] = pd.to_datetime(api_df["time_value"], format='%Y%m%d') + api_df["issue"] = pd.to_datetime(api_df["issue"], format="%Y%m%d") + api_df["time_value"] = pd.to_datetime(api_df["time_value"], format="%Y%m%d") api_df.drop("direction", axis=1, inplace=True) api_df["data_source"] = data_source api_df["signal"] = signal diff --git a/_delphi_utils_python/delphi_utils/validator/dynamic.py b/_delphi_utils_python/delphi_utils/validator/dynamic.py index 1f3698d69..df09646b7 100644 --- a/_delphi_utils_python/delphi_utils/validator/dynamic.py +++ b/_delphi_utils_python/delphi_utils/validator/dynamic.py @@ -1,15 +1,16 @@ """Dynamic file checks.""" + +import re from dataclasses import dataclass from datetime import date, timedelta from typing import Dict, Set -import re -import pandas as pd + import numpy as np -import covidcast -from delphi_epidata import Epidata -from .errors import ValidationFailure +import pandas as pd + from .datafetcher import get_geo_signal_combos, threaded_api_calls -from .utils import relative_difference_by_min, TimeWindow, lag_converter +from .errors import ValidationFailure +from .utils import TimeWindow, lag_converter, relative_difference_by_min class DynamicValidator: diff --git a/_delphi_utils_python/delphi_utils/validator/run.py b/_delphi_utils_python/delphi_utils/validator/run.py index 0e80cd8b2..83aab9f95 100644 --- a/_delphi_utils_python/delphi_utils/validator/run.py +++ b/_delphi_utils_python/delphi_utils/validator/run.py @@ -5,8 +5,10 @@ when the module is run with `python -m delphi_utils.validator`. """ import argparse as ap + from delphi_epidata import Epidata -from .. import read_params, get_structured_logger + +from .. import get_structured_logger, read_params from .validate import Validator From 6e22db86603e26fd9efbea2a761cbbf9441568bb Mon Sep 17 00:00:00 2001 From: Amaris Sim Date: Tue, 30 Jul 2024 18:42:01 -0400 Subject: [PATCH 06/24] fixing for test --- _delphi_utils_python/delphi_utils/__init__.py | 12 ++++++------ .../delphi_utils/validator/datafetcher.py | 13 +++++++------ .../tests/test_covidcast_wrapper.py | 7 +------ .../tests/test_data/covidcast_metadata.pkl | Bin 368298 -> 0 bytes .../tests/validator/test_datafetcher.py | 4 ++-- 5 files changed, 16 insertions(+), 20 deletions(-) delete mode 100644 _delphi_utils_python/tests/test_data/covidcast_metadata.pkl diff --git a/_delphi_utils_python/delphi_utils/__init__.py b/_delphi_utils_python/delphi_utils/__init__.py index 7ff828440..c5a804c74 100644 --- a/_delphi_utils_python/delphi_utils/__init__.py +++ b/_delphi_utils_python/delphi_utils/__init__.py @@ -4,15 +4,15 @@ from __future__ import absolute_import from .archive import ArchiveDiffer, GitArchiveDiffer, S3ArchiveDiffer +from .covidcast_wrapper import metadata, signal from .export import create_export_csv -from .utils import read_params - -from .slack_notifier import SlackNotifier -from .logger import get_structured_logger from .geomap import GeoMapper -from .smooth import Smoother -from .signal import add_prefix +from .logger import get_structured_logger from .nancodes import Nans +from .signal import add_prefix +from .slack_notifier import SlackNotifier +from .smooth import Smoother +from .utils import read_params from .weekday import Weekday __version__ = "0.3.24" diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index 61ec2ac9d..b648b7567 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -3,14 +3,15 @@ import re import threading +import warnings from os import listdir from os.path import isfile, join -import warnings -import requests -import pandas as pd + import numpy as np +import pandas as pd +import requests +from delphi_utils import covidcast_wrapper -from ..covidcast_wrapper import metadata, signal from .errors import APIDataFetchError, ValidationFailure FILENAME_REGEX = re.compile( @@ -117,7 +118,7 @@ def get_geo_signal_combos(data_source, api_key): source_signal_mappings = {i['source']:i['db_source'] for i in meta_response.json()} - meta = metadata() + meta = covidcast_wrapper.metadata() source_meta = meta[meta['data_source'] == data_source] # Need to convert np.records to tuples so they are hashable and can be used in sets and dicts. @@ -162,7 +163,7 @@ def fetch_api_reference(data_source, start_date, end_date, geo_type, signal_type Formatting is changed to match that of source data CSVs. """ with warnings.catch_warnings(): - api_df = signal(data_source, signal_type, start_date, end_date, geo_type) + api_df = covidcast_wrapper.signal(data_source, signal_type, start_date, end_date, geo_type) error_context = f"when fetching reference data from {start_date} to {end_date} " +\ diff --git a/_delphi_utils_python/tests/test_covidcast_wrapper.py b/_delphi_utils_python/tests/test_covidcast_wrapper.py index 986e31297..d86df7a5e 100644 --- a/_delphi_utils_python/tests/test_covidcast_wrapper.py +++ b/_delphi_utils_python/tests/test_covidcast_wrapper.py @@ -4,17 +4,12 @@ from delphi_utils import covidcast_wrapper import covidcast from freezegun import freeze_time -import os from pandas.testing import assert_frame_equal TEST_DIR = Path(__file__).parent -API_KEY = os.environ.get('DELPHI_API_KEY') -covidcast.use_api_key(API_KEY) class TestCovidcastWrapper: - API_KEY = os.environ.get('DELPHI_API_KEY') - covidcast.use_api_key(API_KEY) def test_metadata(self): - expected_df = pd.read_pickle(f"{TEST_DIR}/test_data/covidcast_metadata.pkl") + expected_df = covidcast.metadata() df = covidcast_wrapper.metadata() assert_frame_equal(expected_df, df) diff --git a/_delphi_utils_python/tests/test_data/covidcast_metadata.pkl b/_delphi_utils_python/tests/test_data/covidcast_metadata.pkl deleted file mode 100644 index 55b3c7677cdf5423745a05ead28e4801580c8c51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368298 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 te=3zorcWg%^wkg@jh_Sj(P+Fe=?ga0M Date: Wed, 31 Jul 2024 21:01:24 -0400 Subject: [PATCH 07/24] implimentating suggested changes --- .../delphi_utils/covidcast_wrapper.py | 153 ++++-------------- .../delphi_utils/validator/dynamic.py | 2 - .../tests/test_covidcast_wrapper.py | 9 +- .../tests/test_data/covidcast_metadata.pkl | Bin 0 -> 368298 bytes .../doctor-visits_smoothed_adj_cli.pkl | Bin 63570 -> 0 bytes .../test_data/doctor-visits_smoothed_cli.pkl | Bin 63566 -> 0 bytes .../google-symptoms_s01_raw_search.pkl | Bin 69123 -> 0 bytes .../google-symptoms_s01_smoothed_search.pkl | Bin 69128 -> 0 bytes .../google-symptoms_s02_raw_search.pkl | Bin 69123 -> 0 bytes .../google-symptoms_s02_smoothed_search.pkl | Bin 69128 -> 0 bytes .../google-symptoms_s03_raw_search.pkl | Bin 69123 -> 0 bytes .../google-symptoms_s03_smoothed_search.pkl | Bin 69128 -> 0 bytes .../google-symptoms_s04_raw_search.pkl | Bin 69123 -> 0 bytes .../google-symptoms_s04_smoothed_search.pkl | Bin 69128 -> 0 bytes .../google-symptoms_s05_raw_search.pkl | Bin 29830 -> 0 bytes .../google-symptoms_s05_smoothed_search.pkl | Bin 47117 -> 0 bytes .../google-symptoms_s06_raw_search.pkl | Bin 69123 -> 0 bytes .../google-symptoms_s06_smoothed_search.pkl | Bin 69128 -> 0 bytes .../google-symptoms_scontrol_raw_search.pkl | Bin 69128 -> 0 bytes ...ogle-symptoms_scontrol_smoothed_search.pkl | Bin 69133 -> 0 bytes ...sions_smoothed_adj_covid19_from_claims.pkl | Bin 64288 -> 0 bytes ...dmissions_smoothed_covid19_from_claims.pkl | Bin 64284 -> 0 bytes 22 files changed, 36 insertions(+), 128 deletions(-) create mode 100644 _delphi_utils_python/tests/test_data/covidcast_metadata.pkl delete mode 100644 _delphi_utils_python/tests/test_data/doctor-visits_smoothed_adj_cli.pkl delete mode 100644 _delphi_utils_python/tests/test_data/doctor-visits_smoothed_cli.pkl delete mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s01_raw_search.pkl delete mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s01_smoothed_search.pkl delete mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s02_raw_search.pkl delete mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s02_smoothed_search.pkl delete mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s03_raw_search.pkl delete mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s03_smoothed_search.pkl delete mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s04_raw_search.pkl delete mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s04_smoothed_search.pkl delete mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s05_raw_search.pkl delete mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s05_smoothed_search.pkl delete mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s06_raw_search.pkl delete mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_s06_smoothed_search.pkl delete mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_scontrol_raw_search.pkl delete mode 100644 _delphi_utils_python/tests/test_data/google-symptoms_scontrol_smoothed_search.pkl delete mode 100644 _delphi_utils_python/tests/test_data/hospital-admissions_smoothed_adj_covid19_from_claims.pkl delete mode 100644 _delphi_utils_python/tests/test_data/hospital-admissions_smoothed_covid19_from_claims.pkl diff --git a/_delphi_utils_python/delphi_utils/covidcast_wrapper.py b/_delphi_utils_python/delphi_utils/covidcast_wrapper.py index 14d628f04..00baaf9d1 100644 --- a/_delphi_utils_python/delphi_utils/covidcast_wrapper.py +++ b/_delphi_utils_python/delphi_utils/covidcast_wrapper.py @@ -8,7 +8,7 @@ from epiweeks import Week -def date_generator(startdate: date, enddate: date) -> Iterable[date]: +def date_generator(startdate: date, enddate: date, time_type: str) -> Iterable[date]: """ Take start date and end date and generates date string. @@ -16,14 +16,21 @@ def date_generator(startdate: date, enddate: date) -> Iterable[date]: ---------- startdate: date enddate: date + time_type: str Returns ------- generator of str """ - while startdate <= enddate: - yield startdate.strftime("%Y-%m-%d") - startdate = startdate + timedelta(days=1) + if time_type.lower() == "day": + while startdate <= enddate: + yield startdate.strftime("%Y-%m-%d") + startdate = startdate + timedelta(days=1) + elif time_type.lower() == "week": + while startdate <= enddate: + epiweek = Week.fromdate(startdate) + yield epiweek + startdate = startdate + timedelta(days=7) def _parse_datetimes(date_int: int, time_type: str, date_format: str = "%Y%m%d") -> Union[pd.Timestamp, None]: @@ -34,8 +41,11 @@ def _parse_datetimes(date_int: int, time_type: str, date_format: str = "%Y%m%d") Epiweeks use the CDC format. - :param date_int: Int representation of date. - :param date_format: String of the date format to parse. + date_int: Int representation of date. + time_type: The temporal resolution to request this data. Most signals + are available at the "day" resolution (the default); some are only + available at the "week" resolution, representing an MMWR week ("epiweek"). + date_format: String of the date format to parse. :returns: Timestamp. """ date_str = str(date_int) @@ -55,8 +65,7 @@ def metadata() -> Union[pd.DataFrame, None]: ------- pd.DataFrame of covidcast metadata. """ - # pylint: disable=W0212 - response = Epidata._request("covidcast_meta") + response = Epidata.covidcast_meta() if response["result"] != 1: # Something failed in the API and we did not get real metadata @@ -80,145 +89,43 @@ def signal( lag: int = None, time_type: str = "day", ) -> Union[pd.DataFrame, None]: - """Download a Pandas data frame for one signal. - - Obtains data for selected date ranges for all geographic regions of the - United States. Available data sources and signals are documented in the - `COVIDcast signal documentation - `_. - Most (but not all) data sources are available at the county level, but the - API can also return data aggregated to metropolitan statistical areas, - hospital referral regions, or states, as desired, by using the ``geo_type`` - argument. - - The COVIDcast API tracks updates and changes to its underlying data, and - records the first date each observation became available. For example, a - data source may report its estimate for a specific state on June 3rd on June - 5th, once records become available. This data is considered "issued" on June - 5th. Later, the data source may update its estimate for June 3rd based on - revised data, creating a new issue on June 8th. By default, ``signal()`` - returns the most recent issue available for every observation. The - ``as_of``, ``issues``, and ``lag`` parameters allow the user to select - specific issues instead, or to see all updates to observations. These - options are mutually exclusive; if you specify more than one, ``as_of`` will - take priority over ``issues``, which will take priority over ``lag``. - - Note that the API only tracks the initial value of an estimate and *changes* - to that value. If a value was first issued on June 5th and never updated, - asking for data issued on June 6th (using ``issues`` or ``lag``) would *not* - return that value, though asking for data ``as_of`` June 6th would. - - Note also that the API enforces a maximum result row limit; results beyond - the maximum limit are truncated. This limit is sufficient to fetch - observations in all counties in the United States on one day. This client - automatically splits queries for multiple days across multiple API calls. - However, if data for one day has been issued many times, using the - ``issues`` argument may return more results than the query limit. A warning - will be issued in this case. To see all results, split your query across - multiple calls with different ``issues`` arguments. - - See the `COVIDcast API documentation - `_ for more - information on available geography types, signals, and data formats, and - further discussion of issue dates and data versioning. - - :param data_source: String identifying the data source to query, such as + """ + Makes covidcast signal api call. + + data_source: String identifying the data source to query, such as ``"fb-survey"``. - :param signal: String identifying the signal from that source to query, + signal: String identifying the signal from that source to query, such as ``"smoothed_cli"``. - :param start_day: Query data beginning on this date. Provided as a + start_day: Query data beginning on this date. Provided as a ``datetime.date`` object. If ``start_day`` is ``None``, defaults to the first day data is available for this signal. If ``time_type == "week"``, then this is rounded to the epiweek containing the day (i.e. the previous Sunday). - :param end_day: Query data up to this date, inclusive. Provided as a + end_day: Query data up to this date, inclusive. Provided as a ``datetime.date`` object. If ``end_day`` is ``None``, defaults to the most recent day data is available for this signal. If ``time_type == "week"``, then this is rounded to the epiweek containing the day (i.e. the previous Sunday). - :param geo_type: The geography type for which to request this data, such as + geo_type: The geography type for which to request this data, such as ``"county"`` or ``"state"``. Available types are described in the COVIDcast signal documentation. Defaults to ``"county"``. - :param geo_values: The geographies to fetch data for. The default, ``"*"``, + geo_values: The geographies to fetch data for. The default, ``"*"``, fetches all geographies. To fetch one geography, specify its ID as a string; multiple geographies can be provided as an iterable (list, tuple, ...) of strings. - :param as_of: Fetch only data that was available on or before this date, + as_of: Fetch only data that was available on or before this date, provided as a ``datetime.date`` object. If ``None``, the default, return the most recent available data. If ``time_type == "week"``, then this is rounded to the epiweek containing the day (i.e. the previous Sunday). - :param issues: Fetch only data that was published or updated ("issued") on - these dates. Provided as either a single ``datetime.date`` object, - indicating a single date to fetch data issued on, or a tuple or list - specifying (start, end) dates. In this case, return all data issued in - this range. There may be multiple rows for each observation, indicating - several updates to its value. If ``None``, the default, return the most - recently issued data. If ``time_type == "week"``, then these are rounded to - the epiweek containing the day (i.e. the previous Sunday). - :param lag: Integer. If, for example, ``lag=3``, fetch only data that was + lag: Integer. If, for example, ``lag=3``, fetch only data that was published or updated exactly 3 days after the date. For example, a row with ``time_value`` of June 3 will only be included in the results if its data was issued or updated on June 6. If ``None``, the default, return the most recently issued data regardless of its lag. - :param time_type: The temporal resolution to request this data. Most signals + time_type: The temporal resolution to request this data. Most signals are available at the "day" resolution (the default); some are only available at the "week" resolution, representing an MMWR week ("epiweek"). :returns: A Pandas data frame with matching data, or ``None`` if no data is returned. Each row is one observation on one day in one geographic location. Contains the following columns: - - ``geo_value`` - Identifies the location, such as a state name or county FIPS code. The - geographic coding used by COVIDcast is described in the `API - documentation here - `_. - - ``signal`` - Name of the signal, same as the value of the ``signal`` input argument. Used for - downstream functions to recognize where this signal is from. - - ``time_value`` - Contains a `pandas Timestamp object - `_ - identifying the date this estimate is for. For data with ``time_type = "week"``, this - is the first day of the corresponding epiweek. - - ``issue`` - Contains a `pandas Timestamp object - `_ - identifying the date this estimate was issued. For example, an estimate - with a ``time_value`` of June 3 might have been issued on June 5, after - the data for June 3rd was collected and ingested into the API. - - ``lag`` - Integer giving the difference between ``issue`` and ``time_value``, - in days. - - ``value`` - The signal quantity requested. For example, in a query for the - ``confirmed_cumulative_num`` signal from the ``usa-facts`` source, - this would be the cumulative number of confirmed cases in the area, as - of the ``time_value``. - - ``stderr`` - The value's standard error, if available. - - ``sample_size`` - Indicates the sample size available in that geography on that day; - sample size may not be available for all signals, due to privacy or - other constraints. - - ``geo_type`` - Geography type for the signal, same as the value of the ``geo_type`` input argument. - Used for downstream functions to parse ``geo_value`` correctly - - ``data_source`` - Name of the signal source, same as the value of the ``data_source`` input argument. Used for - downstream functions to recognize where this signal is from. - - Consult the `signal documentation - `_ - for more details on how values and standard errors are calculated for - specific signals. - """ if start_day > end_day: raise ValueError( @@ -239,7 +146,7 @@ def signal( ) if response["result"] != 1: # Something failed in the API and we did not get real metadata - raise RuntimeError("Error when fetching metadata from the API", response["message"]) + raise RuntimeError("Error when fetching signal data from the API", response["message"]) api_df = pd.DataFrame.from_dict(response["epidata"]) api_df["issue"] = pd.to_datetime(api_df["issue"], format="%Y%m%d") diff --git a/_delphi_utils_python/delphi_utils/validator/dynamic.py b/_delphi_utils_python/delphi_utils/validator/dynamic.py index df09646b7..dbdfe34e5 100644 --- a/_delphi_utils_python/delphi_utils/validator/dynamic.py +++ b/_delphi_utils_python/delphi_utils/validator/dynamic.py @@ -80,8 +80,6 @@ def validate(self, all_frames, report): # Get 14 days prior to the earliest list date outlier_lookbehind = timedelta(days=14) - # Authenticate API - # Epidata.auth = ("epidata", api) # Get all expected combinations of geo_type and signal. geo_signal_combos = get_geo_signal_combos(self.params.data_source, diff --git a/_delphi_utils_python/tests/test_covidcast_wrapper.py b/_delphi_utils_python/tests/test_covidcast_wrapper.py index d86df7a5e..24f4c2a17 100644 --- a/_delphi_utils_python/tests/test_covidcast_wrapper.py +++ b/_delphi_utils_python/tests/test_covidcast_wrapper.py @@ -4,19 +4,22 @@ from delphi_utils import covidcast_wrapper import covidcast from freezegun import freeze_time +from delphi_epidata import Epidata from pandas.testing import assert_frame_equal TEST_DIR = Path(__file__).parent class TestCovidcastWrapper: + Epidata.debug = True def test_metadata(self): expected_df = covidcast.metadata() df = covidcast_wrapper.metadata() assert_frame_equal(expected_df, df) - @freeze_time("2024-07-29") + @freeze_time("2022-01-29") def test_signal(self): - meta_df = covidcast_wrapper.metadata() - data_filter = ((meta_df["max_time"] >= datetime(year=2024, month=6, day=1)) & (meta_df["time_type"] == "day")) + meta_df = pd.read_pickle(f"{TEST_DIR}/test_data/covidcast_metadata.pkl") + + data_filter = (meta_df["max_time"] >= datetime(year=2024, month=6, day=1)) signal_df = meta_df[data_filter].groupby("data_source")["signal"].agg(['unique']) enddate = datetime.today() startdate = enddate - timedelta(days=15) diff --git a/_delphi_utils_python/tests/test_data/covidcast_metadata.pkl b/_delphi_utils_python/tests/test_data/covidcast_metadata.pkl new file mode 100644 index 0000000000000000000000000000000000000000..914faf6959f946c0302e9ba9d7bb0143380b5de3 GIT binary patch literal 368298 zcmbTe2RxPk`#)}PW$(RZ@9lNjqpTvMC86w+hN6f>C@U$+C?v`#vK`5;h_WLJg=CYY z-$Cc}`Mlqs_xJPp|L@0noY%R=ecji&@7KJZ*Xs@&`y!~8!y$^eyl=eF8efX%0 z@5zKH8eLDHBOYd3bV5A#OqSoL9P)H?Iw_4mCn0M4p;O++-Hv#8x*T%aI0>sA#o&F) z>$v}xH`t#pzHUbnqNoqK`ucb|opN<`@!c?)NT5Xc+y8$rjP}j^JQi<`d{$JYwH^J@ zKvpMn$|mL&uN0pc}2n^a<8Ly9nEK_25iu`o21RN-;I!nnBuRy+c?m6opUlr z@-IockAzz?d8h1)jn|uCz-M;<+(gri=%;GyWnFD%xL5I3LD4KM8MIw z^X{LU2{e+p8l;yu$D91 zVdiuk&krzvm*gRtfTuU~FmHM=$HYwHUff;)*?g~l7Mfwq24Coan9hb+Q^$9sBp~>3 z7&c1+`OT6qVS0-Wvf3=OE~#wkZ7Kc7?>b`{_vPGo`0H~hE?69w>qG97vr&zE7tlmh zLPyULBJiChY~6Q+A4Is$MP9i=zIC1dU~%(t#&qHBRaQCNM-y*Rd`b50?b|QFQpDLaXDEdMCnw;s zN-zIT3^$Gmr3{SF1CCxPx+lt+DF&V6_P6u}%Wzj82tXheB`@2QNFvt@c z6i|zz$q5uf#mFJOEjBAsnh0?IQD7qEUEYZTPOefVt9>H#CGs0O-%Lkei}D*TRK)Vs zAtqk^?j3u{p>L(M|Msn3WOuIVThsgsif7BYlblQp-#W9Yj|LJzPh9HV@KITqEKBUW zLqY^1GfAzskB#Al*9F>+4@MAfd+(UcVIwH}K(l@!%?d1plH6Szj3F{#^2$qUDrioG z%*;%B821fH-!{nvjk9{0^u$V_YCWF!@F5+1OGN7JnFc`i`pDoymOccLzRUGWHiB+% zmaA>Yt>9?>N9QYj23z$2Gl$aIo=&RWUqVI>JA91T2tkGTnMvA9K6u+8aMQ$_`XB3y z*nUOI5Zi8ieaXDN9(#>-5&7q_vwwO#gglPU$JZww05qIAkP!y%HCUk6rqjy<_)sR2<% zO_-hfnsE3NhAef>9O`{{=JMOV zLc86iUd$AH2#fel;<&(d^Vor>&zuT;7j#4m=H6at_z)lsX3SBh6GDq<`F*vWxCk8x z*Ia+xocy$-srNxw9&kAjSN0ie zKgzf)?Z^TnN-Zafo| zBnMfQ*ZUJ)dXZjh`9(=*LJ;X`-cf>We|D5Fzq76G035$sY^+{-n>e^zG^-UdiUO~b z*h{`4G01i!%U)QOgQ_1NtK129z|myRPR7JmRNnJ+H^rwGG+E(!c{TerO4$*5E)@~s z<+4Ypx>O~I!2La0@sK+)oY=YeII@xq9CqI?%vAS}ISaxy{$qR-lnWO1rN*e`a|xKH8`pFAi3HV!u~ zQ9|f}vXDSaN;tj}KVI-t6!JbDITK983MWP^op%TE;O*@Ud>YT?!2^40YF{PYmxtnK znY=u|gdn3h{d(j)hj{a?_R;2VCic~u?|I%<7@naMwyVjV1Gx_c*UxZuz}qkD|-{cbEp z^okTD5k4PjeIf|mgV_(;+quAgoA%)16K<%My|shw4Id=jDXm?km%+>T>2xwk)Geb} zTe+-<4+(&lTjRkC8zNAR4;rDL;Q!slg}nIO<2KLC(C2N3OjDZ=(#a1PoT|tuEIPT zRqxjEshB}*1N9RI@d7ZmG_WVcln@eK?6IE`)VB1QcA0(voiJ;)|8lVpT`hBXpLT~8 zUcKBn)=l0@A+ptFrM?z@KJ1Vs9l%Hko7$} z8DM{L#;_Az@-$3~e{XqR!0jg!Sjc6(OU0w)hXtp`<=$ne;jlysjbA@~0&QPNnj}SkEQY z@T5F)j9MNtXfb5^OZ( zX$a}=d{W;cgr_e?oSj@t(Si@Narf!GWI)RD&R5RwJn(X-{qXErCSc}n9z~VBV5ChY zf8Yw%{>RrEB)j;*R%tgu*I5x*Hav3A$(tYU-Cgi=J|he=v9-`}P#x;8Twu`Wkp8v;u)3+<+C1Iai$KVI*_;s|u>Mgr?<_jdpp=bIttQ&RTxa=ZO@f~$` z1Y1q(EumpD{`$;uAsF&D+1BGi17%Jzq>1lIp<&O&*BxynkZ35H<*H5&PhO{x8XCy~ z$4y7k+$J`NS~|)%cZxh#7>F8((XyDWyj6JpI|( zvurwmqrc0IJr+J}45=#R->O{oAfY4BbSOy|7H6ow+$huq`!});Z|3yC*DUzuYg1DQ zan7zfv3h z_xEUD$fKsa*!lV%e~ssER+M11l;~S+_ZF4p8oKz?zC#-Naoc5cx{-cIY4EOH4A6I3 zwkeyw3&{$SwF(@>pyuZRJjNj}(D?>-p1q6}NK0#9p4kdDyjjh>PW5OQ(Z!;w>hm24 zw_d{0`y|tHDK7AV#nNR%SD~MXm}|UWlurY;>q2$tX*JlFJ0j0muLXSRwS?hC#?b89 z*X1Y+Aimwzo1M=H;$NTED4f@W&1FNk5p;5&(^=KC#LJV3Nlq?Q0$kSfnVp%@06&&I z(HuJ+Ncno&>HNN3fRl>}96RAr!wl;8mb*2v^I&W+MOEk^Hgkk z@eUo1u@DS@-HUFw7QJj--g)C(Fz0AHP-N3|th-W#`S`{P3`QY8uO zsXbGH+`TyZJ#;WgRM=dV^d1S|c*@oem^@k&CJ-hKj7kO7L-k8?w>`0_)X?|7UWgS3e;f;FWtP z%ES)!Yr(7nBy51=A76Eg+g6{A8Zxda%<-fl9d3iDXqhBbwuoHPpAVw6Ju#`#`?HZk zyGO?5@+@Svni4!^nTGac^bJC0bO9sxBbaN z09)_LxWJ%3*^oL;_8cp>JJlFUX(Jr;VJi&MsdBnfnv#1%1xV81y z7giHdoKyeL%l>glqDq-lLarDsYU8%eE6j z)#$`a+TnQ~3|ffLG%0s&M%M4j>jn~-fkG?UCN=jNl4_rhaSFofsW)4$gCz;_v&xo_+r)T(eIKk$@4hJ7!Pnu|D1>E|at9QnN#N7;v9axBbYAnFX z{@ev8d2{IY%6*#VWDVrkgE;5?EWs`%@|5EVb7)hso36;Tz|%gQYfs*_TSM*}vWm(O zOCbB0Xuz7H12synO-GYV!CCF`WaTAn+~7BV(0B1j{8}X~WtY*-qA&EnpVpVAOWA#co^J3I;KTMf`vlNLl5Ismzt3vN6DZl0kntlGp9@`b0_!2Wb}_m!H?55V4#C2M!G( zveSl{0;!8=#QpInzbE8?<7c=bif0}VP;jcKwa8=^`k-Ycs9k#xJW zbZ4tCw^tGZj{kUN_)1c_4838E+Q)LB6a`69v5e%cAVsU8Xh&@fy2W6! zAb+(CdAlhIO&69Rs_^?Kh;Nl52J6qPLFvn=|ET(hL*nhor=!zuzZ0hprGUs!2)f2QDKHGwBA5dO4y@-Q7Z$H;;;ba{OAru77+K zjwh3humFzV_wlmdS&C<;`*TNtI)xI(x?bALPmT$ zsP;37{30o|HNFrCK|x^_?Z|Bj*hRkk^;bLS;G->h@{Lkf z$T+LM)~Ck@IC*MR;)4+WFGy`j`!HI?&dVK`H9y=KM1AH2?%RO@aB?XoG0uzfNO8NKC&kRID8a%H15!V7DzW5(krwu_aT1X{T-5c zOBARFN!b7=*Vr4nWI)RT_N7Y} z!H>8hu>5#eqL4V;({AQgej^W)+Xs))w=%*VkEHZj=U=EV3L5|r`HY-GF2^hWA_RGA zI zSi+B&(!r)Xlhb~p;j(xpBo#W+eJHqW&A_)!o)|6h)_4uw5JFn+j*D7s$- zu9ANvlS~kTa7zNdOQg#P2z>^smZwpy(Q!eS$#o>#w9D?zVIfc)tFh8NOAh9DRC4NE zD8b`u3Ht#*O5k}je}Di(1Z9TI+tnDQV0*C_8)+>q7zceCZy!~J{<3#$?Cgp_b4TFx z{wg&%&oY!-$Zi7L-l^q2e2Ab^m(llI?tA=v)BN1fO5c+{v~bs_VBjJL#O`fq{}D5V z`uA=N_n@mme(+55d}jr6rflFk)P+G@Zii%u^?%^y0jB;Cq_5TT9}w_bA=DSWQ;2kGj0!6aN!carJdbpRQQdl_5j_h|q~y5Pf{t30(%N^fl|JAN3{##VfzsD$o2xzUEWuf%5WD713}}M1=?^H% zm%4R;;7M1mpzaL%8D8%GeQg~*V%1Z7b8Q`YpChaDDHMPx8rFl;XX(IzX?jLJPZe6r z%2EVAE5X3psRNH0)FJ7(-gu0x0jx21r^H(*gYgYki}?TsU}~sn$|<6S6SAYx@3)hI zf7Wp3C{l)=079o{1MDC;d$U5Ldlvl=*FT-mJByy1pfH8|lW6j(&{9pDFl1&6_FLPL z!63=LPI|$S&`|r zU9B%koIzI3yFVW$Wdye|p>Jo1NkBIJQXTcADcF!-b(2)25Tw zQ1j63l>v(d3~IshsHz5}wY;FvWK;!>6=~B`p(@aH@Z0*?6f-!k?wulZ5TL8{tDKRd z9>jg^UdeXQgG}c^3;8g8Fiyzx*C(-pZ?t~*E|40-)8sZE^GF`Jb!<|D6$PVk&3GewHYf@) z-QQUH@o#Z^W{g@>%z_XoBs3qQ>m~x7h|6?_>Wt75D}GL6RuCvns5S3k``U@UfkNst{BwwDV51Iy4_D zj=tTe22fh`%SAfIst*hY!n5U^3)%5UH>2N@k~x);sD2Zr3rpVZMD7>0R}kud7ms16AN5%h>&UKl!7Bp^C!Hp)wYP?n80bFhja2%NZ{xjmX3Xz2&O^1fCBc}Jn`sn^xOTmB)LE{DqjlW@cW&8*ulw$VD#bP<{LDc_J%>c1wGyzT}3J z1EF0!=jEYMm)#=gIyl+QGBz#(`mV04BH0@ zEM8MfLGAPo2cHFX&|Y$D^{Ll{R7VGy zVM;A15_l>zQDz8fqWMDyJOEf7UwkyOA_meo_YV@DCWY&2JL0I;>EKX&pKLyZ91xT} zamoLR#R1DEOKeOzp|0@kk18@Y$cgj`QL5#Jcjs!}T=T)=LF-j5G3gwT>JWI!hF}TR zRLl(KVb>M@2RJw$a<8NFatVxIcMHN)wu7tZM_l~>Z{0n?o`^O5e9HlRf1lQR_2z-G z24s3)(8tHC2}Ne)g~s>RB9fmwT&j->ePqs`$Bc-;JI@t)VdirDym z*pX~EY(IKnmZwm3avqh1Cs3;^nSuT8Y3)YgU2v0n=Ntp81*}xf)rZL2KrDIVo7(6- z;50y+QS7veHeh;HTS9P{rM=vixQ@D+6`uDW)dmwSo3{9=ZD9E5U7hAd3z(-$rO;a2 z3GSqtyw)6M5Mk}~Ib+fWMt!0lbKS5294_%!oZ_NI-kwomSumhb4CMSpw^jd3o}<|% zK9Wy6n-S@y%tMVrt*Gjxn4S$6DPE4lCFC_C2Xlgk@Hhoi&bze~2TstZxIm?Re;$24 zI&ms8Xao(^F(n&R&!bDU+98^=UlH$u=ib0XVd!|{Na%)f}<5Iue58ps0y!S?CKKg0k>yBz#^?Pit|48CVddp6Av6_UZwK(BTU8+X`2D~tEH22j`Y=nWUkQ$jWKkDpsKYzM_IaXi zB^WZg=+DrrgO^9R69_NZ?0`FLaq$rn;?Q-(Q-0x=6gb*A=?ypo;N*LYO(t@PL?G(6 zbuX8(G_YRXQ55w|5{Pdfc}sT~;42durt^^^B>8>Q+~tdnA76@|9D1Y#F4pV~@9E^= zsk6SF-W^@&k36Q4MWzZ*7i=%I@sNY7tf3IqPck_7$-Rc|04daQmt8!qCI(ZzY#&6E zvF+tAxD2P2(!1%RF+}O0k`SXUhL^J$zN3;ZY{bXU!_57NkVPGunxtyfBHs=H0t-DF z#(!`bTOXdJuh!LwI8eYM?(uUJHEdA6IzR?n?V$$|KF|tEvo(Z-Qiamp9R}ce_d;%a zfe{p4yh|3PvIiI}hbeZ)m_uQXxsylmHu!l_=gjnT0>~3k;c0xhgw`fo!)ur1K$xXI$1@q2A!Pp2>je-T5y5J+CIkB~B&I0ZiokiQ zmJ6cK1fV1|p#6!B2wmDU3PYon&l(c{?H3k5xbfiC z^hJGDAkmUJ{AHt~Nh!9_^XgdWwtiy;qaBMz=!d7YvA%89d?|~yQ?Z( zOn|2|kpZvPFL|($apstN%MK3$s<|Y6DWGyWc(Hks7pQZe7tk)Tg5YqM>JqgaT+vj$ zwoRKH4i}vENjoG0sqAj%#G)dw5pB7?#tYvZ&lQek0GJAErgsnRfRnI4gyPbh-|^6X zbZdw=vni$zZLbxL;!-8W=Upv5-*bVYfD~45oP52IioI^Deo4|xPRP{mGr1-w2~N~w z*4?K`;6};?OV*ruByf~0vFSDwaEBaHJXJss>|fHdX8T0IIREhQMUf?RZuOC_&x8=D zoMon%y&?iOkF(O(zKMaPz9c!Xi#(J(9=W?hE(reE^nzSREI#u)-(p{2`!>eU?~!EZ zTidlGta$l_wM>IRA}a6~xlWX-&H>bIGt}1De2-es?A>;E#erZqTr^xKg%c~&X@Z@^ zz(q|JBA>|yu~ll%oG}z|v(0R2hm<5(y_CK0-$exHz8$N~p4zTCH9b|*(fP=GdlUX1~KxEE)N*?Y-&YfV`&is3Q z)QeuVclNI)5W{Jfsy&3u{V0IKB3e_63okEoy~*^Vo&k(mWP|tFGJr;m<+TGYjL>lI z>7|)2S@;mR>NmWL{vUBXf5&~dOIH8jcr#K~PS`XfIB}=NPVl2HV0LGljbZ5sHkT>& zCS!P}QLKNKS05U(3E0|B>OjD(!TCx-U66ijX-|wTulKppMZPly<3Y8A^q*LKFQ#^s zrbh&-4PM5oUz3LP>z}PZ7l{K&v&I#9CQVQ#!0de-stCD+-y%4${VPmL*dGd$!qcH4 zRT2E3uxXxp#b?%P75|3g-QfITOyD(y^aBT)!k%%1O}Qg8(+^@iPKU$sGPQjChJJJ- zhg9EPEN2+;^7SBcGCJ*YlMd=?<8EwwoEOBc-Ybjt)kYXj-o+C=#)-N6Nd%6;1=9<9yO`+52vM8KB5;^Uz zH-@OkYw{K+-XW4P{yo|xedyS)2XiCCJWy-2P2fn)SETf)44YAjK|MF=LtN-`XNoAXFu3>_yelRe|g4^pH2E1_1? zTXA!2yn5l%LfOUGS>&2ysmfxpg!nTBTf}Ct@t%#iI#ynt4jj&u^4-T<3)1JDl1Bd*0$_+Slpi%Y`KiQ}r7*bqUzNTXi zEy?P?ag{L>KP?iWA#epnl9Xx7YLnNop7%RcAXVK%^`l|gJW zY@qb>dbYNAS;si zu6wF5j3qaT)+j21`@;6dL!>G&@2F!b}GiLmF@@IJm2*LJ+P^ z`0-8Zh=Lg$n0}ui0-gulLoYU5Usy!t+;2peBY_qwIJ)!r`W)0|Vyti4}-QG>ANRF9uC5#&?BAko^r; z4bB~I)FP@xx4%*a7DQo?f1r-*^Q)wIT=j@%LeXBHWmHvZ8cw{*2pneEjKAhpbZHP1 z5zSM8PE$P)Idkm~uA12}WL2H~0|mAjhZ+`O(5z|P_^NgRnj&KAt!n*)tCk|)hR6@g z=q;DKaJ5hkqR^BLn!(0B>50sS8ocv(d?JhB=+KEJS+e+w30KG*sW(S(cHIgnqW( z*UTBk#{Yw=Kek-|gR3SnK5ZV}^9}Leek*|?BEsXU9=kD;_l)Auu=D8?ryJrBrje9J z1&g14uGnXv@uUT5*=~-=$bZ~2>|s(Ix;fuP^+_-um6Iegs5Zr+usrX@I}3H_fwC(7 z&%Qsn>gGJqhzwLGQ#e1h5dscx-NK2h5#N`yC$7wuqifn@#6&3#h~s9(2kwWYa3*%8 z^*wh7n$uO+44th)MMK{A8%-} zv}6XWyR0G%`OSc7V0|aWusQIbP@KB6x(i--e;FazV+}>k68vu4%ppmuX7I^r1Td4L zrO9syEk!Igr&4r*`mj=B!I~OeYK|80pshli@o$q-l%?|ZWP?r(N|fPA7`r@;jM#F0 z4YBy?ypN{7@ugyXKG~OZM)H=`Rp_QX^Oc^<6X^P*=e24Vs!;U=1Me4ZHrRWwsFI8h zn-^Lr$V+O%4yTK*e!cHkfs9qS_uojxpo9uP)kCr6=u*C3%%B7b9#`F*ZxvLa(!$=@ z35^Q0^N2fPOmjJU?3ywgI86L|zsVn5HQ{)G@gBArR1jRP9qL4b$5pM?O}ewsJU|4t zMMnhbvXSXT&bhmv?xEX0*FqbOC(z;AjK+kg`RK^43)oDv2Z(-ua)29TqwcEmwnVo3 z$gCyaVQ}YXR37tlgo2^~RS*y7dk=S``ya$VnQBcUF5V8NtOQcP@w4uAXww`i!{gI9 zT(wEbqQ<6&2ynQnY@wc^RpH-p)x1zuzCESb{D`oN0*>14Tk#QWKKv$*^PL|wHvo(Q zK48+hbA@qb34J<0d8}6U3Cb4UYbcmnjE~Ne2!GA93`F~U|_oa z1ntYe7XG@s7)cvEpb+_5fNX3Rw0b{&M^7nl-%nwh4h zfwBCUGIl^-EOm7ZFa5!%gM5he861M^K#4K7yKD3TV1G&|BogfyY&GIA_6=0PGOcg6#ba zzvX}LM2BuYn^5;-!Q-I!50CGM!CB;Vnl$zY4K|-3bJR+M_B+b28wqB>j^E*5(=-%&JVr@Cm;JhRffjV2)Wf(4oEApmDR9WK&q7AD({v} zqw(Ymx9>9&z+1yp>M^5Ya4jt5Bq2L7T#~phwA_NtD=!pY%ugf)j%Op1%B;W8?6#Tv zm%qutp4}&;?gx^CW!l1y?kHIZUi2QheN+~(v$1W~&y|7KIJTXyJsX>&*Gh`!S6{tC2iGiJ_ z7ELbQo5S!E0ZxuKfM}M#%RyFHV<}z}`!W&e( zn$aX@(twzr5rkE|$WS6!SEILjU8Z-cSj6wJrM+L?}R+ z==$J(OJzJwb*sI3xnBpwu*1%~hYEm=LQlc67!>fwkK0g)f*NI}Oz3e5pgTFuNfHfP z^T8Lw5Ny8t;Wc#;P|qJMTgRIfP}-QIaLfaXVrw#3jE3$tCNdYuoZCfk2L&2)=$y^y(Jsm)9ZboHMJ?SQU2T3nKu#o# zKU4Cu(DmnwV*9T@N2*i~ac0CL=*K>y8H*ezv~g9Q%XMgZKj8<3N8{*(7FGAX1Vs<%3)eKEYqs^6A*QcrIbr$b*Rp(s z3B?34NxVR^zq)+}?B;*lAI968@K<4BGMvWKIQu*I8k9DFo<}1mmQLocjG*Sz)u|jZ zRcLbJ%Y~eC1L#2Ii=R_dj!4MePFJe(30jMyCfAi8L6*@sy%|D&k9SyO1=-K_#rg;T zW}jDd_Mn5>M`ROYL!jH&frig*Jm80@jZLR|sO~iyWXo=t2_!=m2a%guQVNnp%mYug zyU^0cU0f{vV{ce5B2lyR5B>WO{Mx}Ow=JR%MUQ#WSIM=YkLK61ubQ7nOwkTxI#Vam z=@44%j4VNW`v}v~y#xmkW?tuVFE$TxtNw)k%^vQ);7aAgg_`TNiFmze8Ksn!`l7A; zMavFE^_EA_HZ~b;;9U1O4*FXSfp0|z$x#prnn}O{&Xy^IC&(%hx5YI+}otiG;?Qh1{9S8yE zH?C}$jh2^`C4+b;&>?UN7m^#*u?|202|0 zEXqWRUC*1|5e#d4<#~=xX!MaM%B*(n{|2Q0OH>%s29vuz7=WMb6ho58OcOP9@GZp^@mX_T1B*ecg{Hq0RcX^S|2@OqUwp zz5kEBfASy4-`F?Jv~vz{^nWX(RrD&X)N=FfeiiAoXv%1>cD ze=L>3^56Jp`H424JLYpYCjEH-Y0JPjn2qy-P{(FTaG_}obS8>1o7;cw=rG(@v+H=%VlbB%eCA5LCjakxo^TVem;0ZN zSHCRZhXX`^1x#G1{0d#{BsZF|m2Wa(&Q7C%{@x&V)ntt-Jno4ncIezRe= zu4k}iXN&mr%~*`*x7Xirn>bI1p?{YdbBgHi{bQwU_<9Y&D&GH1BLk_J&2sGq#&Iz= z)6vm;i*AqEDhbSCQ;yY}`K7IG=<*y>|Kz0m(+&d6dA8!c*Uk4}Y)mL!Px!lI?q}Yt zqQ8XAXJ3BQ6;UUE86oa)b{?6`cjB2woB-tKX1Z8$$YvGshq+%Wy@StXTxk1>S3F+wH+k1=*Dsp&!{ z9cYuL$ipo61@;8k-Nw|OQ#tXIepJ73#=|0># z)o+H`bc5)@R{0M;5fI42KZ^b$*bdtro@SoJ`@bP(l4ITKC)ukoXtJF*bAKOZ^R$D% zOUcK0y4ToC%Zs)VqbHf?5@2eIVeJ(!ls+AY$%(ktQ*$mEqoO@s;u7#ZKW zt@AdG{a;@*|K`vCr5URE@_}Bd!XN#O_fg2?VJI9A_Lq3=!7yBVnt#(~7rwpVY;CUh zh3qk<5)T#G9_nMfcSba0vW9AoIU-(6As@cI;Pj87-TGm|p`#%2h z|J_Bo5|5OB_m6;p?)Uiw1Y7bwfA0UL-9P(SYmjLyzo*&1%Y%OJ6WVfufIu-8Z%@@@ zBl7=ep1r9O6pxo<%#_?HKmU3E0M5i;%dP$XWB-2LzbavA-pz^rU#|Bb^#1z(mH(i! z$@*{eRGb{=-|o!?PSfA~#I2X=HkT*w(0{xB*8bVL|2j{`UH_l_|BrmjKllGX%KwGQ zs5Jcjf(Sq0SQI2g!N3=UHp0qtgpFvs!_T_t^G{Jd^=Ca2^ZTgkSnvHQ?UyLVud-Cn z{}E#3VmwZ%n}|l9w2KQyG^0yBw$o{SCCFQEU-br*}!QFGt~@%UvSU5W11Ga4v{j_^0{r z@e2DVQ=T%X74cuh|6kny77R!zp*<1|*9R^m0}*@Rr)rwc4Pkio)!z^~)jq_)-RQ%7+k&TH|=il_O z#JcFk*t{$&_hG!>s@T^NaZ}G@g5sZf z^?N?WxHQrDsD2*7v}315x314@_4AJ$FhQQiaY8T3F~?L=hb&)>Vm9}`B*xHiim%+~xf&0`$1T`#vTi;=N5HF?VBcHT)$=8OSf#`jjt z3gJDG3)Y>OCoh|k0E^N(O;4hgr9#J9H3JkenO3@$yr}cw9vz32w%@0EilD!=3fo2 z$%&}heD6~qZvBRvfButef5xMK(!lZg^U32!KK^CAlB~gO%C|kjWEbq#8J_z+f9d?q zkIUMUGd;r3KmGRF`0t`o!{lmBT_zeoj%jH6I@jcI1{3vWXhwAVR89QiC=1Ci)2;J1 zjsIU?IR9r*a2yf!hhKIOWG3gdiY;^cyf672Gl85Ndv<-p(l$HHzFmD79cq)fnoG)eCctqmj$s#GsAXn|%(*g7Rv|BG+JE7y5D zklNTNSwRl_Ci~o_X>faUm zVGUIepEzK1)j?&Dn?1K_4{R*E{Dk(vVUDot;U9J27&Z+QqiG5;HBTQ{xLHDclXg=P zsKe%K>ah5rVuFxK-)l;pjqYlsMOJ5{+3?qp>uiitaW5mb{@;Zsu+b~_m#4r+lrZAv z@A+6_2GI1%T>H=*4A0CN2(|X{LFdr0rZcB0d>6S%SA~7wmY&2|m&2$I{yqiY(2MjO z$L;HwLEF0Bx1Z;Kix@&ME$If+Xk$9;;=`_^EM&q^@1Uz=K3L*a^O|X+zfU9d@Y^V5 zi9aWAl&~-S_(qBG%iq6I&g`BK*(e=GCn5wB4{qmz=0E7_EqT zX;fGO&YliqWq=_z?+|CtcJaYuc{wJ$JzeLip>{$`V8JF%6O&m2j@~WF;2r%{ALw0$ zq6*HKeHL-+(5m1Sbp;hT4_EdQjonxV#*cM%))Y?W71k+BIrk#0v0cMD9WVAPbPk7GBiD=INQezU@ZS zvlG&XL!#5a?1Y#{+~@PmjUYL=U&wMq4HB}+9S{2HLm}1ZHDg3$nByYsL_3`uGTgI&8ppr{3_VzYG%;ZVW|j;c}WCC zFLj`|DBwVtmK~6%<((YgW(T`}ZFg;cWeb~eZgXomQzoU{F>DJ0L~agMgGPA&(j7ha zsihmkfJm@!&`wPtBynm=Q!|3AHezR91lmC+HVdT6!48sQ+!b=@?V$C(*$RrZURbj2+XJ2LmS4Fwje)AJf6xRQf1*2rMFa_UY`sU~rU-RMTBTt7>viVO%^n}@KsQW3rYz46no4L?cNW_~ z1-FFm`3O6RE--8RfYm!s@74Ggt0&yK7B%+V4gx-l>Iez!g(~&NAWw`P$bAx^;QwR` zfwO6fG8b%N>Uv~-3${Fb)z>ZHp%uivXF2WkY%knvO|C1(jw>NDvs0`ic2Icd^&$Bi zcCeyNy)rpt1Hz?7!V>;=FhV`;wCH38%-c??{y(oP5ZNT zV0ux(T>XV5^LcTz!rRRn)!u4W5EWdfdg7WXtcZ8vWP~No9WUe9I_L)3Gs4ARhn$hO z=c8wZlMA>?gv^Zj?5D=9g>D}VSZRs9(HRy|_7-UPQahAEK0nRj-pSSD#`rf*_h!wK zc7mzMrsqSZE|_n4ye2f>1p%iUbo=jF;otb%!PuZIl8$= z(JA(G*7!HRCEd`puGSu(lKCH0S=ymuV&BKR;)L5$A09G4lZJoe4FjEXSqE*vfA3aB z$N?MNIkfQNQB6B6X+HmWbelOd@9MlY@}ji*YqhNrKEl#^)YfuJes_^~fAv*eSng6^ z{T$}F#;dd-Y31MdL_3A0;T*f#wh?~J;Mw3@eQhYy9X%0d82+$u_d!Eflr`syrmb*+ zt)JI}Pb80{{n;w}C)`$umP$j~mtqs*!4Gyl?fFmtux@>E~|O z6Yk(>a#-!_NewWxK-<{E4gp#TMA%-?)u$vYy=mcO+C+p7Gq`4!tX?>T-PUcyso* zgVtLT_xX1`L~H*8m#@Zuf1f#QgtkoDp7|>a=%B!#Y=okWpaJq`t+c`;ZNJ);7i{q9 z>LvD`FIFIQ0+CJwv#IeOnc|UcVs@A&BfZSR#2y<7YdA#AC_`Gy?anoxT{2O2QbYr|}mEpBKJ&LK$3}sf=MRA*>XfTk~e| zTrlu-W4=tiSIrM!`zs`W4f`TuB9(_H)q853%iQf+FIgWi8Pd@C%@6FdYv19kA0l<< z$;|rci+|%R^uK!^%sdQJHw-*%jS}v3gHq^>tJ>VAxJn*ZFJCuYOBSA0>(5gs9B23u|C8$=vGKzp zbA?q&eA3{DoqJAbg*JQPT+oS^)}BPa>FR&) z{?-SUVRh%vfA+!9g4Dq?`aX#DkLN#<<%r+czCH{s@J3=#@U)VV&>SmDpw%xvnR#@UUB_H76LCR)d>`S^5Q>y2OjJLFwoDnY^5+j79m!8<9 zY+Up(+_*}}E;AKf8YIBnP2!){o=*GiA&ryCMx-b`Dz)@EuvKbsOdQEbm# zU&woUag52w`?d}!anMnWB>Ivl+pHLla9cDyvTSR8Z_m8X7wkdDs4fjAZJR8O&4HR4 zcOKF?&gukkYwc4KQJ{f!#B}G|3_wuCwPUu64hlUZGop^0L$Xb&iY?y;F|)+gFK)HL z$|&{T+v{u)81G5Tc`t;*o#p&<2h6ef@+uv*L~E$Ln%gDnYKh^wm7a2Bom6|~;oDiL zk7Juo=CHq_A&V?O>UwSvqi>8JyG_ZAxU+kf2&m>btas1>21YyT_iGqHhaQk>tcgX_ z#E!a-sKCgXL@pFaPmLG6y~dwt;>BFYIlXYw?m+V0VNWp3hmT$H%xSwaSG79^OOJdx zo8*l%Mfoj#KfTa;RHsG6)tlr$n=Wf|AaUv;+a`5#3zfn|RyBqEul`?A0sD4tCh%(XXF8zh9bzk&i#-2)_AecBY-z3X#@}$-WNXXj6W&AzRuTmK-AE^;B(0ikT@%tTy{tk8s2LUtXH!|)5dqRzsq`~ zl;x`7Ru3=KZ(PP*N3P#O-{o>=t~-PGAeZr(HD0KGs&hqp$=gN+e!ZG>#rVaf8O|f#Fx|Pczh#Rh z9yT;R8A!6k`dU5Fr5}Liqp!ucflP`|B_1& zoUvT$5r2A+#ngB^x7LRbAIuS_{3QST5fhB^#`p8xF+!94N2RW01^gTT5Rmh5_DXHc zsVRMWbzBnxyDs%M_^P1UxlJa@lXr^0yYj~RRaXS-a{;g{be5`DJ#{n1a(8+EbcQ;O)T(|VYn_}2EC&HSlx^OTgi`+9xh zvyx~1O41fM3f#SDP4*w&9Rr4YJ#fXKCu0W92d4KI=0Csehl)(A0L2PFJh$(cXk+oi z-hh2F&XXRYpXn3-$tx4 z%u&WN%T4|d)fJ~?EA|-*3qK2BAgg{2tz2$Of5bRp%^q=0#;)Shg^Rt70UQ!zlju!6iW5LpCdv=JgkcJA0Zsz?w7oECRB7dA_ zP4!nPS{%Avs)exZ@ml^tbv!2KrR5#!O#bDJS*WPz#3<>=z_hi%H}i!fBs6jw!&%{}c{Wl6MO&${ZfeBM<5w;yNNT9@!n z{qBWV4{WbzpAM%`@8)ppXO#beo84oboG=o765-&?i;V?!3%$L$pko~8;_USx-t?S%(+MR6b_-X{8&RF=k6QRR`a?0<7dxoVY1!z9f(s_1EtmZ8vYo~1 z0KX3chyNVsZXx^SWZflOANxV2NW5*Z$PeX7lzVfjAAGYlZ-tQkwd|K=c4jmDP|xYs zv-*e!92RAGrPz7ka*qs;mayAYf4so>tl$K3+;)~XyDTh*e=_UNY($s*q*!~R#?y`o z!mMVzZ`^A(cDSBUOgc0R7ROFI{m~}*Ooy)=TDE_Pdbge=AejjM<+&T-ho99_>5tk| z@?wo`K5I;LV8%iZ&{=?n{4W|m1~jpqVVEb+dt+sM$Rc%|ohEYsjHebhx2#M~T%`)p zSzN2d^)&H)k>@(-3qheOqbhYbd2Y&sSl`CXhw+p9!E7uf-`tq(+QP4Mruthld(GOM zWT6_E_R7*s8vo=^XZKtf6#hx=EtsJ`zD@vrg4NWclhS{=-BMF>)jl>sv$+3`qpQm- z1q#gj%Q6RS>PznHr-(9T(%-T97Te3KggZU5V^7yf*(o{8BD-MmMUE+s`(VG0hNP7o z#!TjGd1%eUKRL3jHu~8!_9@P$h)cNT-DU$=Z|fhtvp@|BW`S$&pHjxZ{>P6}?XRqt zpW<0rhs8+=SP%|5Yi46b2;l_?a^J1`Jr{bTmkmA6$YXv~n`hd?d9b4gKK+!2*U}Hd zr{g)0>hk#gi0M33P0pBapP~&p*S^3R^@NuzD4&1m5;2wk?cZ~JeTT*>X&m`lQ6g+2 zg#~XDYFU?wV{1Hn<5TOgzx547@$a~r3$s1Fy(Qu1`ruJ*qBzp6P9(^AjZ*n0<^ufu zqIg$!r>~gU)8xFCIemJjiTSPV-qJOSQ~fgth$n{I6VF|1->lQ~!2L!UyZ+-Ixam3Y zQwbO2}Jh+41@QD4C{O0XvrQ2_4@Wttq=5MXRX;8HBX08*K z&dMx26Kg*u&q?ml$?*nWdq3?_Sn7b!Sz{+uA9?)G_a@(4%R8sc5q-)=ira|Y_0774 z({4=|^z#@z38J5I^x-BO=_V7J6r z!HdM}Bu_SXC3pI@a6hc1aUCrc^hHWCQScA>f=-LHo8y5M)2nA#Ci;L8kK1jJvGqaM zWpCJF_m9UXW)|7Nu0eI1^%?{4id&V}XA`>-o%edr7zJ&6i<-?%rsPnk<#EQFWx=g0 z8<18=;)YgasI^*<`1O50yQQa*c&fkhWtnd|HC4J;-!P|5tlS)4*N^WTJnoF|dxi>E zZgj$>Pc)jcgcE3fjaMGNrZMe3DrEmfqH{_YSb*E}eba=E1t_`TS2}~{P_5PCcfGHI zgAML)I694S$-D|Xepoa27al~<&ZrQMm7;-I4HlwF8=SVnM#*wk7`kI($+q1SG5*^+ z4T;`%TAwp%>sL?2E|xUzAo|?D@dX4&_ruAQX!QC3%+#s8&YpGoU#-0e$_fs zPq;e2p0;MM_tAr>;Sgu?&x`eOebMe7qoX>oSv}XwjO2wd?4zn0h@pd~gB(Fm zV_Qh_!s^uL1RqkhM|{{ZxA0Fy^s_GB9*x5b+L$k)ToZG6-FcUZze zIHI=8$`9?GZ2KfSeGy7GxIFNMM#{FlL&Q&Yq@%v4xyKj6=M$F&PItm8>!4+?2}gWW zOOZr=oD-JstPzxnpdebh(a>zziFsX9{BZGm!o5dZ{1AOXT$x4E4~wsFcApmKIW?|% zE9IlnEe|Z`e`lcn-5s054}Qp*<%t)szliSYw1w2yg6f+sZa6W(x=B{r9mc0+)Z2yThi%wJ6ttGZ=_Q#z&XhsFs|r{`^aHk+>;3J zcP94F!k*NpdPH9z5B=Sh`kmY-KN)=Zq68y?Uuw8TxDAK1uUzn61EctmjJ&xGpL*~Zc-|^WG{wHVW-6eWC2OYrC-~~^T-v23w*hK;==RPLKU7Ytb z`vy6V!K177!?KF(iigGCc$~NT+ZSRtX>Xo;dj*>x8jm#d2Uhz+bmQH|_0GPKPUlYE zG~$L*?nS#~w0tp5_%NOg{Aafp43LW69qWe?BlAUBN4>G2#bvP^xu2ijM`m8Eb%7ck zFuB=fN@iDc&L88Up(a~BD&)EYbH4UjVoR07^1784s8*{!H5h7%xNVtO%&`C;UpAUm z5iWR+JRxC?S!2yK!5is$Rw&J%sFn>NaZkwNSu_+K zdx+jd2iSBTcT$LSL?m=wPFCB1jss`=WQ!WloaF*eW{8W}@a0;H4Ib$YbFTd2$MoNl zc7N{@D=@>Ws?jrM$l;1c&?r(E%)~Sxc|K!WB7KY#6>I;dWV>us) z-HpMe@3g`6-!Gr;d0{mr^F8#WdUI-l#^Gz%EC4^>U` zvPN&+68~XU9jKAz-0uRhQ;+Yh8hPx6(Jam{kBdAp=xs_hoFIO*)(QvSA_o*iMrWN$ zAoKog^I&YFD9D|57@J8>*el!B#cNbmg&9bC?N zvtfA`g<5t3th!=>33K9TeP{_+eX>JjHNk`4>wAmKXgGhvR^OM!3MKC(M+3qbKlIT&ENgx5>H_lgJ_`WEw4R|oep6ND1hT4Vp&3F&tm z?D0*dtAz@837GhZg{5TR7d&Q;=U*Wto4yP zCN~5{MeJN*w9dqT#cEfC{#v-Leyd%Fy{|#`Wm-Xv zTiWNL!Yhr{$Cbj8emkxw-W0B~iwkOPAolQwZ$f^oor~*t=gCy9a)x%Uk;cVskDV~KJM?L80*MzWS3Ne(kHYwwo!>UG z+d{;2ufKAS8*B^iWY)hT^#BU0rW)?w-+^r(7WIN{C#>ga`Rp zsAq7S17tsnUEdwy3+-Jqb;*5FM-!6DC-4pcucF_x7cw*4rP8nSuL%XNPo-LH$?*XS_5K z+2qRSgOKdUcJVWPP~U&~eA-iQtP>*^&I=yMiQgGLC(j$RIevTHIO2r2ca9_qOgJK3 zt-{`#n_P$QCP#gLY!h^&n!@CcinWhs$>L(cny6!0R`|0yyhohH4<@Y6aY;Tz-w79PobkgK2O3TU zoSN_isX~%F(ng*`nRQ?NiC-q|!>f_78|1nDE33OUEFDwyMF*!~;ip-C7`GjGK_k~W zHvFh2CFcd=ZFnb?>V>d(#`YZgE>q*z7Ab1j-tk0DoXZ`4a^3&QF+0;_EvxNNL+K>& zA9BZVWj3$egcEKm^7EDxz7HLD$gSxNTQjRXlS_p2qnZEl0C{h(BZY$2*?8h(2+NUX zPY)~-6FRVk#N&JqBjBDL|BVYAb8Zn2A^ymZx?|kG-5^c?V$JUEkm0MD6+rxLE%Wwl zTE4~|@sFCH-~QqV-qII!Yug;A`Waa-gB(qg>qrAEIZlXjvV_EOU-9f(OECEICoIuvFIiP|QU|LN z-@7~#1zyBU?GRgNi+n4xQoXie@~YfzVe0boh<}CA-ZfnDNU+1qG+qALkXY*D2tHhqSkwpH?mqCK!^7f@`wBSE3lp&RCf%5X_TkjpQ zKGNHQq-1pZ+ z^Bw({*;g&FG-Xz9(mq>6RI+wHkFmw*Qf(`a=?<_`P+7gwKm|f4!?aru*kCsI(PSfQ zdsKJ4dn!x(yYIdEGvmD+5G1~I(Oe!qaNe=aH8rpYsSdbia*%@1kKL|YNc@;+u4TL3 zSsKDRcQ={emw_EA^J3j)fXVs915ige-}J(V95%S%a$7#m+7^p09!-B|q=Tq$g)}oM z62Gu`R(!OLDdb!CW)&UO$CV{tvPvH4A+Gu;l}?j^rEE=Br5uHq>C?O>ySyOrA+L-W zPN!rBKVH=p{qrrYa=y94tvfiw-y8mFK6Ag__5yD>sbJ;gg@&SEPVS9PQ{&E$ zJl?vO`!M5XmisXF30tFm5OHAJQ!5>Je7hjlJK5`vgZ4WY>}~hKiN;62US9Z5E}6bS zawXxo`tfzj?-}#Poy}X?50qKsMdH$NISm^ene|mXfy8wZVT-QP`iNbu z>RkVqZIX&eeoGY3Kc--FuuQU$HNw-IpIL_n^kEa7ViIg>fNdVjGPZ5!Lld9PSK%Bv z#9iC`vo6J+=}&R9o03_1&-=Czf7YKHud)^QnIZUTY-w7Y39<_EuZvtUg;V6pkykBd zIQlVmiLDnCV`3l3ZQl~g=LgRZb7FRVaz};jtjVm` z-iR`u$vt|^4?(6C)45699bGS6)9MR7V=X<;wI1j%Xb2o?@ByPfHHlN`G+%F_ zU7aIX{wCKqcX*t3y=5ICS?HRVl;^T{DE=50xEKaBQ#umZ)R_AIOI_R+>U;jVi||?L`ah8qHn`t6zSNbdK_Hbw-mz@x8p{(YMBtQ&-f_g6m9QF5qI zfgi8Lvg0>|s>7dmt!0@O@&9uuC@dW?nv!3wS})rq#fNLhR-eDgsez|@q_XBBLsXT` z(lcY#L`4B-S8%%)q)dg6%Nv@5OL|hY_?spgS7&EDXix*muI8%WrHUh=1SqIJM47o0 z4QuXfxcXeqPE%0Fs4>T<+tbv+D%o)9Iq|nST=!`>GIxl&cYYpJoo6FsXF||(;@@RI zypz}0iExhTWfm=^kV#&P+Yghvev9?yoFe@DqOyh+883|xRvY>7PK+k{hGusi6Z=RR zPEH^GC?bxV`2^J0po3qJwCqZL8R2Ly>k20^EmT{d@qh8Xo$9VkxfNF?j=|58>{qTT zVnbhYL%=h6TzZ<`{d?&=+_`+&KQ>PT4@#;shnHADT&wi?N@9olCm;4D!20jPnENif zyd^*twFY(%7&hs-!`j)QP6A7vZ7^ zeQN7bpQ?tho}YGmTP>J6uC~gv`F{N?>g$Zr)8Uh%$X&LWnlO<^|Gt>3i4t)0R%fE?*`e z{GlI?5o~+keG*^H<8$E7O+T>Oe0U%;=nXFc=g;Y6f4W)5+VkQp4^&jThW{FJMN$g^ z6j?e$^RC9+>kr+rWcTRmHzYoIpEURU+EsFR!t?lAW;CfgUij`*ciSjsVq_Wm=zuun zuN}E!P3ruMH=TWYQUazSx5786+~F={oGxw2$~P;w6&cw800cTmWv(^ zt8v;}qtc;h>zb*aW{ z4Yxex*d7RL&QOBLxk-1Bg;l060i~TNE8d$PRyRme{9EU62I_l0CPRT!V zUq(dl;zeJ6+)X}t6_DuXb4h>9!Q}lJPRRpY@y{wgk-81^KK9~=E1ab8 z_zfM5H9E%yDe2&pX=@jPPPEN=g1sQB^+Y!)4Tliqjd47XZzQP z>(Y>JODlLLt^wmY_t%^15I>GdL&LFpebCDRgjg7Wd)L7DM5GSxPkWKS!EBPcmYOiI zz(F38{>I&=+y=0GuzBFSIH_~pRVz_@lhkFTmo>JXpd8J3Eh72n<6c|j&}un7EMQlj zG5?PyI%`)i?B1h{v5~DWV#^69szGt1z5}seU2CD*w|bx{b^2BV4-b&tSZ%(n6Ewwp z4^Q9Wfkdb2W*5s`LA+`oFX%c>$vxBayM78=Aa#HQeAe4wL(53P-9^sO=FVc78|?%? zvJA0zIO5gIo0Y_EfI!p5?rHW8czA(ZapJqj)b~!3$7FX3i6gx1@aY&i|M0y>%d0Eg zLC>31wl~Ff&a)a@7nx7VHzdYdRV-|>?=Dx4e5ler5aS2~!hV7vp7oQliRNnHBZPt5@#Z>?bd>a2Cshz1lImwIy( ze^I^Q^u-ekh@Rom5$73g3mN4mJ%O9HOn>r-&eXVq>z~wBhrGakUf#E1r8lt`hhO$S z<%M~=q6N|^&gc){Q`KGXg$k{gQFj*8AfRLYWI3r{GgOiAKC{3Q&sUPdc?t3mT>Pfb z*2EYeCY$uu$LJwQ5Yqd)HJR~9Ys|qYYgNJvzUgU8yZGkAaM!1@4fAQpd>!W8Hv%M# zC!4N+X#pYWUq-|2^YJSuu=Mi}@(Fd5b$35|Z}|VqukcUi_Y4;O#rdCK zVJJ^k)=Pl+UC878CdCEa%_r*OHoIY2e&|w7-9a;wFkKSt zjuT67cU9NAqx@lxu*ExTkSONMavR9~3@z0-6X^?;tkh=*D!ixU))U5`tICPp(P!4` zd}6;@-hwwE*I7?kowGRlw8sk~8%`ebmH1C? zz3@ADKaJ?|s*Npch+T(&`H^K*hBuOy5XaCKAH-z`ypjIo&EPY!@O$8Q-2#Ufk=_V9 zT<eLC(9WW8Dx#fr}R8&@p~?55nf z!^l52DATcD?N$hh?cDL(OBkEX#fRDk#K5SZYA%5ehxknY3_)gG&pi?7n2C*l-A(K# zPtOW@nF!&jQ1)ukmm+xnkcB$-Mucgfst~}Er{Wj(+?WLhS1e2eoQL&dOatYy;-0}^ z*EdDP>_NmIeI>+*4m9$R_#eja=p}KEt7A(>pUA;dUCcyPSOz*n8cI^fwMkzD1B3eQ<+`)=?ho1MHj$0m1wBXx^h-k4pv zZcI4vjO#cD+?yVp;aMUAWp$y)Ha7fB{(q@3jE1;|t|$vbP=W01dS*Z*dz-~C4k0kP zar_WWA2+Z6`I}-raXUINpATnO*6I8#=Yz1e&D$OIznJyUOD8GC85^S%FHBO5eSpju zwe>jXTdBc6l=K_kWBalusnjdKt-QiVsgZ~s4TrZ({N>k8#}K=3B-@9dR9>8`^6DTC z)VYRAMud$~?Ojcpzr4GsUmmaaFH@VKN{*7k^{OnGTi`jjRcV0wk!R|nwtkXQzWe)_ zX2}qNy7QJKNKVXZXYM&d_+xNtepwDLmAgE%^9cS zW0Ukka#*qE*NqvI`?*nk!egoGhjHrDha0o6C$UfUGx7l?eo=qoUDF*bS+FJONZ$@p zF`3K61?G;D-|C48?7{kSm2qMWSh#&c?ep7ixN! zOW^Qj`NX$7rI73VKyXo?2okM)n<}qJz?_clyDf`cg;wpnJN!`GdU@CS^O6XDbYE0( ztq`tUSmnmsIsSK^%)(O%xy;^v5uBG^r}pzWCtRqzD~2^hz?U7RV7_lUzTeo?m*_P> z-M69x3VE5&wF#4tgs%-uS?LTIVR_d|LC4UjN4;V4v8r>?rMG%XO1dmmiuabus7OLv zJ%_9Eq&aTvX*y=nDUG8ns|sDCi9<# z{+Drs(ca5xWwa~;=fU79Y`n(&{l{9sGLwX}6`x~rU(*%fKnI-b$f9OaBRW#jAKs#S zm&_8JkJ0T##w&)2J^A__e(u}$IO=iq;L2qr&N6FXK_x}}s!_KN^Q~|M<#}l_$6KJn zi5Nt!Nu0yXbG6S%UTWk1r{AY*le*j~Mj7FvBo3N9rqiNSVVPVMIBl0Dd@aK5vs`@e zQShBz^H*EUoO8&7=bR%**1Fb0QkVPjk-B>|DLyEF@FeIXyE%Aw?lV|V^5zr6&hL2s zp8Sp#t|sGVs)+IEd-dIl_$NtT_MHpbw0#aKs|MCDrm;_(r$1VwO?%Q((WiW#MoZby z!dJ>0%aC14oM@3(es1PjFpLbrF~0W!53y&&`}$$km-vS4&9`R1gkNBvazJer-Yirv zNein5JuRoA;yJ!sm51E)?!%91J73hjeGYn>-{M)X;B~1Yq_dEZM#p)HvUOuMr}!he z{k6#1q1jfl${!r$i7_u`h*(&7=>44gb=HrPS@ciTOWOqUDTz_?#rV|w(w>{!=5 zt7zCIxpStpK3!%RIcG(06O`EZ(OYD)c+kvQuk*O&{Kn_yA+vf`J!ixhEqvF29eirG z57#upM9+;Tto)SdEB!~Qf>$7)V__Nk$Y^U^xM`DtDcRaAziOIIpFR&ST39iB-t=vn&lLBdNdi0=R<%dVv732wrR zn==-54o5*tZbh8;(MTZgUPMLh8nj%|e(^MKGZ^K#x9vsDILqYZmlU*S)Nsc4ZD;&$ zmbes5AJt2d-*^Gu^nCpHN%+f8L-Mm^ueSX&ktZ1%;=D{5fB9*|Zrm=@@O6O7Db()S zDk;u9&tx;B&D_pOQ?)ranj`U+*)PJpKC&{3jO%ka{X72h&ET3A(NovH3DjXR^%kpW zY(Hd5qPP@+50iYb?Q`Nl94seLeK6Lje|t-sWv9 z5QA5AiXRK530c)$Wp1R-$%_=}LX$&W2qBo2n;Ud!^z0n-lm0aABIhdkLpn72JmRaT z(Fp$F36Fa$Lq2rUnKt-%L2r6o7naUnYj-R7A?}F(?o-|K-+WOgh4LaKAHdpIXGd^k zE$H)L+qciiB30D+zH`ztZ@jo4yXqsO-zV<}=oq!}lS+*FQX%vQn#7@ZRr@S%mmQT` zbT9%gnjY_qQukumF!0oF>pjpm{aM;%vH|0Pn;UMW#WAjvnX40HKJ2avqYYXKs0xHL z<*+%uIHw@_ zreyhh*d*V1wb!_m00_Weml|6w(5M*o9CT}G>E$3x=|)8GI2 zdNsBfnA=Np?}sx1ei!H$;X+N)BUQN)JbbpSF@ISkgg*W@NFYmNZ=>rM5qoioRLR{qOtj?o}Qwqvr|1Jv?E8ZASoXEUyY^x_YUb|9CZ z<{4?iCbESomvH@H^i%V-7}sahl~L4Mn4D|AkPfXgkrk~I;gG7?zD{H~4kv32zbLUM z;DMq1qQ;qFn2_Aw9c!?I@p+c5XPK>19#+JqUozkLcYcUmWA=+(X0}3kFlEV>(`mn0vniZNuC zYJYm7?Z!Osjwj4^c>%U$#Xg;8DuC*YNUor{8qEIn%=Ln0_y+2p_03wLJP(4Ogw}3r z{F|@6^)T}|w=g94cXQOJzNQ@77QNFm7^hh1f3X3eH!PdT{UCq$_Pt=VED;x=zoB98 z1B+Qmo^J7fgRw8z%{&haIWG3>ES2QQEq^~}1O^t_j1NqXGV}h@k82-!B6euQJ}~%ZM@*S{ z^Tpzzt7B%5{V?GCDlqdr0Hm8eHGO^mPK=o4F(_W?fUu>fO9hdXKB>B?yuaupIAnia)GiBR% zI_s5E2c>LvPLMCBi>lW;xIBT@KpB)ekxc8)RO0)gnHf=UDWmIcrw{qK20> zY!9<4p~jv(+qEF$FHdks1{`Jy*n74l}KcYlT=GX=qCxP zkvv~K@lq;oe@zk?R!zhLb(iK{iYc&7mNeSDH3g%7-iZ-m@z_I9lR{EQz~tU_QZJ&7 zN|&6jq!h!IpH=#ky4UtCp3k^nP=^vHO>!-6QijQ$eTP|+b}P{a6>!e_ceJ-GS;QowO_F#T|$O)Vvy1A@25v= zR6Q}b*PfTAeK{oMyU74lp01C5CUOYZsHIBB)|`j6O4|9;^9s;-)$n<1%`Rk_?ThAN zJvOC(k}Bf=r~cVg5puI?c<2AhTrR#Go2maGP>3Y;=tRVUEr!LT$e4f1176?e&)G*1VP;!c3Aiw zMRUcT;H{z?u$(w<^A5z)&lCGa%z=Jg?kyYMLetynv>{QCA;YzKA-%upXG;dXU9SCL z6)nV~d{x_X5!#?Qr;vqGJ9HAeGAcjyVvf&uuDR0PDBN@Fq{RAnaO>W_ZQt%rkk7Fc z92cQ~o~1xdl(r=0dcyirE`~hN%*$v`mTNOwNkI{s`^mWxog%`tR?Etfy1nH6;IZMW zE8ks49R=f%2S`{le{GOOI4sExsQ!F>O8=yD=Ke4Jlg>|Cx#oZMPunwB_s3<2{*V3{ zrQ#Gf_~SqQb5e(BL|o~h|9+OQ|Eqs8_EotTh~4-9tADZvrD;su6u@cDE4@9XYTzJc zQC0|;;bhsSg?rV%Q$k`blZ#275&g8%)!mHtMFJnqQY`XMXe;x1T^>Ko=pS*>WL%$| zmm^d9r#2~|CBG&Dwzt1ea@^bv6Z3NKxJ`S}R`z_3t<6@L&poAQbu^0cc@~>WW=r(Y zd54V$9`KxF$~XS%rT70=|1{#>`m{7e7s>exKd+No2;Db^@ZPW%7Iepd@+hTQ*0%G7 z7m1IEJW{Q2ej2{~me8y@%me-olZ1Y0p{cf~ba2tZLbh0T4;7szC>G1rOF4`5urF!orRsE7{C=GIiDJYVDc4e;d#{N%r{AMKFBEw4 z+wcMPBI^esQaqpr2qxkgUnS)+<8Tn0^?iz0)a>k;iQg1G%_Q_7E38V#r+3a~!RhQ* zYA;;IsV=`gSy}q*xIQuXIPvr(#o)I2^-ycyjArclOzH}d^3_Y+dZ|}R8x#iox~Y-` zuDUyoy%cN2*vNDH9_nDRn+x>!<-o* zl~hoW(#_d-%# zH_u5)W`l63a`vANE;xC=?GWcD_8@bT`F(&LB6*(UaS7A#ruPj?K8+KvuG_X`AD^UR z9$fOP^5%i`MS+|FVGh`KDXd$2k`+4igfUHCn4PIhsfg!7?hYDn>8mDuco<%FX(K<4 zUU$ol^9rU1D@UEpWkZnESZYXX9Ab{!C&omn;eq{+(VAH|5WS0kR`JIrPzv00?hD5s zs_tB}x5M)ZYJ>5T&{}6!(8I#we@#-nu}%*UuKz>L%!*#{Jnc5ctS@<$+Oc_Qk$lxn zO2(gc@Ak24lyl^r5}WwzR7oSJ^AnHn5Q==aHZEm8ExJ=cRQP=j!~?kUujj9ztx(*? zrO2N_``|t&tW(d3rub--H$bEhWxGBfxU+T>ZTM4Qj?}(6G)37i4UM=nG`aLGU!ynM z(wdSu(+UMhQhH_~r$Dr6$I9^gnq#NPSrG)?no7Amx0yESqJT9)1Vj zS{Zmo4+pR1Z*LsZg+a!e!V5?BApMam>AbE!_!G0X3VMH|wmDqXN^YGA>MH^rI|n4X_##;S#wqO&%Z z>BJA2yn@4W#y2WX+WkuRk$x&5Dm<*Iu8-o`d?D)Y*B?|?q|&`LhlVKy?b$Vc(8EX9 zOZ{^Rr)D76D{zs79&Y#79d18J{KtBo&505Ec==xCSkc38)Xwv(AL`2wP;R+T-sq-% zqZ&*MYIgenq#W9%*ZU3*Q#~JZ+C0iN@sYTTX3?~;y<*}+c8Vr=I0iT+&uXH>&PVs) z5iR81vKF03;x1>Ly|6bg(*=3NeMxh5!ycZ#?xE!*AB4_3I_-#Kq#DC|lE)&Scby|c zbODx;tmQCWEew&gvJowH%m{I)GQOz>+RV1f8zfJ*p4GnT>Vzi7+^a(5R%u~uX>Y}+ z&m^ywT~U9#lNN49k${*?WmvTS9P;0?6 zQa&ATdAf8CRr2D4-pM;&0sP=5hN3}IKS?wy(s7UEG*n+*^Wn6nHl~HVZ{4V)4aPJl z@g)Z?9(H!-)&j{wi_UzYiMz+l!ra#iW5eDOamO5C1a{V22#*P2#o4}P3!8-?B{XfX zM>MHZny+L!bCO)I!j@*=&)WEEmHOsRmKL~4`rfrzB5RMIlOTDbK29tPJA*tyFF(~< z;{h!mvB7C1kHPR@>#1NY{$Os0{%jHZ>c`OO|in3oWLz~Gqy;woq< zf0_*u8@=`Olha0MoW>U^vceO`N4{BqPV~SW$J~O6Q4dHI7Cq8AL*nqutfUV5crfFB z$n)Hv-LX6RrXE_3Mh9s|>S11&XkmAQ9uA2M2WSxg*Tk8(=Q=|Ns7{T*#hXtLQPSgY z)SV6wQYqEB$vRgCDKj7AwW=7Ra_e>_K6miIud#Bsqy&<8wuECx2t07{>Mf;`*B)3_ z7wj8U?SV~}2OCY5Uiz#ocU0=cN zg+2UFa(0$^q40NUyN>AS7KV%NeVDGE* z)>244BM=hotBmD)wg$daAkUEvyOc+tG7_K3Zk%;Z2|w1n-jVL7jBko}^mwD>fg`Oq zZ#Bw;o)%KlFOL&0;{hz2N&E@D?E80l9C5jJ<LY-@ko#DIb(3vscYqcAawis=C6V~> zUPK*-C2rLx@dkKUB3z;Q&~;u*sIRE87MN{;tchKlTRxI}&DGy8ew%BF_sRqm!*7YX z#hOh)=P79J(UNudFvED-o%O0F<`}A(H^VfHg2WGjq;Dl8K6IN?Yx)UIg#2{(O~@g9 zjm>M8?>E-REhE;!C!(4t+^jdVD@+q_2{rjCi7!|au*}!+iZ(c=yA{XD=s-%8KP~pT zHr$K0ste51!SNrnPs|{Eg?6$lQsh#BNcm@FC3aOv{69RMcRbeb+s5rpc4qe8d&PCy zJDaT1pj1{#3MoRAQc6ZiGAboxB+4$C*&-v78L~-wuDgEU=db&9Up~ssXPno09>@DA zY9?+uAOI{G8U}97XjKV|!D4c=6AR8G4fDLi+aV+daS3l8gq;-w zmvh=>zGe!4@nc1SGyKkA6uDfv3p* z7Fkh2NDSIBIkhATg{5cm6t+bF@zM0n;rap=3hpViQwlhUs{*l)k{ zwkd%}7b?m(2Gg+~Tej&`g6R!yP}V(PAHS##n1-ULQ?3HCtJ=!i(W;QOAl&aetqS~K z8|c#Ss(`J|(=>T9RoK4BFXz&`h|ZNcU0b1CK|F6iF>|dip-`UPd<8tq=uB@ePh$2m za&_NFeO1p0W&=aAc${#4n{V1aC;ay(Jf=5xEMWTDnK%PI%qh~;7t=I#f`v8}F`6Yu z&?r%|@X>SvA1$AFsxwaTv-Dh1wUrZ`3cipnou>w8%_}WGW~;-u<5<~VtOkB-lubT< zxW1q}adi8HDiDd_iYk~1UX?98SKnZTN(n4jd&L9~A3uCU8ng?(s$tR=VuHH*p0bE; zAt>yT6HL<(ftL|y9$5;AKtl(u%%c(^D7r-b<&BguEH`^xH^Cf1vd3zdZ}cd`g9hCV zirvZ}A9C^SF|6ZDI^jV40^cty9)wNkS}Q;y>qjS&&kB$`w-WirND&S&R4i~1VJ^YS zsHqpO7dFp*IP>AYGA!XSGWU`ah$je5GDs`q>z9A&=LsbUz9c5&CanaR(vuUZXb0~_ z^&dKCVBcZl_)|fwADWG_&`+nbg54R7^X~T6|IR};b+{*Y-qN{539#(f^y-c>5aepx z(MmAxd9R$NPyxby>mqBc8G(2YPDp*e3qA-)2l`pj0qHP{%9uVAY}GG*c&x|-dND6O zkMrAu$>BsJcKrNWe0DfWRnHzg--&-Wl(&bJw;xsxy4r)E-g}cY9(&j>W#?hV^Mm=8 zr_{z+U;ImDXF3n_&w3ilYPgi_Ag=qw&OSR+crs*fO3i8lKW#I}otCkGcWAWW^N=yT zDBC@jxo8a6o?5j6jWOK%THDOqY6u3K5$wzlji8&JHCQal5M(TgitnE_grM2km-KHn z;X=Q|?dUiS&?OW`ESf-UbB!mAO#_T|UIx!#-Ck9tYq6`8;XnQ$y8+y_$4c0@_<6(P zK<$CKp-oeRLkAZ0;hw;>?6-3U0ET?pH+}R$TEsu0WL+Qj2He@b;;9cWJUlOkV~%2= zu}hRV&TpNLeK7KUK?f@MKZIO3i9maVoG8pm2PU>;7Mt;_5@ExosR+lG6C3s$DnnoK z{kuC@*A~x+6Yt}c0aJpeB`8$DJZYZVhe#ThDqo5qcPT*gO#GV-Qs8jba3s-E5&}t( z)stXJIPHPSu)FAB^u?GydP)oHwfSlxx^(b$#8G~fmKw5ODr^=|(ZCLa;bom3c}SiW z%Gr{}`q!1VB6SA^kn;U<_~Ivd=skf0mS*K4#9ZSbF3(|bh&1q^AAoo1SFc?B@mnzs z<+crg`d!C(zau#J{c#lA>op2krTjF)T#(jGx zJ*aAA6F*~S2p3POd0ni*KJ&OcHP3Gwg7M@w>xavR&{TF+!By~sq-_5CQxWWg9rie&I&29Qw_}Mcq!oeGQuC7X zQAOx@Rh%!qr2rkC{85h#6ycTv79IpDLLM{s7z6fK5crx8QUS6*WRH&E=g7T!XC{@$ z0363^Cyqq{oG-2Tj<1ie=E$Z3sU{|knR#?OOwOn-G8q7yHml_t6iq0IA^^sO(poC133^dIKyAa;m_uW>%@^{P@ssD zaNPO9?$^7Imqd8~|2?Oj1N|{2Vvs9!38=WdgFGc354yeogRK3GTAir>pmPGp^1k%^ zMjlg4k0;*~!PicONlw?_=wXTKRL&E8yf$O8yW0*bT~af0V)%`6+Ds(kzls72wjIQt z69j(w2HJiTVfb&IG;40$X>1x1QdE?6CXp%LP6sGYqo(>75gf+VWO& zu#K2P<^%v=!31iMkw5#WZW8q~jfo`Ak0Os311bVOV`!N*vSUqw5iVT8ttCYUkb9~k zzRE}k|E-HB_nL1s4WZCmT*5af22h;3UYSVkmPE z;rxq4r8|8{hzbGw)$psDu z#!&(5P5Hv~5o$P*;%Lt>iO*XJwY6K;RG`%NN}>AZZfF}_*!`-338u+DJJr3xI=26< zQ<$G6mV5OXjk>5Um#HBoo5ifBzLJ{9G|}j>bAJ3Qg0enoUIT-@20X z?Ilw~ejp+M9hG^&NI@>B@FfonYs30PD9({)w(6Mc;ezaFRU+=>Jy80`mbM>bH z=CiUhH5?6efG$0j(+h`jenLheM1cd)_K1gfhB|wCmGZ1P444Qr4OUkYOaf2x>|9?HRKz{np^$nD)=nv*) z>xkDE6GGS5QOHB9*o5#E#EZMHBs^=V$?`nsiSkwCweMa-ee?n%`yHdFr)((H=BihkE!7MBcimoKd2#H*j;Hei5dv8@tUWoz%wwd z`S?SeZ`~f0bm9psSZswz?A>7g|8=dCZdt4Mml5sz&W?)ACFFYhNoDQi5^|Hfm%gR2 zh_)%PP(5q`r5ZbP*_~WMH5EBFw{a?Y`{B0!y{~>EoE9J#Q1t^n`+dFUyx0#!8gP8@ z!U!Y0>dh0%jHH7O<BE(Hz9&KTxMLU{f(~1AOFcwjP-{kuO|D9 zh2aQ8#0^JxVaSgYrBDmT_m}^zF9zbo;(bIwMD^CAqt}TJ~1C#6MCS9a{`GGYQ9F@YPp}vl$5o1HF{R+}n6VkAvT}3Yw4xCqU5QL%r z%!&b45tviM#715G|Nn3O4Cn26y>hHen>Knyf6NG~&a+EsV6K#1@Ta*qVE{a3%lmKK z)`z?GI9Q=x2OOq{80tRnh37RHKc_i#uq??!#4;ZHNaPu0c~>A?P!5u8uB7tCg!UP$NHhBWRj zmL&VV;OkK-Kc1@vKO$r5lf%WKE!+L)`C(DmiYhXHX(0wLT$fWaXGG!jk$Ni`Dp9ES z*r7>zi~GBJ*bw3=4{zU=xEC$pT=g&tIfv8oFn#7vCfkr4NL-_<%o;ZXTZ&itK~xs- z@Wv^-uMf#ev{#q5TBo#QdobND=aJ8hAWs{nblUAEmEioi%P+?`SYv0>u$;xPr7IaDV*AtnR< zr(!+)YUg>VTw8_xc`F3q2_vQ;E@`3-ff)?R=6q*R@+$r@i_3mSM}R(@Wm@-Fixq< z%GXtb2dVz{EVz$Oq^0KbK1>;c(raB6Uf4puYKb8KcN>@%yFWBwX$!)gsyp?2Y(af| zrt|{#BgkHpWp%)uvE^^6Bq>k#LWI;!;dRU(OSevWp7u@)UIg6gJwvPwg!@)>68`sG zpVCob-a)QnugMp7TOdyG9l3~k-T9u1JXV!~g8JiH8W-ie@WE291XU8ea`UOGyGhOqR z$xrlhoVraiY!yxV=?Rd`FC&%~?T@vUtH}7-!gl7-H6%9jLE6#P225|gFOm$gfwq8; zEu$JXKpnQl`DDfhrr6n9mYZy#TbI;P$>o1_#|wLSm!;rhyk!q0lf5M|QV!s{QP3JX zX%7ZT6;ae5{dK(^Q1|S%+d2V2C61ltHvmMA_Uf`GW8b;jr}(Wz z02jIF)0qFa%6l)zZg(%fILKc`f+FT=n+7_FlMTc2_*)nl|KYyI95#XhXqZpw@FhpKUBgQb0$Pg1F6TLd;xoGOc_YWa`6l$f zjv&(&*Yq{l5eRWX3P&6v@51H-QF?2LW@CZg97{0AII3JOD|~+Wvdo{{2d^}TV|SD= z_vI^}t5z-MVqK$Rv@%lyyu0*|`KSaD^+D@IR!T5NSNxOxxe^@Qz8Es~Ne1>>{QACg zQ5t^qDstY)m4VO5ij;y^60(I=c5b*x!QQUL&LtPjZwb|swbC{NN9|{M7E@->DKBvC zvymB0xHubcy*C5T*fZxj9&13cbziuijuu$P>}#(u)PzsbPCr)ZwV);9+s5`TEiie) zX=`{!9iC(@M`wtsgFdI#(=uaqxF2xVHSD@N?rX*k(o?Dfn~HX;?=vPaI{$s5poO7fagj$)x@pTO#(#K z@s-ga0W(@h{o1e}Fy22a>}@g5SFxacbh=Ur!U#bDp-RBiJwj~%3iH4IRK5xPsRtz4 z+kX;I=)-I+HkRw?!C><#qe>n_m{_f#T?jOU;2X^32CwwtpaW%`_jP@^84s2DkMw~4 z2#=3fhY`$_KAe0uY6RDib!0iH6 zd1%LR8aJ*ez`_^)KLLs2U~#oP>qM>um~EZ-J)Xx00o8UsU*!0~?^pM+w+#I7i4Rr( zQ4@ggcV~T+3i)B-yt8k8kpftqvKsL0Qvml_-SspL%xm%O;acESg5>HK73XmunUPgC z^-3%|6fLW&YDKU^x8#<-QZBB)2=_B34iKFcoxEVW8+?S1hFm?1{j4cxGzTzGoquNB zNcE^7a2easshEoaQ>{sNfrl7eOKz%zO( z&?VaEx_F-KaHwBJ4+!N)!a)QWr{BVP9zpOUR;r{$6`;V_i8rmPP#<^n^N@%dcws!i zPNWK`?Av_*-U2_@sEh~t@^A_yujA{9@m1uJbx4oh4$twk?sxB%UPCzDrS?+O8X8*2 zYjyd}18JfkHm()(g4;~U@eB8PptE~h@3Rjtl!-Xin0^bO%y?o1iYZYYlo2>*29FnhNm#<_5q13} z87I*5{q%&U$q{IG8sDul;5;@tG5P^(C&=`8&nhkN1a%p?ZhN)V!Sx>3qlY#c|L)uV z>Tp_tqBp=u^&j_ER}IKX-`$dH$MbnN55w(`>~MKGSxq~M1?UaPwd1^*;2ufm4&^8_ zoUveE=esNlwpUe4<5R?8Y9zLJ3dG@tIjv{0;3w_5SLaKAe6!*g-J zhdBSokK4%ybA~#-y)&vIi>7qD=FpsDqThgb@7$$C8DHpS0u2d%(G#eU0 z>W93yDT(?}GyVGP?MQuaH}~1sggIA*MW^nQ;(k3&Q6i7|tq0v7;!kZ5xMYJ--!4lk*!wj1M?jFE;MTetQymTlCEmt zQ5b#gi-;0@&bk$qenc4}yx(4V>7@)k7pgjL$SHvIucIO3Cs^U@_s!sVL00(qIZD1! zjTwCQ_8%_8TnDvaHmaXhY(Vz3{Ib|%sX-XKl%b?%P4yu6N(B zt=d6>UyGA3{yNWeVdqB|oL56RbLYb&oKN|@iPQ6)Ev%oP%&S_$`GMr(MIpW>ur>R} z&0EA6WTzvmMRwu$zir~^FgH|wuIE%7uQB|dilZu-Foe*Ky0Z$;4B&>|4`%r=Lnsxg z+^1}301=^8F~oreKp5vvL}|gfEQhO^Hkyz}|Ma)QcTK26O!5awHNo5~@ACa>4cNci zjpK&90UVfel_$aeDhFewio|(+kWfE#>?Ik_Z~6Z7gdd(8_hD?cjlVwp?bkTzfp%5o z*3WT0kQ4cG_7Z;oW@P)To`xQzs+0Oup3wpM>(AKSzH7s;$K?mDJavE&2lz%4&qFi4 zc4Dv}UCExG!6!u-Ub^|EJ>AB7sLMi^DNa%grWI<3>72AJP3CtU(Xj ziwgS#PS8MG5LUQ5(SpU9Xl;{JB4Bs9?r(aB2u6<-jM=9Vfl*8lndp0*hj1fgU(ahI zFlZv@J>sJX4EMaqJee`K|5ShW_8y#{S^0JR^$A6oWR1-)z;k+6l$r0MfVtfmx6%I& z=flNKKk$slxi}peMR}KWLFb9Qt5c;eh!TRMR&Wjqefhg$4Q2Rq+de0mO$~Td2Sr7D z6hY9oOEyPF3EI3X^2rY90mpe~7FxXD|C>J;sRdu6bXWdN=>bvQJy~xFeQ*vsXLqTM z4(P*BtN{zjDtaY|WC>c+9LD>4sR|E& z5ot&mQOzG{l!V!UkrNN@%K-VU47*v}e<5ISk}&sszZh>?*KS!jP`m9v8;|t~R~nW! zgv25Cv#7t(m>P6vrbHwhQGwD+XKSLU#bG7G&{Z>11Y|>%_!TykVO4P=omy5C7>4F{ z-NF9D#!W0FTUG+6ucJIw)XLE4sdnQP*6rpv=&)TTl?Dmce%rNVDfqtI@2r^$KU@ur zRo0s00g?cEK`L21m)=!-`;f6Jv`H|#A6ifc?Q3^b9c(6gXtE~ zklp@jC&~gu&nfNnV@^0dea~`np>yzfLProM|x5Zp7EHfkB{g9#UU0QB1b(K&!I?d@7Mds1NSq6+9TgO6iJQY zw5Bj44X*pHJ&D!f^EZM67B`X(>^Fw;@Su)ILsDRRyt$ke=LwTw8D65a6li@u-9_6c z{g112R~q8exQ^?5kcZHXsXA|5hfOcr7`dq`KzH<>>q=M`V)*8vU4j(W?|nPnDoZa6 zHU9aBqFsa_S|&z}d>Q9g5C+}11fWRS+&v!GnTbBQ08*BLUNp|DWhDdku9G9O>-hQ) z`5ZK0D+TAq#O0=NA4r(IfDjE~VCRfN9%L#MK)1O?Hob!RvzU-)u%PcRJ_Ew097L zB?M{*Rr*R|{}!0x!pe&Tv0~rq;W|Mdk=-tn^=|s^GbA^3XhFAn=_m=K0gz0CKnV*jqj2Jar;!?YkbbtY@tmKtg>PUNW< zHSD{0f;NyD&!sUA;-owU@J>A{rGJe30&;3+9;*pKzX|gdsc(W1_mSJOT^aHk z?G%KTRVKSI7hV_-u#piQ6N0<8(H^v4gkj{(^RC+*TyT8XiL>I`tjz z<6|2*ti)Z_e8d*+22bz_hFQbNj+^pPW@|WSMmZZUit~!9HM|ec9O-QiY_d=&;V>-j2xAmQ%Js`1mv@Y(eO| z32zsRDdg=MI7DJ)3VZmM-84U$!tD1kzYr0;o~XonF2MvgnW_%cpHzlt>n|zidvFe9 zlp3QNof0rJ?HGPCQU;S<@#^_YnDZ6Qe|Q+{!4CNFzZPl6`mfl_)M~yOaLQ}^Tx_vA zm}b=Ev^A)~5NFw#^qdJeEQ+N6E--IIoh8lQ-eY0A4?Z6Mg)!kD9=}^3ndM z$Gff#IITg&-cB3zGNuRBF~{?|NqNSRIc=D%-!t&xxW+&3eWwO!mK`n7R@4OVV`ImB zk~DxJCi^m`WCiRURb?1LKJ-u$Ea```fgsQSo^1bhgc_+G6h0bz5o z)D036K*y<^l4K(epR=7)}f(AS3#a zu3bg};X=)cCF@jRmoE3b;}AKxtDiIv{*7PhQ**C$P{Lux{Tjuu$$`+WD!MHIWuFS~Dy&(mH9Ep;V1SZ?|jNr$lYK(PSjhdJ&UO zCrDs*HkquP9M4CdN#jutF<27Hq@p7!8VbI4}MZQG}P0=3^R%}s5eL|0x2 z?e`j-L75SI8t#lwp}#!h;29)92n_r>j#wnsEBVJJ5DRXVv;NaXerAkQ)56M&~N2%$+F2SICI*Jy!e%+3zl%j

@RNbP=P?%oAu@*tYZ`iIpgch0lKXNWm(r* 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

D9N;_X1WaEv&02>S`ZtGQdrHu8qe(7{Jy>Zs1tR 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 G5&sYAv9@{u literal 0 HcmV?d00001 diff --git a/_delphi_utils_python/tests/test_data/doctor-visits_smoothed_adj_cli.pkl b/_delphi_utils_python/tests/test_data/doctor-visits_smoothed_adj_cli.pkl deleted file mode 100644 index cf2852eef57c2d5fd3858b1a5b5d2d5c62ba80e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63570 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 UsR>?=o-8Mhr$8Ji@O3i(59B(<-T(jq diff --git a/_delphi_utils_python/tests/test_data/doctor-visits_smoothed_cli.pkl b/_delphi_utils_python/tests/test_data/doctor-visits_smoothed_cli.pkl deleted file mode 100644 index 504df73c4510c914169b876b0b96a2a68ddce8fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63566 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 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_s01_raw_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_s01_raw_search.pkl deleted file mode 100644 index 9a906d11eab7005ba9c2f940ada5554086a96c10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69123 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 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_s01_smoothed_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_s01_smoothed_search.pkl deleted file mode 100644 index d0243dc9bae379286408548fafb861548b618c92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69128 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 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_s02_smoothed_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_s02_smoothed_search.pkl deleted file mode 100644 index b46fbe539a8f73e4613d42992274df6a5471f533..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69128 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 fRB9&Zr17aKN<|#`8KzVzi|V!l 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 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_s03_smoothed_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_s03_smoothed_search.pkl deleted file mode 100644 index d26b467efc4870d561699597f9b28b0dc899419a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69128 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 V#MED4MpO2zlXCr6+`{bizX5PDHlY9j diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_s04_smoothed_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_s04_smoothed_search.pkl deleted file mode 100644 index bd8ec7ab146e99b28c11ab56407160f891a36117..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69128 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 Tm!%~Zy=>&nvaR;n&D{9k_c!?7 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_s05_smoothed_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_s05_smoothed_search.pkl deleted file mode 100644 index ab23a83f1dd3ba9db4e151141eda2708a95159fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47117 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 R!gB}YVkMv&)oQf3@PBg3_lW=i diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_s06_raw_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_s06_raw_search.pkl deleted file mode 100644 index 68d37e961d1e437edc24d6a3de8c06bea7e2ba80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69123 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 a$6Hky@Rjht!1M%+Vl!Ylbyihz;eP;FLaP}7 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_s06_smoothed_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_s06_smoothed_search.pkl deleted file mode 100644 index b550bbceae941856f30d5a12b69177148f2a3f65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69128 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 MD(wPQQcT#t0Gb%BZU6uP diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_scontrol_raw_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_scontrol_raw_search.pkl deleted file mode 100644 index 1350a0758607607452f79ac4a7a9610d580d0ce3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69128 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 QGoDDAz4Y4N{KVKl0cVY-SpWb4 diff --git a/_delphi_utils_python/tests/test_data/google-symptoms_scontrol_smoothed_search.pkl b/_delphi_utils_python/tests/test_data/google-symptoms_scontrol_smoothed_search.pkl deleted file mode 100644 index af604c852ac6d13a544162abf99c2ef9ceb9666e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69133 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 TTTHD{7p^zjoMUVW;eP)G-jKuH diff --git a/_delphi_utils_python/tests/test_data/hospital-admissions_smoothed_adj_covid19_from_claims.pkl b/_delphi_utils_python/tests/test_data/hospital-admissions_smoothed_adj_covid19_from_claims.pkl deleted file mode 100644 index 041ceda55cbbb205b28eb734e131159a49de82ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64288 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 G>OTO05*&sA diff --git a/_delphi_utils_python/tests/test_data/hospital-admissions_smoothed_covid19_from_claims.pkl b/_delphi_utils_python/tests/test_data/hospital-admissions_smoothed_covid19_from_claims.pkl deleted file mode 100644 index f369f6b0e7370ff9f68459a6f45296439059efeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64284 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 Date: Mon, 5 Aug 2024 17:17:59 -0400 Subject: [PATCH 08/24] removing wrapper and directly converting in other places and moving test as a script --- _delphi_utils_python/delphi_utils/__init__.py | 1 - .../delphi_utils/validator/datafetcher.py | 62 +++++++++++++- .../tests/test_covidcast_wrapper.py | 38 --------- .../tests/test_data/covidcast_metadata.pkl | Bin 368298 -> 0 bytes google_symptoms/delphi_google_symptoms/run.py | 17 ++-- .../delphi_sir_complainsalot/check_source.py | 31 +++++-- .../delphi_sir_complainsalot/run.py | 11 ++- .../check_covidcast_port.py | 79 ++++++++++-------- 8 files changed, 137 insertions(+), 102 deletions(-) delete mode 100644 _delphi_utils_python/tests/test_covidcast_wrapper.py delete mode 100644 _delphi_utils_python/tests/test_data/covidcast_metadata.pkl rename _delphi_utils_python/delphi_utils/covidcast_wrapper.py => testing_utils/check_covidcast_port.py (75%) diff --git a/_delphi_utils_python/delphi_utils/__init__.py b/_delphi_utils_python/delphi_utils/__init__.py index c5a804c74..f0aeda068 100644 --- a/_delphi_utils_python/delphi_utils/__init__.py +++ b/_delphi_utils_python/delphi_utils/__init__.py @@ -4,7 +4,6 @@ from __future__ import absolute_import from .archive import ArchiveDiffer, GitArchiveDiffer, S3ArchiveDiffer -from .covidcast_wrapper import metadata, signal from .export import create_export_csv from .geomap import GeoMapper from .logger import get_structured_logger diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index b648b7567..b90ffd077 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -6,17 +6,42 @@ import warnings from os import listdir from os.path import isfile, join +from typing import Union import numpy as np import pandas as pd import requests -from delphi_utils import covidcast_wrapper +from delphi_epidata import Epidata +from epiweeks import Week from .errors import APIDataFetchError, ValidationFailure FILENAME_REGEX = re.compile( r'^(?P\d{8})_(?P\w+?)_(?P\w+)\.csv$') +def _parse_datetimes(date_int: int, time_type: str, date_format: str = "%Y%m%d") -> Union[pd.Timestamp, None]: + """Convert a date or epiweeks string into timestamp objects. + + Datetimes (length 8) are converted to their corresponding date, while epiweeks (length 6) + are converted to the date of the start of the week. Returns nan otherwise + + Epiweeks use the CDC format. + + date_int: Int representation of date. + time_type: The temporal resolution to request this data. Most signals + are available at the "day" resolution (the default); some are only + available at the "week" resolution, representing an MMWR week ("epiweek"). + date_format: String of the date format to parse. + :returns: Timestamp. + """ + date_str = str(date_int) + if time_type == "day": + return pd.to_datetime(date_str, format=date_format) + if time_type == "week": + epiwk = Week(int(date_str[:4]), int(date_str[-2:])) + return pd.to_datetime(epiwk.startdate()) + return None + def make_date_filter(start_date, end_date): """ Create a function to filter dates in the specified date range (inclusive). @@ -118,7 +143,16 @@ def get_geo_signal_combos(data_source, api_key): source_signal_mappings = {i['source']:i['db_source'] for i in meta_response.json()} - meta = covidcast_wrapper.metadata() + response = Epidata.covidcast_meta() + + if response["result"] != 1: + # Something failed in the API and we did not get real metadata + raise RuntimeError("Error when fetching metadata from the API", response["message"]) + + meta = pd.DataFrame.from_dict(response["epidata"]) + meta["min_time"] = meta.apply(lambda x: _parse_datetimes(x.min_time, x.time_type), axis=1) + meta["max_time"] = meta.apply(lambda x: _parse_datetimes(x.max_time, x.time_type), axis=1) + meta["last_update"] = pd.to_datetime(meta["last_update"], unit="s") source_meta = meta[meta['data_source'] == data_source] # Need to convert np.records to tuples so they are hashable and can be used in sets and dicts. @@ -162,8 +196,28 @@ def fetch_api_reference(data_source, start_date, end_date, geo_type, signal_type Formatting is changed to match that of source data CSVs. """ - with warnings.catch_warnings(): - api_df = covidcast_wrapper.signal(data_source, signal_type, start_date, end_date, geo_type) + if start_date > end_date: + raise ValueError( + "end_day must be on or after start_day, but " f"start_day = '{start_date}', end_day = '{end_date}'" + ) + response = Epidata.covidcast( + data_source, + signal_type, + time_type="day", + geo_type=geo_type, + time_values=Epidata.range(start_date.strftime("%Y%m%d"), end_date.strftime("%Y%m%d")), + geo_value=geo_type, + ) + if response["result"] != 1: + # Something failed in the API and we did not get real metadata + raise RuntimeError("Error when fetching signal data from the API", response["message"]) + + api_df = pd.DataFrame.from_dict(response["epidata"]) + api_df["issue"] = pd.to_datetime(api_df["issue"], format="%Y%m%d") + api_df["time_value"] = pd.to_datetime(api_df["time_value"], format="%Y%m%d") + api_df.drop("direction", axis=1, inplace=True) + api_df["data_source"] = data_source + api_df["signal"] = signal_type error_context = f"when fetching reference data from {start_date} to {end_date} " +\ diff --git a/_delphi_utils_python/tests/test_covidcast_wrapper.py b/_delphi_utils_python/tests/test_covidcast_wrapper.py deleted file mode 100644 index 24f4c2a17..000000000 --- a/_delphi_utils_python/tests/test_covidcast_wrapper.py +++ /dev/null @@ -1,38 +0,0 @@ -from datetime import datetime, timedelta -from pathlib import Path -import pandas as pd -from delphi_utils import covidcast_wrapper -import covidcast -from freezegun import freeze_time -from delphi_epidata import Epidata -from pandas.testing import assert_frame_equal - -TEST_DIR = Path(__file__).parent -class TestCovidcastWrapper: - Epidata.debug = True - def test_metadata(self): - expected_df = covidcast.metadata() - df = covidcast_wrapper.metadata() - assert_frame_equal(expected_df, df) - - @freeze_time("2022-01-29") - def test_signal(self): - meta_df = pd.read_pickle(f"{TEST_DIR}/test_data/covidcast_metadata.pkl") - - data_filter = (meta_df["max_time"] >= datetime(year=2024, month=6, day=1)) - signal_df = meta_df[data_filter].groupby("data_source")["signal"].agg(['unique']) - enddate = datetime.today() - startdate = enddate - timedelta(days=15) - for data_source, row in signal_df.iterrows(): - signals = list(row[0]) - for signal in signals: - # expected_df = covidcast.signal(data_source, signal, start_day=startdate, end_day=enddate, geo_type="state") - expected_df = pd.read_pickle(f"{TEST_DIR}/test_data/{data_source}_{signal}.pkl") - if expected_df is None: - print("%s %s %s %s not existing", data_source, signal, startdate, enddate) - continue - df = covidcast_wrapper.signal(data_source, signal, start_day=startdate, end_day=enddate, geo_type="state") - - check = df.merge(expected_df, indicator=True) - assert (check["_merge"] == "both").all() - diff --git a/_delphi_utils_python/tests/test_data/covidcast_metadata.pkl b/_delphi_utils_python/tests/test_data/covidcast_metadata.pkl deleted file mode 100644 index 914faf6959f946c0302e9ba9d7bb0143380b5de3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368298 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

@RNbP=P?%oAu@*tYZ`iIpgch0lKXNWm(r* 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

D9N;_X1WaEv&02>S`ZtGQdrHu8qe(7{Jy>Zs1tR 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 G5&sYAv9@{u diff --git a/google_symptoms/delphi_google_symptoms/run.py b/google_symptoms/delphi_google_symptoms/run.py index 27032f349..a1bb5ae7b 100644 --- a/google_symptoms/delphi_google_symptoms/run.py +++ b/google_symptoms/delphi_google_symptoms/run.py @@ -5,20 +5,16 @@ when the module is run with `python -m delphi_google_symptoms`. """ import time -from datetime import datetime, date +from datetime import date, datetime from itertools import product -import covidcast import numpy as np -from pandas import to_datetime -from delphi_utils import ( - create_export_csv, - get_structured_logger -) +from delphi_epidata import Epidata +from delphi_utils import create_export_csv, get_structured_logger from delphi_utils.validator.utils import lag_converter +from pandas import to_datetime -from .constants import (COMBINED_METRIC, - GEO_RESOLUTIONS, SMOOTHERS, SMOOTHERS_MAP) +from .constants import COMBINED_METRIC, GEO_RESOLUTIONS, SMOOTHERS, SMOOTHERS_MAP from .geo import geo_map from .pull import pull_gs_data @@ -66,8 +62,7 @@ def run_module(params): ) # Fetch metadata to check how recent each signal is - covidcast.use_api_key(params["indicator"]["api_credentials"]) - metadata = covidcast.metadata() + metadata = Epidata.covidcast_meta() # Filter to only those we currently want to produce, ignore any old or deprecated signals gs_metadata = metadata[(metadata.data_source == "google-symptoms") & (metadata.signal.isin(sensor_names))] diff --git a/sir_complainsalot/delphi_sir_complainsalot/check_source.py b/sir_complainsalot/delphi_sir_complainsalot/check_source.py index 840575cbf..b8107eba3 100644 --- a/sir_complainsalot/delphi_sir_complainsalot/check_source.py +++ b/sir_complainsalot/delphi_sir_complainsalot/check_source.py @@ -6,6 +6,7 @@ import covidcast import pandas as pd +from delphi_epidata import Epidata covidcast.covidcast._ASYNC_CALL = True # pylint: disable=protected-access @@ -64,22 +65,36 @@ def check_source(data_source, meta, params, grace, logger): # pylint: disable=t age_complaints = {} gap_complaints = {} + start_date = datetime.now() - timedelta(days=14) + end_date = datetime.now() + for _, row in signals.iterrows(): logger.info("Retrieving signal", data_source=data_source, signal=row["signal"], - start_day=(datetime.now() - timedelta(days = 14)).strftime("%Y-%m-%d"), - end_day=datetime.now().strftime("%Y-%m-%d"), + start_day=start_date.strftime("%Y-%m-%d"), + end_day=end_date.strftime("%Y-%m-%d"), geo_type=row["geo_type"]) - latest_data = covidcast.signal( - data_source, row["signal"], - start_day=datetime.now() - timedelta(days = 14), - end_day=datetime.now(), - geo_type=row["geo_type"] + response = Epidata.covidcast( + data_source, + row["signal"], + time_type=row["time_type"], + geo_type=row["geo_type"], + time_values=Epidata.range(start_date.strftime("%Y%m%d"), end_date.strftime("%Y%m%d")), + geo_value="*", ) - current_lag_in_days = (now - row["max_time"]).days + if response["result"] != 1: + # Something failed in the API and we did not get real metadata + raise RuntimeError("Error when fetching signal data from the API", response["message"]) + + latest_data = pd.DataFrame.from_dict(response["epidata"]) + latest_data["issue"] = pd.to_datetime(latest_data["issue"], format="%Y%m%d") + latest_data["time_value"] = pd.to_datetime(latest_data["time_value"], format="%Y%m%d") + latest_data.drop("direction", axis=1, inplace=True) + + current_lag_in_days = (now - datetime.strptime(str(row["max_time"]), "%Y%m%d")).days lag_calculated_from_api = False if latest_data is not None: diff --git a/sir_complainsalot/delphi_sir_complainsalot/run.py b/sir_complainsalot/delphi_sir_complainsalot/run.py index a1555b9c2..498edd836 100644 --- a/sir_complainsalot/delphi_sir_complainsalot/run.py +++ b/sir_complainsalot/delphi_sir_complainsalot/run.py @@ -8,10 +8,9 @@ import time from itertools import groupby -import covidcast -from delphi_utils import SlackNotifier -from delphi_utils import get_structured_logger -from delphi_utils import read_params +import pandas as pd +from delphi_epidata import Epidata +from delphi_utils import SlackNotifier, get_structured_logger, read_params from .check_source import check_source @@ -29,8 +28,8 @@ def run_module(): """Run SirCAL.""" start_time = time.time() params = read_params() - covidcast.use_api_key(params["api_credentials"]) - meta = covidcast.metadata() + Epidata.auth = ("epidata", params["api_credentials"]) + meta = pd.DataFrame.from_dict(Epidata.covidcast_meta().get("epidata", dict())) slack_notifier = None if "channel" in params and "slack_token" in params: slack_notifier = SlackNotifier(params["channel"], params["slack_token"]) diff --git a/_delphi_utils_python/delphi_utils/covidcast_wrapper.py b/testing_utils/check_covidcast_port.py similarity index 75% rename from _delphi_utils_python/delphi_utils/covidcast_wrapper.py rename to testing_utils/check_covidcast_port.py index 00baaf9d1..dbc1140cd 100644 --- a/_delphi_utils_python/delphi_utils/covidcast_wrapper.py +++ b/testing_utils/check_covidcast_port.py @@ -1,37 +1,20 @@ -"""module for covidcast api call wrapper.""" - -from datetime import date, timedelta -from typing import Iterable, Union - +""" +script to check converting covidcast api calls with Epidata.covidcast Epidata.covidcast_meta +""" +from typing import Union, Iterable +from datetime import datetime, timedelta, date import pandas as pd +import covidcast from delphi_epidata import Epidata +from pandas.testing import assert_frame_equal +import os from epiweeks import Week +API_KEY = os.environ.get('DELPHI_API_KEY') +covidcast.use_api_key(API_KEY) -def date_generator(startdate: date, enddate: date, time_type: str) -> Iterable[date]: - """ - Take start date and end date and generates date string. - - Parameters - ---------- - startdate: date - enddate: date - time_type: str - - Returns - ------- - generator of str - """ - if time_type.lower() == "day": - while startdate <= enddate: - yield startdate.strftime("%Y-%m-%d") - startdate = startdate + timedelta(days=1) - elif time_type.lower() == "week": - while startdate <= enddate: - epiweek = Week.fromdate(startdate) - yield epiweek - startdate = startdate + timedelta(days=7) - +Epidata.debug = True +Epidata.auth = ("epidata", API_KEY) def _parse_datetimes(date_int: int, time_type: str, date_format: str = "%Y%m%d") -> Union[pd.Timestamp, None]: """Convert a date or epiweeks string into timestamp objects. @@ -57,7 +40,7 @@ def _parse_datetimes(date_int: int, time_type: str, date_format: str = "%Y%m%d") return None -def metadata() -> Union[pd.DataFrame, None]: +def ported_metadata() -> Union[pd.DataFrame, None]: """ Make covidcast metadata api call. @@ -78,7 +61,7 @@ def metadata() -> Union[pd.DataFrame, None]: return df -def signal( +def ported_signal( data_source: str, signal: str, # pylint: disable=W0621 start_day: date = None, @@ -132,14 +115,12 @@ def signal( "end_day must be on or after start_day, but " f"start_day = '{start_day}', end_day = '{end_day}'" ) - time_values = list(date_generator(start_day, end_day)) - response = Epidata.covidcast( data_source, signal, time_type=time_type, geo_type=geo_type, - time_values=time_values, + time_values=Epidata.range(start_day.strftime("%Y%m%d"), end_day.strftime("%Y%m%d")), geo_value=geo_values, as_of=as_of, lag=lag, @@ -156,3 +137,33 @@ def signal( api_df["signal"] = signal return api_df + +def check_metadata(): + expected_df = covidcast.metadata() + df = ported_metadata().metadata() + assert_frame_equal(expected_df, df) + +def check_signal(): + meta_df = covidcast.metadata() + startdate = datetime(year=2022, month=2, day=1) + data_filter = (meta_df["max_time"] >= startdate) + signal_df = meta_df[data_filter].groupby("data_source")["signal"].agg(['unique']) + enddate = startdate + timedelta(days=3) + + for data_source, row in signal_df.iterrows(): + signals = list(row[0]) + for signal in signals: + expected_df = covidcast.signal(data_source, signal, start_day=startdate, end_day=enddate, geo_type="state") + if expected_df is None: + print("%s %s %s %s not existing", data_source, signal, startdate, enddate) + + df = ported_signal(data_source, signal, start_day=startdate, end_day=enddate, geo_type="state") + + check = df.merge(expected_df, indicator=True) + assert (check["_merge"] == "both").all() + assert check["_left_only"].empty + assert check["_right_only"].empty + +if __name__ == "__main__": + # check_metadata() + check_signal() From 8e67b6c11069c9c197c1ea46e4a237d672acacd5 Mon Sep 17 00:00:00 2001 From: Amaris Sim Date: Mon, 5 Aug 2024 18:28:19 -0400 Subject: [PATCH 09/24] modifing test --- .../delphi_utils/validator/datafetcher.py | 15 ++-- .../test_data/sample_epidata_metadata.json | 28 ++++++ .../test_data/sample_epidata_signal_a.json | 9 ++ .../sample_epidata_signal_county.json | 9 ++ .../tests/validator/test_datafetcher.py | 85 +++++++------------ 5 files changed, 85 insertions(+), 61 deletions(-) create mode 100644 _delphi_utils_python/tests/test_data/sample_epidata_metadata.json create mode 100644 _delphi_utils_python/tests/test_data/sample_epidata_signal_a.json create mode 100644 _delphi_utils_python/tests/test_data/sample_epidata_signal_county.json diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index b90ffd077..b8f429c9e 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -212,13 +212,14 @@ def fetch_api_reference(data_source, start_date, end_date, geo_type, signal_type # Something failed in the API and we did not get real metadata raise RuntimeError("Error when fetching signal data from the API", response["message"]) - api_df = pd.DataFrame.from_dict(response["epidata"]) - api_df["issue"] = pd.to_datetime(api_df["issue"], format="%Y%m%d") - api_df["time_value"] = pd.to_datetime(api_df["time_value"], format="%Y%m%d") - api_df.drop("direction", axis=1, inplace=True) - api_df["data_source"] = data_source - api_df["signal"] = signal_type - + api_df = None + if len(response["epidata"]) > 0: + api_df = pd.DataFrame.from_dict(response["epidata"]) + api_df["issue"] = pd.to_datetime(api_df["issue"], format="%Y%m%d") + api_df["time_value"] = pd.to_datetime(api_df["time_value"], format="%Y%m%d") + api_df.drop("direction", axis=1, inplace=True) + api_df["data_source"] = data_source + api_df["signal"] = signal_type error_context = f"when fetching reference data from {start_date} to {end_date} " +\ f"for data source: {data_source}, signal type: {signal_type}, geo type: {geo_type}" diff --git a/_delphi_utils_python/tests/test_data/sample_epidata_metadata.json b/_delphi_utils_python/tests/test_data/sample_epidata_metadata.json new file mode 100644 index 000000000..8dfa978f3 --- /dev/null +++ b/_delphi_utils_python/tests/test_data/sample_epidata_metadata.json @@ -0,0 +1,28 @@ +{"data_source": ["chng", "chng", "chng", + "covid-act-now", + "covid-act-now", + "covid-act-now", + "chng"], + "signal": ["smoothed_outpatient_cli", + "smoothed_outpatient_covid", + "smoothed_outpatient_covid", + "pcr_specimen_positivity_rate", + "pcr_specimen_positivity_rate", + "pcr_specimen_total_tests", + "inactive"], + "geo_type": ["state", "state", "county", + "hrr", "msa", "msa", + "state"], + "min_time": ["20200101", "20200101", "20200101", + "20200101", "20200101", "20200101", + "20200101"], + "max_time": ["20240101", "20240101", "20240101", + "20240101", "20240101", "20240101", + "20240101"], + "last_update": [1711963480, 1711963480, 1711963480, + 1711963480, 1711963480, 1711963480, + 1711963480], + "time_type": ["day", "day", "day", + "day", "day", "day", + "day"] + } diff --git a/_delphi_utils_python/tests/test_data/sample_epidata_signal_a.json b/_delphi_utils_python/tests/test_data/sample_epidata_signal_a.json new file mode 100644 index 000000000..73b4686f7 --- /dev/null +++ b/_delphi_utils_python/tests/test_data/sample_epidata_signal_a.json @@ -0,0 +1,9 @@ +{"geo_value": ["1044"], + "stderr": [null], + "value": [3], + "issue": [20200101], + "lag": [7], + "sample_size": [null], + "time_value": [20200101], + "direction": [null] + } \ No newline at end of file diff --git a/_delphi_utils_python/tests/test_data/sample_epidata_signal_county.json b/_delphi_utils_python/tests/test_data/sample_epidata_signal_county.json new file mode 100644 index 000000000..78787b361 --- /dev/null +++ b/_delphi_utils_python/tests/test_data/sample_epidata_signal_county.json @@ -0,0 +1,9 @@ +{"geo_value": ["0888"], + "stderr": [2], + "value": [14], + "issue": [20200101], + "lag": [1], + "sample_size": [100], + "time_value": [20200101], + "direction": [null] + } \ No newline at end of file diff --git a/_delphi_utils_python/tests/validator/test_datafetcher.py b/_delphi_utils_python/tests/validator/test_datafetcher.py index 7139c3ae7..92fa44f34 100644 --- a/_delphi_utils_python/tests/validator/test_datafetcher.py +++ b/_delphi_utils_python/tests/validator/test_datafetcher.py @@ -1,7 +1,9 @@ """Tests for datafetcher.py.""" -from datetime import date +from datetime import date, datetime import mock +import json +from pathlib import Path import numpy as np import pandas as pd import pytest @@ -14,6 +16,7 @@ from delphi_utils.validator.errors import ValidationFailure +TEST_DIR = Path(__file__).parent.parent class TestDataFetcher: """Tests for various data fetching utilities.""" @@ -45,6 +48,27 @@ def raise_for_status(self): {'source': 'covid-act-now', 'db_source': 'covid-act-now'}], 200) elif "params" in kwargs and kwargs["params"] == {'signal': 'chng:inactive'}: return MockResponse([{"signals": [{"active": False}]}], 200) + elif args[1] == 'https://api.delphi.cmu.edu/epidata/covidcast_meta/' and \ + 'delphi_epidata' in kwargs["headers"]["user-agent"]: + with open(f"{TEST_DIR}/test_data/sample_epidata_metadata.json") as f: + epidata = json.load(f) + response = {"epidata": epidata, "result": 1, "message": "success"} + return MockResponse(response, 200) + elif args[0] == 'https://api.delphi.cmu.edu/epidata/covidcast/' and \ + 'delphi_epidata' in kwargs["headers"]["user-agent"]: + signal_type = args[1].get("signals") + geo_type = args[1].get("geo_type") + if signal_type == "a": + with open(f"{TEST_DIR}/test_data/sample_epidata_signal_a.json") as f: + epidata = json.load(f) + response = {"epidata": epidata, "result": 1, "message": "success"} + return MockResponse(response, 200) + if geo_type == "county": + with open(f"{TEST_DIR}/test_data/sample_epidata_signal_county.json") as f: + epidata = json.load(f) + response = {"epidata": epidata, "result": 1, "message": "success"} + return MockResponse(response, 200) + return MockResponse({"epidata": {}, "result": 1, "message": "success"}, 200) else: return MockResponse([{"signals": [{"active": True}]}], 200) @@ -57,27 +81,9 @@ def test_bad_api_key(self, **kwargs): get_geo_signal_combos("chng", api_key="") @mock.patch('requests.get', side_effect=mocked_requests_get) - @mock.patch("delphi_utils.covidcast_wrapper.metadata") - def test_get_geo_signal_combos(self, mock_metadata, mock_get): + def test_get_geo_signal_combos(self, mock_get): + """Test that the geo signal combos are correctly pulled from the covidcast metadata.""" - # Need to use actual data_source and signal names since we reference the API - # We let the chng signal "inactive" be an inactive signal - mock_metadata.return_value = pd.DataFrame({"data_source": ["chng", "chng", "chng", - "covid-act-now", - "covid-act-now", - "covid-act-now", - "chng"], - "signal": ["smoothed_outpatient_cli", - "smoothed_outpatient_covid", - "smoothed_outpatient_covid", - "pcr_specimen_positivity_rate", - "pcr_specimen_positivity_rate", - "pcr_specimen_total_tests", - "inactive"], - "geo_type": ["state", "state", "county", - "hrr", "msa", "msa", - "state"] - }) assert set(get_geo_signal_combos("chng", api_key="")) == set( [("state", "smoothed_outpatient_cli"), ("state", "smoothed_outpatient_covid"), @@ -87,49 +93,20 @@ def test_get_geo_signal_combos(self, mock_metadata, mock_get): ("msa", "pcr_specimen_positivity_rate"), ("msa", "pcr_specimen_total_tests")]) - @mock.patch("delphi_utils.covidcast_wrapper.signal") - def test_threaded_api_calls(self, mock_signal): + @mock.patch('requests.get', side_effect=mocked_requests_get) + def test_threaded_api_calls(self, mock_get): """Test that calls to the covidcast API are made.""" - - signal_data_1 = pd.DataFrame({"geo_value": ["1044"], - "stderr": [None], - "value": [3], - "issue": [10], - "lag": [7], - "sample_size": [None], - "time_value": [10] - }) - signal_data_2 = pd.DataFrame({"geo_value": ["0888"], - "stderr": [2], - "value": [14], - "issue": [10], - "lag": [1], - "sample_size": [100], - "time_value": [8] - }) - - def mock_signal_return_fn(unused_data_source, signal_type, unused_start_date, - unused_end_date, geo_type): - """Function to return data when covidcast.signal() is called.""" - if signal_type == "a": - return signal_data_1 - if geo_type == "county": - return signal_data_2 - return None - - mock_signal.side_effect = mock_signal_return_fn - processed_signal_data_1 = pd.DataFrame({"geo_id": ["1044"], "val": [3], "se": [np.nan], "sample_size": [np.nan], - "time_value": [10] + "time_value": [datetime.strptime("20200101", "%Y%m%d")], }) processed_signal_data_2 = pd.DataFrame({"geo_id": ["0888"], "val": [14], "se": [2], "sample_size": [100], - "time_value": [8] + "time_value": [datetime.strptime("20200101", "%Y%m%d")], }) expected = { ("county", "a"): processed_signal_data_1, From bf21d33803077623753314fbf91a6a285f1a1d34 Mon Sep 17 00:00:00 2001 From: Amaris Sim Date: Tue, 6 Aug 2024 17:53:25 -0400 Subject: [PATCH 10/24] more suggestion --- .../delphi_utils/validator/datafetcher.py | 28 ++----------------- testing_utils/metadata_output.txt | 0 2 files changed, 3 insertions(+), 25 deletions(-) create mode 100644 testing_utils/metadata_output.txt diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index b8f429c9e..484da7183 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -19,29 +19,6 @@ FILENAME_REGEX = re.compile( r'^(?P\d{8})_(?P\w+?)_(?P\w+)\.csv$') -def _parse_datetimes(date_int: int, time_type: str, date_format: str = "%Y%m%d") -> Union[pd.Timestamp, None]: - """Convert a date or epiweeks string into timestamp objects. - - Datetimes (length 8) are converted to their corresponding date, while epiweeks (length 6) - are converted to the date of the start of the week. Returns nan otherwise - - Epiweeks use the CDC format. - - date_int: Int representation of date. - time_type: The temporal resolution to request this data. Most signals - are available at the "day" resolution (the default); some are only - available at the "week" resolution, representing an MMWR week ("epiweek"). - date_format: String of the date format to parse. - :returns: Timestamp. - """ - date_str = str(date_int) - if time_type == "day": - return pd.to_datetime(date_str, format=date_format) - if time_type == "week": - epiwk = Week(int(date_str[:4]), int(date_str[-2:])) - return pd.to_datetime(epiwk.startdate()) - return None - def make_date_filter(start_date, end_date): """ Create a function to filter dates in the specified date range (inclusive). @@ -150,8 +127,9 @@ def get_geo_signal_combos(data_source, api_key): raise RuntimeError("Error when fetching metadata from the API", response["message"]) meta = pd.DataFrame.from_dict(response["epidata"]) - meta["min_time"] = meta.apply(lambda x: _parse_datetimes(x.min_time, x.time_type), axis=1) - meta["max_time"] = meta.apply(lambda x: _parse_datetimes(x.max_time, x.time_type), axis=1) + # note: this will fail for signals with weekly data, but currently not supported for validation + meta["min_time"] = meta.apply(lambda x: pd.to_datetime(str(x.min_time), format="%Y%m%d"), axis=1) + meta["max_time"] = meta.apply(lambda x: pd.to_datetime(str(x.max_time), format="%Y%m%d"), axis=1) meta["last_update"] = pd.to_datetime(meta["last_update"], unit="s") source_meta = meta[meta['data_source'] == data_source] diff --git a/testing_utils/metadata_output.txt b/testing_utils/metadata_output.txt new file mode 100644 index 000000000..e69de29bb From d76cd402a4447b34f3c06a5c72bfd8d0320e6608 Mon Sep 17 00:00:00 2001 From: Amaris Sim Date: Wed, 7 Aug 2024 12:50:31 -0400 Subject: [PATCH 11/24] sircomplainslot needs more filtering --- .../delphi_sir_complainsalot/check_source.py | 28 +++++++-------- .../delphi_sir_complainsalot/date_utils.py | 35 +++++++++++++++++++ .../delphi_sir_complainsalot/run.py | 2 ++ 3 files changed, 51 insertions(+), 14 deletions(-) create mode 100644 sir_complainsalot/delphi_sir_complainsalot/date_utils.py diff --git a/sir_complainsalot/delphi_sir_complainsalot/check_source.py b/sir_complainsalot/delphi_sir_complainsalot/check_source.py index b8107eba3..378a014c0 100644 --- a/sir_complainsalot/delphi_sir_complainsalot/check_source.py +++ b/sir_complainsalot/delphi_sir_complainsalot/check_source.py @@ -8,7 +8,8 @@ import pandas as pd from delphi_epidata import Epidata -covidcast.covidcast._ASYNC_CALL = True # pylint: disable=protected-access +from .date_utils import _date_to_api_string, _parse_datetimes + @dataclass class Complaint: @@ -34,6 +35,7 @@ def to_md(self): message=self.message, updated=self.last_updated.strftime("%Y-%m-%d")) + def check_source(data_source, meta, params, grace, logger): # pylint: disable=too-many-locals """Iterate over all signals from a source and check for problems. @@ -74,30 +76,28 @@ def check_source(data_source, meta, params, grace, logger): # pylint: disable=t signal=row["signal"], start_day=start_date.strftime("%Y-%m-%d"), end_day=end_date.strftime("%Y-%m-%d"), - geo_type=row["geo_type"]) + geo_type=row["geo_type"], + time_type=row["time_type"]) response = Epidata.covidcast( data_source, row["signal"], time_type=row["time_type"], geo_type=row["geo_type"], - time_values=Epidata.range(start_date.strftime("%Y%m%d"), end_date.strftime("%Y%m%d")), + time_values=Epidata.range(_date_to_api_string(start_date), _date_to_api_string(end_date)), geo_value="*", ) - if response["result"] != 1: - # Something failed in the API and we did not get real metadata - raise RuntimeError("Error when fetching signal data from the API", response["message"]) - - latest_data = pd.DataFrame.from_dict(response["epidata"]) - latest_data["issue"] = pd.to_datetime(latest_data["issue"], format="%Y%m%d") - latest_data["time_value"] = pd.to_datetime(latest_data["time_value"], format="%Y%m%d") - latest_data.drop("direction", axis=1, inplace=True) - - current_lag_in_days = (now - datetime.strptime(str(row["max_time"]), "%Y%m%d")).days + current_lag_in_days = (now - row["max_time"]).days lag_calculated_from_api = False + latest_data = None + + if response["result"] == 1: + latest_data = pd.DataFrame.from_dict(response["epidata"]) + latest_data["issue"] = latest_data.apply(lambda x: _parse_datetimes(x.issue, x.time_type), axis=1) + latest_data["time_value"] = latest_data.apply(lambda x: _parse_datetimes(x.time_value, x.time_type), axis=1) + latest_data.drop("direction", axis=1, inplace=True) - if latest_data is not None: unique_dates = [pd.to_datetime(val).date() for val in latest_data["time_value"].unique()] current_lag_in_days = (datetime.now().date() - max(unique_dates)).days diff --git a/sir_complainsalot/delphi_sir_complainsalot/date_utils.py b/sir_complainsalot/delphi_sir_complainsalot/date_utils.py new file mode 100644 index 000000000..2e57d3a95 --- /dev/null +++ b/sir_complainsalot/delphi_sir_complainsalot/date_utils.py @@ -0,0 +1,35 @@ +from datetime import datetime +from typing import Union + +from epiweeks import Week +import pandas as pd +def _date_to_api_string(date: datetime.date, time_type: str = "day") -> str: # pylint: disable=W0621 + """Convert a date object to a YYYYMMDD or YYYYMM string expected by the API.""" + if time_type == "day": + date_str = date.strftime("%Y%m%d") + elif time_type == "week": + date_str = Week.fromdate(date).cdcformat() + return date_str + +def _parse_datetimes(date_int: str, time_type: str, date_format: str = "%Y%m%d") -> Union[pd.Timestamp, None]: + """Convert a date or epiweeks string into timestamp objects. + + Datetimes (length 8) are converted to their corresponding date, while epiweeks (length 6) + are converted to the date of the start of the week. Returns nan otherwise + + Epiweeks use the CDC format. + + date_int: Int representation of date. + time_type: The temporal resolution to request this data. Most signals + are available at the "day" resolution (the default); some are only + available at the "week" resolution, representing an MMWR week ("epiweek"). + date_format: String of the date format to parse. + :returns: Timestamp. + """ + date_str = str(date_int) + if time_type == "day": + return pd.to_datetime(date_str, format=date_format) + if time_type == "week": + epiwk = Week(int(date_str[:4]), int(date_str[-2:])) + return pd.to_datetime(epiwk.startdate()) + return None \ No newline at end of file diff --git a/sir_complainsalot/delphi_sir_complainsalot/run.py b/sir_complainsalot/delphi_sir_complainsalot/run.py index 498edd836..b2824e0eb 100644 --- a/sir_complainsalot/delphi_sir_complainsalot/run.py +++ b/sir_complainsalot/delphi_sir_complainsalot/run.py @@ -13,6 +13,7 @@ from delphi_utils import SlackNotifier, get_structured_logger, read_params from .check_source import check_source +from .date_utils import _parse_datetimes def get_logger(): @@ -30,6 +31,7 @@ def run_module(): params = read_params() Epidata.auth = ("epidata", params["api_credentials"]) meta = pd.DataFrame.from_dict(Epidata.covidcast_meta().get("epidata", dict())) + meta["max_time"] = meta.apply(lambda x: _parse_datetimes(x.max_time, x.time_type), axis=1) slack_notifier = None if "channel" in params and "slack_token" in params: slack_notifier = SlackNotifier(params["channel"], params["slack_token"]) From fd50d9d9b15f177bd3a76bc77c9508db72dc9e31 Mon Sep 17 00:00:00 2001 From: Amaris Sim Date: Thu, 8 Aug 2024 14:50:55 -0400 Subject: [PATCH 12/24] adding credential for google symptoms --- google_symptoms/delphi_google_symptoms/run.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google_symptoms/delphi_google_symptoms/run.py b/google_symptoms/delphi_google_symptoms/run.py index a1bb5ae7b..56904fd6c 100644 --- a/google_symptoms/delphi_google_symptoms/run.py +++ b/google_symptoms/delphi_google_symptoms/run.py @@ -60,7 +60,7 @@ def run_module(params): "_".join([metric, smoother, "search"]) for metric, smoother in product(COMBINED_METRIC, SMOOTHERS) ) - + Epidata.auth = ("epidata", params["api_credentials"]) # Fetch metadata to check how recent each signal is metadata = Epidata.covidcast_meta() # Filter to only those we currently want to produce, ignore any old or deprecated signals From 76f151996d9256928017f0a6cdd58b2a61170d00 Mon Sep 17 00:00:00 2001 From: Amaris Sim Date: Thu, 8 Aug 2024 14:55:45 -0400 Subject: [PATCH 13/24] mocking api call in google symptoms --- google_symptoms/delphi_google_symptoms/run.py | 2 +- google_symptoms/tests/conftest.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/google_symptoms/delphi_google_symptoms/run.py b/google_symptoms/delphi_google_symptoms/run.py index 56904fd6c..215a3ebe5 100644 --- a/google_symptoms/delphi_google_symptoms/run.py +++ b/google_symptoms/delphi_google_symptoms/run.py @@ -60,7 +60,7 @@ def run_module(params): "_".join([metric, smoother, "search"]) for metric, smoother in product(COMBINED_METRIC, SMOOTHERS) ) - Epidata.auth = ("epidata", params["api_credentials"]) + Epidata.auth = ("epidata", params["indicator"]["api_credentials"]) # Fetch metadata to check how recent each signal is metadata = Epidata.covidcast_meta() # Filter to only those we currently want to produce, ignore any old or deprecated signals diff --git a/google_symptoms/tests/conftest.py b/google_symptoms/tests/conftest.py index 98835f7ef..519cbab93 100644 --- a/google_symptoms/tests/conftest.py +++ b/google_symptoms/tests/conftest.py @@ -73,7 +73,7 @@ def run_as_module(): makedirs("receiving") with mock.patch("delphi_google_symptoms.pull.initialize_credentials", - return_value=None) as mock_credentials: - with mock.patch("pandas_gbq.read_gbq", side_effect=[ - state_data, county_data]) as mock_read_gbq: + return_value=None) as mock_credentials, \ + mock.patch("pandas_gbq.read_gbq", side_effect=[state_data, county_data]) as mock_read_gbq, \ + mock.patch("delphi_google_symptoms.run.Epidata.covidcast_meta", return_value=None) as mock_covidcast_meta: delphi_google_symptoms.run.run_module(params) From 157c6c65ecfd048fc56e96f033f37bc1cdb23e6d Mon Sep 17 00:00:00 2001 From: Amaris Sim Date: Thu, 8 Aug 2024 15:55:33 -0400 Subject: [PATCH 14/24] organizing validations --- .../_template_testing_dir/README.md.template | 9 + .../_template_testing_dir/requirements.txt | 0 testing_utils/delphi_utils/README.md | 13 + .../delphi_utils/check_covidcast_port.py | 322 ++++++++++++++++++ testing_utils/delphi_utils/requirements.txt | 12 + 5 files changed, 356 insertions(+) create mode 100644 testing_utils/_template_testing_dir/README.md.template create mode 100644 testing_utils/_template_testing_dir/requirements.txt create mode 100644 testing_utils/delphi_utils/README.md create mode 100644 testing_utils/delphi_utils/check_covidcast_port.py create mode 100644 testing_utils/delphi_utils/requirements.txt diff --git a/testing_utils/_template_testing_dir/README.md.template b/testing_utils/_template_testing_dir/README.md.template new file mode 100644 index 000000000..115db4eab --- /dev/null +++ b/testing_utils/_template_testing_dir/README.md.template @@ -0,0 +1,9 @@ +# Validation for [module] +SHORT DESCRIPTION + +## [script_name] +### Background +DESCRIPTION of why this script exists + +### Instructions to Run + diff --git a/testing_utils/_template_testing_dir/requirements.txt b/testing_utils/_template_testing_dir/requirements.txt new file mode 100644 index 000000000..e69de29bb diff --git a/testing_utils/delphi_utils/README.md b/testing_utils/delphi_utils/README.md new file mode 100644 index 000000000..00b677996 --- /dev/null +++ b/testing_utils/delphi_utils/README.md @@ -0,0 +1,13 @@ +# Validation for _delphi_utils +This directory is used for one-time validations that would be too expensive +or wouldn't make sense to be in tests. + +## Check_covidcast_port +### Background +We were previously using [covidcast](https://github.com/cmu-delphi/covidcast) to grab signal and metadata that was not optimized for historical reasons. + We replaced with [Epidata](https://github.com/cmu-delphi/delphi-epidata) which is what covidcast runs under the hood anyway. To ensure that the results make this script was created to validate the results. + +### Instructions to Run +- requires an API key from Epidata [link](https://cmu-delphi.github.io/delphi-epidata/api/api_keys.html) +- export the api key as an environment variable +- set up virtual environment diff --git a/testing_utils/delphi_utils/check_covidcast_port.py b/testing_utils/delphi_utils/check_covidcast_port.py new file mode 100644 index 000000000..1f7f50ace --- /dev/null +++ b/testing_utils/delphi_utils/check_covidcast_port.py @@ -0,0 +1,322 @@ +""" +script to check converting covidcast api calls with Epidata.covidcast Epidata.covidcast_meta +""" +import time +from collections import defaultdict +from pathlib import Path +from typing import Union, Iterable, Tuple, List, Dict +from datetime import datetime, timedelta, date + +import numpy as np +import pandas as pd +import covidcast +from delphi_epidata import Epidata +from pandas.testing import assert_frame_equal +import os +from epiweeks import Week + +API_KEY = os.environ.get('DELPHI_API_KEY') +covidcast.use_api_key(API_KEY) + +Epidata.debug = True +Epidata.auth = ("epidata", API_KEY) + +CURRENT_DIR = Path(__file__).parent + +def _parse_datetimes(date_int: int, time_type: str, date_format: str = "%Y%m%d") -> Union[pd.Timestamp, None]: + """Convert a date or epiweeks string into timestamp objects. + + Datetimes (length 8) are converted to their corresponding date, while epiweeks (length 6) + are converted to the date of the start of the week. Returns nan otherwise + + Epiweeks use the CDC format. + + date_int: Int representation of date. + time_type: The temporal resolution to request this data. Most signals + are available at the "day" resolution (the default); some are only + available at the "week" resolution, representing an MMWR week ("epiweek"). + date_format: String of the date format to parse. + :returns: Timestamp. + """ + date_str = str(date_int) + if time_type == "day": + return pd.to_datetime(date_str, format=date_format) + if time_type == "week": + epiwk = Week(int(date_str[:4]), int(date_str[-2:])) + return pd.to_datetime(epiwk.startdate()) + return None + + +def ported_metadata() -> Union[pd.DataFrame, None]: + """ + Make covidcast metadata api call. + + Returns + ------- + pd.DataFrame of covidcast metadata. + """ + response = Epidata.covidcast_meta() + + if response["result"] != 1: + # Something failed in the API and we did not get real metadata + raise RuntimeError("Error when fetching metadata from the API", response["message"]) + + df = pd.DataFrame.from_dict(response["epidata"]) + df["min_time"] = df.apply(lambda x: _parse_datetimes(x.min_time, x.time_type), axis=1) + df["max_time"] = df.apply(lambda x: _parse_datetimes(x.max_time, x.time_type), axis=1) + df["last_update"] = pd.to_datetime(df["last_update"], unit="s") + return df + + +def ported_signal( + data_source: str, + signal: str, # pylint: disable=W0621 + start_day: date = None, + end_day: date = None, + geo_type: str = "county", + geo_values: Union[str, Iterable[str]] = "*", + as_of: date = None, + lag: int = None, + time_type: str = "day", +) -> Union[pd.DataFrame, None]: + """ + Makes covidcast signal api call. + + data_source: String identifying the data source to query, such as + ``"fb-survey"``. + signal: String identifying the signal from that source to query, + such as ``"smoothed_cli"``. + start_day: Query data beginning on this date. Provided as a + ``datetime.date`` object. If ``start_day`` is ``None``, defaults to the + first day data is available for this signal. If ``time_type == "week"``, then + this is rounded to the epiweek containing the day (i.e. the previous Sunday). + end_day: Query data up to this date, inclusive. Provided as a + ``datetime.date`` object. If ``end_day`` is ``None``, defaults to the most + recent day data is available for this signal. If ``time_type == "week"``, then + this is rounded to the epiweek containing the day (i.e. the previous Sunday). + geo_type: The geography type for which to request this data, such as + ``"county"`` or ``"state"``. Available types are described in the + COVIDcast signal documentation. Defaults to ``"county"``. + geo_values: The geographies to fetch data for. The default, ``"*"``, + fetches all geographies. To fetch one geography, specify its ID as a + string; multiple geographies can be provided as an iterable (list, tuple, + ...) of strings. + as_of: Fetch only data that was available on or before this date, + provided as a ``datetime.date`` object. If ``None``, the default, return + the most recent available data. If ``time_type == "week"``, then + this is rounded to the epiweek containing the day (i.e. the previous Sunday). + lag: Integer. If, for example, ``lag=3``, fetch only data that was + published or updated exactly 3 days after the date. For example, a row + with ``time_value`` of June 3 will only be included in the results if its + data was issued or updated on June 6. If ``None``, the default, return the + most recently issued data regardless of its lag. + time_type: The temporal resolution to request this data. Most signals + are available at the "day" resolution (the default); some are only + available at the "week" resolution, representing an MMWR week ("epiweek"). + :returns: A Pandas data frame with matching data, or ``None`` if no data is + returned. Each row is one observation on one day in one geographic location. + Contains the following columns: + """ + if start_day > end_day: + raise ValueError( + "end_day must be on or after start_day, but " f"start_day = '{start_day}', end_day = '{end_day}'" + ) + + if time_type == "day": + time_values = Epidata.range(start_day.strftime("%Y%m%d"), end_day.strftime("%Y%m%d")) + else: + time_values = Epidata.range(start_day.strftime("%Y%W"), end_day.strftime("%Y%W")) + response = Epidata.covidcast( + data_source, + signal, + time_type=time_type, + geo_type=geo_type, + time_values=time_values, + geo_value=geo_values, + as_of=as_of, + lag=lag, + ) + + if response["result"] != 1: + print(f"check {data_source} {signal}") + # Something failed in the API and we did not get real metadata + # raise RuntimeError("Error when fetching signal data from the API", response["message"]) + + api_df = pd.DataFrame.from_dict(response["epidata"]) + if not api_df.empty: + api_df["issue"] = api_df.apply(lambda x: _parse_datetimes(x.issue, x.time_type), axis=1) + api_df["time_value"] = api_df.apply(lambda x: _parse_datetimes(x.time_value, x.time_type), axis=1) + api_df.drop("direction", axis=1, inplace=True) + api_df["data_source"] = data_source + api_df["signal"] = signal + + return api_df + +def check_metadata(): + + expected_df = covidcast.metadata() + df = ported_metadata() + assert_frame_equal(expected_df, df) + +def ported_signal( + data_source: str, + signal: str, # pylint: disable=W0621 + start_day: date = None, + end_day: date = None, + geo_type: str = "county", + geo_values: Union[str, Iterable[str]] = "*", + as_of: date = None, + lag: int = None, + time_type: str = "day", +) -> Union[pd.DataFrame, None]: + """ + Makes covidcast signal api call. + + data_source: String identifying the data source to query, such as + ``"fb-survey"``. + signal: String identifying the signal from that source to query, + such as ``"smoothed_cli"``. + start_day: Query data beginning on this date. Provided as a + ``datetime.date`` object. If ``start_day`` is ``None``, defaults to the + first day data is available for this signal. If ``time_type == "week"``, then + this is rounded to the epiweek containing the day (i.e. the previous Sunday). + end_day: Query data up to this date, inclusive. Provided as a + ``datetime.date`` object. If ``end_day`` is ``None``, defaults to the most + recent day data is available for this signal. If ``time_type == "week"``, then + this is rounded to the epiweek containing the day (i.e. the previous Sunday). + geo_type: The geography type for which to request this data, such as + ``"county"`` or ``"state"``. Available types are described in the + COVIDcast signal documentation. Defaults to ``"county"``. + geo_values: The geographies to fetch data for. The default, ``"*"``, + fetches all geographies. To fetch one geography, specify its ID as a + string; multiple geographies can be provided as an iterable (list, tuple, + ...) of strings. + as_of: Fetch only data that was available on or before this date, + provided as a ``datetime.date`` object. If ``None``, the default, return + the most recent available data. If ``time_type == "week"``, then + this is rounded to the epiweek containing the day (i.e. the previous Sunday). + lag: Integer. If, for example, ``lag=3``, fetch only data that was + published or updated exactly 3 days after the date. For example, a row + with ``time_value`` of June 3 will only be included in the results if its + data was issued or updated on June 6. If ``None``, the default, return the + most recently issued data regardless of its lag. + time_type: The temporal resolution to request this data. Most signals + are available at the "day" resolution (the default); some are only + available at the "week" resolution, representing an MMWR week ("epiweek"). + :returns: A Pandas data frame with matching data, or ``None`` if no data is + returned. Each row is one observation on one day in one geographic location. + Contains the following columns: + """ + if start_day > end_day: + raise ValueError( + "end_day must be on or after start_day, but " f"start_day = '{start_day}', end_day = '{end_day}'" + ) + + if time_type == "day": + time_values = Epidata.range(start_day.strftime("%Y%m%d"), end_day.strftime("%Y%m%d")) + else: + time_values = Epidata.range(start_day.strftime("%Y%W"), end_day.strftime("%Y%W")) + response = Epidata.covidcast( + data_source, + signal, + time_type=time_type, + geo_type=geo_type, + time_values=time_values, + geo_value=geo_values, + as_of=as_of, + lag=lag, + ) + + if response["result"] != 1: + print(f"check {data_source} {signal}") + # Something failed in the API and we did not get real metadata + # raise RuntimeError("Error when fetching signal data from the API", response["message"]) + + api_df = pd.DataFrame.from_dict(response["epidata"]) + if not api_df.empty: + api_df["issue"] = api_df.apply(lambda x: _parse_datetimes(x.issue, x.time_type), axis=1) + api_df["time_value"] = api_df.apply(lambda x: _parse_datetimes(x.time_value, x.time_type), axis=1) + api_df.drop("direction", axis=1, inplace=True) + api_df["data_source"] = data_source + api_df["signal"] = signal + + return api_df + + +def generate_start_date_per_signal() -> Dict[Tuple[datetime, datetime, str], List[Tuple[str]]]: + """ + Generate a dictionary of date range associated with individual signals + + + :return: Dictionary of date ranges to list of data source, signal tuple + + Dict[Tuple[datetime.datetime, datetime.datetime, str],[List[Tuple[str, str]]] + """ + meta_df = pd.DataFrame.from_dict(Epidata.covidcast_meta()["epidata"]) + meta_df["min_time"] = meta_df["min_time"].astype('str') + signal_timeframe_dict = defaultdict(list) + + for start_str, data in meta_df.groupby("min_time"): + + data_source_groups = data.groupby("data_source") + for data_source, df in data_source_groups: + signals = list(df["signal"].unique()) + time_type = df["time_type"].values[0] + for signal in signals: + if time_type == "day": + start_time = datetime.strptime(start_str, "%Y%m%d") + # explicit start date for google symptom does not match what's in the metadata + if data_source == "google-symptoms": + start_time = datetime(year=2020, month=2, day=20) + end_time = start_time + timedelta(days=30) + date_range = (start_time, end_time, time_type) + signal_timeframe_dict[date_range].append((data_source, signal)) + + elif time_type == "week": + start_time = Week(year=int(start_str[:4]), week=int(start_str[-2:])) + end_time = (start_time + 2).startdate() + date_range = (start_time.startdate(), + end_time, time_type) + signal_timeframe_dict[date_range].append((data_source, signal)) + + return signal_timeframe_dict + + +def check_signal(): + """ + Compares the result from covidcast api with Epidata.covidcast + + :return: + """ + signal_timeframe_dict = generate_start_date_per_signal() + signal_df_dict = dict() + for date_range, data_source_signal_list in signal_timeframe_dict.items(): + for data_source, signal in data_source_signal_list: + time_type = date_range[2] + expected_df = covidcast.signal(data_source, signal, start_day=date_range[0], end_day=date_range[1], + geo_type="state", time_type=time_type) + if expected_df is None: + raise RuntimeError("Data should exists") + + else: + signal_df_dict[(data_source, signal, time_type)] = expected_df + + time.sleep(500)# TODO find a elegant way of seperating the logs for the calls from covidcast vs epidata + print("-" * 90) + for date_range, data_source_signal_list in signal_timeframe_dict.items(): + for data_source, signal in data_source_signal_list: + expected_df = signal_df_dict.get((data_source, signal, date_range[2])) + + df = ported_signal(data_source, signal, start_day=date_range[0], end_day=date_range[1], + time_type=date_range[2], + geo_type="state") + if not expected_df.empty: + check = df.merge(expected_df, indicator=True) + assert (check["_merge"] == "both").all() + else: + assert df.empty + + +if __name__ == "__main__": + # check_metadata() + check_signal() \ No newline at end of file diff --git a/testing_utils/delphi_utils/requirements.txt b/testing_utils/delphi_utils/requirements.txt new file mode 100644 index 000000000..ba610eb52 --- /dev/null +++ b/testing_utils/delphi_utils/requirements.txt @@ -0,0 +1,12 @@ +boto3 +covidcast +delphi-epidata +scs<3.2.6 # TODO: remove this ; it is a cvxpy dependency and the excluded version appears to break our jenkins build. see: https://github.com/cvxgrp/scs/issues/283 +epiweeks +importlib_resources>=1.3 +moto~=4.2.14 +numpy +pandas>=1.1.0 +pylint==2.8.3 +structlog +xlrd \ No newline at end of file From 23384e714fb2e1fdcfcd832be20ba5a28721d298 Mon Sep 17 00:00:00 2001 From: Amaris Sim Date: Thu, 8 Aug 2024 22:49:00 -0400 Subject: [PATCH 15/24] extended date range and throws error when comes empty --- testing_utils/check_covidcast_port.py | 169 ------------------ .../delphi_utils/check_covidcast_port.py | 43 +++-- 2 files changed, 24 insertions(+), 188 deletions(-) delete mode 100644 testing_utils/check_covidcast_port.py diff --git a/testing_utils/check_covidcast_port.py b/testing_utils/check_covidcast_port.py deleted file mode 100644 index dbc1140cd..000000000 --- a/testing_utils/check_covidcast_port.py +++ /dev/null @@ -1,169 +0,0 @@ -""" -script to check converting covidcast api calls with Epidata.covidcast Epidata.covidcast_meta -""" -from typing import Union, Iterable -from datetime import datetime, timedelta, date -import pandas as pd -import covidcast -from delphi_epidata import Epidata -from pandas.testing import assert_frame_equal -import os -from epiweeks import Week - -API_KEY = os.environ.get('DELPHI_API_KEY') -covidcast.use_api_key(API_KEY) - -Epidata.debug = True -Epidata.auth = ("epidata", API_KEY) - -def _parse_datetimes(date_int: int, time_type: str, date_format: str = "%Y%m%d") -> Union[pd.Timestamp, None]: - """Convert a date or epiweeks string into timestamp objects. - - Datetimes (length 8) are converted to their corresponding date, while epiweeks (length 6) - are converted to the date of the start of the week. Returns nan otherwise - - Epiweeks use the CDC format. - - date_int: Int representation of date. - time_type: The temporal resolution to request this data. Most signals - are available at the "day" resolution (the default); some are only - available at the "week" resolution, representing an MMWR week ("epiweek"). - date_format: String of the date format to parse. - :returns: Timestamp. - """ - date_str = str(date_int) - if time_type == "day": - return pd.to_datetime(date_str, format=date_format) - if time_type == "week": - epiwk = Week(int(date_str[:4]), int(date_str[-2:])) - return pd.to_datetime(epiwk.startdate()) - return None - - -def ported_metadata() -> Union[pd.DataFrame, None]: - """ - Make covidcast metadata api call. - - Returns - ------- - pd.DataFrame of covidcast metadata. - """ - response = Epidata.covidcast_meta() - - if response["result"] != 1: - # Something failed in the API and we did not get real metadata - raise RuntimeError("Error when fetching metadata from the API", response["message"]) - - df = pd.DataFrame.from_dict(response["epidata"]) - df["min_time"] = df.apply(lambda x: _parse_datetimes(x.min_time, x.time_type), axis=1) - df["max_time"] = df.apply(lambda x: _parse_datetimes(x.max_time, x.time_type), axis=1) - df["last_update"] = pd.to_datetime(df["last_update"], unit="s") - return df - - -def ported_signal( - data_source: str, - signal: str, # pylint: disable=W0621 - start_day: date = None, - end_day: date = None, - geo_type: str = "county", - geo_values: Union[str, Iterable[str]] = "*", - as_of: date = None, - lag: int = None, - time_type: str = "day", -) -> Union[pd.DataFrame, None]: - """ - Makes covidcast signal api call. - - data_source: String identifying the data source to query, such as - ``"fb-survey"``. - signal: String identifying the signal from that source to query, - such as ``"smoothed_cli"``. - start_day: Query data beginning on this date. Provided as a - ``datetime.date`` object. If ``start_day`` is ``None``, defaults to the - first day data is available for this signal. If ``time_type == "week"``, then - this is rounded to the epiweek containing the day (i.e. the previous Sunday). - end_day: Query data up to this date, inclusive. Provided as a - ``datetime.date`` object. If ``end_day`` is ``None``, defaults to the most - recent day data is available for this signal. If ``time_type == "week"``, then - this is rounded to the epiweek containing the day (i.e. the previous Sunday). - geo_type: The geography type for which to request this data, such as - ``"county"`` or ``"state"``. Available types are described in the - COVIDcast signal documentation. Defaults to ``"county"``. - geo_values: The geographies to fetch data for. The default, ``"*"``, - fetches all geographies. To fetch one geography, specify its ID as a - string; multiple geographies can be provided as an iterable (list, tuple, - ...) of strings. - as_of: Fetch only data that was available on or before this date, - provided as a ``datetime.date`` object. If ``None``, the default, return - the most recent available data. If ``time_type == "week"``, then - this is rounded to the epiweek containing the day (i.e. the previous Sunday). - lag: Integer. If, for example, ``lag=3``, fetch only data that was - published or updated exactly 3 days after the date. For example, a row - with ``time_value`` of June 3 will only be included in the results if its - data was issued or updated on June 6. If ``None``, the default, return the - most recently issued data regardless of its lag. - time_type: The temporal resolution to request this data. Most signals - are available at the "day" resolution (the default); some are only - available at the "week" resolution, representing an MMWR week ("epiweek"). - :returns: A Pandas data frame with matching data, or ``None`` if no data is - returned. Each row is one observation on one day in one geographic location. - Contains the following columns: - """ - if start_day > end_day: - raise ValueError( - "end_day must be on or after start_day, but " f"start_day = '{start_day}', end_day = '{end_day}'" - ) - - response = Epidata.covidcast( - data_source, - signal, - time_type=time_type, - geo_type=geo_type, - time_values=Epidata.range(start_day.strftime("%Y%m%d"), end_day.strftime("%Y%m%d")), - geo_value=geo_values, - as_of=as_of, - lag=lag, - ) - if response["result"] != 1: - # Something failed in the API and we did not get real metadata - raise RuntimeError("Error when fetching signal data from the API", response["message"]) - - api_df = pd.DataFrame.from_dict(response["epidata"]) - api_df["issue"] = pd.to_datetime(api_df["issue"], format="%Y%m%d") - api_df["time_value"] = pd.to_datetime(api_df["time_value"], format="%Y%m%d") - api_df.drop("direction", axis=1, inplace=True) - api_df["data_source"] = data_source - api_df["signal"] = signal - - return api_df - -def check_metadata(): - expected_df = covidcast.metadata() - df = ported_metadata().metadata() - assert_frame_equal(expected_df, df) - -def check_signal(): - meta_df = covidcast.metadata() - startdate = datetime(year=2022, month=2, day=1) - data_filter = (meta_df["max_time"] >= startdate) - signal_df = meta_df[data_filter].groupby("data_source")["signal"].agg(['unique']) - enddate = startdate + timedelta(days=3) - - for data_source, row in signal_df.iterrows(): - signals = list(row[0]) - for signal in signals: - expected_df = covidcast.signal(data_source, signal, start_day=startdate, end_day=enddate, geo_type="state") - if expected_df is None: - print("%s %s %s %s not existing", data_source, signal, startdate, enddate) - - df = ported_signal(data_source, signal, start_day=startdate, end_day=enddate, geo_type="state") - - check = df.merge(expected_df, indicator=True) - assert (check["_merge"] == "both").all() - assert check["_left_only"].empty - assert check["_right_only"].empty - -if __name__ == "__main__": - # check_metadata() - check_signal() diff --git a/testing_utils/delphi_utils/check_covidcast_port.py b/testing_utils/delphi_utils/check_covidcast_port.py index 1f7f50ace..0ef6979a5 100644 --- a/testing_utils/delphi_utils/check_covidcast_port.py +++ b/testing_utils/delphi_utils/check_covidcast_port.py @@ -138,9 +138,8 @@ def ported_signal( ) if response["result"] != 1: - print(f"check {data_source} {signal}") # Something failed in the API and we did not get real metadata - # raise RuntimeError("Error when fetching signal data from the API", response["message"]) + raise RuntimeError("Error when fetching signal data from the API", response["message"]) api_df = pd.DataFrame.from_dict(response["epidata"]) if not api_df.empty: @@ -293,30 +292,36 @@ def check_signal(): for date_range, data_source_signal_list in signal_timeframe_dict.items(): for data_source, signal in data_source_signal_list: time_type = date_range[2] - expected_df = covidcast.signal(data_source, signal, start_day=date_range[0], end_day=date_range[1], - geo_type="state", time_type=time_type) - if expected_df is None: - raise RuntimeError("Data should exists") + filename = f"{CURRENT_DIR}/covidcast_result/{data_source}_{signal}.parquet" + if not Path(filename).is_file(): + # every signal except google-symptom has geo type of state + geo_type = "state" + if data_source == "google-symptom": + geo_type = "county" - else: - signal_df_dict[(data_source, signal, time_type)] = expected_df + expected_df = covidcast.signal(data_source, signal, start_day=date_range[0], end_day=date_range[1], + geo_type=geo_type, time_type=time_type) + if expected_df is None: + raise RuntimeError("Data should exists") + + expected_df.to_parquet(filename) + signal_df_dict[(data_source, signal, time_type)] = filename - time.sleep(500)# TODO find a elegant way of seperating the logs for the calls from covidcast vs epidata - print("-" * 90) for date_range, data_source_signal_list in signal_timeframe_dict.items(): for data_source, signal in data_source_signal_list: - expected_df = signal_df_dict.get((data_source, signal, date_range[2])) + expected_filename = signal_df_dict.get((data_source, signal, date_range[2])) + expected_df = pd.read_parquet(expected_filename) + # every signal except google-symptom has geo type of state + geo_type = "state" + if data_source == "google-symptom": + geo_type = "county" df = ported_signal(data_source, signal, start_day=date_range[0], end_day=date_range[1], time_type=date_range[2], - geo_type="state") - if not expected_df.empty: - check = df.merge(expected_df, indicator=True) - assert (check["_merge"] == "both").all() - else: - assert df.empty - + geo_type=geo_type) + check = df.merge(expected_df, indicator=True) + assert (check["_merge"] == "both").all() if __name__ == "__main__": - # check_metadata() + check_metadata() check_signal() \ No newline at end of file From e5c3b46373cc9a7a57f418c68e83197f21dd7d96 Mon Sep 17 00:00:00 2001 From: Amaris Sim Date: Fri, 9 Aug 2024 12:11:23 -0400 Subject: [PATCH 16/24] delphi_utils/validator/datafetcher.py --- .../delphi_utils/validator/datafetcher.py | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index 484da7183..46130c86b 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -120,17 +120,21 @@ def get_geo_signal_combos(data_source, api_key): source_signal_mappings = {i['source']:i['db_source'] for i in meta_response.json()} - response = Epidata.covidcast_meta() + with warnings.catch_warnings(): + warnings.simplefilter("ignore") - if response["result"] != 1: - # Something failed in the API and we did not get real metadata - raise RuntimeError("Error when fetching metadata from the API", response["message"]) + response = Epidata.covidcast_meta() + + if response["result"] != 1: + # Something failed in the API and we did not get real metadata + raise RuntimeError("Error when fetching metadata from the API", response["message"]) - meta = pd.DataFrame.from_dict(response["epidata"]) - # note: this will fail for signals with weekly data, but currently not supported for validation - meta["min_time"] = meta.apply(lambda x: pd.to_datetime(str(x.min_time), format="%Y%m%d"), axis=1) - meta["max_time"] = meta.apply(lambda x: pd.to_datetime(str(x.max_time), format="%Y%m%d"), axis=1) - meta["last_update"] = pd.to_datetime(meta["last_update"], unit="s") + meta = pd.DataFrame.from_dict(response["epidata"]) + # note: this will fail for signals with weekly data, but currently not supported for validation + meta = meta[meta["time_type"] == "day"] + meta["min_time"] = meta.apply(lambda x: pd.to_datetime(str(x.min_time), format="%Y%m%d"), axis=1) + meta["max_time"] = meta.apply(lambda x: pd.to_datetime(str(x.max_time), format="%Y%m%d"), axis=1) + meta["last_update"] = pd.to_datetime(meta["last_update"], unit="s") source_meta = meta[meta['data_source'] == data_source] # Need to convert np.records to tuples so they are hashable and can be used in sets and dicts. @@ -184,7 +188,7 @@ def fetch_api_reference(data_source, start_date, end_date, geo_type, signal_type time_type="day", geo_type=geo_type, time_values=Epidata.range(start_date.strftime("%Y%m%d"), end_date.strftime("%Y%m%d")), - geo_value=geo_type, + geo_value="*" ) if response["result"] != 1: # Something failed in the API and we did not get real metadata @@ -193,6 +197,7 @@ def fetch_api_reference(data_source, start_date, end_date, geo_type, signal_type api_df = None if len(response["epidata"]) > 0: api_df = pd.DataFrame.from_dict(response["epidata"]) + # note: this will fail for signals with weekly data, but currently not supported for validation api_df["issue"] = pd.to_datetime(api_df["issue"], format="%Y%m%d") api_df["time_value"] = pd.to_datetime(api_df["time_value"], format="%Y%m%d") api_df.drop("direction", axis=1, inplace=True) From 33936a4fca1cff81d4cbbd3021c4308b9b13328b Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Fri, 9 Aug 2024 15:33:29 -0700 Subject: [PATCH 17/24] test+refactor: tweak covidcast port tests and rewrite the _parse_datetimes function to use Pandas idioms --- .../delphi_sir_complainsalot/check_source.py | 8 +- .../delphi_sir_complainsalot/date_utils.py | 39 +++--- testing_utils/delphi_utils/.gitignore | 1 + .../delphi_utils/check_covidcast_port.py | 121 ++++++++++-------- testing_utils/delphi_utils/requirements.txt | 11 +- 5 files changed, 89 insertions(+), 91 deletions(-) create mode 100644 testing_utils/delphi_utils/.gitignore diff --git a/sir_complainsalot/delphi_sir_complainsalot/check_source.py b/sir_complainsalot/delphi_sir_complainsalot/check_source.py index 378a014c0..cc9c47fdd 100644 --- a/sir_complainsalot/delphi_sir_complainsalot/check_source.py +++ b/sir_complainsalot/delphi_sir_complainsalot/check_source.py @@ -94,12 +94,12 @@ def check_source(data_source, meta, params, grace, logger): # pylint: disable=t if response["result"] == 1: latest_data = pd.DataFrame.from_dict(response["epidata"]) - latest_data["issue"] = latest_data.apply(lambda x: _parse_datetimes(x.issue, x.time_type), axis=1) - latest_data["time_value"] = latest_data.apply(lambda x: _parse_datetimes(x.time_value, x.time_type), axis=1) + time_type = latest_data["time_type"].value[0] + latest_data = _parse_datetimes(latest_data, "time_value", time_type) + latest_data = _parse_datetimes(latest_data, "issue", time_type) latest_data.drop("direction", axis=1, inplace=True) - unique_dates = [pd.to_datetime(val).date() - for val in latest_data["time_value"].unique()] + unique_dates = list(latest_data["time_value"].dt.date.unique()) current_lag_in_days = (datetime.now().date() - max(unique_dates)).days lag_calculated_from_api = True diff --git a/sir_complainsalot/delphi_sir_complainsalot/date_utils.py b/sir_complainsalot/delphi_sir_complainsalot/date_utils.py index 2e57d3a95..a8f179320 100644 --- a/sir_complainsalot/delphi_sir_complainsalot/date_utils.py +++ b/sir_complainsalot/delphi_sir_complainsalot/date_utils.py @@ -1,35 +1,28 @@ from datetime import datetime -from typing import Union from epiweeks import Week import pandas as pd -def _date_to_api_string(date: datetime.date, time_type: str = "day") -> str: # pylint: disable=W0621 + +def _date_to_api_string(d: datetime, time_type: str = "day") -> str: """Convert a date object to a YYYYMMDD or YYYYMM string expected by the API.""" if time_type == "day": - date_str = date.strftime("%Y%m%d") + return d.strftime("%Y%m%d") elif time_type == "week": - date_str = Week.fromdate(date).cdcformat() - return date_str - -def _parse_datetimes(date_int: str, time_type: str, date_format: str = "%Y%m%d") -> Union[pd.Timestamp, None]: - """Convert a date or epiweeks string into timestamp objects. - - Datetimes (length 8) are converted to their corresponding date, while epiweeks (length 6) - are converted to the date of the start of the week. Returns nan otherwise + return Week.fromdate(d).cdcformat() + raise ValueError(f"Unknown time_type: {time_type}") - Epiweeks use the CDC format. +def _parse_datetimes(df: pd.DataFrame, col: str, time_type: str, date_format: str = "%Y%m%d") -> pd.DataFrame: + """Convert a DataFrame date or epiweek column into datetimes. - date_int: Int representation of date. - time_type: The temporal resolution to request this data. Most signals - are available at the "day" resolution (the default); some are only - available at the "week" resolution, representing an MMWR week ("epiweek"). - date_format: String of the date format to parse. - :returns: Timestamp. + Assumes the column is string type. Dates are assumed to be in the YYYYMMDD + format by default. Weeks are assumed to be in the epiweek CDC format YYYYWW + format and return the date of the first day of the week. """ - date_str = str(date_int) if time_type == "day": - return pd.to_datetime(date_str, format=date_format) + df[col] = pd.to_datetime(df[col], format=date_format) + return df if time_type == "week": - epiwk = Week(int(date_str[:4]), int(date_str[-2:])) - return pd.to_datetime(epiwk.startdate()) - return None \ No newline at end of file + df[col] = df[col].apply(lambda x: Week(int(x[:4]), int(x[-2:])).startdate()) + df[col] = pd.to_datetime(df[col]) + return df + raise ValueError(f"Unknown time_type: {time_type}") diff --git a/testing_utils/delphi_utils/.gitignore b/testing_utils/delphi_utils/.gitignore new file mode 100644 index 000000000..c5495365c --- /dev/null +++ b/testing_utils/delphi_utils/.gitignore @@ -0,0 +1 @@ +covidcast_result \ No newline at end of file diff --git a/testing_utils/delphi_utils/check_covidcast_port.py b/testing_utils/delphi_utils/check_covidcast_port.py index 0ef6979a5..114402887 100644 --- a/testing_utils/delphi_utils/check_covidcast_port.py +++ b/testing_utils/delphi_utils/check_covidcast_port.py @@ -1,50 +1,44 @@ """ script to check converting covidcast api calls with Epidata.covidcast Epidata.covidcast_meta """ -import time + from collections import defaultdict from pathlib import Path from typing import Union, Iterable, Tuple, List, Dict from datetime import datetime, timedelta, date -import numpy as np import pandas as pd import covidcast +import tqdm from delphi_epidata import Epidata from pandas.testing import assert_frame_equal import os from epiweeks import Week -API_KEY = os.environ.get('DELPHI_API_KEY') +API_KEY = os.environ.get("DELPHI_API_KEY", os.environ.get("DELPHI_EPIDATA_KEY")) covidcast.use_api_key(API_KEY) - -Epidata.debug = True Epidata.auth = ("epidata", API_KEY) - CURRENT_DIR = Path(__file__).parent +if not Path(f"{CURRENT_DIR}/covidcast_result").is_dir(): + os.mkdir(f"{CURRENT_DIR}/covidcast_result") -def _parse_datetimes(date_int: int, time_type: str, date_format: str = "%Y%m%d") -> Union[pd.Timestamp, None]: - """Convert a date or epiweeks string into timestamp objects. - Datetimes (length 8) are converted to their corresponding date, while epiweeks (length 6) - are converted to the date of the start of the week. Returns nan otherwise +def _parse_datetimes(df: pd.DataFrame, col: str, time_type: str, date_format: str = "%Y%m%d") -> pd.DataFrame: + """Convert a DataFrame date or epiweek column into datetimes. - Epiweeks use the CDC format. - - date_int: Int representation of date. - time_type: The temporal resolution to request this data. Most signals - are available at the "day" resolution (the default); some are only - available at the "week" resolution, representing an MMWR week ("epiweek"). - date_format: String of the date format to parse. - :returns: Timestamp. + Assumes the column is string type. Dates are assumed to be in the YYYYMMDD + format by default. Weeks are assumed to be in the epiweek CDC format YYYYWW + format and return the date of the first day of the week. """ - date_str = str(date_int) if time_type == "day": - return pd.to_datetime(date_str, format=date_format) + df[col] = pd.to_datetime(df[col], format=date_format) + return df if time_type == "week": - epiwk = Week(int(date_str[:4]), int(date_str[-2:])) - return pd.to_datetime(epiwk.startdate()) - return None + df[col] = df[col].apply(lambda x: Week(int(x[:4]), int(x[-2:])).startdate()) + df[col] = pd.to_datetime(df[col]) + return df + raise ValueError(f"Unknown time_type: {time_type}") + def ported_metadata() -> Union[pd.DataFrame, None]: @@ -62,8 +56,9 @@ def ported_metadata() -> Union[pd.DataFrame, None]: raise RuntimeError("Error when fetching metadata from the API", response["message"]) df = pd.DataFrame.from_dict(response["epidata"]) - df["min_time"] = df.apply(lambda x: _parse_datetimes(x.min_time, x.time_type), axis=1) - df["max_time"] = df.apply(lambda x: _parse_datetimes(x.max_time, x.time_type), axis=1) + time_type = df["time_type"].values[0] + df = _parse_datetimes(df, "time_value", time_type) + df = _parse_datetimes(df, "issue", time_type) df["last_update"] = pd.to_datetime(df["last_update"], unit="s") return df @@ -143,30 +138,32 @@ def ported_signal( api_df = pd.DataFrame.from_dict(response["epidata"]) if not api_df.empty: - api_df["issue"] = api_df.apply(lambda x: _parse_datetimes(x.issue, x.time_type), axis=1) - api_df["time_value"] = api_df.apply(lambda x: _parse_datetimes(x.time_value, x.time_type), axis=1) + time_type = api_df["time_type"].values[0] + api_df = _parse_datetimes(api_df, "time_value", time_type) + api_df = _parse_datetimes(api_df, "issue", time_type) api_df.drop("direction", axis=1, inplace=True) api_df["data_source"] = data_source api_df["signal"] = signal return api_df -def check_metadata(): +def check_metadata(): expected_df = covidcast.metadata() df = ported_metadata() assert_frame_equal(expected_df, df) + def ported_signal( - data_source: str, - signal: str, # pylint: disable=W0621 - start_day: date = None, - end_day: date = None, - geo_type: str = "county", - geo_values: Union[str, Iterable[str]] = "*", - as_of: date = None, - lag: int = None, - time_type: str = "day", + data_source: str, + signal: str, # pylint: disable=W0621 + start_day: date = None, + end_day: date = None, + geo_type: str = "county", + geo_values: Union[str, Iterable[str]] = "*", + as_of: date = None, + lag: int = None, + time_type: str = "day", ) -> Union[pd.DataFrame, None]: """ Makes covidcast signal api call. @@ -233,8 +230,9 @@ def ported_signal( api_df = pd.DataFrame.from_dict(response["epidata"]) if not api_df.empty: - api_df["issue"] = api_df.apply(lambda x: _parse_datetimes(x.issue, x.time_type), axis=1) - api_df["time_value"] = api_df.apply(lambda x: _parse_datetimes(x.time_value, x.time_type), axis=1) + time_type = api_df["time_type"].values[0] + api_df = _parse_datetimes(api_df, "time_value", time_type) + api_df = _parse_datetimes(api_df, "issue", time_type) api_df.drop("direction", axis=1, inplace=True) api_df["data_source"] = data_source api_df["signal"] = signal @@ -252,11 +250,11 @@ def generate_start_date_per_signal() -> Dict[Tuple[datetime, datetime, str], Lis Dict[Tuple[datetime.datetime, datetime.datetime, str],[List[Tuple[str, str]]] """ meta_df = pd.DataFrame.from_dict(Epidata.covidcast_meta()["epidata"]) - meta_df["min_time"] = meta_df["min_time"].astype('str') + meta_df["min_time"] = meta_df["min_time"].astype("str") + meta_df = meta_df.groupby("data_source").first() signal_timeframe_dict = defaultdict(list) for start_str, data in meta_df.groupby("min_time"): - data_source_groups = data.groupby("data_source") for data_source, df in data_source_groups: signals = list(df["signal"].unique()) @@ -274,8 +272,7 @@ def generate_start_date_per_signal() -> Dict[Tuple[datetime, datetime, str], Lis elif time_type == "week": start_time = Week(year=int(start_str[:4]), week=int(start_str[-2:])) end_time = (start_time + 2).startdate() - date_range = (start_time.startdate(), - end_time, time_type) + date_range = (start_time.startdate(), end_time, time_type) signal_timeframe_dict[date_range].append((data_source, signal)) return signal_timeframe_dict @@ -289,39 +286,51 @@ def check_signal(): """ signal_timeframe_dict = generate_start_date_per_signal() signal_df_dict = dict() - for date_range, data_source_signal_list in signal_timeframe_dict.items(): + for date_range, data_source_signal_list in tqdm.tqdm(signal_timeframe_dict.items()): for data_source, signal in data_source_signal_list: time_type = date_range[2] filename = f"{CURRENT_DIR}/covidcast_result/{data_source}_{signal}.parquet" if not Path(filename).is_file(): # every signal except google-symptom has geo type of state geo_type = "state" - if data_source == "google-symptom": + if data_source == "google-symptoms": geo_type = "county" - - expected_df = covidcast.signal(data_source, signal, start_day=date_range[0], end_day=date_range[1], - geo_type=geo_type, time_type=time_type) - if expected_df is None: - raise RuntimeError("Data should exists") + expected_df = covidcast.signal( + data_source, + signal, + start_day=date_range[0], + end_day=date_range[1], + geo_type=geo_type, + time_type=time_type, + ) + assert not expected_df.empty, "Received no data from covidcast API." expected_df.to_parquet(filename) signal_df_dict[(data_source, signal, time_type)] = filename - for date_range, data_source_signal_list in signal_timeframe_dict.items(): + for date_range, data_source_signal_list in tqdm.tqdm(signal_timeframe_dict.items()): for data_source, signal in data_source_signal_list: expected_filename = signal_df_dict.get((data_source, signal, date_range[2])) expected_df = pd.read_parquet(expected_filename) # every signal except google-symptom has geo type of state geo_type = "state" - if data_source == "google-symptom": + if data_source == "google-symptoms": geo_type = "county" - df = ported_signal(data_source, signal, start_day=date_range[0], end_day=date_range[1], - time_type=date_range[2], - geo_type=geo_type) + df = ported_signal( + data_source, + signal, + start_day=date_range[0], + end_day=date_range[1], + time_type=date_range[2], + geo_type=geo_type, + ) + assert not df.empty, "Received no data from covidcast API." + check = df.merge(expected_df, indicator=True) assert (check["_merge"] == "both").all() + if __name__ == "__main__": check_metadata() - check_signal() \ No newline at end of file + check_signal() diff --git a/testing_utils/delphi_utils/requirements.txt b/testing_utils/delphi_utils/requirements.txt index ba610eb52..c27ee99cc 100644 --- a/testing_utils/delphi_utils/requirements.txt +++ b/testing_utils/delphi_utils/requirements.txt @@ -1,12 +1,7 @@ -boto3 covidcast delphi-epidata -scs<3.2.6 # TODO: remove this ; it is a cvxpy dependency and the excluded version appears to break our jenkins build. see: https://github.com/cvxgrp/scs/issues/283 epiweeks -importlib_resources>=1.3 -moto~=4.2.14 numpy -pandas>=1.1.0 -pylint==2.8.3 -structlog -xlrd \ No newline at end of file +pandas==1.5.3 +pyarrow +tqdm \ No newline at end of file From 01a7f669156ac112fd79135e5f1994fcf7ef941e Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Fri, 9 Aug 2024 15:39:04 -0700 Subject: [PATCH 18/24] fix: don't parse datetimes on unused columns --- _delphi_utils_python/delphi_utils/validator/datafetcher.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index 46130c86b..d896aa0b3 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -132,9 +132,6 @@ def get_geo_signal_combos(data_source, api_key): meta = pd.DataFrame.from_dict(response["epidata"]) # note: this will fail for signals with weekly data, but currently not supported for validation meta = meta[meta["time_type"] == "day"] - meta["min_time"] = meta.apply(lambda x: pd.to_datetime(str(x.min_time), format="%Y%m%d"), axis=1) - meta["max_time"] = meta.apply(lambda x: pd.to_datetime(str(x.max_time), format="%Y%m%d"), axis=1) - meta["last_update"] = pd.to_datetime(meta["last_update"], unit="s") source_meta = meta[meta['data_source'] == data_source] # Need to convert np.records to tuples so they are hashable and can be used in sets and dicts. From 6eeef4ebca3d3626990b402e1dc66c1be576170b Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Fri, 9 Aug 2024 15:43:42 -0700 Subject: [PATCH 19/24] lint: remove unused types --- _delphi_utils_python/delphi_utils/validator/datafetcher.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index d896aa0b3..76459982f 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -6,13 +6,11 @@ import warnings from os import listdir from os.path import isfile, join -from typing import Union import numpy as np import pandas as pd import requests from delphi_epidata import Epidata -from epiweeks import Week from .errors import APIDataFetchError, ValidationFailure From 1f59e068e1a34c72df8cb36ddc2c690070c71bc0 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Fri, 9 Aug 2024 16:52:33 -0700 Subject: [PATCH 20/24] fix: dont import covidcast in sir_complainsalot --- sir_complainsalot/delphi_sir_complainsalot/check_source.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sir_complainsalot/delphi_sir_complainsalot/check_source.py b/sir_complainsalot/delphi_sir_complainsalot/check_source.py index cc9c47fdd..63277cbfb 100644 --- a/sir_complainsalot/delphi_sir_complainsalot/check_source.py +++ b/sir_complainsalot/delphi_sir_complainsalot/check_source.py @@ -4,7 +4,6 @@ from datetime import datetime, timedelta from typing import List -import covidcast import pandas as pd from delphi_epidata import Epidata From 7f60275b030de4ac7a2a9504502badd32be2b781 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Fri, 9 Aug 2024 16:53:22 -0700 Subject: [PATCH 21/24] fix: remove covidcast from indicator setup.py dependencies --- _delphi_utils_python/setup.py | 1 - _template_python/setup.py | 1 - changehc/setup.py | 1 - claims_hosp/setup.py | 1 - hhs_hosp/setup.py | 1 - quidel_covidtest/setup.py | 1 - sir_complainsalot/setup.py | 1 - 7 files changed, 7 deletions(-) diff --git a/_delphi_utils_python/setup.py b/_delphi_utils_python/setup.py index 0bb38ad8a..18b3ac49c 100644 --- a/_delphi_utils_python/setup.py +++ b/_delphi_utils_python/setup.py @@ -6,7 +6,6 @@ required = [ "boto3", - "covidcast", "delphi-epidata", "cvxpy", "scs<3.2.6", # TODO: remove this ; it is a cvxpy dependency, and the excluded version appears to break our jenkins build. see: https://github.com/cvxgrp/scs/issues/283 diff --git a/_template_python/setup.py b/_template_python/setup.py index d7bc44078..a83d9a4ff 100644 --- a/_template_python/setup.py +++ b/_template_python/setup.py @@ -2,7 +2,6 @@ from setuptools import find_packages required = [ - "covidcast", "darker[isort]~=2.1.1", "delphi-utils", "numpy", diff --git a/changehc/setup.py b/changehc/setup.py index d95beb771..41fff16c1 100644 --- a/changehc/setup.py +++ b/changehc/setup.py @@ -3,7 +3,6 @@ required = [ "boto3", - "covidcast", "darker[isort]~=2.1.1", "delphi-utils", "moto~=4.2.14", diff --git a/claims_hosp/setup.py b/claims_hosp/setup.py index 3b859c294..1fe63f2f0 100644 --- a/claims_hosp/setup.py +++ b/claims_hosp/setup.py @@ -2,7 +2,6 @@ from setuptools import find_packages required = [ - "covidcast", "darker[isort]~=2.1.1", "delphi-utils", "numpy", diff --git a/hhs_hosp/setup.py b/hhs_hosp/setup.py index 90a685ac8..46cf9d844 100644 --- a/hhs_hosp/setup.py +++ b/hhs_hosp/setup.py @@ -2,7 +2,6 @@ from setuptools import find_packages required = [ - "covidcast", "darker[isort]~=2.1.1", "delphi-epidata", "delphi-utils", diff --git a/quidel_covidtest/setup.py b/quidel_covidtest/setup.py index c2791930f..8e141e208 100644 --- a/quidel_covidtest/setup.py +++ b/quidel_covidtest/setup.py @@ -2,7 +2,6 @@ from setuptools import find_packages required = [ - "covidcast", "darker[isort]~=2.1.1", "delphi-utils", "imap-tools", diff --git a/sir_complainsalot/setup.py b/sir_complainsalot/setup.py index 157c001b2..9392ef07b 100644 --- a/sir_complainsalot/setup.py +++ b/sir_complainsalot/setup.py @@ -2,7 +2,6 @@ from setuptools import find_packages required = [ - "covidcast", "darker[isort]~=2.1.1", "delphi-utils", "pandas", From 55150bc3fc889589b8f54ec11d883dd013f29091 Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Fri, 9 Aug 2024 17:17:39 -0700 Subject: [PATCH 22/24] fix: remove duplicate ported_signal --- .../delphi_utils/check_covidcast_port.py | 86 ------------------- 1 file changed, 86 deletions(-) diff --git a/testing_utils/delphi_utils/check_covidcast_port.py b/testing_utils/delphi_utils/check_covidcast_port.py index 114402887..f5611ae73 100644 --- a/testing_utils/delphi_utils/check_covidcast_port.py +++ b/testing_utils/delphi_utils/check_covidcast_port.py @@ -154,92 +154,6 @@ def check_metadata(): assert_frame_equal(expected_df, df) -def ported_signal( - data_source: str, - signal: str, # pylint: disable=W0621 - start_day: date = None, - end_day: date = None, - geo_type: str = "county", - geo_values: Union[str, Iterable[str]] = "*", - as_of: date = None, - lag: int = None, - time_type: str = "day", -) -> Union[pd.DataFrame, None]: - """ - Makes covidcast signal api call. - - data_source: String identifying the data source to query, such as - ``"fb-survey"``. - signal: String identifying the signal from that source to query, - such as ``"smoothed_cli"``. - start_day: Query data beginning on this date. Provided as a - ``datetime.date`` object. If ``start_day`` is ``None``, defaults to the - first day data is available for this signal. If ``time_type == "week"``, then - this is rounded to the epiweek containing the day (i.e. the previous Sunday). - end_day: Query data up to this date, inclusive. Provided as a - ``datetime.date`` object. If ``end_day`` is ``None``, defaults to the most - recent day data is available for this signal. If ``time_type == "week"``, then - this is rounded to the epiweek containing the day (i.e. the previous Sunday). - geo_type: The geography type for which to request this data, such as - ``"county"`` or ``"state"``. Available types are described in the - COVIDcast signal documentation. Defaults to ``"county"``. - geo_values: The geographies to fetch data for. The default, ``"*"``, - fetches all geographies. To fetch one geography, specify its ID as a - string; multiple geographies can be provided as an iterable (list, tuple, - ...) of strings. - as_of: Fetch only data that was available on or before this date, - provided as a ``datetime.date`` object. If ``None``, the default, return - the most recent available data. If ``time_type == "week"``, then - this is rounded to the epiweek containing the day (i.e. the previous Sunday). - lag: Integer. If, for example, ``lag=3``, fetch only data that was - published or updated exactly 3 days after the date. For example, a row - with ``time_value`` of June 3 will only be included in the results if its - data was issued or updated on June 6. If ``None``, the default, return the - most recently issued data regardless of its lag. - time_type: The temporal resolution to request this data. Most signals - are available at the "day" resolution (the default); some are only - available at the "week" resolution, representing an MMWR week ("epiweek"). - :returns: A Pandas data frame with matching data, or ``None`` if no data is - returned. Each row is one observation on one day in one geographic location. - Contains the following columns: - """ - if start_day > end_day: - raise ValueError( - "end_day must be on or after start_day, but " f"start_day = '{start_day}', end_day = '{end_day}'" - ) - - if time_type == "day": - time_values = Epidata.range(start_day.strftime("%Y%m%d"), end_day.strftime("%Y%m%d")) - else: - time_values = Epidata.range(start_day.strftime("%Y%W"), end_day.strftime("%Y%W")) - response = Epidata.covidcast( - data_source, - signal, - time_type=time_type, - geo_type=geo_type, - time_values=time_values, - geo_value=geo_values, - as_of=as_of, - lag=lag, - ) - - if response["result"] != 1: - print(f"check {data_source} {signal}") - # Something failed in the API and we did not get real metadata - # raise RuntimeError("Error when fetching signal data from the API", response["message"]) - - api_df = pd.DataFrame.from_dict(response["epidata"]) - if not api_df.empty: - time_type = api_df["time_type"].values[0] - api_df = _parse_datetimes(api_df, "time_value", time_type) - api_df = _parse_datetimes(api_df, "issue", time_type) - api_df.drop("direction", axis=1, inplace=True) - api_df["data_source"] = data_source - api_df["signal"] = signal - - return api_df - - def generate_start_date_per_signal() -> Dict[Tuple[datetime, datetime, str], List[Tuple[str]]]: """ Generate a dictionary of date range associated with individual signals From 329d3407e976bfef5208d468c482122b12afe41b Mon Sep 17 00:00:00 2001 From: Dmitry Shemetov Date: Mon, 12 Aug 2024 11:30:53 -0700 Subject: [PATCH 23/24] fix: revert _parse_datetimes --- .../delphi_sir_complainsalot/check_source.py | 5 ++-- .../delphi_sir_complainsalot/date_utils.py | 18 ++++++------ .../delphi_sir_complainsalot/run.py | 2 +- .../delphi_utils/check_covidcast_port.py | 28 +++++++++---------- 4 files changed, 25 insertions(+), 28 deletions(-) diff --git a/sir_complainsalot/delphi_sir_complainsalot/check_source.py b/sir_complainsalot/delphi_sir_complainsalot/check_source.py index 63277cbfb..9d9c7ca37 100644 --- a/sir_complainsalot/delphi_sir_complainsalot/check_source.py +++ b/sir_complainsalot/delphi_sir_complainsalot/check_source.py @@ -93,9 +93,8 @@ def check_source(data_source, meta, params, grace, logger): # pylint: disable=t if response["result"] == 1: latest_data = pd.DataFrame.from_dict(response["epidata"]) - time_type = latest_data["time_type"].value[0] - latest_data = _parse_datetimes(latest_data, "time_value", time_type) - latest_data = _parse_datetimes(latest_data, "issue", time_type) + latest_data["time_value"] = _parse_datetimes(latest_data, "time_value") + latest_data["issue"] = _parse_datetimes(latest_data, "issue") latest_data.drop("direction", axis=1, inplace=True) unique_dates = list(latest_data["time_value"].dt.date.unique()) diff --git a/sir_complainsalot/delphi_sir_complainsalot/date_utils.py b/sir_complainsalot/delphi_sir_complainsalot/date_utils.py index a8f179320..7df0b89bc 100644 --- a/sir_complainsalot/delphi_sir_complainsalot/date_utils.py +++ b/sir_complainsalot/delphi_sir_complainsalot/date_utils.py @@ -11,18 +11,18 @@ def _date_to_api_string(d: datetime, time_type: str = "day") -> str: return Week.fromdate(d).cdcformat() raise ValueError(f"Unknown time_type: {time_type}") -def _parse_datetimes(df: pd.DataFrame, col: str, time_type: str, date_format: str = "%Y%m%d") -> pd.DataFrame: +def _parse_datetimes(df: pd.DataFrame, col: str, date_format: str = "%Y%m%d") -> pd.Series: """Convert a DataFrame date or epiweek column into datetimes. Assumes the column is string type. Dates are assumed to be in the YYYYMMDD format by default. Weeks are assumed to be in the epiweek CDC format YYYYWW format and return the date of the first day of the week. """ - if time_type == "day": - df[col] = pd.to_datetime(df[col], format=date_format) - return df - if time_type == "week": - df[col] = df[col].apply(lambda x: Week(int(x[:4]), int(x[-2:])).startdate()) - df[col] = pd.to_datetime(df[col]) - return df - raise ValueError(f"Unknown time_type: {time_type}") + df[col] = df[col].astype("str") + def parse_row(row): + if row["time_type"] == "day": + return pd.to_datetime(row[col], format=date_format) + if row["time_type"] == "week": + return pd.to_datetime(Week(int(row[col][:4]), int(row[col][-2:])).startdate()) + return row[col] + return df.apply(parse_row, axis=1) \ No newline at end of file diff --git a/sir_complainsalot/delphi_sir_complainsalot/run.py b/sir_complainsalot/delphi_sir_complainsalot/run.py index b2824e0eb..fb56a2b83 100644 --- a/sir_complainsalot/delphi_sir_complainsalot/run.py +++ b/sir_complainsalot/delphi_sir_complainsalot/run.py @@ -31,7 +31,7 @@ def run_module(): params = read_params() Epidata.auth = ("epidata", params["api_credentials"]) meta = pd.DataFrame.from_dict(Epidata.covidcast_meta().get("epidata", dict())) - meta["max_time"] = meta.apply(lambda x: _parse_datetimes(x.max_time, x.time_type), axis=1) + meta["max_time"] = _parse_datetimes(meta, "max_time") slack_notifier = None if "channel" in params and "slack_token" in params: slack_notifier = SlackNotifier(params["channel"], params["slack_token"]) diff --git a/testing_utils/delphi_utils/check_covidcast_port.py b/testing_utils/delphi_utils/check_covidcast_port.py index f5611ae73..12573f12f 100644 --- a/testing_utils/delphi_utils/check_covidcast_port.py +++ b/testing_utils/delphi_utils/check_covidcast_port.py @@ -23,22 +23,21 @@ os.mkdir(f"{CURRENT_DIR}/covidcast_result") -def _parse_datetimes(df: pd.DataFrame, col: str, time_type: str, date_format: str = "%Y%m%d") -> pd.DataFrame: +def _parse_datetimes(df: pd.DataFrame, col: str, date_format: str = "%Y%m%d") -> pd.Series: """Convert a DataFrame date or epiweek column into datetimes. Assumes the column is string type. Dates are assumed to be in the YYYYMMDD format by default. Weeks are assumed to be in the epiweek CDC format YYYYWW format and return the date of the first day of the week. """ - if time_type == "day": - df[col] = pd.to_datetime(df[col], format=date_format) - return df - if time_type == "week": - df[col] = df[col].apply(lambda x: Week(int(x[:4]), int(x[-2:])).startdate()) - df[col] = pd.to_datetime(df[col]) - return df - raise ValueError(f"Unknown time_type: {time_type}") - + df[col] = df[col].astype("str") + def parse_row(row): + if row["time_type"] == "day": + return pd.to_datetime(row[col], format=date_format) + if row["time_type"] == "week": + return pd.to_datetime(Week(int(row[col][:4]), int(row[col][-2:])).startdate()) + return row[col] + return df.apply(parse_row, axis=1) def ported_metadata() -> Union[pd.DataFrame, None]: @@ -56,9 +55,8 @@ def ported_metadata() -> Union[pd.DataFrame, None]: raise RuntimeError("Error when fetching metadata from the API", response["message"]) df = pd.DataFrame.from_dict(response["epidata"]) - time_type = df["time_type"].values[0] - df = _parse_datetimes(df, "time_value", time_type) - df = _parse_datetimes(df, "issue", time_type) + df["min_time"] = _parse_datetimes(df, "min_time") + df["max_time"] = _parse_datetimes(df, "max_time") df["last_update"] = pd.to_datetime(df["last_update"], unit="s") return df @@ -139,8 +137,8 @@ def ported_signal( api_df = pd.DataFrame.from_dict(response["epidata"]) if not api_df.empty: time_type = api_df["time_type"].values[0] - api_df = _parse_datetimes(api_df, "time_value", time_type) - api_df = _parse_datetimes(api_df, "issue", time_type) + api_df["time_value"] = _parse_datetimes(api_df, "time_value") + api_df["issue"] = _parse_datetimes(api_df, "issue") api_df.drop("direction", axis=1, inplace=True) api_df["data_source"] = data_source api_df["signal"] = signal From 9d91be7eae92b4550eece050560fcd60b6542f6a Mon Sep 17 00:00:00 2001 From: Amaris Sim Date: Thu, 22 Aug 2024 10:17:33 -0400 Subject: [PATCH 24/24] adding conditional to fail if api fails --- .../delphi_utils/validator/datafetcher.py | 38 +++++++++++++------ .../delphi_sir_complainsalot/check_source.py | 18 ++++++--- .../delphi_sir_complainsalot/date_utils.py | 8 +++- .../delphi_sir_complainsalot/run.py | 10 ++++- 4 files changed, 55 insertions(+), 19 deletions(-) diff --git a/_delphi_utils_python/delphi_utils/validator/datafetcher.py b/_delphi_utils_python/delphi_utils/validator/datafetcher.py index 76459982f..066d0fbe1 100644 --- a/_delphi_utils_python/delphi_utils/validator/datafetcher.py +++ b/_delphi_utils_python/delphi_utils/validator/datafetcher.py @@ -118,15 +118,13 @@ def get_geo_signal_combos(data_source, api_key): source_signal_mappings = {i['source']:i['db_source'] for i in meta_response.json()} - with warnings.catch_warnings(): - warnings.simplefilter("ignore") + response = Epidata.covidcast_meta() - response = Epidata.covidcast_meta() - - if response["result"] != 1: - # Something failed in the API and we did not get real metadata - raise RuntimeError("Error when fetching metadata from the API", response["message"]) + if response["result"] != 1: + # Something failed in the API and we did not get real metadata + raise RuntimeError("Error when fetching metadata from the API", response["message"]) + else: meta = pd.DataFrame.from_dict(response["epidata"]) # note: this will fail for signals with weekly data, but currently not supported for validation meta = meta[meta["time_type"] == "day"] @@ -183,12 +181,32 @@ def fetch_api_reference(data_source, start_date, end_date, geo_type, signal_type time_type="day", geo_type=geo_type, time_values=Epidata.range(start_date.strftime("%Y%m%d"), end_date.strftime("%Y%m%d")), - geo_value="*" + geo_value="*", ) if response["result"] != 1: - # Something failed in the API and we did not get real metadata + # Something failed in the API and we did not get real signal data raise RuntimeError("Error when fetching signal data from the API", response["message"]) + if response["message"] not in {"success", "no results"}: + warnings.warn( + "Problem obtaining data", + RuntimeWarning, + message=response["message"], + data_source=data_source, + signal=signal, + time_value=params["time_values"], + geo_type=geo_type, + ) + logger.info(f"Trying calling covidcast again") + response = Epidata.covidcast( + data_source, + signal_type, + time_type="day", + geo_type=geo_type, + time_values=Epidata.range(start_date.strftime("%Y%m%d"), end_date.strftime("%Y%m%d")), + geo_value="*", + ) + api_df = None if len(response["epidata"]) > 0: api_df = pd.DataFrame.from_dict(response["epidata"]) @@ -204,8 +222,6 @@ def fetch_api_reference(data_source, start_date, end_date, geo_type, signal_type if api_df is None: raise APIDataFetchError("Error: no API data was returned " + error_context) - if not isinstance(api_df, pd.DataFrame): - raise APIDataFetchError("Error: API return value was not a dataframe " + error_context) column_names = ["geo_id", "val", "se", "sample_size", "time_value"] diff --git a/sir_complainsalot/delphi_sir_complainsalot/check_source.py b/sir_complainsalot/delphi_sir_complainsalot/check_source.py index 9d9c7ca37..59fc636e4 100644 --- a/sir_complainsalot/delphi_sir_complainsalot/check_source.py +++ b/sir_complainsalot/delphi_sir_complainsalot/check_source.py @@ -30,9 +30,12 @@ def __str__(self): def to_md(self): """Markdown formatted form of complaint.""" return "*{source}* `{signal}` ({geos}) {message}; last updated {updated}.".format( - source=self.data_source, signal=self.signal, geos=", ".join(self.geo_types), - message=self.message, updated=self.last_updated.strftime("%Y-%m-%d")) - + source=self.data_source, + signal=self.signal, + geos=", ".join(self.geo_types), + message=self.message, + updated=self.last_updated.strftime("%Y-%m-%d"), + ) def check_source(data_source, meta, params, grace, logger): # pylint: disable=too-many-locals @@ -76,7 +79,8 @@ def check_source(data_source, meta, params, grace, logger): # pylint: disable=t start_day=start_date.strftime("%Y-%m-%d"), end_day=end_date.strftime("%Y-%m-%d"), geo_type=row["geo_type"], - time_type=row["time_type"]) + time_type=row["time_type"], + ) response = Epidata.covidcast( data_source, @@ -91,7 +95,7 @@ def check_source(data_source, meta, params, grace, logger): # pylint: disable=t lag_calculated_from_api = False latest_data = None - if response["result"] == 1: + if response["result"] == 1 and response["message"] == "success": latest_data = pd.DataFrame.from_dict(response["epidata"]) latest_data["time_value"] = _parse_datetimes(latest_data, "time_value") latest_data["issue"] = _parse_datetimes(latest_data, "issue") @@ -101,6 +105,10 @@ def check_source(data_source, meta, params, grace, logger): # pylint: disable=t current_lag_in_days = (datetime.now().date() - max(unique_dates)).days lag_calculated_from_api = True + else: + # Something failed in the API and we did not get real signal data + raise RuntimeError("Error when fetching signal data from the API", message=response["message"]) + logger.info("Signal lag", current_lag_in_days = current_lag_in_days, data_source = data_source, diff --git a/sir_complainsalot/delphi_sir_complainsalot/date_utils.py b/sir_complainsalot/delphi_sir_complainsalot/date_utils.py index 7df0b89bc..ddaceca1d 100644 --- a/sir_complainsalot/delphi_sir_complainsalot/date_utils.py +++ b/sir_complainsalot/delphi_sir_complainsalot/date_utils.py @@ -1,7 +1,8 @@ from datetime import datetime -from epiweeks import Week import pandas as pd +from epiweeks import Week + def _date_to_api_string(d: datetime, time_type: str = "day") -> str: """Convert a date object to a YYYYMMDD or YYYYMM string expected by the API.""" @@ -11,6 +12,7 @@ def _date_to_api_string(d: datetime, time_type: str = "day") -> str: return Week.fromdate(d).cdcformat() raise ValueError(f"Unknown time_type: {time_type}") + def _parse_datetimes(df: pd.DataFrame, col: str, date_format: str = "%Y%m%d") -> pd.Series: """Convert a DataFrame date or epiweek column into datetimes. @@ -19,10 +21,12 @@ def _parse_datetimes(df: pd.DataFrame, col: str, date_format: str = "%Y%m%d") -> format and return the date of the first day of the week. """ df[col] = df[col].astype("str") + def parse_row(row): if row["time_type"] == "day": return pd.to_datetime(row[col], format=date_format) if row["time_type"] == "week": return pd.to_datetime(Week(int(row[col][:4]), int(row[col][-2:])).startdate()) return row[col] - return df.apply(parse_row, axis=1) \ No newline at end of file + + return df.apply(parse_row, axis=1) diff --git a/sir_complainsalot/delphi_sir_complainsalot/run.py b/sir_complainsalot/delphi_sir_complainsalot/run.py index fb56a2b83..4ffc8f15d 100644 --- a/sir_complainsalot/delphi_sir_complainsalot/run.py +++ b/sir_complainsalot/delphi_sir_complainsalot/run.py @@ -30,7 +30,15 @@ def run_module(): start_time = time.time() params = read_params() Epidata.auth = ("epidata", params["api_credentials"]) - meta = pd.DataFrame.from_dict(Epidata.covidcast_meta().get("epidata", dict())) + response = Epidata.covidcast_meta() + + meta = None + if response["result"] == 1: + meta = pd.DataFrame.from_dict(response["epidata"]) + else: + # Something failed in the API and we did not get real metadata + raise RuntimeError("Error when fetching signal data from the API", response["message"]) + meta["max_time"] = _parse_datetimes(meta, "max_time") slack_notifier = None if "channel" in params and "slack_token" in params: