Lämpötila ja sademäärä
Contents
Lämpötila ja sademäärä#
Tehtävä#
Etsi oman kotipaikkakuntasi (tai jonkin muun paikkakunnan) kuukausien keskilämpötilat ja sademäärät ainakin kymmenen viime vuoden ajalta (voit valita myös koko mittaushistorian). Laske vuosien keskilämpötilat ja sademäärät ja piirrä niistä kuvaaja. Mikä vuosi on ollut kaikkein lämpimin? Entä kylmin? Milloin puolestaan on satanut eniten tai vähiten? Voit ottaa mallia esimerkistä.
Esimerkki#
Haetaan Ilmatieteenlaitoksen hakupalvelusta tiedot Pirkkalan lentoaseman säähavainnoista (kuukauden keskilämpötila ja -sademäärä). Mittaushistoria ulottuu noin 80-luvulle, joten valitaan aikaväliski 1980-2020. Havainnot on ladattu hakupalvelusta ja tallennettu tiedostoon ”pirkkala_1980-2020.csv”.
Käytetään datan lukemiseen ja käsittelemiseen pandas-pakettia ja datan visualisoimiseen matplotlib-pakettia.
# Tuodaan tarvittavat paketit
import pandas as pd
import matplotlib.pyplot as plt
# Luetaan data ja katsotaan ensimmäisten rivien sisältö.
# Data sijaitsee data kansiossa, joka on yhden kansion alempana nykyisestä kansiosta.
data = pd.read_csv('../data/pirkkala_1980-2020.csv')
data.head()
Vuosi | Kk | Pv | Klo | Aikavyöhyke | Kuukauden sadesumma (mm) | Kuukauden keskilämpötila (degC) | |
---|---|---|---|---|---|---|---|
0 | 1980 | 1 | 1 | 00:00 | UTC | 15.4 | -9.5 |
1 | 1980 | 2 | 1 | 00:00 | UTC | 8.2 | -10.1 |
2 | 1980 | 3 | 1 | 00:00 | UTC | 5.2 | -6.5 |
3 | 1980 | 4 | 1 | 00:00 | UTC | 19.7 | 4.2 |
4 | 1980 | 5 | 1 | 00:00 | UTC | 22.9 | 7.3 |
Nähdään, että sademäärät löytyvät sarakkeesta ”Kuukauden sadesumma (mm)” ja lämpötilat sarakkeesta ”Kuukauden keskilämpötila (degC)”. Seuraavaksi meidän tulee ryhmitellä data vuosien perusteella, jotta voimme vertailla dataa vuositasolla. Ryhmittely voidaan tehdä groupby()
-funktiolla.
# Ryhmitellään data "Vuosi"-sarakkeen perusteella.
data_groups = data.groupby('Vuosi')
Vuositilastojen keskiarvot saadaan mean()
-funktiolla.
# Katsotaan, miltä keskiarvotilastot näyttävät
avg = data_groups.mean()
avg.head()
Kk | Pv | Kuukauden sadesumma (mm) | Kuukauden keskilämpötila (degC) | |
---|---|---|---|---|
Vuosi | ||||
1980 | 6.5 | 1.0 | 43.866667 | 3.308333 |
1981 | 6.5 | 1.0 | 67.708333 | 3.316667 |
1982 | 6.5 | 1.0 | 47.275000 | 4.041667 |
1983 | 6.5 | 1.0 | 51.150000 | 4.425000 |
1984 | 6.5 | 1.0 | 51.841667 | 4.600000 |
Tallennetaan keskiarvot omiin muuttujiin. Vuosiluvut saadaan data-ryhmistä groups-komennolla, josta saamme ryhmät ja niitä vastaavien rivien indeksit. Koska haluamme ainoastaan vuosiluvut (eli ryhmien nimet), käytämme vielä keys()
-funktiota, joka antaa ainoastaan ryhmien nimet.
# Tallennetaan vuosien keskilämpötilat ja -sademäärät sekä vuosiluvut omiin muuttujiin.
rain = avg['Kuukauden sadesumma (mm)']
temp = avg['Kuukauden keskilämpötila (degC)']
year = data_groups.groups.keys()
Nyt kun data on käsitelty, voimme piirtää kuvaajan. Piirretään sademäärä pylväinä ja lämpötila viivana. Käytetään matplotlib-paketista seuraavia funktioita:
subplots()
Kuvaajan alustusplot(x,y)
Piirretään y x:n funktionabar(x,y)
Pylväsdiagrammitwinx()
Luodaan toinen akselisto, jossa on sama x-akseliset_xlabel('title')
Asetetaan tiettyyn akselistoon x-akselin otsikkoset_ylabel('title')
Asetetaan tiettyyn akselistoon y-akselin otsikkotitle('title')
Otsikkoshow()
Kuvaajan näyttäminen
# Kuvaajan piirtäminen
# Alustetaan kuvaaja subplots-komennolla. Tällöin voimme luoda myöhemmin toisen y-akselin kuvaajaan.
fig, ax = plt.subplots(figsize=(12,8))
# Piirretään lämpötilat
ax.plot(year,temp, 'r', linewidth=3, alpha=0.7)
# Luodaan toinen y-akseli sademääriä varten
ax2 = ax.twinx()
# Piirretään sademäärät pylväinä
ax2.bar(year,rain, alpha=0.7)
# Asetetaan akselien otsikot
ax.set_xlabel('Vuosi')
ax.set_ylabel('Lämpötila (degC)')
ax2.set_ylabel('Sademäärä (mm)')
# Kuvaajan otsikko
plt.title('Vuosien keskilämpötilat ja -sademäärät Pirkkalan lentoasemalla')
# Näytetään kuvaaja
plt.show()

Kuvaajasta huomataan, että sademäärätiedot puuttuvat vuoden 2006 jälkeen. Tarkistetaan vielä get_group
-funktion avulla, miltä vuoden 2006 tilastot näyttävät:
data_groups.get_group(2006)
Vuosi | Kk | Pv | Klo | Aikavyöhyke | Kuukauden sadesumma (mm) | Kuukauden keskilämpötila (degC) | |
---|---|---|---|---|---|---|---|
312 | 2006 | 1 | 1 | 00:00 | UTC | 17.3 | -5.5 |
313 | 2006 | 2 | 1 | 00:00 | UTC | 17.5 | -9.6 |
314 | 2006 | 3 | 1 | 00:00 | UTC | 30.7 | -7.9 |
315 | 2006 | 4 | 1 | 00:00 | UTC | 33.6 | 3.4 |
316 | 2006 | 5 | 1 | 00:00 | UTC | 36.2 | 9.9 |
317 | 2006 | 6 | 1 | 00:00 | UTC | 20.9 | 15.2 |
318 | 2006 | 7 | 1 | 00:00 | UTC | NaN | 17.9 |
319 | 2006 | 8 | 1 | 00:00 | UTC | NaN | 17.9 |
320 | 2006 | 9 | 1 | 00:00 | UTC | NaN | 12.7 |
321 | 2006 | 10 | 1 | 00:00 | UTC | NaN | 6.2 |
322 | 2006 | 11 | 1 | 00:00 | UTC | NaN | 0.8 |
323 | 2006 | 12 | 1 | 00:00 | UTC | NaN | 2.2 |
Huomataan, että sademäärien mittaaminen on keskeytetty kesken vuoden 2006. Niimpä meidän täytyy jättää myös vuosi 2006 pois vuositilastoistamme. Korvataan vuoden 2006 arvo NaN (Not a Number) arvolla, joka tarkoittaa, että arvoa ei ole olemassa. Tämä voidaan tehdä numpy-paketin nan
-arvolla.
# Poistetaan vuosi 2006 rain-taulukosta
# Korvataan arvo numpy-paketin NaN-arvolla, joka tarkoittaa, että arvoa ei ole olemassa.
import numpy as np
rain[2006] = np.nan
rain
Vuosi
1980 43.866667
1981 67.708333
1982 47.275000
1983 51.150000
1984 51.841667
1985 48.183333
1986 53.908333
1987 48.833333
1988 72.958333
1989 42.900000
1990 48.425000
1991 51.091667
1992 49.666667
1993 37.700000
1994 45.791667
1995 49.508333
1996 41.641667
1997 47.716667
1998 51.375000
1999 48.666667
2000 50.700000
2001 57.633333
2002 41.691667
2003 42.025000
2004 57.550000
2005 48.983333
2006 NaN
2007 NaN
2008 NaN
2009 NaN
2010 NaN
2011 NaN
2012 NaN
2013 NaN
2014 NaN
2015 NaN
2016 NaN
2017 NaN
2018 NaN
2019 NaN
2020 NaN
Name: Kuukauden sadesumma (mm), dtype: float64
# Piirretään kuvaaja uudelleen
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(year,temp, 'r', linewidth=3, alpha=0.7)
ax2 = ax.twinx()
ax2.bar(year,rain, alpha=0.7)
ax.set_xlabel('Vuosi')
ax.set_ylabel('Lämpötila (degC)')
ax2.set_ylabel('Sademäärä (mm)')
plt.title('Vuosien keskilämpötilat ja -sademäärät Pirkkalan lentoasemalla')
plt.show()

Maksimi- ja minimi lämpötilat sekä sademäärät voitaisiin lukea suoraan kuvaajasta.
Ne voidaan kuitenkin saada myös koodaamalla (käytetään max()
- ja min()
-funktioita):
max_temp = temp[temp == temp.max()]
max_temp
Vuosi
2020 7.041667
Name: Kuukauden keskilämpötila (degC), dtype: float64
min_temp = temp[temp == temp.min()]
min_temp
Vuosi
1987 1.808333
Name: Kuukauden keskilämpötila (degC), dtype: float64
max_rain = rain[rain == rain.max()]
max_rain
Vuosi
1988 72.958333
Name: Kuukauden sadesumma (mm), dtype: float64
min_rain = rain[rain == rain.min()]
min_rain
Vuosi
1993 37.7
Name: Kuukauden sadesumma (mm), dtype: float64
Kokeile seuraavaksi itse selvittää esimerkiksi oman kotikaupunkisi lämpötilan ja sademäärän vuosittaiset keskiarvot. Voit piirtää myös tietyn vuoden kuukausittaiset keskiarvot!