Naloge - Bančne krize
Ukvarjali se bomo s podatki, ki prikazujejo bančne krize po državah tekom zadnjih 210 let. Poleg testov si dobil(a) tudi datoteko v csv
formatu z imenom banking-crises.csv
. V njej je tabela, ki prikazuje, katero leto je imela določena država bančno krizo. V prvem stolpcu so navedena leta. Vsak naslednji stolpec pa predstavlja posamezno državo. Države so navedene v prvi vrstici. Znotraj tabele so števila, ki povejo ali je imela določena država (stolpec) v tistem letu (vrstica) krizo. Kriza je označena s številko 1, leto brez krize pa z 0. Tukaj je prikazan vzorec podatkov.
Alžirija | Angola | Argentina | |
---|---|---|---|
1800 | 0 | 0 | 0 |
1801 | 1 | 0 | 0 |
1802 | 0 | 0 | 0 |
1803 | 0 | 1 | 0 |
V tem primeru je imela Alžirija krizo leta 1801 in Argentina leta 1803. Tabela prebrana iz datoteke bo precej večja.
Napiši funkcijo
preberi_podatke(ime_datoteke)
, ki prebere csv datoteko z imenomime_datoteke
. Funkcija naj prebrano datoteko vrne v obliki seznama seznamov. V primeru zgornje tabele bi funkcija vrnila sledeči seznam:[['', 'Alžirija', 'Angola', 'Argentina'], ['1800', '0', '0', '0'] ['1801', '1', '0', '0'] ['1802', '0', '0', '0'] ['1803', '0', '1', '0']]
Rešitev
def preberi_podatke(ime_datoteke): f = open(ime_datoteke) r = csv.reader(f) return [vrstica for vrstica in r]
Napiši funkcijo
uredi_podatke(podatki)
, ki prejme podatke v obliki, ki jo vrne prejšna funkcija in te spremeni tako, da letnice v podatkih pretvori v številke, vrednosti (0 in 1), ki poročajo o bančni krizi, pa v boolean. Funkcija mora za primer prikazan zgoraj vrniti:[['', 'Alžirija', 'Angola', 'Argentina'], [1800, False, False, False] [1801, True, False, False] [1802, False, False, False] [1803, False, True, False]]
Rešitev
def uredi_podatke(podatki): p = [ [int(s) if i == 0 else bool(int(s)) for i, s in enumerate(vrstica)] for vrstica in podatki[1:] ] return podatki[0:1] + p
Napiši funkcijo
leta_brez_krize(podatki)
, ki prejme podatke v obliki, kot jih vrne prejšna funkcija. Vrne naj seznam vseh let, ko nobena od držav ni imela krize. Torej vrne tista leta pri katerih so v vrstici same ničle.Rešitev
def leta_brez_krize(podatki): leta = [] for vrstica in podatki[1:]: if not any(vrstica[1:]): leta.append(vrstica[0]) return leta
ali
def leta_brez_krize(podatki): return [vrstica[0] for vrstica in podatki[1:] if not any(vrstica[1:])]
Napiši funkcijo
drzave_brez_krize(podatki)
, ki prejme podatke v obliki, ki jih vrne funkcijauredi_podatke
in vrne seznam vseh držav, ki niso imele nobene krize. Torej vrne tiste države, ki imajo v podatkih same ničle. Katere so tiste države, ki niso imele nobene krize?Rešitev
def drzave_brez_krize(podatki): drzave = [] for i, drzava in enumerate(podatki[0]): if not any(vr[i] for vr in podatki[1:]): drzave.append(drzava) return drzave
ali
def drzave_brez_krize(podatki): return [drzava for i, drzava in enumerate(podatki[0]) if not any(vr[i] for vr in podatki[1:])]
Napiši funkcijo
samo_krize(podatki)
, ki prejme podatke v obliki, ki jih vrne funkcijauredi_podatke
in vrne seznam brez prvega stolpca (leta) in prve vrstice (držav). Torej vrne samo tisti del tabele, ki vsebuje ničle in enice.Rešitev
def samo_krize(podatki): return [vrstica[1:] for vrstica in podatki[1:]]
Napiši funkcijo
najvec_kriz(podatki)
, ki prejme podatke v obliki, ki jih vrne funkcijasamo_krize
. Funkcija vrne, koliko je največje število kriz, ki jih je imela posamezna država. To naredi tako, da za vsak stolpec izračunaš število kriz in nato vzameš največjo številko.Rešitev
def najvec_kriz(podatki): najvec = 0 for i in range(len(podatki[0])): st_kriz = sum(vr[i] for vr in podatki) if st_kriz > najvec: najvec = st_kriz return najvec
ali
def najvec_kriz(podatki): return max(sum(x[i] for x in podatki) for i in range(len(podatki[0])))