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.

  1. Napiši funkcijo preberi_podatke(ime_datoteke), ki prebere csv datoteko z imenom ime_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]
    

  2. 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
    

  3. 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:])]
    

  4. Napiši funkcijo drzave_brez_krize(podatki), ki prejme podatke v obliki, ki jih vrne funkcija uredi_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:])]
    

  5. Napiši funkcijo samo_krize(podatki), ki prejme podatke v obliki, ki jih vrne funkcija uredi_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:]]
    

  6. Napiši funkcijo najvec_kriz(podatki), ki prejme podatke v obliki, ki jih vrne funkcija samo_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])))