<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Pandas bevezető
Ez a bevezető az Üzleti Intelligencia tárgy laborjához készült. A pandas könyvtárhoz kívánok egy rövid bevezetőt nyújtani. Az anyag folyamatosan bővül.
Angol nyelven kiváló erőforrásokat találhatsz
Step1:  A DataFrame elejét a .head függvénnyel, a végét a .tail-lel nézhetjük meg. Ennek akkor van jelentősége, ha nagy táblázatokkal dolgozunk.
Step2:  Alapértelmezetten 5 sort ír ki, de megadhatjuk paraméterként pontosan hány sort szeretnénk látni.
Step3:  Egyszerű navigálás a DataFrame-ben
Fontos megemlíteni, hogy minden művelet egy új DataFrame-mel tér vissza, beleértve a head és a tail függvényeket is, azonban ezek az új DataFrame-ek nem tényleges másolatok, hanem csak ún. slice-ok az eredetiből. A copy függénnyel tudunk másolatot készíteni.
A táblázat első oszlopa kitüntetett, ez a DataFrame indexe, ezzel tudjuk azonosítani a sorokat. Ugyan nem követelmény, hogy unikus legyen, de praktikus unikusra választani. Egynél több oszlopot is használhatunk indexként (multiindex).
Oszlopok kiválasztása
Lekérhetünk csak bizonyos oszlopokat, ekkor egy új DataFrame-et kapunk, ami a választott oszlopokat tartalmazza csak. Egy oszlopot a szögletes zárójelekkel tudunk indexelni.
Step4:  Amennyiben az oszlop neve nem tartalmaz szóközöket, attribútumként is elérjük.
Step5:  A kapott eredmény nem tűnik táblázatnak és valóban más típusú
Step6:  Amikor a dimenziók száma egyre csökken, Series objektumot kapunk vissza.
Egynél több oszlop kiválasztásánál dupla zárójelet kell használni.
Step7:  Valójában az [] operátor indexének típusa alapján dől el, hogy milyen típust kapunk vissza.
Egy oszlopból is készíthethünk DataFrame-et Series helyett, ha listaként kérdezzük le
Step8:  Sorok kiválasztása
A sorokat többféleképpen indexelhetjük
Step9:  Mivel egyetlen sort kértünk, megint Series objektumot kapunk.
Step10:  A Series egy egydimenziós adatsor, gondolhatunk rá úgy, mint a DataFrame egy sorára.
Indexelés sor szerint
Step11:  Oszlopok kiválasztása az iloc segítségével
Step12:  Tetszőleges sor és oszlop tartományok vagy kombinációk kiválasztása
Step13:  Egy sort vagy oszlopot többször is lekérdezhetünk, ráadásul akármilyen sorrendben.
Step14:  Egyetlen mező kiválasztása
Egy mező tartalmát sokféleképpen kiválaszthatjuk, talán így a legegyszerűbb
Step15:  Szűrés
A DataFrame-ek sorain egyszerre végezhetünk műveleteket
Step16:  Ekkor azokra a sorokra kapunk True-t, ahol igaz a feltétel. A feltételek kombinálhatóak, a zárójelezésre figyelni kell
Step17:  Az igazságértékek sorozatával pedig szűrhetjük a DataFrame-eket
Step18:  Vektoros műveletvégzés
A pandas DataFrame-jeire és Series-eire az aritmetikai operátorok túl vannak terhelve, ezért egyszerre végezhetünk az egész táblán műveleteket.
Step19:  Az index is hasonlóan manipulálható
Step20:  Át is állítható
Step21:  Majd visszaállítható
Step22:  Több DataFrame kezelése, merge
Step23:  Hány kreditet érnek a tárgyak, amikre jegyet kaptunk?
Step24:  A paraméterek magyarázata
Step25:  Érvénytelen adatok eldobása
Látható, hogy nem minden tárgyhoz sikerült megtalálni a kreditszámot, hiszen nem mindegyik szerepelt a credits táblában.
A pandas NaN (not a number) tölti fel a hiányzó mezőket. Szerencsére a legtöbb műveletnek megmondhatjuk, hogy hogyan bánjon a NaN-okkal. Meg is szabadulhatunk tőlük
Step26:  Szélsőérték-keresés (max, idxmax)
Sokszor vagyunk kíváncsiak arra, hogy mi egy oszlop maximuma/minimuma vagy éppen hol veszi fel ezt az értéket (argmax). A pandas tartalmaz erre beépített függvényeket.
DataFrame-re
Mi az egyes oszlopok maximuma?
Step27:  A max függvény egy Series-zel tér vissza, ami minden oszlop maximumát tartalmazza. Sorokra is felthetjük ugyanezt a kérdést, bár erre az adatra nem sok értelme van
Step28:  Hol veszi fel a maximumát?
Step29:  Indexelhetünk is a visszakapott értékekkel, így a legmagasabb értékeket tartalmazó sorokat kapjuk meg.
Step30:  A számadatot tartalmazó oszlopok közül megkaptuk, hogy melyik sornál veszi fel a maximális értéket. Holtverseny esetén a legelső előfordulást adja vissza.
Az idxmax függvény Series-re hasonlóan működik, csak az eredmény egyetlen skalár érték
Step31:  Csoportosítás (groupby)
A groupby függvénnyel tetszőleges oszlop mentén csoportosíthatjuk a DataFrame-et.
Step32:  Nem csak oszlop szerint tudunk csoportosítani, hanem tetszőleges kifejezés szerint.
Step33:  Eszerint groupby
Step34:  Csoportonként végezhetünk műveleteket
Step35:  Egynél több oszlop szerint is csoportosíthatunk, ekkor az olszopok értékeinek összes kombinációja (direkt szorzat) szerepelni fog az indexben.
A size függvénnyel az egyes csoportok elemeinek számát kérhetjük le.
Step36:  Ismét Series objektumot kaphatunk. A könnyebb olvashatóság kedvéért DataFrame-é konvertálhatjuk
Step37:  Rendezés
A DataFrame-eket többféleképpen rendezhetjük.
Index szerint rendezve
Step38:  Illetve egy vagy több oszlop szerint rendezve
Step39:  Fordított sorrendben
Step40:  Vizualizáció (plot)
A matplotlib modullal együttműködve rengeteg vizualizációs lehetőségünk van.
Step41:  Az oszlopdiagramnak több értelme lenne
Step42:  Nem adtuk meg az x tengelyt, ekkor automatikusan a DataFrame indexét használja, ami ebben az esetben a tárgyakat jelenti.
Ábrázolhatnánk félév szerint is egy scatter ploton.
<ASSISTANT_TASK:>
Python Code:
import pandas as pd  # konvenció szerint pd aliast használunk
%matplotlib inline
import matplotlib
import numpy as np
# tegyük szebbé a grafikonokat
matplotlib.style.use('ggplot')
matplotlib.pyplot.rcParams['figure.figsize'] = (15, 3)
matplotlib.pyplot.rcParams['font.family'] = 'sans-serif'
grades = pd.DataFrame(
    {
        'subject': ['analízis 1', 'digitális technika 1', 
                    'fizika 1', 'mikmak', 'programozás alapjai 1', 'szoftvertechonológia',
                   'bevezetés a számításelméletbe 1'],
        'grade': [3, 4, 3, 2, 5, 1, 4],
        'teacher': ['a', 'b', 'a', 'c', 'd', 'd', 'd'],
        'semester': [1, 1, 2, 2, 1, 3, 1],
    }
)
grades
Explanation: Pandas bevezető
Ez a bevezető az Üzleti Intelligencia tárgy laborjához készült. A pandas könyvtárhoz kívánok egy rövid bevezetőt nyújtani. Az anyag folyamatosan bővül.
Angol nyelven kiváló erőforrásokat találhatsz:
A hivatalos dokumentációhoz tartozó rövid bevezető: http://pandas.pydata.org/pandas-docs/stable/10min.html
Brandon Rhodes tutorialja a 2015-ös Pyconon (kicsit hosszabb, de megéri): https://www.youtube.com/watch?v=5JnMutdy6Fw
Mi az a pandas?
A pandas egy adatkezelő függvénykönyvtár, amit a Data Scientistek nagyon szeretnek. Az adatokat táblázatos formában kezeli. A táblázatoknak van fejlécük és indexük. Heterogén adatokat tárolhatunk: szöveges, számadat, igazságérték, dátum stb. Az adatok típusa egy oszlopon belül sem kell, hogy azonos legyen.
A pandas remekül együttműködik a Python gépi tanuló könyvtárával (scikit-learn) és a legelterjedtebb vizualizációs könyvtárakkal (matplotlib, seaborn).
End of explanation
grades.head()
Explanation: A DataFrame elejét a .head függvénnyel, a végét a .tail-lel nézhetjük meg. Ennek akkor van jelentősége, ha nagy táblázatokkal dolgozunk.
End of explanation
grades.tail(2)
Explanation: Alapértelmezetten 5 sort ír ki, de megadhatjuk paraméterként pontosan hány sort szeretnénk látni.
End of explanation
grades['teacher']
Explanation: Egyszerű navigálás a DataFrame-ben
Fontos megemlíteni, hogy minden művelet egy új DataFrame-mel tér vissza, beleértve a head és a tail függvényeket is, azonban ezek az új DataFrame-ek nem tényleges másolatok, hanem csak ún. slice-ok az eredetiből. A copy függénnyel tudunk másolatot készíteni.
A táblázat első oszlopa kitüntetett, ez a DataFrame indexe, ezzel tudjuk azonosítani a sorokat. Ugyan nem követelmény, hogy unikus legyen, de praktikus unikusra választani. Egynél több oszlopot is használhatunk indexként (multiindex).
Oszlopok kiválasztása
Lekérhetünk csak bizonyos oszlopokat, ekkor egy új DataFrame-et kapunk, ami a választott oszlopokat tartalmazza csak. Egy oszlopot a szögletes zárójelekkel tudunk indexelni.
End of explanation
grades.teacher
Explanation: Amennyiben az oszlop neve nem tartalmaz szóközöket, attribútumként is elérjük.
End of explanation
type(grades.teacher)
Explanation: A kapott eredmény nem tűnik táblázatnak és valóban más típusú
End of explanation
grades[['grade', 'teacher']]
Explanation: Amikor a dimenziók száma egyre csökken, Series objektumot kapunk vissza.
Egynél több oszlop kiválasztásánál dupla zárójelet kell használni.
End of explanation
print(type(grades[['grade']]))
grades[['grade']]
Explanation: Valójában az [] operátor indexének típusa alapján dől el, hogy milyen típust kapunk vissza.
Egy oszlopból is készíthethünk DataFrame-et Series helyett, ha listaként kérdezzük le:
End of explanation
grades = grades.set_index('subject')
grades
grades.loc['fizika 1']  # a loc után [] kell!
Explanation: Sorok kiválasztása
A sorokat többféleképpen indexelhetjük:
1. index szerint
2. sorszám szerint
Mielőtt index szerint kérdeznénk le egy sort, állítsuk át az indexet valami beszédesebbre.
End of explanation
type(grades.loc['fizika 1'])
Explanation: Mivel egyetlen sort kértünk, megint Series objektumot kapunk.
End of explanation
grades.iloc[1:3]  # utolsó index nincs benne, [1, 3)
Explanation: A Series egy egydimenziós adatsor, gondolhatunk rá úgy, mint a DataFrame egy sorára.
Indexelés sor szerint
End of explanation
grades.iloc[:, [0, 2]]
grades.iloc[:, 1:-1]
Explanation: Oszlopok kiválasztása az iloc segítségével
End of explanation
grades.iloc[1:5, 1:2]
Explanation: Tetszőleges sor és oszlop tartományok vagy kombinációk kiválasztása
End of explanation
grades.iloc[[4, 1, 1], [2, 1, 2]]
Explanation: Egy sort vagy oszlopot többször is lekérdezhetünk, ráadásul akármilyen sorrendben.
End of explanation
grades.loc['fizika 1', 'grade']
Explanation: Egyetlen mező kiválasztása
Egy mező tartalmát sokféleképpen kiválaszthatjuk, talán így a legegyszerűbb:
End of explanation
grades.semester == 1
Explanation: Szűrés
A DataFrame-ek sorain egyszerre végezhetünk műveleteket:
End of explanation
(grades.semester == 1) & (grades.teacher == 'a')
Explanation: Ekkor azokra a sorokra kapunk True-t, ahol igaz a feltétel. A feltételek kombinálhatóak, a zárójelezésre figyelni kell:
End of explanation
grades[grades.semester==1]
grades[(grades.semester == 1) & (grades.teacher == 'a')]
Explanation: Az igazságértékek sorozatával pedig szűrhetjük a DataFrame-eket:
End of explanation
grades[['grade', 'semester']] + 15
Explanation: Vektoros műveletvégzés
A pandas DataFrame-jeire és Series-eire az aritmetikai operátorok túl vannak terhelve, ezért egyszerre végezhetünk az egész táblán műveleteket.
End of explanation
grades.index.str.upper()
Explanation: Az index is hasonlóan manipulálható
End of explanation
grades.index = grades.index.str.upper()
grades
Explanation: Át is állítható:
End of explanation
grades.index = grades.index.str.lower()
grades
Explanation: Majd visszaállítható:
End of explanation
credits = pd.DataFrame(
    {
        'subject': ['analízis 1', 'fizika 1', 'programozás alapjai 2'],
        'credit': [7, 5, 5]
    }
)
credits
Explanation: Több DataFrame kezelése, merge
End of explanation
d = grades.merge(credits, left_index=True, right_on='subject', how='outer')
d
Explanation: Hány kreditet érnek a tárgyak, amikre jegyet kaptunk?
End of explanation
grades.merge(credits, left_index=True, right_on='subject', how='inner')
Explanation: A paraméterek magyarázata:
left_index: a baloldali DataFrame (grades ebben az esetben) indexe mentén joinoljon.
right_on: a jobboldali DataFrame (credits) subject mezője mentén joinoljon.
how: inner/outer. Egyezik az SQL-es joinnal.
A joinolni kívánt mező kétféle lehet:
index: ekkor az indexként használt oszlopot próbálja a másik táblázattal joinolni. left_index=True-ra kell állítani.
nem index: egy vagy több nem indexként használt oszlop mentén próbál meg joinolni. left_on=col1 vagy left_on=[col1, col2]
End of explanation
d = d.dropna()
d
Explanation: Érvénytelen adatok eldobása
Látható, hogy nem minden tárgyhoz sikerült megtalálni a kreditszámot, hiszen nem mindegyik szerepelt a credits táblában.
A pandas NaN (not a number) tölti fel a hiányzó mezőket. Szerencsére a legtöbb műveletnek megmondhatjuk, hogy hogyan bánjon a NaN-okkal. Meg is szabadulhatunk tőlük:
End of explanation
print(type(grades.max()))
grades.max()
Explanation: Szélsőérték-keresés (max, idxmax)
Sokszor vagyunk kíváncsiak arra, hogy mi egy oszlop maximuma/minimuma vagy éppen hol veszi fel ezt az értéket (argmax). A pandas tartalmaz erre beépített függvényeket.
DataFrame-re
Mi az egyes oszlopok maximuma?
End of explanation
grades.max(axis=1)
Explanation: A max függvény egy Series-zel tér vissza, ami minden oszlop maximumát tartalmazza. Sorokra is felthetjük ugyanezt a kérdést, bár erre az adatra nem sok értelme van:
End of explanation
# grades.idxmax()  # hibát kapunk, mert az egyik oszlop szöveges
grades[['grade', 'semester']].idxmax()
Explanation: Hol veszi fel a maximumát?
End of explanation
grades.loc[grades[['grade', 'semester']].idxmax()]
Explanation: Indexelhetünk is a visszakapott értékekkel, így a legmagasabb értékeket tartalmazó sorokat kapjuk meg.
End of explanation
grades.grade.idxmax()
Explanation: A számadatot tartalmazó oszlopok közül megkaptuk, hogy melyik sornál veszi fel a maximális értéket. Holtverseny esetén a legelső előfordulást adja vissza.
Az idxmax függvény Series-re hasonlóan működik, csak az eredmény egyetlen skalár érték:
End of explanation
g = credits.groupby('credit')
g.groups
Explanation: Csoportosítás (groupby)
A groupby függvénnyel tetszőleges oszlop mentén csoportosíthatjuk a DataFrame-et.
End of explanation
credits.credit % 3
Explanation: Nem csak oszlop szerint tudunk csoportosítani, hanem tetszőleges kifejezés szerint.
End of explanation
credits.groupby(credits.credit % 3)
Explanation: Eszerint groupby:
End of explanation
grades.groupby("semester").mean()
Explanation: Csoportonként végezhetünk műveleteket:
End of explanation
grades.groupby(["semester", "teacher"]).size()
Explanation: Egynél több oszlop szerint is csoportosíthatunk, ekkor az olszopok értékeinek összes kombinációja (direkt szorzat) szerepelni fog az indexben.
A size függvénnyel az egyes csoportok elemeinek számát kérhetjük le.
End of explanation
grades.groupby(["semester", "teacher"]).size().to_frame()
Explanation: Ismét Series objektumot kaphatunk. A könnyebb olvashatóság kedvéért DataFrame-é konvertálhatjuk:
End of explanation
grades.sort_index()
Explanation: Rendezés
A DataFrame-eket többféleképpen rendezhetjük.
Index szerint rendezve:
End of explanation
grades.sort_values(['grade', 'semester'])
Explanation: Illetve egy vagy több oszlop szerint rendezve:
End of explanation
grades.sort_index(ascending=False)
Explanation: Fordított sorrendben:
End of explanation
grades.plot(y='grade')
Explanation: Vizualizáció (plot)
A matplotlib modullal együttműködve rengeteg vizualizációs lehetőségünk van.
End of explanation
grades.plot(y='grade', kind='bar')
Explanation: Az oszlopdiagramnak több értelme lenne:
End of explanation
grades.plot(x='semester', y='grade', kind='scatter')
Explanation: Nem adtuk meg az x tengelyt, ekkor automatikusan a DataFrame indexét használja, ami ebben az esetben a tárgyakat jelenti.
Ábrázolhatnánk félév szerint is egy scatter ploton.
End of explanation
<END_TASK>