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

  1. 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]}")
  1. 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)
  1. 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)
  1. 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]))
  1. 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)
  1. Za vsak predmet izpiši, kolikšen je bil povprečni dvig cene med dvema ponudbama (- in /; mimogrede morda opaziš kak nan - razmisli, zakaj!).
Rešitev
povprecen_dvig = razlike / (st_ponudb - 1)

for p, d in zip(zadnji_predmeti, povprecen_dvig):
    print(p, d)
  1. 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)
  1. Koliko ponudb je dala Greta? (sum)
Rešitev
greta = osebe == "Greta"
print(np.sum(greta))
  1. Izpiši povprečno višino Gretine ponudbe (tudi sum :).
Rešitev
cene_greta = cene[greta]
print(np.sum(cene_greta) / len(cene_greta))
  1. 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))
  1. 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)
  1. 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)

  1. 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)
  1. 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