Slovenski priimki
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.csvvsebuje podatke za 5 občin in 4 priimke.priimki-v-obcinah.csvvsebuje 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 :).
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č:
genfromtxtima argumentskip_header. Uporabiteskip_header=1, da preskočite prvo vrstico. Le-to lahko preberete ločeno, tako kot običajno beremo datoteke v Pythonu.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.
Napišite funkcijo
delezi_po_obcinah(pogostosti), ki vrne dvodimenzionalno tabelo z enakimi dimenzijami kotpogostosti, 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
aoblike (3, 4) in tabeloboblike (4,), potem izraza / bpomeni, da se vsak stolpec tabeleadeli z ustreznim elementom tabeleb. 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.
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.00Novak 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čedelezi_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.
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 - HORVATIme občine je izpisano na 40 mest in poravnano desno, sledi presledek, minus, presledek, nato pa najbolj specifičen priimek za to občino.
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. :)
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čitespecificni_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 pravunique. 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: LjubljanaIzpis 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 Gradecin 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: SevnicaTesti 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
- 18. december 2025, 14:05