49 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 (==, >, >=, <, !=).

Litsents

Icon for the Creative Commons Attribution 4.0 International License

Tarkvaraarendus. 2. trükk on loodud Eno Tõnisson, Tauno Palts, Kaarel Tõnisson, Heidi Meier, Merilin Säde, ja Säde Mai Krusberg jt poolt Creative Commons Attribution 4.0 International License litsentsi alusel, kui pole teisiti märgitud.

Jaga seda raamatut