46 Seeria (Series)

Sageli on vaja analüüsida andmetabeli üht veergu. Selleks sobib kasutada Pandase seeriat ning kasutama ei pea selleks tsükleid. Seeria (Series) on ühemõõtmeline, sarnastest andmetest koosnev andmestruktuur. Seeriast võib mõelda kui ka veerust mingist tabelist.

Seeria loomine

Pandase seeriat on võimalik luua mitmel viisil. Näiteks võime kasutada selleks Pythoni ühemõõtmelist järjendit ja kasutada tuleb Pandase mooduli funktsiooni Series, mille argumendiks on järjend.

import pandas as pd

lst = [12, 45, 67, 8]
seeria = pd.Series(lst)

print(seeria)
>>> %Run guido.py
  0 12
  1 45
  2 67
  3 8
  dtype: int64

Näeme, et väljund on tabeli moodi. Nimelt koosneb Pandase väljund järgmistest osadest: siltide veerg, väärtuste veerg ja andmetüübi rida.

Indeksid Väärtused
0 12
1 45
2 67
3 8
dtype: int64 Andmetüüp

Samamoodi saab seeriat luua ka NumPy järjendiga (vaata NumPy materjal). Selleks installeerime ka NumPy mooduli ja impordime selle.

import pandas as pd
import numpy as np

lst = np.array([12, 45, 67, 8])
seeria = pd.Series(lst)

print(seeria)
>>> %Run guido.py
  0 12
  1 45
  2 67
  3 8
  dtype: int64

Tulemus on täpselt sama. Nii seeria kui järjendi puhul on konkreetsele elemendile lisatud indeks, mille järgi saab vajadusel elemendi kätte. Pythoni järjendis on elementidel indeksid 0, 1, 2, …, n, mida kasutaja ise määrata ei saa. Seeria puhul on saab lisaks indeksitele kasutada ka silte, mille kasutaja ise määrab (ingl label), kusjuures ei pruugi sildid olla alati järjestikused ja isegi mitte arvud. Loome seeria, kus siltideks on õpilaste nimed. Selleks määrame Series funktsiooni parameetri index väärtuseks vastava järjendi, mille elementideks on õpilaste nimed.

punktid = [67, 45, 71, 85]
õpilased = ['Guido', 'Mark', 'Tim', 'Bill']
seeria = pd.Series(punktid, index=õpilased)

print(seeria)
>>> %Run guido.py
  Guido	67
  Mark 	45
  Tim  	71
  Bill 	85
  dtype: int64

 !  Kuigi index parameetri nimi vihjaks, et tegemist oleks justkui indeksitega, siis nimetame seerias neid ikkagi siltideks, sest need ei ole programmeerimise terminoloogias indeksid, mis saavad olla ainult täisarvud.

Vastava õpilase nime kasutades saab ka väärtuse kätte. Seda saab teha samamoodi nagu järjendist vastava indeksiga väärtuse võtmist, kus indeks esitatakse järjendi nime järel nurksulgude vahel. Seeria puhul saab kasutada vastavat silti.

print(seeria['Tim'])
>>> %Run guido.py
  71

Vaadates eelnevat näidet võib seeria meenutada struktuuri poolest Pythoni sõnastikku, kus elemendid on võti-väärtus paarid. Seerias saame silte kasutada nagu sõnastikus võtmeid, millele vastab teatud väärtus. Seetõttu võimaldab Pandase moodul seeriat luua ka sõnastiku põhjal.  Loome sõnastiku, kus võtmeks on võistleja ID ja väärtuseks on võistleja nimi ning teeme sellest seeria, kasutades Series funktsiooni.

voistlejad_sonastik = {'MK12': 'Mari Karu', 'MK34': 'Joonas Saarmas', 'MK55': 'Kati Panda'}
voistlejad_seeria = pd.Series(voistlejad_sonastik)

print(voistlejad_seeria)
>>> %Run guido.py
  MK12     Mari Karu
  MK34	   Joonas Saarmas
  MK55     Kati Panda
  dtype: object

Sõnastikku tasub kasutada juhul, kui on soov andmeid võtmete ja väärtuste paaridena hoida ning pole vajadust edaspidise põhjalikuma andmete töötluse järele. Andmetöötluse jaoks sobib paremini seeria, sest sellel on rohkem funktsioone (aritmeetilised tehted, sorteerimine, filtreerimine jne). Tegevused toimuvad ka efektiivsemalt ning kood on lihtsam.

Vahel võib vaja minna kasutada seeria silte ja väärtusi eraldi, näiteks joonisel või kui on vaja neid täiesti eraldi kasutada. Selleks, et saaks kätte seeria silte, saab kasutada index funktsiooni. Väärtuse saamiseks tuleb kasutada aga values funktsiooni.

voistlejad_sonastik = {'MK12': 'Mari Karu', 'MK34': 'Joonas Saarmas', 'MK55': 'Kati Panda'}
voistlejad_seeria = pd.Series(voistlejad_sonastik)

print("Sildid: ", voistlejad_seeria.index)
print("Väärtused: ", voistlejad_seeria.values)
>>> %Run guido.py
  Sildid:  Index(['MK12', 'MK34', 'MK55'], dtype='object')
  Väärtused:  ['Mari Karu' 'Joonas Saarmas' 'Kati Panda']

Erandjuhuna saab seeria luua nii, et loomisel on lisatud vaid üks väärtus ja näiteks 4 silti. Sel juhul korratakse seda ühte väärtust 4 korda ning luuakse 4 sama väärtusega elementi.

import pandas as pd

seeria = pd.Series(7, index = [0, 2, 4, 6])
print(seeria)
>>> %Run guido.py
  0   7
  2   7
  4   7
  6   7
  dtype: int64

Järgmine tabel kirjeldab, mis tüüpi väärtused saab Series funktsiooni mõnedele parameetrile anda ja mida need tähendavad.

Parameeter Selgitus
data Andmed võivad olla sõnastiku, järjendi või konstandi (üks element) kujul. Näiteks pd.Series({'Mari': '12', 'Karmo': '15', 'Malle': '20', ...}) või pd.Series(['punane', 'kollane', 'sinine', ...]) või pd.Series('a', ...)
index Indeksite (ka siltide) järjend. Vaikimisi määratakse siltideks arvud 0, 1, 2,…, n-1, kus n on elementide arv parameetriga data lisatud andmestruktuuris.
dtype Andmete tüüp, mida seerias hoitakse. Vaikimisi tuvastatakse tüüp antud andmetest. Näiteks kui hoitakse seerias ujukomaarve, siis vaikimisi määratakse tüübiks float.
name Seeriale nime lisamine, nt name = 'Õpilased'. Sellest võib mõelda kui veeru pealkirjast.

Seeria andmetüübi muutmine

Näitena vaatame seeriat, milles hoitakse 1. klassi õpilaste arvusid klasside kaupa. Siltideks on klassid, mille arv peab olema võrdne andmestruktuuri elementide arvuga, kus hoitakse õpilaste arve. Olgu meil 4 erinevat klassi. Lisame seeriale ka nime parameetri name abil.

andmed = [24, 0, 21, 22]
klassid = ['1a', '1b', '1c', '1d']

opilaste_arv = pd.Series(andmed, index=klassid, name='1. klassi õpilaste arv')

print(opilaste_arv)
>>> %Run guido.py
  1a 24
  1b 0
  1c 21
  1d 22
  Name: 1. klassi õpilaste arv, dtype: int64

Andmete tüübiks on vaikimisi määratud int64, sest õpilaste arvude näol on tegemist täisarvudega.

Vajadusel saab seeria andmetüüpi määrata selle loomisel. Selleks tuleb Series funktsioonis lisada parameeter dtype, mille väärtuseks on vastav tüüp. Loome eelmises näites kasutatud seeria uuesti, kuid seekord määrame andmed ujukomaarvu tüüpi. Parameetri dtype väärtuseks tuleb anda sõnena ujukomaarvu tüüp ('float64').

andmed = [24, 0, 21, 22]
klassid = ['1a', '1b', '1c', '1d']

opilaste_arv = pd.Series(andmed, index=klassid, dtype='float64', name='1. klassi õpilaste arv')

print(opilaste_arv)
>>> %Run guido.py
  1a 24
  1b 0
  1c 21
  1d 22
  Name: 1. klassi õpilaste arv, dtype: float64

Näeme, et väljundis on andmetüüp ujukomaarv. Kui on vaja aga muuta olemasoleva seeria tüüpi, siis selleks saab kasutada funktsiooni astype, mille argumendiks on vastav tüüp. Muudame eelmise näites kasutatud seeria tõeväärtus tüüpi.

opilaste_arv = pd.Series(andmed, index=klassid, name='1. klassi õpilaste arv')
opilased_bool = opilaste_arv.astype(bool)

print(opilased_bool)
>>> %Run guido.py
  1a   True
  1b   False
  1c   True
  1d   True
  Name: 1. klassi õpilaste arv, dtype: bool

 !  Arv 0 on alati False, ülejäänud arvud on alati True.

Järgnevas tabelis on toodud mõned kõige tavalisemad Pandase andmetüübid.

Tüüp Tähendus
object Kõige üldisem andmetüüp, mida kasutatakse tavaliselt siis, kui andmed on segatüüpi, näiteks on nii arve kui ka teksti.
int64 Täisarvud
float64 Ujukomaarvud
datetime64 Kuupäevade ja kellaaegade tüüp
bool Tõeväärtustüüp
category Kategooriliste tunnuste väärtuste jaoks mõeldud tüüp. Kategoorilised tunnused võivad olla näiteks sugu, silmade värv ja 5-palli skaalal antud väärtused. Tegemist on sisuliselt sõnejärjendiga, milles on fikseeritud arv elemente.

Seeria suurus

Järgmisena vaatame mitu klassi on seerias, selleks kasutame size funktsiooni.

andmed = [24, 23, 21, 22, 28, 26, 30, 28, 31, 35, 33, 32, 29, 27, 25, 30, 26, 31, 22]
klassid = ['1a', '1b', '2a', '3a', '3b', '4a', '4b', '5a', '6a', '6b', '7a', '8a', '9a', '10 reaal', '10 sotsiaal', '11 reaal', '11 sotsiaal', '12 reaal', '12 sotsiaal']

opilaste_arv = pd.Series(andmed, index = klassid, name = 'Õpilaste arv klassis')

print(opilaste_arv.size)
>>> %Run guido.py
  19

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, Ago Luberg, Birgy Lorenz, Einar Kivisalu, Meelis Antoi, ja Säde Mai Krusberg poolt Creative Commons Attribution 4.0 International License litsentsi alusel, kui pole teisiti märgitud.

Jaga seda raamatut