10  Python

Jazyky R a Python sú najpoužívanejšími vysokoúrovňovými programovacími jazykmi v oblasti manipulácie, vizualizácie a analýzy údajov (v data science). Python je však oproti Rku viacúčelový, okrem strojového učenia a umelej inteligencie sa vo veľkej miere používa pre vývoj webových aplikácií, hier, desktopových používateľských prostredí, audio a video či aplikácií pre zber obsahu z web stránok. Podľa rebríčkov TIOBE a PYPL je najpopulárnejším programovacím jazykom, čo môže byť dané aj jeho vhodnosťou pre začiatočníkov a veľkou komunitou podporovateľov (používateľov a vývojárov).

Otázka neznie, ktorý z týchto dvoch je pre oblasť data science vhodnejší, ako skôr kedy ktorý použiť a ako nástroje z oboch vhodne skombinovať. Preto je užitočné oboznámiť sa aspoň so základmi jazyka Python a niektorých jeho knižníc.

10.1 Vývojové prostredie a inštalácia

Pre prácu s Pythonom existuje množstvo komplexných a úzko spätých vývojových prostredí ako IDLE (východzie IDE), PyCharm, IPython/Jupyter/JupyterLab či Spyder, no podporujú ho i všeobecne použitelné prostredia (VSCode, Colab) či editory (Emacs, Sublime, Atom, …) a takisto RStudio. (Výber závisí od ponúkaných užitočných nástrojov.)

Okrem inštalácie samotného systému Python (inštalátorom v OS Windows a MacOS alebo z repozitárov OS Linux) je v RStudiu potrebné nainštalovať balík reticulate, ktorý slúži na komunikáciu s R. Dokonca je možné pomocou neho Python aj nainštalovať. Obzvlášť pre OS Windows sa odporúča použiť distribúciu Miniconda

reticulate::install_miniconda()

pričom v Linuxe sa nám osvedčila aj priama inštalácia pomocou funkcie

reticulate::install_python()

ktorá (pomocou nástroja pyenv na prepínanie medzi verziami Python-u) stiahne a skompiluje danú verziu lokálne, vo virtuálnom prostredí s názvom “r-reticulate”. Aby kompilácia prebehla bez problémov, je predtým nutné do operačného systému nainštalovať niektoré knižnice. To platí aj pre MacOS.

Inštalácia jazyka Python a jeho knižníc v systéme OS Windows je pohodlnejšia s all-in-one distribúciou Anaconda1.

Kód Pythonu je možné zaznamenávať podobne ako pri R

  • v skriptovom súbore (ale s príponou .py) s výstupom v konzole, alebo
  • v dokumente R Markdown / Quarto,

pričom pred odoslaním prvého príkazu sa (automaticky alebo ručne) spustí funkcia reticulate::repl_python(), ktorá prepne interpreter jazyka R na interpreter jazyka Python (s úvodnou značkou >>> namiesto >). Prechod naspäť zabezpečí príkaz exit alebo quit (ručne či automaticky).

Rozhraním pre prístup ku objektom prostredí jedného či druhého jazyka sú objekty reticulate::py respektíve r.

```{python}
a = -4 + 5
print("a = ", a)
```
a =  1
```{r}
b <- reticulate::py$a * 3
cat("b = ", b)
```
b =  3
```{python}
r.b ** 2
```
9.0

Samozrejme načítaním balíku cez príkaz library(reticulate) odpadá nutnosť uvádzať príslušnosť objektu py.

10.2 Rozširujúce knižnice

Externé knižnice sú kolekciou modulov. Modul je spravidla súbor s príponou .py obsahujúci definované funkcie a iné objekty. Tie sa do aktuálneho prostredia načítajú buď jednotlivo (from NázovModulu import NázovObjektu) alebo s celým modulom/knižnicou (import NázovModulu alebo import NázovModulu as Alias).

Knižnice je potrebné do systému najprv nainštalovať (ak už nemáme kompletnú distribúciu Anaconda). To sa robí primárne

  • zo všeobecného repozitára Python Package Index (PyPI) pomocou inštalátora PIP (Package installer for Python) príkazom pip install NázovKnižnice,
  • z repozitáru anaconda (zameraného na data science) pomocou systému správy balíkov Conda príkazom conda install NázovKnižnice.

Oba príkazy sa zadávajú v termináli. Ich použitie v prostredí R uľahčuje príkaz reticulate::py_install("NázovKnižnice"), ktorý automaticky zvolí vhodnú metódu inštalácie knižnice (pre Windows je dostupná iba Conda).

Iné zdroje knižníc zahŕňajú repozitáre verzovacieho systému Git (napr. GitHub) či Linuxových distribúcií.

10.3 Základy jazyka

Pre Python je dostupné obrovské množstvo dokumentácie a tutoriálov v angličtine, trochu sa nájde i v češtine a ešte menej v slovenčine

Základné dátové štruktúry vstavané v aktuálnej verzii Python 3 sú podobné kontajneru list v R, líšia sa najmä možnosťou úpravy a spôsobom manipulácie:

  • list, napr. [2.3, 'reťazec', True]
  • tuple, (2.3, 'reťazec', True)
  • dictionary, {'položka1': 1.0, 3: False}
  • set, {1.0, False}

List (zoznam) je modifikovateľná dátová štruktúra bez názvov elementov, na ktorú sa odkazuje pointerom a menia sa “na mieste”.

a = [1,2,3]
b = a
a.append(4)
b
[1, 2, 3, 4]

Operátory + a * tu nemajú aritmetický význam.

a + [5,6]
[1, 2, 3, 4, 5, 6]
['abc',2] * 3
['abc', 2, 'abc', 2, 'abc', 2]

Výber prvkov sa deje pomocou hranatých zátvoriek [] a rozsahom od:do alebo od:do:krok (s možnosťou vynechania ktorejkoľvek z hodnôt od, do, krok).

a[0]
1
a[:2]  # alebo a[0:2]
[1, 2]
a[-2]
3
a[-2:]
[3, 4]
b = [1,2,3,4,5,6]
b[::2]  # s krokom 2
[1, 3, 5]

Tuple je nemodifikovateľný list, čiže na neho nefunguje ani metóda append. Umožňuje však operáciu rozbalenia.

a = (1, 2, 3)
x, y, z = a
x
1

Dictionary je niečo ako list s názvami elementov, nedefinuje však ich poradie (od verzie Python 3.7 aspoň zachováva) a tak sa nedajú vyberať či meniť indexom ale iba názvom.

a = {'prvok1': 1, 'key2': "value2"}
a['prvok1'] = 3
a
{'prvok1': 3, 'key2': 'value2'}

Set je niečo ako dictionary ale zbavený duplicít

a = {1,2,3,1}
a
{1, 2, 3}
a.add(1)
a
{1, 2, 3}

Má definované metódy pre množinové operácie ako napr. intersection(), issubset() či union().

Elementy dátových štruktúr majú svoj dátový typ, najmä bool, complex, float, int alebo str.

Z riadiacich štruktúr (control flow) spomeňme vetvenie príkazov if-else

vek = 20

if vek < 5:
    cena_lístka = 6
elif vek < 16:
    cena_lístka = 8
else:
    cena_lístka = 10

# alebo:
# cena_listka = 6 if vek < 5 else (8 if vek < 16 else 10)

print(f"Cena je {cena_lístka}€ za lístok.")
Cena je 10€ za lístok.

a for cyklus.

suma = 0
for i in range(10):
    suma += i

suma
45

Funkcia sa definuje buď ako pomenovaná

def spočítaj(a, b):
    return a + b
spočítaj(2, 3)
5

alebo anonymná (tzv. lambda funkcia).

(lambda a, b: a+b)(2,3)
5

Prirodzene, funkciu je možné postupne aplikovať na viac hodnôt argumentu aj bez použitia for cyklu.

res = map(spočítaj, [10,20,30], list(range(1,4)))
list(res)
[11, 22, 33]

10.4 Pole rovnakého dátového typu (NumPy)

Pri aplikovaní aritmetických operátorov a matematických funkcií je efektívnejšie využiť vstavanú vektorizáciu, ktorú poskytuje externá knižnica NumPy ku svojej dátovej štruktúre – n-rozmernému poľu n-d array – prostredníctvom tzv. univerzálnych funkcií ufunc.

Pole knižnice NumPy sa vytvára niekoľkými spôsobmi, najčastejšie a) konverziou zoznamu (array), b) ako špeciálne pole (zeros, ones, empty), c) z postupnosti (arange, linspace), d) spojením viacerých polí (concatenate, vstack, hstack), e) rozdelením jedného (hsplit, vsplit), alebo f) zmenou rozmeru (reshape, transpose, .T). Rozmery poľa sa nazývajú osi (axes).

import numpy as np

a = np.arange(6)
b = np.array([6,5,4,3,2,1])
c = np.reshape(a, (2,3))
d = np.ones((2,1))

print(a)
[0 1 2 3 4 5]
print(b)
[6 5 4 3 2 1]
print(c)
[[0 1 2]
 [3 4 5]]
print(d)
[[1.]
 [1.]]
np.concatenate((c, d), axis=1)
array([[0., 1., 2., 1.],
       [3., 4., 5., 1.]])

Výber prvkov je podobný ako pri zozname, ba umožňuje zvoliť indexy aj individuálne (nielen postupnosť) či ako logické hodnoty.

print(a[-2:])
[4 5]
print(b[[1,3]])
[5 3]
print(c[c < 4])
[0 1 2 3]

Matematické (a štatistické) operácie na elementoch poľa sú s NumPy jednoduchšie i rýchlejšie.

print(a + 2)
[2 3 4 5 6 7]
print(a * b)
[0 5 8 9 8 5]
np.sum(a)  # alebo a.sum()
15

Viac informácií a názorných príkladov je v manuáli pre začiatočníkov.

10.5 Analýza údajov (Pandas)

Operácie s poliami sú rýchle a pohodlné pre údaje rovnakého typu, ale pre (štatistickú) analýzu rôznorodých údajov je použitie ndarrays nepraktické. Na tento účel (čistenie, transformácia a analýza údajov) slúži knižnica Pandas, ktorá (nad NumPy poľom) definuje tri nové dátové štruktúry:

  • Series, 1D pole rovnakého dátového typu (homogénne), analógia vektoru v R
  • DataFrame, 2D heterogénne pole, kontajner na “série”
  • Panel, 3D, kontajner na dátové rámce.

Vďaka Pandas je práca so štatistickými dátami podobne jednoduchá ako v Rku, pretože sprístupňuje bohatú funkcionalitu ekosystému knižníc postavených na NumPy, a to najmä SciPy, Scikit-Learn, Matplotlib a Seaborn.


  1. Anaconda je súhrn vyše 250 balíkov a systému ich manažmentu pre jazyky Python a R v oblasti vedeckých výpočtov (data science, strojové učenie, …). Na disku zaberá cca 4 GB miesta. Miniconda približne 0.5 GB.↩︎