<jupyter_start><jupyter_text>Balíček ``pandas``Pri práci s dátami vie byť veľmi užitočný balíček ```pandas```. Umožňuje načítať dáta z rôznych typov súborov, z databáz, komfortným spôsobom s nimi pracovať, vypočítať z nich základné štatistické ukazovatele, rýchlo zobraziť jednoduché grafy a pod. Dátové rámceZákladným dátovým typom v balíčku ``pandas`` sú dátové rámce – v podstate sú to tabuľky, kde stĺpce obsahujú určité pomenované atribúty a riadky zodpovedajú jednotlivým dátovým záznamom. Ak máme určité dáta s atribútmi ``attr1, attr2, attr3``, vieme dátový rámec vytvoriť nasledovným spôsobom:<jupyter_code>import pandas as pd

df = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], columns=["attr1", "attr2", "attr3"])
print(df)<jupyter_output>attr1  attr2  attr3
0      1      2      3
1      4      5      6
2      7      8      9<jupyter_text>Z dátového rámca vieme ľahko vybrať niektoré stĺpce:<jupyter_code>a = df["attr1"]
print(a)
b = df[["attr2", "attr3"]]
print('df[["attr2", "attr3"]] = \n{}'.format(b))<jupyter_output>df[["attr2", "attr3"]] = 
   attr2  attr3
0      2      3
1      5      6
2      8      9<jupyter_text>Nové stĺpce je možné doplniť tak, že ich adresujeme a priradíme do nich nejaký výraz:<jupyter_code>df["attr4"] = df["attr2"] + df["attr3"]
print(df)<jupyter_output>attr1  attr2  attr3  attr4
0      1      2      3      5
1      4      5      6     11
2      7      8      9     17<jupyter_text>Zoznam všetkých stĺpcov získame pomocou:<jupyter_code>cols = df.columns
print(cols)<jupyter_output>Index(['attr1', 'attr2', 'attr3', 'attr4'], dtype='object')<jupyter_text>Ak chceme vybrať stĺpec podľa číselného indexu:<jupyter_code>a = df.iloc[:, 1]
print(a)<jupyter_output>0    2
1    5
2    8
Name: attr2, dtype: int64<jupyter_text>Alebo zvoliť len niektoré riadky:<jupyter_code>a = df.iloc[1:3]
print(a)<jupyter_output>attr1  attr2  attr3  attr4
1      4      5      6     11
2      7      8      9     17<jupyter_text>Použitím vlastnosti ``.values`` vieme z dátového rámca získať dáta v podobe klasického ``numpy`` poľa:<jupyter_code>print(df.values)<jupyter_output>[[ 1  2  3  5]
 [ 4  5  6 11]
 [ 7  8  9 17]]<jupyter_text>Načítanie dát z csv súboruCSV súbory sú jednoduché textové súbory obsahujúce dáta oddelené čiarkami, napr.:```5.1,3.5,1.4,0.2,setosa7.0,3.2,4.7,1.4,versicolor6.7,3.1,5.6,2.4,virginica```V balíčku ```pandas``` sa dá na ich načítanie použiť funkcia ```read_csv```:<jupyter_code>import pandas as pd
df = pd.read_csv('data/iris.csv')
df.head()<jupyter_output><empty_output><jupyter_text>Táto funkcia má zopár parametrov, ktoré treba správne nastaviť – napr. nastaviť ``sep=';'`` ak nie sú dáta oddelené čiarkami, ale bodkočiarkami alebo nastaviť ``header=False`` ak ``pandas`` nedeteguje správne, že CSV súbor nemá hlavičku.  Prekódovanie kategorického atribútu na číselnýNiektoré metódy nevedia pracovať s kategorickými atribútmi (takými, ktoré nadobúdajú určitý konečný počet slovných hodnôt). V tom prípade treba také atribúty prekódovať na číselné. Je to možné urobiť napríklad pomocou triedy ``OrdinalEncoder``  z balíčka ``sklearn``:<jupyter_code>from sklearn.preprocessing import OrdinalEncoder
ordenc = OrdinalEncoder()

# funkcia fit_transform nastaví parametre transformátora
# na základe dát a zároveň navrátiť transformované dáta
df['species_num'] = ordenc.fit_transform(df[['species']])

# z výsledku si pre kontrolu zobrazíme zopár vzoriek
df[["species", "species_num"]].iloc[[0, 1, 50, 80, 100, 101]]<jupyter_output><empty_output><jupyter_text>Jednoduché štatistiky a grafyBalíček ```pandas``` umožňuje zobraziť aj jednoduché štatistiky a grafy. Keby sme napríklad chceli vedieť základné informácie o rozdelení hodnôt v prvom stĺpci, môžeme použiť funkciu ```describe```.<jupyter_code>print(df.iloc[:, 0].describe())<jupyter_output>count    150.000000
mean       5.843333
std        0.828066
min        4.300000
25%        5.100000
50%        5.800000
75%        6.400000
max        7.900000
Name: sepal length (cm), dtype: float64<jupyter_text>BoxplotAlebo si môžeme zobraziť ``boxplot``, ktorý nám dá podobnú informáciu v grafickej podobe:<jupyter_code>df.boxplot(column=df.columns[0])<jupyter_output><empty_output><jupyter_text>Porovnanie boxplot-ov medzi triedamiAk chceme porovnať boxplot-y jednotlivých tried:<jupyter_code>df.boxplot(column=df.columns[0], by='species')<jupyter_output><empty_output><jupyter_text>HistogramyObdobne jednoduché je zobraziť histogram hodnôt zo stĺpca:<jupyter_code>df[df.columns[0]].plot(bins=20, kind='hist')<jupyter_output><empty_output><jupyter_text>Porovnanie histogramov medzi triedamiAk chceme porovnať rozdelenie hodnôt naprieč triedami (```species```) môžeme použiť:<jupyter_code>df.hist(column=df.columns[0], by='species', bins=50,
        sharex=True, sharey=True, figsize=[10, 8])<jupyter_output><empty_output><jupyter_text>Aplikácia ľubovoľnej funkcie na celý stĺpecVyššie sme ukázali ako je možné vytvoriť nový stĺpec.V zásade vieme na prvky existujúceho stĺpca aplikovať ľubovoľnú funkciu a výsledok uložiť ako nový stĺpec. Povedzme, že by sme chceli určiť aký počet znakov majú jednotlivé textové reťazce v stĺpci ```species``` v našej dátovej množine:<jupyter_code># transformácia
df["len"] = df["species"].map(lambda x: len(x))

# zobrazíme si niekoľko vzoriek
df["len"].iloc[[0, 1, 50, 80, 100, 101]]<jupyter_output><empty_output><jupyter_text>Hromadné porovnávanie a indexovanie prvkovPodobne ako v poliach z balíčka ``numpy``, aj v dátových rámcoch je možné nájsť a indexovať záznamy, ktoré spĺňajú určitú podmienku. Napr. vyberieme len tie riadky, kde hodnota nultého stĺpca je väčšia než 5.<jupyter_code>a = df[df.iloc[:, 0] > 5]
a.head()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.10877192982456141, 'fraction_numerical': 0.043333333333333335, 'mean_word_length': 5.084311632870865, 'pattern_counts': {'":': 0, '<': 57, '<?xml version=': 0, '>': 58, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '16', 'dir': 'jupyter-structured-clean-dedup', 'id': '351410', 'license': 'BSD-3-Clause', 'n_tokens_mistral': 2663, 'n_tokens_neox': 2555, 'n_words': 582, 'path': 'SK/p7_pandas.ipynb', 'repo_name': 'michalgregor/ai1_python_intro', 'size': '5700'}