15. час: Џупајтер и Ексел¶
На овом часу ћемо говорити о:
- односу Џупајтера и Ексела;
- о учитавању података из Ексел датотеке; и
- о уписивању података у Ексел датотеку.
15.1. Зашто Џупајтер, а зашто Ексел¶
Мајкрософтов Ексел (Microsoft Excel) представља један од најраспрострањенијих софтверских производа за обраду табеларно представљених података. Ексел своју популарност дугује томе што је табела у коју се уносе подаци "опипљива", она је ту, корисник може само да кликне на поље и да унесе податак или формулу. Природно се намеће питање зашто овај курс није организован око Ексела. Разлога има много, а навешћемо неколико најважнијих.
Цена. За разлику од Ексела који је комерцијални производ и који мора да се купи да би могао легално да се користи, Пајтон, све његове библиотеке и Џупајтер (као радно окружење за Пајтон) су бесплатни. Свако може без икакве накнаде да инсталира Пајтон и Џупајтер и да их користи за личне потребе и за образовне потребе.
Обрада података путем јасно видљиве процедуре. У ћелије Ексел табеле се, поред текста и бројева, могу унети и формуле. На тај начин се у Екселу може постићи све о чему смо ми овде писали. Проблем са оваквим приступом настаје када покушавамо да схватимо шта табела у коју је неко већ унео формуле ради и како то она ради. У великим табелама није лако установити која формула зависи од које ћелије и, уопште, којим редом ће се формуле израчунавати. Дакле, лако је поделити са сарадницима Ексел табелу која ће одрадити посао, али није лако поделити са сарадницима процес који та табела имплементира. С друге стране, ако су подаци обрађени употребом неког скрипт-језика као што је Пајтон, из самог програма (и коментара у њему!) се може реконструисати процес обраде података. На тај начин сарадници на пројекту могу да провере процес обраде података и тако лакше уоче евентуалне грешке у процедури обраде података. Осим тога, ако је потребно извршити нови рачун који је сличан постојећем лакше је прилагодити експлицитан код.
Флексибилност. Пајтон долази са веома великим бројем библиотека које су развијане за потребе ефикасне обраде великих количина података. Све те библиотеке су доступне из Џупајтера. Ако се за коју годину појави нека нова библиотека која нуди нове могућности, можемо је лако и брзо увести у Џупајтер и користити. За разлику од Пајтона, нове функционалности Ексела се не дистрибуирају кроз библиотеке функција (које се лако додају систему), већ свака нова функционалност изискује инсталацију нове верзије целог програма.
Континуитет. Слично Џупајтеру, Ексел подржава писање мањих програмских фрагмената, али у програмском језику Visual Basic for Applications. С друге стране, Пајтон смо већ учили претходне две године. Док би увођење у Visual Basic for Applications трајало дуже и тиме би се изгубило на континуитету, окружење засновано на Пајтону као што је Џупајтер омогућује да се одмах постави фокус на обраду и визуелизацију података.
Обрада података путем јасно наведених кратких програма (који нису део табеле!) представља најфлексибилнији начин обраде података и представља окосницу сваког озбиљног система за обраду података. Зато је важно да се сви у школи сретнемо са програмирањем, чак иако не планирамо сви да будемо програмери!
15.2. Учитавање података из локалних Ексел датотека¶
Мајкрософтов Ексел (Microsoft Excel) представља један од најраспрострањенијих софтверских производа за обраду табеларно представљених података. Библиотека pandas зато има функцију која може да учита податке представљене Ексел табелом.
Структура Ексел документа је релативно сложена јер у једном документу може да се налази више табела. Један Ексел документ се, зато, састоји из неколико радних листова (енгл. work sheets):
па функцији за учитавање Ексел табеле поред имена датотеке треба дати и име радног листа са кога се учитава табела. Уколико се не наведе име радног листа функција ће учитати табелу из првог радног листа на који наиђе. Ово обично користимо само у ситуацијама када смо сигурни да Ексел радна свеска има само један радни лист.
Сада ћемо из датотеке Aditivi.xlsx која се налази у фолдеру podaci учитати табелу из (јединог) радног листа "Адитиви":
import pandas as pd
aditivi = pd.read_excel("podaci/Aditivi.xlsx", sheet_name="Адитиви")
Ова датотека садржи податке о адитивима, што су супстанце које се користе у индустрији. Неки од њих се користе и у индустрији хране. (Подаци су преузети из уџбеника биологије за 8. разред.)
Ево првих неколико редова табеле:
aditivi.head(15)
Видимо да су ћелије које су биле празне у Ексел табели овде добиле специјалну вредност NaN што је скраћеница од not a number (енгл. "није број"). Ово је специјална вредност која се користи да се открију потенцијалне грешке које могу да настану приликом учитавања великих табела. У нашем случају празне ћелије у колони "Напомена" и треба да остану празне, па ћемо табелу учитати поново, с тим да ћемо "замолити Пајтон да искључи вештачку интелигенцију":
aditivi = pd.read_excel("podaci/Aditivi.xlsx", sheet_name="Адитиви", na_filter=False)
aditivi.head(15)
Аргумент na_filter=False
каже функцији read_excel
да празне ћелије остану празне и да у њих не уноси вредност NaN.
Направићемо сада фреквенцијску анализу ове табеле на основу штетности адитива.
aditivi["Штетност"].value_counts()
Профилтрираћемо табелу да бисмо излистали адитиве који могу изазвати рак.
aditivi[aditivi.Напомена == "може изазвати рак"]
За крај, излистаћемо адитиве који су изузетно опасни или могу изазвати рак. У ту сврху треба да комбинујемо два критеријума:
Напомена == "може изазвати рак" или Штетност == "ИЗУЗЕТНО ОПАСАН"
Логички везник "или" сеу библиотеци pandas
означава симболом |
. Према томе, податке добијамо тако што табели проследимо следећи захтев за филтрирање:
aditivi[(aditivi.Напомена == "може изазвати рак") | (aditivi.Штетност == "ИЗУЗЕТНО ОПАСАН")]
15.3. Уписивање табеле у Ексел датотеку¶
Било коју табелу можемо да упишемо и у Ексел датотеку као што смо их уписивали у CSV датотеке. Потребно се само позвати функцију to_excel
и проследити јој име датотеке. На пример, ако је opasni_aditivi
табела која садржи списак опасних адитива:
opasni_aditivi = aditivi[(aditivi.Напомена == "може изазвати рак") | (aditivi.Штетност == "ИЗУЗЕТНО ОПАСАН")]
њу можемо уписати у Ексел датотеку овако:
opasni_aditivi.to_excel("podaci/opasni_aditivi.xlsx", encoding="utf-8")
Аргумент encoding="utf-8"
морамо да проследимо функцији зато што у табели имамо податке који су записани ћирилицом, као што је био случај код писања у CSV датотеке. Ако сада отворимо ову датотеку из Ексела добићемо овакав изглед:
Видимо да је Пајтон уписао и индексну колону што нам у овом случају не одговара. Као и код уписивања у CSV датотеке можемо рећи Пајтону да у датотеку не уписује индексну колону тако што ћемо навести још и аргумент index=False
:
opasni_aditivi.to_excel("podaci/opasni_aditivi.xlsx", encoding="utf-8", index=False)
Ако сада нову датотеку учитамо из Ексела добијамо
За крај треба још мало проширити колоне у Ексел табели да би се улепшао њен изглед -- и готово!.
15.4. Задаци¶
Задатке реши у Џупајтеру.
Задатак 1. У табели podaci/SO2.xlsx
налазе се резултати мерења концентрације сумпор-диоксида у 2017. години у неким градовима Србије. Табела има четири колоне:
- МернаСтаница = Мерна станица
- СГВ = Средња годишња вредност у микрограмима по кубном метру
- БД125 = Број дана са више од 125 микрограма по кубном метру
- МДВ = Максимална дневна вредност у микрограмима по кубном метру
(а) Учитај ову табелу у структуру података DataFrame.
(б) Сортирај подаке по колони МДВ и прикажи вредности у овој колони линијским дијаграмом.
(в) Издвој из табеле оне редове код којих је вредност у колони БД125 већа од 0 и тако добијену табелу упиши у нову датотеку podaci/SO2-VisokeVrednosti.xlsx водећи рачуна о томе да табела садржи слова специфична за српски језик.
Задатак 2. У табели podaci/Razred.xlsx
налазе се оцене ученика једног разреда из информатике. Подаци су реални, па су зато анонимизирани (имена ученика су Učenik 1, Učenik 2, итд). Табела има заглавље, а текст је унет латиничним писмом.
(а) Учитај ову табелу у структуру података DataFrame и прикажи првих неколико редова да разумеш структуру табеле.
(Колоне означене са "K" представљају оцене из контролног задатка, колоне означене са "P" представљају оцену из писменог задатка (ово је латинично слово П), колоне означене са "U" представљају оцену из усмене провере, а колона "D" оцену из домаћих задатака.)
(б) Индексирај табелу колоном "Ime".
(в) Израчунај и испиши просечну оцену на сваком од три писмена задатка (колоне "P1", "P2" и "P3").
(г) Додај табели нову колону "Prosek" и онда за сваког ученика израчунај просек оцена и упиши добијену вредност у ову колону табеле.
(д) Додај табели нову колону "Ocena" и онда за сваког ученика израчунај закључну оцену на основу просека, и упиши ту оцену у ову колону табеле. Следећа функција ти може бити корисна:
# изврши ову ћелију
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 водећи рачуна о томе да табела садржи слова специфична за српски језик.
Задатак 3. Eurostat је званична организација Европске уније која се бави статистичким анализама од значаја за рад и развој уније. Сви подаци које Eurostat прикупи и обради су јавно доступни на линку https://ec.europa.eu/eurostat/data/database
У датотеци podaci/EUProjPop.xlsx се налазе подаци о очекиваном броју становника ЕУ до 2080. године. Ова табела има два радна листа: Baseline на коме се налазе подаци о очекиваном броју становника, и Migration на коме се налазе подаци о очекиваном броју становника у случају повећаног броја миграната у земље Европске уније.
(а) Учитај ове две табеле у две структуре података DataFrame и за сваку прикажи првих неколико редова да разумеш структуру табела.
(б) Обема табелама додај нову врсту "EU", па за сваку табелу израчунај и у ту врсту упиши укупан очекивани број становника ЕУ за сваку од наведених година.
(в) Табели која је настала учитавањем радног листа Migration додај нову врсту "Migration" па у њу упиши очекивани прираштај броја становника у ЕУ услед миграције по годинама (то је разлика податка у врсти "EU" табеле "Migration" и одговарајућег податка у врсти "EU" табеле "Baseline").
(г) Прикажи линијским дијаграмом очекивани прираштај броја становника у ЕУ услед миграције по годинама.