Arvutiteaduse instituut
  1. Kursused
  2. 2025/26 sügis
  3. Programmeerimine (LTAT.SO.001)
EN
Logi sisse

Programmeerimine 2025/26 sügis

  • Pealeht
  • 1. Sissejuhatus
  • 2. Tingimuslause
  • 3. Tsükkel
  • 4. Järjend ja for-tsükkel
  • 5. Funktsioon
  • 6. Andmevahetus. Lihtne kasutajaliides
  • 7. Kahemõõtmeline järjend. Kahekordne tsükkel
  • 8. Kordamine 1. kontrolltööks?
  • 9. Kontrolltöö?
  • 10. Viitamine ja muteerimine
  • 11. Andmestruktuurid
  • 12. Rekursioon ja andmetöötlus
  • Projekti esitamine ja esitlused
  • 13. Objektorienteeritud programmeerimine
  • 14. Kordamine 2. kontrolltööks?
  • 15. Kontrolltöö 2?
  • Loengud
  • Moodle
  • Lahendus
  • Thonny paigaldamine
  • Thonny logide esitamine
  • Kiireksamist
  • Viited
< eelmine12. nädala sisukordjärgmine >

12.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 teater2.csv, mille sisu näeb tavalise tekstiredaktoriga (nt notepad) avades välja selline:

;2015;2016;2017;2018
Teatrite arv;49;46;47;58
Lavastused;550;540;559;582
..uuslavastused;216;196;204;211
Etendused;6434;6573;6713;6695
Vaatajad. tuhat;1146.6;1186;1164;1192
Teatriskäigud 1000 elaniku kohta;872.2;901.4;883.5;901.7

Ärgem laskem end hetkel segada moondunud ä-tähest. Hiljem tegeleme ka sellega.

import pandas as pd 
andmed = pd.read_csv('teater2.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:

                         Unnamed: 0    2015    2016    2017    2018
0                      Teatrite arv    49.0    46.0    47.0    58.0
1                        Lavastused   550.0   540.0   559.0   582.0
2                   ..uuslavastused   216.0   196.0   204.0   211.0
3                         Etendused  6434.0  6573.0  6713.0  6695.0
4                   Vaatajad. tuhat  1146.6  1186.0  1164.0  1192.0
5  Teatriskäigud 1000 elaniku kohta   872.2   901.4   883.5   901.7

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, 5)

# 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  5  veergu.

----------------------------------

# Veergude pealkirjad
print(andmed.columns)

Index(['Unnamed: 0', '2015', '2016', '2017', '2018'], 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))

     Unnamed: 0   2015   2016   2017   2018
0  Teatrite arv   49.0   46.0   47.0   58.0
1    Lavastused  550.0  540.0  559.0  582.0

----------------------------------

# Prindime 2 viimast rida
print(andmed.tail(2))

                         Unnamed: 0    2015    2016    2017    2018
4                   Vaatajad. tuhat  1146.6  1186.0  1164.0  1192.0
5  Teatriskäigud 1000 elaniku kohta   872.2   901.4   883.5   901.7

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 "Unnamed: 0".

andmed = andmed.set_index('Unnamed: 0')

# Prindime 5 esimest tabeli rida, et kontrollida.
print(andmed.head())

                  2015    2016    2017    2018
Unnamed: 0                                     
Teatrite arv       49.0    46.0    47.0    58.0
Lavastused        550.0   540.0   559.0   582.0
..uuslavastused   216.0   196.0   204.0   211.0
Etendused        6434.0  6573.0  6713.0  6695.0
Vaatajad. tuhat  1146.6  1186.0  1164.0  1192.0

Sama tulemuse saaksime ka andmete sisselugemisel parameetrit index_col kasutades.

andmed = pd.read_csv('teater2.csv', delimiter=';', index_col='Unnamed: 0')

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)

                                    2015    2016    2017    2018  Uus veerg
Teatrite arv                        49.0    46.0    47.0    58.0          1
Lavastused                         550.0   540.0   559.0   582.0          2
..uuslavastused                    216.0   196.0   204.0   211.0          3
Etendused                         6434.0  6573.0  6713.0  6695.0          4
Vaatajad. tuhat                   1146.6  1186.0  1164.0  1192.0          5
Teatriskäigud 1000 elaniku kohta   872.2   901.4   883.5   901.7          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)


                                    2015    2016    2017    2018  Uus veerg
Teatrite arv                        49.0    46.0    47.0    58.0          2
Lavastused                         550.0   540.0   559.0   582.0          1
..uuslavastused                    216.0   196.0   204.0   211.0          3
Etendused                         6434.0  6573.0  6713.0  6695.0          4
Vaatajad. tuhat                   1146.6  1186.0  1164.0  1192.0          5
Teatriskäigud 1000 elaniku kohta   872.2   901.4   883.5   901.7          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)

                                    2015    2016    2017    2018
Teatrite arv                        49.0    46.0    47.0    58.0
Lavastused                         550.0   540.0   559.0   582.0
..uuslavastused                    216.0   196.0   204.0   211.0
Etendused                         6434.0  6573.0  6713.0  6695.0
Vaatajad. tuhat                   1146.6  1186.0  1164.0  1192.0
Teatriskäigud 1000 elaniku kohta   872.2   901.4   883.5   901.7  

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)

                                    2015    2016    2017    2018
Lavastused                         550.0   540.0   559.0   582.0
..uuslavastused                    216.0   196.0   204.0   211.0
Etendused                         6434.0  6573.0  6713.0  6695.0
Vaatajad. tuhat                   1146.6  1186.0  1164.0  1192.0
Teatriskäigud 1000 elaniku kohta   872.2   901.4   883.5   901.7

loc()

Eraldame uude andmefreimi vaid read, kus on 2012. aasta väärtused suuremad või võrdsed arvust 1000.

uus_andmefreim = andmed.loc[andmed['2018'] >= 1000]
print(uus_andmefreim)

                   2015    2016    2017    2018
Etendused        6434.0  6573.0  6713.0  6695.0
Vaatajad. tuhat  1146.6  1186.0  1164.0  1192.0

Juhul, kui indeksi Teatrisk�igud 1000 elaniku kohta nimetuses oli ä-tähe asemel midagi muud, saame selle asemel päris ä-tähte panna.

andmed = andmed.rename(index={'Teatrisk�igud 1000 elaniku kohta' : 'Teatriskäigud 1000 elaniku kohta'})
print(andmed.tail(1))

                                   2015   2016   2017   2018
Teatriskäigud 1000 elaniku kohta  872.2  901.4  883.5  901.7  

Andmete kajastamine graafikul

Andmete põhjal saab graafiku teha mooduli matplotlib abil. Moodul tuleb installide enne importimist. Sellega tegelesime eelmises peatükis.

import pandas as pd
import matplotlib.pyplot as plt

# Loeme CSV nii, et esimene veerg ("Unnamed: 0") muutub indeksiks
andmed = pd.read_csv("teater2.csv", delimiter=';', index_col=0)

# Kontrollime andmete struktuuri
print(andmed.head())

# Transponeerime andmed (aastad muutuvad indeksiks, kategooriad veergudeks)
transponeeritud_andmed = andmed.T

# Kontrollime, kas "Teatrite arv" on indeksite seas
print(transponeeritud_andmed.index)

# Joonistame graafiku "Teatrite arv" andmetest
transponeeritud_andmed["Teatrite arv"].plot(kind='line', marker='o', linestyle='-')

# Lisame pealkirja ja sildid
plt.title('Teatrite arvu muutus ajas')
plt.xlabel('Aasta')
plt.ylabel('Teatrite arv')

# Kuvame graafiku
plt.show()

Graafik: Attach:teatrite_arv_2015_2018.png Δ

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

< eelmine12. nädala sisukordjärgmine >
  • 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.
Courses’i keskkonna kasutustingimused