Import kniznic

Pre vypracovanie tejto ulohy potrebujeme kniznice:

  • Pandas - umoznuje nam pracovat s datami z csv suboru, vykonovat nad nimi rozne datove operacie, spajanie dat a pracovat podobne ako v sql
  • Numpy - umoznuje nam pracovat s datami ako pole, len nad nim vykonavat rozne operacie - porovnanie, scitanie,... efektivnejsie
  • Matplotlib - kniznica na vizualizaciu
In [1]:
"""Import matplotlib inline. Je dobre importovat ho na zaciatku ako prvy import"""
%matplotlib inline
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
In [2]:
%matplotlib??
In [3]:
"""Nacitanie dat z csv suboru baby-names do premennej names"""
names = pd.read_csv('csv/baby-names2.csv')
In [4]:
"""Vypis prvych n hodnot z dataframu names"""
names.head()
Out[4]:
year name prop sex soundex
0 1880 John 0.081541 boy J500
1 1880 William 0.080511 boy W450
2 1880 James 0.050057 boy J520
3 1880 Charles 0.045167 boy C642
4 1880 George 0.043292 boy G620
In [5]:
"""Vypis vsetkych mien z roku 1990"""
"""Ekvivalent
SELECT *
FROM names
WHERE year = 1990
"""
names[(names.year == 1990) ^ (names.sex == "boy")].head()
Out[5]:
year name prop sex soundex
0 1880 John 0.081541 boy J500
1 1880 William 0.080511 boy W450
2 1880 James 0.050057 boy J520
3 1880 Charles 0.045167 boy C642
4 1880 George 0.043292 boy G620
In [6]:
"""Vytvorenie datoveho framu boys, kde su ulozene hodnoty spojene iba s chlapcami, to iste pre datovy frame girls s
dievcatami"""
boys = names[names.sex == 'boy'].copy()    
girls = names[names.sex == 'girl'].copy()

Preco vytvorenie novych datovych setov?

V praxi mame vzdy dva typy dat.

  1. Vstupne data - data z inych systemov, z api, z inych databaz, zadane rucne uzivatelom,..
  2. Vystupne data - nami upravene data, transformovane, vycistene, vhodne na dalsie spracovanie vysledkov, vizualizacie a podobne


Opakovanie poli

  1. Vytvor prazdne pole
  2. Pridaj do pola zoznam tvojich oblubenych jedal, aspon piatich
  3. Vypis prvy prvok pola
  4. Vypis posledny prvok pola
  5. Vypis druhe a tretie oblubene jedlo
  6. Skus napisat range(1,4) co ti vrati pomocou for i in range(1,4): print(i)
  7. Skus napisat range(1,20,2) , co ti vrati pomocou for i in range(1,20,2): print(i)
  8. Vygeneruj nove pole s nazvom moj_test pomocou metody range od 1 do 10
  9. Pozri sa co sa vypise ked zadas moj_test[::2]
In [7]:
favFoods = []
favFoods = ['pizza', 'kura', 'zmrzlina', 'salat', 'nanuk']
favFoods[0]
print(favFoods[-1])
print (favFoods[1:3])
for i in range(1,4):
    print (i)
for i in range(1,20,2):
    print (i)
moj_test = []
for i in range(1,10):
    moj_test.append(i)
moj_test[::2]
nanuk
['kura', 'zmrzlina']
1
2
3
1
3
5
7
9
11
13
15
17
19
Out[7]:
[1, 3, 5, 7, 9]
In [8]:
moj_test1 = [1, 2, 3, 4, 5]
moj_test1[::3]
Out[8]:
[1, 4]
In [9]:
boys.shape
Out[9]:
(129000, 5)
In [10]:
boys.shape[0]
Out[10]:
129000
In [11]:
#vypis pocet stlpcov pomocou shape
boys.shape[1]
Out[11]:
5
In [12]:
"""Zobrazenie vyvoja mena william v case"""
william = boys[boys["name"] =='David']
william.head(11)
Out[12]:
year name prop sex soundex
17 1880 David 0.007339 boy D130
1017 1881 David 0.006926 boy D130
2018 1882 David 0.006867 boy D130
3019 1883 David 0.006543 boy D130
4020 1884 David 0.006208 boy D130
5021 1885 David 0.006141 boy D130
6023 1886 David 0.005662 boy D130
7021 1887 David 0.006166 boy D130
8020 1888 David 0.006166 boy D130
9021 1889 David 0.006359 boy D130
10025 1890 David 0.006107 boy D130
In [13]:
"""Na vykreslenie grafu pouzijeme funkciu plot"""
"""plot(x,y) -- os x a os y,
os x je tvorena rokmi z data framu william. Na ziskanie vsetkych riadkov z dataframu mozeme pouzit:
1.) shape
2.) len
Vypis prveho stlpca - roky sa robi cez william.shape[0] - zisti dlzku datoveho setu od prveho po posledny rok.
os y je tvorena hodnotou stlpca prop z dataframu william"""

plt.plot(range(william.shape[0]), william['prop'])

"""Definovanie osi x pomocou metody xticks, kde
urcuje dlzku osi x - nastavili sme to na pocet vsetkych rokov z dataframu william, kde je definovane ze to bude
posuvane po 10 rokoch
- nastavili sme ze os bude mat hodnoty roku william z stlpcu year
- nastavili sme rotaciu - zobrazenie popiskov suradnic osi x
"""

plt.xticks(range(william.shape[0])[::10], william['year'].values[::10], rotation='vertical')

"""
Nastavenie osi y, kde sme definovali ze hodnoty budu v rozsahu od 0 - 0.1
"""
plt.ylim([0, 0.1])

"""
Vykreslenie grafu
"""

plt.show()

Ulohy

  • Vytvor to iste pre data frame girls a uloz do premennej emma, kde nacitas mena iba dievcat Emma
  • Skus zmenit v kode hodnotu, tak aby sa bral kazdy piaty rok
  • Pridaj do kodu za plt.plot(linestyle="dashed", color="pink")
  • Pridaj popis osi x a y pomocou:
    plt.xlabel("Years")
    plt.ylabel("Population")
  • Pridaj nadpis grafu pomocou plt.title("Emma")
  • Uprav plt.ylim([0,0.2])
In [14]:
emma = girls[girls['name']=='Emma']
plt.plot(range(emma.shape[0]), emma['prop'], linestyle="dashed", color="pink")
plt.xticks(range(emma.shape[0])[::5], emma['year'].values[::5], rotation='vertical')
plt.ylim([0, 0.2])
plt.xlabel("Years")
plt.ylabel("Population")
plt.title("Emma")
plt.savefig('table.png', transparent=False)
In [15]:
boys['year'].values
Out[15]:
array([1880, 1880, 1880, ..., 2008, 2008, 2008])
In [16]:
"""Vytvorenie a zistenie, ktore meno bolo najpopularnejsie vo vybranej dekade
1.) v prvom kroku si vytvorime novy stlpec decade nad dataframom boys
2.) pomocou numpy funkcie floor, ktora vracia cislo zaokruhlene smerom nadol vydelime desiatimi a vysledok finalne 
10timi vynasobime.
3.) Kedze chceme pracovat s celymi hodnotami pretypujeme vysledok na int (cele cislo) pomocou astype(np.int)
"""
boys['decade'] = (np.floor(boys['year'].values / 10)*10).astype(np.int)
In [17]:
boys.head()
Out[17]:
year name prop sex soundex decade
0 1880 John 0.081541 boy J500 1880
1 1880 William 0.080511 boy W450 1880
2 1880 James 0.050057 boy J520 1880
3 1880 Charles 0.045167 boy C642 1880
4 1880 George 0.043292 boy G620 1880

Agregacne funkcie

FunctionDescription
countNumber of non-null observations
sumSum of values
meanMean of values
madMean absolute deviation
medianArithmetic median of values
minMinimum
maxMaximum
modeMode
absAbsolute Value
prodProduct of values
stdUnbiased standard deviation
varUnbiased variance
semUnbiased standard error of the mean
skewUnbiased skewness (3rd moment)
kurtUnbiased kurtosis (4th moment)
quantileSample quantile (value at %)
cumsumCumulative sum
cumprodCumulative product
cummaxCumulative maximum
cumminCumulative minimum
In [18]:
"""Vytvorenie pivotnej tabulky, ktora obsahuje
index tvoreny z mien chlapcov, index je unikatna hodnota, ak sa tam nachadza viac krat bude to zgrupene
columns bude tvorene dekadami
values - hodnoty riadkov obsahuju informacie o populacii zo stlpca prop
agregacna funkcia suma, ktora zrata populaciu mena vo vybranom desatroci
"""
pivot = pd.pivot_table(boys, index='name', columns='decade', values='prop', aggfunc=np.sum)
In [19]:
pivot
Out[19]:
decade 1880 1890 1900 1910 1920 1930 1940 1950 1960 1970 1980 1990 2000
name
Aaden NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000442
Aarav NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000101
Aaron 0.007751 0.006737 0.007135 0.006772 0.005429 0.004361 0.003929 0.005386 0.013612 0.059716 0.071985 0.062347 0.037132
Ab 0.000218 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Abb 0.000041 0.000096 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Abbie 0.000046 0.000046 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Abbott 0.000088 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Abdiel NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000092
Abdul NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000574 0.000252 0.000582 NaN
Abdullah NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000243 0.000879
Abe 0.003758 0.004076 0.003923 0.003220 0.001319 0.000641 0.000390 0.000174 0.000057 NaN NaN NaN NaN
Abel 0.000915 0.000964 0.000786 0.000823 0.000775 0.000866 0.000810 0.001012 0.001367 0.002075 0.002456 0.003159 0.003478
Abelardo NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000041 NaN NaN NaN
Abie 0.000042 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Abner 0.002245 0.001680 0.001493 0.001026 0.000608 0.000254 NaN NaN NaN NaN NaN NaN NaN
Abraham 0.006604 0.006868 0.007693 0.009283 0.004505 0.002300 0.001486 0.001424 0.001384 0.003011 0.004505 0.006329 0.008310
Abram 0.001938 0.001469 0.000996 0.000808 0.000317 0.000134 NaN NaN NaN 0.000469 0.000754 0.000665 0.001417
Ace 0.000469 0.000205 0.000134 NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000386
Acey 0.000042 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Acie 0.000122 0.000129 0.000418 0.000070 NaN NaN NaN NaN NaN NaN NaN NaN NaN
Acy NaN 0.000046 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Ada 0.000198 0.000311 0.000060 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Adalberto NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000051 NaN NaN
Adam 0.008676 0.007010 0.006938 0.006678 0.003920 0.002223 0.001625 0.001809 0.011914 0.053873 0.101889 0.051863 0.030765
Adams NaN 0.000053 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Adan NaN NaN NaN NaN 0.000041 0.000171 0.000259 0.000189 0.000410 0.000863 0.001338 0.001902 0.003601
Add 0.000037 0.000134 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Addie 0.000515 0.000474 0.000304 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Addison 0.001442 0.001098 0.000789 0.000720 0.000495 0.000178 NaN NaN NaN NaN 0.000538 0.001587 0.001680
Adelard 0.000153 0.000172 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ...
Yoshio NaN NaN NaN 0.000282 0.000307 NaN NaN NaN NaN NaN NaN NaN NaN
Young 0.000836 0.000356 0.000083 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Yurem NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000182
Yusuf NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000671
Zachariah NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.001082 0.002577 0.003716 0.002802
Zachary NaN NaN NaN NaN NaN NaN 0.000179 0.001053 0.001786 0.011194 0.052229 0.109750 0.059905
Zachery NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000497 0.002751 0.007111 0.002936
Zack 0.001885 0.001491 0.000887 0.000478 0.000252 NaN NaN NaN NaN NaN NaN NaN 0.000639
Zackary NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000214 0.001724 0.005561 0.004801
Zackery NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000161 0.001323 0.003666 0.002265
Zaid NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000259
Zaiden NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000106
Zain NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000796
Zaire NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000088 0.000815
Zakary NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000918 0.000760
Zander NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.003319
Zane NaN NaN NaN NaN 0.000609 0.000647 0.000416 0.000538 0.000624 0.000837 0.001500 0.003988 0.006258
Zavier NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000786
Zayden NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000556
Zayne NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000457
Zeb 0.000794 0.000450 0.000356 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Zebulon NaN 0.000055 NaN NaN NaN NaN NaN NaN NaN 0.000124 0.000094 NaN NaN
Zechariah NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000221 0.001033 0.001330
Zed NaN 0.000056 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Zeke 0.000104 0.000116 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Zenas 0.000052 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Zeno 0.000053 0.000147 0.000153 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Zigmund NaN NaN NaN 0.000208 NaN NaN NaN NaN NaN NaN NaN NaN NaN
Zion NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.000644 0.004745
Zollie 0.000155 0.000200 0.000124 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

3437 rows × 13 columns

Vysvetlenie axis

Pouzi axis=0 ked chceme brat hodnoty z riadkov smerom nadol nad stlpcami


Pouzi axis=1 ked chceme zobrat hodnotu z kazdeho riadku napriec vsetkymi stlpcami

<img src="https://i.stack.imgur.com/DL0iQ.jpg" width=500, height=500 />

In [20]:
"""Zobrazenie najpopularnejsieho mena za vybrane desatrocia
- vracia prvy maximalny vyskyt hodnoty prop , pomocou axis=0 vieme ze pracujeme s riadkami , indexom kde index je name
"""

pivot.idxmax(axis=0)
Out[20]:
decade
1880       John
1890       John
1900       John
1910       John
1920     Robert
1930     Robert
1940      James
1950      James
1960    Michael
1970    Michael
1980    Michael
1990    Michael
2000      Jacob
dtype: object
In [21]:
#Zobraz najmenej popularne meno
pivot.idxmin(axis=0)
Out[21]:
decade
1880          Add
1890    Alejandro
1900         Byrd
1910      Burnice
1920         Adan
1930        Gregg
1940        Corey
1950       Caesar
1960         Burl
1970     Augustus
1980      Tavaris
1990     Brittany
2000        Dayne
dtype: object
In [22]:
"""
Nahradenie prazdnych hodnot za 0 pomocou fillna
"""
pivot = pivot.fillna(0)
pivot.head()
Out[22]:
decade 1880 1890 1900 1910 1920 1930 1940 1950 1960 1970 1980 1990 2000
name
Aaden 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000442
Aarav 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000101
Aaron 0.007751 0.006737 0.007135 0.006772 0.005429 0.004361 0.003929 0.005386 0.013612 0.059716 0.071985 0.062347 0.037132
Ab 0.000218 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
Abb 0.000041 0.000096 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
In [23]:
"""
Priemerne najpouzivanejsie meno napriec vsetkymi rokmi
"""
our_value = pivot.mean(axis=1)
#our_value
In [24]:
our_value.idxmax()
Out[24]:
'John'