bopen / c3s-eqc-toolbox-template

CADS Toolbox template application
Apache License 2.0
5 stars 4 forks source link

CMIP6 Jupyter Notebooks for energy-consumption-related indices (C3S2_520 WP4, user question 3, historical) #147

Closed almarbo closed 5 months ago

almarbo commented 5 months ago

Notebook description

In this notebook, data from a subset of 9 models of CMIP6 Global Climate Models (GCM) , as well as ERA5 reanalysis, are considered. Two energy-demand ECA&D indices are calculated using the icclim Python package: Cooling and Heating Degree Days (CDDs and HDDs respectively). The reference methodology used by the EEA and implemented here follows the approach developed by Spinoni et al., 2018. In line with Spinoni's methodology, this notebook adopts a winter comfort temperature of 15.5°C and a summer comfort temperature of 22.0°C. These comfort temperatures remain constant across Europe. A higher number of Heating Degree Days (HDD) indicates that outdoor temperatures fall below the winter comfort threshold, necessitating more energy to heat buildings. Similarly, a higher number of Cooling Degree Days (CDD) indicates outdoor temperatures exceeding the summer comfort level, requiring increased energy for cooling buildings. In the presented code, the CDD calculations are always based on the JJA aggregation, with a comfort temperature of 22°C, while HDD calculations focus on winter (DJF) with a comfort temperature of 15.5°C. This notebook performs the analyses for the historical period from 1971 to 2000 (Historical)

Notebook link or upload

historical_CMIP6_CDD_indices.ipynb.zip

Anything else we need to know?

The notebook incorporates the development and improvements ongoing at #132 . The period for the historical remain the same : 1971-2000

The main change has to do with the use of icclim and the fact that each index is performed over different temporal aggregations (DJF for the HDD15.5 index and JJA for the CDD22). Here you can find an example of the way icclim is used for the historical period within the compute_indices function:


    datasets = []
    for index_name in index_names:
        if index_name == "HDD15.5":
            ds_index=icclim.index(
                            in_files=in_files,
                            index_name="deficit",
                            out_file=f"{tmpdir}/{index_names}.nc",
                            threshold=icclim.build_threshold("15.5 degC"),
                            slice_mode="year" if timeseries[index_name] == "annual" else timeseries[index_name],
                            ).compute()
            ds_index["deficit"]=ds_index["deficit"]/num_days[index_name]
        else:
            ds_index=icclim.excess(
                            in_files=in_files,
                            out_file=f"{tmpdir}/{index_names}.nc",
                            threshold=icclim.build_threshold("22 degC"),
                            slice_mode="year" if timeseries[index_name] == "annual" else timeseries[index_name],
                            ).compute().excess
            ds_index=ds_index/num_days[index_name]

        datasets.append(ds_index)
    return xr.merge(datasets).drop_dims("bounds")

Note that some parameters are new:


#Choose annual or seasonal timeseries
timeseries = {
    "HDD15.5":"DJF",
    "CDD22":"JJA",
}

#Number of days to get the average values
num_days={
    "HDD15.5":92,
    "CDD22":90,
}

Specific question: could it be done so that the ensemble spread cbar is always "viridis"?

Environment

name: wp4 channels: - conda-forge dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=2_gnu - aiohttp=3.9.3=py311h459d7ec_0 - aiosignal=1.3.1=pyhd8ed1ab_0 - alsa-lib=1.2.10=hd590300_0 - annotated-types=0.6.0=pyhd8ed1ab_0 - ansiwrap=0.8.4=py_0 - antlr-python-runtime=4.11.1=pyhd8ed1ab_0 - anyio=4.2.0=pyhd8ed1ab_0 - argon2-cffi=23.1.0=pyhd8ed1ab_0 - argon2-cffi-bindings=21.2.0=py311h459d7ec_4 - arrow=1.3.0=pyhd8ed1ab_0 - asciitree=0.3.3=py_2 - asttokens=2.4.1=pyhd8ed1ab_0 - async-lru=2.0.4=pyhd8ed1ab_0 - attr=2.5.1=h166bdaf_1 - attrs=23.2.0=pyh71513ae_0 - aws-c-auth=0.7.15=h70caa3e_0 - aws-c-cal=0.6.9=h14ec70c_3 - aws-c-common=0.9.12=hd590300_0 - aws-c-compression=0.2.17=h572eabf_8 - aws-c-event-stream=0.4.1=h17cd1f3_5 - aws-c-http=0.8.0=hc6da83f_5 - aws-c-io=0.14.3=h3c8c088_1 - aws-c-mqtt=0.10.1=h0ef3971_3 - aws-c-s3=0.5.0=h1b46bed_2 - aws-c-sdkutils=0.1.14=h572eabf_0 - aws-checksums=0.1.17=h572eabf_7 - aws-crt-cpp=0.26.1=h33f84b2_9 - aws-sdk-cpp=1.11.242=h65f022c_0 - azure-core-cpp=1.10.3=h91d86a7_1 - azure-storage-blobs-cpp=12.10.0=h00ab1b0_0 - azure-storage-common-cpp=12.5.0=hb858b4b_2 - babel=2.14.0=pyhd8ed1ab_0 - beautifulsoup4=4.12.3=pyha770c72_0 - black=24.1.1=py311h38be061_0 - bleach=6.1.0=pyhd8ed1ab_0 - blosc=1.21.5=h0f2a231_0 - bokeh=3.3.4=pyhd8ed1ab_0 - boltons=23.1.1=pyhd8ed1ab_0 - bottleneck=1.3.7=py311h1f0f07a_1 - branca=0.7.1=pyhd8ed1ab_0 - brotli=1.1.0=hd590300_1 - brotli-bin=1.1.0=hd590300_1 - brotli-python=1.1.0=py311hb755f60_1 - bzip2=1.0.8=hd590300_5 - c-ares=1.26.0=hd590300_0 - ca-certificates=2024.2.2=hbcca054_0 - cached-property=1.5.2=hd8ed1ab_1 - cached_property=1.5.2=pyha770c72_1 - cairo=1.18.0=h3faef2a_0 - cartopy=0.22.0=py311h320fe9a_1 - cdsapi=0.6.1=pyhd8ed1ab_0 - certifi=2024.2.2=pyhd8ed1ab_0 - cf-units=3.2.0=py311h1f0f07a_4 - cf_xarray=0.8.9=pyhd8ed1ab_0 - cffi=1.16.0=py311hb3a22ac_0 - cfgrib=0.9.10.4=pyhd8ed1ab_0 - cfitsio=4.3.1=hbdc6101_0 - cftime=1.6.3=py311h1f0f07a_0 - charset-normalizer=3.3.2=pyhd8ed1ab_0 - click=8.1.7=unix_pyh707e725_0 - click-plugins=1.1.1=py_0 - cligj=0.7.2=pyhd8ed1ab_1 - cloudpickle=3.0.0=pyhd8ed1ab_0 - cmocean=3.1.3=pyhd8ed1ab_0 - colorama=0.4.6=pyhd8ed1ab_0 - colorspacious=1.1.2=pyh24bf2e0_0 - comm=0.2.1=pyhd8ed1ab_0 - contourpy=1.2.0=py311h9547e67_0 - cycler=0.12.1=pyhd8ed1ab_0 - cytoolz=0.12.3=py311h459d7ec_0 - dask=2024.2.0=pyhd8ed1ab_0 - dask-core=2024.2.0=pyhd8ed1ab_0 - dateparser=1.2.0=pyhd8ed1ab_0 - dbus=1.13.6=h5008d03_3 - debugpy=1.8.1=py311hb755f60_0 - decorator=5.1.1=pyhd8ed1ab_0 - defusedxml=0.7.1=pyhd8ed1ab_0 - distributed=2024.2.0=pyhd8ed1ab_0 - eccodes=2.34.0=he84ddb8_0 - entrypoints=0.4=pyhd8ed1ab_0 - esmf=8.6.0=nompi_h7b237b1_0 - esmpy=8.6.0=pyhc1e730c_0 - exceptiongroup=1.2.0=pyhd8ed1ab_2 - executing=2.0.1=pyhd8ed1ab_0 - expat=2.5.0=hcb278e6_1 - fasteners=0.17.3=pyhd8ed1ab_0 - findlibs=0.0.5=pyhd8ed1ab_0 - fiona=1.9.5=py311hf8e0aa6_3 - folium=0.15.1=pyhd8ed1ab_0 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - font-ttf-ubuntu=0.83=h77eed37_1 - fontconfig=2.14.2=h14ed4e7_0 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - fonttools=4.48.1=py311h459d7ec_0 - fqdn=1.5.1=pyhd8ed1ab_0 - freeglut=3.2.2=hac7e632_2 - freetype=2.12.1=h267a509_2 - freexl=2.0.0=h743c826_0 - frozenlist=1.4.1=py311h459d7ec_0 - fsspec=2024.2.0=pyhca7485f_0 - gdal=3.8.3=py311h8be719e_2 - geopandas=0.14.3=pyhd8ed1ab_0 - geopandas-base=0.14.3=pyha770c72_0 - geos=3.12.1=h59595ed_0 - geotiff=1.7.1=h6b2125f_15 - gettext=0.21.1=h27087fc_0 - gflags=2.2.2=he1b5a44_1004 - giflib=5.2.1=h0b41bf4_3 - glib=2.78.3=hfc55251_0 - glib-tools=2.78.3=hfc55251_0 - glog=0.6.0=h6f12383_0 - graphite2=1.3.13=h58526e2_1001 - greenlet=3.0.3=py311hb755f60_0 - gst-plugins-base=1.22.9=h8e1006c_0 - gstreamer=1.22.9=h98fc4e7_0 - h11=0.14.0=pyhd8ed1ab_0 - h2=4.1.0=pyhd8ed1ab_0 - harfbuzz=8.3.0=h3d44ed6_0 - hdf4=4.2.15=h2a13503_7 - hdf5=1.14.3=nompi_h4f84152_100 - hpack=4.0.0=pyh9f0ad1d_0 - httpcore=1.0.3=pyhd8ed1ab_0 - httpx=0.26.0=pyhd8ed1ab_0 - hyperframe=6.0.1=pyhd8ed1ab_0 - icclim=6.5.0=pyhd8ed1ab_0 - icu=73.2=h59595ed_0 - idna=3.6=pyhd8ed1ab_0 - importlib-metadata=7.0.1=pyha770c72_0 - importlib_metadata=7.0.1=hd8ed1ab_0 - importlib_resources=6.1.1=pyhd8ed1ab_0 - ipykernel=6.29.2=pyhd33586a_0 - ipython=8.21.0=pyh707e725_0 - isoduration=20.11.0=pyhd8ed1ab_0 - jasper=4.2.0=he6dfbbe_0 - jedi=0.19.1=pyhd8ed1ab_0 - jinja2=3.1.3=pyhd8ed1ab_0 - joblib=1.3.2=pyhd8ed1ab_0 - json-c=0.17=h7ab15ed_0 - json5=0.9.14=pyhd8ed1ab_0 - jsonpickle=3.0.2=pyhd8ed1ab_1 - jsonpointer=2.4=py311h38be061_3 - jsonschema=4.21.1=pyhd8ed1ab_0 - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 - jsonschema-with-format-nongpl=4.21.1=pyhd8ed1ab_0 - jupyter-lsp=2.2.2=pyhd8ed1ab_0 - jupyter-server-proxy=4.1.0=pyhd8ed1ab_0 - jupyter_client=8.6.0=pyhd8ed1ab_0 - jupyter_core=5.7.1=py311h38be061_0 - jupyter_events=0.9.0=pyhd8ed1ab_0 - jupyter_server=2.12.5=pyhd8ed1ab_0 - jupyter_server_terminals=0.5.2=pyhd8ed1ab_0 - jupyterlab=4.1.1=pyhd8ed1ab_0 - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 - jupyterlab_server=2.25.3=pyhd8ed1ab_0 - kealib=1.5.3=h2f55d51_0 - keyutils=1.6.1=h166bdaf_0 - kiwisolver=1.4.5=py311h9547e67_1 - krb5=1.21.2=h659d440_0 - lame=3.100=h166bdaf_1003 - lcms2=2.16=hb7c19ff_0 - ld_impl_linux-64=2.40=h41732ed_0 - lerc=4.0.0=h27087fc_0 - libabseil=20230802.1=cxx17_h59595ed_0 - libaec=1.1.2=h59595ed_1 - libarchive=3.7.2=h2aa1ff5_1 - libarrow=15.0.0=he2c5238_2_cpu - libarrow-acero=15.0.0=h59595ed_2_cpu - libarrow-dataset=15.0.0=h59595ed_2_cpu - libarrow-flight=15.0.0=hdc44a87_2_cpu - libarrow-flight-sql=15.0.0=hfbc7f12_2_cpu - libarrow-gandiva=15.0.0=hacb8726_2_cpu - libarrow-substrait=15.0.0=hfbc7f12_2_cpu - libblas=3.9.0=21_linux64_openblas - libboost-headers=1.84.0=ha770c72_1 - libbrotlicommon=1.1.0=hd590300_1 - libbrotlidec=1.1.0=hd590300_1 - libbrotlienc=1.1.0=hd590300_1 - libcap=2.69=h0f662aa_0 - libcblas=3.9.0=21_linux64_openblas - libclang=15.0.7=default_hb11cfb5_4 - libclang13=15.0.7=default_ha2b6cf4_4 - libcrc32c=1.1.2=h9c3ff4c_0 - libcups=2.3.3=h4637d8d_4 - libcurl=8.5.0=hca28451_0 - libdeflate=1.19=hd590300_0 - libedit=3.1.20191231=he28a2e2_2 - libev=4.33=hd590300_2 - libevent=2.1.12=hf998b51_1 - libexpat=2.5.0=hcb278e6_1 - libffi=3.4.2=h7f98852_5 - libflac=1.4.3=h59595ed_0 - libgcc-ng=13.2.0=h807b86a_5 - libgcrypt=1.10.3=hd590300_0 - libgdal=3.8.3=h80d7d79_2 - libgfortran-ng=13.2.0=h69a702a_5 - libgfortran5=13.2.0=ha4646dd_5 - libglib=2.78.3=h783c2da_0 - libglu=9.0.0=hac7e632_1003 - libgomp=13.2.0=h807b86a_5 - libgoogle-cloud=2.12.0=hef10d8f_5 - libgpg-error=1.47=h71f35ed_0 - libgrpc=1.60.1=h74775cd_0 - libiconv=1.17=hd590300_2 - libjpeg-turbo=3.0.0=hd590300_1 - libkml=1.3.0=h01aab08_1018 - liblapack=3.9.0=21_linux64_openblas - libllvm14=14.0.6=hcd5def8_4 - libllvm15=15.0.7=hb3ce162_4 - libnetcdf=4.9.2=nompi_h9612171_113 - libnghttp2=1.58.0=h47da74e_1 - libnl=3.9.0=hd590300_0 - libnsl=2.0.1=hd590300_0 - libnuma=2.0.16=h0b41bf4_1 - libogg=1.3.4=h7f98852_1 - libopenblas=0.3.26=pthreads_h413a1c8_0 - libopus=1.3.1=h7f98852_1 - libparquet=15.0.0=h352af49_2_cpu - libpng=1.6.42=h2797004_0 - libpq=16.2=h33b98f1_0 - libprotobuf=4.25.1=hf27288f_1 - libre2-11=2023.06.02=h7a70373_0 - librttopo=1.1.0=h8917695_15 - libsndfile=1.2.2=hc60ed4a_1 - libsodium=1.0.18=h36c2ea0_1 - libspatialindex=1.9.3=h9c3ff4c_4 - libspatialite=5.1.0=h7bd4643_4 - libsqlite=3.45.1=h2797004_0 - libssh2=1.11.0=h0841786_0 - libstdcxx-ng=13.2.0=h7e041cc_5 - libsystemd0=255=h3516f8a_0 - libthrift=0.19.0=hb90f79a_1 - libtiff=4.6.0=ha9c0a0a_2 - libudunits2=2.2.28=h40f5838_3 - libutf8proc=2.8.0=h166bdaf_0 - libuuid=2.38.1=h0b41bf4_0 - libvorbis=1.3.7=h9c3ff4c_0 - libwebp-base=1.3.2=hd590300_0 - libxcb=1.15=h0b41bf4_0 - libxcrypt=4.4.36=hd590300_1 - libxkbcommon=1.6.0=hd429924_1 - libxml2=2.12.5=h232c23b_0 - libzip=1.10.1=h2629f0a_3 - libzlib=1.2.13=hd590300_5 - llvmlite=0.42.0=py311ha6695c7_1 - lmoments3=1.0.6=pyhd8ed1ab_0 - locket=1.0.0=pyhd8ed1ab_0 - lz4=4.3.3=py311h38e4bf4_0 - lz4-c=1.9.4=hcb278e6_0 - lzo=2.10=h516909a_1000 - mapclassify=2.6.1=pyhd8ed1ab_0 - markdown-it-py=3.0.0=pyhd8ed1ab_0 - markupsafe=2.1.5=py311h459d7ec_0 - matplotlib=3.8.2=py311h38be061_0 - matplotlib-base=3.8.2=py311h54ef318_0 - matplotlib-inline=0.1.6=pyhd8ed1ab_0 - mdurl=0.1.2=pyhd8ed1ab_0 - minizip=4.0.4=h0ab5242_0 - mistune=3.0.2=pyhd8ed1ab_0 - mpg123=1.32.4=h59595ed_0 - msgpack-python=1.0.7=py311h9547e67_0 - multidict=6.0.5=py311h459d7ec_0 - munkres=1.1.4=pyh9f0ad1d_0 - mypy_extensions=1.0.0=pyha770c72_0 - mysql-common=8.0.33=hf1915f5_6 - mysql-libs=8.0.33=hca2cd23_6 - nbclient=0.8.0=pyhd8ed1ab_0 - nbconvert=7.16.0=pyhd8ed1ab_0 - nbconvert-core=7.16.0=pyhd8ed1ab_0 - nbconvert-pandoc=7.16.0=pyhd8ed1ab_0 - nbformat=5.9.2=pyhd8ed1ab_0 - nc-time-axis=1.4.1=pyhd8ed1ab_0 - ncurses=6.4=h59595ed_2 - nest-asyncio=1.6.0=pyhd8ed1ab_0 - netcdf-fortran=4.6.1=nompi_hacb5139_103 - netcdf4=1.6.5=nompi_py311he8ad708_100 - networkx=3.2.1=pyhd8ed1ab_0 - notebook-shim=0.2.4=pyhd8ed1ab_0 - nspr=4.35=h27087fc_0 - nss=3.97=h1d7d5a4_0 - numba=0.59.0=py311h96b013e_1 - numcodecs=0.12.1=py311hb755f60_0 - numpy=1.26.4=py311h64a7726_0 - openjpeg=2.5.0=h488ebb8_3 - openssl=3.2.1=hd590300_0 - orc=1.9.2=h7829240_1 - overrides=7.7.0=pyhd8ed1ab_0 - packaging=23.2=pyhd8ed1ab_0 - pandas=2.2.0=py311h320fe9a_0 - pandoc=3.1.11.1=ha770c72_0 - pandocfilters=1.5.0=pyhd8ed1ab_0 - papermill=2.4.0=pyhd8ed1ab_0 - parso=0.8.3=pyhd8ed1ab_0 - partd=1.4.1=pyhd8ed1ab_0 - pathspec=0.12.1=pyhd8ed1ab_0 - patsy=0.5.6=pyhd8ed1ab_0 - pcre2=10.42=hcad00b1_0 - pexpect=4.9.0=pyhd8ed1ab_0 - pickleshare=0.7.5=py_1003 - pillow=10.2.0=py311ha6c5da5_0 - pint=0.23=pyhd8ed1ab_0 - pip=24.0=pyhd8ed1ab_0 - pixman=0.43.2=h59595ed_0 - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 - platformdirs=4.2.0=pyhd8ed1ab_0 - plotly=5.18.0=pyhd8ed1ab_0 - ply=3.11=py_1 - poppler=24.02.0=h590f24d_0 - poppler-data=0.4.12=hd8ed1ab_0 - postgresql=16.2=h7387d8b_0 - proj=9.3.1=h1d62c97_0 - prometheus_client=0.20.0=pyhd8ed1ab_0 - prompt-toolkit=3.0.42=pyha770c72_0 - properscoring=0.1=py_0 - psutil=5.9.8=py311h459d7ec_0 - pthread-stubs=0.4=h36c2ea0_1001 - ptyprocess=0.7.0=pyhd3deb0d_0 - pulseaudio-client=16.1=hb77b528_5 - pure_eval=0.2.2=pyhd8ed1ab_0 - pyarrow=15.0.0=py311h39c9aba_2_cpu - pyarrow-hotfix=0.6=pyhd8ed1ab_0 - pycparser=2.21=pyhd8ed1ab_0 - pydantic=2.6.1=pyhd8ed1ab_0 - pydantic-core=2.16.2=py311h46250e7_1 - pydantic-settings=2.1.0=pyhd8ed1ab_1 - pygments=2.17.2=pyhd8ed1ab_0 - pyparsing=3.1.1=pyhd8ed1ab_0 - pyproj=3.6.1=py311hca0b8b9_5 - pyqt=5.15.9=py311hf0fb5b6_5 - pyqt5-sip=12.12.2=py311hb755f60_5 - pyshp=2.3.1=pyhd8ed1ab_0 - pysocks=1.7.1=pyha2e5f31_6 - python=3.11.7=hab00c5b_1_cpython - python-dateutil=2.8.2=pyhd8ed1ab_0 - python-dotenv=1.0.1=pyhd8ed1ab_0 - python-eccodes=1.6.1=py311h1f0f07a_1 - python-fastjsonschema=2.19.1=pyhd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 - python-tzdata=2024.1=pyhd8ed1ab_0 - python_abi=3.11=4_cp311 - pytz=2024.1=pyhd8ed1ab_0 - pyyaml=6.0.1=py311h459d7ec_1 - pyzmq=25.1.2=py311h34ded2d_0 - qt-main=5.15.8=h5810be5_19 - rdma-core=50.0=hd3aeb46_0 - re2=2023.06.02=h2873b5e_0 - readline=8.2=h8228510_1 - rechunker=0.5.2=pyhd8ed1ab_1 - referencing=0.33.0=pyhd8ed1ab_0 - regex=2023.12.25=py311h459d7ec_0 - requests=2.31.0=pyhd8ed1ab_0 - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - rich=13.7.0=pyhd8ed1ab_0 - rpds-py=0.18.0=py311h46250e7_0 - rtree=1.2.0=py311h3bb2b0f_0 - s2n=1.4.3=h06160fa_0 - scikit-learn=1.4.0=py311hc009520_0 - scipy=1.12.0=py311h64a7726_2 - seaborn=0.13.2=hd8ed1ab_0 - seaborn-base=0.13.2=pyhd8ed1ab_0 - send2trash=1.8.2=pyh41d4057_0 - setuptools=69.0.3=pyhd8ed1ab_0 - shapely=2.0.2=py311h2032efe_1 - shellingham=1.5.4=pyhd8ed1ab_0 - simpervisor=1.0.0=pyhd8ed1ab_0 - sip=6.7.12=py311hb755f60_0 - six=1.16.0=pyh6c4a22f_0 - snappy=1.1.10=h9fff704_0 - sniffio=1.3.0=pyhd8ed1ab_0 - sortedcontainers=2.4.0=pyhd8ed1ab_0 - soupsieve=2.5=pyhd8ed1ab_1 - sparse=0.15.1=pyhd8ed1ab_1 - sqlalchemy=2.0.27=py311h459d7ec_0 - sqlite=3.45.1=h2c6b66d_0 - stack_data=0.6.2=pyhd8ed1ab_0 - statsmodels=0.14.1=py311h1f0f07a_0 - structlog=24.1.0=pyhd8ed1ab_0 - tblib=3.0.0=pyhd8ed1ab_0 - tenacity=8.2.3=pyhd8ed1ab_0 - terminado=0.18.0=pyh0d859eb_0 - textwrap3=0.9.2=py_0 - threadpoolctl=3.3.0=pyhc1e730c_0 - tiledb=2.19.1=h4386cac_0 - tinycss2=1.2.1=pyhd8ed1ab_0 - tk=8.6.13=noxft_h4845f30_101 - toml=0.10.2=pyhd8ed1ab_0 - tomli=2.0.1=pyhd8ed1ab_0 - toolz=0.12.1=pyhd8ed1ab_0 - tornado=6.3.3=py311h459d7ec_1 - tqdm=4.66.2=pyhd8ed1ab_0 - traitlets=5.14.1=pyhd8ed1ab_0 - typer=0.9.0=pyhd8ed1ab_0 - types-python-dateutil=2.8.19.20240106=pyhd8ed1ab_0 - typing-extensions=4.9.0=hd8ed1ab_0 - typing_extensions=4.9.0=pyha770c72_0 - typing_utils=0.1.0=pyhd8ed1ab_0 - tzcode=2024a=h3f72095_0 - tzdata=2024a=h0c530f3_0 - tzlocal=5.2=py311h38be061_0 - ucx=1.15.0=h75e419f_3 - udunits2=2.2.28=h40f5838_3 - uri-template=1.3.0=pyhd8ed1ab_0 - uriparser=0.9.7=hcb278e6_1 - urllib3=2.2.0=pyhd8ed1ab_0 - wcwidth=0.2.13=pyhd8ed1ab_0 - webcolors=1.13=pyhd8ed1ab_0 - webencodings=0.5.1=pyhd8ed1ab_2 - websocket-client=1.7.0=pyhd8ed1ab_0 - wheel=0.42.0=pyhd8ed1ab_0 - xarray=2024.1.1=pyhd8ed1ab_0 - xarraymannkendall=1.4.5=pyhd8ed1ab_0 - xcb-util=0.4.0=hd590300_1 - xcb-util-image=0.4.0=h8ee46fc_1 - xcb-util-keysyms=0.4.0=h8ee46fc_1 - xcb-util-renderutil=0.3.9=hd590300_1 - xcb-util-wm=0.4.1=h8ee46fc_1 - xclim=0.46.0=py311h38be061_0 - xerces-c=3.2.5=hac6953d_0 - xesmf=0.8.2=pyhd8ed1ab_0 - xhistogram=0.3.2=pyhd8ed1ab_0 - xkeyboard-config=2.41=hd590300_0 - xorg-fixesproto=5.0=h7f98852_1002 - xorg-inputproto=2.3.2=h7f98852_1002 - xorg-kbproto=1.0.7=h7f98852_1002 - xorg-libice=1.1.1=hd590300_0 - xorg-libsm=1.2.4=h7391055_0 - xorg-libx11=1.8.7=h8ee46fc_0 - xorg-libxau=1.0.11=hd590300_0 - xorg-libxdmcp=1.1.3=h7f98852_0 - xorg-libxext=1.3.4=h0b41bf4_2 - xorg-libxfixes=5.0.3=h7f98852_1004 - xorg-libxi=1.7.10=h7f98852_0 - xorg-libxrender=0.9.11=hd590300_0 - xorg-renderproto=0.11.1=h7f98852_1002 - xorg-xextproto=7.3.0=h0b41bf4_1003 - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002 - xorg-xproto=7.0.31=h7f98852_1007 - xskillscore=0.0.24=pyhd8ed1ab_0 - xyzservices=2023.10.1=pyhd8ed1ab_0 - xz=5.2.6=h166bdaf_0 - yaml=0.2.5=h7f98852_2 - yarl=1.9.4=py311h459d7ec_0 - zarr=2.17.0=pyhd8ed1ab_0 - zeromq=4.3.5=h59595ed_0 - zict=3.0.0=pyhd8ed1ab_0 - zipp=3.17.0=pyhd8ed1ab_0 - zlib=1.2.13=hd590300_5 - zstd=1.5.5=hfc55251_0 - pip: - c3s-eqc-automatic-quality-control==0.1.2.dev103+gaf19fc1 - cacholote==0.7.2 - cads-toolbox==0.0.2b0 - cgul==0.0.4 - coucal==0.0.1b3 - emohawk==0.0.4b0 - kaleido==0.2.1 - skillmetrics==1.2.4 - xlsxwriter==3.1.9 prefix: /data/common/miniforge3/envs/wp4
almarbo commented 5 months ago

the provided notebook has been updated to meet the developments followed in #132

malmans2 commented 5 months ago

Hi @almarbo,

I have a few suggestions:

  1. The parameters section should only include hardcoded parameters. Do not place if statements there.
  2. You added another layer of flexibility, which makes the code more complex (by design these notebooks already have high complexity). My suggestion is to either make a notebook specific for energy, or treat energy the same as precipitation/temperature. For example, timeseries should be a variable of the same type for energy and temperature/precipitation (e.g., a dict mapping a tuple of indices to a string).
  3. The way you handle colormap is also a symptom of a notebook that was designed differently. Do not change global variables multiple times (e.g., xr.set_options). If you really need to do that, use the context manager (e.g., with xr.set_options, ...). When I introduced xr.set_options in the templates I thought you wanted to use the same cmaps for all plots. If that's not the case, I would add a cmap argument to the plotting functions, then I would explicitly use those args. E.g., da.plot(cmap=cmap_sequential)

could it be done so that the ensemble spread cbar is always "viridis"

If you implement my third suggestion, you should be able to address that as well. (BTW, not sure if that's related to your question, but you can pass the parameter center=False to xarray plots in order to force the use of sequential cmaps)

Do you need me to cache this notebook?

almarbo commented 5 months ago

hi @malmans2 could we have a quick chat about these points?

malmans2 commented 5 months ago

Sure. I'm available right now if that works for you.

almarbo commented 5 months ago

Are you available at 12?

malmans2 commented 5 months ago

Yes, I'll send you the invite

almarbo commented 5 months ago

hi @malmans2 the notebook has been updated to have a version focusing only on the energy-consumption indices

malmans2 commented 5 months ago

Hi @almarbo

Can I remove the parametrization of variable? It's not needed right? This is going to be a template for energy only, right?

almarbo commented 5 months ago

You are right. You can remove It sure

malmans2 commented 5 months ago

I see various references to cordex (some of those variables are not used). Can I remove them?

almarbo commented 5 months ago

Sure, you can remove them. I am seeing that I removed some of them but forgot some others

malmans2 commented 5 months ago

I don't follow this:

def select_timeseries(ds, timeseries, year_start, year_stop, index_names):
    if timeseries == "annual":
        return ds.sel(time=slice(str(year_start), str(year_stop)))
    return ds.sel(time=slice(f"{year_start-1}-12", f"{year_stop}-11"))

timeseries is a dictionary now, correct? Also, how do you select the timeseries when users have both DJF and annual in the same dict? Should we drop support for annual in this notebook? Or maybe we should force users to either use annual or seasonal for all timeseries?

almarbo commented 5 months ago

I like this option

Or maybe we should force users to either use annual or seasonal for all timeseries?

malmans2 commented 5 months ago

Do you need to cache just deficit and excess? Or do you need other variables as well for plotting?

almarbo commented 5 months ago

Just deficit and excess

malmans2 commented 5 months ago

I started the template here, although I haven't really tested it yet: https://github.com/bopen/c3s-eqc-toolbox-template/blob/main/notebooks/wp4/cmip6_energy_indices.ipynb

I need to add plots now. Are you going to show the usual plots with custom colormaps? Can I copy/paste from this template?

almarbo commented 5 months ago

Yes! No problem

malmans2 commented 5 months ago

Actually, that's not correct. In the hist vs future you only plotted the index, looks like here you want to plot trends as well. So I need to copy/paste from the other templates.

malmans2 commented 5 months ago

The template is ready.

Let me know if we can close this issue

almarbo commented 5 months ago

Thanks a lot! Look nice. Should I open a new issue for the future? Basically It should be the same analysis as here but changing the request experiment parameter (from "historical" to "ssp5_8_5") and the period of the slice (2015-2099).

malmans2 commented 5 months ago

No this is fine. I've updated the template and I'm caching it right now. (Are you sure that 2015 is OK for all models? I seems to remember that a few models don't have 2014 available needed for DJF, but maybe I'm wrong)

almarbo commented 5 months ago

You remember well, thanks. Let's start on 2016 then

malmans2 commented 5 months ago

Hi @almarbo,

Basically It should be the same analysis as here but changing the request experiment parameter (from "historical" to "ssp5_8_5") and the period of the slice (2015-2099)

This is not correct. There's no future projection for ERA5, so we can't compare to ERA5.

almarbo commented 5 months ago

You are right. the analysis is similar but not the same, and some other things need to be taken into consideration. The analysis should be similar to what is done on the future template for the extreme indices but adapted to energy-indicators https://github.com/bopen/c3s-eqc-toolbox-template/blob/main/notebooks/wp4/extreme_indices_future.ipynb (i.e., the data should be regridded to "gfdl_esm4" and also in the original grid, no bias calculations are needed...). If you need me to make clear some other aspects just let me know.

malmans2 commented 5 months ago

I'm having troubles downloading CMIP6 from the CDS. Looks like there are issues right now as I get "An internal error occurred processing your request"

I'll try again after lunch, and will open a ticket if needed.

almarbo commented 5 months ago

yes, I am getting the same error

Looks like there are issues right now as I get "An internal error occurred processing your request"

perfect!

I'll try again after lunch, and will open a ticket if needed.

malmans2 commented 5 months ago

I'm getting intermittent errors. I didn't open a ticket as it usually gets fixed by rerunning the job. It's a bit slower but looks like I'm able to download.

BTW, there's something I don't fully understand. The other day you told me that you are running the notebooks on your machine, making changes to the cached functions. But the environment your shared in the permalink repo is the environment of the VM.

malmans2 commented 5 months ago

I didn't open a ticket as it usually gets fixed by rerunning the job. It's a bit slower but looks like I'm able to download.

Nevermind, now it's getting much more frequent. I'm opening the ticket.

malmans2 commented 5 months ago

Looks like the CDS issue is fixed, I was able to download the data this morning.

Can we close this issue?

almarbo commented 5 months ago

Hi @malmans2

thanks for running it, the results look fine.

I have just noticed that for the trend of ERA5, no units are displayed. Could we fix this?

Before closing it, we would need to have a version that includes future vs historical. The structure should be the one followed at: https://github.com/bopen/c3s-eqc-toolbox-template/blob/main/notebooks/wp4/extreme_temperature_indices_future_vs_historical.ipynb but adapted to the energy-case. Could it be done?

malmans2 commented 5 months ago

I have just noticed that for the trend of ERA5, no units are displayed. Could we fix this?

Will do

Before closing it, we would need to have a version that includes future vs historical. The structure should be the one followed at: https://github.com/bopen/c3s-eqc-toolbox-template/blob/main/notebooks/wp4/extreme_temperature_indices_future_vs_historical.ipynb but adapted to the energy-case. Could it be done?

Will do, but it's a bit vague. I need all the specs to implement it. For example, TX90p is treated one way, the other are treated differently. Which one should I use?

almarbo commented 5 months ago

It should be treated as the "SU" index i.e, what should be calculated is the difference between the mean over the thirty-year future period (corresponding to a global warming level of 2degrees) and the mean over the thirty-year of the historical period.

Will do, but it's a bit vague. I need all the specs to implement it. For example, TX90p is treated one way, the other are treated differently. Which one should I use?

Let me know whatever you need me to clarify.

malmans2 commented 5 months ago

You are using this "cnrm_cm6_1_hr": slice(2015, 2044), but that model is not available in 2014 (needed for DJF). How do you want to change it?

almarbo commented 5 months ago

It is okay to just consider the year after: "cnrm_cm6_1_hr": slice(2016, 2045)

malmans2 commented 5 months ago

All set: https://gist.github.com/malmans2/6815e98f270110047fe07e5032fda00e

Please take a look and let me know if it works OK.

almarbo commented 5 months ago

hi @malmans2

it looks fine! Tomorrow I will look more into detail and then I think we can close this issue.

thanks a lot

malmans2 commented 5 months ago

Sounds good, take your time.

almarbo commented 5 months ago

Hi @malmans2 I have tested it and looks fine everything, I think we can close this issue