ESIMERKKI 4: Pienhiukkaset - saasteita ja aerosoleja#

Ilmakehä koostuu paljosta muustakin kuin pelkistä kaasuista ja meille eläville olennoille oleellista on, missä määrin tämä vaikuttaa eläinten ja kasvien toimintaan. Kokonaiskuvan kannalta on hyvä muistaa heti alusta alkaen, että ilmakehän monimutkaisuus tekee yksittäisten tulosten väärintulkinnasta helppoa: kun tehdään ennusteita ja tulkintoja planeetan kannalta tärkeistä toimista, pitää muistaa tarkastella niin hiukkasten syntyprosesseja, käytöstä ilmakehässä, niiden kulkeutumista tuulten mukana lämpötiloista ja kosteudesta riippuen sekä vuorovaikutuksia erilaisten ekosysteemien kanssa.

Tarkastellaan seuraavaksi erinäisiä mikro- ja nanometrikokoluokassa olevia hiukkastyyppejä. Lähteinä käytämme Ilmatieteenlaitoksen ja SMEAR-asemien avoimia aineistoja.

1. SMEAR - Station for Measuring Ecosystem-Atmosphere Relations#

Torilla tavataan, Suomi on näet kansainvälinen supervalta laadukkaan ja pitkäaikaisen datankeruun suhteen kun puhutaan ilmakehän poikkitieteellisestä tutkimuksesta. Professori Markku Kulmalan ja muiden nimet keikkuvat jatkuvasti alan kärkilistoilla ja projektit puskevat ihmiskunnan ymmärrystä mm. aerosolien muodostumisesta ja käyttäytymisestä aina vain pidemmälle.

SMEAR-asemat ovat monipuolisia koeasemia, joilla mitataan yhtäaikaisesti niin säähavaintoja, ainevirtauksia kuin laajempia ekosysteemimuutoksiakin. Erityisen tärkeitä asemat ovat aerosolien tutkimuksen kannalta, sillä näitä on perinteisesti ollut erittäin vaikeaa tarkastella luotettavilla tavoilla reaaliajassa.

1.1 Aerosolit - mitä ja miksi?#

Aerosolit ovat yhdistelmä kaasua ja siihen sekoittuneita hiukkasia, joita syntyy kaikkialla. Liikenne, teollisuus, merten aallot, kasvien fotosynteesin sivutuotteet… lukematon määrä prosesseja planeetallamme aiheuttaa hiukkasten virtausta ekosysteemien ja ilmakehän välillä. Kuten Auringon toiminta on planeettamme ensisijainen energianlähde, erilaisten aerosolien vaikutus maailmamme elinkelpoisuuteen on ensisijaisen tärkeää mm. pilvien muodostumisen, veden kierron ja paikallisten ilmamassojen energiajakauman kannalta. Suoraan ilmakehään siirtyneet aineet ovat primääriaerosoleja ja siellä kaasuista kehittyneet aineet sekundaarisia aerosoleja.

Merkittävät osat ilmastonmuutoskeskustelua liittyvät aerosoleihin. Nokihiutaleiden määrä imee auringonvaloa itseensä ja pitää tehokkaasti lämpöä ilmakehässä, rikkiyhdisteet tehostavat pienipisaraisten pilvien muodostumista ja heijastavat enemmän valoa pois, ilmakehä yleisesti sakenee enemmän valoa himmentäväksi ja johtaa paikallisiin nälänhätiin mutta sen siivoaminen nostaa globaalia lämpötilaa suuremman osan valosta päästessä pinnalle ja niin edelleen.

Kyseessä on monimutkainen vyyhti, jonka ratkaiseminen on yhteisen selviämisemme kannalta oleellista, mutta se vaatii poliittista vastuunkantoa ja ohjausta. Tutkimuksen kannalta suunta on selvä, kuten professori Hanna Vehkamäki sanoo: “ilmakehän tutkiminen on toki tärkeää luonnon ja ihmisten hyvinvoinnin kannalta. Mutta minulle on tärkeintä saada tietää, miten molekyylit käyttäytyvät. Minun tehtäväni on yksinkertaisesti selvittää, miten luonto toimii. Siinä kaikki.” -Yhdessä ilmakehässä, 2016

1.2 Pohjoinen metsävyöhyke ja muutoksen vaikutukset#

Tutkimusjulkaisussa “Long-term sub-micrometer aerosol chemical composition in the boreal forest: inter- and intra-annual variability” (Heikkinen ym., 2020) todettiin SMEAR II datojen perusteella seuraavaa:

During the exceptionally hot months of July of 2014 and 2018, the organic aerosol concentrations were up to 70 % higher than the 7-year July mean. The projected increase in heat wave frequency over Finland will most likely influence the loading and chemical composition of aerosol particles in the future. Our findings suggest strong influence of meteorological conditions such as radiation, ambient temperature, and wind speed and direction on aerosol chemical composition.

Mitä jos tutustuisimme osaan aineistosta? Alla kuva samasta julkaisusta:

aerosolit

1.3 Aineisto#

# Ladataan tarvittavat työkalut

import pandas as pd # taulukoiden käsittelyyn
import matplotlib.pyplot as plt # kuvaajien piirtoon
import numpy as np # luonnonvakioihin

plt.rcParams['font.size'] = 25 # yleiseen fonttikoon säätöön
# Vuoden 2014 kokonaisaerosolimäärät ja lämpötilamittaukset Hyytiälän SMEAR II -asemalla.

A_tot = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/HyyATot.csv",
                    parse_dates = {"Aika":["Year", "Month", "Day", "Hour"]}, keep_date_col = True)
T1 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/HyyT1.csv",
                 parse_dates = {"Aika":["Year", "Month", "Day", "Hour"]}, keep_date_col = True)
# Piirretään kuvaaja.

fig = plt.figure(figsize = (30, 10))

plt.plot(A_tot["Aika"], A_tot["HYY_DMPS.tconc"], "orange", label = "Aerosolit")
plt.ylabel("1/${m^3}$\n", fontsize = 25)

plt.twinx()

plt.plot(T1["Aika"], T1["HYY_META.T672"], "c", label = "Lämpötila")
plt.ylabel("Lämpötila (°C)")

plt.title("Aerosolikonsentraatio Hyytiälän asemalla \n", fontsize = 30)
fig.supxlabel("\nAika", fontsize = 25)

fig.legend(loc = "upper right", fontsize = 25)
plt.show()
../_images/7bcaaca5907218a2bf906a8cb7314991435438ab0131408b84d7f0a922ead6df.png
# Äskeinen kuvaaja on tehty tunnin resoluutiolla. Entä jos katsotaan laajaa kuvaa kuukausikeskiarvoilla?

KKA = A_tot.groupby(["Month"]).mean(numeric_only = True)
KKT = T1.groupby(["Month"]).mean(numeric_only = True)
# Piirretään kuvaaja.

fig = plt.figure(figsize = (30, 10))

plt.plot(KKA["HYY_DMPS.tconc"], "orange", label = "Aerosolit")
plt.ylabel("1/${m^3}$\n", fontsize = 25)

plt.twinx()

plt.plot(KKT["HYY_META.T672"], "c", label = "Lämpötila")
plt.ylabel("Lämpötila (°C)")

plt.title("Aerosolikonsentraatio Hyytiälän asemalla (kuukausikeskiarvo) \n", fontsize = 30)
fig.supxlabel("\nAika", fontsize = 25)
fig.legend(loc = "upper right", fontsize = 25)
plt.show()
../_images/69c69105655035ef5a51a21ece1f2f4d4c531f4890ccd44b657d8e7f9c9620be.png
# Tai vaihtelua kellonajan mukaan? 

KKAt = A_tot.groupby(["Hour"]).mean(numeric_only = True)
KKTt = T1.groupby(["Hour"]).mean(numeric_only = True)
# Piirretään kuvaaja.

fig = plt.figure(figsize = (30, 10))

plt.plot(KKAt["HYY_DMPS.tconc"], "orange", label = "Aerosolit")
plt.ylabel("1/${m^3}$\n", fontsize = 25)

plt.twinx()

plt.plot(KKTt["HYY_META.T672"], "c", label = "Lämpötila")
plt.ylabel("Lämpötila (°C)")

plt.title("Aerosolikonsentraatio Hyytiälän asemalla (vuorokaudenajan mukaan) \n", fontsize = 30)
fig.supxlabel("\nAika", fontsize = 25)
fig.legend(loc = "upper right", fontsize = 25)
plt.show()
../_images/bdcf712e63e77e20368bf885fe67056f34122131a30a06ea2ec754f45ebe6b02.png
# Äskeinen tietysti sekoittaa vuodenaikojen keskiarvot. Lisätehtävänä voisit tehdä tähän tarkemmankin jaon.

2. Paikallistarkastelussa Hyvinkää - kulkeeko henki?#

Hyvinkään kaupunki on ollut vuodesta 2008 asti osana kansallista ilmanlaatumittausten sarjaa, joihin pääsee käsiksi Ilmatieteen laitoksen sivuilta: https://www.ilmatieteenlaitos.fi/havaintojen-lataus ja joista saa nopean visualisaation https://www.ilmatieteenlaitos.fi/ilmanlaatu avulla.

Kaikilla asemilla ei mitata kaikkia suureita, joten ladataan aineistot ja katsotaan mitä siellä on tehty.

2.1 Aineisto#

# Haetaan aineistot Ilmatieteen laitoksen sivuilta.

Hyv8 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/Hyv812.csv",
                 parse_dates = {"Aika":["Vuosi", "Kk", "Pv", "Klo"]}, keep_date_col = True)
Hyv13 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/Hyv1317.csv",
                 parse_dates = {"Aika":["Vuosi", "Kk", "Pv", "Klo"]}, keep_date_col = True)
Hyv18 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/Hyv1822.csv",
                 parse_dates = {"Aika":["Vuosi", "Kk", "Pv", "Klo"]}, keep_date_col = True)

# Yhdistetään tiedot yhteen muuttujaan.

Hyv = pd.concat([Hyv8, Hyv13, Hyv18])

# Taulukossa on vääriä tietotyyppejä (tekstiä numeroiden sijaan). Korjataan tilanne.

Hyv["Vuosi"] = pd.to_numeric(Hyv["Vuosi"], errors = "coerce")
Hyv["Kk"] = pd.to_numeric(Hyv["Kk"], errors = "coerce")
Hyv["Pv"] = pd.to_numeric(Hyv["Pv"], errors = "coerce")
Hyv["Hengitettävät hiukkaset (ug/m3)"] = pd.to_numeric(Hyv["Hengitettävät hiukkaset (ug/m3)"], errors = "coerce")
Hyv["Typpidioksidi (ug/m3)"] = pd.to_numeric(Hyv["Typpidioksidi (ug/m3)"], errors = "coerce")
Hyv["Typpimonoksidi (ug/m3)"] = pd.to_numeric(Hyv["Typpimonoksidi (ug/m3)"], errors = "coerce")
# Katsotaan miltä aineisto näyttää.

Hyv
Aika Vuosi Kk Pv Klo Aikavyöhyke Ilmanlaatuindeksi (index) Hiilimonoksidi (ug/m3) Typpidioksidi (ug/m3) Typpimonoksidi (ug/m3) Otsoni (ug/m3) Hengitettävät hiukkaset (ug/m3) Pienhiukkaset (ug/m3) musta hiili PM2.5 (ug/m3) Rikkidioksidi (ug/m3) Haisevat rikkiyhdisteet (ugS/m3)
0 2008-01-01 00:00:00 2008 1 1 00:00 UTC - - 3.7 1.1 - 43.6 - - - -
1 2008-01-01 01:00:00 2008 1 1 01:00 UTC - - 3.1 0.7 - 30.4 - - - -
2 2008-01-01 02:00:00 2008 1 1 02:00 UTC - - 3.6 1.0 - 24.4 - - - -
3 2008-01-01 03:00:00 2008 1 1 03:00 UTC - - 4.1 0.9 - 19.6 - - - -
4 2008-01-01 04:00:00 2008 1 1 04:00 UTC - - 2.2 0.5 - 10.1 - - - -
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
19997 2022-07-25 12:00:00 2022 7 25 12:00 UTC - - NaN NaN - NaN - - - -
19998 2022-07-25 13:00:00 2022 7 25 13:00 UTC - - NaN NaN - NaN - - - -
19999 2022-07-25 14:00:00 2022 7 25 14:00 UTC - - NaN NaN - NaN - - - -
20000 2022-07-25 15:00:00 2022 7 25 15:00 UTC - - NaN NaN - NaN - - - -
20001 2022-07-25 16:00:00 2022 7 25 16:00 UTC - - NaN NaN - NaN - - - -

57676 rows × 16 columns

2.2 Hiukkasen asiaa#

Asemalla mitataan siis typpiyhdisteitä (NO$x$, tässä mono- ja dioksidi) sekä hengitettäviä hiukkasia (PM${10}$, particulate matter < 10 $\mu m$). Näiden mukaan laskettu ilmanlaadun indeksi on dynaamisesti määritettävä suure, jota ohjaa Suomen oloihin HSY:n ja THL:n määrittämä taulukko:

Indeksiluokitus

SO$_2$ (${\mu g} / {m^3}$)

NO$_2$ (${\mu g} / {m^3}$)

PM$_{10}$ (${\mu g} / {m^3}$)

Hyvä

alle 20

alle 40

alle 20

Tyydyttävä

20-80

40-70

20-50

Välttävä

80-250

70-150

50-100

Huono

250-350

150-200

100-200

Erittäin huono

yli 350

yli 200

yli 200

Hengitettävät hiukkaset

PM10

Pääasiassa pölyä ja suoloja, mutta mukana kulkeutuu myös haitallisia raskasmetalleja ja hiilivetyjä. Sisältää myös varsinaisten pienhiukkasten PM$_{2-5}$ joukon. Mikä on suurin lähde etenkin kaupungeissa?

PM2-5

Typpidioksidi NO$_2$

NOx

Hengitystä ärsyttävä aine, joka rehevöittää ja happamoittaa ekosysteemejä. Osallistuu matalalla ilmakehässä otsonin tuotantoon. Mistä typpiyhdisteitä syntyy?

2.3 Tutkitaas itse#

# Piirretään koko aineisto kuvaajaan.

plt.figure(figsize = (30, 10))

plt.plot(Hyv["Aika"], Hyv["Hengitettävät hiukkaset (ug/m3)"], color = "c", label = "Hengitettävät hiukkaset")
plt.plot(Hyv["Aika"], Hyv["Typpidioksidi (ug/m3)"], color = "b", label = "Typpidioksidi")
plt.plot(Hyv["Aika"], Hyv["Typpimonoksidi (ug/m3)"], color = "g", label = "Typpimonoksidi")

plt.title("Ilmanlaatu Hyvinkään kaupungissa", fontsize = 30, y = 1.1)
plt.ylabel("Konsentraatio ($\mu$g / m$^3$)", fontsize = 25)
plt.xlabel("Aika", fontsize = 25)

plt.legend(loc = "upper right")
plt.show()
../_images/ea0e3c0283803960736a1bec9c863dd50ddae605ad305eccefa53b421b3059fe.png

Tulipas huonosti luettava kuvaaja, mutta ainakin näemme miltä ajalta dataa on kerätty. Paloitellaan oikeasti mitatut vuodet (2008, 2013, 2014 ja 2018) vierekkäisiksi kuvaajiksi.

H08 = Hyv.query("Vuosi == 2008")
H13 = Hyv.query("Vuosi == 2013")
H14 = Hyv.query("Vuosi == 2014")
H18 = Hyv.query("Vuosi == 2018")

# query on kiva työkalu, jolle voisi antaa monimutkaisempiakin ohjeita, 
# esim. Hyv.query("(Vuosi == 2008) and (Kk > 2 and Kk < 6)")
fig, ax = plt.subplots(1, 4, sharex='col', sharey='row', figsize = (30, 10))

fig.suptitle("Ilmanlaatu Hyvinkään kaupungissa vuosittain", fontsize = 30, y = 1)
fig.supxlabel("Aika", fontsize = 25, y = -0.05)
fig.supylabel("Konsentraatio ($\mu$g / m$^3$)", fontsize = 25, x = 0.08)

H = [H08, H13, H14, H18]

# Tehdään kerralla useampi kuvaaja silmukan avulla.

for i in range(4):
    plt.subplot(1,4,i+1)
    plt.plot(H[i]["Aika"], H[i]["Hengitettävät hiukkaset (ug/m3)"], color = "c", label = "Hengitettävät hiukkaset")
    plt.plot(H[i]["Aika"], H[i]["Typpidioksidi (ug/m3)"], color = "b",label = "Typpidioksidi")
    plt.plot(H[i]["Aika"], H[i]["Typpimonoksidi (ug/m3)"], color = "g", label = "Typpimonoksidi")
    plt.xticks(rotation = 30)

plt.legend(loc = "upper right", fontsize = 20)
plt.show()
../_images/2d1c82b2c16e3470e4a910c37f864ccebd18527ee2a2c7225bbe80d2af821647.png

Miten Hyvinkään mittaukset vertautuvat annettuihin rajoihin? Milloin ja miksi rajat paukkuvat eniten?

# Valitaan tarkasteluun pienempi osa-alue, vaikkapa maalis-toukokuu joltakin vuodelta.

# Entä jos kokeilisit viivapiirron sijasta yksittäisten mittaustulosten merkkaamista?
# Lisää väriparametriin vaikkapa *, v, + tai muu sopiva merkki (täysi lista googlaamalla python plot marker).

Hm = Hyv.query("(Vuosi == 2018) and (Kk > 2 and Kk < 6)")

plt.figure(figsize = (30,10))

plt.title("Ilmanlaatu Hyvinkään kaupungissa", fontsize = 30, y = 1.1)
plt.xlabel("Aika", fontsize = 25)
plt.ylabel("Konsentraatio ($\mu$g / m$^3$)", fontsize = 25)

plt.plot(Hm["Aika"], Hm["Hengitettävät hiukkaset (ug/m3)"], "c", label = "Hengitettävät hiukkaset")
plt.plot(Hm["Aika"], Hm["Typpidioksidi (ug/m3)"], "b",label = "Typpidioksidi")
plt.plot(Hm["Aika"], Hm["Typpimonoksidi (ug/m3)"], "g", label = "Typpimonoksidi")
plt.xticks(rotation = 30)

plt.legend()
plt.show()
../_images/8f9985148928a79701dbe60846be2b4edae4e6c831d2c1a83923a2e00744b6b5.png

Tarkkojen tuntimittausten ohella voisimme tietysti kaivaa aineistosta myös päiväkohtaiset keskiarvot.

# Päiväkeskiarvot on helpointa toteuttaa lisäämällä aineistoon ladattaessa kelloton aikasarake.

Vrk8 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/Hyv812.csv",
                 parse_dates = {"Vrk":["Vuosi", "Kk", "Pv"]}, keep_date_col = True)

Vrk8["Vuosi"] = pd.to_numeric(Vrk8["Vuosi"], errors = "coerce")
Vrk8["Kk"] = pd.to_numeric(Vrk8["Kk"], errors = "coerce")
Vrk8["Pv"] = pd.to_numeric(Vrk8["Pv"], errors = "coerce")
Vrk8["Hengitettävät hiukkaset (ug/m3)"] = pd.to_numeric(Vrk8["Hengitettävät hiukkaset (ug/m3)"], errors = "coerce")
Vrk8["Typpidioksidi (ug/m3)"] = pd.to_numeric(Vrk8["Typpidioksidi (ug/m3)"], errors = "coerce")
Vrk8["Typpimonoksidi (ug/m3)"] = pd.to_numeric(Vrk8["Typpimonoksidi (ug/m3)"], errors = "coerce")

# Nyt voimme ryhmitellä groupby()-komennolla kaikki uniikit vuorokaudet ja laskea niihin liittyvät keskiarvot.

KV = Vrk8.groupby(["Vrk"]).mean(numeric_only = True)
# Tarkastellaan tulosta.

KV
Vuosi Kk Pv Typpidioksidi (ug/m3) Typpimonoksidi (ug/m3) Hengitettävät hiukkaset (ug/m3)
Vrk
2008-01-01 2008.0 1.0 1.0 4.112500 1.154167 15.162500
2008-01-02 2008.0 1.0 2.0 7.112500 3.500000 8.229167
2008-01-03 2008.0 1.0 3.0 8.695455 4.427273 15.370833
2008-01-04 2008.0 1.0 4.0 15.441667 5.908333 16.350000
2008-01-05 2008.0 1.0 5.0 8.820833 3.566667 20.275000
... ... ... ... ... ... ...
2012-12-27 2012.0 12.0 27.0 NaN NaN NaN
2012-12-28 2012.0 12.0 28.0 NaN NaN NaN
2012-12-29 2012.0 12.0 29.0 NaN NaN NaN
2012-12-30 2012.0 12.0 30.0 NaN NaN NaN
2012-12-31 2012.0 12.0 31.0 NaN NaN NaN

578 rows × 6 columns

# Piirretään päiväkeskiarvot kuvaajaan

plt.figure(figsize = (30,10))

plt.plot(KV["Hengitettävät hiukkaset (ug/m3)"], "cv", label = "Hengitettävät hiukkaset")
plt.plot(KV["Typpidioksidi (ug/m3)"], "b*", label = "Typpidioksidi")
plt.plot(KV["Typpimonoksidi (ug/m3)"],"gs", label = "Typpimonoksidi")
plt.xticks(rotation = 30)

# Lisätään selkeyden nimissä myös pari rajaviivaa kuvaajaan, jotta sitä on helpompaa tulkita.

plt.axhline(20, linestyle='--', label = "Hyvä hh", c = 'r', alpha = 0.5)
plt.axhline(40, linestyle='--', label = "Hyvä NOx", c = 'b', alpha = 0.5)
plt.axhline(50, linestyle='--', label = "Tyydyttävä hh", c = 'orange', alpha = 0.5)
plt.axhline(70, linestyle='--', label = "Tyydyttävä NOx", c = 'y', alpha = 0.5)

plt.title("Ilmanlaatu Hyvinkään kaupungissa", fontsize = 30, y = 1.1)
plt.xlabel("Aika", fontsize = 25)
plt.ylabel("Konsentraatio ($\mu$g / m$^3$)", fontsize = 25)

plt.legend()
plt.show()
../_images/8f1a9c64ee82a0fc1b5472921c84a4e61dc984785f1339f1ce5aa8b0ac81909c.png

Miksi havainnot sahaavat piikkeinä ylös alas? Entä jos tarkastelisimmekin havaintoja kellonajan mukaan?

# Kellonaikakohtaiset keskiarvot aiemmin jaotellusta "Hm"-muuttujasta.

KA = Hm.groupby(["Klo"]).mean(numeric_only = True)
KA
Vuosi Kk Pv Typpidioksidi (ug/m3) Typpimonoksidi (ug/m3) Hengitettävät hiukkaset (ug/m3)
Klo
00:00 2018.0 4.0 15.836957 10.730435 1.190217 21.031522
01:00 2018.0 4.0 15.836957 10.766304 1.422826 19.560870
02:00 2018.0 4.0 15.836957 11.346739 1.559783 17.760870
03:00 2018.0 4.0 15.836957 14.751087 3.486957 22.707609
04:00 2018.0 4.0 15.836957 18.798913 6.506522 26.985870
05:00 2018.0 4.0 15.836957 21.261957 9.464130 29.336957
06:00 2018.0 4.0 15.836957 21.580220 11.089011 31.188043
07:00 2018.0 4.0 15.836957 20.080435 12.565217 31.695652
08:00 2018.0 4.0 15.836957 18.037778 10.473333 28.904348
09:00 2018.0 4.0 15.836957 17.530769 10.491209 30.444565
10:00 2018.0 4.0 15.836957 16.947826 10.365217 30.213043
11:00 2018.0 4.0 15.836957 16.363736 9.236264 31.143956
12:00 2018.0 4.0 15.836957 16.744565 9.334783 31.305435
13:00 2018.0 4.0 15.836957 17.111957 9.029348 31.188043
14:00 2018.0 4.0 15.836957 17.672826 8.589130 32.038043
15:00 2018.0 4.0 15.836957 17.640217 7.828261 32.889130
16:00 2018.0 4.0 15.836957 18.339130 7.413043 31.136957
17:00 2018.0 4.0 15.836957 19.505435 6.957609 30.928261
18:00 2018.0 4.0 15.836957 20.693478 6.100000 34.068478
19:00 2018.0 4.0 15.836957 18.895652 4.529348 34.323913
20:00 2018.0 4.0 15.836957 16.751087 3.055435 30.425000
21:00 2018.0 4.0 15.836957 13.579348 2.171739 29.547826
22:00 2018.0 4.0 15.836957 12.763043 1.643478 23.291304
23:00 2018.0 4.0 15.836957 10.471739 0.901087 20.258427
# Piirretään ajallinen jakauma keskiarvojen avulla. 

plt.figure(figsize = (30,10))

plt.plot(KA["Hengitettävät hiukkaset (ug/m3)"], color = "c", label = "Hengitettävät hiukkaset")
plt.plot(KA["Typpidioksidi (ug/m3)"], color = "b",label = "Typpidioksidi")
plt.plot(KA["Typpimonoksidi (ug/m3)"], color = "g", label = "Typpimonoksidi")
plt.xticks(rotation = 30)

# Lisätään selkeyden nimissä myös pari rajaviivaa kuvaajaan, jotta sitä on helpompaa tulkita.

plt.axhline(20, linestyle='--', label = "Hyvä hh", c = 'r', alpha = 0.5)
plt.axhline(40, linestyle='--', label = "Hyvä NOx", c = 'b', alpha = 0.5)
plt.axhline(50, linestyle='--', label = "Tyydyttävä hh", c = 'orange', alpha = 0.5)
plt.axhline(70, linestyle='--', label = "Tyydyttävä NOx", c = 'y', alpha = 0.5)

plt.title("Ilmanlaatu Hyvinkään kaupungissa vuonna ???", fontsize = 30, y = 1.1)
plt.xlabel("Aika", fontsize = 25)
plt.ylabel("Konsentraatio ($\mu$g / m$^3$)", fontsize = 25)

plt.legend()
plt.show()
../_images/8d46956174ea7f7c3cc9823fa274310036548de612e559c8076abd7f74315fe8.png

Tuloksia voi käydä huvin vuoksi vertaamassa kansainväliseen tilaan World Air Quality Index -projektin sivuilta, vaikkapa Kiinaan tai Intiaan:

https://aqicn.org/map/china/