Preskoči na glavno vsebino
Učilnica FRI 25/26
  • Domov
  • Koledar
  • Več
Slovenščina ‎(sl)‎
English ‎(en)‎ Slovenščina ‎(sl)‎ Македонски ‎(mk)‎ Русский ‎(ru)‎ 한국어 ‎(ko)‎
Trenutno uporabljate gostujoči dostop
Prijavite se
Učilnica FRI 25/26
Domov Koledar
Razširi vse Skrči vse
  1. Nadzorna plošča
  2. progkog
  3. Numpy
  4. Slovenski priimki

Slovenski priimki

Zahteve zaključka
Rok za oddajo: torek, 23. december 2025, 09.00

V nalogi bomo delali s pogostostmi priimkov v slovenskih občinah. Podatki so zbrani okrog leta 2000 in za vsako občino vsebujejo število gospodinjstev z enim od 200 najpogostejših slovenskih priimkov. Zaradi anonimizacije je nekaj gospodinjstev v bližini občinske meje štetih v napačno občino. Možne so tudi druge manjše napake, ki izvirajo iz načina zbiranja podatkov.

Delali bomo z dvema datotekama v enaki obliki. Razlikujeta se po številu občin in priimkov.

  • priimki-v-obcinah-mali.csv vsebuje podatke za 5 občin in 4 priimke.
  • priimki-v-obcinah.csv vsebuje podatke za vseh 192 občin in 200 priimkov.

Datoteki naj bosta v istem direktoriju kot vaš program.

V spodnjih primerih bomo uporabljali manjšo datoteko. Vaše funkcije morajo pravilno delovati z obema datotekama in tudi morebitnimi drugimi datotekami v enaki obliki (torej: z drugačnim številom občin in priimkov).

Oblika datotek je naslednja:

Občina,Površina [km²],Število prebivalcev,NOVAK,HORVAT,KOVAČIČ,KRAJNC
Ljubljana,275.0,276091,479,245,189,58
Maribor,147.5,113113,186,204,104,258
Tolmin,381.5,10953,3,0,54,1
Celje,94.9,48679,50,39,49,104
Murska Sobota,64.4,19433,73,245,16,0

Prva vrstica vsebuje imena stolpcev. Prvi trije stolpci vsebujejo podatke o občini, ostali pa število gospodinjstev s posameznim priimkom v tej občini. (Večja datoteka vsebuje enake tri stolpce, nato pa 200 stolpcev za priimke.)

Nekatere naloge morate rešiti z eno vrstico numpyja -- ker se da in ker morate znati. Pri ostalih počnite, kar želite. Dodatnih funkcij ni dovoljeno pisati (da ne bi "enovrstičnih" prenesli v druge funkcije :).

  1. Napišite funkcijo preberi(datoteka), ki prebere datoteko in vrne terko z naslednjimi tabelami:

    • imena občin (kot nizi)
    • površine občin (kot števila s plavajočo vejico, float)
    • števila prebivalcev občin (kot cela števila, int)
    • pogostosti priimkov (kot dvodimenzionalna tabela celih števil, int)
    • imena priimkov (kot nizi)

    Klic preberi("priimki-v-obcinah-mali.csv") naj vrne:

    (np.array(['Ljubljana', 'Maribor', 'Tolmin', 'Celje', 'Murska Sobota']),
     np.array([275.0, 147.5, 381.5, 94.9, 64.4]),
     np.array([276091, 113113, 10953, 48679, 19433]),
     np.array([[479, 245, 189, 58],
               [186, 204, 104, 258],
               [3, 0, 54, 1],
               [50, 39, 49, 104],
               [73, 245, 16, 0]],
     np.array(['NOVAK', 'HORVAT', 'KOVAČIČ', 'KRAJNC']))
    

    Pomoč: genfromtxt ima argument skip_header. Uporabite skip_header=1, da preskočite prvo vrstico. Le-to lahko preberete ločeno, tako kot običajno beremo datoteke v Pythonu.

  2. Napišite funkcijo najpogostejsi_priimek(pogostosti, priimki), ki vrne najpogostejši priimek (glede na število gospodinjstev) v vseh občinah skupaj.

    Če funkcija dobi vse podatke, vrne "NOVAK", saj ima ta priimek največ gospodinjstev. Tudi če jo poženemo na malih podatkih, vrne Novak (v podatkih je 791 Novakov in "samo" 733 Horvatov). Če pa jo poženemo na malih podatkih brez prve vrstice (Ljubljana), vrne "HORVAT".

    Funkcija naj bo narejena z eno vrstico numpyja.

  3. Napišite funkcijo delezi_po_obcinah(pogostosti), ki vrne dvodimenzionalno tabelo z enakimi dimenzijami kot pogostosti, kjer je v vsaki vrstici delež gospodinjstev s tem priimkom v Sloveniji.

    Funkcija naj bo narejena z eno vrstico numpyja.

    Če funkcijo poženemo na malih podatkih, mora vrniti:

    array([[0.60556258, 0.33424284, 0.45873786, 0.13776722],
           [0.23514539, 0.27830832, 0.25242718, 0.6128266 ],
           [0.00379267, 0.        , 0.13106796, 0.0023753 ],
           [0.06321113, 0.053206  , 0.11893204, 0.24703088],
           [0.09228824, 0.33424284, 0.03883495, 0.        ]])
    

    Prvi stolpec pove, kako so porazdeljeni Novaki po občinah, drugi stolpec Horvati itd. Če se spomnimo, kako gredo kraji po vrsti (Lj, Mb, Tm, Ce, Ms), lahko na primer vidimo, da je 60.56 % vseh Novakov v Ljubljani, 23.51 % v Mariboru itd.

    Pomoč: k dvodimenzionalni tabeli lahko prištejemo, odštejemo, množimo, delimo ... enodimenzionalno tabelo, ki ima enako elementov kot vrstica dvodimenzionalne tabele. Npr. če imamo tabelo a oblike (3, 4) in tabelo b oblike (4,), potem izraz a / b pomeni, da se vsak stolpec tabele a deli z ustreznim elementom tabele b. Tule je primer za množenje:

    >>> a = np.array(
            [[2, 6, 8, 1],
             [1, 2, 3, 4],
             [3, 8, 3, 1]])
    >>> f = np.array([10, 50, 100, 1000])
    >>> a * f
    array([[  20,  300,  800, 1000],
           [  10,  100,  300, 4000],
           [  30,  400,  300, 1000]])
    

    Spoiler: vsak stolpec delite z vsoto stolpca.

  4. Poglejmo rezultat prejšnje naloge. Za večjo preglednost bom spremenil podatke v odstotke in jih zaokrožil na dve decimalni mesti (vam tega ni potrebno početi, to počnem le za razlago!).

                  Novak   Horvat  Kovačič   Krajnc
    Ljubljana     60.56    33.42    45.87    13.78
    Maribor       23.51    27.83    25.24    61.28
    Tolmin         0.38     0.00    13.11     0.24
    Celje          6.32     5.32    11.89    24.70
    Murska Sobota  9.23    33.42     3.88     0.00
    

    Novak je gotovo najpogostejši priimek v Ljubljani. Za Maribor je mogoče bolj specifičen Krajnc, saj v Mariboru živi 61 % vseh slovenskih Krajncev (in le 23 % vseh Novakov). Za Tolmin je torej najbolj specifičen priimek Kovačič, saj je tam kar 13 % vseh Kovačičev v Sloveniji v Tolminu. Za Celje je najbolj specifičen Krajnc, za Mursko Soboto pa seveda Horvat. (To so seveda mali podatki, ki vključujejo le teh pet občin. V resnici v Ljubljani ne živi 60 % vseh Novakov!)

    Napišite funkcijo specificni_priimki(pogostosti, priimki), ki prejme tabelo pogostosti (takšno, kot je preberemo iz datoteke) in vrne tabelo z najbolj specifičnimi priimki po občinah. Pri tem naj pokliče delezi_po_obcinah, da bodo pogostosti priimkov normalizirane.

    Funkcija naj bo narejena z eno vrstico numpyja.

    Za male podatke funkcija vrne np.array(['NOVAK', 'KRAJNC', 'KOVAČIČ', 'KRAJNC', 'HORVAT']).

    Torej: v Ljubljani je najbolj specifičen priimek Novak, v Mariboru Krajnc, v Tolminu Kovačič, v Celju Krajnc in v Murski Soboti Horvat.

  5. Napiši funkcijo izpis_specificnih(obcine, pogostosti, priimki), ki pokliče funkcijo iz prejšnje naloge, da izve najbolj specifične priimke po občinah, nato pa izpiše rezultate v obliki:

                               Ljubljana - NOVAK
                                 Maribor - KRAJNC
                                  Tolmin - KOVAČIČ
                                   Celje - KRAJNC
                           Murska Sobota - HORVAT
    

    Ime občine je izpisano na 40 mest in poravnano desno, sledi presledek, minus, presledek, nato pa najbolj specifičen priimek za to občino.

  6. Testi bodo izpisali najbolj specifične priimke za vse občine v večji datoteki. Kdor o tem kaj ve (na primer prihaja iz drugega konca Slovenije, ima tam sorodnike), naj si ga ogleda, saj je kar zanimiv.

    To je vse, kar morate narediti za to točko. Programiranja ni. :)

  7. Napišite funkcijo izpis_obcin_s_priimki(obcine, pogostosti, priimki), ki najprej poišče najbolj specifične priimke za posamične občine (torej: pokličite specificni_priimki). Nato izpiše vse priimke, ki se pojavijo med najbolj specifičnimi, za vsakim priimkom pa dvopičje in nato vse občine, za katere je ta priimek specifičen. Tako priimki kot občine morajo biti urejeni po abecedi (pri čemer so Č, Š in Ž na koncu, za črko Z, saj se nismo naučili, kako Python prisiliti, da pravilno ureja po slovenski abecedi).

    Če želite reševati nalogo, kot se spodobi za numpy, vam bo prišel prav unique. Druga možnost je, da uporabite običajne Pythonove slovarje.

    Izpis za male podatke bo videti takole:

    HORVAT: Murska Sobota
    KOVAČIČ: Tolmin
    KRAJNC: Celje, Maribor
    NOVAK: Ljubljana
    

    Izpis za celotne podatke se začne z:

    AMBROŽIČ: Bled
    BAJC: Ajdovščina, Postojna
    BERGANT: Komenda, Tabor
    BEVC: Bistrica ob Sotli
    BEZJAK: Gorišnica, Markovci
    BLAŽIČ: Miren - Kostanjevica
    BOGATAJ: Gorenja vas - Poljane, Žiri
    BREGAR: Radeče, Trbovlje
    BREZNIK: Luče, Mežica, Muta
    BUKOVEC: Kobilje
    BUČAR: Dolenjske Toplice, Šmartno pri Litiji
    CERAR: Domžale, Lukovica, Moravče
    DOLINAR: Dobrova - Polhov Gradec
    

    in konča z:

    ZUPAN: Žirovnica
    ZVER: Beltinci, Odranci, Turnišče
    ČEH: Ptuj
    ŠTRUKELJ: Nazarje
    ŠULIGOJ: Kanal, Nova Gorica
    ŠUŠTAR: Kamnik
    ŠUŠTERŠIČ: Brezovica, Ljubljana
    ŽAGAR: Kostel
    ŽELEZNIK: Žetale
    ŽIBERT: Sevnica
    
  8. Testi v točki 8 samo izpišejo rezultate funkcije iz prejšnje točke za večjo datoteko, tako da si jih lahko ogledate.

Testi in datoteke s podatki

  • testi.zip testi.zip
    18. december 2025, 14:05
Trenutno uporabljate gostujoči dostop (Prijavite se)
Pridobi mobilno aplikacijo
Stran poganja Moodle
Obvestilo o avtorskih pravicah