From 36ded1433c8ca35d505397fdc106a6444379c9c2 Mon Sep 17 00:00:00 2001 From: minhkhul Date: Sun, 25 Jun 2023 22:44:02 -0400 Subject: [PATCH] ArchiveDiffer vs covidcast API blog --- content/blog/2023-06-26-mismatch.Rmd | 85 ++++++++++++ content/blog/2023-06-26-mismatch.html | 170 +++++++++++++++++++++++ static/blog/2023-06-26-mismatch/plot.png | Bin 0 -> 32367 bytes 3 files changed, 255 insertions(+) create mode 100644 content/blog/2023-06-26-mismatch.Rmd create mode 100644 content/blog/2023-06-26-mismatch.html create mode 100644 static/blog/2023-06-26-mismatch/plot.png diff --git a/content/blog/2023-06-26-mismatch.Rmd b/content/blog/2023-06-26-mismatch.Rmd new file mode 100644 index 000000000..4e7ed8219 --- /dev/null +++ b/content/blog/2023-06-26-mismatch.Rmd @@ -0,0 +1,85 @@ +--- +title: "Mismatch between ArchiveDiffer cache and covidcast API data" +author: Minh Le +date: 2023-06-26 +tags: + - epidata +authors: + - minh +heroImage: ensemble-hero.jpg +heroImageThumb: ensemble-thumb.jpg +summary: | + Recently, the Delphi team discovered some items in USAFacts where the ArchiveDiffer cache (which determines which rows of each day's output actually get added to the database) has lost sync with the API. +output: + blogdown::html_page: + toc: true +--- + +# Mismatch between ArchiveDiffer cache and covidcast API data +## The Problem +Per Katie's [issue description](https://github.com/cmu-delphi/covidcast-indicators/issues/1697): + +
+ +We found some items in USAFacts where the ArchiveDiffer cache (which determines which rows of each day's output actually get added to the database) has lost sync with the API. This is a problem for at least three reasons: + + * The data in the API is wrong + + * The publish mechanism assumes agreement with the API. No agreement means we might publish rows that shouldn't be published, or not-publish rows that should be published. + + * Possibly indicates the publish mechanism has a bug (what caused us to lose sync?) + +If we had a widget that exhaustively compared what was in the API with the ArchiveDiffer cache, we could identify and address mismatches. + +
+ +## The Widget +The widget works as following: + +- Pull each .csv file from ArchiveDiffer cache currently stored in an AWS S3 bucket. + +- Construct the parameters for an API call based on the labels of our .csv on ArchiveDiffer. + +- Compare the data pulled from ArchiveDiffer with data from our API. + +The widget eventually outputs a csv file. Each row describes in detail the comparison between data in each file on ArchiveDiffer and data returned from our API given the same params. This comparison includes whether there is a difference between data from the two sources, and if there is, how many rows are impacted. + +Additionally, the widget will identify if a whole file from ArchiveDiffer is missing. This happens when the API does not return any data given matching params from an ArchiveDiffer csv file. + + +## The Result +There exists significant mismatches between data obtained from the ArchiveDiffer cache and covidcast API. + +| Sources | Number of files with row mismatches | Number of files in ArchiveDiffer | (%) | +| :--------------------- | :--------: | :--------: | :------: | +| jhu-csse | 17165 | 92608 | 18.535116 | +| chng | 15725 | 39961 | 39.350867 | +| usa-facts | 9413 | 90392 | 10.413532 | +| quidel | 6055 | 89982 | 6.729124 | +| dsew-cpr | 2692 | 15652 | 17.199080 | +| hhs | 1506 | 44748 | 3.365514 | +| indicator-combination| 288 | 288 | 100.000000 | +| covid-act-now | 280 | 7704 | 3.634476 | + +From this table, we see that source JHU has the highest number of of files with some row mismatches, closely followed by Change Healthcare. However, since JHU has a much bigger number of files on ArchiveDiffer in total, Change data from the API is actually the more inaccurate source by comparison (39% files have mismatches). The most inaccurate source when comparing API data to ArchiveDiffer data is indicator-combination. All indicator-combination data files on ArchiveDiffer currently have one or more rows different from the data returned from covidcast API. + +Full-file mismatch happens when the API returns no row at all when looking for data from a file on ArchiveDiffer. Fortunately, USAFacts is the only source with significant number of files where the full file is missing. + +| Sources | Number of full data missing from API | +| :---------------- | :------: | +| usa-facts | 340 | +| hhs | 6 | +| jhu-csse | 5 | +| dsew-cpr | 2 | +| chng | 1 | + +Analysis by date shows that time in mismatched files are pretty evenly distributed. Overall, there is no particular period of time with less/more mismatch than others. + +![](/blog/2023-06-26-mismatch/plot.png "Number of files on ArchiveDiffer with mismatch rows") + +## Widget Limitations +This widget cannot tell if a mismatched row exists in S3 but not API or vice versa. It can only show the number of rows that should exists in both storage places but in reality, only exists in one of them. + +## Next steps +Assuming that the ArchiveDiffer is always correct in comparison to the API content, we should start patching data in the API from the least accurate indicators, indicator-combination and chng. + diff --git a/content/blog/2023-06-26-mismatch.html b/content/blog/2023-06-26-mismatch.html new file mode 100644 index 000000000..b501e124c --- /dev/null +++ b/content/blog/2023-06-26-mismatch.html @@ -0,0 +1,170 @@ +--- +title: "Mismatch between ArchiveDiffer cache and covidcast API data" +author: Minh Le +date: 2023-06-26 +tags: + - epidata +authors: + - minh +heroImage: ensemble-hero.jpg +heroImageThumb: ensemble-thumb.jpg +summary: | + Recently, the Delphi team discovered some items in USAFacts where the ArchiveDiffer cache (which determines which rows of each day's output actually get added to the database) has lost sync with the API. +output: + blogdown::html_page: + toc: true +--- + + +
+ +
+ +
+

Mismatch between ArchiveDiffer cache and covidcast API data

+
+

The Problem

+

Per Katie’s issue description:

+
+

We found some items in USAFacts where the ArchiveDiffer cache (which determines which rows of each day’s output actually get added to the database) has lost sync with the API. This is a problem for at least three reasons:

+
    +
  • The data in the API is wrong

  • +
  • The publish mechanism assumes agreement with the API. No agreement means we might publish rows that shouldn’t be published, or not-publish rows that should be published.

  • +
  • Possibly indicates the publish mechanism has a bug (what caused us to lose sync?)

  • +
+

If we had a widget that exhaustively compared what was in the API with the ArchiveDiffer cache, we could identify and address mismatches.

+
+
+
+

The Widget

+

The widget works as following:

+
    +
  • Pull each .csv file from ArchiveDiffer cache currently stored in an AWS S3 bucket.

  • +
  • Construct the parameters for an API call based on the labels of our .csv on ArchiveDiffer.

  • +
  • Compare the data pulled from ArchiveDiffer with data from our API.

  • +
+

The widget eventually outputs a csv file. Each row describes in detail the comparison between data in each file on ArchiveDiffer and data returned from our API given the same params. This comparison includes whether there is a difference between data from the two sources, and if there is, how many rows are impacted.

+

Additionally, the widget will identify if a whole file from ArchiveDiffer is missing. This happens when the API does not return any data given matching params from an ArchiveDiffer csv file.

+
+
+

The Result

+

There exists significant mismatches between data obtained from the ArchiveDiffer cache and covidcast API.

+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SourcesNumber of files with row mismatchesNumber of files in ArchiveDiffer(%)
jhu-csse171659260818.535116
chng157253996139.350867
usa-facts94139039210.413532
quidel6055899826.729124
dsew-cpr26921565217.199080
hhs1506447483.365514
indicator-combination288288100.000000
covid-act-now28077043.634476
+

From this table, we see that source JHU has the highest number of of files with some row mismatches, closely followed by Change Healthcare. However, since JHU has a much bigger number of files on ArchiveDiffer in total, Change data from the API is actually the more inaccurate source by comparison (39% files have mismatches). The most inaccurate source when comparing API data to ArchiveDiffer data is indicator-combination. All indicator-combination data files on ArchiveDiffer currently have one or more rows different from the data returned from covidcast API.

+

Full-file mismatch happens when the API returns no row at all when looking for data from a file on ArchiveDiffer. Fortunately, USAFacts is the only source with significant number of files where the full file is missing.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SourcesNumber of full data missing from API
usa-facts340
hhs6
jhu-csse5
dsew-cpr2
chng1
+

Analysis by date shows that time in mismatched files are pretty evenly distributed. Overall, there is no particular period of time with less/more mismatch than others.

+

+
+
+

Widget Limitations

+

This widget cannot tell if a mismatched row exists in S3 but not API or vice versa. It can only show the number of rows that should exists in both storage places but in reality, only exists in one of them.

+
+
+

Next steps

+

Assuming that the ArchiveDiffer is always correct in comparison to the API content, we should start patching data in the API from the least accurate indicators, indicator-combination and chng.

+
+
diff --git a/static/blog/2023-06-26-mismatch/plot.png b/static/blog/2023-06-26-mismatch/plot.png new file mode 100644 index 0000000000000000000000000000000000000000..d15a6ee899f06d660aa31052c9b970b325916b11 GIT binary patch literal 32367 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 literal 0 HcmV?d00001