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

Библиотека pandas и структура података DataFrame

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

За ефикасно манипулисање табеларно представљеним подацима у Пајтону развијена је библиотека pandas. Њу можемо увести као што смо увозили и остале библиотеке (и уз пут ћемо јој дати надимак да бисмо мање морали да куцамо):

import pandas as pd

Из ове библиотеке ћемо користити структуру података која се зове DataFrame (енгл. data значи „подаци“, frame значи „оквир“, тако да DataFrame значи „оквир са подацима“, односно „табела“).

Податке о деци сада лако можемо да препакујемо у DataFrame позивом функције са истим именом:

tabela = pd.DataFrame(podaci)

Претходна команда није дала никакав излаз. Она је просто препаковала податке наведене у листи podaci у нову структуру података. Да бисмо се уверили да се ради само о препакивању, исписаћемо садржај променљиве tabela:

tabela
0 1 2 3 4
0 Ana ž 13 46 160
1 Bojan m 14 52 165
2 Vlada m 13 47 157
3 Gordana ž 15 54 165
4 Dejan m 15 56 163
5 Đorđe m 13 45 159
6 Elena ž 14 49 161
7 Žaklina ž 15 52 164
8 Zoran m 15 57 167
9 Ivana ž 13 45 158
10 Jasna ž 14 51 162

Ево и кратког видеа:

Да би табела била прегледнија, даћемо колонама име. Колонама се име даје овако:

tabela = pd.DataFrame(podaci)
tabela.columns=["Ime", "Pol", "Starost", "Masa", "Visina"]
tabela
Ime Pol Starost Masa Visina
0 Ana ž 13 46 160
1 Bojan m 14 52 165
2 Vlada m 13 47 157
3 Gordana ž 15 54 165
4 Dejan m 15 56 163
5 Đorđe m 13 45 159
6 Elena ž 14 49 161
7 Žaklina ž 15 52 164
8 Zoran m 15 57 167
9 Ivana ž 13 45 158
10 Jasna ž 14 51 162

Када свака колона има своје име, можемо да приступимо појединачним колонама:

tabela["Ime"]
0         Ana
1       Bojan
2       Vlada
3     Gordana
4       Dejan
5       Đorđe
6       Elena
7     Žaklina
8       Zoran
9       Ivana
10      Jasna
Name: Ime, dtype: object
tabela["Visina"]
0     160
1     165
2     157
3     165
4     163
5     159
6     161
7     164
8     167
9     158
10    162
Name: Visina, dtype: int64

Имена свих колона су увек доступна у облику листе, овако:

tabela.columns
Index(['Ime', 'Pol', 'Starost', 'Masa', 'Visina'], dtype='object')

Функције за елементарну анализу табеларних података

Кад су подаци сложени у DataFrame, помоћу следећих функција лако можемо да вршимо елементарну анализу података у табели:

  • .sum() – рачуна збир елемената у колони (сума);

  • .mean() – рачуна средњу вредност елемената у колони;

  • .median() – рачуна медијану елемената у колони;

  • .min() – рачуна најмању вредност у колони (минимум);

  • .max() – рачуна највећу вредност у колони (максимум).

Да видимо како то ради на примеру табеле tabela. Конкретно, висину најнижег детета у групи можемо да добијемо са:

tabela["Visina"].min()
157

Колико година има најстарије дете у групи?

tabela["Starost"].max()
15

Средња вредност висине деце у групи је:

tabela["Visina"].mean()
161.9090909090909

Медијална висина:

tabela["Visina"].median()
162.0

Рачун са колонама и редовима табеле

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

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

razred = [["Ana",     5, 3, 5, 2, 4, 5],
          ["Bojan",   5, 5, 5, 5, 5, 5],
          ["Vlada",   4, 5, 3, 4, 5, 4],
          ["Gordana", 5, 5, 5, 5, 5, 5],
          ["Dejan",   3, 4, 2, 3, 3, 4],
          ["Đorđe",   4, 5, 3, 4, 5, 4],
          ["Elena",   3, 3, 3, 4, 2, 3],
          ["Žaklina", 5, 5, 4, 5, 4, 5],
          ["Zoran",   4, 5, 4, 4, 3, 5],
          ["Ivana",   2, 2, 2, 2, 2, 5],
          ["Jasna",   3, 4, 5, 4, 5, 5]]

Сада ћемо од ових података направити табелу чије колоне ће се звати Ime, Informatika, Engleski, Matematika, Fizika, Hemija и Likovno.

ocene = pd.DataFrame(razred)
ocene.columns=["Ime", "Informatika", "Engleski", "Matematika", "Fizika", "Hemija", "Likovno"]
ocene
Ime Informatika Engleski Matematika Fizika Hemija Likovno
0 Ana 5 3 5 2 4 5
1 Bojan 5 5 5 5 5 5
2 Vlada 4 5 3 4 5 4
3 Gordana 5 5 5 5 5 5
4 Dejan 3 4 2 3 3 4
5 Đorđe 4 5 3 4 5 4
6 Elena 3 3 3 4 2 3
7 Žaklina 5 5 4 5 4 5
8 Zoran 4 5 4 4 3 5
9 Ivana 2 2 2 2 2 5
10 Jasna 3 4 5 4 5 5

Ако желимо да израчунамо средње вредности оцена по предметима, треба на сваку колону ове табеле (осим прве где су имена) да применимо функцију mean. Листа са именима свих колона табеле ocene се добија као ocene.columns, па сада само треба да прођемо кроз ову листу и за сваку колону да израчунамо средњу вредност:

predmeti=ocene.columns[1:]   # slajsom [1:] izdvajamo sve kolone sem prve
for predmet in predmeti:
    print(predmet, "->", round(ocene[predmet].mean(), 2))
Informatika -> 3.91
Engleski -> 4.18
Matematika -> 3.73
Fizika -> 3.82
Hemija -> 3.91
Likovno -> 4.55

Да бисмо израчунали средње вредности по редовима, тј. за сваког ученика, потребно је да уведемо нови начин приступа подацима у табели. Одређеном реду табеле не можемо да приступимо без „аксесора“, посебних функција писаних за објекте типа DataFrame, чији су аргументи имена редова/колона или њихови индекси у угластим заградама. Аксесор, помоћу ког приступамо редовима и појединачним елементима табеле, јесте .iloc[]. Аргументи овог аксесора су нумерички индекси редова и колона који почињу од нуле.

На пример, податке из четвртог реда (индекс је 3) табеле добијамо са:

ocene.iloc[3]
Ime            Gordana
Informatika          5
Engleski             5
Matematika           5
Fizika               5
Hemija               5
Likovno              5
Name: 3, dtype: object

На овај начин смо добили податке за једног ученика, тј. ученицу.

Да бисмо из реда издвојили само нумеричке вредности, тј. оцене, потребно је да аксесор добије и други аргумент. Осим индекса реда, потребно је да ставимо и индексе колона. У овом примеру ћемо узети све индексе почевши од индекса 1 јер се име налази у колони са индексом нула.

ocene.iloc[3,1:]
Informatika    5
Engleski       5
Matematika     5
Fizika         5
Hemija         5
Likovno        5
Name: 3, dtype: object

Средње вредности оцена за све ученике сада можемо да израчунамо овако:

for i in range(len(ocene)):
    print(ocene.iloc[i,0], "->", ocene.iloc[i,1:].mean())
Ana -> 4.0
Bojan -> 5.0
Vlada -> 4.166666666666667
Gordana -> 5.0
Dejan -> 3.1666666666666665
Đorđe -> 4.166666666666667
Elena -> 3.0
Žaklina -> 4.666666666666667
Zoran -> 4.166666666666667
Ivana -> 2.5
Jasna -> 4.333333333333333
(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+