In december 2019 meldden de gezondheidsautoriteiten in Wuhan, China, een cluster van patiënten met een longontsteking van onbekende oorzaak. Een nieuw type coronavirus werd geïdentificeerd als de oorzaak. Sindsdien heeft de COVID-191 epidemie zich verspreid naar vele landen op alle continenten.
Voor België is de wetenschappelijke instelling Sciensano2 verantwoordelijk om informatie over COVID-19 te verzamelen en beschikbaar te stellen aan gezondheidswerkers3 en de algemene bevolking4. Naast een online dashboard5 waarop de verspreiding van het virus op de voet kan gevolgd worden, bieden ze via het Brussels Open Data platform6 ook een API aan waaraan gedetailleerde data kan opgevraagd worden.
We hebben via de Sciensano API een CSV-bestand7 gedownload met historische data over de verspreiding van het coronavirus in België, en opgeslagen onder de naam covid19.csv8. Elke regel van het bestand beschrijft het aantal nieuwe ziekenhuisopnames op een bepaalde datum in een bepaalde provincie, aan de hand van de volgende informatievelden die van elkaar gescheiden worden door komma's: i) datum, ii) provincie, iii) gewest en iv) aantal nieuwe ziekenhuisopnames. De eerste regels van het bestand zien er bijvoorbeeld als volgt uit:
2020-03-15,Antwerpen,Flanders,8 2020-03-15,Brabant Wallon,Wallonia,1 2020-03-15,Brussels,Brussels,7 2020-03-15,Hainaut,Wallonia,26 2020-03-15,Liège,Wallonia,4 2020-03-15,Limburg,Flanders,9 2020-03-15,Luxembourg,Wallonia,3 2020-03-15,Namur,Wallonia,0 2020-03-15,Oost-Vlaanderen,Flanders,5 2020-03-15,Vlaams-Brabant,Flanders,2
Schrijf een bash shell script covid waarmee voor een bepaalde regio (een gewest of een provincie) een overzicht kan gegenereerd worden met statistieken over het aantal COVID-19-gerelateerde ziekenhuisopnames op een bepaalde datum. De regio waarvoor het overzicht moet gegenereerd worden, moet als argument aan het shell script doorgegeven worden. Optioneel kan als tweede argument ook nog de padnaam doorgegeven worden van een CSV-bestand met historische data over het aantal ziekenhuisopnames. Als er geen tweede argument wordt doorgegeven, dan moet het shell script de historische data inlezen via stdin.
Het shell script moet naar stdout een overzicht uitschrijven met de volgende informatie:
de regio (het gewest of de provincie) waarvoor de metingen in rekening gebracht worden
het totaal aantal ziekenhuisopnames in de afgelopen zeven dagen in die regio
de hospitalisatietrend van de afgelopen veertien dagen in die regio
Het exacte formaat van het overzicht kan afgeleid worden uit onderstaande voorbeeldsessie.
De hospitalisatietrend wordt afgeleid van de helling van de rechte die het totaal aantal ziekenhuisopnames van de afgelopen zeven dagen aan het begin en einde van de opgegeven periode met elkaar verbindt. Voor de provincie Brussel hebben we bijvoorbeeld de volgende data tussen 15 maart 2020 en 4 april 2020:
2020-03-15,Brussels,Brussels,7
2020-03-16,Brussels,Brussels,11
2020-03-17,Brussels,Brussels,16
2020-03-18,Brussels,Brussels,18
2020-03-19,Brussels,Brussels,33
2020-03-20,Brussels,Brussels,29
2020-03-21,Brussels,Brussels,40
2020-03-22,Brussels,Brussels,41
2020-03-23,Brussels,Brussels,21
2020-03-24,Brussels,Brussels,52
2020-03-25,Brussels,Brussels,69
2020-03-26,Brussels,Brussels,76
2020-03-27,Brussels,Brussels,93
2020-03-28,Brussels,Brussels,90
2020-03-29,Brussels,Brussels,98
2020-03-30,Brussels,Brussels,53
2020-03-31,Brussels,Brussels,101
2020-04-01,Brussels,Brussels,85
2020-04-02,Brussels,Brussels,107
2020-04-03,Brussels,Brussels,62
2020-04-04,Brussels,Brussels,75
De hospitalisatietrend op 4 april 2020 wordt dan als volgt berekend:
het totaal aantal ziekenhuisopnames in de periode van 7 dagen die eindigt op 21 maart 2020 (veertien dagen voor de gegeven datum; aangegeven in het blauw) is gelijk aan \[ 7 + 11 + 16 + 18 + 33 + 29 + 40 = 154 \]
het totaal aantal ziekenhuisopnames in de periode van 7 dagen die eindigt op 4 april 2020 (de gegeven datum; aangegeven in het groen) is gelijk aan \[ 98 + 53 + 101 + 85 + 107 + 62 + 75 = 581 \]
de hospitalisatietrend is gelijk aan \[ \frac{581}{154} - 1 = 2.77 \] ofwel 277%
Onderstaande figuur illustreert de betekenis van de hospitalisatietrend. De blauwe punten stellen het totaal aantal ziekenhuisopnames voor in de periode van 7 dagen die eindigt op de corresponderende datum. De rode lijn is een rechte die de waarden van 21 maart 2020 en 4 april 2020 met elkaar verbindt. De hospitalisatietrend wordt bepaald op basis van de helling van deze rechte.
Om de datum vast te leggen waarvoor de statistieken moeten berekend worden, moet het shell script de optie -d <date> ondersteunen met de datum als verplicht argument. Als deze optie niet gebruikt wordt dan moet het script de meest recente datum uit de dataset nemen.
Als de optie -p meegegeven wordt (zonder argument) dan moet de gegeven regio geïnterpreteerd worden als een provincie en worden de statistieken enkel bepaald op basis van de data voor die specifieke provincie. Anders verwijst de gegeven regio naar een gewest en moet het script de statistieken bepalen op basis van alle data voor dat gewest (ongeacht de opdeling van het gewest in provincies).
Het shell script moet volgende foutafhandeling voorzien:
als het shell script niet de gepaste opties meekrijgt (enkel ondersteuning voor de opties -d en -p), als er geen verplicht argument wordt meegegeven met de optie -d, of als er niet één of twee argumenten worden doorgegeven aan het shell script, dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stderr en moet het shell script eindigen met exit status 1
als de padnaam van het CSV-bestand dat aan het shell script wordt doorgegeven niet verwijst naar een gewoon leesbaar bestand, dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stderr en moet het shell script eindigen met exit status 2
als het argument dat aan de optie -d wordt meegegeven geen correct datumformaat volgt (YYYY-MM-DD), dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stderr en moet het shell script eindigen met exit status 3
als er geen data van de gegeven regio gevonden worden die binnen de gegeven periode vallen, dan moet de gepaste boodschap (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stderr en moet het shell script eindigen met exit status 4
Als er zich geen fouten voordoen, dan moet het shell script eindigen met exit status 0.
Merk op dat de hospitalisatietrend alleen maar kan berekend worden als men over voldoende data beschikt uit de periode voorafgaand aan de opgegeven datum. Het is geen fout om een datum aan het script door te geven waarvoor onvoldoende data beschikbaar is om de hospitalisatietrend te bepalen; in dat geval is de hospitalisatietrend onbepaald.
Onderstaande voorbeeldsessie geeft aan hoe het shell script covid moet kunnen gebruikt worden. Hierbij gaan we ervan uit dat het tekstbestand covid19.csv9 zich in de huidige directory bevindt.
$ covid Syntaxis: covid [-d DATUM] [-p] PLAATS [FILE] $ echo $? 1 $ covid -abc Brussels Brussels Syntaxis: covid [-d DATUM] [-p] PLAATS [FILE] $ echo $? 1 $ covid -p Brussels xxx covid: het opgegeven bestand bestaat niet of is niet leesbaar $ echo $? 2 $ covid -p Brussels covid19.csv10 PROVINCIE: Brussels
DATUM : 2020-08-12
OPNAMES : 60
TREND : +53.00% (stijgend) $ covid -p Brussels < covid19.csv11 PROVINCIE: Brussels
DATUM : 2020-08-12
OPNAMES : 60
TREND : +53.00% (stijgend) $ covid -d 2020-07-10 -p Brussels covid19.csv12 PROVINCIE: Brussels
DATUM : 2020-07-10
OPNAMES : 7
TREND : -50.00% (dalend) $ covid -d 2020-03-15 -p Brussels covid19.csv13 PROVINCIE: Brussels
DATUM : 2020-03-15
OPNAMES : 7
TREND : onbepaald $ covid -d gisteren -p Brussels covid19.csv14 covid: ongeldige datum $ echo $? 3 $ covid Wallonia covid19.csv15 REGIO : Wallonia
DATUM : 2020-08-12
OPNAMES : 52
TREND : +52.00% (stijgend) $ covid Wallonia < covid19.csv16 REGIO : Wallonia
DATUM : 2020-08-12
OPNAMES : 52
TREND : +52.00% (stijgend) $ covid -d 2020-02-01 -p Brussels covid19.csv17 covid: geen data voor de opgegeven periode $ echo $? 4 $ covid -p Gent covid19.csv18 covid: geen data voor de opgegeven periode $ echo $? 4