49 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