$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

LJ10

10. Džupajter i Eksel

U ovoj lekciji ćemo govoriti o:

  1. odnosu Džupajtera i Eksela;
  2. o učitavanju podataka iz Eksel datoteke; i
  3. o upisivanju podataka u Eksel datoteku.

10.1. Zašto Džupajter, a zašto Eksel

Majkrosoftov Eksel (Microsoft Excel) predstavlja jedan od najrasprostranjenijih softverskih proizvoda za obradu tabelarno predstavljenih podataka. Eksel svoju popularnost duguje tome što je tabela u koju se unose podaci "opipljiva", ona je tu, korisnik može samo da klikne na polje i da unese podatak ili formulu. Prirodno se nameće pitanje zašto ovaj kurs nije organizovan oko Eksela. Razloga ima mnogo, a navešćemo nekoliko najvažnijih.

  • Cena. Za razliku od Eksela koji je komercijalni proizvod i koji mora da se kupi da bi mogao legalno da se koristi, Pajton, sve njegove biblioteke i Džupajter (kao radno okruženje za Pajton) su besplatni. Svako može bez ikakve naknade da instalira Pajton i Džupajter i da ih koristi za lične potrebe i za obrazovne potrebe.

  • Obrada podataka putem jasno vidljive procedure. U ćelije Eksel tabele se, pored teksta i brojeva, mogu uneti i formule. Na taj način se u Ekselu može postići sve o čemu smo mi ovde pisali. Problem sa ovakvim pristupom nastaje kada pokušavamo da shvatimo šta tabela u koju je neko već uneo formule radi i kako to ona radi. U velikim tabelama nije lako ustanoviti koja formula zavisi od koje ćelije i, uopšte, kojim redom će se formule izračunavati. Dakle, lako je podeliti sa saradnicima Eksel tabelu koja će odraditi posao, ali nije lako podeliti sa saradnicima proces koji ta tabela implementira. S druge strane, ako su podaci obrađeni upotrebom nekog skript-jezika kao što je Pajton, iz samog programa (i komentara u njemu!) se može rekonstruisati proces obrade podataka. Na taj način saradnici na projektu mogu da provere proces obrade podataka i tako lakše uoče eventualne greške u proceduri obrade podataka. Osim toga, ako je potrebno izvršiti novi račun koji je sličan postojećem lakše je prilagoditi eksplicitan kod.

  • Fleksibilnost. Pajton dolazi sa veoma velikim brojem biblioteka koje su razvijane za potrebe efikasne obrade velikih količina podataka. Sve te biblioteke su dostupne iz Džupajtera. Ako se za koju godinu pojavi neka nova biblioteka koja nudi nove mogućnosti, možemo je lako i brzo uvesti u Džupajter i koristiti. Za razliku od Pajtona, nove funkcionalnosti Eksela se ne distribuiraju kroz biblioteke funkcija (koje se lako dodaju sistemu), već svaka nova funkcionalnost iziskuje instalaciju nove verzije celog programa.

Obrada podataka putem jasno navedenih kratkih programa (koji nisu deo tabele!) predstavlja najfleksibilniji način obrade podataka i predstavlja okosnicu svakog ozbiljnog sistema za obradu podataka. Zato je važno da se svi sretnemo sa programiranjem, čak iako ne planiramo svi da budemo programeri!

10.2. Učitavanje podataka iz lokalnih Eksel datoteka

Majkrosoftov Eksel (Microsoft Excel) predstavlja jedan od najrasprostranjenijih softverskih proizvoda za obradu tabelarno predstavljenih podataka. Biblioteka pandas zato ima funkciju koja može da učita podatke predstavljene Eksel tabelom.

Struktura Eksel dokumenta je relativno složena jer u jednom dokumentu može da se nalazi više tabela. Jedan Eksel dokument se, zato, sastoji iz nekoliko radnih listova (engl. work sheets):

Radni listovi

pa funkciji za učitavanje Eksel tabele pored imena datoteke treba dati i ime radnog lista sa koga se učitava tabela. Ukoliko se ne navede ime radnog lista funkcija će učitati tabelu iz prvog radnog lista na koji naiđe. Ovo obično koristimo samo u situacijama kada smo sigurni da Eksel radna sveska ima samo jedan radni list.

Sada ćemo iz datoteke Aditivi.xlsx koja se nalazi u folderu podaci učitati tabelu iz (jedinog) radnog lista "Aditivi":

In [1]:
import pandas as pd
aditivi = pd.read_excel("podaci/Aditivi.xlsx", sheet_name="Aditivi")

Ova datoteka sadrži podatke o aditivima, što su supstance koje se koriste u industriji. Neki od njih se koriste i u industriji hrane. (Podaci su preuzeti iz udžbenika biologije za 8. razred.)

Evo prvih nekoliko redova tabele:

In [2]:
aditivi.head(15)
Out[2]:
Aditiv (E-broj) Štetnost Napomena
0 100 bezopasan NaN
1 101 bezopasan NaN
2 102 IZUZETNO OPASAN NaN
3 104 bezopasan NaN
4 105 bezopasan NaN
5 110 IZUZETNO OPASAN NaN
6 111 bezopasan NaN
7 120 IZUZETNO OPASAN NaN
8 121 bezopasan NaN
9 123 IZUZETNO OPASAN NaN
10 124 IZUZETNO OPASAN NaN
11 125 ispitivanja u toku NaN
12 130 bezopasan NaN
13 131 štetan može izazvati rak
14 132 bezopasan NaN

Vidimo da su ćelije koje su bile prazne u Eksel tabeli ovde dobile specijalnu vrednost NaN što je skraćenica od not a number (engl. "nije broj"). Ovo je specijalna vrednost koja se koristi da se otkriju potencijalne greške koje mogu da nastanu prilikom učitavanja velikih tabela. U našem slučaju prazne ćelije u koloni "Napomena" i treba da ostanu prazne, pa ćemo tabelu učitati ponovo, s tim da ćemo "zamoliti Pajton da isključi veštačku inteligenciju":

In [3]:
aditivi = pd.read_excel("podaci/Aditivi.xlsx", sheet_name="Aditivi", na_filter=False)
aditivi.head(15)
Out[3]:
Aditiv (E-broj) Štetnost Napomena
0 100 bezopasan
1 101 bezopasan
2 102 IZUZETNO OPASAN
3 104 bezopasan
4 105 bezopasan
5 110 IZUZETNO OPASAN
6 111 bezopasan
7 120 IZUZETNO OPASAN
8 121 bezopasan
9 123 IZUZETNO OPASAN
10 124 IZUZETNO OPASAN
11 125 ispitivanja u toku
12 130 bezopasan
13 131 štetan može izazvati rak
14 132 bezopasan

Argument na_filter=False kaže funkciji read_excel da prazne ćelije ostanu prazne i da u njih ne unosi vrednost NaN.

Napravićemo sada frekvencijsku analizu ove tabele na osnovu štetnosti aditiva.

In [4]:
aditivi["Štetnost"].value_counts()
Out[4]:
štetan                33
bezopasan             29
ispitivanja u toku    10
IZUZETNO OPASAN        5
Name: Štetnost, dtype: int64

Profiltriraćemo tabelu da bismo izlistali aditive koji mogu izazvati rak.

In [5]:
aditivi[aditivi.Napomena == "može izazvati rak"]
Out[5]:
Aditiv (E-broj) Štetnost Napomena
13 131 štetan može izazvati rak
17 142 štetan može izazvati rak
28 210 štetan može izazvati rak
29 211 štetan može izazvati rak
30 213 štetan može izazvati rak
31 214 štetan može izazvati rak
32 215 štetan može izazvati rak
33 216 štetan može izazvati rak
34 217 štetan može izazvati rak
45 239 štetan može izazvati rak
55 330 štetan može izazvati rak

Za kraj, izlistaćemo aditive koji su izuzetno opasni ili mogu izazvati rak. U tu svrhu treba da kombinujemo dva kriterijuma:

Napomena == "može izazvati rak"  ili  Štetnost == "IZUZETNO OPASAN"

Logički veznik "ili" se u biblioteci pandas označava simbolom |. Prema tome, podatke dobijamo tako što tabeli prosledimo sledeći zahtev za filtriranje:

In [6]:
aditivi[(aditivi.Napomena == "može izazvati rak") | (aditivi.Štetnost == "IZUZETNO OPASAN")]
Out[6]:
Aditiv (E-broj) Štetnost Napomena
2 102 IZUZETNO OPASAN
5 110 IZUZETNO OPASAN
7 120 IZUZETNO OPASAN
9 123 IZUZETNO OPASAN
10 124 IZUZETNO OPASAN
13 131 štetan može izazvati rak
17 142 štetan može izazvati rak
28 210 štetan može izazvati rak
29 211 štetan može izazvati rak
30 213 štetan može izazvati rak
31 214 štetan može izazvati rak
32 215 štetan može izazvati rak
33 216 štetan može izazvati rak
34 217 štetan može izazvati rak
45 239 štetan može izazvati rak
55 330 štetan može izazvati rak

10.3. Upisivanje tabele u Eksel datoteku

Bilo koju tabelu možemo da upišemo i u Eksel datoteku kao što smo ih upisivali u CSV datoteke. Potrebno se samo pozvati funkciju to_excel i proslediti joj ime datoteke. Na primer, ako je opasni_aditivi tabela koja sadrži spisak opasnih aditiva:

In [7]:
opasni_aditivi = aditivi[(aditivi.Napomena == "može izazvati rak") | (aditivi.Štetnost == "IZUZETNO OPASAN")]

nju možemo upisati u Eksel datoteku ovako:

In [8]:
opasni_aditivi.to_excel("podaci/opasni_aditivi.xlsx", encoding="utf-8")

Argument encoding="utf-8" moramo da prosledimo funkciji zato što u tabeli imamo podatke koji su zapisani ćirilicom, kao što je bio slučaj kod pisanja u CSV datoteke. Ako sada otvorimo ovu datoteku iz Eksela dobićemo ovakav izgled:

Eksel fajl

Vidimo da je Pajton upisao i indeksnu kolonu što nam u ovom slučaju ne odgovara. Kao i kod upisivanja u CSV datoteke možemo reći Pajtonu da u datoteku ne upisuje indeksnu kolonu tako što ćemo navesti još i argument index=False:

In [9]:
opasni_aditivi.to_excel("podaci/opasni_aditivi.xlsx", encoding="utf-8", index=False)

Ako sada novu datoteku učitamo iz Eksela dobijamo

Eksel fajl

Za kraj treba još malo proširiti kolone u Eksel tabeli da bi se ulepšao njen izgled -- i gotovo!.

10.4. Zadaci

Zadatke reši u Džupajteru.

Zadatak 1. Pogledaj pažljivo naredbe u sledećoj ćeliji, pa odgovori na pitanja:

In [10]:
import pandas as pd
aditivi = pd.read_excel("podaci/Aditivi.xlsx", sheet_name="Aditivi", na_filter=False)
  1. Šta će uraditi funkcija read_excel ako se ukloni argument sheet_name="Aditivi" (znamo da tabela ima samo jedan radni list)?
  2. Šta znači argument na_filter=False funkcije read_excel?

Zadatak 2. U tabeli podaci/SO2.xlsx nalaze se rezultati merenja koncentracije sumpor-dioksida u 2017. godini u nekim gradovima Srbije. Tabela ima četiri kolone:

  • MernaStanica = Merna stanica
  • SGV = Srednja godišnja vrednost u mikrogramima po kubnom metru
  • BD125 = Broj dana sa više od 125 mikrograma po kubnom metru
  • MDV = Maksimalna dnevna vrednost u mikrogramima po kubnom metru

(a) Učitaj ovu tabelu u strukturu podataka DataFrame.

(b) Sortiraj podake po koloni MDV i prikaži vrednosti u ovoj koloni histogramom.

(v) Izdvoj iz tabele one redove kod kojih je vrednost u koloni BD125 veća od 0 i tako dobijenu tabelu upiši u novu datoteku podaci/SO2-VisokeVrednosti.xlsx vodeći računa o tome da tabela sadrži slova specifična za srpski jezik.

Zadatak 3. U tabeli podaci/Razred.xlsx nalaze se ocene učenika jednog razreda iz informatike. Podaci su realni, pa su zato anonimizirani (imena učenika su Učenik 1, Učenik 2, itd). Tabela ima zaglavlje, a tekst je unet latiničnim pismom.

(a) Učitaj ovu tabelu u strukturu podataka DataFrame i prikaži prvih nekoliko redova da razumeš strukturu tabele.

(Kolone označene sa "K" predstavljaju ocene iz kontrolnog zadatka, kolone označene sa "P" predstavljaju ocenu iz pismenog zadatka (ovo je latinično slovo P), kolone označene sa "U" predstavljaju ocenu iz usmene provere, a kolona "D" ocenu iz domaćih zadataka.)

(b) Indeksiraj tabelu kolonom "Ime".

(v) Izračunaj i ispiši prosečnu ocenu na svakom od tri pismena zadatka (kolone "P1", "P2" i "P3").

(g) Dodaj tabeli novu kolonu "Prosek" i onda za svakog učenika izračunaj prosek ocena i upiši dobijenu vrednost u ovu kolonu tabele.

(d) Dodaj tabeli novu kolonu "Ocena" i onda za svakog učenika izračunaj zaključnu ocenu na osnovu proseka, i upiši tu ocenu u ovu kolonu tabele. Sledeća funkcija ti može biti korisna:

In [11]:
def zaklj_ocena(prosek):
    if prosek >= 4.50:
        return 5
    elif prosek >= 3.50:
        return 4
    elif prosek >= 2.50:
        return 3
    elif prosek >= 1.50:
        return 2
    else:
        return 1

(d) Dobijenu tabelu upiši u novu datoteku podaci/Razred-Ocene.xlsx vodeći računa o tome da tabela sadrži slova specifična za srpski jezik.

Zadatak 4. Eurostat je zvanična organizacija Evropske unije koja se bavi statističkim analizama od značaja za rad i razvoj unije. Svi podaci koje Eurostat prikupi i obradi su javno dostupni na linku https://ec.europa.eu/eurostat/data/database

U datoteci podaci/EUProjPop.xlsx se nalaze podaci o očekivanom broju stanovnika EU do 2080. godine. Ova tabela ima dva radna lista: Baseline na kome se nalaze podaci o očekivanom broju stanovnika, i Migration na kome se nalaze podaci o očekivanom broju stanovnika u slučaju povećanog broja migranata u zemlje Evropske unije.

(a) Učitaj ove dve tabele u dve strukture podataka DataFrame i za svaku prikaži prvih nekoliko redova da razumeš strukturu tabela.

(b) Obema tabelama dodaj novu vrstu "EU", pa za svaku tabelu izračunaj i u tu vrstu upiši ukupan očekivani broj stanovnika EU za svaku od navedenih godina.

(v) Tabeli koja je nastala učitavanjem radnog lista Migration dodaj novu vrstu "Migration" pa u nju upiši očekivani priraštaj broja stanovnika u EU usled migracije po godinama (to je razlika podatka u vrsti "EU" tabele "Migration" i odgovarajućeg podatka u vrsti "EU" tabele "Baseline").

(g) Prikaži linijskim dijagramom očekivani priraštaj broja stanovnika u EU usled migracije po godinama.

(d) Tabeli koja je nastala učitavanjem radnog lista Baseline dodaj novu vrstu "EU-UK", pa izračunaj i u tu vrstu upiši ukupan očekivani broj stanvnika EU za svaku od navedenih godina bez stanovnika Velike Britanije.

(đ) Tabelu dobijenu na ovaj način upiši u datoteku podaci/EU-UK.xlsx

Zadatak 5. U tabeli podaci/Cricket.xlsx se nalaze podaci o najboljim igračima kriketa. Ova tabela ima zaglavlje.

(a) Učitaj ovu tabelu u strukturu podataka DataFrame i ispiši prvih nekoliko redova tabele da vidiš kako izgleda. Indeksiraj tabelu kolonom "Player".

(b) Dodaj tabeli novu kolonu "YP" (Years Played) i u nju upiši koliko godina je svaki igrač bio aktivan. (Za svakog igrača od godine u koloni "To" oduzeti godinu u koloni "From").

(v) Dodaj tabeli novu kolonu "ARY" (Average Runs per Year) i u nju upiši količnik brojeva iz kolone "Runs" i "YP". (ARY = Runs / YP).

(g) Sortiraj tabelu po koloni "ARY" od najvećih ka najmanjim vrednostima i prikaži prvih 25 redova tabele. U kom veku su bili aktivni skoro svi od ovih 25 igrača? Šta misliš zašto?

© 2019 Petlja.org Creative Commons License