$$ \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.

10. Џупитер и Ексел

У овој лекцији ћемо говорити о:

  1. односу Џупитера и Ексела;
  2. о учитавању података из Ексел датотеке; и
  3. о уписивању података у Ексел датотеку.

10.1. Зашто Џупитер, а зашто Ексел

Мајкрософтов Ексел (Microsoft Excel) представља један од најраспрострањенијих софтверских производа за обраду табеларно представљених података. Ексел своју популарност дугује томе што је табела у коју се уносе подаци "опипљива", она је ту, корисник може само да кликне на поље и да унесе податак или формулу. Природно се намеће питање зашто овај курс није организован око Ексела. Разлога има много, а навешћемо неколико најважнијих.

  • Цена. За разлику од Ексела који је комерцијални производ и који мора да се купи да би могао легално да се користи, Пајтон, све његове библиотеке и Џупитер (као радно окружење за Пајтон) су бесплатни. Свако може без икакве накнаде да инсталира Пајтон и Џупитер и да их користи за личне потребе и за образовне потребе.

  • Обрада података путем јасно видљиве процедуре. У ћелије Ексел табеле се, поред текста и бројева, могу унети и формуле. На тај начин се у Екселу може постићи све о чему смо ми овде писали. Проблем са оваквим приступом настаје када покушавамо да схватимо шта табела у коју је неко већ унео формуле ради и како то она ради. У великим табелама није лако установити која формула зависи од које ћелије и, уопште, којим редом ће се формуле израчунавати. Дакле, лако је поделити са сарадницима Ексел табелу која ће одрадити посао, али није лако поделити са сарадницима процес који та табела имплементира. С друге стране, ако су подаци обрађени употребом неког скрипт-језика као што је Пајтон, из самог програма (и коментара у њему!) се може реконструисати процес обраде података. На тај начин сарадници на пројекту могу да провере процес обраде података и тако лакше уоче евентуалне грешке у процедури обраде података. Осим тога, ако је потребно извршити нови рачун који је сличан постојећем лакше је прилагодити експлицитан код.

  • Флексибилност. Пајтон долази са веома великим бројем библиотека које су развијане за потребе ефикасне обраде великих количина података. Све те библиотеке су доступне из Џупитера. Ако се за коју годину појави нека нова библиотека која нуди нове могућности, можемо је лако и брзо увести у Џупитер и користити. За разлику од Пајтона, нове функционалности Ексела се не дистрибуирају кроз библиотеке функција (које се лако додају систему), већ свака нова функционалност изискује инсталацију нове верзије целог програма.

Обрада података путем јасно наведених кратких програма (који нису део табеле!) представља најфлексибилнији начин обраде података и представља окосницу сваког озбиљног система за обраду података. Зато је важно да се сви сретнемо са програмирањем, чак иако не планирамо сви да будемо програмери!

10.2. Учитавање података из локалних Ексел датотека

Мајкрософтов Ексел (Microsoft Excel) представља један од најраспрострањенијих софтверских производа за обраду табеларно представљених података. Библиотека pandas зато има функцију која може да учита податке представљене Ексел табелом.

Структура Ексел документа је релативно сложена јер у једном документу може да се налази више табела. Један Ексел документ се, зато, састоји из неколико радних листова (енгл. work sheets):

Радни листови

па функцији за учитавање Ексел табеле поред имена датотеке треба дати и име радног листа са кога се учитава табела. Уколико се не наведе име радног листа функција ће учитати табелу из првог радног листа на који наиђе. Ово обично користимо само у ситуацијама када смо сигурни да Ексел радна свеска има само један радни лист.

Сада ћемо из датотеке Aditivi.xlsx која се налази у фолдеру podaci учитати табелу из (јединог) радног листа "Адитиви":

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

Ова датотека садржи податке о адитивима, што су супстанце које се користе у индустрији. Неки од њих се користе и у индустрији хране. (Подаци су преузети из уџбеника биологије за 8. разред.)

Ево првих неколико редова табеле:

In [2]:
aditivi.head(15)
Out[2]:
Адитив (Е-број) Штетност Напомена
0 100 безопасан NaN
1 101 безопасан NaN
2 102 ИЗУЗЕТНО ОПАСАН NaN
3 104 безопасан NaN
4 105 безопасан NaN
5 110 ИЗУЗЕТНО ОПАСАН NaN
6 111 безопасан NaN
7 120 ИЗУЗЕТНО ОПАСАН NaN
8 121 безопасан NaN
9 123 ИЗУЗЕТНО ОПАСАН NaN
10 124 ИЗУЗЕТНО ОПАСАН NaN
11 125 испитивања у току NaN
12 130 безопасан NaN
13 131 штетан може изазвати рак
14 132 безопасан NaN

Видимо да су ћелије које су биле празне у Ексел табели овде добиле специјалну вредност NaN што је скраћеница од not a number (енгл. "није број"). Ово је специјална вредност која се користи да се открију потенцијалне грешке које могу да настану приликом учитавања великих табела. У нашем случају празне ћелије у колони "Напомена" и треба да остану празне, па ћемо табелу учитати поново, с тим да ћемо "замолити Пајтон да искључи вештачку интелигенцију":

In [3]:
aditivi = pd.read_excel("podaci/Aditivi.xlsx", sheet_name="Адитиви", na_filter=False)
aditivi.head(15)
Out[3]:
Адитив (Е-број) Штетност Напомена
0 100 безопасан
1 101 безопасан
2 102 ИЗУЗЕТНО ОПАСАН
3 104 безопасан
4 105 безопасан
5 110 ИЗУЗЕТНО ОПАСАН
6 111 безопасан
7 120 ИЗУЗЕТНО ОПАСАН
8 121 безопасан
9 123 ИЗУЗЕТНО ОПАСАН
10 124 ИЗУЗЕТНО ОПАСАН
11 125 испитивања у току
12 130 безопасан
13 131 штетан може изазвати рак
14 132 безопасан

Аргумент na_filter=False каже функцији read_excel да празне ћелије остану празне и да у њих не уноси вредност NaN.

Направићемо сада фреквенцијску анализу ове табеле на основу штетности адитива.

In [4]:
aditivi["Штетност"].value_counts()
Out[4]:
штетан               33
безопасан            29
испитивања у току    10
ИЗУЗЕТНО ОПАСАН       5
Name: Штетност, dtype: int64

Профилтрираћемо табелу да бисмо излистали адитиве који могу изазвати рак.

In [5]:
aditivi[aditivi.Напомена == "може изазвати рак"]
Out[5]:
Адитив (Е-број) Штетност Напомена
13 131 штетан може изазвати рак
17 142 штетан може изазвати рак
28 210 штетан може изазвати рак
29 211 штетан може изазвати рак
30 213 штетан може изазвати рак
31 214 штетан може изазвати рак
32 215 штетан може изазвати рак
33 216 штетан може изазвати рак
34 217 штетан може изазвати рак
45 239 штетан може изазвати рак
55 330 штетан може изазвати рак

За крај, излистаћемо адитиве који су изузетно опасни или могу изазвати рак. У ту сврху треба да комбинујемо два критеријума:

Напомена == "може изазвати рак"  или  Штетност == "ИЗУЗЕТНО ОПАСАН"

Логички везник "или" се у библиотеци pandas означава симболом |. Према томе, податке добијамо тако што табели проследимо следећи захтев за филтрирање:

In [6]:
aditivi[(aditivi.Напомена == "може изазвати рак") | (aditivi.Штетност == "ИЗУЗЕТНО ОПАСАН")]
Out[6]:
Адитив (Е-број) Штетност Напомена
2 102 ИЗУЗЕТНО ОПАСАН
5 110 ИЗУЗЕТНО ОПАСАН
7 120 ИЗУЗЕТНО ОПАСАН
9 123 ИЗУЗЕТНО ОПАСАН
10 124 ИЗУЗЕТНО ОПАСАН
13 131 штетан може изазвати рак
17 142 штетан може изазвати рак
28 210 штетан може изазвати рак
29 211 штетан може изазвати рак
30 213 штетан може изазвати рак
31 214 штетан може изазвати рак
32 215 штетан може изазвати рак
33 216 штетан може изазвати рак
34 217 штетан може изазвати рак
45 239 штетан може изазвати рак
55 330 штетан може изазвати рак

10.3. Уписивање табеле у Ексел датотеку

Било коју табелу можемо да упишемо и у Ексел датотеку као што смо их уписивали у CSV датотеке. Потребно је само позвати функцију to_excel и проследити јој име датотеке. На пример, ако је opasni_aditivi табела која садржи списак опасних адитива:

In [7]:
opasni_aditivi = aditivi[(aditivi.Напомена == "може изазвати рак") | (aditivi.Штетност == "ИЗУЗЕТНО ОПАСАН")]

њу можемо уписати у Ексел датотеку овако:

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

Аргумент encoding="utf-8" морамо да проследимо функцији зато што у табели имамо податке који су записани ћирилицом, као што је био случај код писања у CSV датотеке. Ако сада отворимо ову датотеку из Ексела добићемо овакав изглед:

Ексел фајл

Видимо да је Пајтон уписао и индексну колону што нам у овом случају не одговара. Као и код уписивања у CSV датотеке можемо рећи Пајтону да у датотеку не уписује индексну колону тако што ћемо навести још и аргумент index=False:

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

Ако сада нову датотеку учитамо из Ексела добијамо

Ексел фајл

За крај треба још мало проширити колоне у Ексел табели да би се улепшао њен изглед -- и готово!.

10.4. Задаци

Задатке реши у Џупитеру.

Задатак 1. Погледај пажљиво наредбе у следећој ћелији, па одговори на питања:

In [ ]:
import pandas as pd
aditivi = pd.read_excel("podaci/Aditivi.xlsx", sheet_name="Адитиви", na_filter=False)
  1. Шта ће урадити функција read_excel ако се уклони аргумент sheet_name="Адитиви" (знамо да табела има само један радни лист)?
  2. Шта значи аргумент na_filter=False функције read_excel?

Задатак 2. У табели podaci/SO2.xlsx налазе се резултати мерења концентрације сумпор-диоксида у 2017. години у неким градовима Србије. Табела има четири колоне:

  • МернаСтаница = Мерна станица
  • СГВ = Средња годишња вредност у микрограмима по кубном метру
  • БД125 = Број дана са више од 125 микрограма по кубном метру
  • МДВ = Максимална дневна вредност у микрограмима по кубном метру

(а) Учитај ову табелу у структуру података DataFrame.

(б) Сортирај подаке по колони МДВ и прикажи вредности у овој колони хистограмом.

(в) Издвој из табеле оне редове код којих је вредност у колони БД125 већа од 0 и тако добијену табелу упиши у нову датотеку podaci/SO2-VisokeVrednosti.xlsx водећи рачуна о томе да табела садржи слова специфична за српски језик.

Задатак 3. У табели podaci/Razred.xlsx налазе се оцене ученика једног разреда из информатике. Подаци су реални, па су зато анонимизирани (имена ученика су Učenik 1, Učenik 2, итд). Табела има заглавље, а текст је унет латиничним писмом.

(а) Учитај ову табелу у структуру података DataFrame и прикажи првих неколико редова да разумеш структуру табеле.

(Колоне означене са "K" представљају оцене из контролног задатка, колоне означене са "P" представљају оцену из писменог задатка (ово је латинично слово П), колоне означене са "U" представљају оцену из усмене провере, а колона "D" оцену из домаћих задатака.)

(б) Индексирај табелу колоном "Ime".

(в) Израчунај и испиши просечну оцену на сваком од три писмена задатка (колоне "P1", "P2" и "P3").

(г) Додај табели нову колону "Prosek" и онда за сваког ученика израчунај просек оцена и упиши добијену вредност у ову колону табеле.

(д) Додај табели нову колону "Ocena" и онда за сваког ученика израчунај закључну оцену на основу просека, и упиши ту оцену у ову колону табеле. Следећа функција ти може бити корисна:

In [ ]:
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

(д) Добијену табелу упиши у нову датотеку podaci/Razred-Ocene.xlsx водећи рачуна о томе да табела садржи слова специфична за српски језик.

Задатак 4. Eurostat је званична организација Европске уније која се бави статистичким анализама од значаја за рад и развој уније. Сви подаци које Eurostat прикупи и обради су јавно доступни на линку https://ec.europa.eu/eurostat/data/database

У датотеци podaci/EUProjPop.xlsx се налазе подаци о очекиваном броју становника ЕУ до 2080. године. Ова табела има два радна листа: Baseline на коме се налазе подаци о очекиваном броју становника, и Migration на коме се налазе подаци о очекиваном броју становника у случају повећаног броја миграната у земље Европске уније.

(а) Учитај ове две табеле у две структуре података DataFrame и за сваку прикажи првих неколико редова да разумеш структуру табела.

(б) Обема табелама додај нову врсту "EU", па за сваку табелу израчунај и у ту врсту упиши укупан очекивани број становника ЕУ за сваку од наведених година.

(в) Табели која је настала учитавањем радног листа Migration додај нову врсту "Migration" па у њу упиши очекивани прираштај броја становника у ЕУ услед миграције по годинама (то је разлика податка у врсти "EU" табеле "Migration" и одговарајућег податка у врсти "EU" табеле "Baseline").

(г) Прикажи линијским дијаграмом очекивани прираштај броја становника у ЕУ услед миграције по годинама.

(д) Табели која је настала учитавањем радног листа Baseline додај нову врсту "EU-UK", па израчунај и у ту врсту упиши укупан очекивани број станвника ЕУ за сваку од наведених година без становника Велике Британије.

(ђ) Табелу добијену на овај начин упиши у датотеку podaci/EU-UK.xlsx

Задатак 5. У табели podaci/Cricket.xlsx се налазе подаци о најбољим играчима крикета. Ова табела има заглавље.

(а) Учитај ову табелу у структуру података DataFrame и испиши првих неколико редова табеле да видиш како изгледа. Индексирај табелу колоном "Player".

(б) Додај табели нову колону "YP" (Years Played) и у њу упиши колико година је сваки играч био активан. (За сваког играча од године у колони "To" одузети годину у колони "From").

(в) Додај табели нову колону "ARY" (Average Runs per Year) и у њу упиши количник бројева из колоне "Runs" и "YP". (ARY = Runs / YP).

(г) Сортирај табелу по колони "ARY" од највећих ка најмањим вредностима и прикажи првих 25 редова табеле. У ком веку су били активни скоро сви од ових 25 играча? Шта мислиш зашто?