1
+ """module for covidcast api call wrapper."""
2
+
1
3
from datetime import date , timedelta
2
- from typing import List , Tuple , Union , Iterable
4
+ from typing import Iterable , Union
3
5
4
- import numpy as np
5
6
import pandas as pd
6
-
7
7
from delphi_epidata import Epidata
8
8
from epiweeks import Week
9
9
10
- def date_generator (startdate , enddate ):
11
- while startdate <= enddate :
12
- yield startdate .strftime ('%Y-%m-%d' )
13
- startdate = startdate + timedelta (days = 1 )
10
+
11
+ def date_generator (startdate : date , enddate : date ) -> Iterable [date ]:
12
+ """
13
+ Take start date and end date and generates date string.
14
+
15
+ Parameters
16
+ ----------
17
+ startdate: date
18
+ enddate: date
19
+
20
+ Returns
21
+ -------
22
+ generator of str
23
+ """
24
+ while startdate <= enddate :
25
+ yield startdate .strftime ("%Y-%m-%d" )
26
+ startdate = startdate + timedelta (days = 1 )
14
27
15
28
16
- def _parse_datetimes (date_int : int ,
17
- time_type : str ,
18
- date_format : str = "%Y%m%d" ) -> Union [pd .Timestamp ]: # annotating nan errors
29
+ def _parse_datetimes (date_int : int , time_type : str , date_format : str = "%Y%m%d" ) -> Union [pd .Timestamp , None ]:
19
30
"""Convert a date or epiweeks string into timestamp objects.
20
31
21
32
Datetimes (length 8) are converted to their corresponding date, while epiweeks (length 6)
@@ -33,15 +44,23 @@ def _parse_datetimes(date_int: int,
33
44
if time_type == "week" :
34
45
epiwk = Week (int (date_str [:4 ]), int (date_str [- 2 :]))
35
46
return pd .to_datetime (epiwk .startdate ())
36
- return np .nan
47
+ return None
48
+
49
+
50
+ def metadata () -> Union [pd .DataFrame , None ]:
51
+ """
52
+ Make covidcast metadata api call.
37
53
38
- def metadata ():
54
+ Returns
55
+ -------
56
+ pd.DataFrame of covidcast metadata.
57
+ """
58
+ # pylint: disable=W0212
39
59
response = Epidata ._request ("covidcast_meta" )
40
60
41
61
if response ["result" ] != 1 :
42
62
# Something failed in the API and we did not get real metadata
43
- raise RuntimeError ("Error when fetching metadata from the API" ,
44
- response ["message" ])
63
+ raise RuntimeError ("Error when fetching metadata from the API" , response ["message" ])
45
64
46
65
df = pd .DataFrame .from_dict (response ["epidata" ])
47
66
df ["min_time" ] = df .apply (lambda x : _parse_datetimes (x .min_time , x .time_type ), axis = 1 )
@@ -58,7 +77,6 @@ def signal(
58
77
geo_type : str = "county" ,
59
78
geo_values : Union [str , Iterable [str ]] = "*" ,
60
79
as_of : date = None ,
61
- issues : Union [date , Tuple [date ], List [date ]] = None ,
62
80
lag : int = None ,
63
81
time_type : str = "day" ,
64
82
) -> Union [pd .DataFrame , None ]:
@@ -208,19 +226,24 @@ def signal(
208
226
)
209
227
210
228
time_values = list (date_generator (start_day , end_day ))
211
- issues = list (date_generator (start_day , end_day )) #TODO placesholder need to see how the issues params are coming in
212
- response = Epidata .covidcast (data_source , signal , time_type = time_type ,
213
- geo_type = geo_type , time_values = time_values ,
214
- geo_value = geo_values , as_of = as_of ,
215
- issues = issues , lag = lag )
229
+
230
+ response = Epidata .covidcast (
231
+ data_source ,
232
+ signal ,
233
+ time_type = time_type ,
234
+ geo_type = geo_type ,
235
+ time_values = time_values ,
236
+ geo_value = geo_values ,
237
+ as_of = as_of ,
238
+ lag = lag ,
239
+ )
216
240
if response ["result" ] != 1 :
217
241
# Something failed in the API and we did not get real metadata
218
- raise RuntimeError ("Error when fetching metadata from the API" ,
219
- response ["message" ])
242
+ raise RuntimeError ("Error when fetching metadata from the API" , response ["message" ])
220
243
221
244
api_df = pd .DataFrame .from_dict (response ["epidata" ])
222
- api_df ["issue" ] = pd .to_datetime (api_df ["issue" ], format = ' %Y%m%d' )
223
- api_df ["time_value" ] = pd .to_datetime (api_df ["time_value" ], format = ' %Y%m%d' )
245
+ api_df ["issue" ] = pd .to_datetime (api_df ["issue" ], format = " %Y%m%d" )
246
+ api_df ["time_value" ] = pd .to_datetime (api_df ["time_value" ], format = " %Y%m%d" )
224
247
api_df .drop ("direction" , axis = 1 , inplace = True )
225
248
api_df ["data_source" ] = data_source
226
249
api_df ["signal" ] = signal
0 commit comments