Садржај
Припрема
1. Увод у Џупитер (*Jupyter*)
2. Низови података и линијски дијаграми
3. Хистограми и боје
4. Просек и медијана низа бројева
5. Фреквенцијска анализа и секторски дијаграми
6. Табеларно представљени подаци
7. Индексирање и транспоновање табеле
8. Модификације табеле и записивање табеле у датотеку
9. Сортирање, филтрирање и фреквенцијска анализа
10. Џупитер и Ексел

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

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

  1. односу Џупитера и Ексела;

  2. о учитавању података из Ексел датотеке; и

  3. о уписивању података у Ексел датотеку.

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

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

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

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

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

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

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

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

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

../_images/Excel.jpg

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

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

In [1]: import pandas as pd
   ...: aditivi = pd.read_excel("https://petljamediastorage.blob.core.windows.net/root/Media/Default/Kursevi/informatika_VIII/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("https://petljamediastorage.blob.core.windows.net/root/Media/Default/Kursevi/informatika_VIII/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           штетан  може изазвати рак

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

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

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

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

opasni_aditivi.to_excel("opasni_aditivi.xlsx", encoding="utf-8")

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

../_images/opasni_aditivi.jpg

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

opasni_aditivi.to_excel("opasni_aditivi.xlsx", encoding="utf-8", index=False)

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

../_images/opasni_aditivi2.jpg

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

Ево и кратке видео илустрације:

Задаци

За вежбу покрени Џупитер окружење и реши задатке из радне свеске J10.ipynb

(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+