# Python koodi esimerkki
def hello_world():
print("Hello, World!")
hello_world()
Viikko 1
Ohjelmointi, komentorivi ja datan käyttö
Miksi ohjelmointia on hyvä ymmärtää?
Koodin ymmärtäminen auttaa hahmottamaan yhä teknisempää yhteiskuntaa. Yhteiskunta ja arkipäiväiset toiminnot digitalisoituvat jatkuvasti. Koodin perusteiden ymmärtäminen auttaa arvioimaan teknologian roolia ja vaikutuksia yhteiskunnassa.
Ohjelmointi on luova tapa ratkaista ongelmia ja tuoda omia ideoita käytäntöön. Koodin avulla voit kehittää uusia työkaluja, luoda vuorovaikutteisia kokemuksia ja vaikuttaa ympäristöösi uusin keinoin.
Kun ymmärrät koodia, sinulla on vapaus käyttää ja muokata avoimen lähdekoodin projekteja omiin tarpeisiisi. Tämä antaa mahdollisuuden rakentaa omaa osaamista ja riippumattomuutta kaupallisista ohjelmistoratkaisuista, sekä tukea yhteisöllisessä kehittämisessä.
# Tämä on haastavampi laskutoimitus
1423345 * 317123
# Alla oleva koodia ei suoriteta, koska se on kommentoitu pois
# 3 + 3
soitto = 16
soitto * soitto # Muuttujan käyttö on voimakas tapa
# hallita koodia. Laskemalla voi kokeilla, kuinka monta
# saa soiton puhelimeen jos 16 henkilöä soittaa 16 henkilölle
haravia_lukumaara = 5
haravia_lukumaara * (haravia_lukumaara + 3)
# Koodi suoritetaan matemaattisesti järjestyksessä:
# ensin sulkeet, sitten lasketaan kertolasku.
Matematiikan laskutoimitukset
Matemaattinen sana
Symboli
Esimerkki
Vastaus
Summa
+
5 + 2
7
Vähennys
-
5 - 2
3
Kertolasku
*
5 * 2
10
Jakolasku
/
5 / 2
2.5
Potenssi
**
5 ** 2
25
Jakojäännös
%
5 % 2
1
'Tiina'
"Laura"
# Nimimuuttuja
nimi = "Satu"
# Näytetään muuttujan arvo
nimi
nimi = "Maria"
# Tulostetaan nimi
print(nimi)
# Yhdistetään tekstiä
nimi = "Satu"
print("Hei " + nimi + "!")
soitto = 14
# Huom! Sisennyksellä on merkitystä
if soitto > 10:
print("Luku on suurempi kuin kymmenen!")
else:
print("Luku on pienempi kuin kymmenen")
# Ehtolauseella useita vaihtoehtoja
luku = 9
if luku < 5:
print("Luku on pienempi kuin viisi.")
elif luku == 5:
print("Luku on viisi.")
else:
print("Luku on suurempi kuin viisi.")
# Tarkistetaan arvojen väli
luku = 7
if luku \> 0 and luku <= 12:
print("Luku on yhdestä kahteentoista.")
else:
print("Luku on jotain muuta kuin yhdestä kahteentoista.")
# Sama tarkistus toisin tavoin
luku = 5
if 0 < luku <= 10:
print("Luku on yhdestä kymmeneen.")
else:
print("Luku on jotain muuta kuin yhdestä kymmeneen.")
# Funktio, joka tervehtii nimellä
# Yksinkertainen funktio tervehtimään
def hei():
print("Hei, maailma!")
hei()
# Funktio, joka tervehtii nimellä
def tervehdys(nimi):
print("Hei " + nimi + "!")
tervehdys("Ella")
# Funktio, jossa on oletusnimi
def tervehdys(nimi="vieras"):
print("Hei " + nimi + "!")
tervehdys()
# Kaksinkertaistava funktio
def tuplaus(luku):
return luku * 2
print(tuplaus(7))
# Funktio, joka tervehtii innokkaasti tai vähemmän innokkaasti
def tervehdys(nimi, innostunut):
if innostunut:
return "Hei " + nimi + "! On ilo nähdä sinut täällä!"
else:
return "Hei " + nimi + ". Kiva että tulit."
print(tervehdys("Laura", True))
# Hahmotellaan ensimmäinen kirjain nimestä
nimi = "Satu"
alkukirjain = nimi[0]
print(alkukirjain)
# Listan pituus
lista = [2, 3, 6]
print(len(lista))
# Listan ensimmäinen elementti
lista = [3, "merkkejä", True]
print("Listan ensimmäinen asia on", lista[0])
# Monikon ensimmäinen asia
monikko = (3, "dataa", False)
print("Monikon ensimmäinen asia on", monikko[0])
# Sanakirjan tekstin tarkistaminen
sanakirja = {"asia": "Tässä on tekstiä."}
print(sanakirja["asia"])
# Käyttäjän antama syöte
palaute = input()
print("Kirjoitit juuri:", palaute)
# Kielen valinta sanakirjasta
sanakirja = {"hei": "hello"}
kielivalinta = input("valitse suomi tai englanti: ")
if kielivalinta == "englanti":
print(sanakirja["hei"])
else:
print("hei")
# Keskustelijafunktio
def keskustelija():
sanottu_asia = input("hei")
if sanottu_asia == "hei":
print("🤖 Tervehdys!")
else:
print("🤖 Non intellego te. 🙌")
keskustelija()
Millaisia tapoja on suorittaa Python-koodia?
Yksi tärkeimmistä työkaluista jokaiselle Python-ohjelmoijalle on interaktiivinen Python-tulkki.
Tulkin käynnistäminen voi riippua alustastasi. Linux- tai Mac-järjestelmässä voit kirjoittaa python3 terminaaliin. Windowsissa komento komentorivillä voi olla python.
Tulkki on tapa suorittaa Python-koodia rivi riviltä heti, kun kirjoitat sen. Kun kirjoitat rivin koodia ja painat Enter voit suorittaa rivin. Uusimmassa Python 3.13 -versiossa voi käyttää lohkoja kopioidessa/liittäessä koodia ja suorittaa useita rivejä koodeja kerrallaan.
Pythonin kieli toimii samalla tavoin kun Python-ohjelman asentaa tietokoneelle. Mikä tahansa Python-koodi, joka voidaan kirjoittaa tulkkiin, voidaan myös kirjoittaa tiedostoon. Tiedostoihin ja tallentamiseen pääsemme seuraavilla viikoilla. Seuraavalla viikolla on hieman esimakua tulevasta Jupyter-ympäristöstä.
Tässä esimerkissä ohjelma kysyy käyttäjän nimen ja iän, ja antaa tietoa vastauksien perusteella. Kopioi lohkot 1-3:een yksi kerrallaan interaktiiviseen komentotulkkiin ja suorita ohjelma. Voit myös kirjoittaa kaikki komentotulkkiin kerralla yhteen, jos haluat.
osa 1
# Tämä ohjelma sanoo hei ja kysyy nimen.
print("Hei, maailma!")
print("Mikä on nimesi?") # kysytään nimi
minunNimeni = input()
osa 2
print("Mukava tavata sinut, " + minunNimeni)
print("Nimesi pituus on:")
print(len(minunNimeni))
print("Kuinka vanha olet?") # kysytään ikä
minunIkäni = input()
osa 3
print("Olet " + str(int(minunIkäni) + 1) + " vuotta vanha vuoden päästä.")
Viikko 2 esimakua
Vaikka interaktiivinen komentorivi on hyvä yksittäisten Python-käskyjen suorittamiseen, kokonaisen Python-ohjelman kirjoittamista varten ohjeet kirjoitetaan kurssilla Työkirjaan JupyterLiteen.
JupyterLiten käyttö on samanlaista kuin tekstieditoreiden, kuten Muistion tai VSCoden, mutta siinä on erityisiä ominaisuuksia grafiikan ja kommenttien kirjoittamiseen. Avaa uusi tiedosto JupyterLite:ssa klikkaamalla yläriviltä "+"-painiketta ja valitsemalla Python (Pyodide).
Avautuvassa ikkunassa näkyy vilkkuva kursori, joka odottaa syötettäsi. Tämä eroaa interaktiivisesta komentorivistä, joka suorittaa Python-komennot heti, kun painat ENTER-näppäintä. JupyterLitessä voit kirjoittaa useita komentoja ja suorittaa koko ohjelman kerralla. Tässä on tapa erottaa nämä kaksi:
Interaktiivisessa komentorivissä on aina `>>>`-kehotus.
Komentorivillä ajettaessa (tai Jupyterissä) ikkunassa ei ole `>>>`-kehotusta.
Kuinka tullaan taitavammaksi Python-ohjelmoijaksi?
Kuten moni fiksu aikaisemmista Pythonin opettajista journalisteille on sanonut, paremmaksi tullaan harjoittelemalla. Tee projekteja, ja toista niitä. Tässä on esimerkiksi yksi neuvo, jota käytetään Yhdysvalloissa New Yorkin täydennyskoulutuksessa, jonne ihmisiä lähtee Suomesta oppimaan datajournalismia: Aloita projekti. Harjoittele, kokeile ja tee virheitä. Tee yksi asia kerrallaan. (Jonathan Soma). Voit edellisessä linkissä myös kokeilla yhtä haastavampaa harjoitusta Projektina, Moon Measurer (harjoitus on vapaaehtoinen, tästä et saa tehtäväpisteitä).
Tietorakenteet lyhyesti
Listat
Lista on tietorakenne, joka voi tallentaa kokoelman kohteita. Se on yksi sisäänrakennetuista tietotyypeistä ja sitä käytetään yleisesti järjestetyn alkiojoukon tallentamiseen. Listat voivat sisältää eri tietotyyppisiä alkioita, kuten numeroita, merkkijonoja ja jopa muita listoja.
Listojen keskeiset ominaisuudet
👉 Listat säilyttävät alkioiden järjestyksen niiden lisäämisen mukaan, jolloin voit käyttää alkioita niiden indeksin mukaan.
👉 Voit muokata listan sisältöä lisäämällä tai poistamalla alkioita.
👉 Listat voivat kasvaa tai kutistua tarpeen mukaan. Voit lisätä tai poistaa alkioita määrittelemättä kokoa etukäteen.
Tuple on järjestetty, muuttumaton kokoelma elementtejä. Tämä tarkoittaa, että kun olet luonut tuplen, et voi muokata sen sisältöä - et voi lisätä, poistaa tai muuttaa elementtejä tuplessa sen luomisen jälkeen. Tuplet määritellään sulkeilla () ympäröidyllä pilkkuerotellulla arvojoukolla.
Sanakirja on sisäänrakennettu tietotyyppi, joka edustaa avain-arvoparien kokoelmaa. Se on erittäin joustava ja tehokas tietorakenne, jota käytetään avaamien määrittelemiseksi arvoille.
Sanakirjojen keskeiset ominaisuudet
👉 Jokainen alkio sanakirjassa koostuu avaimeista ja sen vastaavasta arvosta. Avain on ainutkertainen tunniste arvolle.
👉 Toisin kuin listat, sanakirjat ovat järjestämättömiä kokoelmia, mikä tarkoittaa, että alkioiden järjestystä ei taata.
👉 Sanakirjoja voidaan muokata luomisen jälkeen. Voit lisätä, poistaa tai päivittää avain-arvopareja.
👉 Sanakirjat voivat kasvaa tai kutistua tarpeen mukaan.
👉 Jokaisen sanakirjan avaimen on oltava ainutkertainen. Jos yrität lisätä avaimen, joka jo on olemassa, uusi arvo ylikirjoittaa olemassa olevan.
Joukko on järjestämätön kokoelma ainutlaatuisia elementtejä. Joukot määritellään sulkemalla pilkulla erotettu arvojono aaltosulkeiden sisään. Toisin kuin listat tai tuplet, joukot eivät salli päällekkäisiä elementtejä, eikä elementtien järjestystä taata.
Esimerkki joukosta ("set"-niminen tietorakenne englanniksi)
my_set = {1, 2, 3, 4, 5}
Voimme myös luoda joukon listasta käyttämällä set()-rakentajaa
Funktio on uudelleenkäytettävä koodilohko, joka suorittaa tietyn tehtävän tai joukon tehtäviä. Voimme määritellä funktion käyttämällä "def"-avainsanaa.
#Toinen yksinkertainen esimerkki
def printNumber():
result = 2 + 4
print(result)
printNumber()
Moduulit
Moduuli on tiedosto, joka sisältää Python-koodia. Tämä koodi voi määritellä funktioita, luokkia ja muuttujia. Moduulit auttavat järjestämään liittyvän koodin tiedostoiksi, joita voidaan helposti käyttää uudelleen ja tuoda muihin Python-skripteihin.
Pythonin standardikirjasto on kokoelma moduuleja, jotka tarjoavat käyttövalmiita toimintoja tehtäviin kuten tiedostojen syöttö ja tulostus, verkottuminen ja paljon muuta.
Kirjasto (library): Kokoelma paketteja
Apua data-analyysiin: pandas
Pandas
“pandas is a fast, powerful, flexible and easy to use open source data analysis and manipulation tool, built on top of the Python programming language.”
Asennus: pip install pandas
Kehitysympäristön kysymyksiä
Missä koodi on? (oma tietokone vs. pilvipalvelu)
Mihin kirjastot asennetaan?
Kielen ja kirjastojen eri versioiden yhteensopivuus
Skriptejä (komentosarjoja) vai muistikirjoja?
Csv-tiedoston lukeminen kirjaston avulla: pd.read_csv
import pandas as pd
df = pd.read_csv("data/aineisto_ote.csv")
df
Vaalipiiri
Puolue
0
Uudenmaan vaalipiiri
Kokoomus
1
Uudenmaan vaalipiiri
Suomen Kommunistinen Puolue
2
Uudenmaan vaalipiiri
Perussuomalaiset
type(df)
pandas.core.frame.DataFrame
type(df["vaalipiiri"])
pandas.core.series.Series
Uudet käsitteet
DataFrame: “2-dimensional labeled data structure with columns of potentially different types”
Series: “One-dimensional labeled array capable of holding any data type (integers, strings, floating point numbers, Python objects, etc.)”
Taulukoita ja sarakkeita!
Funktioita ja ominaisuuksia, jotka listattu kirjaston dokumentaatiossa
Välissä toimivia vinkkejä siihen, miten tutkit muuttujaa kooditulkissa
Jos tarvitset jonkin metodin ja melkein muistat sen nimen, voi joskus olla nopeampaa ohittaa Google ja käyttää dir-funktiota tulkissa. Se kertoo, mitkä menetelmät ovat käytettävissä annetussa objektissa:
Python-merkkijonoilla on paljon käytettävissä olevia metodeja, kuten näette yllä. Tässä vaiheessa voi olla parasta jättää huomiotta kaikki metodit, joiden nimissä on alaviivoja, mutta loput voivat osoittautua hyödyllisiksi. Joidenkin toimintaperiaatteen voit selvittää kokeilemalla niitä, ja loput voit etsiä verkosta.
Python-listoilla ei ole aivan niin paljon metodeja:
Csv-tiedoston lukeminen kirjaston avulla: pd.read_csv
import pandas as pd
df = pd.read_csv("data/aineisto_ote.csv")
df
Tavoitteita tämän luennon jälkeen
Osaat käyttää Visual Studio Code tai JupyterLite -editoreita
Tähän asti kaikki kurssin harjoitukset on suoritettu suoraan kurssisivujen upotetuissa editori-ikkunoissa. Päätteellä ohjelmointi sopii hyvin ohjelmoinnin aivan ensimmäisiin askeliin, mutta nyt on aika alkaa käyttää erillistä, erityisesti ohjelmointiin tarkoitettua editoria.
Osaat avata Github-repositoryn (kuten viikkotehtävässä) Chat-sovelluksessa chat-github.nuxt.dev
0 01.1.1 Viljatuotteet ja leipä
1 01.1.2 Liha
2 01.1.3 Kala ja äyriäiset
3 01.1.4 Maitotuotteet, juusto ja kananmunat
4 01.1.5 Öljyt ja rasvat
... ...
93 12.5.2 Asumiseen liittyvät vakuutukset
94 12.5.3 Terveyteen liittyvät vakuutukset
95 12.5.4 Liikenteeseen liittyvät vakuutukset
96 12.6.2 Muut rahoituspalvelut, muualle luokittelemattomat
97 12.7.0 Muut palvelut, muualle luokittelemattomat
Name: Hyödyke, Length: 98, dtype: object
Järjestäminen: sort_values
df.sort_values("Indeksipisteluku")
Hyödyke
Indeksipisteluku
63
08.2.0 Puhelin- ja faksilaitteet
43.19
65
09.1.1 Äänen ja kuvan vastaanottoon, tallennukseen, tallennusvälineet
import pandas as pd
df = pd.read_csv("data/lentoasemien_matkustajat_rahti_muunnettu.csv", parse_dates=["Aika"])
df
Aika
Ilmoittava lentoasema
Lennon tyyppi
Saapuneet/lähteneet
Yhteensä Matkustajamäärä
Yhteensä Rahti ja posti yhteensä, tonnia
Helsinki-Vantaa Matkustajamäärä
Helsinki-Vantaa Rahti ja posti yhteensä, tonnia
Muut kotimaan lentoasemat Matkustajamäärä
Muut kotimaan lentoasemat Rahti ja posti yhteensä, tonnia
Kansainvälinen Matkustajamäärä
Kansainvälinen Rahti ja posti yhteensä, tonnia
0
2019-01-01
Yhteensä
Yhteensä
Saapuneet/lähteneet yhteensä
1969169
16265
276932
55
279130
177
1413107
16033
1
2019-01-01
Yhteensä
Yhteensä
Saapuneet
984340
7550
129975
41
147386
13
706979
7495
2
2019-01-01
Yhteensä
Yhteensä
Lähteneet
984829
8715
146957
13
131744
164
706128
8538
3
2019-01-01
Yhteensä
Reittilento
Saapuneet/lähteneet yhteensä
1857115
14743
276649
55
278772
177
1301694
14511
4
2019-01-01
Yhteensä
Reittilento
Saapuneet
931756
6733
129719
41
147185
13
654852
6678
...
...
...
...
...
...
...
...
...
...
...
...
...
7933
2022-06-01
Vaasa
Reittilento
Saapuneet
4843
0
4843
0
0
0
0
0
7934
2022-06-01
Vaasa
Reittilento
Lähteneet
4934
0
4934
0
0
0
0
0
7935
2022-06-01
Vaasa
Tilauslento
Saapuneet/lähteneet yhteensä
1674
0
0
0
0
0
1674
0
7936
2022-06-01
Vaasa
Tilauslento
Saapuneet
998
0
0
0
0
0
998
0
7937
2022-06-01
Vaasa
Tilauslento
Lähteneet
676
0
0
0
0
0
676
0
7938 rows × 12 columns
Pääpiirteet: info 2
df.describe(include='all')
Aika
Hyödyke
Indeksipisteluku
count
65700
65700
61173
unique
65700
100
NaN
top
2019-01-01
Hyödyke A
NaN
freq
1200
5000
NaN
mean
NaN
NaN
101.686
std
NaN
NaN
11.260
min
NaN
NaN
35.520
25%
NaN
NaN
97.840
50%
NaN
NaN
100.580
75%
NaN
NaN
105.210
max
NaN
NaN
251.290
Visualisointi
Miten valmistaudut grafiikoiden tekemiseen datasta: jos et käytä Jupyteriä tai JupyterLiteä Asenna Matplotlib kehitysympäristöösi komennolla:
pip install matplotlib
import matplotlib.pyplot as plt # matplotlib pitää tuoda, eli jatkossa pitäisi import:ta sekä pandas että matplotlib
Datan visualisoiminen on yksi toimittajan työprosessin vaihe. Usein siihen ei kannata käyttää paljon aikaa, mikäli olet kirjoittava toimittaja. Asioiden hiominen ja paranteleminen omaksi huvikseen alkaa viedä yllättävän paljon aikaa. Lisäksi matplotlib on ehkä kaikkein yksinkertaisin tapa esittää dataa kuvana - siitä ei saa vaan kaunista oikein millään, eikä sitä sen vuoksi kannata lähteä loputtomasti hiomaan.
Kaikkeen visualisoimiseen liittyvä kultainen sääntö on tällä luentosarjalla seuraava: lisää vain .plot() -komento minkä tahansa tarkastelemasi asian loppuun. Se toimii noin 75% ajasta.
Esimerkiksi luentokalvoilla on luotu väkilukujen summa eri mantereilla laskemalla väkimäärät yhteen. Tämä olisi visualisoitu grafiikka tuolta luennolta
Yllä oleva koodi antaa työkirjaan vaakasuoran pylväskaavion kunkin mantereen väestön summasta. Teknisesti ottaen se toimii, koska sum on sarja, matplotlib piirtää indeksin suhteessa arvoihin.
Jos sinulla on täysi Dataframe (normaali df eli taulu), sinun on yleensä annettava x ja y. Kuten näin:
Tämä antaa kuvana hajontakaavion jokaisen maan elinajanodotteesta suhteessa sen henkeä kohti laskettuun BKT:hen.
Viivakaavio
Mikäli haluat käyttää huomattavasti enemmän aikaa ja luoda erilaisia visualisointeja grafiikkoja varten, niitä on alla vielä muutama esimerkki mahdollisista grafiikoista. Grafiikoita on luotu tämän viikon osion viimeisestä datasta, lentokenttädatasta.
from flask_frozen import Freezer
from app import app
freezer = Freezer(app)
if __name__ == '__main__':
freezer.freeze()
Marimo ja vaihtoehtoiset Notebookit tulevaisuutta varten
Luennolla tutustuimme Hugging Face -taustapalveluissa (suoritus ilmaisena verkossa) Marimo -Notebook ohjelmistoon, joka mahdollistaa vuorovaikutteisen käyttöliittymän chatbottien luomiseen. Chatbotin avulla opiskelijat ja opettaja saivat esittää kysymyksiä ja tehdä analyyseja scikit-learnin Fish-datasetistä, joka sisältää tietoja kalalajeista ja niiden mittauksista. Datasetissä on yhteensä 159 riviä ja 7 saraketta, jotka käsittelevät kalojen lajeja, painoa, pituusmittauksia, korkeutta ja leveyttä. Chatbotin kautta ryhmäläiset pystyivät esittämään SQL-kyselyitä aineistolle, esimerkiksi selvittämään pisimmän hauen mittoja tai vertailemaan pienimmän ja suurimman hauen pituuseroja. Lisäksi kokeilimme erilaisten visualisointien, kuten Altairilla tehtyjen kaavioiden, luontia Marimo Chat UI:lla.
Marimon helppokäyttöisyys ja kyky tuottaa nopeasti visuaalisia ja helposti ymmärrettäviä tuloksia tekivät siitä erinomaisen työkalun datajournalismiin ja ohjelmointiharjoitteluun Jupyter Notebooksin ohella.