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

MOOC Programmeerimise alused II 2022/23 kevad

  • Kursuse info
  • 1. Kahemõõtmeline järjend
  • 2. Kahekordne tsükkel

2.1 Järjend ja tsükkel 2.2 Järjend ja funktsioon 2.3 Reaalsete andmete kasutamine 2.4 Silmaring: Juhuslikkus

  • 3. Andmestruktuurid
  • 4. Viitamine ja muteerimine
  • 5. Testimine ja silumine. Rekursioon
  • 6. Rekursioon II
  • Korraldajad
II OSA sisukord

2.3 REAALSETE ANDMETE KASUTAMINE

Andmed failist

Seni oleme tegutsenud kahemõõtmeliste järjenditega, mille elemendid kirjutasime programmiteksti sisse, näiteks:

tabel = [[1, 2, 4], [-1, 5, 0]]

või käsureale, kui funktsiooni rakendasime, näiteks:

>>> on_bingo_tabel([[1, 30, 34, 55, 75], [10, 16, 40, 50, 67], [5, 20, 38, 48, 61], [4, 26, 43, 49, 70], [15, 17, 33, 51, 66]])

Vähegi suuremate mahtude juures on see ebamugav ja praktikas ka tihti võimatu, sest tahame sama programmi abil töödelda palju erinevaid andmeid. Failist lugemist käsitlesime eelmisel kursusel, aga nüüd vaatame, kuidas failist andmed mugavalt kahemõõtmelisse järjendisse saada.

Olgu näiteks õpilaste saadud (täisarvulised) punktid iga õpilase korral failis eraldi ridadel tühikutega eraldatult. Näiteks:

1 4 5
3 6 8
2 4 8
10 5 0


Kahemõõtmelisse järjendisse saab need andmed aga näiteks nii:

punktide_tabel = []

for rida in fail:  # iga rea jaoks failist
    op_punktid = []  # kogume ühe õpilase punkte
    osad = rida.split() # tühikute kohalt osadeks
    for osa in osad:  # osade kaupa
        op_punktid.append(int(osa)) # järjekordsed punktid juurde 

    punktide_tabel.append(op_punktid) # õpilase punktide järjend juurde


Eelmises näites olid ühel real olevad andmed eraldatud tühikutega. Ajalooliselt on eraldajaks olnud ka näiteks koma. Sellest tuleb ka lühend CSV - ingl Comma-separated values. Tegelikult ei pruugi koma alati hästi eraldajaks sobida, kuna võib andmetes tähendada midagi muud, näiteks komadega arve. Levinumad eraldajad on tabulatsioonimärk "\t" ja semikoolon. Ka meie edasistes näidetes on eraldajaks just semikoolon.

Reaalsete andmete kasutamine

Väga palju andmeid elust enesest on tegelikult täiesti vabalt kättesaadavad ja kasutatavad. Eesti kohta leiab huvitavaid andmeid näiteks statistikaameti veebilehelt. Haridusteemalisi andmeid saab Haridussilmast.

Näiteks leidub statistikaameti kodulehel andmeid Eesti rahvastiku soolisest koossesisust erinevates vanuserühmades.

Selle tabeli põhjal saaks lahendada erinevaid ülesandeid. Näiteks saab leida:

  • mis vanuses elanikke on kõige rohkem,
  • mis vanuserühmas on meeste ja naiste arvuline erinevus kõige suurem,
  • teatud vanuserühma elanike arvu.

Haridussilmast võiksime leida näiteks nelja ülikooli vilistlaste keskmised palgad erialade kaupa. Haridussilmast saab andmeid alla laadida peamiselt (Exceli) xls-formaadis, kuid paludel andmetabelitel on võimalus ka csv-formaadis salvestada.

Järgmise näite puhul püüame teada saada, mis aastatel on Tartu elanike arv kasvanud. Statistikaameti veebilehelt saab Tartu elanike arvud kätte järgmiste valikutega: Avasta statistikat -> Andmebaas -> Rahvastik -> Rahvastikunäitajad ja koosseis -> Rahvaarv ja rahvastiku koosseis -> RV0221U: RAHVASTIK SOO, VANUSERÜHMA JA MAAKONNA JÄRGI, 1. JAANUAR'' (otselink tervele tabelile).

Andmete salvestamisel on võimalik valida, mis kujul me neid faili tahame. Hetkel on sobiv Semikoolonitega eraldatud pealkirjata fail (.csv). Nii saame faili RV0221U.csv, mille esimenesed kaks rida on

"Aasta";"Maakond";"Sugu";"Vanuserühmad kokku"
"2018";"..Tartu linn";"Mehed ja naised";76795

Näeme, et meid eriti huvitavad andmed on mõnevõrra erineval kujul - aastaarvul on jutumärgid ümber ja elanike arvul mitte. Kui nüüd eeltoodud moel fail sisse lugeda ja rida osadeks jaotada, siis saame, et osad[0] on sõne ""2018"" ja osad[3] on sõne "76795". Meie tahame neid mõlemaid täisarvudena, mida annab funktsioon int. Küll aga tuleb ""2018"" puhul arvu ümbert sõnesisesed jutumärgid eemaldada, mida saame teha funktsiooni strip abil: osad[0].strip('"').

Järgmises programmis paneme saadud andmed järjendisse nii, et ühes reas (andmed[0]) on kõik aastaarvud ja teises (andmed[1]) kõik elanike arvud. Failis olid erinevate aastate andmed erinevatel ridadel.

fail = open("RV0221U.csv", encoding="UTF-8-SIG")
fail_järjend = fail.readlines()
andmed = [[], []]
for i in range(1, len(fail_järjend)):  # loeme ridahaaval, jätame välja pealkirja rea
    osad = fail_järjend[i].strip().split(";")  # semikoolonitega eraldatud sõne järjendiks
    andmed[0].append(int(osad[0].strip('"')))
    andmed[1].append(int(osad[3]))
fail.close()

Kui nüüd tahame leida aastad, mil elanike arv kasvas, siis võrdleme iga aasta korral, kas järgmise aasta elanike arv on suurem. Kuna andmed on 1. jaanuari seisuga, siis täpselt ühe aasta kaupa muudatusi saamegi nii jälgida.

for i in range(len(andmed[0]) - 1):
    if andmed[1][i + 1] > andmed[1][i]: 
        print(andmed[0][i])

Siin on oluline, et tsükkel lõpeb eelviimase elemendiga, sest viimasel elemendil poleks järgmist (andmed[1][i + 1]), millega võrrelda.

Kuna CSV-failidega tegutsemist ja andmeteanalüüsimist võib ikka ette tulla, siis on selleks tarbeks olemas spetsiaalne Pythoni moodul, mille nimi Pandas, millega võite huvi korral ise tutvuda. Tegemist ei ole Pythoni standardmooduliga, mille kasutamine tuleb mooduli installeerida ja programmi alguses näidata import pandas as pd abil. Tegemist on mahuka mooduliga, mida me sellel kursusel ei käsitle.


II 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.
Courses’i keskkonna kasutustingimused