51 Tehted seeriatega
Pandase üheks eeliseks Pythoni ees on selle võimekus teha tehteid otse seeriate peal, sest kasutatakse lisaks ka NumPy moodulit (vaata lisaks NumPy materjali), mille tulemusel ei pea kasutama näiteks seeriate liitmisel tsükleid. Oletame, et tahame teha kahe või enama seeria väärtuste vahel järgnevaid tehteid: liitmine, lahutamine, korrutamine, korrutamine konstandiga, jagamine, astendamine. Kui Pythonis peab selliste tehete tegemiseks looma tsükli, siis Pandase puhul pole tsükleid vaja. Vaatame näidet, kus liidame igale seeria väärtusele juurde 10. Loome seeria jaoks sõnastiku, kus võtmeks on võistleja ID ja väärtuseks on võistleja punktid.
voistlejad_sonastik = {'MM12': 34, 'MM34': 56, 'MM55': 66} voistlejad_seeria = pd.Series(voistlejad_sonastik)
Lisame võistlejate teenitud punktidele juurde veel 10 punkti.
voistlejad_sonastik = {'MM12': 34, 'MM34': 56, 'MM55': 66} voistlejad_seeria = pd.Series(voistlejad_sonastik) pluss_10 = voistlejad_seeria + 10 print(pluss_10)
>>> %Run guido.py MM12 44 MM34 66 MM55 76 dtype: int64
Samuti on võimalik omavahel liita seeriad. Oluline on meeles pidada seda, et kui kasutatakse silte, siis need sildid peavad olema samad mõlemas seerias. Teeme näite, kus soovime liita kaks seeriat, kuid kõik kasutatavad sildid ei ole mõlemas seerias samad.
sonastik_a = {'MR10': 34, 'MM34': 56, 'MM55': 66} sonastik_b = {'MM13': 34, 'MM34': 20, 'MM55': 30} seeria_a = pd.Series(sonastik_a) seeria_b = pd.Series(sonastik_b) seeria_ab = seeria_a + seeria_b print(seeria_ab)
>>> %Run guido.py MM13 NaN MM34 76.0 MM55 96.0 MR10 NaN dtype: float64
Näeme, et nende sildide väärtused, mis ei olnud samad, on NaN
(not a number), mis tähendab sisuliselt, et tegemist on puuduva väärtusega. Kui mõlema seeria sildid on samad, siis liidetakse siltidele vastavad väärtused.
sonastik_a = {'MM13': 34, 'MM34': 56, 'MM55': 66} sonastik_b = {'MM13': 34, 'MM34': 20, 'MM55': 30} seeria_a = pd.Series(sonastik_a) seeria_b = pd.Series(sonastik_b) seeria_ab = seeria_a + seeria_b print(seeria_ab)
>>> %Run guido.py MM13 68 MM34 76 MM55 96 dtype: int64
Sarnaselt saab seeriad omavahel lahutada, korrutada, jagada ja astendada.
Vaatame veidi keerulisemat olukorda. Olgu meil seeria, kus on inimeste kehakaalud kilogrammides ja seeria, kus on samade inimeste pikkused meetrites. Tahame arvutada nende seeriate põhjal inimeste kehamassiindeksi (KMI). KMI leidmiseks jagatakse kehakaal pikkuse ruuduga (KMI = kehakaal / pikkus**2
).
sonastik_kaal = {'Madis': 66.4, 'Kristi': 54.0, 'Ott': 92.3} sonastik_pikkus = {'Madis': 1.81, 'Kristi': 1.69, 'Ott': 1.95} kaal = pd.Series(sonastik_kaal) pikkus = pd.Series(sonastik_pikkus) KMI = kaal / pikkus**2 print(KMI.round(1)) # Ümardamine 1 koht pärast koma
>>> %Run guido.py Madis 20.3 Kristi 18.9 Ott 24.3 dtype: float64
Nüüd aga vaatame olukorda, kus me tahame leida seeriast kõik väärtused, mis vastavad meie seatud tingimustele. Näiteks soovime leida eelmises näiteks kõik need KMI väärtused, mis jäävad alla normpiiri (normaalne KMI on vahemikus 19 – 25). Me saame tingimusavaldist kasutada otse seeria peal, kirjutades avaldise nurksulgude vahele pärast seeria muutujanime. Siin on aga oluline, et avaldises esineks seeria muutujanimi.
sonastik_kaal = {'Madis': 66.4, 'Kristi': 54.0, 'Ott': 92.3} sonastik_pikkus = {'Madis': 1.81, 'Kristi': 1.69, 'Ott': 1.95} kaal = pd.Series(sonastik_kaal) pikkus = pd.Series(sonastik_pikkus) KMI = kaal / pikkus**2 print(KMI[KMI <= 19])
>>> %Run guido.py Kristi 18.906901 dtype: float64
Sarnaselt saab kasutada ka teisi tingimusavaldiste operaatoreid (==
, >
, >=
, <
, !=
).