Das RKI veröffentlicht täglich die gemeldeten Coronafälle in einer Tabelle, aufgeschlüsselt u.a. nach Meldedatum, Alter, Geschlecht, Landkreis etc.
Diese Daten liegen unter einer offenen, mit CC-BY kompatiblen Lizenz vor: Robert Koch-Institut, dl-de-by-2.0
Leider werden die alten Versionen dieser Daten täglich überschrieben. Das hat zur Folge, dass man bspw. nicht den Verzug zwischen Erkrankungsbeginn und Veröffentlichung analysieren kann, was aber zentral z.B. für eigene Nowcasting-Berechnungen ist.
Daher sammeln wir alte Datei-Versionen und stellen sie online ebenfalls unter RKI dl-de-by-2.0 zur Verfügung. Per Scraper versuchen wir das Archiv täglich aktuell zu halten. Als Feature bereinigen wir sogar die Daten, um z.B. die Probleme mit den unterschiedlichen Datumsformaten zu korrigieren.
- Die Rohdaten werden täglich im Ordner
0_archivedergänzt und im Anschluss hier als HTML-Datei oder wahlweise als TXT-Datei chronologisch sortiert aufgelistet. - Fehlerhafte Rohdaten werden nach
1_ignoredverschoben, z.B. wenn durch technische Probleme nur Teile der CSV-Datei zum Download standen: HTML/TXT - Gesäuberte Daten werden täglich unter
2_parsedhochgeladen und sind hier aufgelistet als HTML oder TXT
Da die Datenmenge sehr stark angewachsen ist und einzelne Dumps über 500 MB groß werden können, so dass die 1-GB-Stringlängenbegrenzung von JavaScript überschritten wird, musste auf ein neues Datenformat umgestiegen werden. Die Dateien liegen jetzt vor:
- als NDJSON (jede Zeile ist ein Eintrag, als JSON-Objekt formatiert und endet auf '\n') und
- mit XZ-Utils komprimiert (XZ/LZMA ist sehr effektiv, open-source, kostenlos, plattformübergreifend erhältlich und wird von vielen Kompressionsprogrammen unterstützt)
Die Datenfelder sind vom RKI auf der ArcGIS-Plattform erklärt.
Es hat sich aber gezeigt, dass insbesondere die Datumsfelder in einem schlechten Zustand sind. Neben unterschiedlichen Datumsformaten, gibt es sogar Infektionsfälle aus dem Jahr 1956. Der Parser korrigiert die gröbsten Fehler und ergänzt die Datensätze um die Felder MeldedatumISO, DatenstandISO und RefdatumISO, die das jeweilige Datum immer in der ISO-Form "YYYY-MM-DD" formatieren.
Hier noch eine kurze Erklärung, warum Fallzahlen negativ sein können.
Ansonsten haben wir uns bemüht darauf zu achten, keine Fehler zu machen. Falls uns trotzdem einer unterlaufen ist, freuen wir uns über Hinweise.
Diese Daten sind natürlich keine offizielle Veröffentlichung des RKI oder der ARD, sondern eine freundliche Unterstützung für Forschung und Recherche. Offizielle Daten gibt es nur beim RKI.
Der Code läuft aktuell nur unter UNIX-Betriebssystemen, also z.B. Linux/Mac OS. Er dient dem Scrapen und Säubern der Daten.
bin/1_download.jsüberprüft all 10 Minuten, ob das RKI die Daten aktualisiert hat, und lädt sie ggf. runter.bin/2_deduplicate.shlöscht doppelte Dateien, also wenn es keine Änderungen an den Daten gab.bin/3_parse.jsparst die API-/CSV-Rohdaten und macht daraus sauberes und einheitliches JSON.bin/4_check.jsführt Plausibilitätschecks durch. Z.B. darf die Anzahl aller bisherigen Infektionen nicht sinken, aber auch nicht um mehr als 30'000 ggü. dem Vortag steigen..bin/5_index_data.jsgeneriert HTML- und TXT-Listen als Hilfe for den Cloud Storage.bin/6_upload.shlädt die Daten in den Cloud Storage hoch. Ich bin offen für Vorschläge, wohin die Dateien noch gesichert werden können.bin/run.shist das Bash-Script für einen kompletten Scraper-Durchlauf.bin/loop.shenthält eine Endlosschleife, die alle 10 Minuten einen Scraper-Durchlauf initiiert.bin/lib/config.jsenthält einen Überblick über alle Felder, inklusive einfacher Tests, ob die Felder richtig befüllt sind.bin/lib/helper.jssind die kleinen Helferlein, die man so braucht.
Den neuesten Datenstand als "latest.ndjson.xz" runterladen:
curl "https://storage.googleapis.com/brdata-public-data/rki-corona-archiv/2_parsed/index.txt" | tail -n 1 | xargs -I % wget -O latest.ndjson.xz "https://storage.googleapis.com/brdata-public-data/rki-corona-archiv/2_parsed/%"Alle Dateien runterladen:
wget -nc -r -np -l 1 -A xz https://storage.googleapis.com/brdata-public-data/rki-corona-archiv/2_parsed/index.htmlDie gesäuberten Daten aus 2_parsed kann man relativ leicht auf der Shell parsen und filtern. Beispiel:
xz -dkc *.ndjson.xz | jq -r '. | select (.IdLandkreis == "09162" and .Altersgruppe == "A05-A14") | [.Geschlecht, .AnzahlFall, .NeuerFall, .MeldedatumISO, .DatenstandISO, .RefdatumISO] | @tsv'Der Befehl besteht aus den folgenden Teilen:
xz -dkc *.ndjson.xz |
Dekomprimiere alle Dateien (-d), die auf.ndjson.xzenden und pipe die Ergebnisse (-c) weiter.jq -r '…'
Mit jq kann man sehr effizient JSON verarbeiten. Die Query- und Filtermöglichkeiten sind gut dokumentiert.. | select (.IdLandkreis == "09162" and .Altersgruppe == "A05-A14") | [.Geschlecht, .AnzahlFall, .NeuerFall, .MeldedatumISO, .DatenstandISO, .RefdatumISO] | @tsv'
Alle bekannten COVID19-Fälle aus dem Stadtkreis München (.IdLandkreis == "09162"), mit Patient_innen im Schulalter (.Altersgruppe == "A05-A14") sollen als Tab-separierte Datei (| @tsv) exportiert werden, mit den 6 Spalten: Geschlecht, AnzahlFall, NeuerFall, MeldedatumISO, DatenstandISO, RefdatumISO