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:
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()
# Ä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()
# 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()
# Ä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
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?
Typpidioksidi NO$_2$
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()
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()
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()
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()
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()
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/