Polona in Ančka
V tej nalogi bomo delali z resničnimi podatki.
Ančki in Poloni so nataknili GPS sledilnik in nekaj let opazovali, kod hodita. Podatke najdete v priloženi datoteki. Prvi stolpec je datum, naslednja dva sta zemljepisni koordinati Polone, naslednja dva pa koordinati Ančke. nan
pomeni, da podatek ni znan: podatki namreč niso zabeleženi vsakodnevno, poleg tega so Poloni nataknili sledilnik par let kasneje kot Ančki. Če je za nekoga v nekem dnevu znana ena koordinata, je znana tudi druga.
Končni cilj naloge bo ugotoviti, na kateri dan sta si bili Ančka in Polona najbližje.
Podatki so bili zbrani v okviru študije Rjavi medved v Sloveniji 1993-1997 (Kaczensky, P., Knauer, F., Jonozovic, M., Blazic, M. (1999): Slovenian brown bear 1993-1999). Medvedki, ki so ju v študiji poimenovali Ančka in Polona sem izbral, ker imata največji presek dni, za katere obstajajo meritve.
Nekaj funkcij, ki vam bodo prišle prav:
np.min
innp.max
sicer vrneta najmanjši in največji element tabele, vendar bosta vrnilinan
, čim tabela vsebuje kaknan
. V tem primeru je potebno uporabitinp.nanmin
innp.nanmax
, ki vrneta največji in najmanjši element, pri čemer ignorirate tiste, ki sonan
.np.nanargmin
innp.nanargmax
sta podobnanp.argmin
innp.argmax
, vendar ignoriratanan
-e.np.isnan
vrneTrue
za elemente, ki sonan
.np.isfinite
vrneTrue
za elemente, ki so običajna števila - torej tiste, ki nisonan
aliinf
.np.sqrt
izračuna koren vseh elementov tabele.
V zapiskih se vam splača prebrati razdelek, v katerem smo računali, koliko je $\pi$.
Naloga navidez zahteva, da napišemo veliko funkcij. V resnici pa je zastavljena tako, da se dopolnjujejo - v večini je potrebno le spremeniti nekaj iz prejšnje. Tokrat se vaše funkcije ne bodo klicale med sabo.
Vse funkcije je potrebno sprogramirati z uporabo numpy
. Nobenih zank - nobenih for
ali while
. Vse funkcije brez prve bodo dolge le eno vrstico, naj ne vsebujejo izpeljanih seznamov in generatorskih izrazov, saj bo vse delo opravil numpy
. Prav tako je izjemoma prepovedano dodajanje funkcij, ki jih naloga zahteva, da ne bi kdo na ta način obvozil testov. (Če jih že hočete obvoziti, se bo potrebno bolj potruditi, vendar ... zakaj bi to počeli?)
Napiši funkcijo
preberi_podatke()
, ki prebere podatke iz datotekepolona-in-ancka.csv
. (Datoteka naj bo v istem direktoriju kot tvoj program; odpre naj joopen("polona-in-ancka.csv")
, brez kakšnih dodatnih poti! Nobenihopen("c:/Users/janez/naloga/polona-in-ancka.csv")
!!!). Funkcija vrne tri numpy-jeve tabele: tabelo z datumi ter tabeli z Poloninimi in Ančkimi koordinatami. Prva tabela bodo nizi, druga pa števila (dtype
mora bitifloat
). Polonini podatki so v stolpcih 1 in 2, če začnemo šteti od 0, Ančkini pa v 3 in 4.Napiši funkcijo
meritev(xy)
, ki prejme koordinate in pove, za koliko dni so le-te znane. (Če je znana ena, je tudi druga.) Za Polono obstaja 208 meritev, za Ano 350.Napiši funkcijo
vzhod_zahod(xy)
, ki prejme koordinate in vrne najvzhodnejšo in najzahodnejšo zemljepisno dolžino v podatkih. Zemljepisna dolžina je druga koordinata in narašča proti vzhodu. Za Polono, recimo, je najvzhodnejša dolžina 14.4868167466, najzahodnejša pa 14.3361857993.Napiši funkcijo
najvzhodnejsa(xy)
, ki vrne koordinate (zemljepisno širino in dolžino) najbolj vzhodne točke v podatkih. Za Polono mora vrniti (45.8236039136, 14.4868167466). (Številko 14.4868..., najvzhodnejšo koordinato vrne tudi prejšnja funkcija. Ta mora vrniti pripadajočo zemljepisno širino.)Napiši funkcijo
minrazdalja(xy, tocka)
, ki prejme zabeležene koordinate in koordinate neke točke. Vrniti mora najmanjšo razdaljo med temi zabeleženimi koordinatami in to točko. V nalogi se bomo delali, da je Zemlja ploščata in da imata koordinati enako skalo (torej, da je ena stopinja po širini enaka kot po višini) in lahko zato računamo kar evklidske razdalje ("po Pitagori").Najkrajša razdalja med Polono in Prešernom (
[46.0513539,14.502127]
) je 0.1877726.Če imamo torej medvedovi koordinati
(mx, my)
in točko(tx, ty)
, je razdalja med medvedom in točko kar $\sqrt{(m_x - t_x)^2 + (m_y - t_y)^2}$. Nalogo reši tako, da od (vseh) medvedjih koordinat odšteješ koordinate točke, vse skupaj skvadriraš in sešteješ po vrsticah, potem izračunaš koren teh vsot in na koncu vrneš minimum (znanmin
).Napiši funkcijo
najblizja(xy, tocka)
, ki je podobna prejšnji, vendar ne vrne minimalne razdalje temveč najbližjo točko. Za Polono in Prešerna vrne(45.8675868, 14.4635502)
: Polona je bila najbližje sprehajalcem po Prešernovem trgu, ko je bila nekoč malo južno od Rakitne.Napiši funkcijo
minmedrazdalja(xy1, xy2)
, ki dobi tabelo s koordinatami dveh medvedov (torej celotni tabeli za vse dni beleženja) in vrne najmanjšo razdaljo, zabeleženo na isti dan. Najmanjša razdalja med Polono in Ančko je 0.07254133219635045). (Funkcija je presenetljivo (in še bolj) podobna funkcijiminrazdalja
)Napiši funkcijo
dan_srecanja(datumi, xy1, xy2)
, ki prejme tabelo z datumi in tabeli s koordinatama (v bistvu vse, kar vračapreberi_podatke
) ter vrne datum, ko sta si bili Polona in Ančka najbližje. Pravilni odgovor je"1998-06-23"
.
Teaserji
Polona in Ančka sta se srečali v bližini nekega radarja. Predvsem Ančka ni bila daleč. Poišči Ančkine koordinate, vnesi v Google Earth, najdi radar. Potem si lahko prebereš kaj več o njem - je kar zanimivo. Radar si najbrž tudi že kdaj opazil(a), ko si se peljal(a) po avtocesti proti Logatcu.
Podatki so iz zbirke različnih podatkov o gibanju živali, ki jih najdemo na strani https://www.movebank.org/cms/webapp. V študiji so želeli ugotoviti, koliko avtocesta vpliva gibanje medvedov. V tej študiji zato nista le Ančka in Polona, temveč še 20 drugih medvedov in medvedk. Celotna, originalna datoteka je priložena testom, če koga, ki mu je blizu bolj rumen tisk, zanima, ali je imela Ančka kaj z Vinkom (ali pa se je Vinko bolj zanimal za Polono). (Ali pa, ojoj, za obe?)
Testi in podatki
- 12. december 2024, 11:07