Садржај
Елементи програмирања
Рад са низовима података

Основе обраде и приказа табеларних података

Обраду, анализу и графички приказ података је тешко раздвојити. Све то углавном иде паралелно. У Пајтону постоји неколико најчешће коришћених библиотека које су усаглашене тако да објекти које користимо за обраду података имају функције за цртање, а функције за цртање враћају табеле и серије. Зато је то овде једна лекција.

Обрада табеларних података

Много тога за шта су нам потребни програмерско знање и труд при обради података у листама, постаје једноставна примена готових функција када податке спакујемо у DataFrame. На тај начин нам библиотека pandas омогућава да рад са табелама буде једноставан, брз и ефикасан.

Препоручујемо да примере из ове лекције покренеш на свом рачунару тако што ћеш у пакету фајлова за вежбу покренути Џупитер свеску 06_obrada_prikaz.ipynb, или тако што ћеш отићи на овај линк и тамо радити задатке. За детаљније инструкције погледај поглавље Фајлови за вежбу и коришћење Џупитер окружења.

Учитавање табеле из датотеке

Податке најчешће чувамо у табелама. Чак су и базе података само колекције различитих табела. За поновну употребу табеле снимамо у датотеке (или фајлове, како их понекад зовемо). Те снимљене табеле касније учитавамо по потреби. Уобичајени формат датотека за снимање табела је CSV (енгл. comma separated value, тј. вредности одвојене зарезом). Библиотека pandas има функције за учитавање и снимање табела. За учитавање користимо функцију pd.read_csv(). Aргумент ове функције је стринг са локацијом и називом датотеке, нпр. “data/preostala-mesta-skole.csv”.

Ова датотека се не налази у Пајтоновом радном директоријуму већ у поддиректоријуму data, због чега је потребно да то напишемо и да назив директоријума и датотеке раздвојимо косом цртом. Учитаћемо сада баш ту датотеку. У њој се налази листа средњих школа у Србији где је наведено колико је било слободних места за упис после првог круга уписа 2022. године.

import pandas as pd                # prvo uvozimo pandas biblioteku
import matplotlib.pyplot as plt    # i biblioteku za crtanje grafika
dt = pd.read_csv('data/preostala-mesta-skole.csv')

При позивању функција из одређене библиотеке потребно је да наведемо ознаке библиотека. Зато није довољно да напишемо read_csv() већ морамо pd.read_csv(). При увожењу библиотека ми смо нагласили да ћемо користити скраћена имена уместо пуних. Користићемо pd уместо pandas и plt уместо matplotlib.pyplot што ће нам олакшати писање кôда.

Садржај датотеке смо учитали и сместили у табелу (тачније променљиву типа dataframe) dt. Да бисмо видели шта је учитано, згодно је да прикажемо на екрану заглавље те табеле са првих неколико редова. За то нам служи функција .head().

dt.head()
Општина Школа Мин. бодова Укупно места Преостало места
0 Ада Техничка школа, Ада 39.37 150 78
1 Александровац Средња школа "Свети Трифун" са домом ученика, ... 42.77 90 48
2 Алексинац Алексиначка гимназија, Алексинац 63.19 90 29
3 Алексинац Биотехнолошка школа "Шуматовац", Алексинац 40.76 60 25
4 Алексинац Техничка школа "Прота Стеван Димитријевић", Ал... 50.16 30 1

Видимо да су у табели називи школа дати по врстама, а да по колонама имамо основне податке о упису у тим државама. У колони Општина је име општине у којој се налази школа, Школа означава назив школе са именом места, Мин. бодова представља најмањи број бодова са којим се у тој школи у првом кругу неко уписао, Укупно места означава број одобрених места, а Преостало места је број непопуњених места у тој школи. Називе свих колона можемо да добијемо помоћу dt.columns.

dt.columns
Index(['Општина', 'Школа', 'Мин. бодова', 'Укупно места', 'Преостало места'], dtype='object')

Вредности које се налазе у одређеној колони се позивају тако што после имена табеле у угластим заграда наведемо име колоне под једноструким или двоструким наводницима. Да бисмо приказали колону са именима држава, написаћемо dt['Школа'] или dt["Школа"].

dt['Школа']
0                                    Техничка школа, Ада
1      Средња школа "Свети Трифун" са домом ученика, ...
2                       Алексиначка гимназија, Алексинац
3             Биотехнолошка школа "Шуматовац", Алексинац
4      Техничка школа "Прота Стеван Димитријевић", Ал...
                             ...
338                               Техничка школа , Шабац
339                             Шабачка гимназија, Шабац
340                      Гимназија "Сава Шумановић", Шид
341                   Техничка школа "Никола Тесла", Шид
342    Економско-трговинска школа "Јован Цвијић", Штрпце
Name: Школа, Length: 343, dtype: object

Ако хоћете да видите само део ове листе, користите слајсове. Са [:10] ћете нпр. добити првих 10, а са [10:20] других 10 елемената колоне, а са [10:0:-1] првих десет у обрнутом редоследу.

dt['Школа'][10:20]
10                  Средња школа "Свети Ахилије", Ариље
11    Средња школа "Вук Караџић" са домом ученика, Б...
12                        Техничка школа , Бајина Башта
13                               Средња школа, Барајево
14                Средња школа "Никола Тесла", Баточина
15                             Пољопривредна школа, Бач
16               Гимназија "20. октобар", Бачка Паланка
17    Средња стручна школа "Др Радивој Увалић", Бачк...
18               Техничка школа "9. мај", Бачка Паланка
19    Гимназија и економска школа "Доситеј Обрадовић...
Name: Школа, dtype: object

Сортирање

Библиотека pandas има прегршт корисних функција за рад са табелама и њиховим колонама. Функција .sort_values() сортира све вредности у одређеној колони и прерасподељује садржај осталих колона у складу са тим. Аргумент ове функције је назив колоне по којој хоћемо да сортирамо табелу. Подразумева се да се сортирање ради од најмање до највеће вредности. Уколико нам то не одговара и хоћемо сортирање у супротном смеру, потребно је да наведемо и други аргумент: ascending=False. То буквално значи да не сортира у растућем (енгл. ascending) редоследу. Примера ради, ако хоћемо да видимо у које су се школе ученици уписивали са најмањим и највећим бројем бодова, можемо да сортирамо вредности по тој колони и погледамо које се школе налазе на почетку и крају табеле.

dt.sort_values('Мин. бодова')
Општина Школа Мин. бодова Укупно места Преостало места
244 Пријепоље Техничка школа , Пријепоље 28.73 105 52
69 Вучитрн Техничка школа "Никола Тесла" , Прилужје 30.16 60 44
272 Сјеница Техничко - пољопривредна школа са домом ученик... 30.47 75 41
165 Лесковац Школа за текстил и дизајн, Лесковац 31.71 90 59
68 Вршац Школски центар "Никола Тесла", Вршац 33.39 30 7
... ... ... ... ... ...
228 Пећ Економско-трговинска школа "Милева Вуковић", Г... 75.44 60 56
93 Зрењанин Зрењанинска гимназија, Зрењанин 79.25 30 24
90 Земун Школа за ученике оштећеног вида "Вељко Рамадан... NaN 12 12
206 Нови Сад Школа за основно и средње образовање "Милан Пе... NaN 12 12
263 Савски венац Школа за оштећене слухом-наглуве "Стефан Дечан... NaN 6 6

343 rows × 5 columns

Задатак 1

Сортирате табелу dt у по укупном броју места у школама од највеће до најмање вредности.

Видимо да има школа где се ученици са тридесетак бодова успешно уписују, али да има и оних такав податак уопште није наведен. Ту се у табели појављује ознака NaN. Ако пажљивије погледамо табелу, видећемо да су школе за које немамо податак о минималном броју бодова школе за ученике са тешкоћама у развоју. То је вероватно разлог зашто број бодова није био критеријум по ком су ученици уписивани.

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

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

Због прегледности исписа згодније нам је да стубићи буду хоризонтални. Зато користимо функцију barh() уместо bar(). Пробајте и са bar(), да видите како би изгледало.

spd=dt.sort_values('Мин. бодова', ascending=False)   # sortiramo tabelu po min. broju bodova i dodeljujemo je novoj tabeli
spd20=spd[:20]                                       # zbog preglednosti, pomoću slajsa, izdvajamo samo prvih 20 redova
plt.barh(spd20['Школа'],spd20['Мин. бодова'],)       # crtamo horizontalni stubičasti dijagram
<BarContainer object of 20 artists>
../_images/obrada_output_25_1.png

Задатак 2:

Напишите кôд који исписује имена десет школа са најмањим бројем преосталих места.

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

plt.hist(dt['Преостало места'])
plt.grid()                         # crtanje mreže na grafiku
../_images/obrada_output_28_0.png

Филтрирање табеле

Филтрирање значи да од целе табеле желимо да издвојимо само оне редове који нас интересују. За филтрирање података у табели користимо критеријуме, односно логичке исказе као што је нпр. dt['Општина']=="Крагујевац". Овде проверавамо које су вредности у колони dt['Општина'] једнаке стрингу "Крагујевац". У угласте заграде после назива табеле треба унети тражени критеријум. На тај начин од целе почетне табеле издвајамо само онај део табеле где је критеријум испуњен.

dt[dt['Општина']=="Крагујевац"]
Општина Школа Мин. бодова Укупно места Преостало места
130 Крагујевац Прва техничка школа, Крагујевац 55.23 30 22
131 Крагујевац Средња стручна школа, Крагујевац 41.35 150 101
132 Крагујевац Трговинско-угоститељска школа "Тоза Драговић",... 42.16 180 89

Слично можемо да издвојимо све школе у којима је остало више од стотину слободних места. Шта мислите колико их има?

dt[dt['Преостало места']>100]
Општина Школа Мин. бодова Укупно места Преостало места
131 Крагујевац Средња стручна школа, Крагујевац 41.35 150 101
200 Нови Сад Пољопривредна школа са домом ученика "Футог", ... 43.94 180 112
213 Палилула (Београд) Железничка техничка школа, Београд (Палилула) 50.27 210 111
310 Темерин Средња школа "Лукијан Мушицки", Темерин 37.87 180 104
335 Чукарица Хемијско-прехрамбена технолошка школа, Београд... 40.56 210 108

Задатак 3

Напишите кôд који издваја редове табеле dt где је број преосталих места мањи или једнак 5.

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