Skip to content

Commit 255fe12

Browse files
committed
feat: add a simple coverage endpoint
1 parent a0d6dfe commit 255fe12

File tree

1 file changed

+31
-2
lines changed

1 file changed

+31
-2
lines changed

src/server/endpoints/covidcast.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from typing import List, Optional, Union, Tuple, Dict, Any, Set
22
from itertools import groupby
3-
from datetime import date, datetime
3+
from datetime import date, datetime, timedelta
44
from flask import Blueprint, request
55
from flask.json import loads, jsonify
66
from bisect import bisect_right
@@ -150,7 +150,6 @@ def handle():
150150
q.set_order("source", "signal", "time_type", "time_value", "geo_type", "geo_value", "issue")
151151
q.set_fields(fields_string, fields_int, fields_float)
152152

153-
154153
# basic query info
155154
# data type of each field
156155
# build the source, signal, time, and location (type and id) filters
@@ -493,3 +492,33 @@ def handle_meta():
493492
entry.intergrate(row)
494493

495494
return jsonify([r.asdict() for r in out.values()])
495+
496+
497+
@bp.route("/coverage", methods=("GET", "POST"))
498+
def handle_coverage():
499+
"""
500+
similar to /signal_dashboard_coverage for a specific signal returns the coverage (number of locations for a given geo_type)
501+
"""
502+
503+
signal_pair = parse_single_source_signal_arg("signal")
504+
geo_type = request.args.get("geo_type", "county")
505+
if "window" in request.values:
506+
time_window = parse_day_range_arg("window")
507+
else:
508+
now = date.today()
509+
time_window = (date_to_time_value(now - timedelta(days=30)), date_to_time_value(now))
510+
511+
q = QueryBuilder("covidcast", "c")
512+
q.fields = ["c.time_value", "count(c.geo_value) as count"]
513+
if geo_type == "only-county":
514+
q.where(geo_type="county")
515+
q.conditions.append('geo_value not like "%000"')
516+
else:
517+
q.where(geo_type=geo_type)
518+
q.where_source_signal_pairs("source", "signal", [signal_pair])
519+
q.where_time_pairs("time_type", "time_value", [TimePair("day", [time_window])])
520+
q.group_by = "c.time_value"
521+
522+
_handle_lag_issues_as_of(q, None, None, None)
523+
524+
return execute_query(q.query, q.params, [], ["time_value", "count"], [])

0 commit comments

Comments
 (0)