Epidemiologija

Rok za oddajo: ponedeljek, 16. januar 2023, 23.59

Ocena 6

Napišite funkcijo preberi_podatke(), ki vrne slovar, katerega ključi so dnevi, pripadajoče vrednosti pa skupno število okuženih do tistega dneva v Sloveniji. Ključ (datum) naj bo terka (mesec, dan). Funkcija naj zajame podatke za leto 2020; podatke za 2021 naj ignorira.

Funkcija vrne slovar, ki se začne tako

{(3, 5): 2, (3, 6): 7, (3, 7): 7, (3, 8): 16, (3, 9): 16, (3, 10): 31, (3, 11): 57, ...

Predlagam, da se reševanja lotite po korakih. Posamične korake potem zavržete in obdržite samo končno funkcijo.

  1. Odzipajte priloženo datoteko podatki.zip v primerno mapo. Podatki so pobrani z repozitorja na GitHubu, ki ga vzdržuje Univerza John Hopkins.

  2. Oglejte si funkcijo os.listdir. Dokumentacijo poiščite sami. (Namerno. Za vajo.) Napišite program, ki izpiše imena vseh datotek (iz onega arhiva) s končnico .csv.

  3. Namesto, da v zanki izpisujete imena datotek, z vsako datoteko storite naslednje. S pomočjo funkcije csv.DictReader preberite podatke. Poiščite vrstico, ki ustreza Sloveniji. (Pozor: kot boste opazili, se stolpec z imenom države ne imenuje vedno enako - nekega nelepega dne so ga preimenovali. Vaš program bo to rešil tako, da bo najprej preveril, ali obstaja stolpec s prvim imenom, sicer pa, ali obstaja stolpec z drugim - in uporabil, kar ima). Izpišite datum (dobite ga iz imena datoteke) in število okuženih na tа dan.

  4. Namesto, da bi le izpisovali, podatke shranjujte: sestavite slovar, katerega ključi so dnevi, vrednosti pa (kumulativno) število okuženih na tisti dan v Sloveniji.

  5. Točko 4 spremenite v funkcijo, kot jo zahteva naloga.

Ocena 7

Napišite funkcijo okuzbe(podatki), ki prejme slovar, kakršnega vrača gornja funkcija in vrne število novookuženih na ta dan. (Da, od vsakega dneva morate odšteti število okuženih na prejšnji dan.)

Pri tem ne računajte na to, da vam bo prehod prek slovarja z zanko for (for datum, okuzenih in podatki.items()) vračal dneve v pravilnem vrstnem redu. Glede na to, da imamo terke (mesec, dan), pa bo sorted(podatki) vrnil ključe v pravilnem vrstnem redu, od (1, 1) do (12, 31) (točneje, od (3, 5), ko se Slovenija pojavi v podatkih). Potem lahko s podatki[dan] dobite število okuženih na ta dan. Število okuženih na prejšnji dan, pa je pač podatek, ki ste ga dobili v prejšnjem krogu zanke (in se ga splača shraniti za naslednji krog).

Če naredite pravilno, bo ta funkcija krajša od 10 vrstic. (Načelno lahko tudi samo eno, ampak ni treba riniti v to.)

Funkcija vrne slovar, ki se začne takole:

{(3, 5): 2, (3, 6): 5, (3, 7): 0, (3, 8): 9, (3, 9): 0, (3, 10): 15, (3, 11): 26,

(Vrstni red ne bo nujno enak - bodo pa to prvi ključi po vrstnem redu.)

Ocena 8

Napiši funkcijo mesecne_okuzbe(okuzb), ki prejme slovar, kakršnega vrača funkcija okuzbe in vrne slovar (ali, če hočete, defaultdict), katerega ključi so meseci, vrednosti pa število potrjenih okužb v tem mesecu.

Konkretno, funkcija vrne tole.

{3: 802, 4: 627, 5: 44, 6: 127, 7: 556, 8: 727,
 9: 2807, 10: 28617, 11: 41507, 12: 46338}

Napišite tudi funkcijo tedenske_okuzbe(okuzb), ki prešteje okužbe v posameznem tednu. Ključi tega slovarja so datumi nedelj, vrednosti pa število potrjenih okužb v tednu od predhodnega ponedeljka do te nedelje.

Zadnji, nepopolni teden leta izpustite.

Rezultat je takšen:

{(3, 8): 16, (3, 15): 203, (3, 22): 195, (3, 29): 316, (4, 5): 267,
 (4, 12): 208, (4, 19): 125, (4, 26): 66, (5, 3): 43, (5, 10): 18,
 (5, 17): 9, (5, 24): 2, (5, 31): 5, (6, 7): 12, (6, 14): 10,
 (6, 21): 25, (6, 28): 61, (7, 5): 119, (7, 12): 141, (7, 19): 105,
 (7, 26): 136, (8, 2): 98, (8, 9): 69, (8, 16): 167, (8, 23): 235,
 (8, 30): 214, (9, 6): 300, (9, 13): 537, (9, 20): 718, (9, 27): 930,
 (10, 4): 1148, (10, 11): 2165, (10, 18): 4479, (10, 25): 9808,
 (11, 1): 12699, (11, 8): 9512, (11, 15): 9881, (11, 22): 10266,
 (11, 29): 10073, (12, 6): 10424, (12, 13): 10509, (12, 20): 9585,
 (12, 27): 8907}

Funkcije se najpreprosteje lotite takole: greste prek urejenih ključev slovarja, tako kot v prejšnjih nalogah. Imeli boste neko spremenljivko, npr. v_tem_tednu, v katero boste seštevali število okužb v tem tednu. V začetku jo nastavite na 0 in vsak dan prištejete število okuženih v tem dnevu. Potem pa preverite, ali gre za nedeljo in v tem primeru v slovar, ki ga boste vrnili, pod trenutni (nedeljski) datum zabeležite število okuženih v_tem_tednu in nato postavite število okuženih v_tem_tednu nazaj na 0.

Kako boste izvedeli, ali je na določen dan nedelja? Uporabite tole funkcijo, pri čemer ne pozabite na from datetime import date.

Ocena 9

Napišite funkcijo dnevni_delezi(okuzb), ki vrne seznam dolžine 7, v katerem je za vsak dan zapisano, koliko tedenskih okužb se, v poprečju, zgodi na ta dan.

Rezultat (v tem besedilu sem vsa števila zaradi preglednosti ročno zaokrožil na tri decimalki) je

[0.064, 0.131, 0.184, 0.162, 0.165, 0.166, 0.125]

Ob ponedeljkih v poprečju potrdijo 6 % okužb v posameznem tednu (gre za te, ki jih testirajo v nedeljo). Ob torkih potrdijo 13 % okužb, ob sredah (v resnici gre za torkove teste) 18 % itd.

Naloge se bo najpreprosteje lotiti z nekoliko spremenjeno funkcijo tedenske_okuzbe. v_tem_tednu zdaj ne bo skupno število okuženih v posamičnem tednu (torej int), temveč seznam dolžine 7, ki bo vseboval število okuženih na posamezni dan tega tedna.

Za prvi teden je ta seznam videti tako:

[0, 0, 0, 2, 5, 0, 9]

V vsem tednu je bilo okuženih 16 ljudi. 0 % v ponedeljek, torek in sredo, 2/16 = 0.125 v četrtek, 5/16 = 0.3125 v petek in 9/16=0.5625 v nedeljo.

Za drugi teden je to videti tako:

[0, 15, 26, 32, 52, 40, 38]

Skupno število okuženih je 203. Deleži so 0 % v nedeljo, 15/203=0.073 v ponedeljek in tako naprej.

Vzemite torej funkcijo tedenske_okuzbe. Spremenite jo tako, da v_tem_tednu ne resetirate na 0, temveč na [0] * 7. Namesto prištevanja le nastavljate posamezne elemente (glede na to, za kateri dan gre). Ko pridete do nedelje, pa izračunate deleže.

Ker moramo izračunati poprečni delež, boste imeli nek seznam, recimo dnevni_delezi, v katerega boste seštevali vse ponedeljkove deleže (v prvi element seznama), vse torkove (v drugi element) in tako naprej. Ko je funkcije konec, rezultat delite s številom tednov. (Za kar morate seveda šteti tedne.)

Ocena 10

O gornjem napišite primerno poročilo v Jupyter Notebooku in poleg običajne datoteke .py oddajte še .ipynb.

Poleg tega namestite še matplotlib in narišite kakšen graf, ki kaže podatke, ki jih dobite z zgornjimi funkcijami.

Poglejte kakšna primerna navodila, in poiščite kakšen primeren tip grafa.

Testi