KESTÄVYYS - fysikaalisia pohdintoja ilmakehästämme #

v0.2 28.12. - TÄMÄ KIRJANEN ON KESKEN JA JATKAA KEHITYSTÄÄN 2024 TAMMIKUUHUN

Työn rakenne#

Yksinkertainen projekti noudattaa yleensä simppeliä perusrakennetta:

  1. Määritetään kiinnostuksen kohde (tutkimuskysymys)

  2. Etsitään aineistoa (datankeruu)

  3. Tarkastellaan löydöksiä (analyysi)

  4. Arvioidaan, kritisoidaan (tulokset ja johtopäätökset)

  5. Selitetään tarpeen mukaan käytetyt aineistot (lähteet)

1. Tutkimuskysymyksiä #

Ilmastonmuutoksen ymmärtäminen ja seuraaminen vaatii maailmanlaajuista verkostoa. Kansalliset säähavaintoasemat, tutkimuslaitokset, yliopistot ja monet muut instituutit ympäri planeettaa tarjoavat kattavan valikoiman jatkuvasti päivittyviä havaintoja käyttöömme.

Valitaan aluksi mitä suureita aiomme tarkastella. Lämpötila, hiilidioksidin ja metaanin määrä ilmassa, kasvuston hiilensidonta ja -vapautus, sade ja tuulet ja niin edelleen.

Miten valitut suureet käyttäytyvät ajan mukaan? Millaista vaihtelua niissä esiintyy? Miten mittauspaikan sijainti vaikuttaa tuloksiin?

2. Aineisto #

Otetaan pohjaksi hiilen kiertoon keskittyvän ICOS-projektin aineistoja. Tämän monikansallisen yhteisponnistuksen sivuilta löytyy korkealaatuisia mittauksia yhteisessä ja täten näppärästi vertailtavassa muodossa.

HUOM! Aineistoissa on kymmeniä tai satoja tuhansia rivejä havaintoja ja paljon erilaisia kryptisesti nimettyjä sarakkeita, joihin asemien mittaukset on tallennettu. Kunkin aineiston kohdalla on linkki portaalin sivulle, josta voi katsoa niin kutsutusta metadatasta mitä kunkin sarakkeen nimi tarkoittaa. Tutkimustyössä erilaisten selitteiden ja viitteiden tekeminen on tärkeää epäselvyyksien välttämiseksi.

2.1 Työkalut#

# Tuodaan tarvittavat työkalukirjastot.

import pandas as pd 
import matplotlib.pyplot as plt
import numpy as np

2.2 Data - Hyytiälä, Keski-Suomi#

# Metaanikonsentraatio
# Hyytiälä 67.2 m CH4 2016-12-13–2023-03-31
# https://meta.icos-cp.eu/objects/XRJWd0QZw0wKGjXZnspH20t5

HyyCH4 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/HyyCH4.csv",
                     parse_dates = ["TIMESTAMP"])

# Hiilidioksidikonsentraatio
# Hyytiälä 67.2 m CO2 2016-12-13–2023-03-31
# https://meta.icos-cp.eu/objects/9Y6WV_HjpEVbbc-lq_FE9qV8

HyyCO2 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/HyyCO2.csv",
                     parse_dates = ["TIMESTAMP"])

# Säätiedot
# Hyytiälä 67.2 m ICOS ATC Meteo 2017-12-31–2022-12-31
# https://meta.icos-cp.eu/objects/zdx_A4ariX25X6Pu8DUG_vE1

HyyMeteo = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/HyyMeteo.csv",
                       parse_dates = ["TIMESTAMP"])

# Virtaukset
# Hyytiälän FLUXNET-arkisto 1996-2020
# https://meta.icos-cp.eu/objects/4F2-9d7QV9A0SlL2pIaRxsJP

HyyGPP = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/HyyFluxGPP.csv",
                     parse_dates = ["TIMESTAMP"])
HyyNEE = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/HyyFluxNEE.csv",
                     parse_dates = ["TIMESTAMP"]) # tässä mukana myös lämpötila

2.3 Data - Utö, Meri-Suomi#

# Metaanikonsentraatio
# Atmospheric CH4 product, Utö - Baltic sea (57.0 m) 2012-03-23–2023-03-31
# https://meta.icos-cp.eu/objects/0QpkTakURubEz9vnSxkAIL3j

UtCH4 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/UtCH4.csv",
                    parse_dates = ["TIMESTAMP"])

# Hiilidioksidikonsentraatio
# Atmospheric CO2 product, Utö - Baltic sea (57.0 m) 2012-03-23–2023-03-31
# https://meta.icos-cp.eu/objects/Gfcb8rZBPxZQNJgm7qiwAcYz

UtCO2 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/UtCO2.csv",
                    parse_dates = ["TIMESTAMP"])

# Säätiedot
# Utö 58 m ICOS ATC Meteo 2018-12-12–2023-03-31
# https://meta.icos-cp.eu/objects/Q9In1Q-KI-HrxDHlrHytOCOd

UtMeteo = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/UtMeteo.csv",
                      parse_dates = ["TIMESTAMP"])

2.4 Data - Pallas ja Kenttärova, Pohjois-Suomi#

# Atmospheric CH4 product, Pallas (12.0 m)
# 2004-02-11–2023-03-31
# https://meta.icos-cp.eu/objects/ATqgqugIHsWAIXKZgEq2QkKz

PalCH4 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/PalCH4.csv",
                     parse_dates = ["TIMESTAMP"])

# Atmospheric CO2 product, Pallas (12.0 m)
# 1998-07-01–2023-03-31
# https://meta.icos-cp.eu/objects/sp32Z270ruWRU847KagynNOK

PalCO2 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/PalCO2.csv",
                     parse_dates = ["TIMESTAMP"])

# Fluxnet Product, Kenttarova
# 2017-12-31–2020-12-31
# https://meta.icos-cp.eu/objects/vXcr9a7FPpBA3_Tg5X2gT1xo

KenFlux1 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/KenFlux1.csv",
                       parse_dates = ["TIMESTAMP"])

# ETC L2 Fluxnet (half-hourly), Kenttarova
# 2019-12-31–2022-12-31
# https://meta.icos-cp.eu/objects/aqULa_iF0GDVTc4_AUb7h-nN

KenFlux2 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/KenFlux2.csv",
                       parse_dates = ["TIMESTAMP"])
/tmp/ipykernel_1920/2414738136.py:19: DtypeWarning: Columns (7,11,13,25) have mixed types. Specify dtype option on import or set low_memory=False.
  KenFlux1 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/KenFlux1.csv",

2.5 Data - Karlsruhe, Saksa#

# Metaanikonsentraatio
# Karlsruhe 60 m CH4 2016-12-16–2023-03-31
# https://meta.icos-cp.eu/objects/lO1I16P7gM7zloZbzWLSur02

KarlCH4 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/KarlCH4.csv",
                      parse_dates = ["TIMESTAMP"])

# Hiilidioksidikonsentraatio
# Karlsruhe 60 m CO2 2016-12-16–2023-03-31
# https://meta.icos-cp.eu/objects/vXTxJscV4CHFfaljH9KQ5pty

KarlCO2 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/KarlCO2.csv",
                      parse_dates = ["TIMESTAMP"])

# Säätiedot
# Karlsruhe 60 m ICOS ATC Meteo 2019-08-01–2023-03-31
# https://meta.icos-cp.eu/objects/rJGDmG0anqNeRrPyLBuog258

KarlMeteo = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/KarlMeteo.csv",
                        parse_dates = ["TIMESTAMP"])

2.6 Data - Castelporziano 2, Italia#

# Virtaukset
# Castelporziano ETC L2 Fluxnet 2020-12-31–2023-10-31
# https://meta.icos-cp.eu/objects/DZcO_1NvbH4wRqTcxnNVKd47

CasFlux = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/CasFlux.csv",
                      parse_dates = ["TIMESTAMP"])

# Säätiedot
# Castelporziano ETC L2 Meteo 2020-12-31–2023-10-31
# https://meta.icos-cp.eu/objects/b9jFmI9WtonRGMRRsWOeBQK9

CasMeteo = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/CasMeteo.csv",
                       parse_dates = ["TIMESTAMP"])
/tmp/ipykernel_1920/3475241156.py:5: DtypeWarning: Columns (11,13,25) have mixed types. Specify dtype option on import or set low_memory=False.
  CasFlux = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/CasFlux.csv",

2.7 Data - Izaña, Espanja (Teneriffa)#

# Metaanikonsentraatio
# Atmospheric CH4 product, Izaña (29.0 m) 1984-01-01–2023-03-31
# https://meta.icos-cp.eu/objects/j_qLA35m18_V9HXmKXNTtV1d

IzaCH4 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/IzaCH4.csv",
                     parse_dates = ["TIMESTAMP"])

# Hiilidioksidikonsentraatio
# Atmospheric CO2 product, Izaña (29.0 m) 2007-01-19–2023-03-31
# https://meta.icos-cp.eu/objects/pinswiNsT4yB9YSX5O-TlAYD

IzaCO2 = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/IzaCO2.csv",
                     parse_dates = ["TIMESTAMP"])

# Säähavainnot
# 1996-01-01-2023-12-21
# https://meteostat.net/en/station/60010
# (eri kohteesta haettu, koska ICOS-ajan tiedot ovat vielä hyvin lyhyet vaikka sääasemalla onkin pitkä historia)

IzaMet = pd.read_csv("https://raw.githubusercontent.com/opendata-education/Tyopajat/main/materiaali/data/IzaMet.csv",
                     parse_dates = ["date"])

3. Analyysi #

Lähdetään tarkastelemaan mitä aineistoissa on. Alla oleva esimerkki on tehty Hyytiälän havainnoista, mutta samoilla käskyillä pystyt tarkastelemaan muitakin asemia vaihtamalla sisään toisennimisiä muuttujia.

3.1 Vilkaisu aineistoihin#

# Katsotaan miltä muuttujiin tallennettu kama näyttää. 

HyyCO2
Flag NbPoints Stdev TIMESTAMP co2
0 N 0 -9.990 2016-12-13 00:00:00 NaN
1 N 0 -9.990 2016-12-13 01:00:00 NaN
2 N 0 -9.990 2016-12-13 02:00:00 NaN
3 N 0 -9.990 2016-12-13 03:00:00 NaN
4 O 4 0.011 2016-12-13 04:00:00 411.701996
... ... ... ... ... ...
55182 O 20 0.172 2023-03-31 19:00:00 428.299011
55183 O 20 0.062 2023-03-31 20:00:00 427.690002
55184 O 20 0.014 2023-03-31 21:00:00 427.572998
55185 O 10 0.022 2023-03-31 22:00:00 427.911987
55186 O 20 0.039 2023-03-31 23:00:00 428.066986

55187 rows × 5 columns

# Tehdään mahdollisimman yksinkertainen kuvaaja yhden sarakkeen tiedoista.

plt.plot(HyyCO2["TIMESTAMP"], HyyCO2["co2"])
plt.show()
../_images/8876bd1b69ac593026a06e92a2d078ebc69d246a5e0be5f16eb9c480d23db747.png

Onko kuvaajassa havaittavissa toistuvia kuvioita? Mistä on kyse?

3.2 Yksityiskohtaisempi vilkaisu#

# Lisätään muotoilutermejä.

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

plt.plot(HyyCO2["TIMESTAMP"], HyyCO2["co2"], label = "CO2", color = "green")

plt.ylabel("Hiilidioksidikonsentraatio ilmassa (µmol mol-1) \n", fontsize = 15)
plt.xlabel("\n Aika (vuosi)", fontsize = 15)
plt.title("CO2-fraktio ilmakehässä Hyytiälän SMEAR-asemalla 2017-2023 \n", fontsize = 20)
plt.legend(loc = "upper left", fontsize = 20)

plt.show()
../_images/1790156ef8222723133d01dffb2cfa9d760734def44cf04e2c3530906341379d.png
# Laitetaan useampi suure näkyviin samaan aikaan.

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

plt.subplot(311)
plt.plot(HyyCO2["TIMESTAMP"], HyyCO2["co2"], label = "CO2", c = "g")
plt.ylabel("Konsentraatio ilmassa \n (µmol mol-1) \n", fontsize = 10)
plt.legend(loc = "upper left", fontsize = 20)

plt.title("Molekyylifraktiot ilmakehässä Hyytiälän SMEAR-asemalla 2017-2023 \n", fontsize = 20)

plt.subplot(312)
plt.plot(HyyCH4["TIMESTAMP"], HyyCH4["ch4"], label = "CH4", c = "b")
plt.ylabel("Konsentraatio ilmassa \n (nmol mol-1) \n", fontsize = 10)
plt.legend(loc = "upper left", fontsize = 20)

plt.subplot(313)
plt.plot(HyyMeteo["TIMESTAMP"], HyyMeteo["AT"], label = "Lämpötila", c = "cyan")
plt.ylabel("Ilman lämpötila (°C) \n", fontsize = 10)
plt.legend(loc = "upper left", fontsize = 20)

plt.xlabel("\n Aika (vuosi)", fontsize = 15)
plt.show()
../_images/84c135716464d03323afe1eabab94032d57630a49e74fdebb0104ff87710abdf.png

Riippuvatko kuvaajien suureet toisistaan? Onko niissä havaittavia yhteneväisyyksiä tai poikkeavuuksia?

# Toistetaan äskeinen myös kasvuston toiminnalle hieman pidemmältä ajalta. Lisätään nollaviiva selkeyttämään.

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

plt.subplot(311)
plt.plot(HyyNEE["TIMESTAMP"], HyyNEE["NEE_VUT_REF"], label = "NEE", c = "g")
plt.axhline(y = 0, color = 'y', linestyle = 'dashed')
plt.ylabel("Ekosysteemin nettovaihtovuo \n (µmol m-2 s-1) \n", fontsize = 10)
plt.legend(loc = "upper left", fontsize = 20)

plt.title("Metsän hiilenkierto Hyytiälän SMEAR-asemalla 1996-2020 \n", fontsize = 20)

plt.subplot(312)
plt.plot(HyyGPP["TIMESTAMP"], HyyGPP["GPP_DT_VUT_REF"], label = "GPP DT", c = "b", alpha = 0.5)
plt.plot(HyyGPP["TIMESTAMP"], HyyGPP["GPP_NT_VUT_REF"], label = "GPP NT", c = "orange", alpha = 0.5)
plt.axhline(y = 0, color = 'y', linestyle = 'dashed')
plt.ylabel("CO2 bruttotuotto \n (µmol m-2 s-1) \n", fontsize = 10)
plt.legend(loc = "upper left", fontsize = 20)

plt.subplot(313)
plt.plot(HyyNEE["TIMESTAMP"], HyyNEE["TA_F"], label = "Lämpötila", c = "cyan")
plt.axhline(y = 0, color = 'y', linestyle = 'dashed')
plt.ylabel("Ilman lämpötila (°C) \n", fontsize = 10)
plt.legend(loc = "upper left", fontsize = 20)

plt.xlabel("\n Aika (vuosi)", fontsize = 15)
plt.show()
../_images/6bc88b8add7508c8b1e917309f6b8a49f375873ba8ea57735b98767387554194.png

Näkyykö pitkässä sarjassa vaihtelua vuosien tai vuodenaikojen välillä?

3.3. Aineiston ymmärtäminen vaatii sen muokkaamista#

Kuvaajia tarkasteltaessa on hyvä huomioida mittausten määrä ja tiheys. Yllä olevat tiedot on kerätty automaattisesti tunneittain tai tiheämmin, mikä saattaa välillä johtaa hankaluuksiin kuvaajien lukemisessa piirtotiheyden vuoksi. Selkeyden nimissä on usein tarpeen jaotella, luokitella tai muutoin muokata alkuperäistä dataa sekä eristää sieltä nousevia tilastollisia muuttujia.

# Muokataan olemassaolevaa muuttujaa siten, että erotetaan tallennetusta aikaleimasta päivät, kellonajat sun muut omiksi
# sarakkeikseen. Tällöin on helpompaa leikellä aineistosta palasia, kuten "vain kesäkuukaudet" tai vastaavat.

# Esimerkiksi hiilidioksiditaulukkomme ensimmäisten kymmenen rivin sisältö oli:
print("HyyCO2 aluksi: ")
print(HyyCO2.head(10))

# Lisätään sarakkeet kaivamalla aikaleimasta tiedot kullekin riville.

HyyCO2['PVM'] = pd.to_datetime(HyyCO2['TIMESTAMP']).dt.date
HyyCO2['PVM'] = pd.to_datetime(HyyCO2['PVM'])                # Tässä korjataan date-tyyppi erilaiseksi aikaleimaksi.
HyyCO2['VUO'] = pd.to_datetime(HyyCO2['TIMESTAMP']).dt.year
HyyCO2['KK'] = pd.to_datetime(HyyCO2['TIMESTAMP']).dt.month
HyyCO2['VRK'] = pd.to_datetime(HyyCO2['TIMESTAMP']).dt.day
HyyCO2['TUN'] = pd.to_datetime(HyyCO2['TIMESTAMP']).dt.hour

print("HyyCO2 pienen muokkauksen jälkeen: ")
print(HyyCO2.head(10))
HyyCO2 aluksi: 
  Flag  NbPoints  Stdev           TIMESTAMP         co2
0    N         0 -9.990 2016-12-13 00:00:00         NaN
1    N         0 -9.990 2016-12-13 01:00:00         NaN
2    N         0 -9.990 2016-12-13 02:00:00         NaN
3    N         0 -9.990 2016-12-13 03:00:00         NaN
4    O         4  0.011 2016-12-13 04:00:00  411.701996
5    O        20  0.185 2016-12-13 05:00:00  411.799988
6    O        10  2.023 2016-12-13 06:00:00  414.533997
7    O        20  0.222 2016-12-13 07:00:00  416.558014
8    O        20  0.338 2016-12-13 08:00:00  416.367004
9    O        20  0.401 2016-12-13 09:00:00  417.058990
HyyCO2 pienen muokkauksen jälkeen: 
  Flag  NbPoints  Stdev           TIMESTAMP         co2        PVM   VUO  KK  \
0    N         0 -9.990 2016-12-13 00:00:00         NaN 2016-12-13  2016  12   
1    N         0 -9.990 2016-12-13 01:00:00         NaN 2016-12-13  2016  12   
2    N         0 -9.990 2016-12-13 02:00:00         NaN 2016-12-13  2016  12   
3    N         0 -9.990 2016-12-13 03:00:00         NaN 2016-12-13  2016  12   
4    O         4  0.011 2016-12-13 04:00:00  411.701996 2016-12-13  2016  12   
5    O        20  0.185 2016-12-13 05:00:00  411.799988 2016-12-13  2016  12   
6    O        10  2.023 2016-12-13 06:00:00  414.533997 2016-12-13  2016  12   
7    O        20  0.222 2016-12-13 07:00:00  416.558014 2016-12-13  2016  12   
8    O        20  0.338 2016-12-13 08:00:00  416.367004 2016-12-13  2016  12   
9    O        20  0.401 2016-12-13 09:00:00  417.058990 2016-12-13  2016  12   

   VRK  TUN  
0   13    0  
1   13    1  
2   13    2  
3   13    3  
4   13    4  
5   13    5  
6   13    6  
7   13    7  
8   13    8  
9   13    9  
# Kokeillaan kuukausikeskiarvojen laskemista.

KA = HyyCO2.groupby(["KK"]).mean(numeric_only = True)

print(KA["co2"])

k = ["tammi", "helmi", "maalis", "huhti", "touko", "kesä", "heinä", "elo", "syys", "loka", "marras", "joulu"]

plt.figure(figsize = (20, 10))
plt.plot(k, KA["co2"], c = "y")
plt.scatter(k, KA["co2"], c = "red", label = "CO2")

plt.ylabel("Konsentraatio ilmassa (µmol mol-1) \n", fontsize = 15)
plt.xlabel("\n Aika (kuukausi)", fontsize = 15)
plt.title("Hiilidioksidifraktio ilmakehässä Hyytiälän SMEAR-asemalla, kuukausikeskiarvo 2017-2023 \n", fontsize = 20)
plt.legend(loc = "center right", fontsize = 15)

plt.show()
KK
1     423.198319
2     423.515493
3     421.977163
4     419.385665
5     416.916250
6     410.259946
7     405.291253
8     405.807815
9     410.800205
10    417.163443
11    422.484851
12    423.381851
Name: co2, dtype: float64
../_images/4585d4de11b784ec0ea5e56bbf9a312417776e4ce16b3b296319cc89aca091de.png

Miltä keskiarvoistettu kuvaaja näyttää alkuperäisiin havaintoihin verrattuna?

# Pitkästä aineistosta voidaan havaita vuodenaikaisvaihtelua.
# Entäs lyhyemmällä ajalla, kuten yksittäisen vuorokauden aikana?

d = '2017-07-06'
pvm = HyyCO2.query("PVM == @d")

plt.figure(figsize = (20, 10))
plt.plot(pvm["TIMESTAMP"], pvm["co2"], c = "y")
plt.scatter(pvm["TIMESTAMP"], pvm["co2"], c = "red", label = "CO2")

plt.ylabel("Konsentraatio ilmassa (µmol mol-1) \n", fontsize = 15)
plt.xlabel("\n Aika (h)", fontsize = 15)
plt.title(f"Hiilidioksidifraktio ilmakehässä Hyytiälän SMEAR-asemalla, {d} \n", fontsize = 20)
plt.legend(loc = "center right", fontsize = 15)

plt.show()
../_images/6e3e30d291b3693bd2c7449f9bbcfaace7e2f6fb39a0de238cfa2326d94b1da0.png
# Tai tiettyjen päivämäärien välillä?
# Kokeile vaihtaa päivämääriä vaikkapa kahden päivän, viikon tai kuukauden ajalle.

a = '2017-07-07'
b = '2017-07-09'
vali = HyyCO2.query("PVM >= @a & PVM < @b")

plt.figure(figsize = (20, 10))
plt.plot(vali["TIMESTAMP"], vali["co2"], c = "y")
plt.scatter(vali["TIMESTAMP"], vali["co2"], c = "red", label = "CO2")

plt.ylabel("Konsentraatio ilmassa (µmol mol-1) \n", fontsize = 15)
plt.xlabel("\n Aika (h)", fontsize = 15)
plt.title(f"Hiilidioksidifraktio ilmakehässä Hyytiälän SMEAR-asemalla, {a} ja {b} välillä \n", fontsize = 20)
plt.legend(loc = "center right", fontsize = 15)

plt.show()
../_images/a34e72b11313072a54ae7cc410a027925dce4ab60a1019dda200c36328b703e0.png

Millaisia eroja löydät päivien välillä saman vuodenajan sisällä? Muuttuvatko päivävaihteluiden arvot tai muodot vuodenaikojen välillä?

3.4 Yhteyksien löytäminen vaatii useiden suureiden ja aineistojen vertailua#

# Päivittäiset CO2-tasot, lämpötilat, sademäärä, lyhytaaltosäteily, GPP?

3.5 Vertailu eri asemien välillä kertoo paikallisista eroista#

# Esimerkkinä Hyytiälä v. Izana

ala = "2016-01-01"
yla = "2024-01-01"

ala = pd.to_datetime(ala)
yla = pd.to_datetime(yla)

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

ax1 = plt.subplot(211)
plt.plot(HyyCO2["TIMESTAMP"], HyyCO2["co2"], label = "Hyytiälä", c = "g", alpha = 0.5)
plt.plot(IzaCO2["TIMESTAMP"], IzaCO2["co2"], label = "Izana", c = "b", alpha = 0.5)
plt.ylabel("Konsentraatio ilmassa \n (µmol mol-1) \n", fontsize = 10)
plt.legend(loc = "upper left", fontsize = 20)
plt.xlim(ala, yla)

plt.title(f"CO2-pitoisuudet ja lämpötilat mitta-asemien ilmatilassa {ala} - {yla} \n", fontsize = 20)

plt.subplot(212, sharex = ax1)
plt.plot(HyyMeteo["TIMESTAMP"], HyyMeteo["AT"], label = "Hyytiälä", c = "cyan", alpha = 0.7)
plt.plot(IzaMet["date"], IzaMet["tavg"], label = "Izana", c = "red", alpha = 0.5)
plt.axhline(y = 0, color = 'y', linestyle = 'dashed')
plt.ylabel("Ilman lämpötila (°C) \n", fontsize = 10)
plt.legend(loc = "upper left", fontsize = 20)

plt.xlabel("\n Aika (vuosi)", fontsize = 15)
plt.show()
../_images/8378b3fe9cdff06ba1aa73fdc8d673b78eb002ff90c5cb41b6832fa9f4b94d70.png

Miten Suomen ja Kanariansaarten havainnot eroavat toisistaan? Onko aineistoissa havaittavissa hetkellisiä poikkeamia? Onko lämpötiloissa syytä huomioida ero sillä, että Izañan arvot ovat päiväkohtaisia keskiarvoja?

# Sovitetaan ylösalas sahaaviin havaintoihin yleiskuvaa tasoittava trendiviivakin.

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

# Havainnot

plt.plot(HyyCO2["TIMESTAMP"], HyyCO2["co2"], label = "Hyytiälä", c = "g", alpha = 0.5)
plt.plot(IzaCO2["TIMESTAMP"], IzaCO2["co2"], label = "Izana", c = "b", alpha = 0.5)

# Hyytiälän trendi

x = np.arange(HyyCO2['TIMESTAMP'].size)
y = HyyCO2["co2"].copy()
y[np.isnan(y)] = y[~np.isnan(y)].mean()

z = np.polyfit(x, y, 1)
p = np.poly1d(z)
plt.plot(HyyCO2['TIMESTAMP'], p(x), c = "black", linestyle = "dashed", label = "Hyytiälä", alpha = 0.7)

# Izañan trendi

q = np.arange(IzaCO2['TIMESTAMP'].size)
w = IzaCO2["co2"].copy()
w[np.isnan(w)] = w[~np.isnan(w)].mean()

v = np.polyfit(q, w, 1)
pf = np.poly1d(v)
plt.plot(IzaCO2['TIMESTAMP'], pf(q), "r--", label = "Izana", alpha = 0.7)

# Selitteet

plt.xlabel("\n Aika (vuosi)", fontsize = 20)
plt.ylabel("Konsentraatio ilmassa (µmol mol-1) \n", fontsize = 20)
plt.legend(loc = "upper left", fontsize = 20)

plt.title("CO2-pitoisuuksien trendi mitta-asemilla 2008-2023 \n", fontsize = 20)
plt.show()

print(f"Hyytiälän trendiviivan yhtälö: y = {z[0]}*x + {z[1]}")
print(f"Izañan trendiviivan yhtälö: y = {v[0]}*x + {v[1]}")
../_images/3c3d8740be74b41886d229d75c5dd077a565ed4838cbcfea6390ce7316f89798.png
Hyytiälän trendiviivan yhtälö: y = 0.000265559521964558*x + 409.66596100363256
Izañan trendiviivan yhtälö: y = 0.0002577758260034958*x + 382.6098250512164

4. Tulokset ja johtopäätökset #

5. Lähteet #