TEATRIKÜLASTUSTE NÄIDE
Sissejuhatus
Eelmises peatükis tutvustati pandase põhilisi andmestruktuure - seeriat (Series
) ja andmefreimi (DataFrame
). Nüüd tegutseme andmefreimi abil põhjalikumalt tegelike andmetega. Kui siin on vaatluse all teatrikülastused, siis ülesanne tuleb raamatukogude kohta.
Senini oleme vaadanud olukordi, kus me defineerime mõnes teises andmestruktuuris asuvate algandmete järgi andmefreimi (DataFrame
). Selleks, et säästa end andmete ümberkirjutamisest, saab andmeid ka otse failist andmefreimi (DataFrame
) laadida.
Siin näete lühikest videot sellest, kuidas andmeid statistikaametist alla laadida ning neid töödelda.
Andmete saamine failist
Kasutades andmetöötluseks Pythoni moodulit pandas, saab andmed lihtsalt sisse lugeda näiteks csv-failist. Võtame näiteks faili KU086.csv, mille sisu näeb tavalise tekstiredaktoriga (nt notepad) avades välja selline:
;2010;2011;2012;2013;2014;2015;2016 Teatrite arv;29;34;41;41;37;49;46 Lavastused;417;464;487;490;511;550;540 ..uuslavastused;173;190;203;186;196;216;196 Etendused;4593;5012;5678;5803;6010;6434;6573 Vaatajad, tuhat;899.9;1008.3;1143.0;1090.7;1047.1;1146.6;1186.0 Teatrisk�igud 1000 elaniku kohta;671.5;752.5;864.1;827.5;796.6;872.2;901.4
Ärgem laskem end hetkel segada moondunud ä-tähest. Hiljem tegeleme ka sellega.
import pandas as pd andmed = pd.read_csv('KU086s.csv', delimiter=';') print(andmed)
Muutuja delimiter
väärtus näitab, milline eraldaja on andmeid sisaldavas failis määratud, antud juhul on tegemist semikooloniga. Seda, missugust eraldajat kasutatakse, saab näiteks statistikaameti andmebaasis valida andmete salvestamisel, kuid vajadusel võib andmefaili teisele kujule ka ümber teisendada.
Funktsiooni read_csv
kasutamisel on veel mitmeid muid parameetreid, mida võib vaja minna. Nendega saab lähemalt tutvuda siin.
Saame väljundiks:
2010 2011 2012 2013 2014 \ 0 Teatrite arv 29.0 34.0 41.0 41.0 37.0 1 Lavastused 417.0 464.0 487.0 490.0 511.0 2 ..uuslavastused 173.0 190.0 203.0 186.0 196.0 3 Etendused 4593.0 5012.0 5678.0 5803.0 6010.0 4 Vaatajad, tuhat 899.9 1008.3 1143.0 1090.7 1047.1 5 Teatrisk�igud 1000 elaniku kohta 671.5 752.5 864.1 827.5 796.6 2015 2016 0 49.0 46.0 1 550.0 540.0 2 216.0 196.0 3 6434.0 6573.0 4 1146.6 1186.0 5 872.2 901.4
Tutvumine andmetega
Püüame täpsemalt tutvuda meie poolt sisse loetud tabeliga. Kuna sisseloetud tabel on meil nüüd DataFrame
-kujul, siis saame kasutada pakutavaid pandase võimalusi. Püüame näiteks teada saada, mitu veergu ja rida on tabelis.
Tunnus DataFrame.shape
annab andmefreimi mõõtmed:
print(andmed.shape) (6, 8)
# Nii saab teada, mitu veergu meil tabelis on. # Veergude arv asub tunnuse shape väljundi teisel positsioonil print("Tabelis on ", andmed.shape[1], " veergu.") Tabelis on 8 veergu. ---------------------------------- # Veergude pealkirjad print(andmed.columns) Index([' ', '2010', '2011', '2012', '2013', '2014', '2015', '2016'], dtype='object') ---------------------------------- # Nii saab teada, mitu rida meil tabelis on: # Ridade arv asub tunnuse shape väljundi esimesel positsioonil print("Tabelis on ", andmed.shape[0], " rida.") Tabelis on 6 rida. ---------------------------------- # Prindime 2 esimest rida print(andmed.head(2)) 2010 2011 2012 2013 2014 2015 2016 0 Teatrite arv 29.0 34.0 41.0 41.0 37.0 49.0 46.0 1 Lavastused 417.0 464.0 487.0 490.0 511.0 550.0 540.0 ---------------------------------- # Prindime 2 viimast rida print(andmed.tail(2)) 2010 2011 2012 2013 2014 \ 4 Vaatajad, tuhat 899.9 1008.3 1143.0 1090.7 1047.1 5 Teatrisk�igud 1000 elaniku kohta 671.5 752.5 864.1 827.5 796.6 2015 2016 4 1146.6 1186.0 5 872.2 901.4
Andmete töötlemise funktsioonid
Näeme, et hetkel on eraldi veerud siltidega ja veerg, mille väärtused võiksid tegelikult siltidena kasutuses olla.
![](https://courses.cs.ut.ee/2024/programmeerimine/fall/Main/Teatrikulastus?action=download&upname=seletus.jpg)
Muudame soovitud veeru siltide veeruks. Veergude pealkirjade järjendist näeme, et see veerg on pealkirjaga " ".
andmed = andmed.set_index(' ') # Prindime 5 esimest tabeli rida, et kontrollida. print(andmed.head()) 2010 2011 2012 2013 2014 2015 2016 Teatrite arv 29.0 34.0 41.0 41.0 37.0 49.0 46.0 Lavastused 417.0 464.0 487.0 490.0 511.0 550.0 540.0 ..uuslavastused 173.0 190.0 203.0 186.0 196.0 216.0 196.0 Etendused 4593.0 5012.0 5678.0 5803.0 6010.0 6434.0 6573.0 Vaatajad, tuhat 899.9 1008.3 1143.0 1090.7 1047.1 1146.6 1186.0
Sama tulemuse saaksime ka andmete sisselugemisel parameetrit index_col
kasutades.
andmed = pd.read_csv('KU086s.csv', delimiter=';', index_col=' ')
Vahel on vaja lisada andmeid tabelisse juurde. Seda saab teha veergude või ridade lisamise abil. Lisame veeru, kus on arvud 1-6.
andmed['Uus veerg'] = [1, 2, 3, 4, 5, 6] print(andmed) 2010 2011 2012 2013 2014 \ Teatrite arv 29.0 34.0 41.0 41.0 37.0 Lavastused 417.0 464.0 487.0 490.0 511.0 ..uuslavastused 173.0 190.0 203.0 186.0 196.0 Etendused 4593.0 5012.0 5678.0 5803.0 6010.0 Vaatajad, tuhat 899.9 1008.3 1143.0 1090.7 1047.1 Teatrisk�igud 1000 elaniku kohta 671.5 752.5 864.1 827.5 796.6 2015 2016 Uus veerg Teatrite arv 49.0 46.0 1 Lavastused 550.0 540.0 2 ..uuslavastused 216.0 196.0 3 Etendused 6434.0 6573.0 4 Vaatajad, tuhat 1146.6 1186.0 5 Teatrisk�igud 1000 elaniku kohta 872.2 901.4 6
Kui on vaja lisada väärtused vastavatesse kindla sildiga ridadesse, saab seda teha uue seeria (Series
) loomise ning selle tabelisse lisamise abil.
andmed['Uus veerg'] = pd.Series([1,2,3,4,5,6], index = ['Lavastused', 'Teatrite arv', '..uuslavastused', 'Etendused', 'Vaatajad, tuhat', 'Teatrisk�igud 1000 elaniku kohta']) print(andmed) 2010 2011 2012 2013 2014 \ Teatrite arv 29.0 34.0 41.0 41.0 37.0 Lavastused 417.0 464.0 487.0 490.0 511.0 ..uuslavastused 173.0 190.0 203.0 186.0 196.0 Etendused 4593.0 5012.0 5678.0 5803.0 6010.0 Vaatajad, tuhat 899.9 1008.3 1143.0 1090.7 1047.1 Teatrisk�igud 1000 elaniku kohta 671.5 752.5 864.1 827.5 796.6 2015 2016 Uus veerg Teatrite arv 49.0 46.0 2 Lavastused 550.0 540.0 1 ..uuslavastused 216.0 196.0 3 Etendused 6434.0 6573.0 4 Vaatajad, tuhat 1146.6 1186.0 5 Teatrisk�igud 1000 elaniku kohta 872.2 901.4 6
Nüüd aga kustutame loodud veeru. Kasutame selleks 2 erinevat funktsiooni: drop()
ja pop()
.
pop()
# pop() funktsioon tagastab eemaldatud veeru, eemaldab veeru tabelist, ei vaja uuesti omistamist eemaldatud = andmed.pop('Uus veerg') print(eemaldatud) Teatrite arv 2 Lavastused 1 ..uuslavastused 3 Etendused 4 Vaatajad, tuhat 5 Teatrisk�igud 1000 elaniku kohta 6 Name: Uus veerg, dtype: int64
drop()
# drop() funktsioon tagastab uuendatud tabeli, milles on märgitud veerg eemaldatud, vajab uuesti omistamist, sest protseduuri tehakse tabeli koopia peal, veeru eemaldamiseks tuleb kasutada parameetrit axis=1 andmed = andmed.drop(['Uus veerg'], axis=1) print(andmed) 2010 2011 2012 2013 2014 \ Teatrite arv 29.0 34.0 41.0 41.0 37.0 Lavastused 417.0 464.0 487.0 490.0 511.0 ..uuslavastused 173.0 190.0 203.0 186.0 196.0 Etendused 4593.0 5012.0 5678.0 5803.0 6010.0 Vaatajad, tuhat 899.9 1008.3 1143.0 1090.7 1047.1 Teatrisk�igud 1000 elaniku kohta 671.5 752.5 864.1 827.5 796.6 2015 2016 Teatrite arv 49.0 46.0 Lavastused 550.0 540.0 ..uuslavastused 216.0 196.0 Etendused 6434.0 6573.0 Vaatajad, tuhat 1146.6 1186.0 Teatrisk�igud 1000 elaniku kohta 872.2 901.4
Proovime tabelist ka rea eemaldada. Teeme seda algul indeksipõhiselt ja seejärel eemaldame rea, mis vastab mingile määratud kriteeriumile.
drop()
andmed = andmed.drop(['Teatrite arv'], axis=0) print(andmed) 2010 2011 2012 2013 2014 \ Lavastused 417.0 464.0 487.0 490.0 511.0 ..uuslavastused 173.0 190.0 203.0 186.0 196.0 Etendused 4593.0 5012.0 5678.0 5803.0 6010.0 Vaatajad, tuhat 899.9 1008.3 1143.0 1090.7 1047.1 Teatrisk�igud 1000 elaniku kohta 671.5 752.5 864.1 827.5 796.6 2015 2016 Lavastused 550.0 540.0 ..uuslavastused 216.0 196.0 Etendused 6434.0 6573.0 Vaatajad, tuhat 1146.6 1186.0 Teatrisk�igud 1000 elaniku kohta 872.2 901.4
ix()
Eraldame uude andmefreimi vaid read, kus on 2012. aasta väärtused suuremad või võrdsed arvust 1000.
uus_andmefreim = andmed.ix[andmed['2012'] >= 1000] print(uus_andmefreim) 2010 2011 2012 2013 2014 2015 2016 Etendused 4593.0 5012.0 5678.0 5803.0 6010.0 6434.0 6573.0 Vaatajad, tuhat 899.9 1008.3 1143.0 1090.7 1047.1 1146.6 1186.0
Muudame indeksi Teatrisk�igud 1000 elaniku kohta
nimetust, et imeliku ä-tähe asendaja asemel päris ä-täht saada.
andmed = andmed.rename(index={'Teatrisk�igud 1000 elaniku kohta' : 'Teatriskäigud 1000 elaniku kohta'}) print(andmed.tail(1))
2010 2011 2012 2013 2014 2015 2016 Teatriskäigud 1000 elaniku kohta 671.5 752.5 864.1 827.5 796.6 872.2 901.4
Andmete kajastamine graafikul
Andmete põhjal saab graafiku teha mooduli matplotlib
abil. Moodul tuleb installide enne importimist. Sellega tegelesime eelmises peatükis.
# Impordime mooduli ja tekitame oma andmete kohta graafiku. import matplotlib.pyplot as plot # Transponeerime andmed, muudame veergude pealkirjad indeksiteks ja indeksid veergude pealkirjadeks. # Näitame graafikul, kuidas muutus aastate jooksul teatrite arv transponeeritud_andmed = andmed.T transponeeritud_andmed['Teatrite arv'].plot() plot.show()
Transponeeritud andmed:
0 1 2 3 4 \ Teatrite arv Lavastused ..uuslavastused Etendused Vaatajad, tuhat 2010 29 417 173 4593 899.9 2011 34 464 190 5012 1008.3 2012 41 487 203 5678 1143 2013 41 490 186 5803 1090.7 2014 37 511 196 6010 1047.1 2015 49 550 216 6434 1146.6 2016 46 540 196 6573 1186 5 Teatrisk�igud 1000 elaniku kohta 2010 671.5 2011 752.5 2012 864.1 2013 827.5 2014 796.6 2015 872.2 2016 901.4
Graafik:
![](https://courses.cs.ut.ee/2024/programmeerimine/fall/Main/Teatrikulastus?action=download&upname=graafik_teatritearv.jpg)
Andmete kirjutamine faili
Kui andmed on töödeldud, võib tekkida vajadus need uude faili kirjutada. Seda saab teha funktsiooni .to_csv
abil. Kirjutame muudetud andmed faili nimega uued_andmed.csv, kasutame eraldajana semikoolonit.
andmed.to_csv('uued_andmed.csv', sep=';', encoding='utf-8')