Vaje
Vaje spet temeljijo na domači nalogi iz dražbe. Prvih nekaj nalog smo rešili na predavanih (zapiski), vendar ne bo škodilo, da se s tem, da jih rešiš še sam(a) prepričaš, da jih res razumeš.
Podatke naloži z
zapisnik = np.genfromtxt(open("zapisnik.txt", encoding="utf-8"), delimiter=",", dtype="U25")
Ime datoteke (oziroma pot do nje) seveda prilagodi. Kako nadaljevati -- razstaviti to v stolpce -- najdeš v zapiskih.
Potem pa z uporabo numpyja reši naslednje naloge. Poanta je v tem, da ne uporabljate zank! (V oklepajih je nekaj funkcij, ki lahko pridejo prav.)
- Izpiši, kateri predmet je dosegel najvišjo ceno, kakšno in kdo ga je kupil. (
argmax
...)
Rešitev
zapisnik = np.genfromtxt("zapisnik.txt", delimiter=",", dtype="U25")
predmeti = zapisnik[:, 0]
osebe = zapisnik[:, 1]
cene = zapisnik[:, 2].astype(int)
naj_idx = np.argmax(cene)
print(f"Najvisjo ceno je dosegel {predmeti[naj_idx]}, kupila ga je {osebe[naj_idx]} za {cene[naj_idx]}")
- Izpiši končne cene vseh predmetov. Izpis naj bo urejen po cenah predmetov. (
flatnonzero
,hstack
,argsort
)
Rešitev
zadnji_idx = np.flatnonzero(predmeti[1:] != predmeti[:-1])
zadnji_idx = np.hstack((zadnji_idx, [len(predmeti) - 1]))
zadnji_predmeti = predmeti[zadnji_idx]
zadnje_cene = cene[zadnji_idx]
sortirani_idx = np.argsort(zadnje_cene)
for p, c in zip(zadnji_predmeti[sortirani_idx], zadnje_cene[sortirani_idx]):
print(p, c)
- Izpiši, koliko ponudb je bil deležen posamezen predmet. Izpis uredi po številu ponudb. (isto)
Rešitev
prvi_idx = np.hstack(([0], razlike + 1))
st_ponudb = zadnji_idx - prvi_idx + 1
sortirani_idx = np.argsort(st_ponudb)
for p, n in zip(zadnji_predmeti[sortirani_idx], st_ponudb[sortirani_idx]):
print(p, n)
- Izpiši, kateri predmet je dobil največ ponudb. Če si prvo mesto deli več predmetov, izpiši vse. (
max
)
Rešitev
naj_ponudb = np.max(st_ponudb)
maska = st_ponudb == naj_ponudb
print("Največ ponudb so dobili:", ", ".join(zadnji_predmeti[maska]))
- Za vsak predmet izpiši, za koliko je bila končna cena višja od začetne. (
-
:).
Rešitev
razlike = zadnje_cene - cene[prvi_idx]
for p, r in zip(zadnji_predmeti, razlike):
print(p, r)
- Za vsak predmet izpiši, kolikšen je bil povprečni dvig cene med dvema ponudbama (
-
in/
; mimogrede morda opaziš kaknan
- razmisli, zakaj!).
Rešitev
povprecen_dvig = razlike / (st_ponudb - 1)
for p, d in zip(zadnji_predmeti, povprecen_dvig):
print(p, d)
- Za vsak predmet izpiši, za koliko se je njegova cena dvignila v zadnjih sedmih ponudbah - oziroma v celoti, če je bilo ponudb manj kot sedem.
Rešitev
min7_idx = np.maximum((zadnji_idx - 7), prvi_idx)
razlike = zadnje_cene - cene[min7_idx]
for p, r in zip(zadnji_predmeti, razlike):
print(p, r)
- Koliko ponudb je dala Greta? (
sum
)
Rešitev
greta = osebe == "Greta"
print(np.sum(greta))
- Izpiši povprečno višino Gretine ponudbe (tudi
sum
:).
Rešitev
cene_greta = cene[greta]
print(np.sum(cene_greta) / len(cene_greta))
- Kolikokrat je Greta zvišala prejšnjo ponudbo za več kot 4. (To nalogo smeš rešiti malo narobe: vsako vrstico, v kateri se oglaša Greta, primerjaj s prejšnjo vrstico in ignoriraj, da se prejšnja vrstica morda nanaša na drug predmet. Kako to narediti pravilno, bomo pogledali prihodnji teden).
Rešitev
greta_idx = np.flatnonzero(greta)
razlike = cene[greta_idx] - cene[greta_idx - 1]
print(np.sum(razlike > 4))
- Izpiši, koliko ponudb je dala posamezna oseba. (unique)
Rešitev
os, st_ponudb = np.unique(osebe, return_counts=True)
for o, p in zip(os, st_ponudb):
print(o, p)
- Izpiši, kolikokrat je posamezna oseba višala ceno. (Namig: ne šteješ prvih ponudb. Poglej, kako narediti konjunkcijo (logični in) dveh boolovih tabel.)
Rešitev
maska_neprve = np.hstack(([False], predmeti[1:] == predmeti[:-1]))
os, st_ponudb = np.unique(osebe[maska_neprve], return_counts=True)
for o, p in zip(os, st_ponudb):
print(o, p)
- Izpiši, kolikokrat je ponudba posamične osebe sledila Bertini ponudbi.
Rešitev
sledi_berti = np.hstack(([False], osebe[:-1] == "Berta"))
os, st_ponudb = np.unique(osebe[sledi_berti], return_counts=True)
for o, p in zip(os, st_ponudb):
print(o, p)
- Isto kot prej, vendar pravilno: ne štej ponudb drugih oseb, ki se dejansko nanašajo na nove predmete. (Tudi tu bo najbrž potrebna konjunkcija dveh tabel.)
Rešitev
os, st_ponudb = np.unique(osebe[sledi_berti & maska_neprve], return_counts=True)
for o, p in zip(os, st_ponudb):
print(o, p)
Zadnja sprememba: sreda, 10. januar 2024, 21.37