Category Archives: General

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: Italien am 16.03.

Die Situation in Italien sollte unser Denken und Handeln lenken.

Diese kleine Zitat-Sammlung hilft vielleicht. Alle zitierten Artikel wurden am 16.03. veröffentlicht.

Frankfurter Rundschau (16.03.):

Wurden am Montagmorgen (16.03.2020) noch rund 1800 Tote durch die Covid-19-Pandemie vermeldet, ist die Zahl nur wenige Stunden später um rund 350 Tote auf 2158 gestiegen. Bis Montag zählten die Behörden insgesamt 27.980 Infizierte mit dem Coronavirus Sars-CoV-2 im ganzen Land. Das waren rund 3000 mehr als am Vortag. Diese Zahlen teilte der Zivilschutz am Montagabend in Rom mit.

 
nst.com (16.03.):

“The numbers have continued to grow. We’re close to the moment where we will have no more intensive care beds,” Lombardy governor Attilio Fontana told SkyTG24 television. […] Authorities have been working to set up hundreds of intensive care beds in a specially created facility in the Fiera Milano exhibition centre but are still waiting for sufficient respirators and qualified personnel. […] Behind the concern for the north, there was also a looming worry over the much less well-equipped south, where tens of thousands of people have arrived from the affected regions.

 
independent.co.uk (16.03.):

A health official in Bergamo, warning that patients being admitted to hospital for treatment are getting younger. “The type of patient is changing,” said Luca Lorini, the head of anaesthesia and intensive care at a northern Italian hospital. “They are a bit younger, between 40 to 45 years old and the cases are more complicated,” she said.

 

cbc.ca (16.03.):

All the hospitals in northern Italy are stretched to the breaking point. Health-care workers are totally exhausted, themselves terrified of contracting the virus and passing it on to their own families. Ventilators are the only thing that will keep the sickest patients alive, and there may not be enough to go around. Doctors have been put in the agonizing position of deciding who lives and who dies. The elderly, and those with complicating medical conditions, might be sacrificed. “If you have to choose between a 75-year-old person and a 20-year-old person, who are you going to choose? Obviously, it’s the person with the higher expectation of life,” Casani said. “So there will be a moment that an anesthesiologist will have to take off the respirator from this 75-year-old guy and give it to the 20-year-old. And this will be a horrible choice for the doctors, but obviously necessary.”

“I think the question of ‘Why Italy?’ is the most important question and it has a simple answer: No reason at all. The only thing that makes Italy different is that the first couple of [community-transmitted] cases arrived in Italy about 10 days before they arrived in Germany, the United States or Canada. So if other countries aren’t going to react in an extreme way right now, they’re going to become Italy.”

 

web.de (16.03.)

Italienische Wissenschaftler haben angesichts der heftigen Coronakrise in ihrem Land Deutschland aufgefordert, schneller und strikter als bisher zu reagieren. “Unterschätzen Sie nicht die Gefahr. Italien hat das eine Woche lang getan”, sagte Roberto Burioni, einer der bekanntesten Virologen Italiens der Deutschen Presse-Agentur. […] An dem Institut, das einen Biomedizinzweig hat, würden Statistiker und Mathematiker für Italien von einer Dunkelziffer bei Infizierten von “mindestens Faktor zehn” ausgehen, sagte er. Ähnlich wie bei Masern. Da Italien am Sonntag fast 25.000 registrierte Infizierte gemeldet hat, bedeute das mindestens 250.000 Menschen, die das Virus in sich tragen.

FAZ (16.03.)

Die Gefahr, dass die deutschen Intensivstationen überlaufen, ist real. Das macht den Shutdown risikoethisch unvermeidbar.

 

tagesspiegel.de (16.03.)

Der Dachverband ärztlicher Berufsvereinigungen schlug am Sonntag in einem Brief an Minsterpräsident Giuseppe Conte Alarm: 1674 infizierte Krankenschwestern, -pfleger, Ärztinnen und Ärzte, das heiße, “wir sprechen von zehn Prozent der im Gesundheitssystem Tätigen, die entweder schon gestorben sind oder aber nicht mehr arbeiten können. […]

Conte selbst habe zugegeben, dass “unerlässliche Schutzkleidung” derzeit fehle oder rationiert sei, auf jeden Fall nicht ausreichend verfügbar. Im einzelnen nennt der Ärztefunktionär Handschuhe, ffp3-Masken, Kittel, Schutzbrillen und Überkleidung. […]

Allein am Samstag wurden in die Spitäler der Lombardei weitere 85 Covid-19-Patienten eingeliefert, die Intensivpflege benötigten – doppelt so viele wie noch vor einer Woche. Am Sonntag waren die freien Plätze an einer Hand abzuzählen. „Es gelingt uns zwar, täglich 20 bis 25 neue Plätze zu schaffen – aber wir stehen kurz vor dem Point of no return“, betonte auch der lombardische Gesundheitsminister Giulio Gallera. […]

„Wir müssen jeden Tag neue Covid-19-Patienten intubieren und sind pausenlos im Einsatz“, berichtete am Sonntag Ivano Riva, der Chef der Reanimationsabteilung des Stadt-Spitals Giovanni XXVIII. „Wir halten nicht mehr lange durch.“ In einer einzigen Woche sind dem Coronavirus in den beiden Provinzen mehr als 400 Menschen zum Opfer gefallen, in Bergamo bis zu 61 pro Tag. Die Krematorien in den beiden Provinzen haben auf 24-Stunden-Betrieb umgestellt.

[…]

Die Schaffung neuer Plätze in der Intensivmedizin ist ein Wettlauf gegen die Zeit: Laut einer in diesen Tagen in der britischen Wissenschaftszeitschrift „Lancet“ veröffentlichten italienischen Studie wird die Zahl der Infizierten in Italien ihren Peak voraussichtlich in etwa drei bis vier Wochen erreichen; bis zu diesem Zeitpunkt seien mindestens 4000 neue Betten auf Intensivstationen erforderlich.

 

Mehr Ressourcen: https://gehrcke.de/2020/03/covid-19-sars-cov-2-resources/

COVID-19 / SARS-CoV-2 resources

Last updated: March 25, 00:15 UTC

Resources about the current state

Datasets

Curated list of dashboards and visualizations

These are not all the things. That is not the goal, that is supposed to be a curated list. I found that these are some of the best (in terms of clarity, information content, data freshness, uniqueness, the organizations or people behind them, …):

Valuable background information

You’d like to understand things? You’d like to listen to researches talk about the topic?

How the open data community approaches this topic

It’s so cool to see how the scientific community approaches this topic in a truly collaborative fashion. Some things I enjoyed seeing:

Terminology

  • A coronavirus is a virus from a well-known family of viruses (discovered in the 1960s). The name is derived from the structural appearance (the 3D shape) that these viruses have.
  • SARS-CoV-2 is the name for the new, currently spreading, virus. It is a special kind of coronavirus. Its name is an abbreviation for “severe acute respiratory syndrome coronavirus 2”.
  • COVID-19 is the currently established name for the infectious respiratory disease caused by the new coronavirus SARS-CoV-2.

These names are official as of this WHO announcement.

Other resources

Building Pandas from source: conflicting types for ‘_xgetbv’ (while building BLOSC)

Quick note: I tried building pandas from source (Fedora 30).

During

$ python -m pip install -r requirements-dev.txt

I ran into

blosc/shuffle.c:177:1: error: conflicting types for ‘_xgetbv’

A little more context:

$ python -m pip install -r requirements-dev.txt
 
[...]
 
Installing collected packages: blosc, bottleneck, numexpr, soupsieve, beautifulsoup4, llvmlite, numba, thrift, fastparquet, html5lib, lxml, jdcal, et-xmlfile, openpyxl, pyarrow, PyQt5-sip, pyqt5, tables, python-snappy, s3fs, sqlalchemy, xarray, xlrd, xlsxwriter, xlwt, odfpy, pyreadstat, pandas-sphinx-theme
  Running setup.py install for blosc ... error
    Complete output from command /home/jp/.pyenv/versions/374-pandas-dev/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-fydbjk8m/blosc/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-x9bwxqkv/install-record.txt --single-version-externally-managed --compile --install-headers /home/jp/.pyenv/versions/374-pandas-dev/include/site/python3.7/blosc:
    SSE2 detected
    AVX2 detected
    running install
    running build
    running build_py
    creating build
    creating build/lib.linux-x86_64-3.7
    creating build/lib.linux-x86_64-3.7/blosc
 
[...]
 
    c-blosc/blosc/shuffle.c:177:1: error: conflicting types for ‘_xgetbv’
      177 | _xgetbv(uint32_t xcr) {
          | ^~~~~~~
    In file included from /usr/lib/gcc/x86_64-redhat-linux/9/include/immintrin.h:43,
                     from c-blosc/blosc/blosc-common.h:71,
                     from c-blosc/blosc/shuffle.h:18,
                     from c-blosc/blosc/shuffle.c:10:
    /usr/lib/gcc/x86_64-redhat-linux/9/include/xsaveintrin.h:60:1: note: previous definition of ‘_xgetbv’ was here
       60 | _xgetbv (unsigned int __A)
          | ^~~~~~~
    In file included from c-blosc/blosc/shuffle.c:11:
    c-blosc/blosc/shuffle-generic.h:61:13: warning: ‘unshuffle_generic_inline’ defined but not used [-Wunused-function]
       61 | static void unshuffle_generic_inline(const size_t type_size,
          |             ^~~~~~~~~~~~~~~~~~~~~~~~
    c-blosc/blosc/shuffle-generic.h:32:13: warning: ‘shuffle_generic_inline’ defined but not used [-Wunused-function]
       32 | static void shuffle_generic_inline(const size_t type_size,
          |             ^~~~~~~~~~~~~~~~~~~~~~
    error: command 'gcc' failed with exit status 1

The python-blosc documentation says :

Compiler specific optimisations are automatically enabled by inspecting the CPU flags building Blosc. They can be manually disabled by setting the following environmental variables: DISABLE_BLOSC_SSE2 and DISABLE_BLOSC_AVX2.

I ignorantly retried building with AVX2 instructions disabled:

$ DISABLE_BLOSC_AVX2=true pip install blosc
Collecting blosc
  Using cached https://files.pythonhosted.org/packages/6d/3b/2b707cd330a205ba5c69b5e8bfa9c05691442e45ce9ce882c4c8d343e61a/blosc-1.8.1.tar.gz
Installing collected packages: blosc
  Running setup.py install for blosc ... done
Successfully installed blosc-1.8.1
$ python -m pip install -r requirements-dev.txt
...
$ python setup.py build_ext --inplace -j 4
...

That worked. In my development setup I do not care about BLOSC performance, which is why I am OK with that workaround.

By the way, I needed to set up the following dependencies on Fedora 30:

sudo dnf install @development-tools
sudo dnf install libzstd-devel gcc-c++ snappy-devel

FreeNAS: insufficient space to install update (how to replace the USB boot device with a larger one)

I have been running a FreeNAS system at home over the last six years on a self-built machine. In 2013 I started with FreeNAS 9.1.0. I updated conservatively over the years without running into problems (this is rare — kudos to the engineering team behind this!). Recently I tried to install one of the last 11.2 patch releases and ran into the following error:

insufficient space to install update

My 4 GB USB thumb drive (which I have been using as the boot device during all these years) got too small.

Here is how to replace the FreeNAS boot device with a device of larger capacity; without downtime. 

Step 1

Plug in an additional USB thumb drive (8 GB capacity in my case).

Step 2

In the web interface, under System -> Boot Environments choose attach and select the device representing the newly plugged-in USB stick (da2, in my case). Select use all disk space. The message attaching device pops up and disappears shortly thereafter. Behind the scenes this adds the new storage device to the existing ZFS pool freenas-boot.

Step 3

Wait for the “re-silvering” to complete: under the hood, ZFS mirrors (copies) all data from the original USB thumb drive to the new device (which is now also part of the ZFS pool freenas-boot). Quote from the ZFS documentation:

The process of moving data from one device to another device is known as resilvering and can be monitored by using the zpool status command.

I monitored the progress with a shell, periodically invoking the command

zpool status freenas-boot

The output of that command is unambiguous, it either says that re-silvering is currently in progress, or not. In my case, the re-silvering took more than 1 hour to complete because the thumb drive I added has some quite slow write performance.

Step 4

Only do this after making sure that re-silvering (step 3) completed :-).

Remove (unplug) the old (small capacity) USB boot device. Verify that the pool is healthy after unplugging: zpool status freenas-boot must show pool state: ONLINE with one device being online. In my case: da2p2 ONLINE. Remember the device name; it is needed in step 6.

Step 5

Set the autoexpand property on the boot pool:

zpool set autoexpand=on freenas-boot

In my case, this command took quite a while to return.

Note: after this command returns zfs list still shows the old (small) capacity for freenas-boot (1.69 G available, in my case).

Step 6

Trigger the automatic expansion:

zpool online -e freenas-boot da2p2

What is this doing? Why does this work? Quote from the ZFS documentation:

You can expand the pool size automatically when a smaller disk is replaced by a larger disk by using the zpool online -e command even if the disk is already online.

Step 7

Validate. zfs list should now show the newly available capacity (in my case: 5.39 G available).

Step 8

The ZFS pool from which the system boots now has more capacity. If you came here because your system update failed with “insufficient space to install update” then you can now retry updating FreeNAS.

If you are using a USB thumb drive as slow as mine then the update procedure can easily take 2-3 hours. During that time I used iostat -x da2 1 (executed in a remote shell, on the FreeNAS system) to confirm that data is actually being copied around (as opposed to the update procedure hanging indefinitely as of an error).

Final words

You can also use this technique to simply mirror your boot device; to operate the freenas-boot pool from two USB sticks. For enhanced fault tolerance of your FreeNAS setup. That is advisable and indeed what I did after switching to a larger pool size.