Основе обраде и приказа табеларних података¶
Обраду, анализу и графички приказ података је тешко раздвојити. Све то углавном иде паралелно. У Пајтону постоји неколико најчешће коришћених библиотека које су усаглашене тако да објекти које користимо за обраду података имају функције за цртање, а функције за цртање враћају табеле и серије. Зато је то овде једна лекција.
Обрада табеларних података¶
Много тога за шта су нам потребни програмерско знање и труд при обради података у листама, постаје једноставна примена готових функција када податке спакујемо у 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>


Задатак 2:
Напишите кôд који исписује имена десет школа са најмањим бројем преосталих места.
Други важан тип графикона за приказ расподеле података је хистограм. Он
нам приказује колико се пута у одређеном низу појављује вредност из
тачно одређених интервала вредности. На пример, хистограм може да нам
прикаже број школа по интервалима вредности за број преосталих места.
Функција .hist()
дели интервал од најмање до највеће вредности на
десет једнаких под-интервала уколико не наведемо конкретан број
интервала као други аргумент функције и распон одакле докле желимо
хистограм као трећи аргумент. Сада ћемо приказтаи само ову основну
варијанту са једним аргуметном. Нешто касније ћете видети и како то
изгледа са три.
plt.hist(dt['Преостало места'])
plt.grid() # crtanje mreže na grafiku

Филтрирање табеле¶
Филтрирање значи да од целе табеле желимо да издвојимо само оне редове
који нас интересују. За филтрирање података у табели користимо
критеријуме, односно логичке исказе као што је нпр.
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.