Računalstvo u prometnom inženjerstvu - Osnovni elementi Python-a I - PDF
Document Details
Uploaded by Deleted User
Fakultet prometnih znanosti
2024
Martin Gregurić
Tags
Related
- CC102 - Computer Programming 1 (Python).pptx
- Introduction to Computer Science Using Python PDF
- Introduction to Python Programming PDF
- Computer Science Class XI Past Paper PDF 2023-24
- Computer Science PYTHON Book PDF for Class 12
- Introduction to Computation and Programming Using Python (2nd Edition) PDF
Summary
Ovaj dokument sadrži bilješke o osnovnim elementima programiranja u Python-u, namijenjene studentima Fakulteta prometnih znanosti Sveučilišta u Zagrebu. Fokus je na osnovnim tipovima podataka, ispisu i unosu teksta te učitavanju paketa i modula.
Full Transcript
SVEUČILIŠTE U ZAGREBU Fakultet prometnih znanosti Zavod za inteligentne transportne sustave Vukelićeva 4, Zagreb, HRVATSKA Računalstvo u prometnom inženjerstvu Osnovni elementi Pytho...
SVEUČILIŠTE U ZAGREBU Fakultet prometnih znanosti Zavod za inteligentne transportne sustave Vukelićeva 4, Zagreb, HRVATSKA Računalstvo u prometnom inženjerstvu Osnovni elementi Python-a I doc. dr. sc. tech. Martin Gregurić ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 2 Sadržaj Uvod Osnovni tipovi podataka Ispis i unos teksta Učitavanje paketa i modula Pozivanje funkcija iz učitanih paketa Komentiranje kôda Rješenje zadatka ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 3 Uvod Ishodi učenja kolegija 1. Objasniti termine iz područja računalstva te opisati značajke računalnih sustava i programske podrške 2. Primijeniti napredne mogućnosti uredskih računalnih alata za pisanje i uređivanje dokumenata, tablično računanje i zajednički udaljeni rad u oblaku 3. Modelirati osnovne probleme iz područja logistike za rješavanje programom pomoću računala 4. Analizirati postupak izvođenja programa praćenjem redoslijeda izvođenja naredbi te provjeriti njegovu ispravnost 5. Izraditi aplikaciju za rješavanje postavljenog jednostavnog logističkog problema u obliku tekstualnog programa u višem programskom jeziku 6. Primijeniti odabranu razvojnu okolinu za implementaciju jednostavnog programskog rješenja i provjeru njegove ispravnosti 7. Primijeniti funkcionalnosti višeg programskog jezika za povezivanje s jednostavnom bazom podataka ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 4 Uvod Ishodi učenja predavanja 1. Objasniti osnovne tipove podataka u Python okolini 2. Izraditi i inicijalizirati varijable 3. Demonstrirati ispis i unos teksta pomoću Windows Command Prompt-a ili PowerShell terminala 4. Demonstrirati učitavanje paketa dostupnih u aktivnoj virtualnoj okolini 5. Pozvati funkcije iz učitanih paketa 6. Demonstrirati mogućnosti komentiranja kôda ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 5 Uvod Prijevozničko poduzeće treba izračunati cijenu prijevoza tereta cestovnim prijevoznim sredstvom – Temelj izračuna Duljina prijevozne rute u kilometrima Fiksna cijena litre dizela – 1,53 [EUR] Prosječna potrošnja dizela za prijevozno sredstvo – 30 [l] / 100 [km] – Mogućnost korištenja autoceste Uključiti cijenu naplaćene cestarine ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 6 Uvod Potrebno je napisati jednostavnu tekstualnu aplikaciju – Koristeći terminal unutar Visual Code okruženja Što je terminal? Tekstualna aplikacija? ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 7 Uvod Tekstualna aplikacija će imati sljedeće mogućnosti za unos podataka o jednom prijevozu – Unos od strane korisnika aplikacije Registarska oznaka prijevoznog sredstva Duljina prijevozne rute [km] Iznos cestarine [EUR] – Mogućnost korištenja sljedećih vrijednosti u izračunu (spremljene vrijednosti u memoriji) Cijena dizela za jednu litru [EUR] Prosječna potrošnja dizela za prijevozno sredstvo – Ispis konačne cijene transporta u [EUR] u konzoli Ispis ograničen na dvije decimale ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 8 Osnovni tipovi podataka u Python okolini Jednostavni tipovi podataka u Python-u – Predstavljaju jednu vrijednost – jedan podatak u varijabli Brojčane vrijednosti – Npr. cijeli brojevi i brojevi s plivajućem zarezom (engl. integer, float) Znakovni nizovi (engl. string) Logički tipovi podataka (engl. bool) Složeni tipovi podataka u Python-u – Predstavljaju više različitih vrijednosti u varijabli Lista N-torka (engl. tuple) Skup (engl. set) Riječnik (engl. dictionary) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 9 Osnovni tipovi podataka u Python okolini Sintaksa pridruživanja (=) u Python-u = Primjer – Varijabla s jednostavnim logičkim tipom podataka jednostavna = True – Varijabla sa složenim tipom podataka – lista slozena = [100, ’zrakoplov’, 3.14, False] Varijabla u Pythonu ne mora uvijek sadržavati vrijednost istog tipa – Tijekom izvršavanja programa se može mijenjati tip podatka ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 10 Osnovni tipovi podataka u Python okolini Neophodno je pravilno imenovati varijablu – Što ne radimo kod imenovanja varijable? Počinjemo s brojem – npr. „1000LoseImenovanje” Koristimo razmak (engl. space) i druge specijalne znakove – npr. „Lose Imenovanje!?+” » Znak _ „underscore” je iznimka Koristimo slova izvan anglo-saksonskog alfabeta – npr. „LoŠeImenovanje” Neophodno je inicijalizirati varijablu – Postavit („napunit”) na neku početnu vrijednost ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 11 Osnovni tipovi podataka u Python okolini Pisanje vrijednosti varijabli s tekstom (string) – Osjetljiv na velika i mala slova Engl. case-sensitive – Niz znakova se može pisati s obje vrste navodnika – Primjer a = 'string' a = 'string' b = 'String' b = "string" print(a == b) print(a == b) Ispis: False Ispis: True Nema eksplicitne deklaracije tipa podatka za varijablu ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 12 Osnovni tipovi podataka u Python okolini – Interpreter Python-a „automatski” deklarira tip podataka u varijabli – Primjer jednostavna = True Python deklarira - bool tip jednostavna = ‘True’ Python deklarira - string tip jednostavna = true Greška – true nije definiran ) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 13 Osnovni tipovi podataka u Python okolini Identifikacija jednostavnih tipova podataka u problemu – Registarska oznaka prijevoznog sredstva Kombinacija slova, specijalnih znakova i brojeva (znakova) – Npr. ZG-1234-FP Tip podataka – string (str) – znakovni niz – Duljina prijevozne rute [km] Cijeli broj – Npr. 120 Tip podataka – Engl. integer (int) – cjelobrojni broj bez decimalnih mjesta – Cijene (cestarina, cijena goriva) [EUR] Broj s pomičnim zarezom (sa dva decimalna mjesta za cente) – Npr. 81.23 – Python koristi decimalnu točku Tip podataka – Engl. float (float) – broj s pomičnim zarezom ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 14 Ispis i unos teksta Ispis teksta u terminalu – Interna funkcija Python-a print() Argument funkcije je tekst (string) – Ispisivanje teksta u terminal print(‘cringe warning - Pozdrav svijete! ‘) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 15 Ispis i unos teksta Ispis teksta u terminal Ispisivanje vrijednosti varijabli print(duljina_prijevoza_km) Ispis konkatenacijom (spajanjem) teksta i sadržaja numeričkih varijabli » Odvojeni zarezom » Predložak print({string/vrijednost varijable_1}, {string/vrijednost varijable_2}) » Primjer print(‘Unesena duljina rute [km]: ‘, duljina_prijevoza_km) Automatska pretvorba (engl. conversion) vrijednosti varijable u tip string ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 16 Ispis i unos teksta Učitavanje teksta korisnika iz terminala – Funkcija input() – Funkcija kursorom u terminalu korisniku označava mjesto za unos teksta Unos teksta dok korisnik ne iskoristi tipku ENTER Bez argumenata – Samo postavljen kursor za unos vrijednosti S argumentom - tekst (string) – Kursor za unos u istom retku nakon ispisa teksta argumenta – Uputa korisniku aplikacije koju vrijednost treba unijeti duljina_prijevoza_km = input(‘Unesite duljinu rute [km]: ‘) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 17 Ispis i unos teksta Podzadatak – Korisnik unosi vrijednost duljine prijevoza [km] u konzolu – Nakon pritiska tipke ENTER ispisuje se vrijednost koju je korisnik unesao u konzoli Kako to sve izgleda u Visual Code okruženju? – Testni podatak koji unosi korisnik/tester (int): 120 ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 18 Ispis i unos teksta Funkcija input() uvijek vraća tip string – Problem! S unesenim vrijednostima moramo računati cijenu prijevoza string integer Primjer 1 zbroj = duljina_prijevoza_km + 2 TypeError: can only concatenate str (not "int") to str Primjer 2 string string spojeniString = duljina_prijevoza_km + ' [km]' Ispis u terminalu: 120 [km] ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 19 Ispis i unos teksta I dalje imamo problem! – Primjer 1 mora vratiti zbroj tipa integer (a ne string!) Rješenje? – Funkcije za pretvorbu tipova podataka u Python-u int() float() str() bool() – Funkcije za pretvorbu tipova podataka pročitaju tip podatka argumenta funkcije Pretvaraju ga u tip podataka prema imenu funkcije Npr. int() pretvara argument u integer tip podataka ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 20 Ispis i unos teksta PRIJE duljina_prijevoza_km = input('Unesite duljinu rute [km]: ') string string < input() SADA duljina_prijevoza_km = int(input('Unesite duljinu rute [km]: integer ')) int()< string < input() integer integer integer zbroj = duljina_prijevoza_km + 2 print(zbroj - 100) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 21 Pitanja za provjeru znanja (1/2) 1. Što će se ispisati u prethodnom slučaju ako je testna ulazna vrijednost u terminal 120? 2. Predložite način kako bi ispisali u jednom redku terminala poruku korisniku, a u redku ispod tražili unos vrijednosti? Unesite duljinu rute [km]: | 3. O čemu ovisi funkcija znaka plus (+) u Python okruženju? ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 22 Ispis i unos teksta Kako možemo saznati tip podataka varijable? – Interna funkcija type() jednostavna = '123.123' print(type(jednostavna)) – Ispis u terminal Pretvorba u brojčane tipove podataka – Broj s pomičnim zarezom (zaokružen na dvije decimale) print(round(float(jednostavna),2)) Ispis u terminalu: 123.12 – Cijeli broj 4 3 2 1 # redoslijed funkcija print(int(round(float(jednostavna),2))) Ispis u terminalu: 123 ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 23 Učitavanje paketa i modula Jednadžba za izračun cijene prijevoza 𝑑𝑡 𝑐 = 𝑝100 × × 𝑐1𝑙 +𝑐𝑎 100 – gdje je 𝑝100 - potrošnja goriva na 100 [km]; 𝑑𝑡 - duljina prijevoza [km]; 𝑐1𝑙 - cijena jedne litre dizela; 𝑐𝑎 - cijena cestarine za autocestu. Problem! – Izračun apsolutne vrijednosti ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 24 Učitavanje paketa i modula Učitavanje modula s funkcijom apsolutne vrijednosti – Modul s matematičkim funkcijama math – Učitavanje modula import math as m “alias” pozivu modula (opcionalan) – Pozivanje funkcije iz učitanog modula m.fabs() – Python jednadžba za izračun cijene prijevoza c = m.fabs(potrosnja_na_100 * (duljina_prijevoza_km/100) * cijena_litre + cijena_cestarine) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 25 Učitavanje paketa i modula Koje su sve funkcije u učitanom paketu/modulu? – Python je “open-source” programsko okruženje – Svatko može napraviti svoj paket (modul) Modul.py document stvoren kao klasa s funkcijama – Dokumentacija math modula https://docs.python.org/3/library/math.html Opis funkcija, njihovih argumenata (preopterećenja), formata rezultata funkcije ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 26 Učitavanje paketa i modula Primjeri korisnih funkcija u math modulu Funkcija Opis math.ceil(x) Zaokruživanje decimalnog broja na najbliži cijeli broj math.log(x) Izračun prirodnog logaritma math.log10(x) Izračun logaritma po bazi 10 math.pow(x, y) Potenciranje ( 𝑥 𝑦 ) math.sqrt(x) Izračun kvadratnog korjena od x math.{sin, cos, tan, asin, acos, Izračun trigonometrijskih funkcija u radijanima atan, atan2} (x) math.{degrees, Funkcije pretvorbe kutova iz radijana u stupnjeve, i obrnuto radians}(x) math.{pi, e} Matematičke konstante (𝜋, 𝑒) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 27 Komentiranje kôda Zašto je potrebno komentirati kôd? – Brže snalaženje u kôdu (za druge i sebe) – Opis rada algoritama i dokumentiranje funkcija – Izostavljanje dijelova kôda Dobre prakse komentiranja kôda Previše Malo komentara u komentara u jednostavnim složenim projektima projektima ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 28 Komentiranje kôda Jednolinijsko komentiranje kôda – Znak za početak komentiranja # – Primjer # python jednolinijski komentar Višelinijsko komentiranje kôda – Početak i kraj komentara (""") – Primjer """ Ovo je Python višelinijski komentar u 3 linije kôda """ ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 29 Rješenje zadatka import math as m #Varijable s konstantama potrosnja_na_100 = 30 cijena_litre = 1.53 #Unos podataka od korsnika duljina_prijevoza_km = int(input('Unesite duljinu rute [km]: ')) cijena_cestarine = float(input('Unesite cijenu cestarine [EUR]: ')) #Izracun cijene prijevoza c = m.fabs(potrosnja_na_100 * (duljina_prijevoza_km/100) * cijena_litre + cijena_cestarine) #Ispis print('Unesena duljina rute [km]: ', duljina_prijevoza_km) print('Unesena cijena cestarine [EUR]: ', cijena_cestarine) print("Cijena prijevoza.: ", round(c,2) , " [EUR]") ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 30 Rješenje zadatka Testni podatci 𝑑𝑡 = 250 [𝑘𝑚] , 𝑐𝑎 = 50,31 [EUR] ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 31 Pitanja za provjeru znanja (2/2) 1. Što će se dogoditi ako za cijenu cestarine unesemo cjelobrojni broj (integer)? 2. Zašto matematičke konstante u math modulu nemaju argumente? 3. Koji je još jedan mogući način višelinijskog komentiranja kôda? ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 32 Kraj Pitanja studenata? ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko SVEUČILIŠTE U ZAGREBU Fakultet prometnih znanosti Zavod za inteligentne transportne sustave Vukelićeva 4, Zagreb, HRVATSKA Računalstvo u prometnom inženjerstvu/logistici Osnovni elementi Python-a II doc. dr. sc. Martin Gregurić ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 2 Sadržaj Uvod Pisanje matematičkih izraza Operatori usporedbe Logički operatori Napredni ispis teksta Operacije inkrement i dekrement varijabli (operatore za prošireno pridruživanje ) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 3 Uvod Ishodi učenja kolegija 1. Objasniti termine iz područja računalstva te opisati značajke računalnih sustava i programske podrške 2. Primijeniti napredne mogućnosti uredskih računalnih alata za pisanje i uređivanje dokumenata, tablično računanje i zajednički udaljeni rad u oblaku 3. Modelirati osnovne probleme iz područja logistike za rješavanje programom pomoću računala 4. Analizirati postupak izvođenja programa praćenjem redoslijeda izvođenja naredbi te provjeriti njegovu ispravnost 5. Izraditi aplikaciju za rješavanje postavljenog jednostavnog logističkog problema u obliku tekstualnog programa u višem programskom jeziku 6. Primijeniti odabranu razvojnu okolinu za implementaciju jednostavnog programskog rješenja i provjeru njegove ispravnosti 7. Primijeniti funkcionalnosti višeg programskog jezika za povezivanje s jednostavnom bazom podataka ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 4 Uvod Ishodi učenja predavanja 1. Pisati matematičke izraze 2. Koristiti logičke operatore, operatore usporedbe i operatore za prošireno pridruživanje 3. Demonstrirati napredni ispis teksta 4. Operacije inkrement i dekrement varijabli ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 5 Uvod U svrhu rutiranja/vođenja vozila potrebno je predvidjeti brzine na prometnici – Segmentiranje rute Čvor – npr. raskrižje, zavoj, prometni terminali (zračne i morske luke, željeznički i autobusni kolodvori) Segment – npr. cesta, pruga, zračne linije, plovni putovi ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 6 Uvod Najkraći put između Temelj problematike dvije lokacije nužno ne Inteligentnih znači “najbrži” put ! transportnih sustava (ITS) – Problem prometnog opterećenje na segmentima rute Prometna gustoća na segmentima rute – Broj vozila po kilometru [voz/km] Brzina segmenta rute – Potrebna za izračun “trajanja” putovanja na ruti ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 7 Uvod Odrediti brzinu prometnog toka na dva cestovna segmenta jedne rute – Ulaz Segment 1 Prosječna prometna gustoća segmenata – Koristit dva modela prometnog Čvor toka (odnosa gustoće i brzine) Greenberg-ov logaritamski model Underwood-ov eksponencijalni model Segment 2 – Izabrati model koji predviđa pesimističniju (manju) brzinu ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 8 Pisanje matematičkih izraza Greenberg-ov logaritamski model 𝑘𝑗 𝑣 = 𝑣0 𝑙𝑛 𝑘 brzina – gdje je: 𝑣0 - optimalna brzina (70 [km/h]) gustoća 𝑘𝑗 - maksimalna gustoća (150 [voz/km]) Underwood-ov eksponencijalni model −𝑘 𝑣 = 𝑣𝑓 𝑒 𝑘𝑜 – gdje je: 𝑣𝑓 - brzina slobodnog toka (80 [km/h]) 𝑘𝑜 - optimalna gustoća (70 [voz/km]) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 9 Pisanje matematičkih izraza Aritmetički operatori Python-a ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 10 Pisanje matematičkih izraza Računala naredbe izvršavaju – Slijedno – Izraze izračunavaju u skupini po dva operanda (varijable) Prioriteti izvršavanja Prioritet Python Opis 1 () Zagrade 2 ** Potenciranje 3 *, /, //, % Množenje, dijeljenje, cjelobrojno dijeljenje, ostatak dijeljenja 4 +, - Zbrajanje, oduzimanje 5 , = Operacije usporedbe 6 ==, != Operatori jednakosti / različitosti 7 and Logički I 8 or Logički ILI ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 11 Pisanje matematičkih izraza Implementacija razlomaka – Razlomak po definiciji znači dijeljenje brojnika s nazivnikom – U računalu se koristi operator dijeljenja Općenito se razlomak implementira tako da se brojnik i nazivnik stave u zagrade a+b → (a + b) / (c + d ) c+d Česta pogreška a+b b → a+b/c+d → a+ +d c+d c ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 12 Pisanje matematičkih izraza Implementacija potencija – Koristi se funkcija potenciranja math.pow() Argumenti bilo koja kombinacija tipa brojevnih podataka 𝑎𝑏 → math.pow(𝑎, 𝑏) Varijable mogu biti napisane u obliku izraza 𝑏+𝑐 𝑎𝑑+𝑒 → math.pow 𝑎, 𝑏 + 𝑐 / 𝑑 + 𝑒 Moguće i korjenovanje 𝑎 𝑏+𝑐 → math.pow 𝑏 + 𝑐 / 𝑑 + 𝑒 , 1/𝑎 𝑑+𝑒 ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 13 Pisanje matematičkih izraza Logaritamska funkcija je inverzija potenciranja 10 x = 100 x = log10 100 Najčešće se koriste logaritmi prirodne baze (e = 2,718) i po bazi 10 – Moguća promjena baze logaritma korištenjem ovih osnovnih logaritama Logaritamska funkcija Pseudôkod Python 𝑙𝑜𝑔10 (𝑎) Log(a) math.log (a, 10) ili math.log10 (a) 𝑙𝑜𝑔2 (𝑎) Log(a)/Log(2) math.log (a, 2) ili math.log2(a) ln(a) Ln(a) math.log (a) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 14 Pisanje matematičkih izraza Izrazi modela prometnog toka u Python-u – Inicijalizacija parametarskih varijabli v_o, k_j, v_f, k_o = 70, 150, 80, 70 – Greenberg-ov model 𝑘𝑗 𝑣 = 𝑣0 𝑙𝑛 𝑘 v_g = v_o * math.log(k_j / k ) – Underwood-ov model −𝑘 𝑣 = 𝑣𝑓 𝑒 𝑘𝑜 v_u = v_f * math.pow(math.e, (-k / k_o)) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 15 Pitanja za provjeru znanja (1/3) 1. Što će se 2. Obajsnite! ispisati i koji tip podataka za oba primjera? rezultat1 = 8 // 3 * 4 % 3 rezultat2 = 10 % 3 / 2 * 4 print(rezultat1, rezultat2) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 16 Operatori usporedbe Operatori usporedbe varijabli – Usporedba vrijednosti dvije varijable – Rezultat usporedbe - tip podataka bool – Primjer a = 1 Ispis u terminalu: b = 2 print(a > b) False ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 17 Logički operatori Logičke varijable mogu imati samo dvije vrijednosti – Logička „0” (neistina ili laž, engl. „False”) – Logička „1” (istina, engl. „True”) Numerička vrijednost se može pretvoriti u logičku vrijednost – Numerička vrijednost 0 predstavlja neistinu (laž) a = 0 Ispis u terminalu: print(bool(a)) False – Druge numeričke vrijednosti predstavljaju istinu a = -12 Ispis u terminalu: print(bool(a)) True ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 18 Logički operatori Svaki operator ima svoj simbol i tablicu istinitosti kao definiciju Redoslijed Operator Pseudokôd Python izvođenja 1 Zagrade (,) (,) 2 Logičko NE -, ‾ not 3 Logičko I I, and Logičko 4 ILI, + or uključivo ILI Logičko 5 XOR ^ isključivo ILI Varijable trebaju biti tipa bool ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 19 Logički operatori Logička negacija Python sintaksa - not Djeluje samo na jednu logičku varijablu – Unarni operator Radi se o funkciji inverzije – Logička 0 postaje logička 1, i obrnuto A Z Z = −A = A LAŽ ISTINA ISTINA LAŽ ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 20 Logički operatori Logičko I – konjukcija Python sintaksa - and Služi kao funkcija za sigurnost – Izlaz će biti logička jedinica samo ako su svi ulazi jednaki logičkoj jedinici A B Z Z = A I B = A B = AB LAŽ LAŽ LAŽ LAŽ ISTINA LAŽ ISTINA LAŽ LAŽ I-sklop ISTINA ISTINA ISTINA ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 21 Logički operatori Logičko uključivo ILI odnosno disjunkcija Python sintaksa - or Predstavlja funkciju odabira – Izlaz je istinit ako je najmanje jedna ulazna vrijednost istinita Z = A ILI B = A + B A B Z LAŽ LAŽ LAŽ LAŽ ISTINA ISTINA ILI-sklop ISTINA LAŽ ISTINA ISTINA ISTINA ISTINA ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 22 Logički operatori Logičko isključivo ILI Python sintaksa - ^, xor(a,b) – Obje varijable moraju biti tipa bool Predstavlja funkciju detekcije razlike – Izlaz je istinit ako su ulazne vrijednosti različite A B Z Z = A XOR B LAŽ LAŽ LAŽ LAŽ ISTINA ISTINA Isključivo-ILI-sklop ISTINA LAŽ ISTINA ISTINA ISTINA LAŽ ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 23 Pitanja za provjeru znanja (2/3) 1. Riješite/objasnite logički izraz: (1 XOR 1) AND 1 = 0 AND 1 = 0 2. Objasnite logičko uključivo ILI na temelju korištenja dva transportna sredstva. 3. Objasnite logičko I na temelju sigurnog prijelaza preko cestovne prometnice sa semaforom i pješačkim prijelazom. ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 24 Napredni ispis teksta Napredno formatiranje teksta u Python-u – Funkcija svojstva varijable.format() – Primjenjiva na varijablu tipa string {varijabla tipa string}.format() txt1 = 'Prosjecna gustoca {gustoca:.2f} [voz/km]' print(txt1.format(gustoca = 50.107)) txt2 = "Parametar {par}: Greenberg model {v_g}, Underwood model {v_u}".format(par = 'brzina [km/h]',v_g = 84.56, v_u = 36.14) txt3 = 'Parametar {0}: Greenberg model {1}, Underwood model {2}'.format('brzina [km/h]', 84, 36.14) #indeksi (adrese) varijabli: {0} {1} {2} ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 25 Napredni ispis teksta Formatiranje vrijednosti varijabla u Python-u print("Opterecenje prometnice {0:.3f} {1}!".format(80, "%")) Kôd tipa podataka za konverziju f – float, s – string, b – binary, o – octal :{Kôdovi formatiranja ispisa varijabli}.{Broj decimalnih mjesta} print("Opterecenje {0:5} % pomocne trake!".format(40)) #n – razmaka prije ispisa varijable ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 26 Napredni ispis teksta Formatiranje vrijednosti varijabla u Python-u print("{:*^21}".format("Oprez na cesti!")) Kôd poravnanja teksta ^ Srednje poravnanje teksta < Lijevo poravnanje teksta > Desno poravnanje teksta Ispis u terminal: ***Oprez na cesti!*** Objašnjenje: 21 (*) znakova ukupno 15 znakova “Oprez na cesti!” 21 – 15 = 6, tj. 3 (*) prije i nakon “Oprez na cesti!” ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 27 Napredni ispis teksta Prošireno (višestruko) pridruživanje – Sve varijable su inicijalizirane na string ‘STOP’ a = b = c = "STOP" – Uzastopno konkateniranje i pridruživanje a = 'Oprez' b = ' INCIDENT!' print((a + b + '\n') * 3) Novi redak Ispis u terminal: Oprez INCIDENT! Oprez INCIDENT! Oprez INCIDENT! ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 28 Operacije inkrement i dekrement varijabli Inkrement – Uvećanje vrijednosti varijable za neku vrijednost (n) I = I + n I += n Dekrement – Smanjenje vrijednosti varijable za neku vrijednost (n) I = I - n I -= n ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 29 Operacije inkrement i dekrement varijabli Struktura za sve aritmetičke operatore I = I {aritmetički operator} n I {aritmetički operator} = n – Primjeri I = I \ n I \= n I = I * n I *= n ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 30 Rješenje zadatka import math # parametri prometnog toka v_o, k_j, v_f, k_o = 70, 150, 80, 70 # unos vrijednosti gustoce - sement 1 g_seg1 = int(input("Segment 1 - Unesite vrijdnost gustoce [voz/km] : ")) # unos vrijednosti gustoce - sement 2 g_seg2 = int(input("Segment 2 - Unesite vrijdnost gustoce [voz/km] : ")) # izracun brzine po oba modela za segment 1 v_greenberg_seg1 = v_o * math.log(k_j/ g_seg1 ) v_underwood_seg1 = v_f * math.pow(math.e, (-g_seg1 / k_o)) # izracun brzine po oba modela za segment 1 v_greenberg_seg2 = v_o * math.log(k_j/ g_seg2 ) v_underwood_seg2 = v_f * math.pow(math.e, (-g_seg2 / k_o)) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 31 Rješenje zadatka # izracun srednje vrijednosti brzina modela za segmente v_greenberg_prosjek = (v_greenberg_seg1 + v_greenberg_seg2)/2 v_underwood_prosjek = (v_underwood_seg1 + v_underwood_seg2)/2 # komparacija modela komparacija_modela = int(v_greenberg_prosjek > v_underwood_prosjek) lista modeli = ['Geenberg-ov', 'Underwood-ov’] (uvod u iduće predavanje) # ispis rezultata analize print("Prosječne brzine: Greenbergov model {0:.2f} [km/h], Underwoodov model {1:.2f} [km/h]".format(v_greenberg_prosjek, v_underwood_prosjek)) ispis_formatiran = "Pesimisticniju predkiciju brzine daje {bolji} model!".format( bolji=modeli[komparacija_modela]) print(ispis_formatiran) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 32 Rješenje zadatka Testni podatci – Gustoće prometnog toka (unosi korisnik) Segment prometnice 1 - 40 [voz/km] Segment prometnice 2 - 12 [voz/km] ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 33 Pitanja za provjeru znanja (3/3) 1. Objasnite svaki 2. Što će se ispisati? kvadrant ! a = 5 a += 1 a *= 5 a %= 2 print(a) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 34 Kraj Pitanja studenata? ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko SVEUČILIŠTE U ZAGREBU Fakultet prometnih znanosti Zavod za inteligentne transportne sustave Vukelićeva 4, Zagreb, HRVATSKA Računalstvo u logistici Složeni tipovi podataka I doc. dr. sc. Martin Gregurić ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 2 Sadržaj Uvod Jednodimenzionalne liste Skup (engl. Set) N-torka (engl. Tuple) Rječnik (engl. Dictionary) Višedimenzionalna polja ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 3 Uvod Ishodi učenja kolegija 1. Objasniti termine iz područja računalstva te opisati značajke računalnih sustava i programske podrške 2. Primijeniti napredne mogućnosti uredskih računalnih alata za pisanje i uređivanje dokumenata, tablično računanje i zajednički udaljeni rad u oblaku 3. Modelirati osnovne probleme iz područja logistike za rješavanje programom pomoću računala 4. Analizirati postupak izvođenja programa praćenjem redoslijeda izvođenja naredbi te provjeriti njegovu ispravnost 5. Izraditi aplikaciju za rješavanje postavljenog jednostavnog logističkog problema u obliku tekstualnog programa u višem programskom jeziku 6. Primijeniti odabranu razvojnu okolinu za implementaciju jednostavnog programskog rješenja i provjeru njegove ispravnosti 7. Primijeniti funkcionalnosti višeg programskog jezika za povezivanje s jednostavnom bazom podataka ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 4 Uvod Ishodi učenja predavanja 1. Izraditi jednodimenzionalnu listu 2. Koristit opcije za odabir i brisanje elemenata u jednodimenzionalnoj listi 3. Demonstrirati izradu Skupa (engl. Set) 4. Demonstrirati rad s N-torkama (engl. Tuple) 5. Demonstrirati rad s Rječnikom (engl. Dictionary) 6. Koristiti NumPy paket za izradu višedimenzionalnih polja (nizova i matrica) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 5 Uvod Potrebno je napraviti aplikaciju za upisnu strukturu (popis) putnika – Manji privatni zrakoplov Maksimalni broj putnika : 4 – Trenutno unesena 4 putnika Ime i prezime Broj sjedala Cijena karte [EUR] Prtljaga [kg] Mario Marić 1 300.99 12 Jana Janić 2 400.99 80 Pero Perić 3 100.99 10 John Doe 4 0.99 0 ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 6 Uvod Potrebne funkcije programa – Izbaciti iz popisa putnika Putnika koji je na listi terorista Ukupno mora biti 4 putnika – Dodati novog putnika (koji nije na listi terorista) – Izračunati Prosječnu cijenu plaćene karte putnika – Nakon izračuna izbrisati stupac Maksimalnu težinu pojedinačne prtljage putnika – Dodati novi stupac (atribut) Naziv “On-board” Podatkovni tip – bool Postaviti sve vrijdnosti stupca na logičku istinu ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 7 Jednodimenzionalne liste Što je lista (engl. list)? – Niz vrijednosti slijedno spremljenih u jednoj varijabli Moguća kombinacija različitih tipova podataka, lista, objekata (svojstveno Python-u) – Element liste Sadrži vrijednost bilo kojeg tipa podataka (ili objekt, listu) Adresiran u listi (indeksom) - redoslijedni broj # {0} {1} {2} - indeksi elemenata mojaLista = [70, 150, 80] print(mojaLista) Ispis u terminalu: 150 Ispis u terminalu: print(mojaLista.index(150)) 1 ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 8 Jednodimenzionalne liste Ekstrakcija skupine elemenata iz liste # {0} {1} {2} {3} Cijena karte [EUR] cijenaKarte = [300.99, 400.99, 100.99, 0.99] 300.99 #početni indeks #krajni indeks - 1 400.99 100.99 print(cijenaKarte[0:2]) 0.99 Ispis u terminalu: [300.99, 400.99] #znak (-) početak indeksiranje od zadnjeg indeksa liste # {-4} {-3} {-2} {-1} cijenaKarte = [300.99, 400.99, 100.99, 0.99] print(cijenaKarte[-1]) Ispis u terminalu: 0.99 #izostavljeni početni ili krajnji indeks = njihova max. vrijednost print(cijenaKarte[:-2]) Ispis u terminalu: [300.99, 400.99] print(cijenaKarte[:-2]) Ispis u terminalu: [400.99] ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 9 Jednodimenzionalne liste Dodavanje jednog elementa na kraju liste – Funkcija svojstva liste.append() mojaLista.append(30) print(mojaLista) Ispis u terminalu: [70, 150, 80, 30] Brisanje elementa liste – Funkcija svojstva liste.remove Brisanje elementa prema vrijednosti mojaLista.remove(70) print(mojaLista) Ispis u terminalu: [150, 80, 30] ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 10 Jednodimenzionalne liste – Funkcija svojstva liste.pop Brisanje elementa prema indeksu mojaLista.pop(1) print(mojaLista) Ispis u terminalu: [150, 30] – Ili korištenje naredba del del mojaLista Izmjena vrijdnosti postojećeg elementa liste – Prema indeksu elementa koji se mijenja mojaLista = 'zrakoplov' print(mojaLista) Ispis u terminalu: ['zrakoplov', 30] ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 11 Jednodimenzionalne liste Sortiranje elemenata liste – Funkcija svojstva liste.sort() Obavezna ista vrsta tipa podataka za sve elemente liste – Početna postavka sortiranja argumenta reverse reverse = False Brojevi: od najmanjeg prema najvećem string-ovi: od A do Z (priotiriziranje znakova brojeva prije slova) – Promjena argumenta reverse reverse = True Brojevi: od najvećeg prema najmanjem string-ovi: od Z do A – Argument key funkcija kriterija sortiranja ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 12 Jednodimenzionalne liste – Primjer funkcija svojstva liste.sort() sortLista = [12, 1, 5] sortLista.sort() print(sortLista) Ispis u terminalu: [1, 5, 12] Argument funkcije reverse = True sortLista = ['zrakoplov', 'motocikl', 'automobil'] sortLista.sort(reverse = True) print(sortLista) Ispis u terminalu: ['zrakoplov', 'motocikl', 'automobil'] ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 13 Jednodimenzionalne liste Korisne funkcije za operacije s listama – len() > broj elemenata u listi (duljina liste) – max() > maksimalna vrijednost u listi – min() > minimalna vrijednost u listi – sum() > zbroj vrijednosti svih elemenata u listi – all() > logička istina ako su svi elementi liste istinit; ili ako je lista prazna – any() > logička istina ako je barem jedan element liste istina; ili laž ako je lista prazna – Izračun srednje vrijednosti svih elemenata liste from statistics import mean mean() ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 14 Pitanja za provjeru znanja (1/3) 1. Objasnite meme! 2. Popunite elipsu za izvadak iz liste od prvog do uključujući zadnjeg indeksa koristeći funkciju? cijenaKarte[1: ] ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 15 Skupovi Što je skup (engl. set)? – Lista za operacije iz teorije skupova Nebitan redoslijed/pozicije/indeksi već vrijednosti Kombinacija različitih tipova podataka Operacije između skupova na temelju teorije skupova Ne može sadržavati iste vrijednosti elemenata – Element skupa Ne može se mijenjati, niti kopirat vrijednost elementa Nemaju adrese (indekse) - redoslijedni broj putnici = {"Mario Maric", "Pero Peric", "John Doe", "Pero Peric" } Ispis u terminalu: {'Pero Peric', 'Mario Maric', 'John Doe'} ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 16 Skupovi Izrada objekta skupa iz liste konstruktorom set putnici = set(["Mario Maric", "Jana Janic", "Pero Peric"]) Dodavanje elementa skupu – Funkcija svojstva skupa.add() print(putnici.add('Jana Janic')) Ispis u terminalu: {'John Doe', 'Mario Maric', 'Jana Janic', 'Pero Peric'} Brisanje elementa iz skupa prema vrijednosti – Funkcija svojstva skupa.remove() putnici.remove('Jana Janic') print(putnici) Ispis u terminalu: {'John Doe','Mario Maric','Pero Peric'} ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 17 Skupovi Operacije sa skupovima (teorija skupova) putnici = set(["Mario Maric", "Jana Janic", "Pero Peric", "John Doe"]) teroristi = set(["Pero Peric", "John Doe", "Otto Opasni"]) – Osobe u oba skupa Ispis u terminalu: {'Pero Peric’, # Unija 'Otto Opasni’, print(putnici | teroristi) 'Mario Maric’, 'Jana Janic’, 'John Doe'} – Putnici koji su teroristi Ispis u terminalu: {'Pero Peric’, # Presjek 'John Doe'} print(putnici & teroristi) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 18 Skupovi Operacije sa skupovima putnici = set(["Mario Maric", "Jana Janic", "Pero Peric", "John Doe"]) teroristi = set(["Pero Peric", "John Doe", "Otto Opasni"]) – Putnici koji nisu teroristi i teroristi koji nisu putnici # Razlika print(putnici - teroristi) Ispis u terminalu: {'Mario Maric', 'Jana Janic'} print(teroristi - putnici) Ispis u terminalu: {'Otto Opasni'} – Osobe koje se ne ponavljaju u oba skupa Ispis u terminalu: # Simetrična razlika {'Otto Opasni', print(putnici ^ teroristi) 'Mario Maric', 'Jana Janic'} ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 19 N-torka Što je N-torka (engl. tuple) ? – Operacije manipulacijom N-torkom iste kao kod lista – Mogućnost ugnježđivanja N-torki – Element N-torke Vrijednosti elementa se ne mogu mijenjati (ne direktno) Vrijednost može biti druga N-torka (ugnježđivanja N-torki) Imaju adrese (indekse) - redoslijedni broj print(("Mario Maric", "John Doe", "Pero Peric")) Ispis u terminalu: ('Mario Maric', 'John Doe', 'Pero Peric') Konverzija varijable tipa string u N-torku print(tuple("John Doe")) Ispis u terminalu: ('J', 'o', 'h', 'n', ' ', 'D', 'o', 'e') ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 20 N-torka Objekt N-torke iz liste konstruktorom tuple putnici = tuple(["Mario Maric", "Jana Janic", "Pero Peric"]) Dodavanje elementa N-torki - Znak (+) za konkatenaciju N-torki bez zareza print(type(('Jana Janic'))) putnici = putnici + ('Jana Janic',) Ispis u terminalu: ('Mario Maric', 'Jana Janic', 'Pero Peric', 'Jana Janic') – Konverzija N-torke u listu, pa liste u N-torku _lista_putnici = list(putnici) _lista_putnici.append("Jana Janic") print(tuple(_lista_putnici)) Ispis u terminalu: ('Mario Maric', 'Jana Janic', 'Pero Peric', 'Jana Janic') ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 21 N-torka – Ugnježđivanje N-torke putnici = tuple(["Mario Maric", "Jana Janic", "Pero Peric","Jana Janic"]) onBoard = (True,) * len(putnici) print( (putnici, onBoard) ) Ispis u terminalu: (('Mario Maric', 'Jana Janic', 'Pero Peric’, 'Jana Janic’), (True, True, True, True) ) print( ( (putnici, onBoard), (False,)*3 ) ) Ispis u terminalu: ((('Mario Maric', 'Jana Janic’, 'Pero Peric','Jana Janic’), (True, True, True, True)), (False, False, False)) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 22 N-torka – Pristup ugniježđenim elementima N-torke Indeksiranje pojedinih elementa kao kod lista popis_cool_putnika = ((('Mario Maric', 'Jana Janic'), (True, True)), ('cool people',)) popis_cool_putnika zagrade:() Indeks: Indeks: zagrade: () zagrade: () (('Mario Maric', 'Jana Janic'), ('cool people',) (True, True, True)) Indeks: Indeks: zagrade: () zagrade: () ('Mario Maric', 'Jana Janic') (True, True) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 23 N-torka – Pristup ugniježđenim elementima N-torke print(popis_cool_putnika[-1]) Ispis u terminalu: Jana Janic – Izmjena vrijednosti pojedinog elementa N-torke? Isto kao kod lista? popis_cool_putnika[-1] = 'John Doe' TypeError: 'tuple' object does not support item assignment popis_cool_putnika [-1] = 'John Doe' Rješenje? 1. Konverzija elemenata N-torke koji se mijenja u listu 2. Promjena vrijednosti pojedinog elementa liste u željenu vrijednost 3. Rekonstrukcija N-torke s izmijenjenom listom koja se konvertira u N-torku ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 24 N-torka Operativno rješenje list_putnici = list(popis_cool_putnika) list_putnici = 'John Doe' popis_cool_putnika = ((tuple(list_putnici), popis_cool_putnika), popis_cool_putnika ) print("Azuriran popis putnika: " , popis_cool_putnika) Original N-torka popis_cool_putnika: ((('Mario Maric', 'Jana Janic'), (True, True)), ('cool people',)) Ispis u terminalu nakon rješenja: Azuriran popis putnika: ((('Mario Maric', 'John Doe'), (True, True)), ('cool people',)) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 25 Pitanja za provjeru znanja (2/3) 1..pop() je funkcija svojstva skupa. Što ona može (smije) imati za argument? Temelj analogije - primjena iste funkcije za listu 2. Koje su razlike između skupa i N-torke? ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 26 Rječnik Što je Rječnik (engl. dictionary) ? – Elementi rječnika strukturirani u parovima Ključ – Analogija s pojmom (riječi) u pravom rječniku – Indeks elementa kojeg imenujemo kako želimo » Identifikator elementa » Kombinacija bilo koje vrste podataka (npr. integer i string) Vrijednost – Analogija s objašnjenjem riječi u pravom rječniku – Varijable bilo koje vrste podataka, liste, drugi rječnici, itd. ključ vrijednost ključ vrijednost rjecnikPutnika = {'let': 'A123', 1: [1, 2, 3, 4]} print(rjecnikPutnika) Ispis u terminalu: {'let': 'A123', 1: [1, 2, 3, 4]} ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 27 Rječnik Pristup elementima rječnika print(rjecnikPutnika['let']) Ispis u terminalu: A123 print(rjecnikPutnika[:2]) Ispis u terminalu: [1, 2] Promjena elementa rječnika Ispis u terminalu: rjecnikPutnika['let'] += '4' {'let': 'A1234', print(rjecnikPutnika) 1: [1, 2, 3, 4]} Ugniježđeni rječnici (rječnik u rječniku) ključ ugniježđenog rječnika piloti posada = {'let': 'A123', 'piloti': {'Cap.': 'Ana Anic', 'Kop.': 'Mira Miric'}} Ispis u terminalu: {'let': 'A123', 'piloti': {'Cap.': 'John Doe', 'Kop.': 'Mira Miric'}} ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 28 Rječnik Izmjena vrijednosti elementa ugniježđenog rječnika posada['piloti']['Cap.'] = 'John Doe' print(posada) Ispis u terminalu: {'let': 'A123', 'piloti': {'Cap.': 'John Doe', 'Kop.': 'Mira Miric'}} Dodavanje novog elementa rječniku – Stvara se ako već nije prisutan u rječniku posada['Operater'] = 'CA' posada.update( print(posada) #ILI {'Operater':'CA'}) print(posada) Ispis u terminalu: {'let': 'A123', 'piloti': {'Cap.': 'John Doe', 'Kop.': 'Mira Miric'}, 'Operater': 'CA'} ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 29 Rječnik Brisanje vrijednosti elementa rječnika – Funkcija svojstva.pop() Brisanje specificirane vrijednosti prema ključu posada.pop('Operater') – Funkcija svojstva.popitem() Brisanje zadnjeg elementa u rječniku posada.popitem() Ispis u terminal za oba slučaja: {'let': 'A123', 'piloti': {'Cap.': 'John Doe', 'Kop.': 'Mira Miric'}} – Funkcija svojstva.clear() Brisanje svih elementa u rječniku ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 30 Višedimenzionalna polja Višedimenzionalna polja u Python-u – Paket NumPy Izrada višedimenzionalnih polja funkcijom array() Svi elementi moraju biti istog tipa podataka Pod-zadatak: izraditi dvodimenzionalno polje (matricu) gdje će prvi redak odgovarat Broju sjedala, a drugi Prtljage import numpy as np brojSjedala = [1, 2, 3, 4] Broj Prtljaga prtljaga = [12, 80, 10, 0] sjedala [kg] print(np.array([brojSjedala,prtljaga])) 1 12 Ispis u terminal: 2 80 stupci 3 10 [[ 1 2 3 4] redci 4 0 [12 80 10 0]] ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 31 Višedimenzionalna polja Korisne funkcije svojstva NumPy polja polje2D = np.array([brojSjedala, prtljaga]) – Broj dimenzija.ndim print(polje2D.ndim) Ispis u terminal: 2 – Maksimalni broj elementa po dimenziji.shape broj stupaca print(polje2D.shape) Ispis u terminal: (2, 4) broj redaka – Ukupni broj elemenata.size print(polje2D.size) Ispis u terminal: 8 – Transponiranje elemenata.T print(polje2D.T.shape) Ispis u terminal: (4, 2) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 32 Višedimenzionalna polja Pristup elementima NumPy polja – Težina prtljage za zadnja dva sjedala u zrakoplovu print(polje2D[2:polje2D.shape]) odabir redaka odabir stupaca Ispis u terminal: [10, 0] Izmjena elemenata NumPy polja – Postaviti zadnja dva elementa prtljage na vrijednost 0 Umetanje liste u odabrano NumPy polje #odabrano polje (1,2) #lista za umetanje (1,2) polje2D[2:polje2D.shape] = [0 , 0] Ispis u terminal: [[ 1 2 3 4] [12 80 0 0]] ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 33 Višedimenzionalna polja Brisanje elemenata NumPy polja – Funkcija svojstva NumPy polja.delete() – Brisanje prva dva stupca #indeks dimenzije n = np.delete(polje2D, [0,2], axis=1) (0-redci, 1- stupci) print(n) Ispis u terminal: [[ 2 4] [80 0]] Dodavanje elementa NumPy polju – Funkcija svojstva dodavanja elemenata.append() – Dodavanje novog reda n = np.append(n, np.array([['100','200']]), axis=0) print(n) Ispis u terminal: [['2' '4'] print(np.array([['100', ['80' '0'] '200']]).ndim) ['100' '200']] Ispis u terminal: 2 ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 34 Rješenje # rjecnik putnika boardingList = {"putnici" :["Mario Maric", "Jana Janic", "Pero Peric","John Doe"], "broj sjedala":[1,2,3,4], "cijena Karte":[300.99, 400.99, 100.99, 0.99], "tezina prtljage": [12, 80, 10, 0]} # lista terorista teroristi = ["John Doe", "Otto Opasni"] # trazenje nepozeljnog putnika po indeksu terorist = set(boradingList["putnici"]) & set(teroristi) index_of_terorist = list(boardingList["putnici"]).index(list(terorist)) # izbacivanje nepozeljnog putnika i dodavanje novog boardingList["putnici"].pop(index_of_terorist) boardingList["putnici"] += ["Good Guy"] # statisticki izracuni prosjecna_cijena_karte = sum(boardingList["cijena Karte"]) / len(boardingList["cijena Karte"]) max_tezina_prtljage = max(boardingList["tezina prtljage"]) ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 35 Rješenje # brisanje i dodavanje stupca del boardingList["cijena Karte"] boardingList["On_board"] = [True] * 4 # ispis print(boardingList) print("Prosjecna cijena karte.: ", round(prosjecna_cijena_karte, 2), " [EUR], a maksimalna tezina prtljage: ", max_tezina_prtljage, " [kg]") Ispis u terminal : {'putnici': ['Mario Maric', 'Jana Janic', 'Pero Peric', 'Good Guy'], 'broj sjedala': [1, 2, 3, 4], 'tezina prtljage': [12, 80, 10, 0] 'On_board': [True, True, True, True]} Prosjecna cijena karte.: 200.99 [EUR], a maksimalna tezina prtljage: 80 [kg] ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 36 Pitanja za provjeru znanja (3/3) 1. Prema ispisu u terminalu što je “lista lista”, a što NumPy 2D polje? #A ispis [[1, 2] [3, 4]] #B ispis [[1, 2],[3, 4]] 2. Što bi se dogodilo u slučaju slijedeće linije koda? boardingList["putnici"] += "Good Guy" ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko 37 Kraj Pitanja studenata? ZITS::Računalstvo u prometnom inženjerstvu © 2024 Gregurić, Ivanjko SVEUČILIŠTE U ZAGREBU Fakultet prometnih znanosti Zavod za inteligentne transportne sustave Vukelićeva 4, Zagreb, HRVATSKA Računalstvo u logistici Složeni tipovi podataka II doc. dr. sc. Martin Gregurić ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 2 Sadržaj Uvod Operacije s NumPy poljima Pandas serije (engl. Series) Pandas podatkovni okvir (engl. DataFrame) Pandas objekti podatkovnog indeksiranja (engl. Index) ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 3 Uvod Ishodi učenja kolegija 1. Objasniti termine iz područja računalstva te opisati značajke računalnih sustava i programske podrške 2. Primijeniti napredne mogućnosti uredskih računalnih alata za pisanje i uređivanje dokumenata, tablično računanje i zajednički udaljeni rad u oblaku 3. Modelirati osnovne probleme iz područja logistike za rješavanje programom pomoću računala 4. Analizirati postupak izvođenja programa praćenjem redoslijeda izvođenja naredbi te provjeriti njegovu ispravnost 5. Izraditi aplikaciju za rješavanje postavljenog jednostavnog logističkog problema u obliku tekstualnog programa u višem programskom jeziku 6. Primijeniti odabranu razvojnu okolinu za implementaciju jednostavnog programskog rješenja i provjeru njegove ispravnosti 7. Primijeniti funkcionalnosti višeg programskog jezika za povezivanje s jednostavnom bazom podataka ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 4 Uvod Ishodi učenja predavanja 1. Koristiti NumPy paket za manipulaciju višedimenzionalnim poljima 2. Demonstrirati matematičke operatore NumPy alata za obradu postojećih višedimenzionalnih polja 3. Koristiti podatkovni objekt serije (engl. series) Pandas paketa 4. Koristiti podatkovni objekt podatkovnog okvira (engl. DataFrame) Pandas paketa 5. Koristiti podatkovni objekti podatkovnog indeksiranja (engl. Index) Pandas paketa ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 5 Uvod Potrebno je napraviti registar vozila koja koriste autocestu – Temelj automatskog sustava naplate cestarine Funkcionalno područje Inteligentnih transportnih sustava (ITS-a) Zapisi ulaska na autocestu Vrijeme ulaska Registracija Mjesto ulaza Broj putnika 2024-01-01 00:00:00 ZG-000-AK Lučko 1 2024-01-01 00:01:00 ST-001-AK Pirovac 4 Zapisi izlaska sa autoceste Vrijeme izlaska Registracija Mjesto izlaska Broj putnika 2024-01-01 03:15:00 ZG-000-AK Sibenik 1 2024-01-01 02:12:00 ST-001-AK Rijeka 4 ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 6 Uvod Budući sustav naplate cestarine u RH – FreeFlow - 100 milijuna [EUR] – Temelj sustava Automatsko prepoznavanje registarskih pločica kamerama DSRC - namjenska kratko-dometna komunikacija 5,8 GHz - ENC Osnovna potreba sustava – Tablica u kojoj svako vozilo ima sljedeće atribute Registarska oznaka vozila Trajanje putovanja autocestom Cijena naplate putovanja autocestom prema cjeniku Mjesto Mjesto Cijena [EUR] Udaljenost [km] ulaza izlaza Pirovac Rijeka 22.10 202 Lucko Sibenik 34.90 332 ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 7 Uvod Potrebni izgled tražene tablice – Izraditi na temelju 3 zadane tablice Registracija Trajanje putovanja [h] Naplata [EUR] ZG-000-AK 3:15 34.90 ST-001-AK 2:11 22.10 – Ispisati gornju tablicu u terminal – Izračunati i ispisati u terminal prosječnu brzinu oba vozila ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 8 Operacije s NumPy poljima Inicijalizacija dva NumPy 2D polja (engl. Array) cestarine = np.array([[22.10],[34.90]]) # jedinično 2D polje 2x2 tipa podataka float jedinicna = np.ones((2,2),dtype=float) * 3 print(cestarine,jedinicna) Ispis u terminalu: [[22.1] [[3. 3.] [34.9]] [3. 3.]] ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 9 Operacije s NumPy poljima Matematičke operacije s NumPy poljima – Jedinično zbrajanje i oduzimanje elemenata NumPy polja print(np.add(cestarine, [[25.1 25.1] jedinicna)) [37.9 37.9]] print(np.subtract(cestarine, [[19.1 19.1] jedinicna)) [31.9 31.9]] – Jedinično množenje i dijeljenje elemenata NumPy polja print(np.multiply(cestarine, [[ 66.3 66.3] jedinicna)) [104.7 104.7]] print(np.divide(cestarine, [[7.36 7.36] jedinicna)) [11.63 11.63]] ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 10 Operacije s NumPy poljima Spajanje (konkatenacija) NumPy polja – Funkcija svojstva NumPy polja.concatenate() print(np.concatenate((cestarine, jedinicna), axis=1)) axis = 1 axis = 0 Ispis u terminalu: [[22.1 3. 3. ] [34.9 3. 3. ]] print(np.concatenate((cestarine, jedinicna), axis=0)) Ispis u terminalu: ValueError: all the input array dimensions except for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 1 and the array at index 1 has size 2 ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 11 Pandas serije Pandas paket (modul) import pandas as pd – Operacije numeričkim tablicama (matricama) i vremenskim serijama – Pandas serije (engl. Series) 1D podatkovna struktura Pandas-a Bilo koji tip podataka (ili njihove kombinacije) Automatsko označavanje (engl. labeling) elemenata – Početno/zadano označavanje » 0-N (N - max. broj elemenata) ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 12 Pandas serije Pandas paket (modul) serija = pd.Series(['ZG-000-AK', 1, 'ST-001-AK', 4]) print(serija) Ispis u terminal: 0 ZG-000-AK 1 1 #oznake 2 ST-001-AK 3 4 – Odabir elemenata u seriji print(serija[:2]) print(serija.loc[:2]) 0 ZG-000-AK 0 ZG-000-AK 1 1 1 1 2 ST-001-AK ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 13 Pandas serije – Pristup elementu u seriji Funkcija svojstva.loc pristup prema oznakama print(serija.loc[:2]) 0 ZG-000-AK 1 1 2 ST-001-AK Funkcija svojstva.iloc pristup prema integer lokaciji (indeksu) » Početno označavanje – integer indeksi odgovaraju oznakama print(serija.iloc[:2]) 0 ZG-000-AK 1 1 ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 14 Pandas serije Promjena oznaka serija – Argument index svojstva funkcije Series serija = pd.Series(['ZG-000-AK', 1,'ST-001-AK', 4], index=['Reg1','Br.Put1', 'Reg2','Br.Put2']) Ispis u terminal: Reg1 ZG-000-AK Br.Put1 1 Reg2 ST-001-AK Br.Put2 4 print(serija.loc['Reg2':'Br.Put2']) Ispis u terminal: Reg2 ST-001-AK Br.Put2 4 print(serija.iloc['Reg2':'Br.Put2']) TypeError: cannot do positional indexing on Index with these indexers [Reg2] of type str ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 15 Pitanja za provjeru znanja (1/2) 1. Riješite grešku iz prethodnog primjera kako bi ispis bio isti kao u slučaju.loc funkcije svojstva. 2. Objasnite prednosti korištenja Pandas serija u odnosnu na liste. ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 16 Pandas serije – Što se dogodi kada su oznake iste za elemente? serija = pd.Series(['ZG-000-AK', 1,'ST-001-AK', 4], index=['Reg','Br.Put1', 'Reg','Br.Put2']) print(serija.loc['Reg']) Ispis u terminal: Reg ZG-000-AK Reg ST-001-AK – Oduzimanje i zbrajanje serija (.sub i.add) ulaz = pd.Series(pd.to_datetime(['2024-01-01 00:00:00', '2024-01-01 00:01:00']), index=['ZG-000-AK', 'ST-001-AK']) izlaz = pd.Series(pd.to_datetime(['2024-01-01 03:15:00', '2024-01-01 02:12:00']), index=['ZG-000-AK', 'ST-001-AK']) print(izlaz.sub(ulaz)) Ispis u terminal: ZG-000-AK 0 days 03:15:00 ST-001-AK 0 days 02:11:00 ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 17 Pandas podatkovni okvir Pandas podatkovni okvir (engl. DataFrame) – 2D podatkovna struktura Pandas-a – Bilo koji tip podataka (ili njihove kombinacije) – Automatsko označavanje (engl. labeling) elemenata – Konverzije različitih Python podatkovnih struktura Primjer: Konverzija Rječnika u Pandas podatkovni okvir cjenik = {'Ulaz' :['Pirovac', 'Lucko'], 'Izlaz' :['Rijeka', 'Sibenik'], 'Cijena' :[22.10, 34.90], 'Udaljenost':[202, 332]} print(pd.DataFrame(cjenik)) Ispis u terminal: Ulaz Izlaz Cijena Udaljenost 0 Pirovac Rijeka 22.1 202 1 Lucko Sibenik 34.9 332 ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 18 Pandas podatkovni okvir Specifikacija oznaka (indeksa) i atributa (stupaca) Pandas podatkovnog okvira – Koristeći NumPy polja data = np.array([['','Izlaz','Broj putnika'], ['ZG-000-AK','Lucko',1], ['ST-001-AK','Pirovac',4]]) df = pd.DataFrame( data = data[1:,1:], indeks = data[1:,0], columns= data[0,1:])) Ispis df u terminal: Izlaz Broj putnika ZG-000-AK Lucko 1 ST-001-AK Pirovac 4 – Pristup pojedinim stupcima (atributima) Primjer: stupac “Izlaz” Ispis u terminal za oba slučaja: print(df.loc[:,'Izlaz']) ZG-000-AK Lucko print(df.iloc[:,0]) ST-001-AK Pirovac ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 19 Pandas podatkovni okvir Učitavanje podataka iz Excel-a u Pandas podatkovni okvir – Funkcija svojstva.read_excel Excel dokument u istoj datoteci s.py skriptom – A ako nije? » Napisat putanju do datoteke s Excel dokumentom zapisiUlaza.xlsx ulazi = pd.read_excel('zapisiUlaza.xlsx',index_col = 0) print(ulazi) Ispis u terminal : Registracija Mjesto ulaza Broj putnika 2024-01-01 00:00:00 ZG-000-AK Lucko 1 2024-01-01 00:01:00 ST-001-AK Pirovac 4 ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 20 Pandas podatkovni okvir Primjer Pandas podatkovnih okvira cjenik = {'Mjesto ulaza’ :['Pirovac', 'Lucko', 'Sveti Rok'], 'Mjesto izlaza':['Rijeka', 'Sibenik', 'Maslenica'], 'Cijena' :[22.10, 34.90, 3.40], 'Udaljenost' :[202, 332, 41]} #dodani novi unos u cjenik df_cjenik = pd.DataFrame(cjenik) ulazi = {'Vrijeme ulaza':pd.to_datetime(['2024-01-01 00:00:00','2024-01-01 00:01:00']), 'Registracija':['ZG-000-AK','ST-001-AK'], 'Mjesto ulaza':['Lucko', 'Pirovac'], 'Broj putnika':[1, 4]} df_ulaz = pd.DataFrame(ulazi) zlazi = {'Vrijeme izlaza':pd.to_datetime(['2024-01-01 03:15:00’, '2024-01-01 02:12:00']), 'Registracija':['ZG-000-AK','ST-001-AK'], 'Mjesto izlaza':['Sibenik','Rijeka'], 'Broj putnika':[1, 4]} df_izlazi = pd.DataFrame(izlazi) ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 21 Pandas podatkovni okvir Spajanje Pandas Podatkovnih Okvira (PPO) – Funkcija svojstva.merge Metoda spajanja Naziv spajanja Opis Lijevo (left) Lijevo vanjsko Koristi ključeve s lijevog PPO-a Desno (right) Desno vanjsko Koristi ključeve s desnog PPO-a Vanjsko (outer) Puno vanjsko Koristi uniju ključeva oba PPO-a Unutarnje (inner) Unutarnje Koristi presjek ključeva oba PPO-a Zadano unutrašnje spajanje argumentom.how='inner' – Presjek skupova (PPO) prema ključu (argument on=) df_res = pd.merge(df_ulaz, df_izlazi, #u oba PPO-a Broj on ='Registracija', putnika - automatska dodana oznaka _x i _y how ='inner') Vrijeme ulaza Registracija... Mjesto izlaza Broj putnika_y 0 2024-01-01 00:00:00 ZG-000-AK... Sibenik 1 1 2024-01-01 00:01:00 ST-001-AK... Rijeka 4 [2 rows x 7 columns] #2(PPO)x4 stupca – 1 ključ stupac - Registracija ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 22 Pandas podatkovni okvir Desno unutrašnje spajanje argumentum.how='right’ #lijevi PPO #desni PPO res3 = pd.merge(df_res, df_cjenik, on = ['Mjesto ulaza', 'Mjesto izlaza'], how = 'right') Ispis u terminal varijable res3 : Vrijeme ulaza Registracija... Cijena Udaljenost 0 2024-01-01 00:01:00 ST-001-AK... 22.1 202 1 2024-01-01 00:00:00 ZG-000-AK... 34.9 332 2 NaT NaN... 3.4 41 [3 rows x 9 columns] # Broj redaka odgovara desnom PPO-u (df_cjenik) # df_res (7 stupaca) + df_cjenik (4 stupaca) – 2 ključa stupaca = 9 stupaca ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 23 Pandas podatkovni okvir Lijevo unutrašnje spajanje argumentum.how='left' res3 = pd.merge(df_res, df_cjenik, on = ['Mjesto ulaza', 'Mjesto izlaza'], how = 'left') Ispis u terminal varijable res3 : Vrijeme ulaza Registracija... Cijena Udaljenost 0 2024-01-01 00:00:00 ZG-000-AK... 34.9 332 1 2024-01-01 00:01:00 ST-001-AK... 22.1 202 [2 rows x 9 columns] # + df_res (7 stupaca) + df_cjenik (4 stupaca) - 2 ključa stupaca = 9 stupaca ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 24 Pandas podatkovni okvir Operacije između stupaca PPO-a – Primjer oduzimanja stupaca prema elementima res3['Trajanje putovanja'] = res3['Vrijeme izlaza'] - res3['Vrijeme ulaza'] Ispis u terminal varijable res3 : novi stupac Vrijeme ulaza Registracija... Udaljenost Trajanje putovanja 0 2024-01-01 00:01:00 ST-001-AK... 202 0 days 02:11:00 1 2024-01-01 00:00:00 ZG-000-AK... 332 0 days 03:15:00 2 NaT NaN... 41 NaT [2 rows x 10 columns] – Konveritanje rezultata oduzimanja u sekunde (sate) res3['Trajanje putovanja'] = Ispis u terminal varijable res3: (res3['Vrijeme izlaza'] – … Trajanje putovanja res3['Vrijeme ulaza']). 0 … 2.183333 dt.total_seconds()/3600 1 … 3.250000 2 … NaN ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 25 Pandas podatkovni okvir Operacije između stupaca i redaka PPO-a – Primjer usporedbe elemenata stupca s vrijednošću res3.loc[res3['Udaljenost'] 200, 'Kat. udaljenost'] = 'Velika' print(res3) Ispis u terminal : novi stupac Registracija Udaljenost Trajanje putovanja Kat. udaljenost 0 ST-001-AK 202 0 days 02:11:00 Velika 1 ZG-000-AK 332 0 days 03:15:00 Velika 2 NaN 41 NaT Mala – Grupiranje stupaca funkcijom svojstva.groupby() g_res = res3.groupby('Kat. udaljenost') print(g_res.get_group('Velika')) Ispis u terminal : Registracija Udaljenost Trajanje putovanja Kat. udaljenost 0 ST-001-AK 202 0 days 02:11:00 Velika 1 ZG-000-AK 332 0 days 03:15:00 Velika ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 26 Pandas podatkovni okvir Brisanje stupaca u PPO – Funkcija svojstva.drop() res4 = res3.drop(columns=['Vrijeme ulaza', 'Vrijeme izlaza']) Ispis u terminal varijable res4 : Registracija... Udaljenost Trajanje putovanja 0 ST-001-AK... 202 0 days 02:11:00 1 ZG-000-AK... 332 0 days 03:15:00 2 NaN... 41 NaT [3 rows x 8 columns] Ukupni broj stupaca i redaka PPO-a print(res4.shape) # ukupni broj redaka PPO-a print(res4.shape) # ukupni broj stupaca PPO-a ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 27 Pandas objekti podatkovnog indeksiranja Pandas Objekti Podatkovnog Indeksiranja (OPI) – Funkcija.RangeIndex() Indeksacija u rasponu s mogućnosti određivanja koraka print(pd.RangeIndex(0, 6, 2)) Ispis u terminal : RangeIndex(start=0, stop=6, step=2) print(list(pd.RangeIndex(0, 6, 2))) Ispis u terminal : [0, 2, 4] OPI se koristi direktno kao polje indeksa indeksi = pd.RangeIndex(0, 6, 2) print(pd.Series([1,2,3,4,5], index=indeksi)) Ispis u terminal : 0 1 2 2 4 3 – Funkcija.DatetimeIndex() print(list(pd.DatetimeIndex(["1/1/2024 10:00:00+00:00", "2/1/2024 11:00:00+00:00"]))) Ispis u terminal : [Timestamp('2024-01-01 10:00:00+0000', tz='UTC’), Timestamp('2024-02-01 11:00:00+0000', tz='UTC')] ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 28 Pandas objekti podatkovnog indeksiranja – Funkcija.CategoricalIndex() Indeksacija prema definiranim kategorijama ci = pd.CategoricalIndex( ["Osobno","Tesko","Motocikl","Tesko","Osobno",["Motocikl"] ordered=True, categories=["Osobno", "Tesko"]) print(ci.codes) df = pd.DataFrame(data=[1,2,3,1,2,3], columns= ["kod"], index = ci)) Ispis u terminal: Ispis u terminal df : kod [ 0 1 -1 1 0 -1] Osobno 1 Tesko 2 NaN 3 Tesko 1 Osobno 2 NaN 3 – Brisanje redaka s NaN (not-a-null) indeksima kod Osobno 1 Odabir onih koji nisu NaN Tesko 2 df = df[df.index.notnull()] Tesko 1 print(df) Ispis u terminal: Osobno 2 ZITS::Računalstvo u logistici © 2024 Gregurić, Ivanjko 29 Rješenje # inicijalizacija DF-a za 3 skupine podataka cjenik = {'Mjesto ulaza’ :['Pirovac', 'Lucko'], 'Mjesto izlaza':['Rijeka', 'Sibenik'], 'Cijena' :[22.10, 34.90], 'Udaljenost' :[202, 332]} df_cjenik = pd.DataFrame(cjenik) ulazi = {'Vrijeme ulaza':pd.to_datetime(['2024-01-01 00:00:00', '2024-01-01 00:01:00']), 'Registracija' :['ZG-000-AK','ST-001-AK'], 'Mjesto ulaza' :['Lucko', 'Pirovac'], 'Broj putnika' :[1, 4]} df_ulaz = pd.DataFrame(ulazi) izlazi = {'Vrijeme izlaza':pd.to_datetime(['2024-01-01 03:15:00’, '2024-01-01 02:12:00']), 'Registracija' :['ZG-000-AK','ST-001-AK'], 'Mjesto izlaza' :['Sibenik','Rijeka'], 'Broj putnika' :[1, 4]} df_izlazi = pd.DataFrame(izlazi) ZITS::Računalstvo u logistici