Monthly Archives: March 2020

Bokeh: disable touch interaction (disable drag, zoom, pan)

Bokeh is quite cool. I was looking for a way to disable touch interaction with a plot, though. Was a little tedious to find a solution on the web. Found it, buried in the docs. Therefore this quick post.

Say you have created a figure object with

fig = bokeh.plotting.figure(...)

Then you can disable the individual touch controls with e.g.

fig.toolbar.active_drag = None
fig.toolbar.active_scroll = None
fig.toolbar.active_tap = None

Very easy to do, you just need someone to tell you :-).

(Tested with Bokeh 2.0.0)

Bulma: sticky footer (flexbox solution)

Bulma is nice. I was looking for a way to get a sticky footer, though. Like many others, I was a little surprised that it’s not built-in: https://github.com/jgthms/bulma/issues/47

It’s of course doable. I have created a demo / minimal working example based on the solution proposed here.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Footer at the bottom / sticky footer</title>
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/bulma@0.8.0/css/bulma.min.css"
    />
    <style type="text/css" media="screen">
      body {
        display: flex;
        min-height: 100vh;
        flex-direction: column;
      }
 
      #wrapper {
        flex: 1;
      }
    </style>
  </head>
  <body>
    <div id="wrapper">
      <section class="hero is-medium is-primary is-bold">
        <div class="hero-body">
          <div class="container">
            <h1 class="title">
              The footer is at the bottom. Seriously. 🦠
            </h1>
            <h2 class="subtitle">
              By <a href="https://gehrcke.de">Jan-Philip Gehrcke</a>
            </h2>
          </div>
        </div>
      </section>
    </div>
    <footer class="footer">
      <div class="content has-text-centered">
 
          I am down here.
 
      </div>
    </footer>
  </body>
</html>

I posted this in the GH thread, too: https://github.com/jgthms/bulma/issues/47#issuecomment-603547213

COVID-19-Fallzahlen: bitte zitiert nicht die JHU. Sondern die Landesministerien.

Liebe ARD Tagesschau/Tagesthemen und liebes ZDF heute journal: Ihr macht einen fantastischen Job in der COVID-19-Berichterstattung. Danke dafĂĽr!

Aber eine Bitte habe ich an Euch und an viele andere deutsche Medien: bitte zitiert nicht die Johns Hopkins University (JHU), wenn Ihr die aktuellen Fallzahlen von bestätigten COVID-19-Infektionen für Deutschland berichtet.

Die Zahlen selbst sind gut. Die Quelle “JHU” jedoch sorgt fĂĽr ziemlich viel Verwirrung. Bitte zitiert stattdessen unsere Gesundheitsämter und Landesministerien: gleiche Zahlen, korrekte Quelle, weniger Verwirrung. Das versuche ich in diesem Beitrag zu erklären.

Dass viele Bürger sich fragen woher die Diskrepanz zwischen den JHU-Zahlen und den vom Robert Koch-Institut (RKI) veröffentlichten Zahlen kommt, wisst Ihr selbst.

Auch ich habe mich gefragt, warum das heute journal die JHU und nicht das RKI zitiert. In Anbetracht der Unterschiedlichkeit der Zahlen wollte ich das gerne von Euch erklärt bekommen.

Das heute journal ist darauf mit einem Beitrag in der Sendung vom 19.03. eingegangen (kann man in diesem Tweet noch einmal sehen). Aber ich wurde enttäuscht: uns wurde gesagt, dass die JHU sich auf Quellen wie “WHO, CDC, ECDC, NHC, DXY, …” beziehen wĂĽrde. Wir blieben ratlos. Das war keine plausible Erklärung fĂĽr die Diskrepanz der Datensätze und fĂĽr die Entscheidung JHU statt RKI zu zitieren.

Kurzer Exkurs zur genannten Diskrepanz, am Beispiel vom 21. März. Der RKI Situationsbericht zum 21.03.2020 sagt: 16.662 bestätigte Fälle. Die JHU behauptet am heutigen Abend des 21. März: etwa 22.000 bestätigte Fälle. Vergleichbar? Im RKI Situationsbericht steht, dass er dem Datenstand vom 21.03.2020 um 0:00 Uhr entsprechen soll. Also sollte man diese Zahl mit dem letzten Stand der JHU-Daten vom 20.03. vergleichen. Schauen wir nach: time_series_19-covid-Confirmed.csv, Zeile 13, im git repository CSSEGISandData/COVID-19 auf GitHub. Da steht für den 20.03. die Zahl 19.848.

Eine faire Frage ist also: “Warum berichtet das RKI fĂĽr das Ende des Tages des 20. März etwa 16.600 Fälle, während die JHU fĂĽr den gleichen Zeitpunkt etwa 19.800 Fälle berichtet?”

Darauf gibt es meiner Meinung nach eine klare und zufriedenstellende Antwort: die JHU-Daten entsprechen aktuellen und offiziellen Daten der Landesministerien. Die RKI-Daten sind geprüfte und verzögert veröffentlichte Daten der selben Landesministerien.

jeder von uns kann sich zu jedem Zeitpunkt des Tages die kleine Mühe machen und die jeweils aktuellen COVID-19-Fallzahlen der einzelnen 16 Bundesländer nachlesen. Ich mache das hier mal vor, mit aktuellen Zahlen von sechs Bundesländern (während ich diesen Text schreibe):

Das Prinzip ist klar. Diese Fallzahlen-Portale und Statistiken der einzelnen Länder sind schon recht gut gemacht. Danke, liebe Landesministerien! Hier verlinke ich noch ein paar mehr davon.

Wenn ich jetzt die Bevölkerung über den aktuellen Stand der bestätigten COVID-19-Fallzahlen in den genannten sechs genannten Ländern informieren wollte, dann könnte ich doch einfach aufsummieren und schreiben: etwa 17.400 Fälle, Stand 21.03. (vormittags/mittags). Quelle: Gesundheitsministerien der Bundesländer.

Oder nicht? Eine plausible, vertrauenswĂĽrdige Quelle. Im Gegensatz zur mysterischen, nicht direkt plausiblen Quelle “JHU”.

Wenn man jetzt noch die 10 anderen Länder dazurechnet kommt man auf den derzeitigen Stand (während ich schreibe) von etwa 22.000 bestätigten Fällen (weiter oben haben wir die Zahl schon gesehen: das ist das was die JHU derzeit berichtet während ich das hier schreibe).

Meines Wissens nach ist das genannte Vorgehen (Konsultation der Ländesbehörden) genau das, was ZEIT ONLINE und Berliner Morgenpost akribisch mehrfach am Tag tun. Die erhaltenen Daten pflegen sie sofort in ihre Visualisierungen ein:

Und die Zahlen des RKI? Es schreibt selbst:

“Zwischen dem Bekanntwerden eines Falls vor Ort, der Meldung an […], der Eingabe der Daten in […] und von dort an das RKI liegt eine gewisse Zeitspanne. Die kann gemäß den Vorgaben im Infektionsschutzgesetz zwei bis drei Arbeitstage lang sein.”

Schlussfolgerung 1: Die Landesministerien veröffentlichen, gut aufbereitet, zu jedem Zeitpunkt ihren aktuellen Datenstand. Aggregiert von den ihnen jeweils unterstellten Gesundheitsämtern. Das sind offizielle Zahlen. Und wahrscheinlich auch ganz gute (belastbare) Zahlen. Aber auch diese Zahlen sind natürlich schon verzögert gegenüber den Meldungen der Gesundheitsämter!

Schlussfolgerung 2: Ich denke, dass wir die Zahlen von ZEIT ONLINE und Berliner Morgenpost jeweils guten Gewissens benutzen können. Denn sie repräsentieren meinen Stichproben nach exakt die Veröffentlichung der Landesministerien.

Schlussfolgerung 3: das RKI prozessiert die Daten langsam und erzeugt gegenüber den Landesministerien eine Verzögerung in der Veröffentlichung der Daten von weiteren 1 bis 2 Tagen. Warum das so ist: unklar. Eine eingehende Prüfung der Daten? Vielleicht. Dafür hätte ich gerne eine bessere Erklärung!

Schlussfolgerung 4: Tagesschau und heute journal: bitte nennt als Quelle für die aktuellen Fallzahlen die Landes(gesundheits)ministerien bzw. die Gesundheitsämter. Das ist korrekt und stiftet weniger Verwirrung.

Vielleicht könntet Ihr auch noch zusätzlich ZEIT ONLINE oder die Berliner Morgenpost zitieren, die die Konsultation für uns vornehmen und die jeweils aktuelle Summe für uns bereithalten.

Danke.

Randnotiz 1: ich hatte darĂĽber schon vor ein paar Tagen geschrieben und versucht die Gedanken hier ein bisschen klarer zu sortieren.

Randnotiz 2: ich arbeite an https://github.com/jgehrcke/covid-19-germany-gae. Eine konsolidierte und automatisiert konsumierbare Datenquelle der aktuellen Fallzahlen in Deutschland, der individuellen Bundesländer, inkl. Zeitverlauf in der Vergangenheit.

Covid-19 HTTP API: case numbers as time series, for individual German states

I have built an HTTP API for providing the confirmed case numbers of Covid-19 infections in Germany, resolved by time as well as spatially — by the individual states.

To my knowledge that is the only data source providing this kind of information for automated consumption. That’s why I built it.

Here is the corresponding GitHub repository: https://github.com/jgehrcke/covid-19-germany-gae

The API is served by Google App Engine in Europe.

Of course this project is based on the shoulders of giants. Feel free to ask questions below. Thank you!

The primary concerns are:

  • convenience (easy to consume for you in your tooling!)
  • interface stability
  • data credibility
  • availability

Here is how to use that API:

For the history (time series) information for a specific German state:

First, construct the URL based on this pattern:

https://covid19-germany.appspot.com/timeseries/<state>/<metric>

For <state> use a ISO 3166 code, for <metric> use “cases” or “deaths”.

For example, to fetch the time evolution of the number of confirmed cases for Bayern (Bavaria):

$ curl -s https://covid19-germany.appspot.com/timeseries/DE-BY/cases | jq
{
  "data": {
    "2020-03-10T12:00:00+01:00": "314",
    "2020-03-11T12:00:00+01:00": "366",
    "2020-03-12T12:00:00+01:00": "500",
    "2020-03-13T12:00:00+01:00": "558",
    "2020-03-14T12:00:00+01:00": "681",
    "2020-03-15T12:00:00+01:00": "886",
    "2020-03-16T12:00:00+01:00": "1067",
    "2020-03-17T21:00:00+01:00": "1352",
    "2020-03-18T23:00:00+01:00": "1798"
  },
  "meta": {
    "info": "https://gehrcke.de/2020/03/covid-19-http-api-german-states-timeseries",
    "source": "Official numbers published by public health offices (Gesundheitsaemter) in Germany"
  }
}

The points in time are encoded using localized ISO8601 time string notation. Any decent datetime library can parse that into timezone-aware native timestamp representations.

For a current snapshot for all of Germany (no time series information):

$ curl -s https://covid19-germany.appspot.com/now | jq
{
  "current_totals": {
    "cases": 12223,
    "deaths": 31,
    "recovered": 99,
    "tested": "unknown"
  },
  "meta": {
    "contact": "Dr. Jan-Philip Gehrcke, jgehrcke@googlemail.com",
    "source": "ZEIT ONLINE (aggregated data from individual ministries of health in Germany)",
    "time_source_last_consulted_iso8601": "2020-03-19T03:47:01+00:00",
    "time_source_last_updated_iso8601": "2020-03-18T22:11:00+01:00"
  }
}

The data

Original data source: Gesundheitsämter

All data is exclusively based on official numbers published by public health offices in Germany (the Gesundheitsämter).

Attribution for collection and aggregation: RKI, ZEIT ONLINE

Numbers from the individual (hundreds of) health offices are first collected and aggregated on the state level, by the individual state health ministries. From here, they are further collected and published by the Robert Koch-Institut (yielding the data points in my database before March 17), but also by ZEIT ONLINE (yielding the data points in my database from March 17 on).

The time evolution detail of the data on the individual state level however gets lost in this publishing process, and I am carefully re-adding this aspect in hindsight.

Deutschlands Covid-19 Fallzahlen des RKI (und der WHO) haben inzwischen 2-3 Tage Verzögerung zu den Daten der Gesundheitsämter

Die einzelnen Schritte des Datenflusses:

  1. Bekanntwerden eines Falls
  2. Meldung an das Gesundheitsamt
  3. Eingabe der Daten in eine Software
  4. Übermittlung an die zuständige Landesbehörde
  5. Ăśbermittlung an das RKI
  6. Ăśbermittung an die WHO.

Alle Schritte bis auf den Letzten sind vom RKI so dokumentiert.

Jeder dieser Schritte involviert eine Brieftaube und braucht ein bisschen Zeit :-).

So steht im Situationsbericht 58 der WHO, dass wir am 18.03. etwa 7100 bestätigte Covid-19 Fälle in Deutschland hatten.

Die Gesundheitsämter hatten aber schon am 17.03. mehr als 9000 Fälle registriert, am 18.03. deutlich über 12000. Konkret heißt das, dass die von der WHO veröffentlichte Zahl für den 18.03. eher der bekannten Zahl vom 16.03. entspricht.

Ich denke nicht, dass die Daten solange geprüft werden müssen. Ich denke, dass wir den Zahlen der Landesbehörden trauen können (das sind offizielle Zahlen; Beispiel einer Pressemitteilung des Landes Berlin vom 18.03.). Warum werden diese Daten so lange prozessiert?

Wenn diese daten wirklich so lange prozessiert werden müssen — warum werden sie dann nicht rückdatiert? Das wäre den Konsumenten der Zahlen gegenüber nur fair.

In der jetzigen Phase des exponentiellen Wachstums ist es sehr wichtig zu wissen, dass die Deutschland-Zahlen des RKI und der WHO eine erhebliche Verzögerung aufweisen. Eine Verzögerung von 2-3 Tagen entspricht der derzeitigen Verdopplungszeit der gemessenen Zahl der Covid-19 Fälle in Deutschland (Plot).

Das RKI sagt ĂĽbrigens “In der aktuellen Lage erfolgt die Ăśbermittlung deutlich schneller als im Routinebetrieb”.

Und:

“Zwischen dem Bekanntwerden eines Falls vor Ort, der Meldung an […], der Eingabe der Daten in […] und von dort an das RKI liegt eine gewisse Zeitspanne. Die kann gemäß den Vorgaben im Infektionsschutzgesetz zwei bis drei Arbeitstage lang sein.

(https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Fallzahlen.html)

Update: eine hilfreiche Diskussion zu diesem Thema findet ihr in https://github.com/CSSEGISandData/COVID-19/issues/1008.