diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 5a82308bc..a5ed395d4 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.1.4 +current_version = 0.2.0 commit = False tag = False diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b5aac0240..810c0fc0d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -84,7 +84,7 @@ jobs: docker stop delphi_database_epidata delphi_web_epidata docker network remove delphi-net - build_js_clients: + build_js_client: runs-on: ubuntu-latest defaults: run: diff --git a/.github/workflows/update_gdocs_data.yml b/.github/workflows/update_gdocs_data.yml new file mode 100644 index 000000000..d2d0dc819 --- /dev/null +++ b/.github/workflows/update_gdocs_data.yml @@ -0,0 +1,37 @@ +name: Update Google Docs Meta Data +on: + workflow_dispatch: +jobs: + update_gdocs: + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v2 + with: + branch: dev + ssh-key: ${{ secrets.CMU_DELPHI_DEPLOY_MACHINE_SSH }} + - name: Set up Python 3.8 + uses: actions/setup-python@v2 + with: + python-version: 3.8 + - uses: actions/cache@v2 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pipd-${{ hashFiles('requirements-dev.txt') }} + restore-keys: | + ${{ runner.os }}-pipd- + - name: Install Dependencies + run: pip install -r requirements-dev.txt + - name: Update Docs + run: inv update-gdoc + - name: Create pull request into dev + uses: peter-evans/create-pull-request@v3 + with: + branch: bot/update-docs + commit-message: 'chore: update docs' + title: Update Google Docs Meta Data + labels: chore + reviewers: krivard + assignees: krivard + body: | + Updating Google Docs Meta Data diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index e20ae013c..b39b1f8f1 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -6,7 +6,7 @@ GEM i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) - addressable (2.7.0) + addressable (2.8.0) public_suffix (>= 2.0.2, < 5.0) coffee-script (2.4.1) coffee-script-source diff --git a/integrations/server/test_covidcast_endpoints.py b/integrations/server/test_covidcast_endpoints.py index 84dceb352..68c542846 100644 --- a/integrations/server/test_covidcast_endpoints.py +++ b/integrations/server/test_covidcast_endpoints.py @@ -339,7 +339,7 @@ def test_meta(self): """Request a signal the /meta endpoint.""" num_rows = 10 - rows = [CovidcastRow(time_value=20200401 + i, value=i) for i in range(num_rows)] + rows = [CovidcastRow(time_value=20200401 + i, value=i, source="fb-survey", signal="smoothed_cli") for i in range(num_rows)] self._insert_rows(rows) first = rows[0] last = rows[-1] @@ -349,7 +349,10 @@ def test_meta(self): with self.subTest("plain"): out = self._fetch("/meta") self.assertEqual(len(out), 1) - stats = out[0] + data_source = out[0] + self.assertEqual(data_source["source"], first.source) + self.assertEqual(len(data_source["signals"]), 1) + stats = data_source["signals"][0] self.assertEqual(stats["source"], first.source) self.assertEqual(stats["signal"], first.signal) self.assertEqual(stats["min_time"], first.time_value) @@ -364,7 +367,11 @@ def test_meta(self): with self.subTest("filtered"): out = self._fetch("/meta", signal=f"{first.source}:*") self.assertEqual(len(out), 1) - self.assertEqual(out[0]["source"], first.source) + data_source = out[0] + self.assertEqual(data_source["source"], first.source) + self.assertEqual(len(data_source["signals"]), 1) + stats = data_source["signals"][0] + self.assertEqual(stats["source"], first.source) out = self._fetch("/meta", signal=f"{first.source}:X") self.assertEqual(len(out), 0) diff --git a/requirements.dev.txt b/requirements.dev.txt index d721ffe3a..6cf9efeca 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -5,3 +5,4 @@ mypy>=0.790 pytest tenacity==7.0.0 bump2version +requests diff --git a/src/client/delphi_epidata.R b/src/client/delphi_epidata.R index 45e75bbd7..48ababb33 100644 --- a/src/client/delphi_epidata.R +++ b/src/client/delphi_epidata.R @@ -15,7 +15,7 @@ Epidata <- (function() { # API base url BASE_URL <- 'https://delphi.cmu.edu/epidata/api.php' - client_version <- '0.1.4' + client_version <- '0.2.0' # Helper function to cast values and/or ranges to strings .listitem <- function(value) { diff --git a/src/client/delphi_epidata.js b/src/client/delphi_epidata.js index 03f58ea73..b0ca377dd 100644 --- a/src/client/delphi_epidata.js +++ b/src/client/delphi_epidata.js @@ -22,7 +22,7 @@ } })(this, function (exports, fetchImpl, jQuery) { const BASE_URL = "https://delphi.cmu.edu/epidata/"; - const client_version = "0.1.4"; + const client_version = "0.2.0"; // Helper function to cast values and/or ranges to strings function _listitem(value) { diff --git a/src/client/packaging/npm/package.json b/src/client/packaging/npm/package.json index 5e211b88b..dfeac6709 100644 --- a/src/client/packaging/npm/package.json +++ b/src/client/packaging/npm/package.json @@ -2,7 +2,7 @@ "name": "delphi_epidata", "description": "Delphi Epidata API Client", "authors": "Delphi Group", - "version": "0.1.4", + "version": "0.2.0", "license": "MIT", "homepage": "https://github.com/cmu-delphi/delphi-epidata", "bugs": { diff --git a/src/client/packaging/pypi/delphi_epidata/__init__.py b/src/client/packaging/pypi/delphi_epidata/__init__.py index bfd7e96b6..744bcd0d6 100644 --- a/src/client/packaging/pypi/delphi_epidata/__init__.py +++ b/src/client/packaging/pypi/delphi_epidata/__init__.py @@ -1,4 +1,4 @@ from .delphi_epidata import Epidata name = 'delphi_epidata' -__version__ = '0.1.4' +__version__ = '0.2.0' diff --git a/src/client/packaging/pypi/setup.py b/src/client/packaging/pypi/setup.py index f9d4dc321..c03b4b203 100644 --- a/src/client/packaging/pypi/setup.py +++ b/src/client/packaging/pypi/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="delphi_epidata", - version="0.1.4", + version="0.2.0", author="David Farrow", author_email="dfarrow0@gmail.com", description="A programmatic interface to Delphi's Epidata API.", diff --git a/src/server/_config.py b/src/server/_config.py index b1ac44603..26c7474f7 100644 --- a/src/server/_config.py +++ b/src/server/_config.py @@ -5,7 +5,7 @@ load_dotenv() -VERSION = "0.1.4" +VERSION = "0.2.0" MAX_RESULTS = int(10e6) MAX_COMPATIBILITY_RESULTS = int(3650) diff --git a/src/server/endpoints/covidcast.py b/src/server/endpoints/covidcast.py index dfbee2255..56e7fc345 100644 --- a/src/server/endpoints/covidcast.py +++ b/src/server/endpoints/covidcast.py @@ -1,4 +1,4 @@ -from typing import List, Optional, Union, Tuple, Dict, Any, Set +from typing import List, Optional, Union, Tuple, Dict, Any from itertools import groupby from datetime import date, datetime, timedelta from flask import Blueprint, request @@ -33,8 +33,9 @@ require_any, ) from .._pandas import as_pandas, print_pandas -from .covidcast_utils import compute_trend, compute_trends, compute_correlations, compute_trend_value, CovidcastMetaEntry, AllSignalsMap +from .covidcast_utils import compute_trend, compute_trends, compute_correlations, compute_trend_value, CovidcastMetaEntry from ..utils import shift_time_value, date_to_time_value, time_value_to_iso, time_value_to_date +from .covidcast_utils.model import TimeType, data_sources, create_source_signal_alias_mapper # first argument is the endpoint name bp = Blueprint("covidcast", __name__) @@ -124,6 +125,7 @@ def guess_index_to_use(time: List[TimePair], geo: List[GeoPair], issues: Optiona @bp.route("/", methods=("GET", "POST")) def handle(): source_signal_pairs = parse_source_signal_pairs() + source_signal_pairs, alias_mapper = create_source_signal_alias_mapper(source_signal_pairs) time_pairs = parse_time_pairs() geo_pairs = parse_geo_pairs() @@ -137,8 +139,8 @@ def handle(): fields_string = ["geo_value", "signal"] fields_int = ["time_value", "direction", "issue", "lag", "missing_value", "missing_stderr", "missing_sample_size"] fields_float = ["value", "stderr", "sample_size"] - - if is_compatibility_mode(): + is_compatibility = is_compatibility_mode() + if is_compatibility: q.set_order("signal", "time_value", "geo_value", "issue") else: # transfer also the new detail columns @@ -158,14 +160,22 @@ def handle(): _handle_lag_issues_as_of(q, issues, lag, as_of) + def transform_row(row, _): + if is_compatibility or not alias_mapper: + return row + row["source"] = alias_mapper(row["source"], row["signal"]) + return row + # send query - return execute_query(str(q), q.params, fields_string, fields_int, fields_float) + return execute_query(str(q), q.params, fields_string, fields_int, fields_float, transform=transform_row) @bp.route("/trend", methods=("GET", "POST")) def handle_trend(): require_all("date", "window") source_signal_pairs = parse_source_signal_pairs() + source_signal_pairs, alias_mapper = create_source_signal_alias_mapper(source_signal_pairs) + # TODO alias geo_pairs = parse_geo_pairs() time_value = parse_day_arg("date") @@ -192,7 +202,10 @@ def handle_trend(): def gen(rows): for key, group in groupby((parse_row(row, fields_string, fields_int, fields_float) for row in rows), lambda row: (row["geo_type"], row["geo_value"], row["source"], row["signal"])): - trend = compute_trend(key[0], key[1], key[2], key[3], time_value, basis_time_value, ((row["time_value"], row["value"]) for row in group)) + geo_type, geo_value, source, signal = key + if alias_mapper: + source = alias_mapper(source, signal) + trend = compute_trend(geo_type, geo_value, source, signal, time_value, basis_time_value, ((row["time_value"], row["value"]) for row in group)) yield trend.asdict() # execute first query @@ -209,6 +222,7 @@ def gen(rows): def handle_trendseries(): require_all("window") source_signal_pairs = parse_source_signal_pairs() + source_signal_pairs, alias_mapper = create_source_signal_alias_mapper(source_signal_pairs) geo_pairs = parse_geo_pairs() time_window = parse_day_range_arg("window") @@ -238,9 +252,12 @@ def handle_trendseries(): def gen(rows): for key, group in groupby((parse_row(row, fields_string, fields_int, fields_float) for row in rows), lambda row: (row["geo_type"], row["geo_value"], row["source"], row["signal"])): - trends = compute_trends(key[0], key[1], key[2], key[3], shifter, ((row["time_value"], row["value"]) for row in group)) - for trend in trends: - yield trend.asdict() + geo_type, geo_value, source, signal = key + if alias_mapper: + source = alias_mapper(source, signal) + trends = compute_trends(geo_type, geo_value, source, signal, shifter, ((row["time_value"], row["value"]) for row in group)) + for t in trends: + yield t.asdict() # execute first query try: @@ -257,6 +274,7 @@ def handle_correlation(): require_all("reference", "window", "others", "geo") reference = parse_single_source_signal_arg("reference") other_pairs = parse_source_signal_arg("others") + source_signal_pairs, alias_mapper = create_source_signal_alias_mapper(other_pairs + [reference]) geo_pairs = parse_geo_arg() time_window = parse_day_range_arg("window") lag = extract_integer("lag") @@ -272,7 +290,11 @@ def handle_correlation(): q.set_fields(fields_string, fields_int, fields_float) q.set_order("geo_type", "geo_value", "source", "signal", "time_value") - q.where_source_signal_pairs("source", "signal", other_pairs + [reference]) + q.where_source_signal_pairs( + "source", + "signal", + source_signal_pairs, + ) q.where_geo_pairs("geo_type", "geo_value", geo_pairs) q.where_time_pairs("time_type", "time_value", [TimePair("day", [time_window])]) @@ -305,6 +327,8 @@ def gen(): continue # no other signals for (source, signal), other_group in other_groups: + if alias_mapper: + source = alias_mapper(source, signal) for cor in compute_correlations(geo_type, geo_value, source, signal, lag, reference_group, other_group): yield cor.asdict() @@ -315,6 +339,7 @@ def gen(): @bp.route("/csv", methods=("GET", "POST")) def handle_export(): source, signal = request.args.get("signal", "jhu-csse:confirmed_incidence_num").split(":") + source_signal_pairs, alias_mapper = create_source_signal_alias_mapper([SourceSignalPair(source, [signal])]) start_day = request.args.get("start_day", "2020-04-01") end_day = request.args.get("end_day", "2020-09-01") geo_type = request.args.get("geo_type", "county") @@ -336,7 +361,8 @@ def handle_export(): q.set_fields(["geo_value", "signal", "time_value", "issue", "lag", "value", "stderr", "sample_size", "geo_type", "source"], [], []) q.set_order("time_value", "geo_value") - q.where(source=source, signal=signal, time_type="day") + q.where(time_type="day") + q.where_source_signal_pairs("source", "signal", source_signal_pairs) q.conditions.append("time_value BETWEEN :start_day AND :end_day") q.params["start_day"] = date_to_time_value(start_day) q.params["end_day"] = date_to_time_value(end_day) @@ -362,7 +388,7 @@ def parse_row(i, row): "stderr": row["stderr"], "sample_size": row["sample_size"], "geo_type": row["geo_type"], - "data_source": row["source"], + "data_source": alias_mapper(row["source"], row["signal"]) if alias_mapper else row["source"], } def gen(first_row, rows): @@ -394,6 +420,9 @@ def handle_backfill(): """ require_all("geo", "time", "signal") signal_pair = parse_single_source_signal_arg("signal") + source_signal_pairs, _ = create_source_signal_alias_mapper([signal_pair]) + # don't need the alias mapper since we don't return the source + time_pair = parse_single_time_arg("time") geo_pair = parse_single_geo_arg("geo") reference_anchor_lag = extract_integer("anchor_lag") # in days @@ -410,7 +439,7 @@ def handle_backfill(): q.set_order(time_value=True, issue=True) q.set_fields(fields_string, fields_int, fields_float, ["is_latest_issue"]) - q.where_source_signal_pairs("source", "signal", [signal_pair]) + q.where_source_signal_pairs("source", "signal", source_signal_pairs) q.where_geo_pairs("geo_type", "geo_value", [geo_pair]) q.where_time_pairs("time_type", "time_value", [time_pair]) @@ -463,31 +492,79 @@ def handle_meta(): similar to /covidcast_meta but in a structured optimized JSON form for the app """ - signal = parse_source_signal_arg("signal") + filter_signal = parse_source_signal_arg("signal") + flags = ",".join(request.values.getlist("flags")).split(",") + filter_smoothed: Optional[bool] = None + filter_weighted: Optional[bool] = None + filter_cumulative: Optional[bool] = None + filter_active: Optional[bool] = None + filter_time_type: Optional[TimeType] = None + + if "smoothed" in flags: + filter_smoothed = True + elif "not_smoothed" in flags: + filter_smoothed = False + if "weighted" in flags: + filter_weighted = True + elif "not_weighted" in flags: + filter_weighted = False + if "cumulative" in flags: + filter_cumulative = True + elif "not_cumulative" in flags: + filter_cumulative = False + if "active" in flags: + filter_active = True + elif "inactive" in flags: + filter_active = False + if "day" in flags: + filter_active = TimeType.day + elif "week" in flags: + filter_active = TimeType.week row = db.execute(text("SELECT epidata FROM covidcast_meta_cache LIMIT 1")).fetchone() data = loads(row["epidata"]) if row and row["epidata"] else [] - all_signals: AllSignalsMap = {} + by_signal: Dict[Tuple[str, str], List[Dict[str, Any]]] = {} for row in data: - if row["time_type"] != "day": - continue - entry: Set[str] = all_signals.setdefault(row["data_source"], set()) - entry.add(row["signal"]) + entry = by_signal.setdefault((row["data_source"], row["signal"]), []) + entry.append(row) - out: Dict[str, CovidcastMetaEntry] = {} - for row in data: - if row["time_type"] != "day": + sources: List[Dict[str, Any]] = [] + for source in data_sources: + if filter_active is not None and source.active != filter_active: continue - if signal and all((not s.matches(row["data_source"], row["signal"]) for s in signal)): + + meta_signals: List[Dict[str, Any]] = [] + + for signal in source.signals: + if filter_signal and all((not s.matches(signal.source, signal.signal) for s in filter_signal)): + continue + if filter_smoothed is not None and signal.is_smoothed != filter_smoothed: + continue + if filter_weighted is not None and signal.is_weighted != filter_weighted: + continue + if filter_cumulative is not None and signal.is_cumulative != filter_cumulative: + continue + if filter_time_type is not None and signal.time_type != filter_time_type: + continue + meta_data = by_signal.get(signal.key) + if not meta_data: + continue + row = meta_data[0] + entry = CovidcastMetaEntry(signal, row["min_time"], row["max_time"], row["max_issue"]) + for row in meta_data: + entry.intergrate(row) + meta_signals.append(entry.asdict()) + + if not meta_signals: # none found or no signals continue - entry = out.setdefault( - f"{row['data_source']}:{row['signal']}", CovidcastMetaEntry(row["data_source"], row["signal"], row["min_time"], row["max_time"], row["max_issue"], {}, all_signals=all_signals) - ) - entry.intergrate(row) - return jsonify([r.asdict() for r in out.values()]) + s = source.asdict() + s["signals"] = meta_signals + sources.append(s) + + return jsonify(sources) @bp.route("/coverage", methods=("GET", "POST")) @@ -496,7 +573,8 @@ def handle_coverage(): similar to /signal_dashboard_coverage for a specific signal returns the coverage (number of locations for a given geo_type) """ - signal = parse_source_signal_pairs() + source_signal_pairs = parse_source_signal_pairs() + source_signal_pairs, alias_mapper = create_source_signal_alias_mapper(source_signal_pairs) geo_type = request.args.get("geo_type", "county") if "window" in request.values: time_window = parse_day_range_arg("window") @@ -523,14 +601,20 @@ def handle_coverage(): q.conditions.append('geo_value not like "%000"') else: q.where(geo_type=geo_type) - q.where_source_signal_pairs("source", "signal", signal) + q.where_source_signal_pairs("source", "signal", source_signal_pairs) q.where_time_pairs("time_type", "time_value", [TimePair("day", [time_window])]) q.group_by = "c.source, c.signal, c.time_value" q.set_order("source", "signal", "time_value") _handle_lag_issues_as_of(q, None, None, None) - return execute_query(q.query, q.params, fields_string, fields_int, []) + def transform_row(row, _): + if not alias_mapper: + return row + row["source"] = alias_mapper(row["source"], row["signal"]) + return row + + return execute_query(q.query, q.params, fields_string, fields_int, [], transform=transform_row) @bp.route("/anomalies", methods=("GET", "POST")) @@ -539,8 +623,6 @@ def handle_anomalies(): proxy to the excel sheet about data anomalies """ - signal = parse_source_signal_arg("signal") - df = read_csv( "https://docs.google.com/spreadsheets/d/e/2PACX-1vToGcf9x5PNJg-eSrxadoR5b-LM2Cqs9UML97587OGrIX0LiQDcU1HL-L2AA8o5avbU7yod106ih0_n/pub?gid=0&single=true&output=csv", skip_blank_lines=True ) diff --git a/src/server/endpoints/covidcast_utils/__init__.py b/src/server/endpoints/covidcast_utils/__init__.py index dcb9bfd16..965b62cf0 100644 --- a/src/server/endpoints/covidcast_utils/__init__.py +++ b/src/server/endpoints/covidcast_utils/__init__.py @@ -1,3 +1,3 @@ from .trend import compute_trend, compute_trend_value, compute_trends from .correlation import compute_correlations -from .meta import CovidcastMetaEntry, AllSignalsMap \ No newline at end of file +from .meta import CovidcastMetaEntry \ No newline at end of file diff --git a/src/server/endpoints/covidcast_utils/db_signals.csv b/src/server/endpoints/covidcast_utils/db_signals.csv new file mode 100644 index 000000000..a730d11a9 --- /dev/null +++ b/src/server/endpoints/covidcast_utils/db_signals.csv @@ -0,0 +1,391 @@ +Source Subdivision,Signal BaseName,base_is_other,Signal,Compute From Base,Name,Short Description,Description,Time Type,Time Label,Value Label,Format,Category,High Values Are,Is Smoothed,Is Weighted,Is Cumulative,Has StdErr,Has Sample Size,Link +chng-cli,smoothed_outpatient_cli,FALSE,smoothed_outpatient_cli,FALSE,COVID-Related Doctor Visits,Estimated percentage of outpatient doctor visits primarily about COVID-related symptoms,"Estimated percentage of outpatient doctor visits primarily about COVID-related symptoms, based on Change Healthcare claims data that has been de-identified in accordance with HIPAA privacy regulations, smoothed in time using a Gaussian linear smoother",day,Date,Value,raw,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +chng-cli,smoothed_outpatient_cli,TRUE,smoothed_adj_outpatient_cli,FALSE,COVID-Related Doctor Visits (Day-adjusted),,"{base_description}, and adjusted to reduce day-of-week effects",day,Date,Value,raw,late,bad,TRUE,TRUE,FALSE,FALSE,FALSE, +chng-covid,smoothed_outpatient_covid,FALSE,smoothed_outpatient_covid,FALSE,COVID-Confirmed Doctor Visits,COVID-Confirmed Doctor Visits,"Estimated percentage of outpatient doctor visits with confirmed COVID-19, based on Change Healthcare claims data that has been de-identified in accordance with HIPAA privacy regulations, smoothed in time using a Gaussian linear smoother ",day,Date,Value,raw,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +chng-covid,smoothed_outpatient_covid,TRUE,smoothed_adj_outpatient_covid,FALSE,COVID-Confirmed Doctor Visits (Day-adjusted),,"{base_description}, and adjusted to reduce day-of-week effects",day,Date,Value,raw,late,bad,TRUE,TRUE,FALSE,FALSE,TRUE, +covid-act-now,pcr_specimen_positivity_rate,FALSE,pcr_specimen_positivity_rate,FALSE,PCR Test Positivity Rate,Proportion of PCR specimens tested that have a positive result,,day,Date,Value,fraction,other,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +covid-act-now,pcr_specimen_total_tests,FALSE,pcr_specimen_total_tests,FALSE,Total Number of PCR Tests,Total number of PCR specimens tested,,day,Date,Value,count,other,good,FALSE,FALSE,FALSE,FALSE,FALSE, +doctor-visits,smoothed_cli,FALSE,smoothed_cli,FALSE,COVID-Related Doctor Visits,Percentage of daily doctor visits that are due to COVID-like symptoms,"Estimated percentage of outpatient doctor visits that are primarily about COVID-related symptoms, based on data from health system partners, smoothed in time using a Gaussian linear smoother",day,Date,Percentage,percent,early,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +doctor-visits,smoothed_cli,TRUE,smoothed_adj_cli,FALSE,COVID-Related Doctor Visits (Day-adjusted),,"{base_description}, and adjusted to reduce day-of-week effects",day,Date,Percentage,percent,early,bad,TRUE,TRUE,FALSE,FALSE,FALSE, +fb-survey,raw_cli,FALSE,raw_cli,FALSE,COVID-Like Symptoms,Estimated percentage of people with COVID-like illness ,"{source_description} For this signal, we estimate the percentage of people self-reporting COVID-like symptoms, defined here as fever along with either cough, shortness of breath, or difficulty breathing. While many other conditions can cause these symptoms, comparing the rates of COVID-like symptoms across the country can suggest where COVID is most active.",day,Date,Percentage,percent,early,bad,FALSE,FALSE,FALSE,TRUE,TRUE, +fb-survey,raw_cli,TRUE,raw_wcli,FALSE,,,,day,Date,Percentage,percent,public,bad,FALSE,TRUE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#ili-and-cli-indicators +fb-survey,raw_cli,TRUE,smoothed_cli,FALSE,,,,day,Date,Percentage,percent,early,bad,TRUE,FALSE,FALSE,TRUE,TRUE, +fb-survey,raw_cli,TRUE,smoothed_wcli,FALSE,,,,day,Date,Percentage,percent,public,bad,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,raw_hh_cmnty_cli,FALSE,raw_hh_cmnty_cli,FALSE,COVID-Like Symptoms in Community,Estimated percentage of people reporting illness in their local community,"{source_description} We also ask them if they know anyone in their local community who has COVID-like symptoms, defined here as fever along with either cough, shortness of breath, or difficulty breathing. For this indicator, we estimate the percentage of people who know someone, in their household or outside it, who has these symptoms. While many conditions can cause these symptoms, not just COVID, comparing the rates across the country can suggest where COVID is most active.",day,Date,Percentage,percent,early,bad,FALSE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#ili-and-cli-indicators +fb-survey,raw_hh_cmnty_cli,TRUE,raw_whh_cmnty_cli,FALSE,,,,day,Date,Percentage,percent,early,bad,FALSE,TRUE,FALSE,TRUE,TRUE, +fb-survey,raw_hh_cmnty_cli,TRUE,smoothed_hh_cmnty_cli,FALSE,,,,day,Date,Percentage,percent,early,bad,TRUE,FALSE,FALSE,TRUE,TRUE, +fb-survey,raw_hh_cmnty_cli,TRUE,smoothed_whh_cmnty_cli,FALSE,,,,day,Date,Percentage,percent,early,bad,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,raw_ili,FALSE,raw_ili,FALSE,Flu-Like Symptoms,Estimated percentage of people with influenza-like illness ,"{source_description} For this signal, we estimate the percentage of people self-reporting influenza-like symptoms, defined here as fever along with either cough or sore throat. While many other conditions can cause these symptoms, comparing the rates of influenza-like symptoms across the country can suggest where the flu is most active.",day,Date,Percentage,percent,early,bad,FALSE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#ili-and-cli-indicators +fb-survey,raw_ili,TRUE,raw_wili,FALSE,,,,day,Date,Percentage,percent,public,bad,FALSE,TRUE,FALSE,TRUE,TRUE, +fb-survey,raw_ili,TRUE,smoothed_ili,FALSE,,,,day,Date,Percentage,percent,early,bad,TRUE,FALSE,FALSE,TRUE,TRUE, +fb-survey,raw_ili,TRUE,smoothed_wili,FALSE,,,,day,Date,Percentage,percent,public,bad,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,raw_nohh_cmnty_cli,FALSE,raw_nohh_cmnty_cli,FALSE,COVID-Like Symptoms in Community Outside Household,Estimated percentage of people reporting illness in their local community not including their household,"{source_description} We also ask them if they know anyone in their local community who has COVID-like symptoms, defined here as fever along with either cough, shortness of breath, or difficulty breathing. For this indicator, we estimate the percentage of people who know someone outside their household who has these symptoms. While many conditions can cause these symptoms, not just COVID, comparing the rates across the country can suggest where COVID is most active.",day,Date,Percentage,percent,early,bad,FALSE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#ili-and-cli-indicators +fb-survey,raw_nohh_cmnty_cli,TRUE,raw_wnohh_cmnty_cli,FALSE,,,,day,Date,Percentage,percent,early,bad,FALSE,TRUE,FALSE,TRUE,TRUE, +fb-survey,raw_nohh_cmnty_cli,TRUE,smoothed_nohh_cmnty_cli,FALSE,,,,day,Date,Percentage,percent,early,bad,TRUE,FALSE,FALSE,TRUE,TRUE, +fb-survey,raw_nohh_cmnty_cli,TRUE,smoothed_wnohh_cmnty_cli,FALSE,,,,day,Date,Percentage,percent,early,bad,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_accept_covid_vaccine,FALSE,smoothed_accept_covid_vaccine,FALSE,COVID-19 Vaccine Acceptance,"Estimated percentage of respondents who would definitely or probably choose to get vaccinated, if a COVID-19 vaccine were offered to them today.","{source_description} We also ask questions about well-being and various mitigation measures, including vaccine acceptance. For this signal, we estimate the percentage of people who would “definitely” or “probably” choose to be vaccinated if a COVID vaccine were offered to them today. + +Note: Until January 6, 2021, all respondents answered this question; beginning on that date, only respondents who said they have not received a COVID vaccine are asked this question. + +Discontinued as of Wave 11, May 19, 2021.",day,Date,Percentage,percent,public,good,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#vaccination-indicators +fb-survey,smoothed_accept_covid_vaccine,TRUE,smoothed_waccept_covid_vaccine,FALSE,,,,day,Date,Percentage,percent,public,good,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_anxious_5d,FALSE,smoothed_anxious_5d,FALSE,Anxious (Last Five Days),"Estimated percentage of respondents who reported feeling ""nervous, anxious, or on edge"" for most or all of the past 5 days.","{short_description} + +Discontinued as of Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,bad,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#mental-health-indicators +fb-survey,smoothed_anxious_5d,TRUE,smoothed_wanxious_5d,FALSE,,,,day,Date,Percentage,percent,public,bad,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_anxious_7d,FALSE,smoothed_anxious_7d,FALSE,Anxious (Last Seven Days),"Estimated percentage of respondents who reported feeling ""nervous, anxious, or on edge"" for most or all of the past 7 days.","{short_description} + +This item was shown to respondents starting in Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,bad,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#mental-health-indicators +fb-survey,smoothed_anxious_7d,TRUE,smoothed_wanxious_7d,FALSE,,,,day,Date,Percentage,percent,public,bad,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_covid_vaccinated,FALSE,smoothed_covid_vaccinated,FALSE,COVID-19 Vaccinated,Estimated percentage of respondents who have already received a vaccine for COVID-19.,"{short_description} + +Note: The Centers for Disease Control compiles data on vaccine administration across the United States. This signal may differ from CDC data because of survey biases and should not be treated as authoritative. However, the survey signal is not subject to the lags and reporting problems in official vaccination data.",day,Date,Percentage,percent,public,good,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#vaccination-indicators +fb-survey,smoothed_covid_vaccinated,TRUE,smoothed_wcovid_vaccinated,FALSE,,,,day,Date,Percentage,percent,public,good,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_covid_vaccinated_or_accept,FALSE,smoothed_covid_vaccinated_or_accept,FALSE,COVID-19 Vaccinated or Vaccine Acceptance,"Estimated percentage of respondents who either have already received a COVID vaccine or would definitely or probably choose to get vaccinated, if a vaccine were offered to them today.","{short_description} + +Discontinued as of Wave 11, May 19, 2021.",day,Date,Percentage,percent,public,good,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#vaccination-indicators +fb-survey,smoothed_covid_vaccinated_or_accept,TRUE,smoothed_wcovid_vaccinated_or_accept,FALSE,,,,day,Date,Percentage,percent,public,good,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_depressed_5d,FALSE,smoothed_depressed_5d,FALSE,Depressed (Last Five Days),Estimated percentage of respondents who reported feeling depressed for most or all of the past 5 days.,"{short_description} + +Discontinued as of Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,bad,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#mental-health-indicators +fb-survey,smoothed_depressed_5d,TRUE,smoothed_wdepressed_5d,FALSE,,,,day,Date,Percentage,percent,public,bad,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_depressed_7d,FALSE,smoothed_depressed_7d,FALSE,Depressed (Last Seven Days),Estimated percentage of respondents who reported feeling depressed for most or all of the past 7 days.,"{short_description} + +This item was shown to respondents starting in Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,bad,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#mental-health-indicators +fb-survey,smoothed_depressed_7d,TRUE,smoothed_wdepressed_7d,FALSE,,,,day,Date,Percentage,percent,public,bad,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_dontneed_reason_dont_spend_time,FALSE,smoothed_dontneed_reason_dont_spend_time,FALSE,Vaccine Not Needed: Do Not Spend Time,Estimated percentage of respondents who say they don't need to get a COVID-19 vaccine because they don't spend time with high-risk people,"{short_description}, among respondents who provided at least one reason for why they believe a COVID-19 vaccine is unnecessary.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-believing-vaccine-is-unnecessary +fb-survey,smoothed_dontneed_reason_dont_spend_time,TRUE,smoothed_wdontneed_reason_dont_spend_time,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_dontneed_reason_had_covid,FALSE,smoothed_dontneed_reason_had_covid,FALSE,Vaccine Not Needed: Had Covid,Estimated percentage of respondents who say they don't need to get a COVID-19 vaccine because they already had the illness,"{short_description}, among respondents who provided at least one reason for why they believe a COVID-19 vaccine is unnecessary.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-believing-vaccine-is-unnecessary +fb-survey,smoothed_dontneed_reason_had_covid,TRUE,smoothed_wdontneed_reason_had_covid,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_dontneed_reason_not_beneficial,FALSE,smoothed_dontneed_reason_not_beneficial,FALSE,Vaccine Not Needed: Not Beneficial,Estimated percentage of respondents who say they don't need to get a COVID-19 vaccine because they don't think vaccines are beneficial,"{short_description}, among respondents who provided at least one reason for why they believe a COVID-19 vaccine is unnecessary.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-believing-vaccine-is-unnecessary +fb-survey,smoothed_dontneed_reason_not_beneficial,TRUE,smoothed_wdontneed_reason_not_beneficial,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_dontneed_reason_not_high_risk,FALSE,smoothed_dontneed_reason_not_high_risk,FALSE,Vaccine Not Needed: Not High Risk,Estimated percentage of respondents who say they don't need to get a COVID-19 vaccine because they are not in a high-risk group,"{short_description}, among respondents who provided at least one reason for why they believe a COVID-19 vaccine is unnecessary.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-believing-vaccine-is-unnecessary +fb-survey,smoothed_dontneed_reason_not_high_risk,TRUE,smoothed_wdontneed_reason_not_high_risk,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_dontneed_reason_not_serious,FALSE,smoothed_dontneed_reason_not_serious,FALSE,Vaccine Not Needed: Not Serious,Estimated percentage of respondents who say they don't need to get a COVID-19 vaccine because they don't believe COVID-19 is a serious illness,"{short_description}, among respondents who provided at least one reason for why they believe a COVID-19 vaccine is unnecessary.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-believing-vaccine-is-unnecessary +fb-survey,smoothed_dontneed_reason_not_serious,TRUE,smoothed_wdontneed_reason_not_serious,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_dontneed_reason_other,FALSE,smoothed_dontneed_reason_other,FALSE,Vaccine Not Needed: Other,Estimated percentage of respondents who say they don't need to get a COVID-19 vaccine for another reason,"{short_description}, among respondents who provided at least one reason for why they believe a COVID-19 vaccine is unnecessary.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-believing-vaccine-is-unnecessary +fb-survey,smoothed_dontneed_reason_other,TRUE,smoothed_wdontneed_reason_other,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_dontneed_reason_precautions,FALSE,smoothed_dontneed_reason_precautions,FALSE,Vaccine Not Needed: Precautions,"Estimated percentage of respondents who say they don't need to get a COVID-19 vaccine because they will use other precautions, such as a mask, instead","{short_description}, among respondents who provided at least one reason for why they believe a COVID-19 vaccine is unnecessary.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-believing-vaccine-is-unnecessary +fb-survey,smoothed_dontneed_reason_precautions,TRUE,smoothed_wdontneed_reason_precautions,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_felt_isolated_5d,FALSE,smoothed_felt_isolated_5d,FALSE,Felt Isolated (Last Five Days),"Estimated percentage of respondents who reported feeling ""isolated from others"" for most or all of the past 5 days.","{short_description} + +Discontinued as of Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,bad,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#mental-health-indicators +fb-survey,smoothed_felt_isolated_5d,TRUE,smoothed_wfelt_isolated_5d,FALSE,,,,day,Date,Percentage,percent,public,bad,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_felt_isolated_7d,FALSE,smoothed_felt_isolated_7d,FALSE,Felt Isolated (Last Seven Days),"Estimated percentage of respondents who reported feeling ""isolated from others"" for most or all of the past 7 days.","{short_description} + +This item was shown to respondents starting in Wave 10, March 2, 2021. + +Discontinued as of Wave 11, May 19, 2021.",day,Date,Percentage,percent,public,bad,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#mental-health-indicators +fb-survey,smoothed_felt_isolated_7d,TRUE,smoothed_wfelt_isolated_7d,FALSE,,,,day,Date,Percentage,percent,public,bad,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_hesitancy_reason_allergic,FALSE,smoothed_hesitancy_reason_allergic,FALSE,Vaccine Hesitancy: Allergic,Estimated percentage of respondents who say they are hesitant to get vaccinated because they are worried about having an allergic reaction,"{short_description}, among respondents who answered ""Yes, probably"", ""No, probably not"", or ""No, definitely not"" when asked if they would get vaccinated if offered. + +This item was shown to respondents starting in Wave 8, February 8, 2021. + +Discontinued as of Wave 11, May 19, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-hesitancy +fb-survey,smoothed_hesitancy_reason_allergic,TRUE,smoothed_whesitancy_reason_allergic,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_hesitancy_reason_cost,FALSE,smoothed_hesitancy_reason_cost,FALSE,Vaccine Hesitancy: Cost,Estimated percentage of respondents who say they are hesitant to get vaccinated because they are worried about the cost,"{short_description}, among respondents who answered ""Yes, probably"", ""No, probably not"", or ""No, definitely not"" when asked if they would get vaccinated if offered. + +This item was shown to respondents starting in Wave 8, February 8, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-hesitancy +fb-survey,smoothed_hesitancy_reason_cost,TRUE,smoothed_whesitancy_reason_cost,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_hesitancy_reason_dislike_vaccines,FALSE,smoothed_hesitancy_reason_dislike_vaccines,FALSE,Vaccine Hesitancy: Dislike Vaccines,Estimated percentage of respondents who say they are hesitant to get vaccinated because they dislike vaccines,"{short_description}, among respondents who answered ""Yes, probably"", ""No, probably not"", or ""No, definitely not"" when asked if they would get vaccinated if offered. + +This item was shown to respondents starting in Wave 8, February 8, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-hesitancy +fb-survey,smoothed_hesitancy_reason_dislike_vaccines,TRUE,smoothed_whesitancy_reason_dislike_vaccines,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_hesitancy_reason_distrust_gov,FALSE,smoothed_hesitancy_reason_distrust_gov,FALSE,Vaccine Hesitancy: Distrust Government,Estimated percentage of respondents who say they are hesitant to get vaccinated because they don't trust the government,"{short_description}, among respondents who answered ""Yes, probably"", ""No, probably not"", or ""No, definitely not"" when asked if they would get vaccinated if offered. + +This item was shown to respondents starting in Wave 8, February 8, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-hesitancy +fb-survey,smoothed_hesitancy_reason_distrust_gov,TRUE,smoothed_whesitancy_reason_distrust_gov,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_hesitancy_reason_distrust_vaccines,FALSE,smoothed_hesitancy_reason_distrust_vaccines,FALSE,Vaccine Hesitancy: Distrust Vaccines,Estimated percentage of respondents who say they are hesitant to get vaccinated because they don't trust COVID-19 vaccines,"{short_description}, among respondents who answered ""Yes, probably"", ""No, probably not"", or ""No, definitely not"" when asked if they would get vaccinated if offered. + +This item was shown to respondents starting in Wave 8, February 8, 2021. + +Discontinued as of Wave 11, May 19, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-hesitancy +fb-survey,smoothed_hesitancy_reason_distrust_vaccines,TRUE,smoothed_whesitancy_reason_distrust_vaccines,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_hesitancy_reason_health_condition,FALSE,smoothed_hesitancy_reason_health_condition,FALSE,Vaccine Hesitancy: Health Condition,Estimated percentage of respondents who say they are hesitant to get vaccinated because they have a health condition that may impact the safety of a COVID-19 vaccine,"{short_description}, among respondents who answered ""Yes, probably"", ""No, probably not"", or ""No, definitely not"" when asked if they would get vaccinated if offered. + +This item was shown to respondents starting in Wave 8, February 8, 2021. + +Discontinued as of Wave 11, May 19, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-hesitancy +fb-survey,smoothed_hesitancy_reason_health_condition,TRUE,smoothed_whesitancy_reason_health_condition,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_hesitancy_reason_ineffective,FALSE,smoothed_hesitancy_reason_ineffective,FALSE,Vaccine Hesitancy: Ineffective,Estimated percentage of respondents who say they are hesitant to get vaccinated because they don't know if a COVID-19 vaccine will work,"{short_description}, among respondents who answered ""Yes, probably"", ""No, probably not"", or ""No, definitely not"" when asked if they would get vaccinated if offered. + +This item was shown to respondents starting in Wave 8, February 8, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-hesitancy +fb-survey,smoothed_hesitancy_reason_ineffective,TRUE,smoothed_whesitancy_reason_ineffective,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_hesitancy_reason_low_priority,FALSE,smoothed_hesitancy_reason_low_priority,FALSE,Vaccine Hesitancy: Low Priority,Estimated percentage of respondents who say they are hesitant to get vaccinated because they think other people need it more than they do,"{short_description}, among respondents who answered ""Yes, probably"", ""No, probably not"", or ""No, definitely not"" when asked if they would get vaccinated if offered. + +This item was shown to respondents starting in Wave 8, February 8, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-hesitancy +fb-survey,smoothed_hesitancy_reason_low_priority,TRUE,smoothed_whesitancy_reason_low_priority,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_hesitancy_reason_not_recommended,FALSE,smoothed_hesitancy_reason_not_recommended,FALSE,Vaccine Hesitancy: Not Recommended,Estimated percentage of respondents who say they are hesitant to get vaccinated because their doctor did not recommend it,"{short_description}, among respondents who answered ""Yes, probably"", ""No, probably not"", or ""No, definitely not"" when asked if they would get vaccinated if offered. + +This item was shown to respondents starting in Wave 8, February 8, 2021. + +Discontinued as of Wave 11, May 19, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-hesitancy +fb-survey,smoothed_hesitancy_reason_not_recommended,TRUE,smoothed_whesitancy_reason_not_recommended,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_hesitancy_reason_other,FALSE,smoothed_hesitancy_reason_other,FALSE,Vaccine Hesitancy: Other,Estimated percentage of respondents who say they are hesitant to get vaccinated for another reason,"{short_description}, among respondents who answered ""Yes, probably"", ""No, probably not"", or ""No, definitely not"" when asked if they would get vaccinated if offered. + +This item was shown to respondents starting in Wave 8, February 8, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-hesitancy +fb-survey,smoothed_hesitancy_reason_other,TRUE,smoothed_whesitancy_reason_other,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_hesitancy_reason_pregnant,FALSE,smoothed_hesitancy_reason_pregnant,FALSE,Vaccine Hesitancy: Pregnant,Estimated percentage of respondents who say they are hesitant to get vaccinated because they are pregnant or breastfeeding,"{short_description}, among respondents who answered ""Yes, probably"", ""No, probably not"", or ""No, definitely not"" when asked if they would get vaccinated if offered. + +This item was shown to respondents starting in Wave 8, February 8, 2021. + +Discontinued as of Wave 11, May 19, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-hesitancy +fb-survey,smoothed_hesitancy_reason_pregnant,TRUE,smoothed_whesitancy_reason_pregnant,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_hesitancy_reason_religious,FALSE,smoothed_hesitancy_reason_religious,FALSE,Vaccine Hesitancy: Religious,Estimated percentage of respondents who say they are hesitant to get vaccinated because it is against their religious beliefs,"{short_description}, among respondents who answered ""Yes, probably"", ""No, probably not"", or ""No, definitely not"" when asked if they would get vaccinated if offered. + +This item was shown to respondents starting in Wave 8, February 8, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-hesitancy +fb-survey,smoothed_hesitancy_reason_religious,TRUE,smoothed_whesitancy_reason_religious,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_hesitancy_reason_sideeffects,FALSE,smoothed_hesitancy_reason_sideeffects,FALSE,Vaccine Hesitancy: Side Effects,Estimated percentage of respondents who say they are hesitant to get vaccinated because they are worried about side effects,"{short_description}, among respondents who answered ""Yes, probably"", ""No, probably not"", or ""No, definitely not"" when asked if they would get vaccinated if offered. + +This item was shown to respondents starting in Wave 8, February 8, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-hesitancy +fb-survey,smoothed_hesitancy_reason_sideeffects,TRUE,smoothed_whesitancy_reason_sideeffects,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_hesitancy_reason_unnecessary,FALSE,smoothed_hesitancy_reason_unnecessary,FALSE,Vaccine Hesitancy: Unnecessary,Estimated percentage of respondents who say they are hesitant to get vaccinated because they don't believe they need a COVID-19 vaccine,"{short_description}, among respondents who answered ""Yes, probably"", ""No, probably not"", or ""No, definitely not"" when asked if they would get vaccinated if offered. + +This item was shown to respondents starting in Wave 8, February 8, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-hesitancy +fb-survey,smoothed_hesitancy_reason_unnecessary,TRUE,smoothed_whesitancy_reason_unnecessary,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_hesitancy_reason_wait_safety,FALSE,smoothed_hesitancy_reason_wait_safety,FALSE,Vaccine Hesitancy: Wait For Safety,Estimated percentage of respondents who say they are hesitant to get vaccinated because they want to wait to see if the COVID-19 vaccines are safe,"{short_description}, among respondents who answered ""Yes, probably"", ""No, probably not"", or ""No, definitely not"" when asked if they would get vaccinated if offered. + +This item was shown to respondents starting in Wave 8, February 8, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-hesitancy +fb-survey,smoothed_hesitancy_reason_wait_safety,TRUE,smoothed_whesitancy_reason_wait_safety,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_inperson_school_fulltime,FALSE,smoothed_inperson_school_fulltime,FALSE,In-person School Full-time,Estimated percentage of people who had any children attending in-person school on a full-time basis,"{short_description}, among people reporting any pre-K-grade 12 children in their household.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#schooling-indicators +fb-survey,smoothed_inperson_school_fulltime,TRUE,smoothed_winperson_school_fulltime,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_inperson_school_parttime,FALSE,smoothed_inperson_school_parttime,FALSE,In-person School Part-time,Estimated percentage of people who had any children attending in-person school on a part-time basis,"{short_description}, among people reporting any pre-K-grade 12 children in their household.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#schooling-indicators +fb-survey,smoothed_inperson_school_parttime,TRUE,smoothed_winperson_school_parttime,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_large_event_1d,FALSE,smoothed_large_event_1d,FALSE,Large Event (Last 24 Hours),"Estimated percentage of respondents who ""attended an event with more than 10 people"" in the past 24 hours","{short_description}. + +This item was shown to respondents starting in Wave 4, September 8, 2020. + +Discontinued as of Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#social-distancing-and-travel +fb-survey,smoothed_large_event_1d,TRUE,smoothed_wlarge_event_1d,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_large_event_indoors_1d,FALSE,smoothed_large_event_indoors_1d,FALSE,Large Event Indoors (Last 24 Hours),"Estimated percentage of respondents who ""attended an indoor event with more than 10 people"" in the past 24 hours","{short_description}. + +This item was shown to respondents starting in Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#social-distancing-and-travel +fb-survey,smoothed_large_event_indoors_1d,TRUE,smoothed_wlarge_event_indoors_1d,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_others_masked,FALSE,smoothed_others_masked,FALSE,Other People Wearing Masks,Estimated percentage of people who wore a mask for most or all of the time while in public in the past 7 days; those not in public in the past 7 days are not counted. ,"{short_description} + +This item was shown to respondents starting in Wave 5, November 24, 2020. + +Discontinued as of Wave 11, May 19, 2021.",day,Date,Percentage,percent,public,good,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#mask-use +fb-survey,smoothed_others_masked,TRUE,smoothed_wothers_masked,FALSE,,,,day,Date,Percentage,percent,public,good,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_public_transit_1d,FALSE,smoothed_public_transit_1d,FALSE,Public Transit (Last 24 Hours),"Estimated percentage of respondents who ""used public transit"" in the past 24 hours ","{short_description} + +This item was shown to respondents starting in Wave 4, September 8, 2020.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#social-distancing-and-travel +fb-survey,smoothed_public_transit_1d,TRUE,smoothed_wpublic_transit_1d,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_received_2_vaccine_doses,FALSE,smoothed_received_2_vaccine_doses,FALSE,Received 2 Vaccine Doses,Estimated percentage of respondents who have received two doses of a COVID-19 vaccine,"{short_description}, among respondents who have received either one or two doses of a COVID-19 vaccine. + +This item was shown to respondents starting in Wave 7, January 12, 2021.",day,Date,Percentage,percent,public,good,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#vaccination-indicators +fb-survey,smoothed_received_2_vaccine_doses,TRUE,smoothed_wreceived_2_vaccine_doses,FALSE,,,,day,Date,Percentage,percent,public,good,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_restaurant_1d,FALSE,smoothed_restaurant_1d,FALSE,Restaurant (Last 24 Hours),"Estimated percentage of respondents who went to a ""bar, restaurant, or cafe"" in the past 24 hours","{short_description}. + +This item was shown to respondents starting in Wave 4, September 8, 2020. + +Discontinued as of Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#social-distancing-and-travel +fb-survey,smoothed_restaurant_1d,TRUE,smoothed_wrestaurant_1d,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_restaurant_indoors_1d,FALSE,smoothed_restaurant_indoors_1d,FALSE,Restaurant Indoors (Last 24 Hours),"Estimated percentage of respondents who went to an indoor ""bar, restaurant, or cafe"" in the past 24 hours","{short_description}. + +This item was shown to respondents starting in Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#social-distancing-and-travel +fb-survey,smoothed_restaurant_indoors_1d,TRUE,smoothed_wrestaurant_indoors_1d,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_screening_tested_positive_14d,FALSE,smoothed_screening_tested_positive_14d,FALSE,Screening Tested Positive (Last 14 Days),Estimated test positivity rate (percent) among people tested for COVID-19 in the past 14 days,"{short_description} who were being screened with no symptoms or known exposure. + +Note: Until Wave 11 (May 19, 2021), this included people who said they were tested while receiving other medical care, because their employer or school required it, after attending a large outdoor gathering, or prior to visiting friends or family. After that date, this includes people who said they were tested while receiving other medical care, because their employer or school required it, prior to visiting friends or family, or prior to domestic or international travel.",day,Date,Percentage,percent,public,bad,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#testing-indicators +fb-survey,smoothed_screening_tested_positive_14d,TRUE,smoothed_wscreening_tested_positive_14d,FALSE,,,,day,Date,Percentage,percent,public,bad,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_shop_1d,FALSE,smoothed_shop_1d,FALSE,Shop (Last 24 Hours),"Estimated percentage of respondents who went to a ""market, grocery store, or pharmacy"" in the past 24 hours","{short_description} + +Discontinued as of Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#social-distancing-and-travel +fb-survey,smoothed_shop_1d,TRUE,smoothed_wshop_1d,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_shop_indoors_1d,FALSE,smoothed_shop_indoors_1d,FALSE,Shop Indoors (Last 24 Hours),"Estimated percentage of respondents who went to an ""indoor market, grocery store, or pharmacy"" in the past 24 hours","{short_description} + +This item was shown to respondents starting in Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#social-distancing-and-travel +fb-survey,smoothed_shop_indoors_1d,TRUE,smoothed_wshop_indoors_1d,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_spent_time_1d,FALSE,smoothed_spent_time_1d,FALSE,Spent Time (Last 24 Hours),"Estimated percentage of respondents who ""spent time with someone who isn't currently staying with you"" in the past 24 hours","{short_description} + +Discontinued as of Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#social-distancing-and-travel +fb-survey,smoothed_spent_time_1d,TRUE,smoothed_wspent_time_1d,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_spent_time_indoors_1d,FALSE,smoothed_spent_time_indoors_1d,FALSE,Spent Time Indoors (Last 24 Hours),"Estimated percentage of respondents who ""spent time indoors with someone who isn't currently staying with you"" in the past 24 hours","{short_description} + +This item was shown to respondents starting in Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#social-distancing-and-travel +fb-survey,smoothed_spent_time_indoors_1d,TRUE,smoothed_wspent_time_indoors_1d,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_tested_14d,FALSE,smoothed_tested_14d,FALSE,Tested (Last 14 Days),"Estimated percentage of people who were tested for COVID-19 in the past 14 days, regardless of their test result",,day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#testing-indicators +fb-survey,smoothed_tested_14d,TRUE,smoothed_wtested_14d,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_tested_positive_14d,FALSE,smoothed_tested_positive_14d,FALSE,Tested Positive (Last 14 Days),Estimated test positivity rate (percent) among people tested for COVID-19 in the past 14 days,,day,Date,Percentage,percent,public,bad,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#testing-indicators +fb-survey,smoothed_tested_positive_14d,TRUE,smoothed_wtested_positive_14d,FALSE,,,,day,Date,Percentage,percent,public,bad,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_travel_outside_state_5d,FALSE,smoothed_travel_outside_state_5d,FALSE,Travel Outside State (Last 5 Days),Estimated percentage of respondents who report traveling outside their state in the past 5 days,"{short_description} + +Discontinued as of Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#social-distancing-and-travel +fb-survey,smoothed_travel_outside_state_5d,TRUE,smoothed_wtravel_outside_state_5d,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_travel_outside_state_7d,FALSE,smoothed_travel_outside_state_7d,FALSE,Travel Outside State (Last 7 Days),Estimated percentage of respondents who report traveling outside their state in the past 7 days.,"{short_description} + +This item was shown to respondents starting in Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#social-distancing-and-travel +fb-survey,smoothed_travel_outside_state_7d,TRUE,smoothed_wtravel_outside_state_7d,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_vaccine_likely_doctors,FALSE,smoothed_vaccine_likely_doctors,FALSE,Vaccine Likely: Doctors,Estimated percentage of respondents who would be more likely to get a COVID-19 vaccine if it were recommended to them by doctors and other health professionals they go to for medical care,"{short_description}, among respondents who have not yet been vaccinated. + +Discontinued as of Wave 11, May 19, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#outreach-and-image +fb-survey,smoothed_vaccine_likely_doctors,TRUE,smoothed_wvaccine_likely_doctors,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_vaccine_likely_friends,FALSE,smoothed_vaccine_likely_friends,FALSE,Vaccine Likely: Friends,Estimated percentage of respondents who would be more likely to get a COVID-19 vaccine if it were recommended to them by friends and family,"{short_description}, among respondents who have not yet been vaccinated. + +Discontinued as of Wave 11, May 19, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#outreach-and-image +fb-survey,smoothed_vaccine_likely_friends,TRUE,smoothed_wvaccine_likely_friends,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_vaccine_likely_govt_health,FALSE,smoothed_vaccine_likely_govt_health,FALSE,Vaccine Likely: Government Health,Estimated percentage of respondents who would be more likely to get a COVID-19 vaccine if it were recommended to them by government health officials,"{short_description}, among respondents who have not yet been vaccinated. + +Discontinued as of Wave 11, May 19, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#outreach-and-image +fb-survey,smoothed_vaccine_likely_govt_health,TRUE,smoothed_wvaccine_likely_govt_health,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_vaccine_likely_local_health,FALSE,smoothed_vaccine_likely_local_health,FALSE,Vaccine Likely: Local Health,Estimated percentage of respondents who would be more likely to get a COVID-19 vaccine if it were recommended to them by local health workers,"{short_description}, among respondents who have not yet been vaccinated. + +Discontinued as of Wave 8, February 8, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#outreach-and-image +fb-survey,smoothed_vaccine_likely_local_health,TRUE,smoothed_wvaccine_likely_local_health,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_vaccine_likely_politicians,FALSE,smoothed_vaccine_likely_politicians,FALSE,Vaccine Likely: Politicians,Estimated percentage of respondents who would be more likely to get a COVID-19 vaccine if it were recommended to them by politicians,"{short_description}, among respondents who have not yet been vaccinated. + +Discontinued as of Wave 11, May 19, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#outreach-and-image +fb-survey,smoothed_vaccine_likely_politicians,TRUE,smoothed_wvaccine_likely_politicians,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_vaccine_likely_who,FALSE,smoothed_vaccine_likely_who,FALSE,Vaccine Likely: WHO,Estimated percentage of respondents who would be more likely to get a COVID-19 vaccine if it were recommended to them by the World Health Organization,"{short_description}, among respondents who have not yet been vaccinated. + +Discontinued as of Wave 11, May 19, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#outreach-and-image +fb-survey,smoothed_vaccine_likely_who,TRUE,smoothed_wvaccine_likely_who,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_wanted_test_14d,FALSE,smoothed_wanted_test_14d,FALSE,Wanted Test (Last 14 Days),"Estimated percentage of people who wanted to be tested for COVID-19 in the past 14 days, out of people who were not tested in that time","{short_description}. + +Discontinued as of Wave 11, May 19, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#testing-indicators +fb-survey,smoothed_wanted_test_14d,TRUE,smoothed_wwanted_test_14d,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_wearing_mask,FALSE,smoothed_wearing_mask,FALSE,People Wearing Masks (Last 5 Days),Estimated percentage of people who wore a mask for most or all of the time while in public in the past 5 days; those not in public in the past 5 days are not counted. ,"{short_description} + +Discontinued as of Wave 8, February 8, 2021.",day,Date,Percentage,percent,public,good,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#mask-use +fb-survey,smoothed_wearing_mask,TRUE,smoothed_wwearing_mask,FALSE,,,,day,Date,Percentage,percent,public,good,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_wearing_mask_7d,FALSE,smoothed_wearing_mask_7d,FALSE,People Wearing Masks (Last 7 Days),Estimated percentage of people who wore a mask for most or all of the time while in public in the past 7 days; those not in public in the past 7 days are not counted. ,"{source_description} We also ask them if they wear a mask when they are in public. For this signal, we estimate the percentage of people who say they wear a mask most or all of the time when they are in public. + +This item was shown to respondents starting in Wave 8, February 8, 2021, replacing a 5-day version of the same question.",day,Date,Percentage,percent,public,good,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#mask-use +fb-survey,smoothed_wearing_mask_7d,TRUE,smoothed_wwearing_mask_7d,FALSE,,,,day,Date,Percentage,percent,public,good,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_wwork_outside_home_1d,FALSE,smoothed_wwork_outside_home_1d,FALSE,Work Outside Home (Last 24 Hours),Estimated percentage of respondents who worked or went to school outside their home in the past 24 hours,"{short_description}. + +This item was shown to respondents starting in Wave 4, September 8, 2020. + +Discontinued as of Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_wwork_outside_home_1d,TRUE,smoothed_work_outside_home_1d,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#social-distancing-and-travel +fb-survey,smoothed_wwork_outside_home_indoors_1d,FALSE,smoothed_wwork_outside_home_indoors_1d,FALSE,Work Outside Home Indoors (Last 24 Hours),Estimated percentage of respondents who worked or went to school outside their home in an indoor setting in the past 24 hours,"{short_description}. + +This item was shown to respondents starting in Wave 10, March 2, 2021.",day,Date,Percentage,percent,public,neutral,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_wwork_outside_home_indoors_1d,TRUE,smoothed_work_outside_home_indoors_1d,FALSE,,,,day,Date,Percentage,percent,public,neutral,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#social-distancing-and-travel +fb-survey,smoothed_wworried_become_ill,FALSE,smoothed_wworried_become_ill,FALSE,Worried Become Ill,"Estimated percentage of respondents who reported feeling very or somewhat worried that ""you or someone in your immediate family might become seriously ill from COVID-19""","{short_description}. + +Discontinued as of Wave 11, May 19, 2021.",day,Date,Percentage,percent,public,bad,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_wworried_become_ill,TRUE,smoothed_worried_become_ill,FALSE,,,,day,Date,Percentage,percent,public,bad,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#mental-health-indicators +fb-survey,smoothed_wworried_finances,FALSE,smoothed_wworried_finances,FALSE,Worried Finances,"Estimated percentage of respondents who report being very or somewhat worried about their ""household's finances for the next month""",,day,Date,Percentage,percent,public,bad,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_wworried_finances,TRUE,smoothed_worried_finances,FALSE,,,,day,Date,Percentage,percent,public,bad,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#mental-health-indicators +fb-survey,smoothed_wworried_vaccine_side_effects,FALSE,smoothed_wworried_vaccine_side_effects,FALSE,Smoothed Worried Vaccine Side Effects,"Estimated percentage of respondents who are very or moderately concerned that they would ""experience a side effect from a COVID-19 vaccination.""","{short_description} + +Note: Until Wave 10, March 2, 2021, all respondents answered this question, including those who had already received one or more doses of a COVID-19 vaccine; beginning on that date, only respondents who said they have not received a COVID vaccine are asked this question.",day,Date,Percentage,percent,public,bad,TRUE,TRUE,FALSE,TRUE,TRUE, +fb-survey,smoothed_wworried_vaccine_side_effects,TRUE,smoothed_worried_vaccine_side_effects,FALSE,,,,day,Date,Percentage,percent,public,bad,TRUE,FALSE,FALSE,TRUE,TRUE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html#reasons-for-hesitancy +ght,raw_search,,raw_search,FALSE,COVID-Related Searches,"Google search volume for COVID-related searches, in arbitrary units that are normalized for population","{short_description} + +Discontinued March 8, 2021.",day,Date,Value,raw,public,bad,FALSE,FALSE,FALSE,FALSE,FALSE,https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/ght.html +ght,raw_search,,smoothed_search,FALSE,,,"{base_short_description), smoothed in time using a Gaussian linear smoother. + +Discontinued March 8, 2021.",day,Date,Value,raw,public,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +google-survey,raw_cli,FALSE,raw_cli,FALSE,COVID-Like Illness,Estimated percentage of people who know someone in their community with COVID-like illness.,"{short_description} + +Discontinued May 16, 2020.",day,Date,Value,raw,other,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +google-survey,raw_cli,TRUE,smoothed_cli,FALSE,,,,day,Date,Value,raw,other,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +google-symptoms,ageusia_raw_search,FALSE,ageusia_raw_search,FALSE,Ageusia Searches,"Google search volume for ageusia-related searches, in arbitrary units that are normalized for overall search users",,day,Date,Value,raw,public,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +google-symptoms,ageusia_raw_search,TRUE,ageusia_smoothed_search,TRUE,,,,day,Date,Value,raw,public,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +google-symptoms,anosmia_raw_search,FALSE,anosmia_raw_search,FALSE,Anosmia Searches,"Google search volume for anosmia-related searches, in arbitrary units that are normalized for overall search users ",,day,Date,Value,raw,public,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +google-symptoms,anosmia_raw_search,TRUE,anosmia_smoothed_search,TRUE,,,,day,Date,Value,raw,public,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +google-symptoms,sum_anosmia_ageusia_raw_search,FALSE,sum_anosmia_ageusia_raw_search,FALSE,Sum Anosmia Ageusia Searches,"The sum of Google search volume for anosmia and ageusia related searches, in arbitrary units that are normalized for overall search users",,day,Date,Value,raw,public,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +google-symptoms,sum_anosmia_ageusia_raw_search,TRUE,sum_anosmia_ageusia_smoothed_search,TRUE,,,,day,Date,Value,raw,public,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +hhs,confirmed_admissions_1d,FALSE,confirmed_admissions_1d,FALSE,[invalid signal to be removed],,,day,Date,Value,count,late,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +hhs,confirmed_admissions_covid_1d,FALSE,confirmed_admissions_covid_1d,FALSE,Confirmed COVID-19 Admissions per day,Sum of adult and pediatric confirmed COVID-19 hospital admissions occurring each day. ,,day,Date,Value,count,late,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +hhs,sum_confirmed_suspected_admissions_1d,FALSE,sum_confirmed_suspected_admissions_1d,FALSE,[invalid signal to be removed],,,day,Date,Value,count,late,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +hhs,sum_confirmed_suspected_admissions_covid_1d,FALSE,sum_confirmed_suspected_admissions_covid_1d,FALSE,Confirmed and Suspected COVID-19 Admissions per day,Sum of adult and pediatric confirmed and suspected COVID-19 hospital admissions occurring each day. ,,day,Date,Value,count,late,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +hospital-admissions,smoothed_covid19,FALSE,smoothed_covid19,FALSE,COVID-19 Admissions (EMR and Claims),Estimated percentage of new hospital admissions with COVID-associated diagnoses,"{short_description}, based on counts of electronic medical records and claims from health system partners, smoothed in time using a Gaussian linear smoother. + +Discontinued October 1, 2020.",day,Date,Value,percent,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +hospital-admissions,smoothed_covid19,TRUE,smoothed_adj_covid19,FALSE,Day-adjusted COVID-19 Admissions (EMR and Claims),,"{base_short_description}, based on counts of electronic medical records and claims from health system partners, smoothed in time using a Gaussian linear smoother, and adjusted to reduce day-of-week effects. + +Discontinued October 1, 2020.",day,Date,Value,percent,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +hospital-admissions,smoothed_covid19_from_claims,FALSE,smoothed_covid19_from_claims,FALSE,COVID-19 Admissions (Claims),Estimated percentage of new hospital admissions with COVID-associated diagnoses,"{short_description}, based on counts of claims from health system partners, smoothed in time using a Gaussian linear smoother.",day,Date,Value,percent,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +hospital-admissions,smoothed_covid19_from_claims,TRUE,smoothed_adj_covid19_from_claims,FALSE,Day-adjusted COVID-19 Admissions (Claims),,"{base_short_description}, based on counts of claims from health system partners, smoothed in time using a Gaussian linear smoother, and adjusted to reduce day-of-week effects.",day,Date,Value,percent,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +indicator-combination-cases-deaths,confirmed_cumulative_num,FALSE,confirmed_cumulative_num,FALSE,Cumulative Confirmed COVID Cases,Cumulative confirmed COVID cases,Confirmed COVID-19 cases as reported by [USAFacts](https://usafacts.org/visualizations/coronavirus-covid-19-spread-map/) and [JHU-CSSE](https://github.com/CSSEGISandData/COVID-19),day,Date,Value,count,late,bad,FALSE,FALSE,TRUE,FALSE,FALSE, +indicator-combination-cases-deaths,confirmed_cumulative_num,TRUE,confirmed_7dav_cumulative_num,TRUE,Cumulative Confirmed COVID Cases,"Cumulative confirmed COVID cases, 7-day average ",,day,Date,Value,count,late,bad,TRUE,FALSE,TRUE,FALSE,FALSE, +indicator-combination-cases-deaths,confirmed_cumulative_num,TRUE,confirmed_7dav_cumulative_prop,FALSE,Cumulative Confirmed COVID Cases,"Cumulative confirmed COVID cases, 7-day average, per 100k people",,day,Date,Value,per100k,late,bad,TRUE,FALSE,TRUE,FALSE,FALSE, +indicator-combination-cases-deaths,confirmed_cumulative_num,TRUE,confirmed_7dav_incidence_num,TRUE,Daily Confirmed COVID Cases,"Daily confirmed COVID cases, 7-day average ",,day,Date,Value,count,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +indicator-combination-cases-deaths,confirmed_cumulative_num,TRUE,confirmed_7dav_incidence_prop,FALSE,Daily Confirmed COVID Cases,"Daily confirmed COVID cases, 7-day average, per 100k people",,day,Date,Value,per100k,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +indicator-combination-cases-deaths,confirmed_cumulative_num,TRUE,confirmed_cumulative_prop,FALSE,Cumulative Confirmed COVID Cases,"Cumulative confirmed COVID cases, per 100k people",,day,Date,Value,per100k,late,bad,FALSE,FALSE,TRUE,FALSE,FALSE, +indicator-combination-cases-deaths,confirmed_cumulative_num,TRUE,confirmed_incidence_num,TRUE,Daily Confirmed COVID Cases,Daily confirmed COVID cases,,day,Date,Value,count,late,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +indicator-combination-cases-deaths,confirmed_cumulative_num,TRUE,confirmed_incidence_prop,FALSE,Daily Confirmed COVID Cases,"Daily confirmed COVID cases, per 100k people",,day,Date,Value,per100k,late,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +indicator-combination-cases-deaths,deaths_cumulative_num,FALSE,deaths_cumulative_num,FALSE,Cumulative Confirmed COVID Deaths,Cumulative confirmed COVID deaths,Confirmed COVID-19 deaths as reported by [USAFacts](https://usafacts.org/visualizations/coronavirus-covid-19-spread-map/) and [JHU-CSSE](https://github.com/CSSEGISandData/COVID-19),day,Date,Value,count,late,bad,FALSE,FALSE,TRUE,FALSE,FALSE, +indicator-combination-cases-deaths,deaths_cumulative_num,TRUE,deaths_7dav_cumulative_num,TRUE,Cumulative Confirmed COVID Deaths,"Cumulative confirmed COVID deaths, 7-day average ",,day,Date,Value,count,late,bad,TRUE,FALSE,TRUE,FALSE,FALSE, +indicator-combination-cases-deaths,deaths_cumulative_num,TRUE,deaths_7dav_cumulative_prop,FALSE,Cumulative Confirmed COVID Deaths,"Cumulative confirmed COVID deaths, 7-day average, per 100k people",,day,Date,Value,per100k,late,bad,TRUE,FALSE,TRUE,FALSE,FALSE, +indicator-combination-cases-deaths,deaths_cumulative_num,TRUE,deaths_7dav_incidence_num,TRUE,Daily Confirmed COVID Deaths,"Daily confirmed COVID deaths, 7-day average ",,day,Date,Value,count,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +indicator-combination-cases-deaths,deaths_cumulative_num,TRUE,deaths_7dav_incidence_prop,FALSE,Daily Confirmed COVID Deaths,"Daily confirmed COVID deaths, 7-day average, per 100k people",,day,Date,Value,per100k,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +indicator-combination-cases-deaths,deaths_cumulative_num,TRUE,deaths_cumulative_prop,FALSE,Cumulative Confirmed COVID Deaths,"Cumulative confirmed COVID deaths, per 100k people",,day,Date,Value,per100k,late,bad,FALSE,FALSE,TRUE,FALSE,FALSE, +indicator-combination-cases-deaths,deaths_cumulative_num,TRUE,deaths_incidence_num,TRUE,Daily Confirmed COVID Deaths,Daily confirmed COVID deaths,,day,Date,Value,count,late,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +indicator-combination-cases-deaths,deaths_cumulative_num,TRUE,deaths_incidence_prop,FALSE,Daily Confirmed COVID Deaths,"Daily confirmed COVID deaths, per 100k people",,day,Date,Value,per100k,late,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +indicator-combination-nmf,nmf_day_doc_fbc_fbs_ght,nmf_day_doc_fbc_fbs_ght,nmf_day_doc_fbc_fbs_ght,FALSE,NMF Combination,Rank-1 NMF approximation to reconstruct 4 other signals.,"This signal uses a rank-1 approximation, from a nonnegative matrix factorization approach, to identify an underlying signal that best reconstructs the Doctor Visits (smoothed_adj_cli), Facebook Symptoms surveys (smoothed_cli), Facebook Symptoms in Community surveys (smoothed_hh_cmnty_cli), and Search Trends (smoothed_search) indicators. It does not include official reports (cases and deaths from the jhu-csse source). Higher values of the combined signal correspond to higher values of the other indicators, but the scale (units) of the combination is arbitrary. Note that the Search Trends source is not available at the county level, so county values of this signal do not use it. + +Discontinued March 17, 2021.",day,Date,Value,raw,early,bad,FALSE,FALSE,FALSE,TRUE,FALSE, +indicator-combination-nmf,nmf_day_doc_fbs_ght,nmf_day_doc_fbs_ght,nmf_day_doc_fbs_ght,FALSE,NMF Combination,Rank-1 NMF approximation to reconstruct 3 other signals.,"This signal uses a rank-1 approximation, from a nonnegative matrix factorization approach, to identify an underlying signal that best reconstructs the Doctor Visits (doctor-visits:smoothed_cli), Facebook Symptoms surveys (fb-surveys:smoothed_cli), and Search Trends (ght:smoothed_search) indicators. It does not include official reports (cases and deaths from the jhu-csse source). Higher values of the combined signal correspond to higher values of the other indicators, but the scale (units) of the combination is arbitrary. Note that the Search Trends source is not available at the county level, so county values of this signal do not use it. + +Discontinued May 28, 2020.",day,Date,Value,raw,early,bad,FALSE,FALSE,FALSE,TRUE,FALSE, +jhu-csse,confirmed_cumulative_num,FALSE,confirmed_cumulative_num,FALSE,Cumulative Confirmed COVID Cases,Cumulative confirmed COVID cases,Confirmed COVID-19 cases as reported by [JHU-CSSE](https://github.com/CSSEGISandData/COVID-19),day,Date,Value,count,late,bad,FALSE,FALSE,TRUE,FALSE,FALSE, +jhu-csse,confirmed_cumulative_num,TRUE,confirmed_7dav_cumulative_num,TRUE,Cumulative Confirmed COVID Cases,"Cumulative confirmed COVID cases, 7-day average ",,day,Date,Value,count,late,bad,TRUE,FALSE,TRUE,FALSE,FALSE, +jhu-csse,confirmed_cumulative_num,TRUE,confirmed_7dav_cumulative_prop,FALSE,Cumulative Confirmed COVID Cases,"Cumulative confirmed COVID cases, 7-day average, per 100k people",,day,Date,Value,per100k,late,bad,TRUE,FALSE,TRUE,FALSE,FALSE, +jhu-csse,confirmed_cumulative_num,TRUE,confirmed_7dav_incidence_num,TRUE,Daily Confirmed COVID Cases,"Daily confirmed COVID cases, 7-day average ",,day,Date,Value,count,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +jhu-csse,confirmed_cumulative_num,TRUE,confirmed_7dav_incidence_prop,FALSE,Daily Confirmed COVID Cases,"Daily confirmed COVID cases, 7-day average, per 100k people",,day,Date,Value,per100k,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +jhu-csse,confirmed_cumulative_num,TRUE,confirmed_cumulative_prop,FALSE,Cumulative Confirmed COVID Cases,"Cumulative confirmed COVID cases, per 100k people",,day,Date,Value,per100k,late,bad,FALSE,FALSE,TRUE,FALSE,FALSE, +jhu-csse,confirmed_cumulative_num,TRUE,confirmed_incidence_num,TRUE,Daily Confirmed COVID Cases,Daily confirmed COVID cases,,day,Date,Value,count,late,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +jhu-csse,confirmed_cumulative_num,TRUE,confirmed_incidence_prop,FALSE,Daily Confirmed COVID Cases,"Daily confirmed COVID cases, per 100k people",,day,Date,Value,per100k,late,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +jhu-csse,deaths_cumulative_num,FALSE,deaths_cumulative_num,FALSE,Cumulative Confirmed COVID Deaths,Cumulative confirmed COVID deaths,Confirmed COVID-19 deaths as reported by [JHU-CSSE](https://github.com/CSSEGISandData/COVID-19),day,Date,Value,count,late,bad,FALSE,FALSE,TRUE,FALSE,FALSE, +jhu-csse,deaths_cumulative_num,TRUE,deaths_7dav_cumulative_num,TRUE,Cumulative Confirmed COVID Deaths,"Cumulative confirmed COVID deaths, 7-day average ",,day,Date,Value,count,late,bad,TRUE,FALSE,TRUE,FALSE,FALSE, +jhu-csse,deaths_cumulative_num,TRUE,deaths_7dav_cumulative_prop,FALSE,Cumulative Confirmed COVID Deaths,"Cumulative confirmed COVID deaths, 7-day average, per 100k people",,day,Date,Value,per100k,late,bad,TRUE,FALSE,TRUE,FALSE,FALSE, +jhu-csse,deaths_cumulative_num,TRUE,deaths_7dav_incidence_num,TRUE,Daily Confirmed COVID Deaths,"Daily confirmed COVID deaths, 7-day average ",,day,Date,Value,count,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +jhu-csse,deaths_cumulative_num,TRUE,deaths_7dav_incidence_prop,FALSE,Daily Confirmed COVID Deaths,"Daily confirmed COVID deaths, 7-day average, per 100k people",,day,Date,Value,per100k,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +jhu-csse,deaths_cumulative_num,TRUE,deaths_cumulative_prop,FALSE,Cumulative Confirmed COVID Deaths,"Cumulative confirmed COVID deaths, per 100k people",,day,Date,Value,per100k,late,bad,FALSE,FALSE,TRUE,FALSE,FALSE, +jhu-csse,deaths_cumulative_num,TRUE,deaths_incidence_num,TRUE,Daily Confirmed COVID Deaths,Daily confirmed COVID deaths,,day,Date,Value,count,late,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +jhu-csse,deaths_cumulative_num,TRUE,deaths_incidence_prop,FALSE,Daily Confirmed COVID Deaths,"Daily confirmed COVID deaths, per 100k people",,day,Date,Value,per100k,late,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +quidel-covid-ag,covid_ag_raw_pct_positive,FALSE,covid_ag_raw_pct_positive,FALSE,COVID-19 Antigen Tests: Percent Positive,Percentage of antigen tests that were positive for COVID-19,"When a patient (whether at a doctor’s office, clinic, or hospital) has COVID-like symptoms, doctors may order an antigen test. An antigen test can detect parts of the virus that are present during an active infection. This is in contrast with antibody tests, which detect parts of the immune system that react to the virus, but which persist long after the infection has passed. For this signal, we compute the percentage of antigen tests performed that were positive for COVID-19.",day,Date,Percentage,percent,late,bad,FALSE,FALSE,FALSE,TRUE,TRUE, +quidel-covid-ag,covid_ag_raw_pct_positive,TRUE,covid_ag_smoothed_pct_positive,FALSE,,,,day,Date,Percentage,percent,late,bad,TRUE,FALSE,FALSE,TRUE,TRUE, +quidel-flu,raw_pct_negative,FALSE,raw_pct_negative,FALSE,Flu Tests: Percent Negative,"The percentage of flu tests that are negative, suggesting the patient's illness has another cause, possibly COVID-19 ","{short_description}. + +Discontinued May 19, 2020.",day,Date,Percentage,percent,late,bad,FALSE,FALSE,FALSE,TRUE,TRUE, +quidel-flu,raw_pct_negative,TRUE,smoothed_pct_negative,FALSE,,,,day,Date,Percentage,percent,late,bad,TRUE,FALSE,FALSE,TRUE,TRUE, +quidel-flu,raw_tests_per_device,FALSE,raw_tests_per_device,FALSE,Flu Tests: Tests Per Device,The average number of flu tests conducted by each testing device; measures volume of testing ,"{short_description}. + +Discontinued May 19, 2020.",day,Date,Number of Tests,count,late,bad,FALSE,FALSE,FALSE,TRUE,TRUE, +quidel-flu,raw_tests_per_device,TRUE,smoothed_tests_per_device,FALSE,,,,day,Date,Number of Tests,count,late,bad,TRUE,FALSE,FALSE,TRUE,TRUE, +safegraph-daily,completely_home_prop,FALSE,completely_home_prop,FALSE,Completely Home,The fraction of mobile devices that did not leave the immediate area of their home,"{short_description}. This is SafeGraph’s completely_home_device_count / device_count. + +Discontinued April 19th, 2021.",day,Date,Value,per100k,public,neutral,FALSE,FALSE,FALSE,FALSE,FALSE, +safegraph-daily,completely_home_prop,TRUE,completely_home_prop_7dav,FALSE,,,,day,Date,Value,per100k,public,neutral,TRUE,FALSE,FALSE,FALSE,FALSE, +safegraph-daily,full_time_work_prop,FALSE,full_time_work_prop,FALSE,Full Time Work/School,The fraction of mobile devices that spent more than 6 hours at one location other than their home during the daytime,"{short_description}. This is SafeGraph’s full_time_work_behavior_devices / device_count. + +Discontinued April 19th, 2021.",day,Date,Value,per100k,public,neutral,FALSE,FALSE,FALSE,FALSE,FALSE, +safegraph-daily,full_time_work_prop,TRUE,full_time_work_prop_7dav,FALSE,,,,day,Date,Value,per100k,public,neutral,TRUE,FALSE,FALSE,FALSE,FALSE, +safegraph-daily,median_home_dwell_time,FALSE,median_home_dwell_time,FALSE,Median Home Dwell Time,"The median time spent at home for all devices at this location for this time period, in minutes","{short_description}. + +Discontinued April 19th, 2021.",day,Date,Value,count,public,neutral,FALSE,FALSE,FALSE,FALSE,FALSE, +safegraph-daily,median_home_dwell_time,TRUE,median_home_dwell_time_7dav,FALSE,,,,day,Date,Value,count,public,neutral,TRUE,FALSE,FALSE,FALSE,FALSE, +safegraph-daily,part_time_work_prop,FALSE,part_time_work_prop,FALSE,Part Time Work/School,The fraction of devices that spent between 3 and 6 hours at one location other than their home during the daytime,"{short_description}. This is SafeGraph’s part_time_work_behavior_devices / device_count. + +Discontinued April 19th, 2021.",day,Date,Value,per100k,public,neutral,FALSE,FALSE,FALSE,FALSE,FALSE, +safegraph-daily,part_time_work_prop,TRUE,part_time_work_prop_7dav,FALSE,,,,day,Date,Value,per100k,public,neutral,TRUE,FALSE,FALSE,FALSE,FALSE, +safegraph-weekly,bars_visit_num,FALSE,bars_visit_num,FALSE,Bar Visits,"Daily number of visits to bars, based on SafeGraph's Weekly Patterns dataset","Delphi receives data from [SafeGraph](https://docs.safegraph.com/docs/weekly-patterns), which collects weekly insights on Points of Interest (POI) using anonymized location data from mobile phones. We select locations that qualify as ""Drinking Places (alcoholic beverages)"" from all the [core places](https://docs.safegraph.com/v4.0/docs/places-manual#section-core-places), then count the number of visits. + +Note that these counts only include people whose visits are tracked because they are in SafeGraph's panel; they do not include all bar visits by everyone in the population.",day,Date,Visits,count,public,neutral,FALSE,FALSE,FALSE,FALSE,FALSE, +safegraph-weekly,bars_visit_num,TRUE,bars_visit_prop,FALSE,,,,day,Date,"Visits per 100,000 people",per100k,public,neutral,FALSE,FALSE,FALSE,FALSE,FALSE, +safegraph-weekly,restaurants_visit_num,FALSE,restaurants_visit_num,FALSE,Restaurant Visits,"Daily number of visits to restaurants, based on SafeGraph's Weekly Patterns dataset","Delphi receives data from [SafeGraph](https://docs.safegraph.com/docs/weekly-patterns), which collects weekly insights on Points of Interest (POI) using anonymized location data from mobile phones. We select locations that qualify as ""Full-Service Restaurants"" from all the [core places](https://docs.safegraph.com/v4.0/docs/places-manual#section-core-places), then count the number of visits. + +Note that these counts only include people whose visits are tracked because they are in SafeGraph's panel; they do not include all restaurant visits by everyone in the population.",day,Date,Visits,count,public,neutral,FALSE,FALSE,FALSE,FALSE,FALSE, +safegraph-weekly,restaurants_visit_num,TRUE,restaurants_visit_prop,FALSE,,,,day,Date,"Visits per 100,000 people",per100k,public,neutral,FALSE,FALSE,FALSE,FALSE,FALSE, +usa-facts,confirmed_cumulative_num,FALSE,confirmed_cumulative_num,FALSE,Cumulative Confirmed COVID Cases,Cumulative confirmed COVID cases,Confirmed COVID-19 cases as reported by [USAFacts](https://usafacts.org/visualizations/coronavirus-covid-19-spread-map/),day,Date,Value,count,late,bad,FALSE,FALSE,TRUE,FALSE,FALSE, +usa-facts,confirmed_cumulative_num,TRUE,confirmed_7dav_cumulative_num,TRUE,Cumulative Confirmed COVID Cases,"Cumulative confirmed COVID cases, 7-day average ",,day,Date,Value,count,late,bad,TRUE,FALSE,TRUE,FALSE,FALSE, +usa-facts,confirmed_cumulative_num,TRUE,confirmed_7dav_cumulative_prop,FALSE,Cumulative Confirmed COVID Cases,"Cumulative confirmed COVID cases, 7-day average, per 100k people",,day,Date,Value,per100k,late,bad,TRUE,FALSE,TRUE,FALSE,FALSE, +usa-facts,confirmed_cumulative_num,TRUE,confirmed_7dav_incidence_num,TRUE,Daily Confirmed COVID Cases,"Daily confirmed COVID cases, 7-day average ",,day,Date,Value,count,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +usa-facts,confirmed_cumulative_num,TRUE,confirmed_7dav_incidence_prop,FALSE,Daily Confirmed COVID Cases,"Daily confirmed COVID cases, 7-day average, per 100k people",,day,Date,Value,per100k,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +usa-facts,confirmed_cumulative_num,TRUE,confirmed_cumulative_prop,FALSE,Cumulative Confirmed COVID Cases,"Cumulative confirmed COVID cases, per 100k people",,day,Date,Value,per100k,late,bad,FALSE,FALSE,TRUE,FALSE,FALSE, +usa-facts,confirmed_cumulative_num,TRUE,confirmed_incidence_num,TRUE,Daily Confirmed COVID Cases,Daily confirmed COVID cases,,day,Date,Value,count,late,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +usa-facts,confirmed_cumulative_num,TRUE,confirmed_incidence_prop,FALSE,Daily Confirmed COVID Cases,"Daily confirmed COVID cases, per 100k people",,day,Date,Value,per100k,late,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +usa-facts,deaths_cumulative_num,FALSE,deaths_cumulative_num,FALSE,Cumulative Confirmed COVID Deaths,Cumulative confirmed COVID deaths,Confirmed COVID-19 deaths as reported by [USAFacts](https://usafacts.org/visualizations/coronavirus-covid-19-spread-map/),day,Date,Value,count,late,bad,FALSE,FALSE,TRUE,FALSE,FALSE, +usa-facts,deaths_cumulative_num,TRUE,deaths_7dav_cumulative_num,TRUE,Cumulative Confirmed COVID Deaths,"Cumulative confirmed COVID deaths, 7-day average ",,day,Date,Value,count,late,bad,TRUE,FALSE,TRUE,FALSE,FALSE, +usa-facts,deaths_cumulative_num,TRUE,deaths_7dav_cumulative_prop,FALSE,Cumulative Confirmed COVID Deaths,"Cumulative confirmed COVID deaths, 7-day average, per 100k people",,day,Date,Value,per100k,late,bad,TRUE,FALSE,TRUE,FALSE,FALSE, +usa-facts,deaths_cumulative_num,TRUE,deaths_7dav_incidence_num,TRUE,Daily Confirmed COVID Deaths,"Daily confirmed COVID deaths, 7-day average ",,day,Date,Value,count,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +usa-facts,deaths_cumulative_num,TRUE,deaths_7dav_incidence_prop,FALSE,Daily Confirmed COVID Deaths,"Daily confirmed COVID deaths, 7-day average, per 100k people",,day,Date,Value,per100k,late,bad,TRUE,FALSE,FALSE,FALSE,FALSE, +usa-facts,deaths_cumulative_num,TRUE,deaths_cumulative_prop,FALSE,Cumulative Confirmed COVID Deaths,"Cumulative confirmed COVID deaths, per 100k people",,day,Date,Value,per100k,late,bad,FALSE,FALSE,TRUE,FALSE,FALSE, +usa-facts,deaths_cumulative_num,TRUE,deaths_incidence_num,TRUE,Daily Confirmed COVID Deaths,Daily confirmed COVID deaths,,day,Date,Value,count,late,bad,FALSE,FALSE,FALSE,FALSE,FALSE, +usa-facts,deaths_cumulative_num,TRUE,deaths_incidence_prop,FALSE,Daily Confirmed COVID Deaths,"Daily confirmed COVID deaths, per 100k people",,day,Date,Value,per100k,late,bad,FALSE,FALSE,FALSE,FALSE,FALSE, \ No newline at end of file diff --git a/src/server/endpoints/covidcast_utils/db_sources.csv b/src/server/endpoints/covidcast_utils/db_sources.csv new file mode 100644 index 000000000..6d908a360 --- /dev/null +++ b/src/server/endpoints/covidcast_utils/db_sources.csv @@ -0,0 +1,21 @@ +DB Source,Source Subdivision,Name,Active,Description,Reference Signal,License,DUA,Link +chng,chng-cli,Change Healthcare (COVID Like Illness),TRUE,Change Healthcare is a healthcare technology company that aggregates medical claims data from many healthcare providers. This source includes aggregated counts of claims with COVID-related symptoms. All claims data has been de-identified in accordance with HIPAA privacy regulations. ,smoothed_outpatient_cli,CC BY-NC,https://cmu.box.com/s/cto4to822zecr3oyq1kkk9xmzhtq9tl2,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/chng.html) +chng,chng-covid,Change Healthcare (Confirmed COVID),TRUE,Change Healthcare is a healthcare technology company that aggregates medical claims data from many healthcare providers. This source includes aggregated counts of claims with confirmed COVID-19. All claims data has been de-identified in accordance with HIPAA privacy regulations. ,smoothed_outpatient_covid,CC BY-NC,https://cmu.box.com/s/cto4to822zecr3oyq1kkk9xmzhtq9tl2,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/chng.html) +covid-act-now,covid-act-now,Covid Act Now (CAN),TRUE,"COVID Act Now (CAN) tracks COVID-19 testing statistics, such as positivity rates and total tests performed. This source only includes CAN data from the CDC's COVID-19 Integrated County View.",pcr_specimen_total_tests,CC BY-NC,,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/covid-act-now.html) +doctor-visits,doctor-visits,Doctor Visits,TRUE,"Information about outpatient visits, provided to us by health system partners. Using outpatient claims counts, we estimate the percentage of COVID-related doctor's visits in a given location, on a given day.",smoothed_cli,CC BY,https://cmu.box.com/s/l2tz6kmiws6jyty2azwb43poiepz0565,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/doctor-visits.html) +fb-survey,fb-survey,Delphi US COVID-19 Trends and Impact Survey,TRUE,"The Delphi US COVID-19 Trends and Impact Survey (CTIS), in partnership with the Facebook Company. Every day, Delphi surveys tens of thousands of Facebook users, asking them a broad set of COVID-related questions, including whether they, or anyone in their household, are currently experiencing COVID-related symptoms.",smoothed_cli,CC BY,https://cmu.box.com/s/qfxplcdrcn9retfzx4zniyugbd9h3bos,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/fb-survey.html) +google-symptoms,google-symptoms,Google Symptoms Search Trends,TRUE,"Google's [COVID-19 Search Trends symptoms dataset](http://goo.gle/covid19symptomdataset) reflects the volume of Google searches for a broad set of symptoms, signs and health conditions. This source includes only searches which have been mapped to anosmia (lack of smell) and ageusia (lack of taste).",anosmia_smoothed_search,"To download or use the data, you must agree to the Google [Terms of Service](https://policies.google.com/terms)",,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/google-symptoms.html) +hhs,hhs,U.S. Department of Health & Human Services,TRUE,The US Department of Health & Human Services (HHS) publishes several datasets on patient impact and hospital capacity. This source includes only adult and pediatric hospital admissions with confirmed and suspected COVID-19.,confirmed_admissions_1d,ODBL,,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/hhs.html) +hospital-admissions,hospital-admissions,Hospital Admissions,TRUE,"Information about hospital admissions, provided to us by health system partners. Using inpatient claim counts, we estimate the percentage of new hospital admissions with a COVID-associated diagnosis code in a given location, on a given day. + +See also our [Health & Human Services](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/hhs.html) data source for official COVID hospitalization reporting from the US Department of Health & Human Services.",smoothed_covid19_from_claims,CC BY,https://cmu.box.com/s/l2tz6kmiws6jyty2azwb43poiepz0565,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/hospital-admissions.html) +indicator-combination,indicator-combination-cases-deaths,Composite COVID Cases & Deaths,TRUE,"This source combines cases & deaths data from JHU and USA Facts, using JHU for Puerto Rico, and USA Facts everywhere else. It is not a primary source.",confirmed_incidence_num,CC BY,,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/indicator-combination.html#compositional-signals-confirmed-cases-and-deaths) +jhu-csse,jhu-csse,Johns Hopkins University,TRUE,Johns Hopkins University's Center for Systems Science and Engineering (JHU-CSSE) reports confirmed COVID-19 cases and deaths.,confirmed_incidence_num,CC BY,,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/jhu-csse.html) +quidel,quidel-covid-ag,Quidel Inc. (COVID),TRUE,"Quidel, Inc. manufactures diagnostic equipment for healthcare applications, and provides Delphi with anonymized data on tests and test results. This source includes antigen tests for COVID-19.",covid_ag_smoothed_pct_positive ,CC BY,https://cmu.box.com/s/sax48yxnahllrnbqlq6wqxblg6lsyq24,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/quidel.html#covid-19-tests) +safegraph,safegraph-weekly,SafeGraph (Weekly),TRUE,[SafeGraph](https://docs.safegraph.com/docs/weekly-patterns) compiles weekly insights on Points of Interest (POI) using anonymized location data from mobile phones. This source includes rates of restaurant and bar visits.,restaurants_visit_num,CC BY,https://cmu.box.com/s/m0p1wpet4vuvey7od83n70h0e97ky2kg,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/safegraph.html) +usa-facts,usa-facts,USAFacts,TRUE,USAFacts is a nonprofit that aggregates and standardizes a vast array of data from US government agencies. This source reports confirmed COVID-19 cases and deaths.,confirmed_incidence_num,CC BY,,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/usa-facts.html) +ght,ght,Google Health Trends,FALSE,"Google Health Trends tracks Google searches on health-related topics. This source includes Google Health Trends API results for overall searcher interest in a set of COVID-19 related terms about anosmia (lack of smell or taste), which emerged as a symptom of the coronavirus. No longer updated after March 8, 2021.",smoothed_search,unknown,,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/ght.html) +google-survey,google-survey,Google Symptom Surveys,FALSE,"Delphi ran symptom surveys using a Google tool which collects responses through publisher websites, Google's Opinions Reward app, and similar applications. No longer updated after May 15, 2020.",smoothed_cli,CC BY,,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/google-survey.html) +indicator-combination,indicator-combination-nmf,Statistical Combination (NMF),FALSE,"This source provides signals which are statistical combinations of other sources, calculated by Delphi. It is not a primary data source. No longer updated after Marcy 17, 2021.",nmf_day_doc_fbs_ght,CC BY,,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/indicator-combination-inactive.html) +quidel,quidel-flu,Quidel Inc. (Flu),FALSE,"Quidel, Inc. manufactures diagnostic equipment for healthcare applications, and provides Delphi with anonymized data on tests and test results. This source includes flu tests. No longer updated after May 19, 2020.",smoothed_pct_negative,CC BY,https://cmu.box.com/s/sax48yxnahllrnbqlq6wqxblg6lsyq24,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/quidel.html#flu-tests) +safegraph,safegraph-daily,SafeGraph (Daily),FALSE,"[SafeGraph](https://docs.safegraph.com/docs/social-distancing-metrics) compiles daily mobility information using anonymized location data from mobile phones. This source includes a range of isolation/lockdown behaviors and home dwell time. No longer updated after April 19, 2021.",completely_home_prop,CC BY,https://cmu.box.com/s/m0p1wpet4vuvey7od83n70h0e97ky2kg,[API Documentation](https://cmu-delphi.github.io/delphi-epidata/api/covidcast-signals/safegraph.html) \ No newline at end of file diff --git a/src/server/endpoints/covidcast_utils/meta.py b/src/server/endpoints/covidcast_utils/meta.py index 506d3ef59..9188351be 100644 --- a/src/server/endpoints/covidcast_utils/meta.py +++ b/src/server/endpoints/covidcast_utils/meta.py @@ -1,115 +1,6 @@ -from dataclasses import InitVar, dataclass, asdict, field -from typing import Dict, Any, List, Set -from enum import Enum - - -class HighValuesAre(str, Enum): - bad = "bad" - good = "good" - neutral = "neutral" - - -class SignalFormat(str, Enum): - per100k = "per100k" - percent = "percent" - fraction = "fraction" - raw_count = "raw_count" - raw = "raw" - - -class SignalCategory(str, Enum): - public = "public" - early = "early" - late = "late" - other = "other" - - -def guess_name(source: str, signal: str, is_weighted: bool) -> str: - clean_signal = signal - if is_weighted and source == "fb-survey": - clean_signal = signal.replace("smoothed_w", "smoothed_weighted_").replace("raw_w", "raw_weighted_") - return " ".join((s.capitalize() for s in clean_signal.split("_"))).replace(" Ili", " ILI").replace(" Cli", " CLI").replace("Dont", "Do Not") - - -def guess_high_values_are(source: str, signal: str) -> HighValuesAre: - if signal.endswith("_ili") or signal.endswith("_wili") or signal.endswith("_cli") or signal.endswith("_wcli"): - return HighValuesAre.bad - if source == "chng" and signal.endswith("_covid"): - return HighValuesAre.bad - if source == "covid-act-now": - if signal.endswith("_positivity_rate"): - return HighValuesAre.bad - if signal.endswith("_total_tests"): - return HighValuesAre.good - if source == "fb-survey": - if "tested_positive" in signal: - return HighValuesAre.bad - if "anxious" in signal or "depressed" in signal or "felt_isolated" in signal or "worried" in signal: - return HighValuesAre.bad - if "hesitancy_reason" in signal or "vaccine_likely" in signal or "dontneed_reason" in signal: - return HighValuesAre.neutral - if "mask" in signal or "vaccine" in signal or "vaccinated" in signal: - return HighValuesAre.good - if source in ["quidel", "indicator-combination", "google-symptoms", "doctor-visits", "hospital-admissions", "usa-facts", "jhu-csse", "hhs"]: - return HighValuesAre.bad - - return HighValuesAre.neutral - - -def guess_format(source: str, signal: str) -> SignalFormat: - if source in ["fb-survey", "quidel", "hospital-admissions"]: - return SignalFormat.percent - if source == "safegraph" and (signal.endswith("_prop") or signal.endswith("_prop_7dav")): - return SignalFormat.per100k - if source in ["indicator-combination", "usa-facts", "jhu-csse"] and signal.endswith("_prop"): - return SignalFormat.per100k - if source in ["indicator-combination", "usa-facts", "jhu-csse"] and signal.endswith("_num"): - return SignalFormat.raw_count - if source == "covid-act-now" and signal == "pcr_specimen_positivity_rate": - return SignalFormat.fraction - if source == "covid-act-now" and signal == "pcr_specimen_total_tests": - return SignalFormat.raw_count - return SignalFormat.raw - - -def guess_category(source: str, signal: str) -> SignalCategory: - if source in ["doctor-visits"] or (source == "fb-survey" and (signal.endswith("_ili") or signal.endswith("_cli"))): - return SignalCategory.early - if source in ["fb-survey", "safegraph", "google-symptoms"]: - return SignalCategory.public - if source in ["quidel", "hospital-admissions", "indicator-combination", "usa-facts", "jhu-csse", "hhs", "chng"]: - return SignalCategory.late - return SignalCategory.other - - -def guess_is_smoothed(signal: str) -> bool: - return "smoothed_" in signal or "7dav" in signal - - -def guess_is_cumulative(signal: str) -> bool: - return "cumulative_" in signal - - -def guess_is_weighted(source: str, signal: str) -> bool: - if source == "fb-survey" and signal.startswith("smoothed_w"): - rest = signal[len("smoothed_") :] - if rest.startswith("wanted") or rest.startswith("wearing") or rest.startswith("work") or rest.startswith("worried"): - # it is smoothed_wanted but the weighted one is smoothed_wwanted - return False - return True - if source == "fb-survey" and signal.startswith("raw_w"): - return True - if source == "chng" and signal.startswith("smoothed_adj_"): - return True - return False - - -def guess_has_stderr(source: str) -> bool: - return source in ["fb-survey", "quidel"] - - -def guess_has_sample_size(source: str) -> bool: - return source in ["fb-survey", "quidel"] +from dataclasses import dataclass, asdict, field +from typing import Dict, Any +from .model import DataSignal @dataclass @@ -120,147 +11,13 @@ class CovidcastMetaStats: max: float -AllSignalsMap = Dict[str, Set[str]] - - -def guess_related_fb_survey_like(entry: "CovidcastMetaEntry", weighted_infix: str = "w") -> Set[str]: - # compute the plain smoothed version and go from there - smoothed_version = entry.signal - if entry.is_weighted: - # guess the smoothed unweighted version - smoothed_version = entry.signal.replace("smoothed_" + weighted_infix, "smoothed_").replace("raw_" + weighted_infix, "smoothed_") - elif not entry.is_smoothed: - smoothed_version = entry.signal.replace("raw_", "smoothed_") - - related: Set[str] = set() - related.add(smoothed_version) - - weighted_smoothed_signal = smoothed_version.replace("smoothed_", "smoothed_" + weighted_infix) - related.add(weighted_smoothed_signal) - - raw_signal = smoothed_version.replace("smoothed_", "raw_") - related.add(raw_signal) - - weighted_raw_signal = smoothed_version.replace("smoothed_", "raw_" + weighted_infix) - related.add(weighted_raw_signal) - - return related - - -def guess_related_cases_death_like(entry: "CovidcastMetaEntry") -> Set[str]: - if entry.is_weighted: - return set() # cannot handle - - base_prefix = entry.signal[0 : entry.signal.index("_")] - - related: Set[str] = set() - - for format in [SignalFormat.raw_count, SignalFormat.per100k]: - suffix = "num" if format == SignalFormat.raw_count else "prop" - incidence_count = f"{base_prefix}_incidence_{suffix}" - related.add(incidence_count) - incidence_cumulative_count = f"{base_prefix}_cumulative_{suffix}" - related.add(incidence_cumulative_count) - - smoothed_incidence_count = f"{base_prefix}_7dav_incidence_{suffix}" - related.add(smoothed_incidence_count) - smoothed_incidence_cumulative_count = f"{base_prefix}_7dav_cumulative_{suffix}" - related.add(smoothed_incidence_cumulative_count) - - return related - - -def guess_related_safegraph(entry: "CovidcastMetaEntry") -> Set[str]: - if entry.is_weighted: - return set() # cannot handle - - if entry.signal.startswith("median_home_dwell_time"): - return {"median_home_dwell_time", "median_home_dwell_time_7dav"} - - base_prefix = entry.signal.replace("_7dav", "").replace("_prop", "").replace("_num", "") - - related: Set[str] = set() - - for format in [SignalFormat.raw_count, SignalFormat.per100k]: - suffix = "num" if format == SignalFormat.raw_count else "prop" - incidence_count = f"{base_prefix}_{suffix}" - related.add(incidence_count) - - smoothed_incidence_count = f"{base_prefix}_{suffix}_7dav" - related.add(smoothed_incidence_count) - - return related - - -def guess_related_generic(entry: "CovidcastMetaEntry") -> Set[str]: - if entry.is_weighted or entry.is_cumulative: - return set() # don't know - if entry.is_smoothed: - raw_version = entry.signal.replace("smoothed_", "raw_") - return {raw_version} - else: - smoothed_version = entry.signal.replace("raw_", "smoothed_") - return {smoothed_version} - - -def guess_related_signals(entry: "CovidcastMetaEntry", all_signals: AllSignalsMap) -> List[str]: - if entry.source == "indicator-combination" and entry.signal.startswith("nmf_"): - return [] - - guesses: Set[str] = set() - if entry.source == "fb-survey": - guesses = guess_related_fb_survey_like(entry, "w") - elif entry.source in ["chng", "doctor-visits", "hospital-admissions"]: - guesses = guess_related_fb_survey_like(entry, "adj_") - elif entry.source == "safegraph": - guesses = guess_related_safegraph(entry) - elif entry.source in ["indicator-combination", "usa-facts", "jhu-csse"]: - guesses = guess_related_cases_death_like(entry) - else: - guesses = guess_related_generic(entry) - - # remove oneself - guesses.discard(entry.signal) - # return just valid signals - same_source_signals = all_signals.get(entry.source, set()) - return sorted(guesses.intersection(same_source_signals)) - - @dataclass class CovidcastMetaEntry: - source: str - signal: str + signal: DataSignal min_time: int max_time: int max_issue: int - geo_types: Dict[str, CovidcastMetaStats] - - name: str = field(init=False) - high_values_are: HighValuesAre = field(init=False) - format: SignalFormat = field(init=False) - category: SignalCategory = field(init=False) - is_smoothed: bool = field(init=False) - is_weighted: bool = field(init=False) - is_cumulative: bool = field(init=False) - has_stderr: bool = field(init=False) - has_sample_size: bool = field(init=False) - - related_signals: List[str] = field(init=False) - - all_signals: InitVar[AllSignalsMap] - - def __post_init__(self, all_signals: AllSignalsMap): - # derive fields - self.high_values_are = guess_high_values_are(self.source, self.signal) - self.format = guess_format(self.source, self.signal) - self.category = guess_category(self.source, self.signal) - self.is_smoothed = guess_is_smoothed(self.signal) - self.is_weighted = guess_is_weighted(self.source, self.signal) - self.is_cumulative = guess_is_cumulative(self.signal) - self.has_stderr = guess_has_stderr(self.source) - self.has_sample_size = guess_has_sample_size(self.source) - self.related_signals = guess_related_signals(self, all_signals) - self.name = guess_name(self.source, self.signal, self.is_weighted) + geo_types: Dict[str, CovidcastMetaStats] = field(default_factory=dict) def intergrate(self, row: Dict[str, Any]): if row["min_time"] < self.min_time: @@ -273,5 +30,7 @@ def intergrate(self, row: Dict[str, Any]): def asdict(self): r = asdict(self) + if self.signal: + r.update(self.signal.asdict()) r["geo_types"] = {k: asdict(v) for k, v in self.geo_types.items()} return r diff --git a/src/server/endpoints/covidcast_utils/model.py b/src/server/endpoints/covidcast_utils/model.py new file mode 100644 index 000000000..1f0fea4d8 --- /dev/null +++ b/src/server/endpoints/covidcast_utils/model.py @@ -0,0 +1,274 @@ +from dataclasses import asdict, dataclass, field +from typing import Callable, Optional, Dict, List, Set, Tuple +from enum import Enum +from pathlib import Path +import re +import pandas as pd +import numpy as np + +from ..._params import SourceSignalPair + + +class HighValuesAre(str, Enum): + bad = "bad" + good = "good" + neutral = "neutral" + + +class SignalFormat(str, Enum): + per100k = "per100k" + percent = "percent" + fraction = "fraction" + raw_count = "raw_count" + raw = "raw" + + +class SignalCategory(str, Enum): + public = "public" + early = "early" + late = "late" + other = "other" + + +class TimeType(str, Enum): + day = "day" + week = "week" + + +@dataclass +class WebLink: + alt: str + href: str + + +def _fix_links(link: Optional[str]) -> List[WebLink]: + # fix the link structure as given in (multiple) optional markdown link formats + if not link: + return [] + + reg = re.compile("\[(.+)\]\s*\((.*)\)") + + def parse(l: str) -> Optional[WebLink]: + l = l.strip() + if not l: + return None + m = reg.match(l) + if not m: + return WebLink("API Documentation", l) + return WebLink(m.group(1), m.group(2)) + + return [l for l in map(parse, link.split(",")) if l] + + +@dataclass +class DataSignal: + source: str + signal: str + signal_basename: str + name: str + short_description: str + description: str + time_label: str + value_label: str + format: SignalFormat = SignalFormat.raw + category: SignalCategory = SignalCategory.other + high_values_are: HighValuesAre = HighValuesAre.neutral + is_smoothed: bool = False + is_weighted: bool = False + is_cumulative: bool = False + has_stderr: bool = False + has_sample_size: bool = False + link: List[WebLink] = field(default_factory=list) + compute_from_base: bool = False + time_type: TimeType = TimeType.day + + def __post_init__(self): + self.link = _fix_links(self.link) + + def initialize(self, source_map: Dict[str, "DataSource"], map: Dict[Tuple[str, str], "DataSignal"], initialized: Set[Tuple[str, str]]): + # mark as initialized + initialized.add(self.key) + + base = map.get((self.source, self.signal_basename)) + if base and base.key not in initialized: + # initialize base first + base.initialize(source_map, map, initialized) + + source = source_map.get(self.source) + + if not self.name: + self.name = base.name if base else self.signal + if not self.description: + if base: + self.description = base.description or base.short_description or "No description available" + else: + self.description = self.short_description or "No description available" + if not self.short_description: + if base: + self.short_description = base.short_description or (base.description[:10] if base.description else "No description available") + else: + self.short_description = self.description[:10] + if not self.link and base: + self.link = base.link + if not self.value_label: + self.value_label = base.value_label if base else "Value" + if not self.category: + self.value_label = base.category if base else SignalCategory.other + if not self.high_values_are: + self.high_values_are = base.high_values_are if base else HighValuesAre.neutral + + self._replace_placeholders(base, source) + + def _replace_placeholders(self, base: Optional["DataSignal"], source: Optional["DataSource"]): + text_replacements = { + "base_description": base.description if base else "", + "base_short_description": base.short_description if base else "", + "base_name": base.name if base else "", + "source_name": source.name if source else "", + "source_description": source.description if source else "", + } + + def replace_group(match: re.Match) -> str: + key = match.group(1) + if key and key in text_replacements: + return text_replacements[key] + return key + + def replace_replacements(text: str) -> str: + return re.sub(r"\{([\w_]+)\}", replace_group, text) + + self.name = replace_replacements(self.name) + # add new replacement on the fly for the next one + text_replacements["name"] = self.name + self.short_description = replace_replacements(self.short_description) + text_replacements["short_description"] = self.short_description + self.description = replace_replacements(self.description) + + def asdict(self): + return asdict(self) + + @property + def key(self) -> Tuple[str, str]: + return (self.source, self.signal) + + +@dataclass +class DataSource: + source: str + db_source: str + name: str + active: bool + description: str + reference_signal: str + license: Optional[str] = None + link: List[WebLink] = field(default_factory=list) + dua: Optional[str] = None + + signals: List[DataSignal] = field(default_factory=list) + + def __post_init__(self): + self.link = _fix_links(self.link) + if not self.db_source: + self.db_source = self.source + + def asdict(self): + r = asdict(self) + r["signals"] = [r.asdict() for r in self.signals] + return r + + @property + def uses_db_alias(self): + return self.source != self.db_source + + +def _clean_column(c: str) -> str: + r = c.lower().replace(" ", "_").replace("-", "_").strip() + if r == "source_subdivision": + return "source" + return r + + +_base_dir = Path(__file__).parent + + +def _load_data_sources(): + data_sources_df: pd.DataFrame = pd.read_csv(_base_dir / "db_sources.csv") + data_sources_df = data_sources_df.replace({np.nan: None}) + data_sources_df.columns = map(_clean_column, data_sources_df.columns) + data_sources: List[DataSource] = [DataSource(**d) for d in data_sources_df.to_dict(orient="records")] + data_sources_df.set_index("source") + return data_sources, data_sources_df + + +data_sources, data_sources_df = _load_data_sources() +data_source_by_id = {d.source: d for d in data_sources} + + +def _load_data_signals(sources: List[DataSource]): + by_id = {d.source: d for d in sources} + data_signals_df: pd.DataFrame = pd.read_csv(_base_dir / "db_signals.csv") + data_signals_df = data_signals_df.replace({np.nan: None}) + data_signals_df.columns = map(_clean_column, data_signals_df.columns) + ignore_columns = {"base_is_other"} + data_signals: List[DataSignal] = [DataSignal(**{k: v for k, v in d.items() if k not in ignore_columns}) for d in data_signals_df.to_dict(orient="records")] + data_signals_df.set_index(["source", "signal"]) + + by_source_id = {d.key: d for d in data_signals} + initialized: Set[Tuple[str, str]] = set() + for ds in data_signals: + ds.initialize(by_id, by_source_id, initialized) + + for ds in data_signals: + source = by_id.get(ds.source) + if source: + source.signals.append(ds) + + return data_signals, data_signals_df + + +data_signals, data_signals_df = _load_data_signals(data_sources) +data_signals_by_key = {d.key: d for d in data_signals} + + +def get_related_signals(signal: DataSignal) -> List[DataSignal]: + return [s for s in data_signals if s != signal and s.signal_basename == signal.signal_basename] + + +def create_source_signal_alias_mapper(source_signals: List[SourceSignalPair]) -> Tuple[List[SourceSignalPair], Optional[Callable[[str, str], str]]]: + alias_to_data_sources: Dict[str, List[DataSource]] = {} + transformed_pairs: List[SourceSignalPair] = [] + for pair in source_signals: + source = data_source_by_id.get(pair.source) + if not source or not source.uses_db_alias: + transformed_pairs.append(pair) + continue + # uses an alias + alias_to_data_sources.setdefault(source.db_source, []).append(source) + if pair.signal == True: + # list all signals of this source (*) so resolve to a plain list of all in this alias + transformed_pairs.append(SourceSignalPair(source.db_source, [s.signal for s in source.signals])) + else: + transformed_pairs.append(SourceSignalPair(source.db_source, pair.signal)) + + if not alias_to_data_sources: + # no alias needed + return source_signals, None + + def map_row(source: str, signal: str) -> str: + """ + maps a given row source back to its alias version + """ + possible_data_sources = alias_to_data_sources.get(source) + if not possible_data_sources: + # nothing to transform + return source + if len(possible_data_sources) == 1: + return possible_data_sources[0].source + # need the signal to decide + signal_source = next((f for f in possible_data_sources if any((s.signal == signal for s in f.signals))), None) + if not signal_source: + # take the first one + signal_source = possible_data_sources[0] + return signal_source.source + + return transformed_pairs, map_row diff --git a/tasks.py b/tasks.py index b8d29fc3e..fd7115f7e 100644 --- a/tasks.py +++ b/tasks.py @@ -3,4 +3,26 @@ @task def start(c): - c.run("python -m src.server.main") \ No newline at end of file + c.run("python -m src.server.main") + + +@task +def update_gdoc( + c, + sources_url="https://docs.google.com/spreadsheets/d/e/2PACX-1vRfXo-qePhrYGAoZqewVnS1kt9tfnUTLgtkV7a-1q7yg4FoZk0NNGuB1H6k10ah1Xz5B8l1S1RB17N6/pub?gid=0&single=true&output=csv", + signal_url="https://docs.google.com/spreadsheets/d/e/2PACX-1vRfXo-qePhrYGAoZqewVnS1kt9tfnUTLgtkV7a-1q7yg4FoZk0NNGuB1H6k10ah1Xz5B8l1S1RB17N6/pub?gid=329338228&single=true&output=csv", +): + import requests + import pathlib + + base_dir = pathlib.Path("./src/server/endpoints/covidcast_utils/") + + def _migrate_file(url: str, filename: str): + r = requests.get(url).text.replace("\r\n", "\n") + rows = r.split("\n") + rows = [r for r in rows if not r.startswith(",")] + file_ = base_dir / filename + file_.write_text("\n".join(rows), encoding="utf8") + + _migrate_file(sources_url, "db_sources.csv") + _migrate_file(signal_url, "db_signals.csv")