Flux: NEE (2005-2024)#

Author: Lukas Hörtnagl (holukas@ethz.ch)

Imports#

import importlib.metadata
import warnings
from datetime import datetime
from pathlib import Path
import pandas as pd
import matplotlib.pyplot as plt

import diive as dv
from diive.core.io.files import save_parquet, load_parquet
from diive.core.plotting.cumulative import CumulativeYear

warnings.filterwarnings(action='ignore', category=FutureWarning)
warnings.filterwarnings(action='ignore', category=UserWarning)
version_diive = importlib.metadata.version("diive")
print(f"diive version: v{version_diive}")
diive version: v0.87.0

Load data#

SOURCEDIR = r"../80_FINALIZE"
FILENAME = r"81.1_FLUXES_M15_MGMT_L4.2_NEE_GPP_RECO_LE_H_FN2O_FCH4.parquet"
FILEPATH = Path(SOURCEDIR) / FILENAME
df = load_parquet(filepath=FILEPATH)
df
Loaded .parquet file ..\80_FINALIZE\81.1_FLUXES_M15_MGMT_L4.2_NEE_GPP_RECO_LE_H_FN2O_FCH4.parquet (7.102 seconds).
    --> Detected time resolution of <30 * Minutes> / 30min 
.PREC_RAIN_TOT_GF1_0.5_1_MEAN3H-12 .PREC_RAIN_TOT_GF1_0.5_1_MEAN3H-18 .PREC_RAIN_TOT_GF1_0.5_1_MEAN3H-24 .PREC_RAIN_TOT_GF1_0.5_1_MEAN3H-6 .SWC_GF1_0.15_1_gfXG_MEAN3H-12 .SWC_GF1_0.15_1_gfXG_MEAN3H-18 .SWC_GF1_0.15_1_gfXG_MEAN3H-24 .SWC_GF1_0.15_1_gfXG_MEAN3H-6 .TS_GF1_0.04_1_gfXG_MEAN3H-12 .TS_GF1_0.04_1_gfXG_MEAN3H-18 .TS_GF1_0.04_1_gfXG_MEAN3H-24 .TS_GF1_0.04_1_gfXG_MEAN3H-6 .TS_GF1_0.15_1_gfXG_MEAN3H-12 .TS_GF1_0.15_1_gfXG_MEAN3H-18 .TS_GF1_0.15_1_gfXG_MEAN3H-24 ... GPP_NT_CUT_50_gfRF RECO_DT_CUT_50_gfRF GPP_DT_CUT_50_gfRF RECO_DT_CUT_50_gfRF_SD GPP_DT_CUT_50_gfRF_SD G_GF1_0.03_1 G_GF1_0.03_2 G_GF1_0.05_1 G_GF1_0.05_2 G_GF4_0.02_1 G_GF5_0.02_1 LW_OUT_T1_2_1 NETRAD_T1_2_1 PPFD_OUT_T1_2_2 SW_OUT_T1_2_1
TIMESTAMP_MIDDLE
2005-01-01 00:15:00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 0.918553 0.093071 0.0 0.080016 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2005-01-01 00:45:00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 0.917972 0.092682 0.0 0.079688 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2005-01-01 01:15:00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 0.163001 0.093071 0.0 0.080016 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2005-01-01 01:45:00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 0.190890 0.093071 0.0 0.080016 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2005-01-01 02:15:00 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... 0.167042 0.092295 0.0 0.079361 0.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2024-12-31 21:45:00 0.0 0.0 0.0 0.0 52.229004 52.226300 52.226689 52.216796 3.458828 3.150402 3.115260 3.660897 4.335667 4.347764 4.385967 ... -0.334996 1.091028 0.0 0.265808 0.0 NaN NaN -9.097370 -7.880106 NaN NaN 311.167160 -5.883538 0.0 0.0
2024-12-31 22:15:00 0.0 0.0 0.0 0.0 52.227858 52.227986 52.224528 52.214211 3.522570 3.187638 3.103440 3.643396 4.338551 4.342880 4.379524 ... -0.310533 1.078751 0.0 0.264327 0.0 NaN NaN -9.561669 -8.172388 NaN NaN 310.079817 -6.269816 0.0 0.0
2024-12-31 22:45:00 0.0 0.0 0.0 0.0 52.226640 52.229837 52.222456 52.209876 3.578745 3.230037 3.095339 3.624025 4.343767 4.339440 4.372636 ... -0.225651 1.079759 0.0 0.264447 0.0 NaN NaN -10.138718 -8.527732 NaN NaN 309.604987 -6.934394 0.0 0.0
2024-12-31 23:15:00 0.0 0.0 0.0 0.0 52.224375 52.231151 52.221324 52.238293 3.624160 3.278488 3.093806 3.601135 4.350872 4.336333 4.366082 ... -0.558285 1.062164 0.0 0.262373 0.0 NaN NaN -10.649611 -8.871628 NaN NaN 308.812117 -5.696729 0.0 0.0
2024-12-31 23:45:00 0.0 0.0 0.0 0.0 52.222007 52.230632 52.222701 52.273511 3.656167 3.331678 3.103003 3.579020 4.360311 4.334225 4.359530 ... -0.317543 1.047483 0.0 0.260688 0.0 NaN NaN -10.944774 -9.138224 NaN NaN 307.372117 -8.102484 0.0 0.0

350640 rows × 812 columns

series = df['NEE_L3.1_L3.3_CUT_50_QCF_gfRF'].copy()
series
TIMESTAMP_MIDDLE
2005-01-01 00:15:00    0.911990
2005-01-01 00:45:00    0.910926
2005-01-01 01:15:00    1.667542
2005-01-01 01:45:00    1.639653
2005-01-01 02:15:00    1.660211
                         ...   
2024-12-31 21:45:00    1.160720
2024-12-31 22:15:00    1.131454
2024-12-31 22:45:00    1.046967
2024-12-31 23:15:00    1.372674
2024-12-31 23:45:00    1.126110
Freq: 30min, Name: NEE_L3.1_L3.3_CUT_50_QCF_gfRF, Length: 350640, dtype: float64
var = "NEE"
units = r"$\mathrm{\mu mol\ CO_{2}\ m^{-2}\ s^{-1}}$"
xlabel = f"{var} ({units})"
xlim = [-20, 20]

Ridgeline plots#

Yearly#

rp = dv.ridgeline(series=series)
rp.plot(
    how='yearly',
    kd_kwargs=None,  # params from scikit KernelDensity as dict
    xlim=xlim,  # min/max as list
    ylim=[0, 0.14],  # min/max as list
    hspace=-0.8,  # overlap between months
    xlabel=f"{var} ({units})",
    fig_width=5,
    fig_height=9,
    shade_percentile=0.5,
    show_mean_line=False,
    fig_title=f"{var} per year (2005-2024)",
    fig_dpi=72,
    showplot=True,
    ascending=False
)
../../_images/443e0fcd22458b43a7788257827bdcadf76e637c15569d8b2b715dd0ee55f271.png

Monthly#

rp.plot(
    how='monthly',
    kd_kwargs=None,  # params from scikit KernelDensity as dict
    xlim=xlim,  # min/max as list
    ylim=[0, 0.25],  # min/max as list
    hspace=-0.6,  # overlap between months
    xlabel=f"{var} ({units})",
    fig_width=4.5,
    fig_height=8,
    shade_percentile=0.5,
    show_mean_line=False,
    fig_title=f"{var} per month (2005-2024)",
    fig_dpi=72,
    showplot=True,
    ascending=False
)
../../_images/8bfb32466f99a3897ade923304ed68186138f8a299a9b61986c6ad7d15cf7d11.png

Weekly#

rp.plot(
    how='weekly',
    kd_kwargs=None,  # params from scikit KernelDensity as dict
    xlim=xlim,  # min/max as list
    ylim=[0, 0.25],  # min/max as list
    hspace=-0.6,  # overlap
    xlabel=f"{var} ({units})",
    fig_width=6,
    fig_height=16,
    shade_percentile=0.5,
    show_mean_line=False,
    fig_title=f"{var} per week (2005-2024)",
    fig_dpi=72,
    showplot=True,
    ascending=False
)
../../_images/afac7a0330320df60ce33de08b7b92b99b7a6c4da64b9bacdb5fc3b1442ad386.png

Single years per month#

uniq_years = series.index.year.unique()
for uy in uniq_years:
    series_yr = series.loc[series.index.year == uy].copy()
    rp = dv.ridgeline(series=series_yr)
    rp.plot(
        how='monthly',
        kd_kwargs=None,  # params from scikit KernelDensity as dict
        xlim=xlim,  # min/max as list
        ylim=[0, 0.32],  # min/max as list
        hspace=-0.8,  # overlap
        xlabel=f"{var} ({units})",
        fig_width=6,
        fig_height=7,
        shade_percentile=0.5,
        show_mean_line=False,
        fig_title=f"{var} per month ({uy})",
        fig_dpi=72,
        showplot=True,
        ascending=False
    )
../../_images/f1ca7b189ccdb5b9ac4fb1eddc4b16bcf5e89e18121cfad81911e8b6ff196b63.png ../../_images/01ce301377497d808c9d1455f7a29557d4b13b9dcb933b1e9251fde1b0c2ccd2.png ../../_images/48ffa01e2c95dd13290da48c16d620d5d30319afe62808a4135d22fa3046b79c.png ../../_images/9b95078aba7c4970a1ff761eb6589c260403dbc4f769de0afd487579a5d511dd.png ../../_images/41ae3aa9d944cb61c999154fd0173d5ab3c82bb94dd6abe566f3b5ef258c8a09.png ../../_images/05d32ccd820669a45f26a4e2812c954e2767c1fd01c408377aef4da899a4363d.png ../../_images/171a71671fbb90db460ed1cf373c6309bce776de984bff061ce71a3b5003eff8.png ../../_images/44607a8c82cedc41f3a74380233009b24491b35df4e1842ad3c5ac0b7bb2464e.png ../../_images/ba0761abca93e2a79587b9445c9c544cf573fb3d707ae6debc18046cde773aab.png ../../_images/76ddbc51ee6c51b095c8a2112d892d51d6cb6b25e67c6ddb6cd2b31a88c3d8d4.png ../../_images/c6485b92a72566cd424ceea0b3c18bc5fd3fc6c0bc49ca1bfea7aae810105363.png ../../_images/6fd1aee2767eef97a65336cf0c0e6291501045ef78a05e5a3131bd88a6d8cacc.png ../../_images/eb3ab1113ae3eac3a4bebbe9ed2d0b1a063d2cb0a6640d9e1ab95befe37bd7cc.png ../../_images/699216cd62edcc245019439ca93220ef249919476ded139eb64bb296931ff5d0.png ../../_images/188f7156a22ef2ce5b35d49ca57194aea6892dea9e196f90884ded6e0c11396a.png ../../_images/6a368a5996c401d67ded3473400c439d0e55f56b9bd97eb2a53e37a29fa58874.png ../../_images/d04cb7057f48551e26422b9f096d7c7d12c691a6fcfcbf8369a38266e32078f6.png ../../_images/f4fe314eb3b1ef31c9aed0253c711d6da4589205b8222f32daf0d2a8ec9fa8fc.png ../../_images/5159d0f2e5babc4e4536e910c97abd21aa80464ffa7bcb3bbe1b75ace8394b33.png ../../_images/69adaccbf95a83633e31ea4721ad6df19e1073041df200afc0844bc85e9c969b.png

Single years per week#

uniq_years = series.index.year.unique()
for uy in uniq_years:
    series_yr = series.loc[series.index.year == uy].copy()
    rp = dv.ridgeline(series=series_yr)
    rp.plot(
        how='weekly',
        kd_kwargs=None,  # params from scikit KernelDensity as dict
        xlim=[-30, 20],  # min/max as list
        ylim=[0, 0.35],  # min/max as list
        hspace=-0.8,  # overlap
        xlabel=f"{var} ({units})",
        fig_width=9,
        fig_height=18,
        shade_percentile=0.5,
        show_mean_line=False,
        fig_title=f"{var} per week ({uy})",
        fig_dpi=72,
        showplot=True,
        ascending=False
    )
../../_images/8c1cdf2711f28a762f8d610afbea886be51238863735938ec8e5ca5a02c6674b.png ../../_images/454fdfd4563080dd90abd518da440ae5afaaee8fc424c7ce518c68061e3c7109.png ../../_images/407469fcffa04dbffa56715eee6514cde5d4c9e525b39e95cb1534bc0b582448.png ../../_images/7c841a909c8c47e5627d87572b2c294cba042b0730b3e2ef4bc434e86c647fcf.png ../../_images/06d438579d34494af9edbb5accd020461548fedae4f7d5002497ec8a0bce4306.png ../../_images/c03b325157e2ee950121552e2ac7da0f0fd9357dd854aff4a98b749ea52fb6d8.png ../../_images/496420c4eb2632eca3a47c488235dc055e381a7e5b9d5dcfd909b894d6a4ac5d.png ../../_images/11da8c84c24ea5daee91d83459b36ab07c63a7ffc3bc1d091efdc72f05c8e3c5.png ../../_images/51cdd033c8aa0852eb0b9ce49e31cc647617f04024cb29dce254a0cc56f7c82e.png ../../_images/80d1820056a0d47b1b992a9f2733b22f0da992f1bb37d170fde50442061c35af.png ../../_images/da05ca42eed1d52be4d62161613a98b75585fd1409861edc933433683e1d035e.png ../../_images/cb833b4a40c9e5ef51917a73f5c64cd6e29ab4e9d141a27ff830211155389332.png ../../_images/247b62bbc6e96ab2798a0232d4bb3b52ea495134625927d2a7ee03762ee3ae12.png ../../_images/730aacec964955f6be8bdbbadf729b5ff2cecd397f7f9deb602353d8c0ae4655.png ../../_images/b1eb6b281ce7e47273f0163797b941bdda8535de972e1ab857eec130fb5079d3.png ../../_images/4751709278d0623b260e31f687c3054473a89521d9132a9c6dafa562a9121448.png ../../_images/3203d17f2c470da018df41221f045ab1bda27c5ca0bad07d600210e2f7e6c45d.png ../../_images/74de460c3862bf8821c16790d9fc1d363b2476780a714f2bfce993ccd1f85df3.png ../../_images/03a94a1c23894002f377b2d0f4d5ce23c2e16c30c42d73fc6b998b93683291b8.png ../../_images/006d8ad95d4b885c22a1ccb49f4eae2acfdd213429876d22798d5ff49ae4d24c.png

End of notebook#

dt_string = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"Finished. {dt_string}")
Finished. 2025-05-14 13:06:58