Arvutiteaduse instituut
  1. Kursused
  2. 2017/18 kevad
  3. Programmeerimise alused II (LTAT.TK.001)
EN
Logi sisse

Programmeerimise alused II 2017/18 kevad

  • Kursuse info
  • 1. Kahemõõtmeline järjend
  • 2. Kahekordne tsükkel
  • 3. Andmestruktuurid
  • 4. Viitamine ja muteerimine
  • 5. Testimine ja silumine. Rekursioon
  • 6. Rekursioon II
  • Korraldajad
V OSA sisukord

5.5 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.

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:

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')

V OSA sisukord
  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Tartu Ülikooli arvutiteaduse instituudi kursuste läbiviimist toetavad järgmised programmid:
euroopa sotsiaalfondi logo