$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

7. Индексирање и транспоновање табеле

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

  1. индексирању табеле ради флексибилнијег приступа елементима табеле;
  2. приступу врстама и појединачним локацијама индексиране табеле;
  3. рачунању са целим редовима и колонама табеле; и
  4. транспоновању табеле.

7.1. Индексирање

Видели смо да је рад са колонама табеле веома једноставан.

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

Ime Pol Starost Masa Visina
Ana ž 13 46 160
Bojan m 14 52 165
Vlada m 13 47 157
Gordana ž 15 54 165
Dejan m 15 56 163
Đorđe m 13 45 159
Elena ž 14 49 161
Žaklina ž 15 52 164
Zoran m 15 57 167
Ivana ž 13 45 158
Jasna ž 14 51 162

колона "Ime" је таква колона (колона "Visina" није погодна јер имамо двоје деце са висином 165, па када кажемо "дете са висином 165" није јасно о коме се ради; исто тако ни колоне "Pol", "Starost" и "Masa" нису погодне).

Таква колона се зове кључ јер је она кључна за приступање редовима табеле. Ако желимо да приступамо елементима табеле по редовима, морамо систему да пријавимо коју колону ћемо користити као кључ. То се постиже позивом функције set_index којој проследимо име колоне, а она врати нову табелу "индексирану по датом кључу":

In [1]:
import pandas as pd
podaci = [["Ana",     "ž", 13, 46, 160],
          ["Bojan",   "m", 14, 52, 165],
          ["Vlada",   "m", 13, 47, 157],
          ["Gordana", "ž", 15, 54, 165],
          ["Dejan",   "m", 15, 56, 163],
          ["Đorđe",   "m", 13, 45, 159],
          ["Elena",   "ž", 14, 49, 161],
          ["Žaklina", "ž", 15, 52, 164],
          ["Zoran",   "m", 15, 57, 167],
          ["Ivana",   "ž", 13, 45, 158],
          ["Jasna",   "ž", 14, 51, 162]]
tabela = pd.DataFrame(podaci)
tabela.columns=["Ime", "Pol", "Starost", "Masa", "Visina"]
tabela1=tabela.set_index("Ime")

Нова табела (tabela1) се од старе (tabela) разликује само по томе што редови више нису индексирани бројевима (0, 1, 2, ...) већ именима деце (Ana, Bojan, Vlada, ...). Ево старе (неиндексиране табеле) која има колону "Ime" и чији редови су индексирани бројевима:

In [2]:
tabela
Out[2]:
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

А ево и нове табеле у којој су редови индексирани именима деце:

In [3]:
tabela1
Out[3]:
Pol Starost Masa Visina
Ime
Ana ž 13 46 160
Bojan m 14 52 165
Vlada m 13 47 157
Gordana ž 15 54 165
Dejan m 15 56 163
Đorđe m 13 45 159
Elena ž 14 49 161
Žaklina ž 15 52 164
Zoran m 15 57 167
Ivana ž 13 45 158
Jasna ž 14 51 162

Колона "Ime" је и даље присутна у табели tabela1, али има посебан статус. Ако покушамо да јој приступимо као "обичној" колони добићемо грешку:

In [4]:
tabela1["Ime"]
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
   3077             try:
-> 3078                 return self._engine.get_loc(key)
   3079             except KeyError:

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'Ime'

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
<ipython-input-4-b9221308e975> in <module>
----> 1 tabela1["Ime"]

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in __getitem__(self, key)
   2686             return self._getitem_multilevel(key)
   2687         else:
-> 2688             return self._getitem_column(key)
   2689 
   2690     def _getitem_column(self, key):

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in _getitem_column(self, key)
   2693         # get column
   2694         if self.columns.is_unique:
-> 2695             return self._get_item_cache(key)
   2696 
   2697         # duplicate columns & possible reduce dimensionality

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py in _get_item_cache(self, item)
   2487         res = cache.get(item)
   2488         if res is None:
-> 2489             values = self._data.get(item)
   2490             res = self._box_item_values(item, values)
   2491             cache[item] = res

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals.py in get(self, item, fastpath)
   4113 
   4114             if not isna(item):
-> 4115                 loc = self.items.get_loc(item)
   4116             else:
   4117                 indexer = np.arange(len(self.items))[isna(self.items)]

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
   3078                 return self._engine.get_loc(key)
   3079             except KeyError:
-> 3080                 return self._engine.get_loc(self._maybe_cast_indexer(key))
   3081 
   3082         indexer = self.get_indexer([key], method=method, tolerance=tolerance)

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 'Ime'

Међутим, она је ту као индексна колона:

In [5]:
tabela1.index
Out[5]:
Index(['Ana', 'Bojan', 'Vlada', 'Gordana', 'Dejan', 'Đorđe', 'Elena',
       'Žaklina', 'Zoran', 'Ivana', 'Jasna'],
      dtype='object', name='Ime')

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

In [7]:
import matplotlib.pyplot as plt
plt.figure(figsize=(10,5))
plt.bar(tabela1.index, tabela1["Visina"])
plt.title("Visina dece u grupi")
plt.show()
plt.close()

Ознаке на хоризонталној оси узимамо из индексне колоне tabela1.index, док податке о висини стубића узимамо из колоне tabela1["Visina"].

7.2. Приступ врстама и појединачним ћелијама индексиране табеле

Структура података DataFrame је оптимизована за рад са колонама табеле. Срећом, када имамо индексирану табелу као што је то tabela1, користећи функцију loc (од енгл. location што значи "локација, положај, место") можемо да приступамо редовима табеле, као и појединачним ћелијама табеле.

Податке о појединачним редовима табеле можемо да видимо овако:

In [8]:
tabela1.loc["Dejan"]
Out[8]:
Pol          m
Starost     15
Masa        56
Visina     163
Name: Dejan, dtype: object

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

In [9]:
tabela1.loc["Dejan":"Zoran"]
Out[9]:
Pol Starost Masa Visina
Ime
Dejan m 15 56 163
Đorđe m 13 45 159
Elena ž 14 49 161
Žaklina ž 15 52 164
Zoran m 15 57 167

Ако као други аргумент функције loc наведемо име колоне, рецимо овако:

tabela1.loc["Dejan", "Visina"]

добићемо информацију о Дејановој висини.

In [10]:
tabela1.loc["Dejan", "Visina"]
Out[10]:
163

Ево како можемо да добијемо информацију о маси и висини неколико деце:

In [11]:
tabela1.loc["Dejan":"Zoran", "Masa":"Visina"]
Out[11]:
Masa Visina
Ime
Dejan 56 163
Đorđe 45 159
Elena 49 161
Žaklina 52 164
Zoran 57 167

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

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

In [12]:
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" и која ће бити индексирана по колони "Ime":

In [13]:
ocene = pd.DataFrame(razred)
ocene.columns=["Ime", "Informatika", "Engleski", "Matematika", "Fizika", "Hemija", "Likovno"]
ocene1 = ocene.set_index("Ime")
ocene1
Out[13]:
Informatika Engleski Matematika Fizika Hemija Likovno
Ime
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

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

In [14]:
for predmet in ocene1.columns:
    print(predmet, "->", round(ocene1[predmet].mean(), 2))
Informatika -> 3.91
Engleski -> 4.18
Matematika -> 3.73
Fizika -> 3.82
Hemija -> 3.91
Likovno -> 4.55

Да бисмо израчунали просечне оцене сваког ученика функцију mean ћемо применити на врсте табеле које добијамо позивом функције loc. Погледајмо, прво, како то можемо да урадимо за једног ученика:

In [15]:
print("Đorđe ima sledeće ocene:")
print(ocene1.loc["Đorđe"])
print("Prosek njegovih ocena je:", round(ocene1.loc["Đorđe"].mean(), 2))
Đorđe ima sledeće ocene:
Informatika    4
Engleski       5
Matematika     3
Fizika         4
Hemija         5
Likovno        4
Name: Đorđe, dtype: int64
Prosek njegovih ocena je: 4.17

Списак свих ученика се налази у индексној колони, па просеке по свим ученицима можемо да израчунамо овако:

In [16]:
for ucenik in ocene1.index:
    print(ucenik, "->", round(ocene1.loc[ucenik].mean(), 2))
Ana -> 4.0
Bojan -> 5.0
Vlada -> 4.17
Gordana -> 5.0
Dejan -> 3.17
Đorđe -> 4.17
Elena -> 3.0
Žaklina -> 4.67
Zoran -> 4.17
Ivana -> 2.5
Jasna -> 4.33

7.4. Транспоновање табеле

Замена врста и колона табеле се зове транспоновање. Приликом транспоновања имена колона полазне табеле постају индекси нове табеле, док индексна колона полазне табеле одређује имена колона нове табеле:

Транспоновање

Транспоновање се често користи када табела има мало веома дугачких редова, па је у неким ситуацијама лакше посматрати транспоновану табелу која онда има пуно релативно кратких редова. Функције head и tail нам тада омогућују да се брзо упознамо са почетком и крајем табеле и да стекнемо неку интуицију о томе како табела изгледа.

Важно је рећи и то да се са табелама може радити и без транспоновања, јер све што можемо да урадимо на колонама табеле можемо да урадимо и на врстама. И поред тога, транспоновање се често користи јер је библиотека pandas оптимизована за рад по колонама табеле.

Табела се транспонује тако што се на њу примени функција Т која као резултат враћа нову, транспоновану табелу.

Ево примера са оценама:

In [17]:
ocene1
Out[17]:
Informatika Engleski Matematika Fizika Hemija Likovno
Ime
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

Транспоновану табелу добијамо овако:

In [18]:
ocene2 = ocene1.T
In [19]:
ocene2
Out[19]:
Ime Ana Bojan Vlada Gordana Dejan Đorđe Elena Žaklina Zoran Ivana Jasna
Informatika 5 5 4 5 3 4 3 5 4 2 3
Engleski 3 5 5 5 4 5 3 5 5 2 4
Matematika 5 5 3 5 2 3 3 4 4 2 5
Fizika 2 5 4 5 3 4 4 5 4 2 4
Hemija 4 5 5 5 3 5 2 4 3 2 5
Likovno 5 5 4 5 4 4 3 5 5 5 5

Хајде још да се уверимо да су врсте и колоне замениле места и у пољима index и columns. У полазној табели је:

In [20]:
ocene1.index
Out[20]:
Index(['Ana', 'Bojan', 'Vlada', 'Gordana', 'Dejan', 'Đorđe', 'Elena',
       'Žaklina', 'Zoran', 'Ivana', 'Jasna'],
      dtype='object', name='Ime')
In [21]:
ocene1.columns
Out[21]:
Index(['Informatika', 'Engleski', 'Matematika', 'Fizika', 'Hemija', 'Likovno'], dtype='object')

А у транспонованој табели је:

In [22]:
ocene2.index
Out[22]:
Index(['Informatika', 'Engleski', 'Matematika', 'Fizika', 'Hemija', 'Likovno'], dtype='object')
In [23]:
ocene2.columns
Out[23]:
Index(['Ana', 'Bojan', 'Vlada', 'Gordana', 'Dejan', 'Đorđe', 'Elena',
       'Žaklina', 'Zoran', 'Ivana', 'Jasna'],
      dtype='object', name='Ime')

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

In [24]:
for predmet in ocene1.columns:
    print(predmet, "->", round(ocene1[predmet].mean(), 2))
Informatika -> 3.91
Engleski -> 4.18
Matematika -> 3.73
Fizika -> 3.82
Hemija -> 3.91
Likovno -> 4.55

Да бисмо добили просек оцена по ученицима, можемо да приступимо врстама табеле користећи функцију loc како смо то већ видели, али можемо и да употребимо транспоновану табелу (рачунање просека по колонама, јер су колоне транспоноване табеле заправо врсте полазне табеле):

In [25]:
for ucenik in ocene2.columns:
    print(ucenik, "->", round(ocene2[ucenik].mean(), 2))
Ana -> 4.0
Bojan -> 5.0
Vlada -> 4.17
Gordana -> 5.0
Dejan -> 3.17
Đorđe -> 4.17
Elena -> 3.0
Žaklina -> 4.67
Zoran -> 4.17
Ivana -> 2.5
Jasna -> 4.33

7.5. Задаци

Задатке реши у Џупитеру.

Задатак 1. Пажљиво погледај овај Пајтон програм па одговори на питања која следе:

In [ ]:
import pandas as pd
podaci = [["Ana",     "ž", 13, 46, 160],
          ["Bojan",   "m", 14, 52, 165],
          ["Vlada",   "m", 13, 47, 157],
          ["Gordana", "ž", 15, 54, 165],
          ["Dejan",   "m", 15, 56, 163],
          ["Đorđe",   "m", 13, 45, 159],
          ["Elena",   "ž", 14, 49, 161],
          ["Žaklina", "ž", 15, 52, 164],
          ["Zoran",   "m", 15, 57, 167],
          ["Ivana",   "ž", 13, 45, 158],
          ["Jasna",   "ž", 14, 51, 162]]
tabela = pd.DataFrame(podaci)
tabela.columns=["Ime", "Pol", "Starost", "Masa", "Visina"]
tabela1=tabela.set_index("Ime")

temp_anomalije = pd.read_csv("podaci/TemperaturneAnomalije.csv", header=None)
temp_anomalije1 = temp_anomalije.T
temp_anomalije1.columns = ["Година", "Аномалија"]
  1. У чему је разлика између табела tabela и tabela1?
  2. Шта представља израз tabela1.index?
  3. Шта је вредност израза tabela1.loc["Ђорђе"]?
  4. Шта је вредност израза tabela1.loc["Ђорђе", "Висина"]?
  5. Шта је вредност израза tabela.loc["Ђорђе", "Висина"]?
  6. Зашто смо на табелу temp_anomalije применили функцију T?
  7. Колико колона има табела temp_anomalije1?

Задатак 2. Ево трошкова живота једне породице током једне године, по месецима (сви износи су представљени у динарима):

Stavka Jan Feb Mar Apr Maj Jun Jul Avg Sep Okt Nov Dec
Stanarina 8.251 8.436 8.524 8.388 8.241 8.196 8.004 7.996 7.991 8.015 8.353 8.456
Struja 4.321 4.530 4.115 3.990 3.985 3.726 3.351 3.289 3.295 3.485 3.826 3.834
Telefon (fiksni) 1.425 1.538 1.623 1.489 1.521 1.485 1.491 1.399 1.467 1.531 1.410 1.385
Telefon (mobilni) 2.181 2.235 2.073 1.951 1.989 1.945 3.017 2.638 2.171 1.831 1.926 1.833
TV i internet 2.399 2.399 2.399 2.399 2.399 2.399 2.399 2.399 2.399 2.399 2.399 2.399
Prevoz 1.830 1.830 1.830 1.830 1.950 1.950 1.450 1.450 1.950 1.950 2.050 2.050
Hrana 23.250 23.780 24.019 24.117 24.389 24.571 24.736 24.951 25.111 25.389 25.531 25.923
Ostalo 4.500 3.700 5.100 3.500 2.750 4.250 7.320 8.250 3.270 4.290 3.200 8.390

У ћелији испод су исти подаци представљени листом:

In [ ]:
troskovi = [
  ["Stanarina", 8251, 8436, 8524, 8388, 8241, 8196, 8004, 7996, 7991, 8015, 8353, 8456],
  ["Struja", 4321, 4530, 4115, 3990, 3985, 3726, 3351, 3289, 3295, 3485, 3826, 3834],
  ["Telefon (fiksni)", 1425, 1538, 1623, 1489, 1521, 1485, 1491, 1399, 1467, 1531, 1410, 1385],
  ["Telefon (mobilni)", 2181, 2235, 2073, 1951, 1989, 1945, 3017, 2638, 2171, 1831, 1926, 1833],
  ["TV i internet", 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399, 2399 ],
  ["Prevoz", 1830, 1830, 1830, 1830, 1950, 1950, 1450, 1450, 1950, 1950, 2050, 2050],
  ["Hrana", 23250, 23780, 24019, 24117, 24389, 24571, 24736, 24951, 25111, 25389, 25531, 25923],
  ["Ostalo", 4500, 3700, 5100, 3500, 2750, 4250, 7320, 8250, 3270, 4290, 3200, 8390]
]

(а) Представи табелу структуром DataFrame. Индексирај табелу.

(б) Израчунај и испиши просечну потрошњу ове породице по ставкама (колико је породица просечно потрошила на станарину, колико на струју, итд).

Задатак 3. Ученици осмог разреда једне школе су анкетирани о томе коју врсту филмова најрадије гледају. Подаци анкете су дати у следећој табели (у коју нису унети неважећи и бесмислени одговори):

Žanr 8-1 8-2 8-3 8-4 8-5
Komedija 4 3 5 2 3
Horor 1 0 2 1 6
Naučna fantastika 10 7 9 8 9
Avanture 4 3 4 2 2
Istorijski 1 0 2 0 0
Romantični 11 10 7 9 8

(а) Формирај одговарајућу табелу позивом функције DataFrame. Индексирај табелу колоном "Žanr".

(б) Израчунај и испиши колико гласова је добио сваки од наведених жанрова.

(в) За свако одељење израчунај и испиши колико је било валидних гласова.

(г) Колико је укупно ученика осмих разреда учествовало у анкетирању? (Рачунамо само ученике који су дали валидне одговоре на анкету.)

Задатак 4. Нутритивни подаци за неке намирнице су дати у следећој табели:

Namirnica (100g) Energetska vrednost (kcal) Ugljeni hidrati (g) Belančevine (g) Masti (g)
Crni hleb 250 48,2 8,4 1,0
Beli hleb 280 57,5 6,8 0,5
Kisela pavlaka (10% m.m.) 127 4,0 3,1 10,5
Margarin 532 4,6 3,2 1,5
Jogurt 48 4,7 4,0 3,3
Mleko (2,8% m.m.) 57 4,7 3,3 2,8
Salama parizer 523 1,0 17,0 47,0
Pršuta 268 0,0 25,5 18,4
Pileća prsa 110 0,0 23,1 1,2

У ћелији испод ови подаци су припремљени у облику индексиране DataFrame структуре (са скраћеним именима):

In [ ]:
namirnice = pd.DataFrame([
    ["Chleb", 250, 48.2, 8.4, 1.0],
    ["Bhleb", 280, 57.5, 6.8, 0.5],
    ["Pavlaka", 127, 4.0, 3.1, 10.5],
    ["Margarin", 532, 4.6, 3.2, 1.5],
    ["Jogurt", 48, 4.7, 4.0, 3.3],
    ["Mleko", 57, 4.7, 3.3, 2.8],
    ["Parizer", 523, 1.0, 17.0, 47.0],
    ["Pršuta", 268, 0.0, 25.5, 18.4],
    ["PilPrsa", 110, 0.0, 23.1, 1.2]])
namirnice.columns=["Namirnica", "EnergVr", "UH", "Bel", "Masti"]
namirnice1 = namirnice.set_index("Namirnica")

(а) Милош је за доручак појео два парчета белог хлеба и попио шољу млека. Свако парче хлеба је било намазано павлаком и имало је један шнит пршуте. Колика је енергетска вредност Милошевог доручка (у kcal), ако претпоставимо да једно парче хлеба има 100 г, да је за мазање једног парчета хлеба довољно 10 г премаза, да један шнит пршуте има 20г и да шоља млека има 2 дл (што је приближно 200 г)?

(б) Колико грама масти је било у Милошевом доручку?

(в) Прикажи дијаграмом количину угљених хидрата у намирницама наведеним у табели.

Задатак 5. У фолдеру podaci се налази датотека TemperaturneAnomalije.csv која садржи податке о томе за колико степени Целзијуса је средња измерена температура на Земљи већа од оптималне у последњих 40 година. Ова табела има два дугачка реда који изгледају овако:

1977,1978,1979,1980,1981,...
0.22,0.14,0.15,0.3,0.37,...

У првом реду се налазе године (1977-2017), а у другом измерена температурна аномалија. Табела нема заглавље.

(а) Учитај табелу у структуру DataFrame користећи функцију read_csv из библиотеке pandas. (Напомена: када табела нема заглавље у функцији за учитавање треба навести опцију header=None.)

In [ ]:
 

(б) Транспонуј табелу и колоне транспоноване табеле назови "Godina" i "Anomalija".

In [ ]:
 

(в) Индексирај табелу колоном "Godina".

In [ ]:
 

(г) Прикажи температурне аномалије дијаграмом.

In [ ]:
 

Задатак 6. У фолдеру podaci се налази датотека StanovnistvoSrbije2017.csv (која има заглавље). Табела има три колоне које се зову "Starost", "M" и "Ž".

(а) Учитај датотеку у структуру података DataFrame и индексирај табелу колоном "Starost".

In [ ]:
 

(б) Прикажи процењени број мушкараца и жена по старости линијским дијаграмом.

In [ ]:
 

(в) На основу података из табеле израчунај колики је процењени број становника у следећим старосним групама:

  • 0--17 година,
  • 18--65 година, и
  • 66 и више година,

и представи ова три податка секторским дијаграмом. (Упутство: следећи израз може бити од помоћи: tabela.loc["0":"17", "M":"Ž"])

In [ ]:
 

Задатак 7. У табели испод су дати подаци о продаји неких производа у пет пословних јединица једне компаније (бројеви представљају број продатих комада у једном месецу):

Proizvod PJ1 PJ2 PJ3 PJ4 PJ5
Cipele 5 17 3 11 9
Košulja 8 6 7 4 0
Kaiš 4 1 3 5 1
Pantalone 4 2 6 4 5
Čarape (par) 8 9 7 4 9
Kravata 1 0 3 2 4

Следећа табела садржи цене ових производа у динарима:

Proizvod Cena (din)
Cipele 11.250
Košulja 6.500
Kaiš 4.750
Pantalone 2.500
Čarape (par) 750
Kravata 3.500

Ћелија испод садржи податке из ове две табеле представљене у облику листе:

In [ ]:
proizvodi = [
    ["Cipele",         5, 17,  3, 11,  9],
    ["Košulja",         8,  6,  7,  4,  0],
    ["Kaiš",           4,  1,  3,  5,  1],
    ["Pantalone",      4,  2,  6,  4,  5],
    ["Čarape (par)",   8,  9,  7,  4,  9],
    ["Kravata",        1,  0,  3,  2,  4]]
cene = [
    ["Cipele",         11250],
    ["Košulja",          6500],
    ["Kaiš",            4750],
    ["Pantalone",       2500],
    ["Čarape (par)",     750],
    ["Kravata",         3500]]

(а) Представи обе табеле структуром DataFrame. Индексирај обе табеле.

(б) Израчунај колико је укупно у том месецу продато ципела, кошуља, каишева, панталона, чарапа и кравата.

(в) Израчунај колико је у том месецу компанија зарадила на продаји ципела, колико на продаји кошуља, колико на продаји каишева, итд.

(г*) Израчунај и испиши зараду сваке пословне јединице у том месецу.

In [ ]: