26
26
27
27
_HEADERS = {"user-agent" : "delphi_epidata/" + _version + " (Python)" }
28
28
29
+
30
+ class EpidataException (Exception ):
31
+ ...
32
+
33
+
34
+ class EpidataBadRequestException (EpidataException ):
35
+ ...
36
+
37
+
38
+ REGIONS_EPIWEEKS_REQUIRED = "`regions` and `epiweeks` are both required"
39
+ ISSUES_LAG_EXCLUSIVE = "`issues` and `lag` are mutually exclusive"
40
+ LOCATIONS_EPIWEEKS_REQUIRED = "`locations` and `epiweeks` are both required"
41
+
29
42
# Because the API is stateless, the Epidata class only contains static methods
30
43
class Epidata :
31
44
"""An interface to DELPHI's Epidata API."""
@@ -90,7 +103,7 @@ def check(resp):
90
103
"""Raise an Exception on error, otherwise return epidata."""
91
104
if resp ["result" ] != 1 :
92
105
msg , code = resp ["message" ], resp ["result" ]
93
- raise Exception (f"Error fetching epidata: { msg } . (result={ int (code )} )" )
106
+ raise EpidataException (f"Error fetching epidata: { msg } . (result={ int (code )} )" )
94
107
return resp ["epidata" ]
95
108
96
109
# Build a `range` object (ex: dates/epiweeks)
@@ -107,9 +120,9 @@ def fluview(regions, epiweeks, issues=None, lag=None, auth=None):
107
120
"""Fetch FluView data."""
108
121
# Check parameters
109
122
if regions is None or epiweeks is None :
110
- raise Exception ( "`regions` and `epiweeks` are both required" )
123
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
111
124
if issues is not None and lag is not None :
112
- raise Exception ( "`issues` and `lag` are mutually exclusive" )
125
+ raise EpidataBadRequestException ( ISSUES_LAG_EXCLUSIVE )
113
126
# Set up request
114
127
params = {
115
128
"endpoint" : "fluview" ,
@@ -142,9 +155,9 @@ def fluview_clinical(regions, epiweeks, issues=None, lag=None):
142
155
"""Fetch FluView clinical data."""
143
156
# Check parameters
144
157
if regions is None or epiweeks is None :
145
- raise Exception ( "`regions` and `epiweeks` are both required" )
158
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
146
159
if issues is not None and lag is not None :
147
- raise Exception ( "`issues` and `lag` are mutually exclusive" )
160
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
148
161
# Set up request
149
162
params = {
150
163
"endpoint" : "fluview_clinical" ,
@@ -164,9 +177,9 @@ def flusurv(locations, epiweeks, issues=None, lag=None):
164
177
"""Fetch FluSurv data."""
165
178
# Check parameters
166
179
if locations is None or epiweeks is None :
167
- raise Exception ( "`locations` and `epiweeks` are both required" )
180
+ raise EpidataBadRequestException ( LOCATIONS_EPIWEEKS_REQUIRED )
168
181
if issues is not None and lag is not None :
169
- raise Exception ( "`issues` and `lag` are mutually exclusive" )
182
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
170
183
# Set up request
171
184
params = {
172
185
"endpoint" : "flusurv" ,
@@ -186,9 +199,9 @@ def paho_dengue(regions, epiweeks, issues=None, lag=None):
186
199
"""Fetch PAHO Dengue data."""
187
200
# Check parameters
188
201
if regions is None or epiweeks is None :
189
- raise Exception ( "`regions` and `epiweeks` are both required" )
202
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
190
203
if issues is not None and lag is not None :
191
- raise Exception ( "`issues` and `lag` are mutually exclusive" )
204
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
192
205
# Set up request
193
206
params = {
194
207
"endpoint" : "paho_dengue" ,
@@ -208,9 +221,9 @@ def ecdc_ili(regions, epiweeks, issues=None, lag=None):
208
221
"""Fetch ECDC ILI data."""
209
222
# Check parameters
210
223
if regions is None or epiweeks is None :
211
- raise Exception ( "`regions` and `epiweeks` are both required" )
224
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
212
225
if issues is not None and lag is not None :
213
- raise Exception ( "`issues` and `lag` are mutually exclusive" )
226
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
214
227
# Set up request
215
228
params = {
216
229
"endpoint" : "ecdc_ili" ,
@@ -230,9 +243,9 @@ def kcdc_ili(regions, epiweeks, issues=None, lag=None):
230
243
"""Fetch KCDC ILI data."""
231
244
# Check parameters
232
245
if regions is None or epiweeks is None :
233
- raise Exception ( "`regions` and `epiweeks` are both required" )
246
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
234
247
if issues is not None and lag is not None :
235
- raise Exception ( "`issues` and `lag` are mutually exclusive" )
248
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
236
249
# Set up request
237
250
params = {
238
251
"endpoint" : "kcdc_ili" ,
@@ -252,7 +265,7 @@ def gft(locations, epiweeks):
252
265
"""Fetch Google Flu Trends data."""
253
266
# Check parameters
254
267
if locations is None or epiweeks is None :
255
- raise Exception ( "`locations` and `epiweeks` are both required" )
268
+ raise EpidataBadRequestException ( LOCATIONS_EPIWEEKS_REQUIRED )
256
269
# Set up request
257
270
params = {
258
271
"endpoint" : "gft" ,
@@ -268,7 +281,9 @@ def ght(auth, locations, epiweeks, query):
268
281
"""Fetch Google Health Trends data."""
269
282
# Check parameters
270
283
if auth is None or locations is None or epiweeks is None or query is None :
271
- raise Exception ("`auth`, `locations`, `epiweeks`, and `query` are all required" )
284
+ raise EpidataBadRequestException (
285
+ "`auth`, `locations`, `epiweeks`, and `query` are all required"
286
+ )
272
287
# Set up request
273
288
params = {
274
289
"endpoint" : "ght" ,
@@ -286,9 +301,9 @@ def twitter(auth, locations, dates=None, epiweeks=None):
286
301
"""Fetch HealthTweets data."""
287
302
# Check parameters
288
303
if auth is None or locations is None :
289
- raise Exception ("`auth` and `locations` are both required" )
304
+ raise EpidataBadRequestException ("`auth` and `locations` are both required" )
290
305
if not ((dates is None ) ^ (epiweeks is None )):
291
- raise Exception ("exactly one of `dates` and `epiweeks` is required" )
306
+ raise EpidataBadRequestException ("exactly one of `dates` and `epiweeks` is required" )
292
307
# Set up request
293
308
params = {
294
309
"endpoint" : "twitter" ,
@@ -308,9 +323,9 @@ def wiki(articles, dates=None, epiweeks=None, hours=None, language="en"):
308
323
"""Fetch Wikipedia access data."""
309
324
# Check parameters
310
325
if articles is None :
311
- raise Exception ("`articles` is required" )
326
+ raise EpidataBadRequestException ("`articles` is required" )
312
327
if not ((dates is None ) ^ (epiweeks is None )):
313
- raise Exception ("exactly one of `dates` and `epiweeks` is required" )
328
+ raise EpidataBadRequestException ("exactly one of `dates` and `epiweeks` is required" )
314
329
# Set up request
315
330
params = {
316
331
"endpoint" : "wiki" ,
@@ -332,7 +347,7 @@ def cdc(auth, epiweeks, locations):
332
347
"""Fetch CDC page hits."""
333
348
# Check parameters
334
349
if auth is None or epiweeks is None or locations is None :
335
- raise Exception ("`auth`, `epiweeks`, and `locations` are all required" )
350
+ raise EpidataBadRequestException ("`auth`, `epiweeks`, and `locations` are all required" )
336
351
# Set up request
337
352
params = {
338
353
"endpoint" : "cdc" ,
@@ -349,7 +364,7 @@ def quidel(auth, epiweeks, locations):
349
364
"""Fetch Quidel data."""
350
365
# Check parameters
351
366
if auth is None or epiweeks is None or locations is None :
352
- raise Exception ("`auth`, `epiweeks`, and `locations` are all required" )
367
+ raise EpidataBadRequestException ("`auth`, `epiweeks`, and `locations` are all required" )
353
368
# Set up request
354
369
params = {
355
370
"endpoint" : "quidel" ,
@@ -366,7 +381,7 @@ def norostat(auth, location, epiweeks):
366
381
"""Fetch NoroSTAT data (point data, no min/max)."""
367
382
# Check parameters
368
383
if auth is None or location is None or epiweeks is None :
369
- raise Exception ("`auth`, `location`, and `epiweeks` are all required" )
384
+ raise EpidataBadRequestException ("`auth`, `location`, and `epiweeks` are all required" )
370
385
# Set up request
371
386
params = {
372
387
"endpoint" : "norostat" ,
@@ -383,7 +398,7 @@ def meta_norostat(auth):
383
398
"""Fetch NoroSTAT metadata."""
384
399
# Check parameters
385
400
if auth is None :
386
- raise Exception ("`auth` is required" )
401
+ raise EpidataBadRequestException ("`auth` is required" )
387
402
# Set up request
388
403
params = {
389
404
"endpoint" : "meta_norostat" ,
@@ -398,9 +413,9 @@ def nidss_flu(regions, epiweeks, issues=None, lag=None):
398
413
"""Fetch NIDSS flu data."""
399
414
# Check parameters
400
415
if regions is None or epiweeks is None :
401
- raise Exception ( "`regions` and `epiweeks` are both required" )
416
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
402
417
if issues is not None and lag is not None :
403
- raise Exception ( "`issues` and `lag` are mutually exclusive" )
418
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
404
419
# Set up request
405
420
params = {
406
421
"endpoint" : "nidss_flu" ,
@@ -420,7 +435,7 @@ def nidss_dengue(locations, epiweeks):
420
435
"""Fetch NIDSS dengue data."""
421
436
# Check parameters
422
437
if locations is None or epiweeks is None :
423
- raise Exception ( "`locations` and `epiweeks` are both required" )
438
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
424
439
# Set up request
425
440
params = {
426
441
"endpoint" : "nidss_dengue" ,
@@ -436,7 +451,7 @@ def delphi(system, epiweek):
436
451
"""Fetch Delphi's forecast."""
437
452
# Check parameters
438
453
if system is None or epiweek is None :
439
- raise Exception ("`system` and `epiweek` are both required" )
454
+ raise EpidataBadRequestException ("`system` and `epiweek` are both required" )
440
455
# Set up request
441
456
params = {
442
457
"endpoint" : "delphi" ,
@@ -452,7 +467,9 @@ def sensors(auth, names, locations, epiweeks):
452
467
"""Fetch Delphi's digital surveillance sensors."""
453
468
# Check parameters
454
469
if names is None or locations is None or epiweeks is None :
455
- raise Exception ("`names`, `locations`, and `epiweeks` are all required" )
470
+ raise EpidataBadRequestException (
471
+ "`names`, `locations`, and `epiweeks` are all required"
472
+ )
456
473
# Set up request
457
474
params = {
458
475
"endpoint" : "sensors" ,
@@ -471,7 +488,9 @@ def dengue_sensors(auth, names, locations, epiweeks):
471
488
"""Fetch Delphi's digital surveillance sensors."""
472
489
# Check parameters
473
490
if auth is None or names is None or locations is None or epiweeks is None :
474
- raise Exception ("`auth`, `names`, `locations`, and `epiweeks` " "are all required" )
491
+ raise EpidataBadRequestException (
492
+ "`auth`, `names`, `locations`, and `epiweeks` are all required"
493
+ )
475
494
# Set up request
476
495
params = {
477
496
"endpoint" : "dengue_sensors" ,
@@ -489,7 +508,7 @@ def nowcast(locations, epiweeks):
489
508
"""Fetch Delphi's wILI nowcast."""
490
509
# Check parameters
491
510
if locations is None or epiweeks is None :
492
- raise Exception ( "`locations` and `epiweeks` are both required" )
511
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
493
512
# Set up request
494
513
params = {
495
514
"endpoint" : "nowcast" ,
@@ -505,7 +524,7 @@ def dengue_nowcast(locations, epiweeks):
505
524
"""Fetch Delphi's dengue nowcast."""
506
525
# Check parameters
507
526
if locations is None or epiweeks is None :
508
- raise Exception ( "`locations` and `epiweeks` are both required" )
527
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
509
528
# Set up request
510
529
params = {
511
530
"endpoint" : "dengue_nowcast" ,
@@ -541,12 +560,12 @@ def covidcast(
541
560
signals = kwargs ["signal" ]
542
561
# Check parameters
543
562
if None in (data_source , signals , time_type , geo_type , time_values , geo_value ):
544
- raise Exception (
563
+ raise EpidataBadRequestException (
545
564
"`data_source`, `signals`, `time_type`, `geo_type`, "
546
565
"`time_values`, and `geo_value` are all required"
547
566
)
548
567
if issues is not None and lag is not None :
549
- raise Exception ( "`issues` and `lag` are mutually exclusive" )
568
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
550
569
# Set up request
551
570
params = {
552
571
"endpoint" : "covidcast" ,
@@ -589,7 +608,7 @@ def covid_hosp(states, dates, issues=None, as_of=None):
589
608
"""Fetch COVID hospitalization data."""
590
609
# Check parameters
591
610
if states is None or dates is None :
592
- raise Exception ("`states` and `dates` are both required" )
611
+ raise EpidataBadRequestException ("`states` and `dates` are both required" )
593
612
# Set up request
594
613
params = {
595
614
"endpoint" : "covid_hosp" ,
@@ -609,7 +628,9 @@ def covid_hosp_facility(hospital_pks, collection_weeks, publication_dates=None):
609
628
"""Fetch COVID hospitalization data for specific facilities."""
610
629
# Check parameters
611
630
if hospital_pks is None or collection_weeks is None :
612
- raise Exception ("`hospital_pks` and `collection_weeks` are both required" )
631
+ raise EpidataBadRequestException (
632
+ "`hospital_pks` and `collection_weeks` are both required"
633
+ )
613
634
# Set up request
614
635
params = {
615
636
"source" : "covid_hosp_facility" ,
@@ -638,7 +659,9 @@ def covid_hosp_facility_lookup(state=None, ccn=None, city=None, zip=None, fips_c
638
659
elif fips_code is not None :
639
660
params ["fips_code" ] = fips_code
640
661
else :
641
- raise Exception ("one of `state`, `ccn`, `city`, `zip`, or `fips_code` is required" )
662
+ raise EpidataBadRequestException (
663
+ "one of `state`, `ccn`, `city`, `zip`, or `fips_code` is required"
664
+ )
642
665
# Make the API call
643
666
return Epidata ._request (params )
644
667
@@ -668,12 +691,12 @@ def covidcast_nowcast(
668
691
geo_value ,
669
692
sensor_names ,
670
693
):
671
- raise Exception (
694
+ raise EpidataBadRequestException (
672
695
"`data_source`, `signals`, `sensor_names`, `time_type`, `geo_type`, "
673
696
"`time_values`, and `geo_value` are all required"
674
697
)
675
698
if issues is not None and lag is not None :
676
- raise Exception ( "`issues` and `lag` are mutually exclusive" )
699
+ raise EpidataBadRequestException ( REGIONS_EPIWEEKS_REQUIRED )
677
700
# Set up request
678
701
params = {
679
702
"source" : "covidcast_nowcast" ,
0 commit comments