Skip to content

Commit e56dca2

Browse files
committed
Add support for querying multiple signals; cmu-delphi/covidcast-indicators#116
* backwards-compatible signal/signals parameter * optional 'format' parameter for retrieving results as a tree (preferred by Viz) or as a flat list (backwards-compatible); defaults to flat list * client support: coffee, js, R, py * integration tests to check multi-signal queries and queries for tree format
1 parent 6ff3b4a commit e56dca2

11 files changed

+186
-56
lines changed

integrations/acquisition/covidcast/test_covidcast_meta_caching.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Integration tests for covidcast's metadata caching."""
22

33
# standard library
4+
import json
45
import unittest
56

67
# third party
@@ -100,15 +101,15 @@ def test_caching(self):
100101
'stdev_value': 0,
101102
'max_issue': 20200423,
102103
'min_lag': 0,
103-
'max_lag': 1
104+
'max_lag': 1,
104105
}
105106
])
106-
epidata1={'result':1,'message':'success','epidata':epidata1}
107+
epidata1={'result':1, 'message':'success', 'epidata':epidata1}
107108

108109
# make sure the API covidcast_meta is still blank, since it only serves
109110
# the cached version and we haven't cached anything yet
110111
epidata2 = Epidata.covidcast_meta()
111-
self.assertEqual(epidata2['result'], -2)
112+
self.assertEqual(epidata2['result'], -2, json.dumps(epidata2))
112113

113114
# update the cache
114115
args = None

integrations/acquisition/covidcast/test_csv_uploading.py

+7
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ def apply_lag(expected_epidata):
126126
'stderr': 0.1,
127127
'sample_size': 10,
128128
'direction': None,
129+
'signal': 'test',
129130
},
130131
{
131132
'time_value': 20200419,
@@ -134,6 +135,7 @@ def apply_lag(expected_epidata):
134135
'stderr': 0.3,
135136
'sample_size': 30,
136137
'direction': None,
138+
'signal': 'test',
137139
},
138140
{
139141
'time_value': 20200419,
@@ -142,6 +144,7 @@ def apply_lag(expected_epidata):
142144
'stderr': 0.2,
143145
'sample_size': 20,
144146
'direction': None,
147+
'signal': 'test',
145148
},
146149
]),
147150
'message': 'success',
@@ -164,6 +167,7 @@ def apply_lag(expected_epidata):
164167
'stderr': 0.01,
165168
'sample_size': 100,
166169
'direction': None,
170+
'signal': 'wip_prototype',
167171
},
168172
{
169173
'time_value': 20200419,
@@ -172,6 +176,7 @@ def apply_lag(expected_epidata):
172176
'stderr': 0.02,
173177
'sample_size': 200,
174178
'direction': None,
179+
'signal': 'wip_prototype',
175180
},
176181
{
177182
'time_value': 20200419,
@@ -180,6 +185,7 @@ def apply_lag(expected_epidata):
180185
'stderr': 0.03,
181186
'sample_size': 300,
182187
'direction': None,
188+
'signal': 'wip_prototype',
183189
},
184190
]),
185191
'message': 'success',
@@ -202,6 +208,7 @@ def apply_lag(expected_epidata):
202208
'stderr': 5.4,
203209
'sample_size': 624,
204210
'direction': None,
211+
'signal': 'wip_really_long_name_that_will_be_accepted',
205212
},
206213
])
207214
})

integrations/acquisition/covidcast/test_direction_updating.py

+24-12
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ def test_uploading(self):
107107
'sample_size': 0,
108108
'direction': None,
109109
'issue': 20201028,
110-
'lag': 0
110+
'lag': 0,
111+
'signal': 'sig1'
111112
},
112113
{
113114
'time_value': 20201029,
@@ -117,7 +118,8 @@ def test_uploading(self):
117118
'sample_size': 0,
118119
'direction': None,
119120
'issue': 20201029,
120-
'lag': 0
121+
'lag': 0,
122+
'signal': 'sig1'
121123
},
122124
{
123125
'time_value': 20201030,
@@ -127,7 +129,8 @@ def test_uploading(self):
127129
'sample_size': 0,
128130
'direction': None,
129131
'issue': 20201030,
130-
'lag': 0
132+
'lag': 0,
133+
'signal': 'sig1'
131134
},
132135
],
133136
'message': 'success',
@@ -149,7 +152,8 @@ def test_uploading(self):
149152
'sample_size': 0,
150153
'direction': None,
151154
'issue': 20200228,
152-
'lag': 0
155+
'lag': 0,
156+
'signal': 'sig',
153157
},
154158
{
155159
'time_value': 20200229,
@@ -159,7 +163,8 @@ def test_uploading(self):
159163
'sample_size': 0,
160164
'direction': None,
161165
'issue': 20200229,
162-
'lag': 0
166+
'lag': 0,
167+
'signal': 'sig',
163168
},
164169
{
165170
'time_value': 20200301,
@@ -169,7 +174,8 @@ def test_uploading(self):
169174
'sample_size': 0,
170175
'direction': 1,
171176
'issue': 20200301,
172-
'lag': 0
177+
'lag': 0,
178+
'signal': 'sig',
173179
},
174180
{
175181
'time_value': 20200511,
@@ -179,7 +185,8 @@ def test_uploading(self):
179185
'sample_size': 0,
180186
'direction': None,
181187
'issue': 20200511,
182-
'lag': 0
188+
'lag': 0,
189+
'signal': 'sig',
183190
},
184191
{
185192
'time_value': 20200512,
@@ -189,7 +196,8 @@ def test_uploading(self):
189196
'sample_size': 0,
190197
'direction': None,
191198
'issue': 20200512,
192-
'lag': 0
199+
'lag': 0,
200+
'signal': 'sig',
193201
},
194202
{
195203
'time_value': 20200517,
@@ -199,7 +207,8 @@ def test_uploading(self):
199207
'sample_size': 0,
200208
'direction': 0,
201209
'issue': 20200517,
202-
'lag': 0
210+
'lag': 0,
211+
'signal': 'sig',
203212
},
204213
{
205214
'time_value': 20200615,
@@ -209,7 +218,8 @@ def test_uploading(self):
209218
'sample_size': 0,
210219
'direction': None,
211220
'issue': 20200615,
212-
'lag': 0
221+
'lag': 0,
222+
'signal': 'sig',
213223
},
214224
{
215225
'time_value': 20200616,
@@ -219,7 +229,8 @@ def test_uploading(self):
219229
'sample_size': 0,
220230
'direction': None,
221231
'issue': 20200616,
222-
'lag': 0
232+
'lag': 0,
233+
'signal': 'sig',
223234
},
224235
{
225236
'time_value': 20200617,
@@ -229,7 +240,8 @@ def test_uploading(self):
229240
'sample_size': 0,
230241
'direction': 1,
231242
'issue': 20200617,
232-
'lag': 0
243+
'lag': 0,
244+
'signal': 'sig',
233245
},
234246
],
235247
'message': 'success',

integrations/client/test_delphi_epidata.py

+78-7
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,85 @@ def tearDown(self):
4545

4646
def test_covidcast(self):
4747
"""Test that the covidcast endpoint returns expected data."""
48-
48+
self.maxDiff=None
49+
4950
# insert dummy data
5051
self.cur.execute('''
5152
insert into covidcast values
5253
(0, 'src', 'sig', 'day', 'county', 20200414, '01234',
5354
123, 1.5, 2.5, 3.5, 456, 4, 20200414, 0, 0, False),
55+
(0, 'src', 'sig2', 'day', 'county', 20200414, '01234',
56+
123, 1.5, 2.5, 3.5, 456, 4, 20200414, 0, 0, False),
5457
(0, 'src', 'sig', 'day', 'county', 20200414, '01234',
5558
456, 5.5, 1.2, 10.5, 789, 0, 20200415, 1, 0, False),
5659
(0, 'src', 'sig', 'day', 'county', 20200414, '01234',
5760
345, 6.5, 2.2, 11.5, 678, 0, 20200416, 2, 1, False)
5861
''')
5962
self.cnx.commit()
6063

64+
# fetch data
65+
response = Epidata.covidcast(
66+
'src', ['sig','sig2'], 'day', 'county', 20200414, '01234')
67+
68+
# check result
69+
self.assertEqual(response, {
70+
'result': 1,
71+
'epidata': [{
72+
'time_value': 20200414,
73+
'geo_value': '01234',
74+
'value': 6.5,
75+
'stderr': 2.2,
76+
'sample_size': 11.5,
77+
'direction': 0,
78+
'issue': 20200416,
79+
'lag': 2,
80+
'signal': 'sig',
81+
},{
82+
'time_value': 20200414,
83+
'geo_value': '01234',
84+
'value': 1.5,
85+
'stderr': 2.5,
86+
'sample_size': 3.5,
87+
'direction': 4,
88+
'issue': 20200414,
89+
'lag': 0,
90+
'signal': 'sig2',
91+
}],
92+
'message': 'success',
93+
})
94+
95+
# fetch data
96+
response = Epidata.covidcast(
97+
'src', ['sig','sig2'], 'day', 'county', 20200414, '01234', format='tree')
98+
99+
# check result
100+
self.assertEqual(response, {
101+
'result': 1,
102+
'epidata': [{
103+
'sig': [{
104+
'time_value': 20200414,
105+
'geo_value': '01234',
106+
'value': 6.5,
107+
'stderr': 2.2,
108+
'sample_size': 11.5,
109+
'direction': 0,
110+
'issue': 20200416,
111+
'lag': 2,
112+
}],
113+
'sig2': [{
114+
'time_value': 20200414,
115+
'geo_value': '01234',
116+
'value': 1.5,
117+
'stderr': 2.5,
118+
'sample_size': 3.5,
119+
'direction': 4,
120+
'issue': 20200414,
121+
'lag': 0,
122+
}],
123+
}],
124+
'message': 'success',
125+
})
126+
61127
# fetch data, without specifying issue or lag
62128
response_1 = Epidata.covidcast(
63129
'src', 'sig', 'day', 'county', 20200414, '01234')
@@ -73,7 +139,8 @@ def test_covidcast(self):
73139
'sample_size': 11.5,
74140
'direction': 0,
75141
'issue': 20200416,
76-
'lag': 2
142+
'lag': 2,
143+
'signal': 'sig',
77144
}],
78145
'message': 'success',
79146
})
@@ -94,7 +161,8 @@ def test_covidcast(self):
94161
'sample_size': 10.5,
95162
'direction': 0,
96163
'issue': 20200415,
97-
'lag': 1
164+
'lag': 1,
165+
'signal': 'sig',
98166
}],
99167
'message': 'success',
100168
})
@@ -115,7 +183,8 @@ def test_covidcast(self):
115183
'sample_size': 3.5,
116184
'direction': 4,
117185
'issue': 20200414,
118-
'lag': 0
186+
'lag': 0,
187+
'signal': 'sig',
119188
}, {
120189
'time_value': 20200414,
121190
'geo_value': '01234',
@@ -124,7 +193,8 @@ def test_covidcast(self):
124193
'sample_size': 10.5,
125194
'direction': 0,
126195
'issue': 20200415,
127-
'lag': 1
196+
'lag': 1,
197+
'signal': 'sig',
128198
}],
129199
'message': 'success',
130200
})
@@ -145,7 +215,8 @@ def test_covidcast(self):
145215
'sample_size': 11.5,
146216
'direction': 0,
147217
'issue': 20200416,
148-
'lag': 2
218+
'lag': 2,
219+
'signal': 'sig',
149220
}],
150221
'message': 'success',
151222
})
@@ -189,7 +260,7 @@ def test_covidcast_meta(self):
189260
'last_update': 345,
190261
'max_issue': 20200416,
191262
'min_lag': 1,
192-
'max_lag': 2
263+
'max_lag': 2,
193264
}],
194265
'message': 'success',
195266
})

0 commit comments

Comments
 (0)