From 92359ab0b50b6195c05d9bb70809fbd473f1d9f0 Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Mon, 27 Mar 2023 11:47:56 -0400 Subject: [PATCH 01/30] update readme install steps --- README.rst | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index be6d99ba1..175d0227c 100644 --- a/README.rst +++ b/README.rst @@ -3,9 +3,9 @@ xclim: Climate services library |logo| ====================================== +----------------------------+-----------------------------------------------------+ -| Versions | |pypi| |conda| | +| Versions | |pypi| |conda| |versions| | +----------------------------+-----------------------------------------------------+ -| Documentation and Support | |docs| |gitter| |versions| | +| Documentation and Support | |docs| |gitter| | +----------------------------+-----------------------------------------------------+ | Open Source | |license| |fair| |fossa| |zenodo| | +----------------------------+-----------------------------------------------------+ @@ -41,6 +41,20 @@ streamflow and sea ice concentration, numerous bias-adjustment algorithms, as we .. _xarray: https://docs.xarray.dev/ .. _dask: https://docs.dask.org/ +Quick Install +------------- +`xclim` can be installed from PyPI: + +.. code-block:: shell + + $ pip install xclim + +or from Anaconda (conda-forge): + +.. code-block:: shell + + $ conda install -c conda-forge xclim + Documentation ------------- The official documentation is at https://xclim.readthedocs.io/ @@ -66,7 +80,6 @@ License ------- This is free software: you can redistribute it and/or modify it under the terms of the `Apache License 2.0`_. A copy of this license is provided in the code repository (`LICENSE`_). - .. _Apache License 2.0: https://opensource.org/license/apache-2-0/ .. _LICENSE: https://github.com/Ouranosinc/xclim/blob/master/LICENSE From 795d774b485cf1fe84cadfb966867e70d519de13 Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Mon, 27 Mar 2023 12:00:25 -0400 Subject: [PATCH 02/30] Add vignettes to README.rst --- README.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.rst b/README.rst index 175d0227c..cd66c880e 100644 --- a/README.rst +++ b/README.rst @@ -59,6 +59,11 @@ Documentation ------------- The official documentation is at https://xclim.readthedocs.io/ +How to make the most of xclim: `Basic Usage Examples`_ and `In-Depth Examples`_. + +.. _Basic Usage Examples: https://xclim.readthedocs.io/en/stable/notebooks/usage.html +.. _In-Depth Examples: https://xclim.readthedocs.io/en/stable/notebooks/index.html + Contributing to xclim --------------------- xclim is in active development and is being used in production by climate services specialists around the world. From dd934c8a804d0dfd7d90810bc40ff3d72d8f00e0 Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Mon, 27 Mar 2023 14:03:27 -0400 Subject: [PATCH 03/30] move SBCK out of environment.yml, specify that a C++ compiler is needed to install SBCK, install SBCK via pip in upstream build --- .github/workflows/upstream.yml | 3 ++- docs/installation.rst | 8 ++++---- environment.yml | 5 ++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index 7fe0c86fd..7a0627d9c 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -50,9 +50,10 @@ jobs: run: | conda --version echo "micromamba: $(micromamba --version)" - - name: Install upstream versions + - name: Install upstream versions and SBCK run: | python -m pip install -r requirements_upstream.txt + python -m pip install "sbck @ git+https://github.com/yrobink/SBCK-python.git@master" - name: Install xclim run: | python -m pip install --no-user --no-deps . diff --git a/docs/installation.rst b/docs/installation.rst index 603a3e215..5cbbcba8c 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -56,7 +56,8 @@ Or, alternatively: .. _clisops: https://github.com/roocs/clisops Another optional library is `SBCK`_, which provides experimental adjustment methods to extend :doc:`xclim.sdba `. -`SBCK` is not installable directly from PyPI or conda-forge and has one complex dependency: `Eigen3`_. +`SBCK` is not available from PyPI nor conda-forge, and has one complex dependency: `Eigen3`_. +As `SBCK` is compiled at installation time, a **C++** compiler (`GCC`, `Clang`, `MSVC`, etc.) must also be available. On Debian/Ubuntu, Eigen3 can be installed from via `apt`: @@ -64,7 +65,7 @@ On Debian/Ubuntu, Eigen3 can be installed from via `apt`: $ sudo apt-get install libeigen3-dev -Eigen3 is also available on conda-forge, so one can do: +Eigen3 is also available on conda-forge, so, if already using Anaconda, one can do: .. code-block:: shell @@ -74,7 +75,6 @@ Afterwards, `SBCK can be installed from PyPI using `pip`: .. code-block:: shell - $ pip install pybind11 $ pip install "sbck @ git+https://github.com/yrobink/SBCK-python.git@master" Finally, the function :py:indicator:`xclim.sdba.property.first_eof` makes use of `eofs`_, another optional dependency, which is available on both pip and conda: @@ -132,6 +132,6 @@ To create a conda environment including all of `xclim`'s optional and developmen .. code-block:: console - $ conda create -n my_xclim_env python=3.8 --file=environment.yml + $ conda env create -n my_xclim_env python=3.8 --file=environment.yml $ conda activate my_xclim_env (my_xclim_env) $ pip install -e . diff --git a/environment.yml b/environment.yml index 760acc8aa..6a3308c45 100644 --- a/environment.yml +++ b/environment.yml @@ -23,11 +23,11 @@ dependencies: - scipy>=1.2 - xarray>=2022.06.0 # Extras - - wheel - eofs - eigen - pybind11 - # Testing and development dependencies + - wheel + # Testing and development dependencies - black>=22.12 - blackdoc - bump2version @@ -69,4 +69,3 @@ dependencies: - pip - pip: - sphinxcontrib-svg2pdfconverter - - sbck @ git+https://github.com/yrobink/SBCK-python.git@master From dddf37d23f834c82e4b577379d9d3badce09b6c8 Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Mon, 27 Mar 2023 14:15:13 -0400 Subject: [PATCH 04/30] add climpred and GeoCAT to similar projects, --- docs/explanation.rst | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/explanation.rst b/docs/explanation.rst index 707e62cac..d41b4e0eb 100644 --- a/docs/explanation.rst +++ b/docs/explanation.rst @@ -14,8 +14,8 @@ Purpose The primary domains that `xclim` is built for are in calculating climate indicators, performing statistical correction / bias adjustment of climate model output variables or simulations, and in performing climate model simulation ensemble statistics. -Other projects similar to xclim -=============================== +Other Python projects similar to xclim +====================================== `xclim` has been developed within an ecosystem of several existing projects that deal with climate and statistical correction/downscaling and has both influenced and been influenced by their approaches: @@ -31,11 +31,17 @@ Other projects similar to xclim - `MetPy` is built for reading, visualizing, and performing calculations specifically on standards-compliant, operational weather data. Like `xclim`, it makes use of `xarray`. - `xclim` adopted its standards and unit-handling approaches from `MetPy` and associated project `cf-xarray`. +* `climpred` (`climpred Source Code `_; `climpred Documentation `_) + - `climpred` is designed to analyze and validate weather and climate forecast data against observations, reconstructions, and simulations. Similar to `xclim`, it leverages `xarray`, `dask`, and `cf_xarray` for object handling, distributed computation, and metadata validation, respectively. + * `pyet` (`pyet Source Code `_; `pyet Documentation `_) - `pyet` is a tool for calculating/estimating evapotranspiration using many different accepted methodologies and employs a similar design approach as `xclim`, based on `xarray`-natives. * `xcdat` (`xcdat Source Code `_; `xcdat Documentation `_) +* `GeoCAT` (`GeoCAT Documentation `_) + - `GeoCAT` is an ensemble of tools developed specifically for scalable data analysis and visualization of structures and unstructured gridded earth science datasets. `GeoCAT` tools rely on many of the same tools that `xclim` uses in its stack (notably, `xarray`, `dask`, and `jupyter notebooks`). + * `scikit-downscale` (`scikit-downscale Source Code `_, `scikit-downscale Documentation `_) - `scikit-downscale` offers algorithms for statistical downscaling. `xclim` drew inspiration from its fit/predict architecture API approach. The suite of downscaling algorithms offered between both projects differs. From 2179a3806aac1575d9d03584d0925b95db3dff3a Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Mon, 27 Mar 2023 14:15:28 -0400 Subject: [PATCH 05/30] Update contributing guide --- CONTRIBUTING.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index 1239f66eb..c878cf098 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -304,10 +304,11 @@ When publishing on GitHub, maintainers will need to generate the release notes f # For ReStructuredText format (offered for convenience): $ xclim release_notes -r -When publishing to GitHub, you will still need to replace subsection headers in the Markdown (`^^^^` -> `###`) and the history published should not extend past the changes for the current version. This behaviour may eventually change. +.. note:: + The changelog should not extend past those entries relevant for the current version. .. warning:: - Be warned that a published package version on PyPI can never be overwritten. Be sure to verify that the package published at https://test.pypi.org/project/xclim/ matches expectations before publishing a version on GitHub. + A published version on PyPI can never be overwritten. Be sure to verify that the package published at https://test.pypi.org/project/xclim/ matches expectations before publishing a version on GitHub. The Manual Approach ~~~~~~~~~~~~~~~~~~~ From 181dab7aedcb1123d9b3cfafedb38c24e90fd09b Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Mon, 27 Mar 2023 16:31:52 -0400 Subject: [PATCH 06/30] split additional dependencies section and provide clearer instructions --- docs/installation.rst | 60 +++++++++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/docs/installation.rst b/docs/installation.rst index 5cbbcba8c..176938c88 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -6,13 +6,14 @@ Installation Stable release -------------- -To install xclim via pip, run this command in your terminal: + +To install `xclim` via `pip`, run this command in your terminal: .. code-block:: shell $ pip install xclim -This is the preferred method to install xclim, as it will always install the most recent stable release. +This is the preferred method to install `xclim`, as it will always install the most recent stable release. If you don't have `pip`_ installed, this `Python installation guide`_ can guide you through the process. @@ -21,8 +22,9 @@ If you don't have `pip`_ installed, this `Python installation guide`_ can guide Anaconda release ---------------- + For ease of installation across operating systems, we also offer an Anaconda Python package hosted on conda-forge. -This version tends to be updated at around the same frequency as the pip library, but can lag by a few days at times. +This version tends to be updated at around the same frequency as the PyPI-hosted library, but can lag by a few days at times. `xclim` can be installed from conda-forge wth the following: @@ -32,15 +34,41 @@ This version tends to be updated at around the same frequency as the pip library .. _extra-dependencies: -Extra dependencies +Extra Dependencies ------------------ + +Speedups and Helper Libraries +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + To improve performance of `xclim`, we highly recommend you also install `flox`_ (see: :doc:`flox API `). -This package integrates into xarray and significantly improves the performance of the grouping and resampling algorithms, especially when using `dask` on large datasets. +This package seamlessly integrates into `xarray` and significantly improves the performance of the grouping and resampling algorithms, especially when using `dask` on large datasets. + +For grid subsetting, we also recommend using the tools found in `clisops`_ (see: :doc:`clisops.core.subset API `) for spatial manipulation of geospatial data. `clisops` began as a component of `xclim` and is designed to alongside `xclim` and the `Pangeo`_ stack (`xarray`, `dask`, `jupyter`). In order to install `clisops`, the `GDAL`_ system libraries must be available. + +On Debian/Ubuntu, `GDAL` can be installed via `apt`: + +.. code-block:: shell + + $ sudo apt-get install libgdal-dev + +If on Anaconda Python, `GDAL` will be installed if needed as a `clisops` dependency. -We also recommend using the subsetting tools found in `clisops`_ (see: :doc:`clisops.core.subset API `) for spatial manipulation of geospatial data. +Both of these libraries are available on PyPI and conda-forge: + +.. code-block:: shell + + $ pip install flox clisops + # Or, alternatively: + $ conda install -c conda-forge flox clisops + +.. _GDAL: https://gdal.org/download.html#binaries +.. _Pangeo: https://pangeo.io/ + +Upstream Dependencies +^^^^^^^^^^^^^^^^^^^^^ `xclim` is regularly tested against the main development branches of a handful of key base libraries (`cftime`, `flox`, `pint`, `xarray`). -For convenience, these libraries can be installed alongside `xclim` using the following `pip`-installable recipe: +For convenience, these libraries can be installed alongside `xclim` using the following `pip`-install command: .. code-block:: shell @@ -55,11 +83,15 @@ Or, alternatively: .. _flox: https://github.com/xarray-contrib/flox .. _clisops: https://github.com/roocs/clisops -Another optional library is `SBCK`_, which provides experimental adjustment methods to extend :doc:`xclim.sdba `. -`SBCK` is not available from PyPI nor conda-forge, and has one complex dependency: `Eigen3`_. +Experimental SDBA Algorithms +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +`xclim` also offers support for a handful of experimental adjustment methods to extend :doc:`xclim.sdba `, available only if some additional libraries are installed. These libraries are completely optional. + +One experimental library is `SBCK`_. `SBCK` is not available from PyPI nor conda-forge, and has one complex dependency: `Eigen3`_. As `SBCK` is compiled at installation time, a **C++** compiler (`GCC`, `Clang`, `MSVC`, etc.) must also be available. -On Debian/Ubuntu, Eigen3 can be installed from via `apt`: +On Debian/Ubuntu, `Eigen3` can be installed via `apt`: .. code-block:: shell @@ -71,13 +103,13 @@ Eigen3 is also available on conda-forge, so, if already using Anaconda, one can $ conda install -c conda-forge eigen -Afterwards, `SBCK can be installed from PyPI using `pip`: +Afterwards, `SBCK` can be installed from PyPI using `pip`: .. code-block:: shell $ pip install "sbck @ git+https://github.com/yrobink/SBCK-python.git@master" -Finally, the function :py:indicator:`xclim.sdba.property.first_eof` makes use of `eofs`_, another optional dependency, which is available on both pip and conda: +Another experimental function :py:indicator:`xclim.sdba.property.first_eof` makes use of the `eofs`_ library, which is available on both PyPI and conda-forge: .. code-block:: shell @@ -91,7 +123,8 @@ Finally, the function :py:indicator:`xclim.sdba.property.first_eof` makes use of From sources ------------ -.. Warning:: + +.. warning:: For Python3.11+ users: Many of the required scientific libraries do not currently have wheels that support the latest python. In order to ensure that installation of xclim doesn't fail, we suggest installing the `Cython` module before installing xclim in order to compile necessary libraries from source packages. @@ -128,6 +161,7 @@ Alternatively, you can also install a local development copy via `flit`_: Creating a Conda environment ---------------------------- + To create a conda environment including all of `xclim`'s optional and development dependencies, run the following command from within your cloned repo: .. code-block:: console From d85d12e4cede7b6fd2c86abf1c6b96554084a3ee Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Mon, 27 Mar 2023 17:04:45 -0400 Subject: [PATCH 07/30] add clisops and flox, remove wheel --- environment.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/environment.yml b/environment.yml index 6a3308c45..533de8114 100644 --- a/environment.yml +++ b/environment.yml @@ -23,10 +23,11 @@ dependencies: - scipy>=1.2 - xarray>=2022.06.0 # Extras + - clisops - eofs - eigen + - flox - pybind11 - - wheel # Testing and development dependencies - black>=22.12 - blackdoc From 641facddadb3db6bcdeabea4f4efeb2a903b9474 Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Mon, 27 Mar 2023 17:05:16 -0400 Subject: [PATCH 08/30] specify what is installed in environment.yml --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index 176938c88..63fa15fbf 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -162,7 +162,7 @@ Alternatively, you can also install a local development copy via `flit`_: Creating a Conda environment ---------------------------- -To create a conda environment including all of `xclim`'s optional and development dependencies, run the following command from within your cloned repo: +To create a conda environment including `xclim`'s dependencies and several optional libraries (notably: `clisops`, `eigen`, `eofs`, and `flox`) and development dependencies, run the following command from within your cloned repo: .. code-block:: console From f1ffaa9de1b8d0b7adb38794c824df6ea32efa58 Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Mon, 27 Mar 2023 18:39:48 -0400 Subject: [PATCH 09/30] add some seaborn-based graphical examples --- docs/notebooks/usage.ipynb | 52 +++++++++++++++++++++++++++----------- environment.yml | 1 + pyproject.toml | 1 + 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/docs/notebooks/usage.ipynb b/docs/notebooks/usage.ipynb index a4e150a3f..26399804c 100644 --- a/docs/notebooks/usage.ipynb +++ b/docs/notebooks/usage.ipynb @@ -26,7 +26,7 @@ "import xarray as xr\n", "\n", "import xclim\n", - "from xclim.testing import open_dataset" + "from xclim import testing" ] }, { @@ -44,8 +44,11 @@ "metadata": {}, "outputs": [], "source": [ + "# Normally, we would use xarray to open a dataset, e.g.:\n", "# ds = xr.open_dataset(\"your_file.nc\")\n", - "ds = open_dataset(\"ERA5/daily_surface_cancities_1990-1993.nc\")\n", + "\n", + "# For this example, let's use a test dataset from xclim:\n", + "ds = testing.open_dataset(\"ERA5/daily_surface_cancities_1990-1993.nc\")\n", "ds.tas" ] }, @@ -124,8 +127,10 @@ }, "outputs": [], "source": [ + "# Show that data is not at a daily time frequency\n", + "\n", "ds6h = xr.tutorial.open_dataset(\"air_temperature\")\n", - "xr.infer_freq(ds6h.time) # Show that it is not daily" + "xr.infer_freq(ds6h.time)" ] }, { @@ -138,7 +143,7 @@ }, "outputs": [], "source": [ - "gdd = xclim.atmos.growing_degree_days(tas=ds6h.tas, thresh=\"10.0 degC\", freq=\"MS\")" + "gdd = xclim.atmos.growing_degree_days(tas=ds6h.air, thresh=\"10.0 degC\", freq=\"MS\")" ] }, { @@ -248,12 +253,22 @@ "metadata": {}, "outputs": [], "source": [ - "import matplotlib.pyplot\n", + "import matplotlib.pyplot as plt\n", "\n", - "%matplotlib inline\n", - "\n", - "# Summary statistics histogram\n", - "gdd.plot()" + "gdd.plot()\n", + "plt.suptitle(\"Summary Statistics Histogram\")\n", + "plt.draw()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gdd.isel(lon=20, lat=10).plot()\n", + "plt.suptitle(\"Time Series at a Given Geographical Coordinate\")\n", + "plt.draw()" ] }, { @@ -262,8 +277,9 @@ "metadata": {}, "outputs": [], "source": [ - "# Show time series at a given geographical coordinate\n", - "gdd.isel(lon=20, lat=10).plot()" + "gdd.sel(time=\"2013-07-01\").plot()\n", + "plt.suptitle(\"Spatial Pattern at a Specific Time Period\")\n", + "plt.draw()" ] }, { @@ -272,8 +288,15 @@ "metadata": {}, "outputs": [], "source": [ - "# Show spatial pattern at a specific time period\n", - "gdd.sel(time=\"2013-07\").plot()" + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "\n", + "sns.set_context(\"paper\")\n", + "\n", + "\n", + "gdd.sel(time=\"2014-07-01\").plot(cmap=\"cubehelix\")\n", + "plt.suptitle(\"Spatial Pattern at a Specific Time Period (Using Seaborn)\")\n", + "plt.draw()" ] }, { @@ -308,7 +331,6 @@ } ], "metadata": { - "celltoolbar": "Edit Metadata", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", @@ -324,7 +346,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.10.9" } }, "nbformat": 4, diff --git a/environment.yml b/environment.yml index 533de8114..a3f53d74a 100644 --- a/environment.yml +++ b/environment.yml @@ -54,6 +54,7 @@ dependencies: - pytest - pytest-cov - pytest-xdist>=3.2 + - seaborn - sphinx - sphinx-autodoc-typehints - sphinx-codeautolink diff --git a/pyproject.toml b/pyproject.toml index 419fb430a..a2e5e345b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -83,6 +83,7 @@ dev = [ "nc-time-axis", "netCDF4 >=1.4", "pooch", + "seaborn", "sphinx", "sphinx-autodoc-typehints", "sphinx-codeautolink", From 880633c35707950b2fab208b1d3d54fab6fc49a8 Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Mon, 27 Mar 2023 19:14:49 -0400 Subject: [PATCH 10/30] update notebook graphics --- docs/notebooks/example.ipynb | 66 +++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/docs/notebooks/example.ipynb b/docs/notebooks/example.ipynb index da43463e8..124a83452 100644 --- a/docs/notebooks/example.ipynb +++ b/docs/notebooks/example.ipynb @@ -11,7 +11,7 @@ "\n", "`xclim` is built on very powerful multiprocessing and distributed computation libraries, notably `xarray` and `dask`.\n", "\n", - "`xarray` is a python package making it easy to work with n-dimensional arrays. It labels axes with their names `[time, lat, lon, level]` instead of indices `[0,1,2,3]`, reducing the likelihood of bugs and making the code easier to understand. One of the key strengths of `xarray` is that it knows how to deal with non-standard calendars (we're looking at you, \"`360_days`\") and can easily resample daily time series to weekly, monthly, seasonal or annual periods. Finally, `xarray` is tightly inegrated with `dask`, a package that can automatically parallelize operations.\n", + "`xarray` is a python package making it easy to work with n-dimensional arrays. It labels axes with their names `[time, lat, lon, level]` instead of indices `[0,1,2,3]`, reducing the likelihood of bugs and making the code easier to understand. One of the key strengths of `xarray` is that it knows how to deal with non-standard calendars (we're looking at you, \"`360_days`\") and can easily resample daily time series to weekly, monthly, seasonal or annual periods. Finally, `xarray` is tightly integrated with `dask`, a package that can automatically parallelize operations.\n", "\n", "The following are a few examples to consult when using `xclim` to subset netCDF arrays and compute climate indicators, taking advantage of the parallel processing capabilities offered by `xarray` and `dask`. For more information about these projects, please see their documentation pages:\n", "\n", @@ -42,7 +42,7 @@ "import numpy as np\n", "import xarray as xr\n", "\n", - "import xclim as xc\n", + "import xclim\n", "\n", "xr.set_options(display_style=\"html\")\n", "\n", @@ -186,7 +186,7 @@ "metadata": {}, "source": [ "## Subsetting and selecting data with xarray\n", - "Usually, xclim users are encouraged to use the subsetting utilities of the [clisops](https://clisops.readthedocs.io/en/latest/notebooks/subset.html) package. Here, we will reduce the size of our data using the methods implemented in xarray ([docs here](http://xarray.pydata.org/en/stable/indexing.html))." + "Here, we will reduce the size of our data using the methods implemented in xarray ([docs here](https://docs.xarray.dev/en/stable/user-guide/indexing.html))." ] }, { @@ -211,6 +211,16 @@ "print(ds3.tasmin)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "For more powerful subsetting tools with features such as coordinate reference system (CRS) aware subsetting and vector shape masking, the `xclim` developers strongly encourage users to consider the subsetting utilities of the [clisops](https://github.com/roocs/clisops) package.\n", + "\n", + "Their documentation showcases several examples of how perform more complex subsetting: [clisops.core.subset](https://clisops.readthedocs.io/en/latest/notebooks/core_subset.html)." + ] + }, { "cell_type": "markdown", "metadata": { @@ -252,7 +262,7 @@ }, "outputs": [], "source": [ - "out = xc.atmos.tx_max(ds2.tasmax, freq=\"YS\")\n", + "out = xclim.atmos.tx_max(ds2.tasmax, freq=\"YS\")\n", "print(out)" ] }, @@ -287,7 +297,7 @@ }, "outputs": [], "source": [ - "out = xc.indices.tx_days_above(ds2.tasmax, thresh=\"30 C\", freq=\"YS\")\n", + "out = xclim.indices.tx_days_above(ds2.tasmax, thresh=\"30 C\", freq=\"YS\")\n", "print(out)" ] }, @@ -308,7 +318,7 @@ }, "outputs": [], "source": [ - "out = xc.atmos.tx_days_above(ds2.tasmax, thresh=\"30 C\", freq=\"YS\")\n", + "out = xclim.atmos.tx_days_above(ds2.tasmax, thresh=\"30 C\", freq=\"YS\")\n", "print(out)" ] }, @@ -355,9 +365,11 @@ "source": [ "# import plotting stuff\n", "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", "\n", "%matplotlib inline\n", - "plt.style.use(\"seaborn\")\n", + "sns.set_context(\"notebook\")\n", + "\n", "plt.rcParams[\"figure.figsize\"] = (11, 5)" ] }, @@ -381,19 +393,21 @@ "thresh_tn = \"20.0 degC\"\n", "\n", "# Computing index by resampling **before** run length algorithm (default value)\n", - "hw_before = xc.indices.heat_wave_max_length(\n", + "hw_before = xclim.indices.heat_wave_max_length(\n", " tn, tx, freq=freq, thresh_tasmin=thresh_tn, resample_before_rl=True\n", ")\n", "# Computing index by resampling **after** run length algorithm\n", - "hw_after = xc.indices.heat_wave_max_length(\n", + "hw_after = xclim.indices.heat_wave_max_length(\n", " tn, tx, freq=freq, thresh_tasmin=thresh_tn, resample_before_rl=False\n", ")\n", "\n", - "hw_before.sel(time=\"2010-07-01\").plot()\n", + "hw_before.sel(time=\"2010-07-01\").plot(vmin=0, vmax=7)\n", "plt.title(\"Resample, then run length\")\n", "plt.figure()\n", - "hw_after.sel(time=\"2010-07-01\").plot()\n", - "plt.title(\"Run length, then resample\")" + "hw_after.sel(time=\"2010-07-01\").plot(vmin=0, vmax=7)\n", + "plt.title(\"Run length, then resample\")\n", + "\n", + "plt.draw()" ] }, { @@ -429,7 +443,8 @@ "tn_pt.plot(marker=\"o\", label=\"tasmin\")\n", "plt.axhline(y=convert_units_to(thresh_tn, \"degC\"), color=\"orange\", label=thresh_tn)\n", "plt.axvline(x=[\"2010-08-01\"], color=\"green\", label=\"Aug. 1st\")\n", - "plt.legend()" + "plt.legend()\n", + "plt.draw()" ] }, { @@ -503,7 +518,7 @@ "outputs": [], "source": [ "%%time\n", - "out = xc.atmos.tx_max(ds2c.tasmax, freq=\"YS\")\n", + "out = xclim.atmos.tx_max(ds2c.tasmax, freq=\"YS\")\n", "dsOut = xr.Dataset(data_vars=None, coords=out.coords, attrs=ds.attrs)\n", "dsOut[out.name] = out\n", "\n", @@ -554,11 +569,11 @@ "outputs": [], "source": [ "# Compute with the original mm s-1 data\n", - "out1 = xc.atmos.precip_accumulation(ds4.pr, freq=\"MS\")\n", + "out1 = xclim.atmos.precip_accumulation(ds4.pr, freq=\"MS\")\n", "# Create a copy of the data converted to mm d-1\n", "pr_mmd = ds4.pr * 3600 * 24\n", "pr_mmd.attrs[\"units\"] = \"mm d-1\"\n", - "out2 = xc.atmos.precip_accumulation(pr_mmd, freq=\"MS\")" + "out2 = xclim.atmos.precip_accumulation(pr_mmd, freq=\"MS\")" ] }, { @@ -572,7 +587,8 @@ "plt.figure()\n", "out1.plot(label=\"From mm s-1\", linestyle=\"-\")\n", "out2.plot(label=\"From mm d-1\", linestyle=\"none\", marker=\"o\")\n", - "plt.legend()" + "plt.legend()\n", + "plt.draw()" ] }, { @@ -599,20 +615,21 @@ "tasmax_C.attrs[\"units\"] = \"C\"\n", "\n", "# Using Kelvin data, threshold in Celsius\n", - "out1 = xc.atmos.tx_days_above(ds4.tasmax, thresh=\"20 C\", freq=\"MS\")\n", + "out1 = xclim.atmos.tx_days_above(ds4.tasmax, thresh=\"20 C\", freq=\"MS\")\n", "\n", "# Using Celsius data\n", - "out2 = xc.atmos.tx_days_above(tasmax_C, thresh=\"20 C\", freq=\"MS\")\n", + "out2 = xclim.atmos.tx_days_above(tasmax_C, thresh=\"20 C\", freq=\"MS\")\n", "\n", "# Using Celsius but with threshold in Kelvin\n", - "out3 = xc.atmos.tx_days_above(tasmax_C, thresh=\"293.15 K\", freq=\"MS\")\n", + "out3 = xclim.atmos.tx_days_above(tasmax_C, thresh=\"293.15 K\", freq=\"MS\")\n", "\n", "# Plot and see that it's all identical:\n", "plt.figure()\n", "out1.plot(label=\"K and degC\", linestyle=\"-\")\n", "out2.plot(label=\"degC and degC\", marker=\"s\", markersize=10, linestyle=\"none\")\n", "out3.plot(label=\"degC and K\", marker=\"o\", linestyle=\"none\")\n", - "plt.legend()" + "plt.legend()\n", + "plt.draw()" ] }, { @@ -651,7 +668,7 @@ " [17] * 24 + [21] * 24, dims=(\"lon\",), coords={\"lon\": ds5.lon}, attrs={\"units\": \"°C\"}\n", ")\n", "\n", - "out_hw2d = xc.atmos.heat_wave_total_length(\n", + "out_hw2d = xclim.atmos.heat_wave_total_length(\n", " tasmin=ds5.tasmin,\n", " tasmax=ds5.tasmax,\n", " thresh_tasmin=thresh_tasmin,\n", @@ -674,7 +691,8 @@ "metadata": {}, "outputs": [], "source": [ - "out_hw2d.sel(time=\"1958\").plot()" + "out_hw2d.sel(time=\"1958\").plot()\n", + "plt.draw()" ] } ], @@ -695,7 +713,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.10.9" }, "vscode": { "interpreter": { From 25f0abced57caf8834a942f823caf15d4d5f1bc1 Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Tue, 28 Mar 2023 14:45:02 -0400 Subject: [PATCH 11/30] typos and grammar fixes --- docs/notebooks/analogs.ipynb | 22 +++++----- docs/notebooks/cli.ipynb | 26 ++++++------ docs/notebooks/customize.ipynb | 12 +++--- docs/notebooks/ensembles-advanced.ipynb | 34 ++++++--------- docs/notebooks/ensembles.ipynb | 19 +++++---- docs/notebooks/example.ipynb | 56 ++++++++++++------------- docs/notebooks/extendxclim.ipynb | 50 +++++++++++----------- docs/notebooks/frequency_analysis.ipynb | 12 +++--- docs/notebooks/sdba-advanced.ipynb | 46 ++++++++++---------- docs/notebooks/sdba.ipynb | 28 +++++++------ docs/notebooks/units.ipynb | 10 ++--- docs/notebooks/usage.ipynb | 16 +++---- 12 files changed, 164 insertions(+), 167 deletions(-) diff --git a/docs/notebooks/analogs.ipynb b/docs/notebooks/analogs.ipynb index 077a434be..84c952e8c 100644 --- a/docs/notebooks/analogs.ipynb +++ b/docs/notebooks/analogs.ipynb @@ -6,8 +6,10 @@ "metadata": {}, "source": [ "# Spatial Analogues examples\n", - "xclim provides the `xc.analog` module that allows the finding of spatial analogues. Spatial analogues are maps showing which areas have a present-day climate that is analogous to the future climate of a given place. This type of map can be useful for climate adaptation to see how well regions are coping today under specific climate conditions. For example, officials from a city located in a temperate region that may be expecting more heatwaves in the future can learn from the experience of another city where heatwaves are a common occurrence,\n", - "leading to more proactive intervention plans to better deal with new climate conditions.\n", + "\n", + "`xclim` provides the ``xclim.analog`` module that allows the finding of spatial analogues.\n", + "\n", + "Spatial analogues are maps showing which areas have a present-day climate that is analogous to the future climate of a given place. This type of map can be useful for climate adaptation to see how well regions are coping today under specific climate conditions. For example, officials from a city located in a temperate region that may be expecting more heatwaves in the future can learn from the experience of another city where heatwaves are a common occurrence, leading to more proactive intervention plans to better deal with new climate conditions.\n", "\n", "Spatial analogues are estimated by comparing the distribution of climate indices computed at the target location over the future period with the distribution of the same climate indices computed over a reference period for multiple candidate regions." ] @@ -35,7 +37,7 @@ "source": [ "## Input data\n", "\n", - "The \"target\" input of the computation is a collection of indices over a given location and for a given time period. Here we have three indices computed on bias-adjusted daily simulation data from the CanESM2 model, as made available through the CMIP5 project. We chose to look at the climate of Chibougamau, a small city in northern Québec, for the 2041-2070 period." + "The \"target\" input of the computation is a collection of indices over a given location and for a given time period. Here we have three indices computed on bias-adjusted daily simulation data from the CanESM2 model, as made available through the [CMIP5 project](https://doi.org/10.1175/BAMS-D-11-00094.1). We chose to look at the climate of Chibougamau, a small city in northern Québec, for the 2041-2070 period." ] }, { @@ -58,7 +60,7 @@ "id": "8168d92e", "metadata": {}, "source": [ - "The goal is to find regions where the present climate is similar to that simulated future climate. We call \"candidates\" the dataset that contains the present-day indices. Here we use gridded observations provided by NRCAN. This is the same data that was used as a reference for the bias-adjustment of the target simulation, which is essential to ensure the comparison holds. \n", + "The goal is to find regions where the present climate is similar to that of a simulated future climate. We call \"candidates\" the dataset that contains the present-day indices. Here we use gridded observations provided by Natural Resources Canada (NRCan). This is the same data that was used as a reference for the bias-adjustment of the target simulation, which is essential to ensure the comparison holds. \n", "\n", "A good test to see if the data is appropriate for computing spatial analog is the so-called \"self-analog\" test. It consists in computing the analogs using the same time period on both the target and the candidates. The test passes if the best analog is the same point as the target. Some authors have found that in some cases, a second bias-adjustment over the indices is needed to ensure that the data passes this test (see [Grenier et al. (2019)](https://www.sciencedirect.com/science/article/pii/S2405880719300639)). However, in this introductory notebook, we can't run this test and will simply assume the data is coherent." ] @@ -94,7 +96,7 @@ "id": "a322a0e4", "metadata": {}, "source": [ - "Let's plot the timeseries over Chibougamau for both periods to get an idea of the climate change between the two periods. For the purpose of the plot, we'll need to convert the calendar of the data as the simulation uses a \"noleap\" calendar." + "Let's plot the timeseries over Chibougamau for both periods to get an idea of the climate change between these two periods. For the purpose of the plot, we'll need to convert the calendar of the data as the simulation uses a `noleap` calendar." ] }, { @@ -121,9 +123,9 @@ "id": "34bef449", "metadata": {}, "source": [ - "All the work is encapsulated in the `xclim.analog.spatial_analogs` function. By default, the function expects that the distribution to be analyzed is along the \"time\" dimension, like in our case. Inputs are datasets of indices, the target and the candidates should have the same indices and at least the `time` variable in common. Normal xarray broadcasting rules apply for the other dimensions.\n", + "All the work is encapsulated in the `xclim.analog.spatial_analogs` function. By default, the function expects that the distribution to be analyzed is along the \"time\" dimension, like in our case. Inputs are datasets of indices, the target and the candidates should have the same indices and at least the `time` variable in common. Normal `xarray` broadcasting rules apply for the other dimensions.\n", "\n", - "There are many metrics available to compute the dissimilarity between the indicator distributions. For our first test, we'll use the mean annual temperature (`tg_mean`) and the simple standardized euclidean distance metric (`seuclidean`). This is a very basic metric that only computes the distance between the means. All algorithms used to compare distributions are available through the `xclim.analog.spatial_analogs` function. They also live as well-documented functions in the same module or in the `xclim.analog.metrics` dictionary." + "There are many metrics available to compute the dissimilarity between the indicator distributions. For our first test, we'll use the mean annual temperature (`tg_mean`) and the simple standardized Euclidean distance metric (`seuclidean`). This is a very basic metric that only computes the distance between the means. All algorithms used to compare distributions are available through the `xclim.analog.spatial_analogs` function. They also live as well-documented functions in the same module or in the `xclim.analog.metrics` dictionary." ] }, { @@ -184,7 +186,7 @@ "id": "5f6116b6", "metadata": {}, "source": [ - "The new map is quite similar to the previous one, but notice how the scale has changed. Each metric defines its own scale (see the docstrings), but in all cases, lower values imply less differences between distributions. Notice also how the best analog has moved. This illustrates a common issue with these computations : there's a lot of noise in the results and the absolute minimum may be extremely sensitive and move all over the place." + "The new map is quite similar to the previous one, but notice how the scale has changed. Each metric defines its own scale (see the docstrings), but in all cases, lower values imply fewer differences between distributions. Notice also how the best analog has moved. This illustrates a common issue with these computations : there's a lot of noise in the results, and the absolute minimum may be extremely sensitive and move all over the place." ] }, { @@ -216,7 +218,7 @@ "id": "7f396582", "metadata": {}, "source": [ - "As said just above, results depend on the metric used. For example, some of the metrics include some sort of standardization while others don't. In the latter case, this means the absolute magnitude of the indices influences the results, i.e. analogies depend on the units. This information is written in the docstring.\n", + "As said just above, results depend on the metric used. For example, some of the metrics include some sort of standardization, while others don't. In the latter case, this means the absolute magnitude of the indices influences the results, i.e. analogies depend on the units. This information is written in the docstring.\n", "\n", "Some are also much more efficient than other (for example : `seuclidean` or `zech_aslan`, compared to `kolmogorov_smirnov` or `friedman_rafsky`)." ] @@ -263,7 +265,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.6" + "version": "3.10.9" } }, "nbformat": 4, diff --git a/docs/notebooks/cli.ipynb b/docs/notebooks/cli.ipynb index d3a953b30..952203ffc 100644 --- a/docs/notebooks/cli.ipynb +++ b/docs/notebooks/cli.ipynb @@ -6,11 +6,11 @@ "source": [ "# Command Line Interface\n", "\n", - "xclim provides the `xclim` command line executable to perform basic indicator\n", - "computation easily without having to start up a full python environment. However, not\n", + "xclim provides the `xclim` command line executable to perform basic indicator\n", + "computation easily without having to start up a full Python environment. However, not\n", "all indicators listed in [Climate Indicators](../indicators.rst) are available through this tool.\n", "\n", - "Its use is simple. Type the following to see the usage message:" + "Its use is simple; Type the following to see the usage message:" ] }, { @@ -42,7 +42,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "For more information about a specific indicator, you can either use the `info` subcommand or directly access the `--help` message of the indicator. The former gives more information about the metadata while the latter only prints the usage. Note that the module name (`atmos`, `land` or `seaIce`) is mandatory." + "For more information about a specific indicator, you can either use the `info` sub-command or directly access the `--help` message of the indicator. The former gives more information about the metadata, while the latter only prints the usage. Note that the module name (`atmos`, `land` or `seaIce`) is mandatory." ] }, { @@ -111,7 +111,7 @@ "Computing indicators\n", "--------------------\n", "\n", - "So let's say we have the following toy dataset:" + "Let's say we have the following toy dataset:" ] }, { @@ -145,7 +145,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "To compute an indicator, say the monthly solid precipitation accumulation, we simply call:" + "To compute an **indicator**, say the monthly solid precipitation accumulation, we simply call:" ] }, { @@ -161,9 +161,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In this example, we decided to use `tasmin` for the `tas` variable. We didn't need to provide the `--pr` parameter as our data has the same name.\n", + "In this example, we decided to use `tasmin` for the `tas` variable. We didn't need to provide the `--pr` parameter, as our data has the same name.\n", "\n", - "Finally, more than one indicators can be computed to the output dataset by simply chaining the calls:" + "Finally, more than one indicator can be computed and written to the output dataset by simply chaining the calls:" ] }, { @@ -225,7 +225,7 @@ "\n", "As of version 0.30.0, `xclim` now also provides a command-line utility for performing data quality control checks on existing NetCDF files.\n", "\n", - "These checks examine the values of data_variables for suspicious value patterns (e.g. values that repeat for many days) or erroneous values (e.g. humidity percentages outside of 0-100, minimum temperatures exceeding maximum temperatures, etc.). The checks (called \"data flags\") are based on the ECAD ICCLIM quality control checks (https://www.ecad.eu/documents/atbd.pdf).\n", + "These checks examine the values of data_variables for suspicious value patterns (e.g. values that repeat for many days) or erroneous values (e.g. humidity percentages outside 0-100, minimum temperatures exceeding maximum temperatures, etc.). The checks (called ``dataflags``) are based on the ECAD ICCLIM quality control checks (https://www.ecad.eu/documents/atbd.pdf).\n", "\n", "The full list of checks performed for each variable are listed in `xclim/core/data/variables.yml`." ] @@ -243,12 +243,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "When running the dataflags CLI checks, you must either set an output file (`-o filename.nc`) or set the checks to raise if there are any failed checks (`-r`).\n", + "When running the ``dataflags`` CLI checks, you must either set an output file (`-o filename.nc`) or set the checks to raise if there are any failed checks (`-r`).\n", "\n", "By default, when setting an output file, the returned file will only contain the flag value\n", "(`True` if no flags were raised, `False` otherwise). To append the flag to a copy of the dataset, we use the `-a` option.\n", "\n", - "The default behaviour is to raise a flag if any element of the array resolves to `True` (ie: aggregated across all dimensions), but we can specify the level of aggregation by dimension with the `-d` or `--dims` option." + "The default behaviour is to raise a flag if any element of the array resolves to `True` (i.e. aggregated across all dimensions), but we can specify the level of aggregation by dimension with the `-d` or `--dims` option." ] }, { @@ -352,7 +352,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "These checks can also be set to examine a specifc variable within a netcdf file, with more descriptive information for each check performed." + "These checks can also be set to examine a specific variable within a NetCDF file, with more descriptive information for each check performed." ] }, { @@ -395,7 +395,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.6" + "version": "3.10.9" } }, "nbformat": 4, diff --git a/docs/notebooks/customize.ipynb b/docs/notebooks/customize.ipynb index d725c0944..465f88f96 100644 --- a/docs/notebooks/customize.ipynb +++ b/docs/notebooks/customize.ipynb @@ -31,7 +31,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Let's create fake data with some missing values and mask every 10th, 20th and 30th of the month.This represents 9.6-10% of masked data for all months except February where it is 7.1%." + "Let's create fake data with some missing values and mask every 10th, 20th and 30th of the month. This represents 9.6-10% of masked data for all months except February, where it is 7.1%." ] }, { @@ -101,7 +101,7 @@ "source": [ "## Adding translated metadata\n", "\n", - "With the help of its internationalization module (`xclim.core.locales`), xclim can add translated metadata to the output of the indicators. The metadata is _not_ translated on-the-fly, but translations are manually written for each indicator and metadata field. Currently, all indicators have a french translation, but users can add more choices. See [Internationalization](../internationalization.rst) and [Extending xclim](extendxclim.ipynb).\n", + "With the help of its internationalization module (`xclim.core.locales`), xclim can add translated metadata to the output of the indicators. The metadata is _not_ translated on-the-fly, but translations are manually written for each indicator and metadata field. Currently, all indicators have a French translation, but users can freely add more languages. See [Internationalization](../internationalization.rst) and [Extending xclim](extendxclim.ipynb).\n", "\n", "In the example below, notice the added `long_name_fr` and `description_fr` attributes. Also, the use of `set_options` as a context makes this configuration transient, only valid within the context." ] @@ -152,7 +152,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Only February has non-masked data. Let's say we want to use the \"wmo\" method (and its default options), but only once, we can do:" + "Only February has non-masked data. Let's say we want to use the ``\"wmo\"`` method (and its default options), but only once, we can do:" ] }, { @@ -176,11 +176,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This method checks that there is less than `nm=5` invalid values in a month and that there are no consecutive runs of `nc>=4` invalid values. Thus, every month is now valid.\n", + "This method checks that there are less than `nm=5` invalid values in a month and that there are no consecutive runs of `nc>=4` invalid values. Thus, every month is now valid.\n", "\n", "Finally, it is possible for advanced users to register their own method. Xclim's missing methods are in fact based on class instances. Thus, to create a custom missing class, one should implement a subclass based on `xclim.core.checks.MissingBase` and overriding at least the `is_missing` method. The method should take a `null` argument and a `count` argument.\n", "\n", - "- `null` is a `DataArrayResample` instance of the resampled mask of invalid values in the input dataarray.\n", + "- `null` is a `DataArrayResample` instance of the resampled mask of invalid values in the input data array.\n", "- `count` is the number of days in each resampled periods and any number of other keyword arguments. \n", "\n", "The `is_missing` method should return a boolean mask, at the same frequency as the indicator output (same as `count`), where True values are for elements that are considered missing and masked on the output.\n", @@ -257,7 +257,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.6" + "version": "3.10.9" } }, "nbformat": 4, diff --git a/docs/notebooks/ensembles-advanced.ipynb b/docs/notebooks/ensembles-advanced.ipynb index afa6d25b1..1f2dbaaf0 100644 --- a/docs/notebooks/ensembles-advanced.ipynb +++ b/docs/notebooks/ensembles-advanced.ipynb @@ -70,12 +70,12 @@ "Ensemble-Reduction Techniques\n", "=============================\n", "\n", - "`xclim.ensembles` provides means of reducing the number of candidates in a sample to get a reasonable and representative spread of outcomes using a reduced number of candidates. By reducing the number of realizations in a strategic manner, we can significantly reduce the number of realizations to examine, while maintaining statistical representation of original dataset. This is particularly useful when computation power or time is a factor.\n", + "`xclim.ensembles` provides means of reducing the number of candidates in a sample to get a reasonable and representative spread of outcomes using a reduced number of candidates. By reducing the number of realizations in a strategic manner, we can significantly reduce the number of realizations to examine, while maintaining a statistical representation of the original dataset. This is particularly useful when computation power or time is a factor.\n", "\n", "For more information on the principles and methods behind ensemble reduction techniques, see: https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0152495 and https://doi.org/10.1175/JCLI-D-14-00636.1\n", "\n", "**Selection Criteria**\\\n", - "The following example considers 50 member ensemble with a total of 6 criteria considered (3 variable deltas * 2 time horizons). Our goal is to reduce this number to a more manageable size while preserving the range of uncertainty across our different criteria." + "The following example considers a 50-member ensemble with a total of 6 criteria considered (3 variable deltas * 2 time horizons). Our goal here is to reduce this number to a more manageable size while preserving the range of uncertainty across our different criteria." ] }, { @@ -151,7 +151,7 @@ "source": [ "#### **K-Means reduce ensemble**\n", "\n", - "The `kmeans_reduce_ensemble` works by grouping realizations into sub-groups based on the provided critera and retaining a representative `realization` per sub-group.\n", + "The `kmeans_reduce_ensemble` works by grouping realizations into subgroups based on the provided criteria and retaining a representative `realization` per subgroup.\n", "\n", "For a real-world example of the K-means clustering algorithm applied to climate data selection, see: https://doi.org/10.1371/journal.pone.0152495 and https://doi.org/10.1175/JCLI-D-11-00440.1\n", "\n", @@ -208,7 +208,7 @@ "source": [ "The function optionally produces a data dictionary for figure production of the associated R² profile.\n", "\n", - "The function `ensembles.plot_rsqprofile` provides plotting for evaluating the proportion of total variance in climate realizations that is covered by the selection.\n", + "The function ``ensembles.plot_rsqprofile`` provides plotting for evaluating the proportion of total variance in climate realizations that is covered by the selection.\n", "\n", "In this case ~88% of the total variance in original ensemble is covered by the selection." ] @@ -226,8 +226,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Alternatively we can use `method = {'rsq_cutoff':Float}` or `method = {'rsq_optimize':None}`\n", - "* For example with `rsq_cutoff` we instead find the number of realizations needed to cover the provided $R^{2}$ value" + "Alternatively, we can use `method = {'rsq_cutoff':Float}` or `method = {'rsq_optimize':None}`\n", + "* For example, with `rsq_cutoff` we instead find the number of realizations needed to cover the provided $R^{2}$ value" ] }, { @@ -249,11 +249,11 @@ "source": [ "#### **KKZ reduce ensemble**\n", "\n", - "`xclim` also makes available a similar ensemble reduction algorithm, `ensembles.kkz_reduce_ensemble`. see: https://doi.org/10.1175/JCLI-D-14-00636.1\n", + "`xclim` also makes available a similar ensemble reduction algorithm, `ensembles.kkz_reduce_ensemble`. See: https://doi.org/10.1175/JCLI-D-14-00636.1\n", "\n", "The advantage of this algorithm is largely that fewer realizations are needed in order to reach the same level of representative members than the K-means clustering algorithm, as the KKZ methods tends towards identifying members that fall towards the extremes of criteria values. \n", "\n", - "This technique also produces nested selection results, where additional increase in desired selection size does not alter the previous choices, which is not the case for the K-means algorithm." + "This technique also produces nested selection results, where an additional increase in desired selection size does not alter the previous choices, which is not the case for the K-means algorithm." ] }, { @@ -297,8 +297,7 @@ "source": [ "#### **KKZ algorithm vs K-Means algorithm**\n", "\n", - "To give a better sense of the differences between **Nested (KKZ)** and **Unnested (K-Means)** results, we can progressively identify members that would be chosen by each algorithm through iterative fashion.\n", - "\n" + "To give a better sense of the differences between **Nested (KKZ)** and **Unnested (K-Means)** results, we can progressively identify members that would be chosen by each algorithm through an iterative fashion.\n" ] }, { @@ -335,13 +334,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "While the **Nested** feature of the KKZ results is typically advantageous, it can sometimes result in unbalanced coverage of the original ensemble. **In general careful consideration and validation of selection results is suggested when `n` is small, regardless of the technique used.**\n", + "While the **Nested** feature of the KKZ results is typically advantageous, it can sometimes result in unbalanced coverage of the original ensemble. **In general, careful consideration and validation of selection results is suggested when `n` is small, regardless of the technique used.**\n", "\n", - "To illustrate a simple example using only 2 of our criteria shows differences in results between the two techniques:\n", + "To illustrate, a simple example using only 2 of our criteria shows differences in results between the two techniques:\n", "\n", "The **KKZ** algorithm iteratively maximizes distance from previous selected candidates - potentially resulting in 'off-center' results versus the original ensemble\n", "\n", - "The **K-means** algorithm will redivide the data space with each iteration producing results that are consistently centered on the original ensemble but lacking coverage in the extremes " + "The **K-means** algorithm will redivide the data space with each iteration, producing results that are consistently centered on the original ensemble but lacking coverage in the extremes " ] }, { @@ -395,13 +394,6 @@ "plt.suptitle(\"K-means selection results\")\n", "plt.show()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -421,7 +413,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.6" + "version": "3.10.9" }, "toc": { "base_numbering": 1, diff --git a/docs/notebooks/ensembles.ipynb b/docs/notebooks/ensembles.ipynb index 110d26098..d98ac8635 100644 --- a/docs/notebooks/ensembles.ipynb +++ b/docs/notebooks/ensembles.ipynb @@ -104,22 +104,23 @@ "An important aspect of climate models is that they are run multiple times with some initial perturbations to see how they replicate the natural variability of the climate. Through [xclim.ensembles](../api.rst#ensembles-module), xclim provides an easy interface to compute ensemble statistics on different members. Most methods perform checks and conversion on top of simpler `xarray` methods, providing an easier interface to use.\n", "\n", "### create_ensemble\n", - "Our first step is to create an ensemble. This methods takes a list of files defining the same variables over the same coordinates and concatenates them into one dataset with an added dimension `realization`.\n", + "Our first step is to create an ensemble. This method takes a list of files defining the same variables over the same coordinates and concatenates them into one dataset with an added dimension `realization`.\n", "\n", "Using `xarray` a very simple way of creating an ensemble dataset would be :\n", "```python\n", "import xarray\n", + "\n", "xarray.open_mfdataset(files, concat_dim='realization')\n", "```\n", "\n", "However, this is only successful when the dimensions of all the files are identical AND only if the calendar type of each netcdf file is the same\n", "\n", - "xclim's `create_ensemble()` method overcomes these constraints selecting the common time period to all files and assigns a standard calendar type to the dataset. \n", + "xclim's `create_ensemble()` method overcomes these constraints, selecting the common time period to all files and assigns a standard calendar type to the dataset. \n", "\n", "
\n", "\n", "Input netcdf files still require equal spatial dimension size (e.g. lon, lat dimensions).
\n", - "If input data contains multiple cftime calendar types they must not be at daily frequency.\n", + "If input data contains multiple `cftime` calendar types, they must not be at daily frequency.\n", "\n", "
\n", "\n", @@ -177,11 +178,11 @@ "metadata": {}, "source": [ "### Ensemble statistics\n", - "Beyond creating ensemble dataset the `xclim.ensembles` module contains functions for calculating statistics between realizations\n", + "Beyond creating an ensemble dataset, the `xclim.ensembles` module contains functions for calculating statistics between realizations\n", "\n", "**Ensemble mean, standard-deviation, max & min**\n", "\n", - "In the example below we use xclim's `ensemble_mean_std_max_min()` to calculate statistics across the 10 realizations in our test dataset. Output variables are created combining the original variable name `tas` with addtional ending indicating the statistic calculated on the realization dimension : `_mean`, `_stdev`, `_min`, `_max`\n", + "In the example below, we use xclim's `ensemble_mean_std_max_min()` to calculate statistics across the 10 realizations in our test dataset. Output variables are created combining the original variable name `tas` with additional ending indicating the statistic calculated on the realization dimension : `_mean`, `_stdev`, `_min`, `_max`\n", "\n", "The resulting output now contains 4 derived variables from the original single variable in our ensemble dataset." ] @@ -202,8 +203,8 @@ "source": [ "### Ensemble percentiles\n", "\n", - "Here we use xclim's `ensemble_percentiles()` to calculate percentile values across the 10 realizations. \n", - "The output has now a `percentiles` dimension instead of `realization`. Split variables can be created instead, by specifying `split=True` (the variable name `tas` will be appended with `_p{x}`). Compared to numpy's `percentile()` and xarray's `quantile()`, this method handles more efficiently dataset with invalid values and the chunking along the realization dimension (which is automatic when dask arrays are used)." + "Here, we use xclim's `ensemble_percentiles()` to calculate percentile values across the 10 realizations. \n", + "The output has now a `percentiles` dimension instead of `realization`. Split variables can be created instead, by specifying `split=True` (the variable name `tas` will be appended with `_p{x}`). Compared to NumPy's `percentile()` and xarray's `quantile()`, this method handles more efficiently dataset with invalid values and the chunking along the realization dimension (which is automatic when dask arrays are used)." ] }, { @@ -259,7 +260,7 @@ "metadata": { "celltoolbar": "Edit Metadata", "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -273,7 +274,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.10.9" } }, "nbformat": 4, diff --git a/docs/notebooks/example.ipynb b/docs/notebooks/example.ipynb index 124a83452..aad006931 100644 --- a/docs/notebooks/example.ipynb +++ b/docs/notebooks/example.ipynb @@ -13,7 +13,7 @@ "\n", "`xarray` is a python package making it easy to work with n-dimensional arrays. It labels axes with their names `[time, lat, lon, level]` instead of indices `[0,1,2,3]`, reducing the likelihood of bugs and making the code easier to understand. One of the key strengths of `xarray` is that it knows how to deal with non-standard calendars (we're looking at you, \"`360_days`\") and can easily resample daily time series to weekly, monthly, seasonal or annual periods. Finally, `xarray` is tightly integrated with `dask`, a package that can automatically parallelize operations.\n", "\n", - "The following are a few examples to consult when using `xclim` to subset netCDF arrays and compute climate indicators, taking advantage of the parallel processing capabilities offered by `xarray` and `dask`. For more information about these projects, please see their documentation pages:\n", + "The following are a few examples to consult when using `xclim` to subset NetCDF arrays and compute climate indicators, taking advantage of the parallel processing capabilities offered by `xarray` and `dask`. For more information about these projects, please see their documentation pages:\n", "\n", "* [xarray documentation](https://xarray.pydata.org/en/stable/)\n", "* [dask documentation](https://docs.dask.org/en/stable/)" @@ -67,17 +67,17 @@ "\n", "
\n", "\n", - "In this example, we are using the **dask.distributed** submodule. This is not installed by default in a basic `xclim` installation. Be sure to add `distributed` to your Python installation before setting up parallel processing operations!\n", + "In this example, we are using the ``**dask.distributed**`` submodule. This is not installed by default in a basic `xclim` installation. Be sure to add `distributed` to your Python installation before setting up parallel processing operations!\n", "\n", "
\n", "\n", - "First we create a pool of workers that will wait for jobs. The `xarray` library will automatically connect to these workers and and dispatch them jobs that can be run in parallel.\n", + "First, we create a pool of workers that will wait for jobs. The `xarray` library will automatically connect to these workers and dispatch them jobs that can be run in parallel.\n", "\n", "The dashboard link lets you see in real time how busy those workers are.\n", "\n", "* [dask distributed documentation](https://distributed.dask.org/en/latest/)\n", "\n", - "This step is not mandatory as dask will fall back to its \"single machine scheduler\" if a `Client` is not created. However, this default scheduler doesn't allow you to set the number of threads or a memory limit and doesn't start the dashboard, which can be quite useful to understand your task's progress.\n" + "This step is not mandatory, as `dask` will fall back to its \"single machine scheduler\" if a `Client` is not created. However, this default scheduler doesn't allow you to set the number of threads or a memory limit and doesn't start the dashboard, which can be quite useful to understand your task's progress.\n" ] }, { @@ -104,15 +104,15 @@ "source": [ "## Creating xarray datasets\n", "\n", - "To open a netCDF file with `xarray`, we use `xr.open_dataset()`. By default, the entire file is stored in one chunk, so there is no parallelism. To trigger parallel computations, we need to explicitly specify the **chunk size**.\n", + "To open a NetCDF file with `xarray`, we use `xr.open_dataset()`. By default, the entire file is stored in one chunk, so there is no parallelism. To trigger parallel computations, we need to explicitly specify the **chunk size**.\n", "\n", "
\n", "\n", - "In this example, instead of opening a local file, we pass an *OPeNDAP* url to xarray. It retrieves the data automatically. Notice also that opening the dataset is quite fast. In fact, the data itself has not been downloaded yet, only the coordinates and the metadata. The downloads will be triggered only when the values need to be accessed directly.\n", + "In this example, instead of opening a local file, we pass an *OPeNDAP* URL to xarray. It retrieves the data automatically. Notice also that opening the dataset is quite fast. In fact, the data itself has not been downloaded yet, only the coordinates and the metadata. The downloads will be triggered only when the values need to be accessed directly.\n", "\n", "
\n", "\n", - "`dask`'s parallelism is based on memory chunks. We need to tell `xarray` to split our netCDF array into chunks of a given size, and operations on each chunk of the array will automatically be dispatched to the workers." + "`dask`'s parallelism is based on memory chunks; We need to tell `xarray` to split our NetCDF array into chunks of a given size, and operations on each chunk of the array will automatically be dispatched to the workers." ] }, { @@ -215,10 +215,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n", "For more powerful subsetting tools with features such as coordinate reference system (CRS) aware subsetting and vector shape masking, the `xclim` developers strongly encourage users to consider the subsetting utilities of the [clisops](https://github.com/roocs/clisops) package.\n", "\n", - "Their documentation showcases several examples of how perform more complex subsetting: [clisops.core.subset](https://clisops.readthedocs.io/en/latest/notebooks/core_subset.html)." + "Their documentation showcases several examples of how to perform more complex subsetting: [clisops.core.subset](https://clisops.readthedocs.io/en/latest/notebooks/core_subset.html)." ] }, { @@ -229,15 +228,15 @@ "source": [ "## Climate index calculation & resampling frequencies\n", "\n", - "`xclim` has two layers for the calculation of indicators. The bottom layer is composed of a list of functions that take one or more `xarray.DataArray`'s as input and return an `xarray.DataArray` as output. You'll find these functions in `xclim.indices`. The indicator's logic is contained in this function, as well as some unit handling, but it doesn't perform any data consistency checks (like if the time frequency is daily), and doesn't not adjust the metadata of the output array.\n", + "`xclim` has two layers for the calculation of indicators. The bottom layer is composed of a list of functions that take one or more `xarray.DataArray`'s as input and return an `xarray.DataArray` as output. You'll find these functions in `xclim.indices`. The indicator's logic is contained in this function, as well as some unit handling, but it doesn't perform any data consistency checks (like if the time frequency is daily), and doesn't adjust the metadata of the output array.\n", "\n", "The second layer are class instances that you'll find organized by *realm*. So far, there are three realms available in `xclim.atmos`, `xclim.seaIce` and `xclim.land`, the first one being the most exhaustive. Before running computations, these classes check if the input data is a daily average of the expected variable:\n", "\n", - "1. If an indicator expects a daily mean and you pass it a daily max, a `warning` will be raised.\n", - "2. After the computation, it also checks the number of values per period to make sure there are not missing values or `NaN` in the input data. If there are, the output is going to be set to `NaN`. Ex. : If the indicator performs a yearly resampling but there are only 350 non-`NaN` values in one given year in the input data, that year's output will be `NaN`.\n", + "1. If an indicator expects a daily mean, and you pass it a daily max, a `warning` will be raised.\n", + "2. After the computation, it also checks the number of values per period to make sure there are not missing values or `NaN` in the input data. If there are, the output is going to be set to `NaN`. Ex. : If the indicator performs a yearly resampling, but there are only 350 non-`NaN` values in one given year in the input data, that year's output will be `NaN`.\n", "3. The output units are set correctly as well as other properties of the output array, complying as much as possible with CF conventions.\n", "\n", - "For new users, we suggest you use the classes found in `xclim.atmos` and others. If you know what you're doing and you want to circumvent the built-in checks, then you can use the `xclim.indices` directly.\n", + "For new users, we suggest you use the classes found in `xclim.atmos` and others. If you know what you're doing, and you want to circumvent the built-in checks, then you can use the `xclim.indices` directly.\n", "\n", "Almost all `xclim` indicators convert daily data to lower time frequencies, such as seasonal or annual values. This is done using `xarray.DataArray.resample` method. Resampling creates a grouped object over which you apply a reduction operation (e.g. mean, min, max). The list of available frequency is given in the link below, but the most often used are:\n", "\n", @@ -248,7 +247,7 @@ "\n", "More info about this specification can be found in [pandas' documentation](http://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-offset-aliases)\n", "\n", - "Note - not all offsets in the link are supported by cftime objects in `xarray`.\n", + "Note - not all offsets in the link are supported by ``cftime`` objects in `xarray`.\n", "\n", "\n", "In the example below, we're computing the **annual maximum temperature of the daily maximum temperature (tx_max)**." @@ -347,12 +346,12 @@ "Many indices use algorithms that find the length of given sequences. For instance, `xclim.indices.heat_wave_max_length` finds the longest sequence where `tasmax` and `tasmin` are above given threshold values. Resampling can be used to find the longest sequence in given periods of time, for instance the longest heat wave for each month if the resampling frequency is `freq == \"MS\"`.\n", "\n", "The order of the two operations just described, i.e. :\n", - "* Finding the length of sequences respecting a certain criteria (\"run length algorithms\")\n", + "* Finding the length of sequences respecting a certain criterion (\"run length algorithms\")\n", "* Separating the dataset in given time periods (\"resampling\")\n", "\n", "is important and can lead to differing results.\n", "\n", - "The cell below illustrates this by looking at the maximum lengths of heat waves each month from May 2010 to August 2010 by doing these operations in the two possible orders. The heat wave max lengths for July in a small region of interest $\\text{lat} \\in [43, 44.5],\\, \\text{lon} \\in [-117.5, -116]$ are shown: The maximal lengths are sometimes longer first applying the run length algorithmn (`resample_before_rl == False`).\n" + "The cell below illustrates this by looking at the maximum lengths of heat waves each month from May 2010 to August 2010 by doing these operations in the two possible orders. The heat wave max lengths for July in a small region of interest $\\text{lat} \\in [43, 44.5],\\, \\text{lon} \\in [-117.5, -116]$ are shown: The maximal lengths are sometimes longer first applying the run length algorithm (`resample_before_rl == False`).\n" ] }, { @@ -414,15 +413,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Let's focus on the point $(-117.21075, 44.29087)$, which has a maximum wave length of 4 or 7, depending if resampling occurs before or after the run length algorithm.\n", + "Let's focus on the point $(-117.21075, 44.29087)$, which has a maximum wave length of four (4) or seven (7), depending on whether resampling occurs _before_ or _after_ the run length algorithm.\n", "\n", - "Plotting the values of `tasmin` in July and early August, we see a sequence of 7 hot minimal temperatures at the end of July that surpass the threshold to qualify for a heat wave.\n", + "Plotting the values of `tasmin` in July and early August, we see a sequence of seven hot minimal temperatures at the end of July that surpass the threshold to qualify for a heat wave.\n", "\n", - "1. If resampling occurs first and we first separate the periods in months, the run length algorithms will only look for sequences of hot days **within** the month of July and will exclude the last 3 days of this sequence of 7 days.\n", + "1. If resampling occurs first, and we first separate the periods in months, the run length algorithms will only look for sequences of hot days **within** the month of July and will exclude the last 3 days of this sequence of 7 days.\n", "\n", - "2. Using the run length algorithm before resampling looks for sequences of hot days in all the dataset given (temperatures form May 1, 2010 to Aug. 31, 2010) and then subdivides these sequences in the months where they have started. Since it starts in July, this sequence registered ascounts for a heat wave of 7 days happening in July.\n", + "2. Using the run length algorithm before resampling looks for sequences of hot days in all the dataset given (temperatures from May 1, 2010 to Aug. 31, 2010) and then subdivides these sequences in the months where they have started. Since it starts in July, this sequence is registered as counts for a heat wave of seven days happening in July.\n", "\n", - "This also implies that the first 3 days of August which belong in this sequence of 7 days will be counted as a sequence in August with the first method, but not with the second." + "This also implies that the first 3 days of August which belong in this sequence of seven days will be counted as a sequence in August with the first method, but not with the second." ] }, { @@ -455,7 +454,7 @@ "source": [ "## *Lazy* computation - Nothing has been computed so far !\n", "\n", - "If you look at the output of those operations, they're identified as `dask.array` objects. What happens is that `dask` creates a chain of operations that when executed, will yield the values we want. We have thus far only created a schedule of tasks with a small preview and not done any actual computations. You can trigger computations by using the `load` or `compute` method, or writing the output to disk via `to_netcdf`. Of course, calling `.plot()` will also trigger the computation." + "If you look at the output of those operations, they're identified as `dask.array` objects. What happens is that `dask` creates a chain of operations that, when executed, will yield the values we want. We have thus far only created a schedule of tasks with a small preview and not done any actual computations. You can trigger computations by using the `load` or `compute` method, or writing the output to disk via `to_netcdf`. Of course, calling `.plot()` will also trigger the computation." ] }, { @@ -555,9 +554,9 @@ "source": [ "## Unit handling in `xclim`\n", "\n", - "A lot of effort has been placed into automatic handling of input data units. `xclim` will automatically detect the input variable(s) units (e.g. °C versus °K or mm/s versus mm/day etc.) and adjust on-the-fly in order to calculate indices in the consistent manner. This comes with the obvious caveat that input data requires metadata attribute for units.\n", + "A lot of effort has been placed into automatic handling of input data units. `xclim` will automatically detect the input variable(s) units (e.g. `°C` versus `°K` or `mm/s` versus `mm/day` etc.) and adjust on-the-fly in order to calculate indices in the consistent manner. This comes with the obvious caveat that input data requires metadata attribute for units.\n", "\n", - "In the example below, we compute weekly total precipitation in mm using inputs of mm/s and mm/d. As you see, the output is identical." + "In the example below, we compute weekly total precipitation in mm using inputs of `mm/s` and `mm/d`. As we can see, the output is identical." ] }, { @@ -599,7 +598,7 @@ "source": [ "### Threshold indices\n", "\n", - "`xclim` unit handling also applies to threshold indicators. Users can provide threshold in units of choice and `xclim` will adjust automatically. For example determining the number of days with tasmax > 20°C users can define a threshold input of '20 C' or '20 degC' even if input data is in Kelvin. Alernatively users can even provide a threshold in Kelvin '293.15 K' (if they really wanted to)." + "`xclim` unit handling also applies to threshold indicators. Users can provide threshold in units of choice and `xclim` will adjust automatically. For example, determining the number of days with tasmax > 20 °C, users can define a threshold input of ``\"20 C\"`` or ``\"20 degC\"`` even if input data is in Kelvin. Alternatively, users can even provide a threshold in Kelvin (``\"293.15 K\"``, if they really wanted to)." ] }, { @@ -639,7 +638,7 @@ "#### Spatially varying thresholds\n", "Thresholds can also be passed as DataArrays instead of single scalar values, allowing the computation to depend on one or more non-temporal dimensions. The `units` attribute must be set.\n", "\n", - "Going back to the initial `ds`, we'll subset it and compute the length of heat wave according to thresholds that vary along the latitude and longitude." + "Going back to the initial `ds`, we'll subset it and compute the length of the heat wave according to thresholds that vary along the latitude and longitude." ] }, { @@ -658,7 +657,7 @@ "metadata": {}, "outputs": [], "source": [ - "# The tasmin threshold is 15°C for the northern half of the domain and 20°C for the southern half.\n", + "# The tasmin threshold is 15 °C for the northern half of the domain and 20 °C for the southern half.\n", "# (notice that the lat coordinate is in decreasing order : from north to south)\n", "thresh_tasmin = xr.DataArray(\n", " [7] * 24 + [11] * 24, dims=(\"lat\",), coords={\"lat\": ds5.lat}, attrs={\"units\": \"°C\"}\n", @@ -682,7 +681,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The final map, here for 1958, shows clear jumps across the 4 quadrants, which was expected with our space-dependent thresholds. Notice also how the `long_name` (printed as the colorbar label) mentions that the threshold comes from \"an array\". This imprecise metadata is a consequence of using DataArray thresholds." + "The final map for year 1958, shows clear jumps across the 4 quadrants, which was expected with our space-dependent thresholds. Notice also how the `long_name` (printed on the colorbar label) mentions that the threshold comes from \"an array\". This imprecise metadata is a consequence of using `DataArray`-derived thresholds." ] }, { @@ -697,7 +696,6 @@ } ], "metadata": { - "celltoolbar": "Edit Metadata", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", diff --git a/docs/notebooks/extendxclim.ipynb b/docs/notebooks/extendxclim.ipynb index 5dff4fa7f..8795ae650 100644 --- a/docs/notebooks/extendxclim.ipynb +++ b/docs/notebooks/extendxclim.ipynb @@ -6,18 +6,18 @@ "source": [ "# Extending xclim\n", "\n", - "xclim tries to make it easy for users to add their own indices and indicators. The following goes into details on how to create _indices_ and document them so that xclim can parse most of the metadata directly. We then explain the multiple ways new _Indicators_ can be created and, finally, how we can regroup and structure them in virtual submodules.\n", + "`xclim` tries to make it easy for users to add their own indices and indicators. The following goes into details on how to create `**Indices**` and document them so that xclim can parse most of the metadata directly. We then explain the multiple ways new `**Indicators**` can be created and, finally, how we can regroup and structure them in virtual submodules.\n", "\n", - "Central to xclim are the **Indicators**, objects computing indices over climate variables, but xclim also provides other modules:\n", + "Central to `xclim` are the **Indicators**, objects computing indices over climate variables, but `xclim` also provides many other modules:\n", "\n", "![modules](./Modules.svg)\n", "\n", - "This introduction will focus on the Indicator/Indice part of xclim and how one can extend it by implementing new ones.\n", + "This introduction will focus on the Indicator/Indice part of `xclim` and how one can extend it by implementing new ones.\n", "\n", "\n", "## Indices vs Indicators\n", "\n", - "Internally and in the documentation, xclim makes a distinction between \"indices\" and \"indicators\".\n", + "Internally and in the documentation, `xclim` makes a distinction between \"indices\" and \"indicators\".\n", "\n", "### indice\n", "\n", @@ -51,7 +51,7 @@ "source": [ "## Defining new indices\n", "\n", - "The annotated example below shows the general template to be followed when defining proper _indices_. In the comments `Ind` is the indicator instance that would be created from this function.\n", + "The annotated example below shows the general template to be followed when defining proper _indices_. In the comments, `Ind` is the indicator instance that would be created from this function.\n", "\n", "
\n", "\n", @@ -74,7 +74,7 @@ "\n", "import xarray as xr\n", "\n", - "import xclim as xc\n", + "import xclim\n", "from xclim.core.units import convert_units_to, declare_units\n", "from xclim.indices.generic import threshold_count\n", "\n", @@ -132,15 +132,15 @@ "source": [ "### Naming and conventions\n", "\n", - "Variable names should correspond to CMIP6 variables, whenever possible. The file `xclim/data/variables.yml` lists all variables that xclim can use when generating indicators from yaml files (see below), and new indices should try to reflect these also.\n", + "Variable names should correspond to CMIP6 variables, whenever possible. The file `xclim/data/variables.yml` lists all variables that xclim can use when generating indicators from YAML files (see below), and new indices should try to reflect these also.\n", "\n", "### Generic functions for common operations\n", "\n", - "The [xclim.indices.generic](../indices.rst#generic-indices-submodule) submodule contains useful functions for common computations (like `threshold_count` or `select_resample_op`) and many basic indice functions, as defined by [clix-meta](https://github.com/clix-meta/clix-meta). In order to reduce duplicate code, their use is recommended for xclim's indices. As previously said, the units handling has to be made explicitly when non trivial, [xclim.core.units](../api.rst#units-handling-submodule) also exposes a few helpers for that (like `convert_units_to`, `to_agg_units` or `rate2amount`).\n", + "The [xclim.indices.generic](../indices.rst#generic-indices-submodule) submodule contains useful functions for common computations (like `threshold_count` or `select_resample_op`) and many basic indice functions, as defined by [clix-meta](https://github.com/clix-meta/clix-meta). In order to reduce duplicate code, their use is recommended for xclim's indices. As previously said, the units handling has to be made explicitly when non-trivial, [xclim.core.units](../api.rst#units-handling-submodule) also exposes a few helpers for that (like `convert_units_to`, `to_agg_units` or `rate2amount`).\n", "\n", "### Documentation\n", "\n", - "As shown in both example, a certain level of convention is best followed when writing the docstring of the indice function. The general structure follows the NumpyDoc conventions and some fields might be parsed when creating the indicator (see the image above and the section below). If you are contributing to the xclim codebase, when adding a citation to the docstring, this is best done by adding that reference to the ``references.bib`` file and then citing it using its label with the `:cite:cts:` directive (or one of its variant). See the [contributing docs](../contributing.rst#write-Documentation).\n", + "As shown in both example, a certain level of convention is best followed when writing the docstring of the indice function. The general structure follows the NumpyDoc conventions, and some fields might be parsed when creating the indicator (see the image above and the section below). If you are contributing to the xclim codebase, when adding a citation to the docstring, this is best done by adding that reference to the ``references.bib`` file and then citing it using its label with the `:cite:cts:` directive (or one of its variant). See the [contributing docs](../contributing.rst#write-Documentation).\n", "\n", "## Defining new indicators\n", "\n", @@ -164,11 +164,11 @@ "\n", "### Identifier vs python name\n", "\n", - "An indicator's identifier is **not** the same as the name it has within the python module. For example, `xc.atmos.relative_humidity` has `hurs` as its identifier. As explained below, indicator _classes_ can be accessed through `xc.core.indicator.registry` with their _identifier_.\n", + "An indicator's identifier is **not** the same as the name it has within the python module. For example, `xclim.atmos.relative_humidity` has `hurs` as its identifier. As explained below, indicator _classes_ can be accessed through `xclim.core.indicator.registry` with their _identifier_.\n", "\n", "### Metadata parsing vs explicit setting\n", "\n", - "As explained above, most metadata can be parsed from the indice's signature and docstring. Otherwise, it can always be set when creating a new Indicator instance *or* a new subclass. When _creating_ an indicator, output metadata attributes can be given as strings, or list of strings in the case of indicator returning multiple outputs. However, they are stored in the `cf_attrs` list of dictionaries on the instance.\n", + "As explained above, most metadata can be parsed from the indice's signature and docstring. Otherwise, it can always be set when creating a new Indicator instance *or* a new subclass. When _creating_ an indicator, output metadata attributes can be given as strings, or list of strings in the case of an indicator returning multiple outputs. However, they are stored in the `cf_attrs` list of dictionaries on the instance.\n", "\n", "### Internationalization of metadata\n", "\n", @@ -180,12 +180,12 @@ "\n", "### Indicator creation\n", "\n", - "There a two ways for creating indicators:\n", + "There are two ways of creating indicators:\n", "\n", "1) By initializing an existing indicator (sub)class\n", "2) From a dictionary\n", "\n", - "The first method is best when defining indicators in scripts of external modules and are explained here. The second is best used when building virtual modules through YAML files, and is explained further down and in the [submodule doc](../api.rst#indicator-tools).\n", + "The first method is best when defining indicators in scripts or external modules and are explained here. The second is best used when building virtual modules through YAML files, and is explained further down and in the [submodule doc](../api.rst#indicator-tools).\n", "\n", "Creating a new indicator that simply modifies some metadata output of an existing one is a simple call like:" ] @@ -223,7 +223,7 @@ "source": [ "The registry is a dictionary mapping indicator identifiers (in uppercase) to their class. This way, we could subclass `tg_mean` to create our new indicator. `tg_mean_c` is the exact same as `atmos.tg_mean`, but outputs the result in Celsius instead of Kelvins, has a different title and removes control over the `freq` argument, resampling to \"YS\". The `identifier` keyword is here needed in order to differentiate the new indicator from `tg_mean` itself. If it wasn't given, a warning would have been raised and further subclassing of `tg_mean` would have in fact subclassed `tg_mean_c`, which is not wanted!\n", "\n", - "By default, indicator classes are registered in `xclim.core.indicator.registry`, using their identifier which is prepended by the indicator's module **if** that indicator is declared outside xclim. A \"child\" indicator inherits its module from its parent:" + "By default, indicator classes are registered in `xclim.core.indicator.registry`, using their identifier, which is prepended by the indicator's module **if** that indicator is declared outside xclim. A \"child\" indicator inherits its module from its parent:" ] }, { @@ -232,7 +232,7 @@ "metadata": {}, "outputs": [], "source": [ - "tg_mean_c.__module__ == xc.atmos.tg_mean.__module__" + "tg_mean_c.__module__ == xclim.atmos.tg_mean.__module__" ] }, { @@ -275,13 +275,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "While the former method is shorter, the latter is what xclim uses internally as it provides some clean code structure. See [the code in the github repo](https://github.com/Ouranosinc/xclim/tree/master/xclim/indicators).\n", + "While the former method is shorter, the latter is what xclim uses internally, as it provides some clean code structure. See [the code in the GitHub repo](https://github.com/Ouranosinc/xclim/tree/master/xclim/indicators).\n", "\n", "## Virtual modules\n", "\n", - "`xclim` gives users the ability to generate their own modules from existing indices library. These mappings can help in emulating existing libraries (such as ICCLIM), with the added benefit of CF-compliant metadata, multilingual metadata support, and optimized calculations using federated resources (using Dask). This can be used for example to tailor existing indices with predefined thresholds without having to rewrite indices.\n", + "`xclim` gives users the ability to generate their own modules from existing indices' library. These mappings can help in emulating existing libraries (such as `icclim`), with the added benefit of CF-compliant metadata, multilingual metadata support, and optimized calculations using federated resources (using Dask). This can be used for example to tailor existing indices with predefined thresholds without having to rewrite indices.\n", "\n", - "Presently, xclim is capable of approximating the indices developed in [ICCLIM](https://icclim.readthedocs.io/en/stable/explanation/climate_indices.html), [ANUCLIM](https://fennerschool.anu.edu.au/files/anuclim61.pdf) and [clix-meta](https://github.com/clix-meta/clix-meta) and is open to contributions of new indices and library mappings.\n", + "Presently, xclim is capable of approximating the indices developed in [icclim](https://icclim.readthedocs.io/en/stable/explanation/climate_indices.html), [ANUCLIM](https://fennerschool.anu.edu.au/files/anuclim61.pdf) and [clix-meta](https://github.com/clix-meta/clix-meta) and is open to contributions of new indices and library mappings.\n", "\n", "This notebook serves as an example of how one might go about creating their own library of mapped indices. Two ways are possible:\n", "\n", @@ -290,7 +290,7 @@ "\n", "### YAML file\n", "\n", - "The first method is based on the YAML syntax proposed by `clix-meta`, expanded to xclim's needs. The full documentation on that syntax is [here](../api.rst#indicator-tools). This notebook shows an example different complexities of indicator creation. It creates a minimal python module defining a indice, creates a YAML file with the metadata for several indicators and then parses it into xclim." + "The first method is based on the YAML syntax proposed by `clix-meta`, expanded to xclim's needs. The full documentation on that syntax is [here](../api.rst#indicator-tools). This notebook shows an example of different complexities of indicator creation. It creates a minimal python module defining an indice, creates a YAML file with the metadata for several indicators and then parses it into xclim." ] }, { @@ -344,7 +344,7 @@ "\n", "
\n", "\n", - "Values of the `base` arguments are the **identifier** of the associated indicators, and those can be different than their name within the python modules. For example, `xc.atmos.relative_humidity` has `HURS` as identifier. One can always access `xc.atmos.relative_humidity.identifier` to get the correct name to use.\n", + "Values of the `base` arguments are the **identifier** of the associated indicators, and those can be different from their name within the Python modules. For example, `xclim.atmos.relative_humidity` has `HURS` as identifier. One can always access `xclim.atmos.relative_humidity.identifier` to get the correct name to use.\n", "\n", "
\n", "\n", @@ -358,18 +358,18 @@ " * Some parameters are injected, the default for `freq` is modified.\n", " * The input variable `data` is mapped to a known variable. Functions in `xclim.indices.generic` are indeed generic. Here we tell xclim that the `data` argument is minimum daily temperature. This will set the proper units check, default value and CF-compliance checks.\n", "- `R95p` is similar to `fd` but here the `compute` is not defined in `xclim` but rather in `example.py`. Also, the custom function returns two outputs, so the `output` section is a list of mappings rather than a mapping directly.\n", - "- `R99p` is the same as `R95p` but changes the injected value. In order to avoid rewriting the output metadata, and allowed periods, we based it on `R95p` : as the latter was defined within the current yaml file, the identifier is prefixed by a dot (.).\n", + "- `R99p` is the same as `R95p` but changes the injected value. In order to avoid rewriting the output metadata, and allowed periods, we based it on `R95p` : as the latter was defined within the current YAML file, the identifier is prefixed by a dot (.).\n", "\n", "\n", - "Additionally, the yaml specified a `realm` and `references` to be used on all indices and provided a submodule docstring. Creating the module is then simply:\n", + "Additionally, the YAML specified a `realm` and `references` to be used on all indices and provided a submodule docstring. Creating the module is then simply:\n", "\n", - "Finally, French translations for the main attributes and the new indicators are given in `example.fr.json`. Even though new indicator objects are created for each yaml entry, non-specified translations are taken from the base classes if missing in the `json` file.\n", + "Finally, French translations for the main attributes and the new indicators are given in `example.fr.json`. Even though new indicator objects are created for each YAML entry, non-specified translations are taken from the base classes if missing in the JSON file.\n", "\n", "Note that all files are named the same way : `example.`, with the translations having an additional suffix giving the locale name. In the next cell, we build the module by passing only the path without extension. This absence of extension is what tells xclim to try to parse a module (`*.py`) and custom translations (`*..json`). Those two could also be read beforehand and passed through the `indices=` and `translations=` arguments.\n", "\n", "\n", "#### Validation of the YAML file\n", - "Using [yamale](https://github.com/23andMe/Yamale), it is possible to check if the yaml file is valid. xclim ships with a schema (in `xclim/data/schema.yml`) file. The file can be located with:" + "Using [yamale](https://github.com/23andMe/Yamale), it is possible to check if the YAML file is valid. `xclim` ships with a schema (in `xclim/data/schema.yml`) file. The file can be located with:" ] }, { @@ -587,7 +587,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.10.9" }, "toc": { "base_numbering": 1, diff --git a/docs/notebooks/frequency_analysis.ipynb b/docs/notebooks/frequency_analysis.ipynb index e66e9820b..e41c36876 100644 --- a/docs/notebooks/frequency_analysis.ipynb +++ b/docs/notebooks/frequency_analysis.ipynb @@ -8,7 +8,7 @@ "\n", "Frequency analysis refers to the study of the probability of occurrence of events. It's often used in regulatory contexts to determine design values for infrastructures. For example, your city might require that road drainage systems be able to cope with a level of rainfall that is exceeded only once every 20 years on average. This 20-year return event, the infrastructure *design value*, is computed by first extracting precipitation annual maxima from a rainfall observation time series, fitting a statistical distribution to the maxima, then estimating the 95th percentile (1:20 chance of being exceeded).\n", "\n", - "To facilitate this type of analysis on a large number of time series from model simulations or observations, `xclim` packs a few common utility functions. In the following example, we're estimating the 95th percentile of the daily precipitation maximum over the May-October period using a Generalized Extreme Value distribution.\n", + "To facilitate this type of analysis on numerous time series from model simulations or observations, `xclim` packs a few common utility functions. In the following example, we're estimating the 95th percentile of the daily precipitation maximum over the May-October period using a Generalized Extreme Value distribution.\n", "\n", "Note that at the moment, all frequency analysis functions are hard-coded to operate along the `time` dimension.\n", "\n", @@ -93,7 +93,7 @@ "source": [ "In practice, it's often useful to be able to save intermediate results, for example the parameters of the fitted distribution, so in the following we crack open what goes on behind the `frequency_analysis` function.\n", "\n", - "The first step of the frequency analysis is to extract the May-October maxima. This is done using the `indices.generic.select_resample_op` function, which applies an operator (`op`) on a resampled time series. It can also select portion of the year, such as climatological seasons (e.g. 'DJF' for winter months), or individual months (e.g. `month=[1]` for January)." + "The first step of the frequency analysis is to extract the May-October maxima. This is done using the `indices.generic.select_resample_op` function, which applies an operator (`op`) on a resampled time series. It can also select a portion of the year, such as climatological seasons (e.g. 'DJF' for winter months), or individual months (e.g. `month=[1]` for January)." ] }, { @@ -114,7 +114,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The next step is to fit the statistical distribution on these maxima. This is done by the `fit` method, which takes as argument the sample series, the distribution's name and the parameter estimation method. The fit is done by default using the Maximum Likelihood algorithm. For some extreme value distributions however, the maximum likelihood is not always robust, and `xclim` offers the possibility to use Probability Weighted Moments (PWM) to estimate parameters. Note that the `lmoments3` package which is used by `xclim` to compute the PWM only supports `expon`, `gamma`, `genextreme`, `genpareto`, `gumbel_r`, `pearson3` and `weibull_min`." + "The next step is to fit the statistical distribution on these maxima. This is done by the `.fit` method, which takes as argument the sample series, the distribution's name and the parameter estimation method. The fit is done by default using the Maximum Likelihood algorithm. For some extreme value distributions, however, the maximum likelihood is not always robust, and `xclim` offers the possibility to use Probability Weighted Moments (PWM) to estimate parameters. Note that the `lmoments3` package which is used by `xclim` to compute the PWM only supports `expon`, `gamma`, `genextreme`, `genpareto`, `gumbel_r`, `pearson3` and `weibull_min`." ] }, { @@ -156,7 +156,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As a convenience utility, the two last steps (`fit` and `parametric_quantile`) are bundled into the `fa` function, which takes care of converting the return period into a quantile value, and renames the `quantile` output dimension to `return_period`. This dimension renaming is done to avoid name clashes with the `quantile` method. Indeed, it's often necessary when analysing large ensembles, or probabilistic samples, to compute the quantiles of the quantiles, which will cause `xarray` to raise an error. The `mode` argument specifies whether we are working with maxima (max) or minima (min). This is important because a 100-year return period value for minima corresponds to a 0.01 quantile, while a 100-year return period value for maxima corresponds to a 0.99 quantile. " + "As a convenience utility, the two last steps (`fit` and `parametric_quantile`) are bundled into the `fa` function, which takes care of converting the return period into a quantile value, and renames the `quantile` output dimension to `return_period`. This dimension renaming is done to avoid name clashes with the `quantile` method. Indeed, it's often necessary when analyzing large ensembles, or probabilistic samples, to compute the quantiles of the quantiles, which will cause `xarray` to raise an error. The `mode` argument specifies whether we are working with maxima (max) or minima (min). This is important because a 100-year return period value for minima corresponds to a 0.01 quantile, while a 100-year return period value for maxima corresponds to a 0.99 quantile. " ] }, { @@ -204,7 +204,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -218,7 +218,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.10.9" } }, "nbformat": 4, diff --git a/docs/notebooks/sdba-advanced.ipynb b/docs/notebooks/sdba-advanced.ipynb index 3b2c43687..284284ab7 100644 --- a/docs/notebooks/sdba-advanced.ipynb +++ b/docs/notebooks/sdba-advanced.ipynb @@ -6,15 +6,15 @@ "source": [ "# Statistical Downscaling and Bias-Adjustment - Advanced tools\n", "\n", - "The previous notebook covered the most common utilities of `xclim.sdba` for conventionnal cases. Here we explore more advanced usage of `xclim.sdba` tools.\n", + "The previous notebook covered the most common utilities of `xclim.sdba` for conventional cases. Here, we explore more advanced usage of `xclim.sdba` tools.\n", "\n", "## Optimization with dask\n", "\n", - "Adjustment processes can be very heavy when we need to compute them over large regions and long timeseries. Using small groupings (like `time.dayofyear` ) adds precision and robustness, but also decuplates the load and computing complexity. Fortunately, unlike the heroic pioneers of scientific computing who managed to write parallelized Fortran, we now have [dask](https://dask.org/). With only a few parameters, we can magically distribute the computing load to multiple workers and threads.\n", + "Adjustment processes can be very heavy when we need to compute them over large regions and long timeseries. Using small groupings (like `time.dayofyear`) adds precision and robustness, but also decouples the load and computing complexity. Fortunately, unlike the heroic pioneers of scientific computing who managed to write parallelized FORTRAN, we now have [dask](https://dask.org/). With only a few parameters, we can magically distribute the computing load to multiple workers and threads.\n", "\n", "A good first read on the use of dask within xarray are the latter's [Optimization tips](https://xarray.pydata.org/en/stable/user-guide/dask.html#optimization-tips).\n", "\n", - "Some xclim.sdba-specific tips:\n", + "Some `xclim.sdba`-specific tips:\n", "\n", "* Most adjustment method will need to perform operation on the whole `time` coordinate, so it is best to optimize chunking along the other dimensions. This is often different from how public data is shared, where more universal 3D chunks are used.\n", "\n", @@ -23,13 +23,13 @@ "\n", "* One of the main bottleneck for adjustments with small groups is that dask needs to build and optimize an enormous task graph. This issue has been greatly reduced with xclim 0.27 and the use of `map_blocks` in the adjustment methods. However, not all adjustment methods use this optimized syntax.\n", "\n", - " In order to help dask, one can split the processing in parts. For splitting traning and adjustment, see [the section below](#Initializing-an-Adjustment-object-from-a-training-dataset).\n", + " In order to help dask, one can split the processing in parts. For splitting training and adjustment, see [the section below](#Initializing-an-Adjustment-object-from-a-training-dataset).\n", "\n", "\n", - "* Another massive bottleneck of parallelization of xarray is the thread-locking behaviour of some methods. It is quite difficult to isolate and avoid those lockings, so one of the best workaround is to use Dask configurations with many _processes_ and few _threads_. The former do not share memory and thus are not impacted when a lock is activated from a thread in another worker. However, this adds many memory transfer operations and, by experience, reduces dask's ability to parallelize some pipelines. Such a dask Client is usually created with a large `n_workers` and a small `threads_per_worker`.\n", + "* Another massive bottleneck of parallelization of `xarray` is the thread-locking behaviour of some methods. It is quite difficult to isolate and avoid these locking instances, so one of the best workarounds is to use `dask` configurations with many _processes_ and few _threads_. The former do not share memory and thus are not impacted when a lock is activated from a thread in another worker. However, this adds many memory transfer operations and, by experience, reduces dask's ability to parallelize some pipelines. Such a dask Client is usually created with a large `n_workers` and a small `threads_per_worker`.\n", "\n", "\n", - "* Sometimes, datasets have auxiliary coordinates (for example : lat / lon in a rotated pole dataset). Xarray handles these variables as data variables and will **not** load them if dask is used. However, in some operations, xclim or xarray will trigger an access to those variables, triggering computations each time, since they are dask-backed. To avoid this behaviour, one can load the coordinates, or simply remove them from the inputs." + "* Sometimes, datasets have auxiliary coordinates (for example : lat / lon in a rotated pole dataset). Xarray handles these variables as data variables and will **not** load them if dask is used. However, in some operations, `xclim` or `xarray` will trigger access to those variables, triggering computations each time, since they are `dask`-based. To avoid this behaviour, one can load the coordinates, or simply remove them from the inputs." ] }, { @@ -38,11 +38,11 @@ "source": [ "## LOESS smoothing and detrending\n", "\n", - "As described in Cleveland (1979), locally weighted linear regressions are multiple regression methods using a nearest-neighbor approach. Instead of using all data points to compute a linear or polynomial regression, LOESS algorithms compute a local regression for each point in the dataset, using only the k-nearest neighbors as selected by a weighting function. This weighting function must fulfill some strict requirements, see the doc of `xclim.sdba.loess.loess_smoothing` for more details.\n", + "As described in Cleveland (1979), locally weighted linear regressions are multiple regression methods using a nearest-neighbour approach. Instead of using all data points to compute a linear or polynomial regression, LOESS algorithms compute a local regression for each point in the dataset, using only the k-nearest neighbours as selected by a weighting function. This weighting function must fulfill some strict requirements, see the doc of `xclim.sdba.loess.loess_smoothing` for more details.\n", "\n", "In xclim's implementation, the user can choose between local _constancy_ ($d=0$, local estimates are weighted averages) and local _linearity_ ($d=1$, local estimates are taken from linear regressions). Two weighting functions are currently implemented : \"tricube\" ($w(x) = (1 - x^3)^3$) and \"gaussian\" ($w(x) = e^{-x^2 / 2\\sigma^2}$). Finally, the number of Cleveland's _robustifying iterations_ is controllable through `niter`. After computing an estimate of $y(x)$, the weights are modulated by a function of the distance between the estimate and the points and the procedure is started over. These iterations are made to weaken the effect of outliers on the estimate.\n", "\n", - "The next example shows the application of the LOESS to daily temperature data. The black line and dot are the estimated $y$, outputs of the `sdba.loess.loess_smoothing` function, using local linear regression (passing $d = 1$), a window spanning 20% ($f = 0.2$) of the domain, the \"tricube\" weighting function and only one iteration. The red curve illustrates the weighting function on January 1st 2014, where the red circles are the nearest-neighbors used in the estimation." + "The next example shows the application of the LOESS to daily temperature data. The black line and dot are the estimated $y$, outputs of the `sdba.loess.loess_smoothing` function, using local linear regression (passing $d = 1$), a window spanning 20% ($f = 0.2$) of the domain, the \"tricube\" weighting function and only one iteration. The red curve illustrates the weighting function on January 1st 2014, where the red circles are the nearest-neighbours used in the estimation." ] }, { @@ -253,7 +253,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The trained `QDM` exposes the training data in the `ds` attribute, Here, we will write it to disk, read it back and initialize an new object from it. Notice the `adj_params` in the dataset, that has the same value as the repr string printed just above. Also, notice the `_xclim_adjustment` attribute that contains a json string so we can rebuild the adjustment object later." + "The trained `QDM` exposes the training data in the `ds` attribute, Here, we will write it to disk, read it back and initialize a new object from it. Notice the `adj_params` in the dataset, that has the same value as the repr string printed just above. Also, notice the `_xclim_adjustment` attribute that contains a JSON string, so we can rebuild the adjustment object later." ] }, { @@ -281,7 +281,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In the case above, creating a full object from the dataset doesn't make the most sense since we are in the same python session, with the \"old\" object still available. This method effective when we reload the training data in a different python session, say on another computer. **However, take note that there is no retrocompatiblity insurance.** If the QuantileDeltaMapping class was to change in a new xclim version, one would not be able to create the new object from a dataset saved with the old one.\n", + "In the case above, creating a full object from the dataset doesn't make the most sense since we are in the same python session, with the \"old\" object still available. This method effective when we reload the training data in a different python session, say on another computer. **However, take note that there is no retro-compatibility insurance.** If the `QuantileDeltaMapping` class was to change in a new xclim version, one would not be able to create the new object from a dataset saved with the old one.\n", "\n", "For the case where we stay in the same python session, it is still useful to trigger the dask computations. For small datasets, that could mean a simple `QDM.ds.load()`, but sometimes even the training data is too large to be full loaded in memory. In that case, we could also do:" ] @@ -316,7 +316,7 @@ "\n", "To fully understand what is happening during the bias-adjustment process, sdba can output _diagnostic_ variables, giving more visibility to what the adjustment is doing behind the scene. This behaviour, a `verbose` option, is controlled by the `sdba_extra_output` option, set with `xclim.set_options`. When `True`, `train` calls are instructed to include additional variables to the training datasets. In addition, the `adjust` calls will always output a dataset, with `scen` and, depending on the algorithm, other diagnostics variables. See the documentation of each `Adjustment` objects to see what extra variables are available.\n", "\n", - "For the moment, this feature is still in construction and only a few `Adjustment` actually provide extra outputs. Please open issues on the Github repo if you have needs or ideas of interesting diagnostic variables.\n", + "For the moment, this feature is still under construction and only a few `Adjustment` actually provide these extra outputs. Please open issues on the GitHub repo if you have needs or ideas of interesting diagnostic variables.\n", "\n", "For example, `QDM.adjust` adds `sim_q`, which gives the quantile of each element of `sim` within its group." ] @@ -344,9 +344,9 @@ "source": [ "## Moving window for adjustments\n", "\n", - "Some Adjustment methods require that the adjusted data (`sim`) be of the same length (same number of points) than the training data (`ref` and `hist`). This requirements often ensure conservation of statistical properties and a better representation of the climate change signal over the long adjusted timeseries.\n", + "Some Adjustment methods require that the adjusted data (`sim`) be of the same length (same number of points) than the training data (`ref` and `hist`). These requirements often ensure conservation of statistical properties and a better representation of the climate change signal over the long adjusted timeseries.\n", "\n", - "In opposition to a conventionnal \"rolling window\", here it is the _years_ that are the base units of the window, not the elements themselves. xclim implements `sdba.construct_moving_yearly_window` and `sdba.unpack_moving_yearly_window` to manipulate data in that goal. The \"construct\" function cuts the data in overlapping windows of a certain length (in years) and stacks them along a new `\"movingdim\"` dimension, alike to xarray's `da.rolling(time=win).construct('movingdim')`, but with yearly steps. The step between each window can also be controlled. This argument is an indicator of how many years overlap between each window. With a value of 1 (the default), a window will have `window - 1` years overlapping with the previous one. `step = window` will result in no overlap at all.\n", + "In opposition to a conventional \"rolling window\", here it is the _years_ that are the base units of the window, not the elements themselves. `xclim` implements `sdba.construct_moving_yearly_window` and `sdba.unpack_moving_yearly_window` to manipulate data in that goal. The \"construct\" function cuts the data in overlapping windows of a certain length (in years) and stacks them along a new `\"movingdim\"` dimension, alike to xarray's `da.rolling(time=win).construct('movingdim')`, but with yearly steps. The step between each window can also be controlled. This argument is an indicator of how many years overlap between each window. With a value of 1 (the default), a window will have `window - 1` years overlapping with the previous one. `step = window` will result in no overlap at all.\n", "\n", "By default, the result is chunked along this `'movingdim'` dimension. For this reason, the method is expected to be more computationally efficient (when using `dask`) than looping over the windows.\n", "\n", @@ -360,7 +360,7 @@ "If `append_ends` is True, the reconstructed timeseries will go from the first time point of the first window to the last time point of the last window. In the middle, the central `step` years are kept from each window.\n", "If `append_ends` is False, only the central `step` years are kept from each window. Which means the final timeseries has `(window - step) / 2` years missing on either side, with the extra year missing on the right in case of an odd `(window - step)`. We are missing data, but the contribution from each window is equal.\n", "\n", - "Here, as`ref` and `hist` cover 15 years, we will use a window of 15 on sim. With a step of 2, this means the first window goes from 2000 to 2014 (inclusive). The last window goes from 2016 to 2030. `window - step = 13`, so 6 years will be missing at the beginning of the final `scen` and 7 years at the end." + "Here, as `ref` and `hist` cover 15 years, we will use a window of 15 on sim. With a step of two (2), this means the first window goes from 2000 to 2014 (inclusive). The last window goes from 2016 to 2030. `window - step = 13`, so 6 years will be missing at the beginning of the final `scen` and 7 years at the end." ] }, { @@ -492,9 +492,9 @@ "\n", "The following example shows a complete bias-adjustment workflow using the `PrincipalComponents` method in a multi-variate configuration. Moreover, it uses the trick showed by [Alavoine et Grenier (2022)](https://doi.org/10.31223/X5C34C) to transform \"multiplicative\" variable to the \"additive\" space using log and logit transformations. This way, we can perform multi-variate adjustment with variables that couldn't be used in the same _kind_ of adjustment, like \"tas\" and \"hurs\".\n", "\n", - "We will transform the variables that need it to the additive space, adding some jitter in the process to avoid $log(0)$ situations. Then, we will stack the different variables into a single `DataArray`, allowing us to use to use `PrincipalComponents` in a multi-variate way. Following the PCA, a simple quantile-mapping method is used, both adjustment acting on the residuals, while the mean of the simulated trend is adjusted on its own. Each step will be explained.\n", + "We will transform the variables that need it to the additive space, adding some jitter in the process to avoid $log(0)$ situations. Then, we will stack the different variables into a single `DataArray`, allowing us to use `PrincipalComponents` in a multi-variate way. Following the PCA, a simple quantile-mapping method is used, both adjustment acting on the residuals, while the mean of the simulated trend is adjusted on its own. Each step will be explained.\n", "\n", - "First, open the data, convert the calendar and the units. Because we will perform adjustments on \"dayofyear\" groups (with a window), keeping standard calendars results in a extra \"dayofyear\" with only a quarter of the data. It's usual to transform to a \"noleap\" calendar, which drops the 29th of February, as it only has a small impact on the data." + "First, open the data, convert the calendar and the units. Because we will perform adjustments on \"dayofyear\" groups (with a window), keeping standard calendars results in an extra \"dayofyear\" with only a quarter of the data. It's usual to transform to a \"noleap\" calendar, which drops the 29th of February, as it only has a small impact on the data." ] }, { @@ -530,9 +530,9 @@ "\n", "$$ pr' = \\ln\\left(pr - b\\right) $$\n", "\n", - "where $b$ is the lower bound, here 0 mm/d. However, we could have exact zeros (0 mm/d) in the datasets, which will translate into $-\\infty$. To avoid this, we simply replace the smallest values by a random distribution of very small, but not problematic, values. In the following, all values below 0.1 mm/d are replace by a uniform random distribution of values within the range (0, 0.1) mm/d (bounds excluded).\n", + "Where $b$ is the lower bound, here 0 mm/d. However, we could have exact zeros (0 mm/d) in the datasets, which will translate into $-\\infty$. To avoid this, we simply replace the smallest values by a random distribution of very small, but not problematic, values. In the following, all values below 0.1 mm/d are replaced by a uniform random distribution of values within the range (0, 0.1) mm/d (bounds excluded).\n", "\n", - "Finally, the variables are stacked together into a single DataAray." + "Finally, the variables are stacked together into a single DataArray." ] }, { @@ -566,7 +566,7 @@ "metadata": {}, "source": [ "### 2. Get residuals and trends\n", - "The adjustment will be performed on residuals only. The adjusted timeseries `sim` will be detrended with the LOESS routine described above. Because of the short length of `ref` and `hist` and the potential boundary effects of using LOESS with them, we compute the 30-year mean. In other words, instead of _detrending_ we are _normalizing_ those inputs.\n", + "The adjustment will be performed on residuals only. The adjusted timeseries `sim` will be detrended with the LOESS routine described above. Because of the short length of `ref` and `hist` and the potential boundary effects of using LOESS with them, we compute the 30-year mean. In other words, instead of _detrending_ inputs, we are _normalizing_ those inputs.\n", "\n", "While the residuals are adjusted with `PrincipalComponents` and `EmpiricalQuantileMapping`, the trend of `sim` still needs to be offset according to the means of `ref` and `hist`. This is similar to what `DetrendedQuantileMapping` does. The offset step could have been done on the trend itself or at the end on `scen`, it doesn't really matter. We do it here because it keeps it close to where the `scaling` is computed." ] @@ -642,7 +642,7 @@ "metadata": {}, "source": [ "### 4. Re-trend and transform back to the physical space\n", - "Add back the trend (which includes the scaling), unstack the variables to a dataset and transform `pr` back to the physical space. All functions have conserved and handled the attributes, so we don't need to repeat the additive space bounds. The annual cycle of both variables on the reference period in Vancouver is plotted to confirm the adjustment add a positive effect." + "Add back the trend (which includes the scaling), unstack the variables to a dataset and transform `pr` back to the physical space. All functions have conserved and handled the attributes, so we don't need to repeat the additive space bounds. The annual cycle of both variables on the reference period in Vancouver is plotted to confirm the adjustment adds a positive effect." ] }, { @@ -698,11 +698,11 @@ "source": [ "## Tests for sdba\n", "\n", - "It can be useful to perform diagnostic tests on adjusted simulations to assess if the bias correction method is working properly or to compare two different bias correction techniques.\n", + "It can be useful to perform diagnostic tests on adjusted simulations to assess if the bias correction method is working properly, or to compare two different bias correction techniques.\n", "\n", "A diagnostic test includes calculations of a property (mean, 20-year return value, annual cycle amplitude, ...) on the simulation and on the scenario (adjusted simulation), then a measure (bias, relative bias, ratio, ...) of the difference. Usually, the property collapse the time dimension of the simulation/scenario and returns one value by grid point.\n", "\n", - "You'll find those in ``xclim.sdba.properties`` and ``xclim.sdba.measures``, where they are implemented as special subclasses of xclim's ``Indicator``, which means they can be worked with the same way as conventional indicators (used in yaml modules for example)." + "You'll find those in ``xclim.sdba.properties`` and ``xclim.sdba.measures``, where they are implemented as special subclasses of xclim's ``Indicator``, which means they can be worked with the same way as conventional indicators (used in YAML modules for example)." ] }, { @@ -849,7 +849,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.5" + "version": "3.10.9" }, "toc": { "base_numbering": 1, diff --git a/docs/notebooks/sdba.ipynb b/docs/notebooks/sdba.ipynb index f889f1548..dfa2905cc 100644 --- a/docs/notebooks/sdba.ipynb +++ b/docs/notebooks/sdba.ipynb @@ -10,7 +10,7 @@ "\n", "This presents examples, while a bit more info and the API are given on [this page](../sdba.rst).\n", "\n", - "A very simple \"Quantile Mapping\" approach is available through the \"Empirical Quantile Mapping\" object. The object is created through the `.train` method of the class, and the simulation is adjusted with `.adjust`." + "A very simple \"Quantile Mapping\" approach is available through the `EmpiricalQuantileMapping` object. The object is created through the `.train` method of the class, and the simulation is adjusted with `.adjust`." ] }, { @@ -92,7 +92,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In the previous example, a simple Quantile Mapping algorithm was used with 15 quantiles and one group of values. The model performs well, but our toy data is also quite smooth and well-behaved so this is not surprising. A more complex example could have bias distribution varying strongly across months. To perform the adjustment with different factors for each month, one can pass `group='time.month'`. Moreover, to reduce the risk of sharp change in the adjustment at the interface of the months, `interp='linear'` can be passed to `adjust` and the adjustment factors will be interpolated linearly. Ex: the factors for the 1st of May will be the average of those for april and those for may." + "In the previous example, a simple Quantile Mapping algorithm was used with 15 quantiles and one group of values. The model performs well, but our toy data is also quite smooth and well-behaved so this is not surprising.\n", + "\n", + "A more complex example could have bias distribution varying strongly across months. To perform the adjustment with different factors for each month, one can pass `group='time.month'`. Moreover, to reduce the risk of drastic changes in the adjustments at the interface of months, `interp='linear'` can be passed to `.adjust` and the adjustment factors will be interpolated linearly (e.g.: the factors for the 1st of May will be the average of those for both April and May)." ] }, { @@ -206,15 +208,15 @@ "- adjustment `scen = Adj.adjust(sim, **kwargs)`\n", "- post-processing on `scen` (for example: re-trending)\n", "\n", - "The train-adjust approach allows to inspect the trained adjustment object. The training information is stored in the underlying `Adj.ds` dataset and often has a `af` variable with the adjustment factors. Its layout and the other available variables vary between the different algorithm, refer to their part of the API docs.\n", + "The train-adjust approach allows us to inspect the trained adjustment object. The training information is stored in the underlying `Adj.ds` dataset and often has a `af` variable with the adjustment factors. Its layout and the other available variables vary between the different algorithm, refer to their part of the API docs.\n", "\n", "For heavy processing, this separation allows the computation and writing to disk of the training dataset before performing the adjustment(s). See the [advanced notebook](sdba-advanced.ipynb).\n", "\n", - "Parameters needed by the training and the adjustment are saved to the `Adj.ds` dataset as a `adj_params` attribute. Other parameters, those only needed by the adjustment are passed in the `adjust` call and written to the history attribute in the output scenario DataArray.\n", + "Parameters needed by the training and the adjustment are saved to the `Adj.ds` dataset as a `adj_params` attribute. For other parameters, those only needed by the adjustment are passed in the `adjust` call and written to the history attribute in the output scenario DataArray.\n", "\n", "### First example : pr and frequency adaptation\n", "\n", - "The next example generates fake precipitation data and adjusts the `sim` timeseries but also adds a step where the dry-day frequency of `hist` is adapted so that is fits the one of `ref`. This ensures well-behaved adjustment factors for the smaller quantiles. Note also that we are passing `kind='*'` to use the multiplicative mode. Adjustment factors will be multiplied/divided instead of being added/subtracted." + "The next example generates fake precipitation data and adjusts the `sim` timeseries, but also adds a step where the dry-day frequency of `hist` is adapted so that it fits that of `ref`. This ensures well-behaved adjustment factors for the smaller quantiles. Note also that we are passing `kind='*'` to use the multiplicative mode. Adjustment factors will be multiplied/divided instead of being added/subtracted." ] }, { @@ -342,7 +344,9 @@ "metadata": {}, "source": [ "### Third example : Multi-method protocol - Hnilica et al. 2017\n", - "In [their paper of 2017](https://doi.org/10.1002/joc.4890), Hnilica, Hanel and Puš present a bias-adjustment method based on the principles of Principal Components Analysis. The idea is simple : use principal components to define coordinates on the reference and on the simulation and then transform the simulation data from the latter to the former. Spatial correlation can thus be conserved by taking different points as the dimensions of the transform space. The method was demonstrated in the article by bias-adjusting precipitation over different drainage basins.\n", + "In [their paper of 2017](https://doi.org/10.1002/joc.4890), Hnilica, Hanel and Puš present a bias-adjustment method based on the principles of Principal Components Analysis.\n", + "\n", + "The idea is simple: use principal components to define coordinates on the reference and on the simulation, and then transform the simulation data from the latter to the former. Spatial correlation can thus be conserved by taking different points as the dimensions of the transform space. The method was demonstrated in the article by bias-adjusting precipitation over different drainage basins.\n", "\n", "The same method could be used for multivariate adjustment. The principle would be the same, concatenating the different variables into a single dataset along a new dimension. An example is given in the [advanced notebook](sdba-advanced.ipynb).\n", "\n", @@ -433,7 +437,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Fourth example : Multivariate bias-adjustment with multiple steps (Cannon 2018)\n", + "### Fourth example : Multivariate bias-adjustment with multiple steps (Cannon, 2018)\n", "\n", "This section replicates the \"MBCn\" algorithm described by [Cannon (2018)](https://doi.org/10.1007/s00382-017-3580-6). The method relies on some univariate algorithm, an adaption of the N-pdf transform of [Pitié et al. (2005)](https://ieeexplore.ieee.org/document/1544887/) and a final reordering step.\n", "\n", @@ -516,7 +520,7 @@ "##### Stack the variables to multivariate arrays and standardize them\n", "The standardization process ensure the mean and standard deviation of each column (variable) is 0 and 1 respectively.\n", "\n", - "`scenh` and `scens` are standardized together so the two series are coherent. As we'll see further, we do not need to keep the mean and standard deviation as we only keep the rank order information from the `NpdfTransform` output." + "`scenh` and `scens` are standardized together, so the two series are coherent. As we'll see further, we do not need to keep the mean and standard deviation, as we only keep the rank order information from the `NpdfTransform` output." ] }, { @@ -580,7 +584,7 @@ "\n", "The NpdfT has given us new \"hist\" and \"sim\" arrays with a correct rank structure. However, the trend is lost in this process. We reorder the result of the initial adjustment according to the rank structure of the NpdfT outputs to get our final bias-adjusted series.\n", "\n", - "`sdba.processing.reordering` : 'ref' the argument that provides the order, 'sim' is the argument to reorder." + "`sdba.processing.reordering`: 'ref' the argument that provides the order, 'sim' is the argument to reorder." ] }, { @@ -631,7 +635,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Let's compare the series and look at the distance scores to see how well the Npdf transform has converged." + "Let's compare the series and look at the distance scores to see how well the N-pdf transform has converged." ] }, { @@ -665,7 +669,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The tutorial continues in the [advanced notebook](sdba-advanced.ipynb) with more on optimization with dask, other fancier detrending algorithms and an example pipeline for heavy processing.\n" + "The tutorial continues in the [advanced notebook](sdba-advanced.ipynb) with more on optimization with dask, other fancier detrending algorithms, and an example pipeline for heavy processing.\n" ] } ], @@ -685,7 +689,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.10.9" }, "toc": { "base_numbering": 1, diff --git a/docs/notebooks/units.ipynb b/docs/notebooks/units.ipynb index deb60ecb3..d1ffd46c8 100644 --- a/docs/notebooks/units.ipynb +++ b/docs/notebooks/units.ipynb @@ -35,7 +35,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "A lot of effort has been placed into automatic handling of input data units. `xclim` will automatically detect the input variable(s) units (e.g. °C versus °K or mm/s versus mm/day etc.) and adjust on-the-fly in order to calculate indices in the consistent manner. This comes with the obvious caveat that input data requires metadata attribute for units : the `units` attribute is required and the `standard_name` can be useful for automatic conversions.\n", + "A lot of effort has been placed into automatic handling of input data units. `xclim` will automatically detect the input variable(s) units (e.g. °C versus °K or mm/s versus mm/day etc.) and adjust on-the-fly in order to calculate indices in the consistent manner. This comes with the obvious caveat that input data requires a metadata attribute for units : the `units` attribute is required, and the `standard_name` can be useful for automatic conversions.\n", "\n", "The main unit handling method is [`xclim.core.units.convert_units_to`](../xclim.core.rst#xclim.core.units.convert_units_to) which can also be useful on its own. `xclim` relies on [pint](https://pint.readthedocs.io/) for unit handling.\n", "\n", @@ -83,7 +83,7 @@ "\n", "For precipitation data, `xclim` usually expects precipitation fluxes, so units of `mass / (area * time)`. However, many indicators will also accept rates (`length / time`, for example `mm/d`) by implicitly assuming the data refers to liquid water, and thus that we can simply multiply by 1000 kg/m³ to convert from the latter to the former. This transformation is enabled on indicators that have `Indicator.context == 'hydro'`.\n", "\n", - "We can also leverage the CF-conventions to perform some other \"smart\" conversions. For example, if the CF standard name of an input refers to liquid water, the flux <-> rate and amount <-> thickness conversions explained above will be automatic in `xc.core.units.convert_units_to`, whether the \"hydro\" context is activated or not. Another CF-driven conversion is between amount and flux or thickness and rate. Here again, `convert_units_to` will see if the `standard_name` attribute, but it will also need to infer the frequency of the data. For example, if a daily precipitation series records total daily precipitation and has units of `mm` (a \"thickness\"), it should use the `lwe_thickness_of_precipitation_amount` standard name and have a regular time coordinate, With these two, xclim will understand it and be able to convert it to a precipitation flux (by dividing by 1 day and multiplying by 1000 kg/m³).\n", + "We can also leverage the CF-conventions to perform some other \"smart\" conversions. For example, if the CF standard name of an input refers to liquid water, the flux ⇋ rate and amount ⇋ thickness conversions explained above will be automatic in `xc.core.units.convert_units_to`, whether the \"hydro\" context is activated or not. Another CF-driven conversion is between amount and flux or thickness and rate. Here again, `convert_units_to` will see if the `standard_name` attribute, but it will also need to infer the frequency of the data. For example, if a daily precipitation series records total daily precipitation and has units of `mm` (a \"thickness\"), it should use the `lwe_thickness_of_precipitation_amount` standard name and have a regular time coordinate, With these two, xclim will understand it and be able to convert it to a precipitation flux (by dividing by 1 day and multiplying by 1000 kg/m³).\n", "\n", "These CF conversions are not automatically done in the indicator (in opposition to the \"hydro\" context ones). `convert_units_to` should be called beforehand.\n", "\n", @@ -145,7 +145,7 @@ "source": [ "## Threshold indices\n", "\n", - "`xclim` unit handling also applies to threshold indicators. Users can provide threshold in units of choice and `xclim` will adjust automatically. For example determining the number of days with tasmax > 20°C users can define a threshold input of '20 C' or '20 degC' even if input data is in Kelvin. Alternatively, users can even provide a threshold in Kelvin ('293.15 K'), if they really wanted to." + "`xclim` unit handling also applies to threshold indicators. Users can provide threshold in units of choice and `xclim` will adjust automatically. For example, in order to determine the number of days with tasmax > 20 °C, users can define a threshold input of ``\"20 C\"`` or ``\"20 degC\"`` even if input data is in Kelvin. Alternatively, users can even provide a threshold in Kelvin (``\"293.15 K\"``), if they really wanted to." ] }, { @@ -183,7 +183,7 @@ "\n", "Many indices in `xclim` will either sum values or count events along the time dimension and over a period. As of version 0.24, unit handling dynamically infers what the sampling frequency and its corresponding unit is.\n", "\n", - "Indicators, on the other hand, do not have this flexibility and often **expect** input at a given frequency, more often daily then otherwise.\n", + "Indicators, on the other hand, do not have this flexibility and often **expect** input at a given frequency, more often daily than otherwise.\n", "\n", "For example, we can run the `tx_days_above` on the 6-hourly test data, and it should return similar results as on the daily data, but in units of `h` (the base unit of the sampling frequency)." ] @@ -243,7 +243,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.6" + "version": "3.10.9" } }, "nbformat": 4, diff --git a/docs/notebooks/usage.ipynb b/docs/notebooks/usage.ipynb index 26399804c..842db8734 100644 --- a/docs/notebooks/usage.ipynb +++ b/docs/notebooks/usage.ipynb @@ -33,7 +33,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Indice calculations are performed by opening a netCDF-like file, accessing the variable of interest, and calling the indice function, which returns a new xr.DataArray.\n", + "Indice calculations are performed by opening a NetCDF-like file, accessing the variable of interest, and calling the indice function, which returns a new `xarray.DataArray`.\n", "\n", "For this example, we'll first open a demonstration dataset storing surface air temperature and compute the number of growing degree days (the sum of degrees above a certain threshold) at the monthly frequency." ] @@ -83,19 +83,19 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The call to `xclim.indices.growing_degree_days` first checked that the input variable units were units of temperature, ran the computation, then set the output's units to the appropriate unit (here `K d` or kelvin days). As you can see, the **Indicator** returned the same output, but with more metadata, it also performed more checks as explained below.\n", + "The call to `xclim.indices.growing_degree_days` first checked that the input variable units were units of temperature, ran the computation, then set the output's units to the appropriate unit (here ``\"K d\"`` or Kelvin days). As you can see, the **Indicator** returned the same output, but with more metadata, it also performed more checks as explained below.\n", "\n", - "`growing_degree_days` makes most sense with **daily input**, but could theoretically accept other source frequencies. The computational layer (*Indice*) assumes that users have checked that the input data has the expected temporal frequency and has no missing values. However, no checks are performed, so the output data could be wrong (which is why it's always safer to use **`Indicator`** objects from the CF layer, as demonstrated in the following section).\n", + "`growing_degree_days` makes most sense with **daily input**, but could theoretically accept other source frequencies. The computational layer (*`Indice`*) assumes that users have checked that the input data has the expected temporal frequency and has no missing values. However, no checks are performed, so the output data could be wrong (which is why it's always safer to use **`Indicator`** objects from the CF layer, as demonstrated in the following section).\n", "\n", "Finally, as almost all indices, the function takes a `freq` argument to specify over what time period it is computed. These are called \"Offset Aliases\" and are the same as the resampling string arguments. Valid arguments are detailed in [pandas docs](https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases) (note that aliases involving \"business\" notions are not supported by `xarray` and thus could raise issues in xclim.\n", "\n", "### Units Handling paradigm\n", "\n", - "Indices are written in order to be flexible as to the sampling frequency and units of the data. You _can_ use `growing_degree_days` on, for example, the 6-hourly data, but the output will then be in degree-hour units (`K h`). Moreover, all units, even when untouched by the calculation, will be reformatted into a CF-compliant symbol format. This behaviour was chosen to ensure consistency between all indices.\n", + "Indices are written in order to be flexible as to the sampling frequency and units of the data. You _can_ use `growing_degree_days` on, for example, the 6-hourly data, but the output will then be in degree-hour units (``\"K h\"``). Moreover, all units, even when untouched by the calculation, will be reformatted into a CF-compliant symbol format. This behaviour was chosen to ensure consistency between all indices.\n", "\n", "Very few indices will convert their output to specific units; Rather, it is the dimensionality that will be consistent on output. The [Units Handling](units.ipynb) page goes more into detail on how unit conversion can easily be done.\n", "\n", - "This doesn't apply to **Indicators**. Those will always output data in a specific unit, the one listed in the `Indicators.cf_attrs` metadata dictionary.\n" + "This doesn't apply to **`Indicators`**. Those will always output data in a specific unit, the one listed in the `Indicators.cf_attrs` metadata dictionary.\n" ] }, { @@ -193,7 +193,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Some indicators also expose time-selection arguments as `**indexer` keywords. This allows to run the indice on a subset of the time coordinates, for example only on a specific season, month, or between two dates in every year. It relies on the [select_time](../xclim.core.rst#xclim.core.calendar.select_time) function. Some indicators will simply select the time period and run the calculations, while others will smartly perform the selection at the right time, when the order of operation makes a difference. All will pass the `indexer` kwargs to the missing value handling ensuring that the missing values _outside_ the valid time period are **not** considered.\n", + "Some indicators also expose time-selection arguments as `**indexer` keywords. This allows to run the indice on a subset of the time coordinates, for example only on a specific season, month, or between two dates in every year. It relies on the [select_time](../xclim.core.rst#xclim.core.calendar.select_time) function. Some indicators will simply select the time period and run the calculations, while others will smartly perform the selection at the right time, when the order of operation makes a difference. All will pass the `indexer` kwargs to the missing value handling, ensuring that the missing values _outside_ the valid time period are **not** considered.\n", "\n", "The next example computes the annual sum of growing degree days over 10 °C, but only considering days from the 1st of April to the 30th of September." ] @@ -242,9 +242,9 @@ "source": [ "## Graphics\n", "\n", - "Xclim is built to ensure that Indices and Indicators always have appropriate axis-related metadata that libraries like [`matplotlib`](https://matplotlib.org/) and [`seaborn`](https://seaborn.pydata.org/) depend on to generate detailed and informative graphics.\n", + "Xclim is built to ensure that Indices and Indicators always have appropriate axis-related metadata that libraries like [`Matplotlib`](https://matplotlib.org/) and [`Seaborn`](https://seaborn.pydata.org/) depend on to generate detailed and informative graphics.\n", "\n", - "This graphical functionality is entirely thanks to `xarray`, so the following examples are applicable to generic xr.DataArray objects. For more examples, see the directions suggested by [xarray's plotting documentation](https://docs.xarray.dev/en/stable/user-guide/plotting.html)" + "This graphical functionality is entirely thanks to `xarray`, so the following examples are applicable to generic `xarray.DataArray` objects. For more examples, see the directions suggested by [xarray's plotting documentation](https://docs.xarray.dev/en/stable/user-guide/plotting.html)" ] }, { From 7a646702245ab228d8353ad8e757a5bd5677b038 Mon Sep 17 00:00:00 2001 From: juliettelavoie Date: Wed, 29 Mar 2023 13:18:36 -0400 Subject: [PATCH 12/30] update graphics section --- docs/notebooks/usage.ipynb | 1879 +++++++++++++++++++++++++++++++++++- pyproject.toml | 1 - 2 files changed, 1838 insertions(+), 42 deletions(-) diff --git a/docs/notebooks/usage.ipynb b/docs/notebooks/usage.ipynb index 842db8734..9df639384 100644 --- a/docs/notebooks/usage.ipynb +++ b/docs/notebooks/usage.ipynb @@ -17,7 +17,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -40,9 +40,425 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/jullav1/Documents/development/xclim/xclim/testing/utils.py:210: UserWarning: MD5 checksum for /Users/jullav1/.xclim_testing_data/main/ERA5/daily_surface_cancities_1990-1993.nc does not match upstream md5. Attempting new download.\n", + " warnings.warn(msg)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'tas' (location: 5, time: 1461)>\n",
+       "array([[277.55566, 270.5756 , 273.53882, ..., 259.51328, 267.92664, 264.36823],\n",
+       "       [272.40604, 267.96622, 273.4945 , ..., 249.8702 , 258.33542, 260.20886],\n",
+       "       [245.20546, 252.5626 , 248.2663 , ..., 235.05373, 236.19106, 242.75523],\n",
+       "       [270.6233 , 263.59482, 257.28265, ..., 257.51257, 269.3636 , 261.21143],\n",
+       "       [279.84915, 278.3199 , 279.3029 , ..., 280.15323, 280.74222, 280.94418]],\n",
+       "      dtype=float32)\n",
+       "Coordinates:\n",
+       "    lon       (location) float32 -63.4 -73.4 -68.4 -106.7 -123.2\n",
+       "  * location  (location) object 'Halifax' 'Montréal' ... 'Saskatoon' 'Victoria'\n",
+       "    lat       (location) float32 44.5 45.5 63.75 52.0 48.5\n",
+       "  * time      (time) datetime64[ns] 1990-01-01 1990-01-02 ... 1993-12-31\n",
+       "Attributes:\n",
+       "    cell_methods:       time: mean within days\n",
+       "    long_name:          Mean daily surface temperature\n",
+       "    original_variable:  t2m\n",
+       "    standard_name:      air_temperature\n",
+       "    units:              K
" + ], + "text/plain": [ + "\n", + "array([[277.55566, 270.5756 , 273.53882, ..., 259.51328, 267.92664, 264.36823],\n", + " [272.40604, 267.96622, 273.4945 , ..., 249.8702 , 258.33542, 260.20886],\n", + " [245.20546, 252.5626 , 248.2663 , ..., 235.05373, 236.19106, 242.75523],\n", + " [270.6233 , 263.59482, 257.28265, ..., 257.51257, 269.3636 , 261.21143],\n", + " [279.84915, 278.3199 , 279.3029 , ..., 280.15323, 280.74222, 280.94418]],\n", + " dtype=float32)\n", + "Coordinates:\n", + " lon (location) float32 ...\n", + " * location (location) object 'Halifax' 'Montréal' ... 'Saskatoon' 'Victoria'\n", + " lat (location) float32 ...\n", + " * time (time) datetime64[ns] 1990-01-01 1990-01-02 ... 1993-12-31\n", + "Attributes:\n", + " cell_methods: time: mean within days\n", + " long_name: Mean daily surface temperature\n", + " original_variable: t2m\n", + " standard_name: air_temperature\n", + " units: K" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Normally, we would use xarray to open a dataset, e.g.:\n", "# ds = xr.open_dataset(\"your_file.nc\")\n", @@ -54,9 +470,418 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'growing_degree_days' (location: 5, time: 4)>\n",
+       "array([[7.76921692e+02, 7.03898560e+02, 6.31244263e+02, 6.51882690e+02],\n",
+       "       [1.22686438e+03, 1.35817456e+03, 1.12669324e+03, 1.22071863e+03],\n",
+       "       [6.99319458e+00, 2.39197693e+01, 6.53686523e-01, 1.87173157e+01],\n",
+       "       [9.29841431e+02, 1.00834296e+03, 7.17684204e+02, 6.29096436e+02],\n",
+       "       [5.87043213e+02, 5.02022339e+02, 5.99313477e+02, 5.67815552e+02]],\n",
+       "      dtype=float32)\n",
+       "Coordinates:\n",
+       "    lon       (location) float32 -63.4 -73.4 -68.4 -106.7 -123.2\n",
+       "  * location  (location) object 'Halifax' 'Montréal' ... 'Saskatoon' 'Victoria'\n",
+       "    lat       (location) float32 44.5 45.5 63.75 52.0 48.5\n",
+       "  * time      (time) datetime64[ns] 1990-01-01 1991-01-01 1992-01-01 1993-01-01\n",
+       "Attributes:\n",
+       "    units:          K days\n",
+       "    cell_methods:   time: mean within days time: sum over days\n",
+       "    history:        [2023-03-29 10:07:57] growing_degree_days: GROWING_DEGREE...\n",
+       "    standard_name:  integral_of_air_temperature_excess_wrt_time\n",
+       "    long_name:      Cumulative sum of temperature degrees for mean daily temp...\n",
+       "    description:    Annual growing degree days (mean temperature above 10.0 d...
" + ], + "text/plain": [ + "\n", + "array([[7.76921692e+02, 7.03898560e+02, 6.31244263e+02, 6.51882690e+02],\n", + " [1.22686438e+03, 1.35817456e+03, 1.12669324e+03, 1.22071863e+03],\n", + " [6.99319458e+00, 2.39197693e+01, 6.53686523e-01, 1.87173157e+01],\n", + " [9.29841431e+02, 1.00834296e+03, 7.17684204e+02, 6.29096436e+02],\n", + " [5.87043213e+02, 5.02022339e+02, 5.99313477e+02, 5.67815552e+02]],\n", + " dtype=float32)\n", + "Coordinates:\n", + " lon (location) float32 -63.4 -73.4 -68.4 -106.7 -123.2\n", + " * location (location) object 'Halifax' 'Montréal' ... 'Saskatoon' 'Victoria'\n", + " lat (location) float32 44.5 45.5 63.75 52.0 48.5\n", + " * time (time) datetime64[ns] 1990-01-01 1991-01-01 1992-01-01 1993-01-01\n", + "Attributes:\n", + " units: K days\n", + " cell_methods: time: mean within days time: sum over days\n", + " history: [2023-03-29 10:07:57] growing_degree_days: GROWING_DEGREE...\n", + " standard_name: integral_of_air_temperature_excess_wrt_time\n", + " long_name: Cumulative sum of temperature degrees for mean daily temp...\n", + " description: Annual growing degree days (mean temperature above 10.0 d..." + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "gdd = xclim.atmos.growing_degree_days(tas=ds.tas, thresh=\"10.0 degC\", freq=\"YS\")\n", "gdd" @@ -71,9 +896,408 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'tas' (location: 5, time: 4)>\n",
+       "array([[7.76921692e+02, 7.03898560e+02, 6.31244263e+02, 6.51882690e+02],\n",
+       "       [1.22686438e+03, 1.35817456e+03, 1.12669324e+03, 1.22071863e+03],\n",
+       "       [6.99319458e+00, 2.39197693e+01, 6.53686523e-01, 1.87173157e+01],\n",
+       "       [9.29841431e+02, 1.00834296e+03, 7.17684204e+02, 6.29096436e+02],\n",
+       "       [5.87043213e+02, 5.02022339e+02, 5.99313477e+02, 5.67815552e+02]],\n",
+       "      dtype=float32)\n",
+       "Coordinates:\n",
+       "    lon       (location) float32 -63.4 -73.4 -68.4 -106.7 -123.2\n",
+       "  * location  (location) object 'Halifax' 'Montréal' ... 'Saskatoon' 'Victoria'\n",
+       "    lat       (location) float32 44.5 45.5 63.75 52.0 48.5\n",
+       "  * time      (time) datetime64[ns] 1990-01-01 1991-01-01 1992-01-01 1993-01-01\n",
+       "Attributes:\n",
+       "    units:    K d
" + ], + "text/plain": [ + "\n", + "array([[7.76921692e+02, 7.03898560e+02, 6.31244263e+02, 6.51882690e+02],\n", + " [1.22686438e+03, 1.35817456e+03, 1.12669324e+03, 1.22071863e+03],\n", + " [6.99319458e+00, 2.39197693e+01, 6.53686523e-01, 1.87173157e+01],\n", + " [9.29841431e+02, 1.00834296e+03, 7.17684204e+02, 6.29096436e+02],\n", + " [5.87043213e+02, 5.02022339e+02, 5.99313477e+02, 5.67815552e+02]],\n", + " dtype=float32)\n", + "Coordinates:\n", + " lon (location) float32 -63.4 -73.4 -68.4 -106.7 -123.2\n", + " * location (location) object 'Halifax' 'Montréal' ... 'Saskatoon' 'Victoria'\n", + " lat (location) float32 44.5 45.5 63.75 52.0 48.5\n", + " * time (time) datetime64[ns] 1990-01-01 1991-01-01 1992-01-01 1993-01-01\n", + "Attributes:\n", + " units: K d" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "gdd = xclim.indices.growing_degree_days(tas=ds.tas, thresh=\"10.0 degC\", freq=\"YS\")\n", "gdd" @@ -119,13 +1343,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": { "tags": [ "raises-exception" ] }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'6H'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Show that data is not at a daily time frequency\n", "\n", @@ -135,13 +1370,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": { "tags": [ "raises-exception" ] }, - "outputs": [], + "outputs": [ + { + "ename": "ValidationError", + "evalue": "Frequency of time series not strictly in ['D']. To mute this, set xclim's option data_validation='log'.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;31mValueError\u001b[0m: Frequency of time series not strictly in ['D']. To mute this, set xclim's option data_validation='log'.", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mValidationError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [6]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m gdd \u001b[38;5;241m=\u001b[39m \u001b[43mxclim\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43matmos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgrowing_degree_days\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtas\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mds6h\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mair\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mthresh\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m10.0 degC\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfreq\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mMS\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/Documents/development/xclim/xclim/core/indicator.py:832\u001b[0m, in \u001b[0;36mIndicator.__call__\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 829\u001b[0m out_attrs \u001b[38;5;241m=\u001b[39m {}\n\u001b[1;32m 830\u001b[0m out_attrs \u001b[38;5;241m=\u001b[39m [out_attrs\u001b[38;5;241m.\u001b[39mcopy() \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_outs)]\n\u001b[0;32m--> 832\u001b[0m das, params \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_preprocess_and_checks\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdas\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 834\u001b[0m \u001b[38;5;66;03m# Get correct variable names for the compute function.\u001b[39;00m\n\u001b[1;32m 835\u001b[0m inv_var_map \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mdict\u001b[39m(\u001b[38;5;28mmap\u001b[39m(\u001b[38;5;28mreversed\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_variable_mapping\u001b[38;5;241m.\u001b[39mitems()))\n", + "File \u001b[0;32m~/Documents/development/xclim/xclim/core/indicator.py:1489\u001b[0m, in \u001b[0;36mResamplingIndicatorWithIndexing._preprocess_and_checks\u001b[0;34m(self, das, params)\u001b[0m\n\u001b[1;32m 1487\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_preprocess_and_checks\u001b[39m(\u001b[38;5;28mself\u001b[39m, das: \u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, DataArray], params: \u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any]):\n\u001b[1;32m 1488\u001b[0m \u001b[38;5;124;03m\"\"\"Perform parent's checks and also check if freq is allowed.\"\"\"\u001b[39;00m\n\u001b[0;32m-> 1489\u001b[0m das, params \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_preprocess_and_checks\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdas\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1491\u001b[0m indxr \u001b[38;5;241m=\u001b[39m params\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mindexer\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 1492\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m indxr:\n", + "File \u001b[0;32m~/Documents/development/xclim/xclim/core/indicator.py:1409\u001b[0m, in \u001b[0;36mResamplingIndicator._preprocess_and_checks\u001b[0;34m(self, das, params)\u001b[0m\n\u001b[1;32m 1407\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_preprocess_and_checks\u001b[39m(\u001b[38;5;28mself\u001b[39m, das, params):\n\u001b[1;32m 1408\u001b[0m \u001b[38;5;124;03m\"\"\"Perform parent's checks and also check if freq is allowed.\"\"\"\u001b[39;00m\n\u001b[0;32m-> 1409\u001b[0m das, params \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_preprocess_and_checks\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdas\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1411\u001b[0m \u001b[38;5;66;03m# Check if the period is allowed:\u001b[39;00m\n\u001b[1;32m 1412\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[1;32m 1413\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mallowed_periods \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 1414\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m parse_offset(params[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfreq\u001b[39m\u001b[38;5;124m\"\u001b[39m])[\u001b[38;5;241m1\u001b[39m] \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mallowed_periods\n\u001b[1;32m 1415\u001b[0m ):\n", + "File \u001b[0;32m~/Documents/development/xclim/xclim/core/indicator.py:947\u001b[0m, in \u001b[0;36mIndicator._preprocess_and_checks\u001b[0;34m(self, das, params)\u001b[0m\n\u001b[1;32m 945\u001b[0m \u001b[38;5;124;03m\"\"\"Actions to be done after parsing the arguments and before computing.\"\"\"\u001b[39;00m\n\u001b[1;32m 946\u001b[0m \u001b[38;5;66;03m# Pre-computation validation checks on DataArray arguments\u001b[39;00m\n\u001b[0;32m--> 947\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_bind_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdatacheck\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mdas\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 948\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bind_call(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcfcheck, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mdas)\n\u001b[1;32m 949\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m das, params\n", + "File \u001b[0;32m~/Documents/development/xclim/xclim/core/indicator.py:984\u001b[0m, in \u001b[0;36mIndicator._bind_call\u001b[0;34m(self, func, **das)\u001b[0m\n\u001b[1;32m 981\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m func(\u001b[38;5;241m*\u001b[39mdas\u001b[38;5;241m.\u001b[39mvalues())\n\u001b[1;32m 982\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 983\u001b[0m \u001b[38;5;66;03m# Call the func using bound arguments\u001b[39;00m\n\u001b[0;32m--> 984\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mba\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mba\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/Documents/development/xclim/xclim/core/indicator.py:1303\u001b[0m, in \u001b[0;36mIndicator.datacheck\u001b[0;34m(self, **das)\u001b[0m\n\u001b[1;32m 1301\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key, da \u001b[38;5;129;01min\u001b[39;00m das\u001b[38;5;241m.\u001b[39mitems():\n\u001b[1;32m 1302\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtime\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m da\u001b[38;5;241m.\u001b[39mcoords \u001b[38;5;129;01mand\u001b[39;00m da\u001b[38;5;241m.\u001b[39mtime\u001b[38;5;241m.\u001b[39mndim \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(da\u001b[38;5;241m.\u001b[39mtime) \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m3\u001b[39m:\n\u001b[0;32m-> 1303\u001b[0m \u001b[43mdatachecks\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcheck_freq\u001b[49m\u001b[43m(\u001b[49m\u001b[43mda\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msrc_freq\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstrict\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 1305\u001b[0m datachecks\u001b[38;5;241m.\u001b[39mcheck_common_time(\n\u001b[1;32m 1306\u001b[0m [\n\u001b[1;32m 1307\u001b[0m da\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1310\u001b[0m ]\n\u001b[1;32m 1311\u001b[0m )\n", + "File \u001b[0;32m:2\u001b[0m, in \u001b[0;36mcheck_freq\u001b[0;34m(var, freq, strict)\u001b[0m\n", + "File \u001b[0;32m~/Documents/development/xclim/xclim/core/options.py:123\u001b[0m, in \u001b[0;36mdatacheck..run_check\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 121\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(func)\n\u001b[1;32m 122\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mrun_check\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 123\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_run_check\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mDATA_VALIDATION\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/Documents/development/xclim/xclim/core/options.py:115\u001b[0m, in \u001b[0;36m_run_check\u001b[0;34m(func, option, *args, **kwargs)\u001b[0m\n\u001b[1;32m 113\u001b[0m func(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ValidationError \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m--> 115\u001b[0m \u001b[43mraise_warn_or_log\u001b[49m\u001b[43m(\u001b[49m\u001b[43merr\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mOPTIONS\u001b[49m\u001b[43m[\u001b[49m\u001b[43moption\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstacklevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m4\u001b[39;49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/Documents/development/xclim/xclim/core/utils.py:499\u001b[0m, in \u001b[0;36mraise_warn_or_log\u001b[0;34m(err, mode, msg, err_type, stacklevel)\u001b[0m\n\u001b[1;32m 497\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(msg, stacklevel\u001b[38;5;241m=\u001b[39mstacklevel \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m)\n\u001b[1;32m 498\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m: \u001b[38;5;66;03m# mode == \"raise\"\u001b[39;00m\n\u001b[0;32m--> 499\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m err \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr_type\u001b[39;00m(msg)\n", + "File \u001b[0;32m~/Documents/development/xclim/xclim/core/options.py:113\u001b[0m, in \u001b[0;36m_run_check\u001b[0;34m(func, option, *args, **kwargs)\u001b[0m\n\u001b[1;32m 111\u001b[0m \u001b[38;5;124;03m\"\"\"Run function and customize exception handling based on option.\"\"\"\u001b[39;00m\n\u001b[1;32m 112\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 113\u001b[0m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ValidationError \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[1;32m 115\u001b[0m raise_warn_or_log(err, OPTIONS[option], stacklevel\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m4\u001b[39m)\n", + "File \u001b[0;32m~/Documents/development/xclim/xclim/core/datachecks.py:54\u001b[0m, in \u001b[0;36mcheck_freq\u001b[0;34m(var, freq, strict)\u001b[0m\n\u001b[1;32m 50\u001b[0m v_base \u001b[38;5;241m=\u001b[39m parse_offset(v_freq)[\u001b[38;5;241m1\u001b[39m]\n\u001b[1;32m 51\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m v_base \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m exp_base \u001b[38;5;129;01mor\u001b[39;00m (\n\u001b[1;32m 52\u001b[0m strict \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mall\u001b[39m(compare_offsets(v_freq, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m!=\u001b[39m\u001b[38;5;124m\"\u001b[39m, frq) \u001b[38;5;28;01mfor\u001b[39;00m frq \u001b[38;5;129;01min\u001b[39;00m freq)\n\u001b[1;32m 53\u001b[0m ):\n\u001b[0;32m---> 54\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ValidationError(\n\u001b[1;32m 55\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFrequency of time series not \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstrictly\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m strict \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m in \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfreq\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 56\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTo mute this, set xclim\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms option data_validation=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlog\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 57\u001b[0m )\n", + "\u001b[0;31mValidationError\u001b[0m: Frequency of time series not strictly in ['D']. To mute this, set xclim's option data_validation='log'." + ] + } + ], "source": [ "gdd = xclim.atmos.growing_degree_days(tas=ds6h.air, thresh=\"10.0 degC\", freq=\"MS\")" ] @@ -155,9 +1417,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/jullav1/Documents/development/xclim/xclim/core/cfchecks.py:42: UserWarning: Variable does not have a `cell_methods` attribute.\n", + " _check_cell_methods(\n", + "/Users/jullav1/Documents/development/xclim/xclim/core/cfchecks.py:46: UserWarning: Variable does not have a `standard_name` attribute.\n", + " check_valid(vardata, \"standard_name\", data[\"standard_name\"])\n" + ] + } + ], "source": [ "daily_ds = ds6h.resample(time=\"D\").mean(keep_attrs=True)\n", "gdd = xclim.atmos.growing_degree_days(daily_ds.air, thresh=\"10.0 degC\", freq=\"YS\")" @@ -174,7 +1447,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -200,9 +1473,485 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.DataArray 'growing_degree_days' (time: 2, lat: 25, lon: 53)>\n",
+       "array([[[0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,\n",
+       "         0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n",
+       "        [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,\n",
+       "         0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n",
+       "        [3.3140015e+01, 5.0820099e+01, 6.6547607e+01, ...,\n",
+       "         0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n",
+       "        ...,\n",
+       "        [2.7736938e+03, 2.6248127e+03, 2.5183259e+03, ...,\n",
+       "         2.6201809e+03, 2.5202236e+03, 2.4362007e+03],\n",
+       "        [2.8073425e+03, 2.7539409e+03, 2.6544858e+03, ...,\n",
+       "         2.6141130e+03, 2.6077131e+03, 2.5585962e+03],\n",
+       "        [2.8185554e+03, 2.8164487e+03, 2.7658499e+03, ...,\n",
+       "         2.6862107e+03, 2.6818704e+03, 2.6931643e+03]],\n",
+       "\n",
+       "       [[0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,\n",
+       "         0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n",
+       "        [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,\n",
+       "         0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n",
+       "        [1.0225220e+00, 5.5400085e+00, 1.0475037e+01, ...,\n",
+       "         0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n",
+       "        ...,\n",
+       "        [2.8183235e+03, 2.6905312e+03, 2.6107827e+03, ...,\n",
+       "         2.5506511e+03, 2.4474639e+03, 2.3652024e+03],\n",
+       "        [2.8695332e+03, 2.8242588e+03, 2.7269099e+03, ...,\n",
+       "         2.5259944e+03, 2.5199478e+03, 2.4677590e+03],\n",
+       "        [2.8881079e+03, 2.8856880e+03, 2.8283704e+03, ...,\n",
+       "         2.5869858e+03, 2.5948555e+03, 2.6111182e+03]]], dtype=float32)\n",
+       "Coordinates:\n",
+       "  * lat      (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n",
+       "  * lon      (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n",
+       "  * time     (time) datetime64[ns] 2013-01-01 2014-01-01\n",
+       "Attributes:\n",
+       "    units:          K days\n",
+       "    cell_methods:    time: sum over days\n",
+       "    history:        [2023-03-29 10:07:59] growing_degree_days: GROWING_DEGREE...\n",
+       "    standard_name:  integral_of_air_temperature_excess_wrt_time\n",
+       "    long_name:      Cumulative sum of temperature degrees for mean daily temp...\n",
+       "    description:    Annual growing degree days (mean temperature above 10 degc).
" + ], + "text/plain": [ + "\n", + "array([[[0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,\n", + " 0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n", + " [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,\n", + " 0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n", + " [3.3140015e+01, 5.0820099e+01, 6.6547607e+01, ...,\n", + " 0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n", + " ...,\n", + " [2.7736938e+03, 2.6248127e+03, 2.5183259e+03, ...,\n", + " 2.6201809e+03, 2.5202236e+03, 2.4362007e+03],\n", + " [2.8073425e+03, 2.7539409e+03, 2.6544858e+03, ...,\n", + " 2.6141130e+03, 2.6077131e+03, 2.5585962e+03],\n", + " [2.8185554e+03, 2.8164487e+03, 2.7658499e+03, ...,\n", + " 2.6862107e+03, 2.6818704e+03, 2.6931643e+03]],\n", + "\n", + " [[0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,\n", + " 0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n", + " [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,\n", + " 0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n", + " [1.0225220e+00, 5.5400085e+00, 1.0475037e+01, ...,\n", + " 0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n", + " ...,\n", + " [2.8183235e+03, 2.6905312e+03, 2.6107827e+03, ...,\n", + " 2.5506511e+03, 2.4474639e+03, 2.3652024e+03],\n", + " [2.8695332e+03, 2.8242588e+03, 2.7269099e+03, ...,\n", + " 2.5259944e+03, 2.5199478e+03, 2.4677590e+03],\n", + " [2.8881079e+03, 2.8856880e+03, 2.8283704e+03, ...,\n", + " 2.5869858e+03, 2.5948555e+03, 2.6111182e+03]]], dtype=float32)\n", + "Coordinates:\n", + " * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n", + " * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n", + " * time (time) datetime64[ns] 2013-01-01 2014-01-01\n", + "Attributes:\n", + " units: K days\n", + " cell_methods: time: sum over days\n", + " history: [2023-03-29 10:07:59] growing_degree_days: GROWING_DEGREE...\n", + " standard_name: integral_of_air_temperature_excess_wrt_time\n", + " long_name: Cumulative sum of temperature degrees for mean daily temp...\n", + " description: Annual growing degree days (mean temperature above 10 degc)." + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "with xclim.set_options(cf_compliance=\"log\"):\n", " gdd = xclim.atmos.growing_degree_days(\n", @@ -220,7 +1969,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -242,29 +1991,76 @@ "source": [ "## Graphics\n", "\n", - "Xclim is built to ensure that Indices and Indicators always have appropriate axis-related metadata that libraries like [`Matplotlib`](https://matplotlib.org/) and [`Seaborn`](https://seaborn.pydata.org/) depend on to generate detailed and informative graphics.\n", + "Xclim does not have specific functions to create graphics. However, it is built to ensure that Indices and Indicators always have appropriate axis-related metadata that libraries like [`Matplotlib`](https://matplotlib.org/) depend on to generate detailed and informative graphics.\n", "\n", "This graphical functionality is entirely thanks to `xarray`, so the following examples are applicable to generic `xarray.DataArray` objects. For more examples, see the directions suggested by [xarray's plotting documentation](https://docs.xarray.dev/en/stable/user-guide/plotting.html)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The xarray plot functions creates an histogram when the DataArray has 3 or more dimensions. In previous steps, xclim automatically filled the `long_name` and `units` attributes which xarray uses to label the x-axis." + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "long_name: Cumulative sum of temperature degrees for mean daily temperature above 10.0 degc\n", + "units: K days\n" + ] + }, + { + "data": { + "image/png": "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iKgMKFaw6d69O7p27QpbW9tC62fMmIE33ngDderU0StfuXIl/Pz80K5dO5iZmWHatGk4cOAAEhMTAQDh4eEYM2YMnJycYGdnh5CQECxbtgwAcOPGDWzYsAFhYWHQarVo0KABAgMDlXoiIiKifEaG6ujMmTNYu3YtTpw4geHDh+vVxcTEwMfHR3lvY2MDR0dHxMTEwMXFBTExMfD09FTqvby8cOnSJWRkZCApKQkiAnd3d736OXPmFDmW1NRUpKamFiiPjY19mikSERHRC85gwebtt9/GrFmzYGZmVqAuOzsb1tbWemU6nQ5ZWVmF1ut0OgBAVlYWsrOzYWVlVWTbwixcuBChoaH/dSpERERUShkk2Hz77bfQarV44403Cq23tLREZmamXllGRga0Wm2h9RkZGQAArVb72LaFGTZsGPz9/QuUx8bGIiAg4MkmRURERKWOQYLNzp07sXPnTuXam+zsbJQrVw6HDx/Grl274OHhgejoaGX79PR0XLhwAR4eHgCg1Ddv3hwAEBUVBQcHB1hbW6NOnTrQaDSIjY2Fm5ubUp/ftjD29vawt7c3xNSIiIioFCnWxcO5ubm4ffs2cnNzkZeXh9u3byMnJwdz585FbGwsoqKiEBUVBX9/fwQFBWHdunUAgICAAGzduhU7d+7ErVu3MGnSJDRr1gwuLi4AgMDAQMydOxfnz59HWloawsLCMHjwYACAhYUFevbsiYkTJyIrKwvR0dFYvnw5goKCDLwUREREVNoVK9iEhYXBzMwM06dPx4YNG2BmZoYhQ4agQoUKcHBwUF7m5ubQarWoVKkSAMDNzQ1Lly5FcHAwKlasiPj4eKxZs0bpNzg4GL1794a3tzdcXFzg5eWFkJAQpX7+/PnQaDSwt7eHn58fpk6dirZt2xpoCYiIiEgtNCIiJT2I5yUyMhLe3t44fvw4GjZsaPD+nT762eB9PmvJMzuX9BCIiIgeqTif33ykAhEREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqUaxgs1XX32FRo0awcTEBH379lXKz5w5g65du6Jy5crQ6XRo1aoVjh49qtc2IiICNWvWhIWFBTp06ICUlBS9+pCQENja2kKn02H48OHIyclR6q5fv47evXtDq9WiWrVqWLBgwX+ZKxEREalcsYJN1apVERISgiFDhuiVX79+HZ06dcKpU6dw9epV9OrVC506dcKNGzcAAHFxcQgKCsKiRYuQlpaG2rVro1+/fkr7JUuWYO3atTh27BgSEhIQGRmJsLAwpX7kyJHIzc3FX3/9hZ9++gkTJ07Erl27nmbeREREpEJGxdm4e/fuAICoqCikpaUp5T4+PvDx8VHejxo1Ch9++CHi4uLg7e2NlStXws/PD+3atQMATJs2DZUrV0ZiYiJcXFwQHh6OMWPGwMnJCcD9ozfvvPMOQkNDcePGDWzYsAEnTpyAVqtFgwYNEBgYiGXLlqFNmzaFjjM1NRWpqakFymNjY4szXSIiIiplihVsntTRo0eRl5eHWrVqAQBiYmL0go+NjQ0cHR0RExMDFxcXxMTEwNPTU6n38vLCpUuXkJGRgaSkJIgI3N3d9ernzJlT5P4XLlyI0NDQZzAzIiIiepEZPNhcvXoVAQEBmDZtGqytrQEA2dnZys/5dDodsrKyCq3X6XQAgKysLGRnZ8PKyqrItoUZNmwY/P39C5THxsYiICDgP82LiIiIXnwGDTYZGRnw8/ODn58fPvjgA6Xc0tISmZmZBbbVarWF1mdkZAAAtFrtY9sWxt7eHvb29k89HyIiIipdDHa7d2ZmJjp27IiGDRvi888/16vz8PBAdHS08j49PR0XLlyAh4dHofVRUVFwcHCAtbU16tSpA41Go3d9TFRUlNKWiIiIKF+xgk1ubi5u376N3Nxc5OXl4fbt28jJyVFCjbu7O77++usC7QICArB161bs3LkTt27dwqRJk9CsWTO4uLgAAAIDAzF37lycP38eaWlpCAsLw+DBgwEAFhYW6NmzJyZOnIisrCxER0dj+fLlCAoKMsD0iYiISE2KFWzCwsJgZmaG6dOnY8OGDTAzM8OQIUOwadMmHDp0COvWrVNOH1laWmLfvn0AADc3NyxduhTBwcGoWLEi4uPjsWbNGqXf4OBg9O7dG97e3nBxcYGXlxdCQkKU+vnz50Oj0cDe3h5+fn6YOnUq2rZta6AlICIiIrXQiIiU9CCel8jISHh7e+P48eNo2LChwft3+uhng/f5rCXP7FzSQyAiInqk4nx+85EKREREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaxQo2X331FRo1agQTExP07dtXry4mJgZNmzaFubk5PDw8sG/fPr36iIgI1KxZExYWFujQoQNSUlL06kNCQmBrawudTofhw4cjJydHqbt+/Tp69+4NrVaLatWqYcGCBcWdJxEREZUBxQo2VatWRUhICIYMGaJXnpOTA39/f3Tr1g3p6en46KOP0KVLF6SnpwMA4uLiEBQUhEWLFiEtLQ21a9dGv379lPZLlizB2rVrcezYMSQkJCAyMhJhYWFK/ciRI5Gbm4u//voLP/30EyZOnIhdu3Y9zbyJiIhIhYoVbLp3746uXbvC1tZWr3z37t24efMmPvjgA5iYmCAgIADOzs7YuHEjAGDlypXw8/NDu3btYGZmhmnTpuHAgQNITEwEAISHh2PMmDFwcnKCnZ0dQkJCsGzZMgDAjRs3sGHDBoSFhUGr1aJBgwYIDAxU6omIiIjyGRmik5iYGNSvXx/lyv2bk7y8vBATE6PU+/j4KHU2NjZwdHRETEwMXFxcEBMTA09PT722ly5dQkZGBpKSkiAicHd316ufM2dOkeNJTU1FampqgfLY2NinmicRERG92AwSbLKzs2Ftba1XptPpkJGR8cj6rKysQut1Oh0AICsrC9nZ2bCysiqybWEWLlyI0NDQ/zwfIiIiKp0MEmwsLS2RmZmpV5aRkQGtVvuf6vMDkVarfWzbwgwbNgz+/v4FymNj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NAnNmjWDi4sLACAwMBBz587F+fPnkZaWhrCwMAwePNhQQyciIiKVMNgRG3Nzc5ibmyvvK1SoAGNjYzg4OAAAtmzZguDgYEyaNAk1a9bE5s2bYWNjAwBwc3PD0qVLERwcjL///hstW7bEmjVrlL6Cg4Nx/vx5eHt7IycnB2+++SZCQkIMNXQiIiJSCY2ISEkP4nmJjIyEt7c3jh8/joYNGxq8f6ePfjZ4n89a8szOJT0EIiKiRyrO5zcfqUBERESqwWBDREREqsFgQ0RERKrBYENERESqwWBDREREqsFgQ0RERKrBYENERESqwWBDREREqsFgQ0RERKrBYENERESqwWBDREREqsFgQ0RERKrBYENERESqwWBDREREqsFgQ0RERKrBYENERESqwWBDREREqsFgQ0RERKrBYENERESqwWBDREREqsFgQ0RERKrBYENERESqwWBDREREqsFgQ0RERKphVNIDICIqy5w++rmkh1BsyTM7l/QQiIrEIzZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBq8K4qIVKM03mFERIbFIzZERESkGgw2REREpBoMNkRERKQavMaGiIiKpbRey8RvTC4bDHrE5s6dOwgODoazszO0Wi3q1auH1atXK/UxMTFo2rQpzM3N4eHhgX379um1j4iIQM2aNWFhYYEOHTogJSVFrz4kJAS2trbQ6XQYPnw4cnJyDDl8IiIiKuUMesQmNzcXVatWxY4dO+Dk5IQDBw6gc+fOqFmzJho1agR/f38MGzYMe/bswYYNG9ClSxckJiaiQoUKiIuLQ1BQEDZt2oQWLVpg3Lhx6NevH/bs2QMAWLJkCdauXYtjx47BwsICr7/+OsLCwhAaGmrIKRDR/1da/1VORGWbQYONhYUFpk6dqrxv2bIlWrRogQMHDiA7Oxs3b97EBx98gHLlyiEgIABz587Fxo0b8dZbb2HlypXw8/NDu3btAADTpk1D5cqVkZiYCBcXF4SHh2PMmDFwcnICcP/ozTvvvMNg85RK44cXDycTEVFRnuk1Njdu3MCxY8fw3nvvISYmBvXr10e5cv+e/fLy8kJMTAyA+6epfHx8lDobGxs4OjoiJiYGLi4uiImJgaenp17bS5cuISMjA9bW1nr7TU1NRWpqaoHxxMbGGnqKRERE9AJ5ZsFGRBAUFAQfHx906NAB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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "import matplotlib.pyplot as plt\n", "\n", + "print('long_name:',gdd.attrs['long_name'])\n", + "print('units:', gdd.attrs['units'])\n", + "\n", "gdd.plot()\n", "plt.suptitle(\"Summary Statistics Histogram\")\n", "plt.draw()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When the DataArray only has a `time` dimension, xarray plots a timeseries. In this case, xarray uses the `long_name` and `units` attributes provided by xclim to label the y-axis." + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "gdd.isel(lon=20, lat=10).plot()\n", "plt.suptitle(\"Time Series at a Given Geographical Coordinate\")\n", @@ -272,30 +2068,31 @@ ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "gdd.sel(time=\"2013-07-01\").plot()\n", - "plt.suptitle(\"Spatial Pattern at a Specific Time Period\")\n", - "plt.draw()" + "When the DataArray only has 2 dimensions, xarray plots a heatmap. In this case, xarray uses the `long_name` and `units` attributes provided by xclim to label the colorbar." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "\n", - "sns.set_context(\"paper\")\n", - "\n", - "\n", - "gdd.sel(time=\"2014-07-01\").plot(cmap=\"cubehelix\")\n", - "plt.suptitle(\"Spatial Pattern at a Specific Time Period (Using Seaborn)\")\n", + "gdd.sel(time=\"2013-07-01\").plot()\n", + "plt.suptitle(\"Spatial Pattern at a Specific Time Period\")\n", "plt.draw()" ] }, @@ -332,9 +2129,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "xclimDev", "language": "python", - "name": "python3" + "name": "xclimdev" }, "language_info": { "codemirror_mode": { @@ -346,7 +2143,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.9.13" } }, "nbformat": 4, diff --git a/pyproject.toml b/pyproject.toml index a2e5e345b..419fb430a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -83,7 +83,6 @@ dev = [ "nc-time-axis", "netCDF4 >=1.4", "pooch", - "seaborn", "sphinx", "sphinx-autodoc-typehints", "sphinx-codeautolink", From fd81ee7025ecb65ded8b904a3b8276f750b90158 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 29 Mar 2023 17:19:07 +0000 Subject: [PATCH 13/30] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- docs/notebooks/extendxclim.ipynb | 2 +- docs/notebooks/usage.ipynb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/notebooks/extendxclim.ipynb b/docs/notebooks/extendxclim.ipynb index 8795ae650..238fba078 100644 --- a/docs/notebooks/extendxclim.ipynb +++ b/docs/notebooks/extendxclim.ipynb @@ -567,7 +567,7 @@ "# Let's look at our new awesome module\n", "print(awesome.__doc__)\n", "for name, ind in awesome.iter_indicators():\n", - " print(f\"{name} : {ind}\")\n" + " print(f\"{name} : {ind}\")" ] } ], diff --git a/docs/notebooks/usage.ipynb b/docs/notebooks/usage.ipynb index 9df639384..3b4ce6bae 100644 --- a/docs/notebooks/usage.ipynb +++ b/docs/notebooks/usage.ipynb @@ -2030,8 +2030,8 @@ "source": [ "import matplotlib.pyplot as plt\n", "\n", - "print('long_name:',gdd.attrs['long_name'])\n", - "print('units:', gdd.attrs['units'])\n", + "print(\"long_name:\", gdd.attrs[\"long_name\"])\n", + "print(\"units:\", gdd.attrs[\"units\"])\n", "\n", "gdd.plot()\n", "plt.suptitle(\"Summary Statistics Histogram\")\n", From a58562ebe6a57199e5d40f99a67875b026d3aad3 Mon Sep 17 00:00:00 2001 From: juliettelavoie Date: Wed, 29 Mar 2023 13:27:19 -0400 Subject: [PATCH 14/30] clear output --- docs/notebooks/usage.ipynb | 1840 +----------------------------------- 1 file changed, 25 insertions(+), 1815 deletions(-) diff --git a/docs/notebooks/usage.ipynb b/docs/notebooks/usage.ipynb index 9df639384..c91d9d20a 100644 --- a/docs/notebooks/usage.ipynb +++ b/docs/notebooks/usage.ipynb @@ -17,7 +17,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -40,425 +40,9 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/jullav1/Documents/development/xclim/xclim/testing/utils.py:210: UserWarning: MD5 checksum for /Users/jullav1/.xclim_testing_data/main/ERA5/daily_surface_cancities_1990-1993.nc does not match upstream md5. Attempting new download.\n", - " warnings.warn(msg)\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.DataArray 'tas' (location: 5, time: 1461)>\n",
-       "array([[277.55566, 270.5756 , 273.53882, ..., 259.51328, 267.92664, 264.36823],\n",
-       "       [272.40604, 267.96622, 273.4945 , ..., 249.8702 , 258.33542, 260.20886],\n",
-       "       [245.20546, 252.5626 , 248.2663 , ..., 235.05373, 236.19106, 242.75523],\n",
-       "       [270.6233 , 263.59482, 257.28265, ..., 257.51257, 269.3636 , 261.21143],\n",
-       "       [279.84915, 278.3199 , 279.3029 , ..., 280.15323, 280.74222, 280.94418]],\n",
-       "      dtype=float32)\n",
-       "Coordinates:\n",
-       "    lon       (location) float32 -63.4 -73.4 -68.4 -106.7 -123.2\n",
-       "  * location  (location) object 'Halifax' 'Montréal' ... 'Saskatoon' 'Victoria'\n",
-       "    lat       (location) float32 44.5 45.5 63.75 52.0 48.5\n",
-       "  * time      (time) datetime64[ns] 1990-01-01 1990-01-02 ... 1993-12-31\n",
-       "Attributes:\n",
-       "    cell_methods:       time: mean within days\n",
-       "    long_name:          Mean daily surface temperature\n",
-       "    original_variable:  t2m\n",
-       "    standard_name:      air_temperature\n",
-       "    units:              K
" - ], - "text/plain": [ - "\n", - "array([[277.55566, 270.5756 , 273.53882, ..., 259.51328, 267.92664, 264.36823],\n", - " [272.40604, 267.96622, 273.4945 , ..., 249.8702 , 258.33542, 260.20886],\n", - " [245.20546, 252.5626 , 248.2663 , ..., 235.05373, 236.19106, 242.75523],\n", - " [270.6233 , 263.59482, 257.28265, ..., 257.51257, 269.3636 , 261.21143],\n", - " [279.84915, 278.3199 , 279.3029 , ..., 280.15323, 280.74222, 280.94418]],\n", - " dtype=float32)\n", - "Coordinates:\n", - " lon (location) float32 ...\n", - " * location (location) object 'Halifax' 'Montréal' ... 'Saskatoon' 'Victoria'\n", - " lat (location) float32 ...\n", - " * time (time) datetime64[ns] 1990-01-01 1990-01-02 ... 1993-12-31\n", - "Attributes:\n", - " cell_methods: time: mean within days\n", - " long_name: Mean daily surface temperature\n", - " original_variable: t2m\n", - " standard_name: air_temperature\n", - " units: K" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Normally, we would use xarray to open a dataset, e.g.:\n", "# ds = xr.open_dataset(\"your_file.nc\")\n", @@ -470,418 +54,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.DataArray 'growing_degree_days' (location: 5, time: 4)>\n",
-       "array([[7.76921692e+02, 7.03898560e+02, 6.31244263e+02, 6.51882690e+02],\n",
-       "       [1.22686438e+03, 1.35817456e+03, 1.12669324e+03, 1.22071863e+03],\n",
-       "       [6.99319458e+00, 2.39197693e+01, 6.53686523e-01, 1.87173157e+01],\n",
-       "       [9.29841431e+02, 1.00834296e+03, 7.17684204e+02, 6.29096436e+02],\n",
-       "       [5.87043213e+02, 5.02022339e+02, 5.99313477e+02, 5.67815552e+02]],\n",
-       "      dtype=float32)\n",
-       "Coordinates:\n",
-       "    lon       (location) float32 -63.4 -73.4 -68.4 -106.7 -123.2\n",
-       "  * location  (location) object 'Halifax' 'Montréal' ... 'Saskatoon' 'Victoria'\n",
-       "    lat       (location) float32 44.5 45.5 63.75 52.0 48.5\n",
-       "  * time      (time) datetime64[ns] 1990-01-01 1991-01-01 1992-01-01 1993-01-01\n",
-       "Attributes:\n",
-       "    units:          K days\n",
-       "    cell_methods:   time: mean within days time: sum over days\n",
-       "    history:        [2023-03-29 10:07:57] growing_degree_days: GROWING_DEGREE...\n",
-       "    standard_name:  integral_of_air_temperature_excess_wrt_time\n",
-       "    long_name:      Cumulative sum of temperature degrees for mean daily temp...\n",
-       "    description:    Annual growing degree days (mean temperature above 10.0 d...
" - ], - "text/plain": [ - "\n", - "array([[7.76921692e+02, 7.03898560e+02, 6.31244263e+02, 6.51882690e+02],\n", - " [1.22686438e+03, 1.35817456e+03, 1.12669324e+03, 1.22071863e+03],\n", - " [6.99319458e+00, 2.39197693e+01, 6.53686523e-01, 1.87173157e+01],\n", - " [9.29841431e+02, 1.00834296e+03, 7.17684204e+02, 6.29096436e+02],\n", - " [5.87043213e+02, 5.02022339e+02, 5.99313477e+02, 5.67815552e+02]],\n", - " dtype=float32)\n", - "Coordinates:\n", - " lon (location) float32 -63.4 -73.4 -68.4 -106.7 -123.2\n", - " * location (location) object 'Halifax' 'Montréal' ... 'Saskatoon' 'Victoria'\n", - " lat (location) float32 44.5 45.5 63.75 52.0 48.5\n", - " * time (time) datetime64[ns] 1990-01-01 1991-01-01 1992-01-01 1993-01-01\n", - "Attributes:\n", - " units: K days\n", - " cell_methods: time: mean within days time: sum over days\n", - " history: [2023-03-29 10:07:57] growing_degree_days: GROWING_DEGREE...\n", - " standard_name: integral_of_air_temperature_excess_wrt_time\n", - " long_name: Cumulative sum of temperature degrees for mean daily temp...\n", - " description: Annual growing degree days (mean temperature above 10.0 d..." - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "gdd = xclim.atmos.growing_degree_days(tas=ds.tas, thresh=\"10.0 degC\", freq=\"YS\")\n", "gdd" @@ -896,408 +71,9 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.DataArray 'tas' (location: 5, time: 4)>\n",
-       "array([[7.76921692e+02, 7.03898560e+02, 6.31244263e+02, 6.51882690e+02],\n",
-       "       [1.22686438e+03, 1.35817456e+03, 1.12669324e+03, 1.22071863e+03],\n",
-       "       [6.99319458e+00, 2.39197693e+01, 6.53686523e-01, 1.87173157e+01],\n",
-       "       [9.29841431e+02, 1.00834296e+03, 7.17684204e+02, 6.29096436e+02],\n",
-       "       [5.87043213e+02, 5.02022339e+02, 5.99313477e+02, 5.67815552e+02]],\n",
-       "      dtype=float32)\n",
-       "Coordinates:\n",
-       "    lon       (location) float32 -63.4 -73.4 -68.4 -106.7 -123.2\n",
-       "  * location  (location) object 'Halifax' 'Montréal' ... 'Saskatoon' 'Victoria'\n",
-       "    lat       (location) float32 44.5 45.5 63.75 52.0 48.5\n",
-       "  * time      (time) datetime64[ns] 1990-01-01 1991-01-01 1992-01-01 1993-01-01\n",
-       "Attributes:\n",
-       "    units:    K d
" - ], - "text/plain": [ - "\n", - "array([[7.76921692e+02, 7.03898560e+02, 6.31244263e+02, 6.51882690e+02],\n", - " [1.22686438e+03, 1.35817456e+03, 1.12669324e+03, 1.22071863e+03],\n", - " [6.99319458e+00, 2.39197693e+01, 6.53686523e-01, 1.87173157e+01],\n", - " [9.29841431e+02, 1.00834296e+03, 7.17684204e+02, 6.29096436e+02],\n", - " [5.87043213e+02, 5.02022339e+02, 5.99313477e+02, 5.67815552e+02]],\n", - " dtype=float32)\n", - "Coordinates:\n", - " lon (location) float32 -63.4 -73.4 -68.4 -106.7 -123.2\n", - " * location (location) object 'Halifax' 'Montréal' ... 'Saskatoon' 'Victoria'\n", - " lat (location) float32 44.5 45.5 63.75 52.0 48.5\n", - " * time (time) datetime64[ns] 1990-01-01 1991-01-01 1992-01-01 1993-01-01\n", - "Attributes:\n", - " units: K d" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "gdd = xclim.indices.growing_degree_days(tas=ds.tas, thresh=\"10.0 degC\", freq=\"YS\")\n", "gdd" @@ -1343,24 +119,13 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": { "tags": [ "raises-exception" ] }, - "outputs": [ - { - "data": { - "text/plain": [ - "'6H'" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Show that data is not at a daily time frequency\n", "\n", @@ -1370,40 +135,13 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": { "tags": [ "raises-exception" ] }, - "outputs": [ - { - "ename": "ValidationError", - "evalue": "Frequency of time series not strictly in ['D']. To mute this, set xclim's option data_validation='log'.", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", - "\u001b[0;31mValueError\u001b[0m: Frequency of time series not strictly in ['D']. To mute this, set xclim's option data_validation='log'.", - "\nThe above exception was the direct cause of the following exception:\n", - "\u001b[0;31mValidationError\u001b[0m Traceback (most recent call last)", - "Input \u001b[0;32mIn [6]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m gdd \u001b[38;5;241m=\u001b[39m \u001b[43mxclim\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43matmos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgrowing_degree_days\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtas\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mds6h\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mair\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mthresh\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m10.0 degC\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfreq\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mMS\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/Documents/development/xclim/xclim/core/indicator.py:832\u001b[0m, in \u001b[0;36mIndicator.__call__\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 829\u001b[0m out_attrs \u001b[38;5;241m=\u001b[39m {}\n\u001b[1;32m 830\u001b[0m out_attrs \u001b[38;5;241m=\u001b[39m [out_attrs\u001b[38;5;241m.\u001b[39mcopy() \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mn_outs)]\n\u001b[0;32m--> 832\u001b[0m das, params \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_preprocess_and_checks\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdas\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 834\u001b[0m \u001b[38;5;66;03m# Get correct variable names for the compute function.\u001b[39;00m\n\u001b[1;32m 835\u001b[0m inv_var_map \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mdict\u001b[39m(\u001b[38;5;28mmap\u001b[39m(\u001b[38;5;28mreversed\u001b[39m, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_variable_mapping\u001b[38;5;241m.\u001b[39mitems()))\n", - "File \u001b[0;32m~/Documents/development/xclim/xclim/core/indicator.py:1489\u001b[0m, in \u001b[0;36mResamplingIndicatorWithIndexing._preprocess_and_checks\u001b[0;34m(self, das, params)\u001b[0m\n\u001b[1;32m 1487\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_preprocess_and_checks\u001b[39m(\u001b[38;5;28mself\u001b[39m, das: \u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, DataArray], params: \u001b[38;5;28mdict\u001b[39m[\u001b[38;5;28mstr\u001b[39m, Any]):\n\u001b[1;32m 1488\u001b[0m \u001b[38;5;124;03m\"\"\"Perform parent's checks and also check if freq is allowed.\"\"\"\u001b[39;00m\n\u001b[0;32m-> 1489\u001b[0m das, params \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_preprocess_and_checks\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdas\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1491\u001b[0m indxr \u001b[38;5;241m=\u001b[39m params\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mindexer\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 1492\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m indxr:\n", - "File \u001b[0;32m~/Documents/development/xclim/xclim/core/indicator.py:1409\u001b[0m, in \u001b[0;36mResamplingIndicator._preprocess_and_checks\u001b[0;34m(self, das, params)\u001b[0m\n\u001b[1;32m 1407\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_preprocess_and_checks\u001b[39m(\u001b[38;5;28mself\u001b[39m, das, params):\n\u001b[1;32m 1408\u001b[0m \u001b[38;5;124;03m\"\"\"Perform parent's checks and also check if freq is allowed.\"\"\"\u001b[39;00m\n\u001b[0;32m-> 1409\u001b[0m das, params \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_preprocess_and_checks\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdas\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mparams\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1411\u001b[0m \u001b[38;5;66;03m# Check if the period is allowed:\u001b[39;00m\n\u001b[1;32m 1412\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[1;32m 1413\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mallowed_periods \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 1414\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m parse_offset(params[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfreq\u001b[39m\u001b[38;5;124m\"\u001b[39m])[\u001b[38;5;241m1\u001b[39m] \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mallowed_periods\n\u001b[1;32m 1415\u001b[0m ):\n", - "File \u001b[0;32m~/Documents/development/xclim/xclim/core/indicator.py:947\u001b[0m, in \u001b[0;36mIndicator._preprocess_and_checks\u001b[0;34m(self, das, params)\u001b[0m\n\u001b[1;32m 945\u001b[0m \u001b[38;5;124;03m\"\"\"Actions to be done after parsing the arguments and before computing.\"\"\"\u001b[39;00m\n\u001b[1;32m 946\u001b[0m \u001b[38;5;66;03m# Pre-computation validation checks on DataArray arguments\u001b[39;00m\n\u001b[0;32m--> 947\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_bind_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdatacheck\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mdas\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 948\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_bind_call(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcfcheck, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mdas)\n\u001b[1;32m 949\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m das, params\n", - "File \u001b[0;32m~/Documents/development/xclim/xclim/core/indicator.py:984\u001b[0m, in \u001b[0;36mIndicator._bind_call\u001b[0;34m(self, func, **das)\u001b[0m\n\u001b[1;32m 981\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m func(\u001b[38;5;241m*\u001b[39mdas\u001b[38;5;241m.\u001b[39mvalues())\n\u001b[1;32m 982\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 983\u001b[0m \u001b[38;5;66;03m# Call the func using bound arguments\u001b[39;00m\n\u001b[0;32m--> 984\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mba\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mba\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/Documents/development/xclim/xclim/core/indicator.py:1303\u001b[0m, in \u001b[0;36mIndicator.datacheck\u001b[0;34m(self, **das)\u001b[0m\n\u001b[1;32m 1301\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key, da \u001b[38;5;129;01min\u001b[39;00m das\u001b[38;5;241m.\u001b[39mitems():\n\u001b[1;32m 1302\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtime\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01min\u001b[39;00m da\u001b[38;5;241m.\u001b[39mcoords \u001b[38;5;129;01mand\u001b[39;00m da\u001b[38;5;241m.\u001b[39mtime\u001b[38;5;241m.\u001b[39mndim \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(da\u001b[38;5;241m.\u001b[39mtime) \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m3\u001b[39m:\n\u001b[0;32m-> 1303\u001b[0m \u001b[43mdatachecks\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcheck_freq\u001b[49m\u001b[43m(\u001b[49m\u001b[43mda\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msrc_freq\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstrict\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 1305\u001b[0m datachecks\u001b[38;5;241m.\u001b[39mcheck_common_time(\n\u001b[1;32m 1306\u001b[0m [\n\u001b[1;32m 1307\u001b[0m da\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1310\u001b[0m ]\n\u001b[1;32m 1311\u001b[0m )\n", - "File \u001b[0;32m:2\u001b[0m, in \u001b[0;36mcheck_freq\u001b[0;34m(var, freq, strict)\u001b[0m\n", - "File \u001b[0;32m~/Documents/development/xclim/xclim/core/options.py:123\u001b[0m, in \u001b[0;36mdatacheck..run_check\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 121\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(func)\n\u001b[1;32m 122\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mrun_check\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 123\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_run_check\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfunc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mDATA_VALIDATION\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/Documents/development/xclim/xclim/core/options.py:115\u001b[0m, in \u001b[0;36m_run_check\u001b[0;34m(func, option, *args, **kwargs)\u001b[0m\n\u001b[1;32m 113\u001b[0m func(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ValidationError \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[0;32m--> 115\u001b[0m \u001b[43mraise_warn_or_log\u001b[49m\u001b[43m(\u001b[49m\u001b[43merr\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mOPTIONS\u001b[49m\u001b[43m[\u001b[49m\u001b[43moption\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstacklevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m4\u001b[39;49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/Documents/development/xclim/xclim/core/utils.py:499\u001b[0m, in \u001b[0;36mraise_warn_or_log\u001b[0;34m(err, mode, msg, err_type, stacklevel)\u001b[0m\n\u001b[1;32m 497\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(msg, stacklevel\u001b[38;5;241m=\u001b[39mstacklevel \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m)\n\u001b[1;32m 498\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m: \u001b[38;5;66;03m# mode == \"raise\"\u001b[39;00m\n\u001b[0;32m--> 499\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m err \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr_type\u001b[39;00m(msg)\n", - "File \u001b[0;32m~/Documents/development/xclim/xclim/core/options.py:113\u001b[0m, in \u001b[0;36m_run_check\u001b[0;34m(func, option, *args, **kwargs)\u001b[0m\n\u001b[1;32m 111\u001b[0m \u001b[38;5;124;03m\"\"\"Run function and customize exception handling based on option.\"\"\"\u001b[39;00m\n\u001b[1;32m 112\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 113\u001b[0m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ValidationError \u001b[38;5;28;01mas\u001b[39;00m err:\n\u001b[1;32m 115\u001b[0m raise_warn_or_log(err, OPTIONS[option], stacklevel\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m4\u001b[39m)\n", - "File \u001b[0;32m~/Documents/development/xclim/xclim/core/datachecks.py:54\u001b[0m, in \u001b[0;36mcheck_freq\u001b[0;34m(var, freq, strict)\u001b[0m\n\u001b[1;32m 50\u001b[0m v_base \u001b[38;5;241m=\u001b[39m parse_offset(v_freq)[\u001b[38;5;241m1\u001b[39m]\n\u001b[1;32m 51\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m v_base \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m exp_base \u001b[38;5;129;01mor\u001b[39;00m (\n\u001b[1;32m 52\u001b[0m strict \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;28mall\u001b[39m(compare_offsets(v_freq, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m!=\u001b[39m\u001b[38;5;124m\"\u001b[39m, frq) \u001b[38;5;28;01mfor\u001b[39;00m frq \u001b[38;5;129;01min\u001b[39;00m freq)\n\u001b[1;32m 53\u001b[0m ):\n\u001b[0;32m---> 54\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ValidationError(\n\u001b[1;32m 55\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFrequency of time series not \u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mstrictly\u001b[39m\u001b[38;5;124m'\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m strict \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m in \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfreq\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m. \u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 56\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTo mute this, set xclim\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124ms option data_validation=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlog\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 57\u001b[0m )\n", - "\u001b[0;31mValidationError\u001b[0m: Frequency of time series not strictly in ['D']. To mute this, set xclim's option data_validation='log'." - ] - } - ], + "outputs": [], "source": [ "gdd = xclim.atmos.growing_degree_days(tas=ds6h.air, thresh=\"10.0 degC\", freq=\"MS\")" ] @@ -1417,20 +155,9 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/jullav1/Documents/development/xclim/xclim/core/cfchecks.py:42: UserWarning: Variable does not have a `cell_methods` attribute.\n", - " _check_cell_methods(\n", - "/Users/jullav1/Documents/development/xclim/xclim/core/cfchecks.py:46: UserWarning: Variable does not have a `standard_name` attribute.\n", - " check_valid(vardata, \"standard_name\", data[\"standard_name\"])\n" - ] - } - ], + "outputs": [], "source": [ "daily_ds = ds6h.resample(time=\"D\").mean(keep_attrs=True)\n", "gdd = xclim.atmos.growing_degree_days(daily_ds.air, thresh=\"10.0 degC\", freq=\"YS\")" @@ -1447,7 +174,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -1473,485 +200,9 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.DataArray 'growing_degree_days' (time: 2, lat: 25, lon: 53)>\n",
-       "array([[[0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,\n",
-       "         0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n",
-       "        [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,\n",
-       "         0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n",
-       "        [3.3140015e+01, 5.0820099e+01, 6.6547607e+01, ...,\n",
-       "         0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n",
-       "        ...,\n",
-       "        [2.7736938e+03, 2.6248127e+03, 2.5183259e+03, ...,\n",
-       "         2.6201809e+03, 2.5202236e+03, 2.4362007e+03],\n",
-       "        [2.8073425e+03, 2.7539409e+03, 2.6544858e+03, ...,\n",
-       "         2.6141130e+03, 2.6077131e+03, 2.5585962e+03],\n",
-       "        [2.8185554e+03, 2.8164487e+03, 2.7658499e+03, ...,\n",
-       "         2.6862107e+03, 2.6818704e+03, 2.6931643e+03]],\n",
-       "\n",
-       "       [[0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,\n",
-       "         0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n",
-       "        [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,\n",
-       "         0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n",
-       "        [1.0225220e+00, 5.5400085e+00, 1.0475037e+01, ...,\n",
-       "         0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n",
-       "        ...,\n",
-       "        [2.8183235e+03, 2.6905312e+03, 2.6107827e+03, ...,\n",
-       "         2.5506511e+03, 2.4474639e+03, 2.3652024e+03],\n",
-       "        [2.8695332e+03, 2.8242588e+03, 2.7269099e+03, ...,\n",
-       "         2.5259944e+03, 2.5199478e+03, 2.4677590e+03],\n",
-       "        [2.8881079e+03, 2.8856880e+03, 2.8283704e+03, ...,\n",
-       "         2.5869858e+03, 2.5948555e+03, 2.6111182e+03]]], dtype=float32)\n",
-       "Coordinates:\n",
-       "  * lat      (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n",
-       "  * lon      (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n",
-       "  * time     (time) datetime64[ns] 2013-01-01 2014-01-01\n",
-       "Attributes:\n",
-       "    units:          K days\n",
-       "    cell_methods:    time: sum over days\n",
-       "    history:        [2023-03-29 10:07:59] growing_degree_days: GROWING_DEGREE...\n",
-       "    standard_name:  integral_of_air_temperature_excess_wrt_time\n",
-       "    long_name:      Cumulative sum of temperature degrees for mean daily temp...\n",
-       "    description:    Annual growing degree days (mean temperature above 10 degc).
" - ], - "text/plain": [ - "\n", - "array([[[0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,\n", - " 0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n", - " [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,\n", - " 0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n", - " [3.3140015e+01, 5.0820099e+01, 6.6547607e+01, ...,\n", - " 0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n", - " ...,\n", - " [2.7736938e+03, 2.6248127e+03, 2.5183259e+03, ...,\n", - " 2.6201809e+03, 2.5202236e+03, 2.4362007e+03],\n", - " [2.8073425e+03, 2.7539409e+03, 2.6544858e+03, ...,\n", - " 2.6141130e+03, 2.6077131e+03, 2.5585962e+03],\n", - " [2.8185554e+03, 2.8164487e+03, 2.7658499e+03, ...,\n", - " 2.6862107e+03, 2.6818704e+03, 2.6931643e+03]],\n", - "\n", - " [[0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,\n", - " 0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n", - " [0.0000000e+00, 0.0000000e+00, 0.0000000e+00, ...,\n", - " 0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n", - " [1.0225220e+00, 5.5400085e+00, 1.0475037e+01, ...,\n", - " 0.0000000e+00, 0.0000000e+00, 0.0000000e+00],\n", - " ...,\n", - " [2.8183235e+03, 2.6905312e+03, 2.6107827e+03, ...,\n", - " 2.5506511e+03, 2.4474639e+03, 2.3652024e+03],\n", - " [2.8695332e+03, 2.8242588e+03, 2.7269099e+03, ...,\n", - " 2.5259944e+03, 2.5199478e+03, 2.4677590e+03],\n", - " [2.8881079e+03, 2.8856880e+03, 2.8283704e+03, ...,\n", - " 2.5869858e+03, 2.5948555e+03, 2.6111182e+03]]], dtype=float32)\n", - "Coordinates:\n", - " * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n", - " * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n", - " * time (time) datetime64[ns] 2013-01-01 2014-01-01\n", - "Attributes:\n", - " units: K days\n", - " cell_methods: time: sum over days\n", - " history: [2023-03-29 10:07:59] growing_degree_days: GROWING_DEGREE...\n", - " standard_name: integral_of_air_temperature_excess_wrt_time\n", - " long_name: Cumulative sum of temperature degrees for mean daily temp...\n", - " description: Annual growing degree days (mean temperature above 10 degc)." - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "with xclim.set_options(cf_compliance=\"log\"):\n", " gdd = xclim.atmos.growing_degree_days(\n", @@ -1969,7 +220,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -2005,28 +256,9 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "long_name: Cumulative sum of temperature degrees for mean daily temperature above 10.0 degc\n", - "units: K days\n" - ] - }, - { - "data": { - "image/png": "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iKgMKFaw6d69O7p27QpbW9tC62fMmIE33ngDderU0StfuXIl/Pz80K5dO5iZmWHatGk4cOAAEhMTAQDh4eEYM2YMnJycYGdnh5CQECxbtgwAcOPGDWzYsAFhYWHQarVo0KABAgMDlXoiIiKifEaG6ujMmTNYu3YtTpw4geHDh+vVxcTEwMfHR3lvY2MDR0dHxMTEwMXFBTExMfD09FTqvby8cOnSJWRkZCApKQkiAnd3d736OXPmFDmW1NRUpKamFiiPjY19mikSERHRC85gwebtt9/GrFmzYGZmVqAuOzsb1tbWemU6nQ5ZWVmF1ut0OgBAVlYWsrOzYWVlVWTbwixcuBChoaH/dSpERERUShkk2Hz77bfQarV44403Cq23tLREZmamXllGRga0Wm2h9RkZGQAArVb72LaFGTZsGPz9/QuUx8bGIiAg4MkmRURERKWOQYLNzp07sXPnTuXam+zsbJQrVw6HDx/Grl274OHhgejoaGX79PR0XLhwAR4eHgCg1Ddv3hwAEBUVBQcHB1hbW6NOnTrQaDSIjY2Fm5ubUp/ftjD29vawt7c3xNSIiIioFCnWxcO5ubm4ffs2cnNzkZeXh9u3byMnJwdz585FbGwsoqKiEBUVBX9/fwQFBWHdunUAgICAAGzduhU7d+7ErVu3MGnSJDRr1gwuLi4AgMDAQMydOxfnz59HWloawsLCMHjwYACAhYUFevbsiYkTJyIrKwvR0dFYvnw5goKCDLwUREREVNoVK9iEhYXBzMwM06dPx4YNG2BmZoYhQ4agQoUKcHBwUF7m5ubQarWoVKkSAMDNzQ1Lly5FcHAwKlasiPj4eKxZs0bpNzg4GL1794a3tzdcXFzg5eWFkJAQpX7+/PnQaDSwt7eHn58fpk6dirZt2xpoCYiIiEgtNCIiJT2I5yUyMhLe3t44fvw4GjZsaPD+nT762eB9PmvJMzuX9BCIiIgeqTif33ykAhEREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqQaDDREREakGgw0RERGpBoMNERERqUaxgs1XX32FRo0awcTEBH379lXKz5w5g65du6Jy5crQ6XRo1aoVjh49qtc2IiICNWvWhIWFBTp06ICUlBS9+pCQENja2kKn02H48OHIyclR6q5fv47evXtDq9WiWrVqWLBgwX+ZKxEREalcsYJN1apVERISgiFDhuiVX79+HZ06dcKpU6dw9epV9OrVC506dcKNGzcAAHFxcQgKCsKiRYuQlpaG2rVro1+/fkr7JUuWYO3atTh27BgSEhIQGRmJsLAwpX7kyJHIzc3FX3/9hZ9++gkTJ07Erl27nmbeREREpEJGxdm4e/fuAICoqCikpaUp5T4+PvDx8VHejxo1Ch9++CHi4uLg7e2NlStXws/PD+3atQMATJs2DZUrV0ZiYiJcXFwQHh6OMWPGwMnJCcD9ozfvvPMOQkNDcePGDWzYsAEnTpyAVqtFgwYNEBgYiGXLlqFNmzaFjjM1NRWpqakFymNjY4szXSIiIiplihVsntTRo0eRl5eHWrVqAQBiYmL0go+NjQ0cHR0RExMDFxcXxMTEwNPTU6n38vLCpUuXkJGRgaSkJIgI3N3d9ernzJlT5P4XLlyI0NDQZzAzIiIiepEZPNhcvXoVAQEBmDZtGqytrQEA2dnZys/5dDodsrKyCq3X6XQAgKysLGRnZ8PKyqrItoUZNmwY/P39C5THxsYiICDgP82LiIiIXnwGDTYZGRnw8/ODn58fPvjgA6Xc0tISmZmZBbbVarWF1mdkZAAAtFrtY9sWxt7eHvb29k89HyIiIipdDHa7d2ZmJjp27IiGDRvi888/16vz8PBAdHS08j49PR0XLlyAh4dHofVRUVFwcHCAtbU16tSpA41Go3d9TFRUlNKWiIiIKF+xgk1ubi5u376N3Nxc5OXl4fbt28jJyVFCjbu7O77++usC7QICArB161bs3LkTt27dwqRJk9CsWTO4uLgAAAIDAzF37lycP38eaWlpCAsLw+DBgwEAFhYW6NmzJyZOnIisrCxER0dj+fLlCAoKMsD0iYiISE2KFWzCwsJgZmaG6dOnY8OGDTAzM8OQIUOwadMmHDp0COvWrVNOH1laWmLfvn0AADc3NyxduhTBwcGoWLEi4uPjsWbNGqXf4OBg9O7dG97e3nBxcYGXlxdCQkKU+vnz50Oj0cDe3h5+fn6YOnUq2rZta6AlICIiIrXQiIiU9CCel8jISHh7e+P48eNo2LChwft3+uhng/f5rCXP7FzSQyAiInqk4nx+85EKREREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBoMNkRERKQaxQo2X331FRo1agQTExP07dtXry4mJgZNmzaFubk5PDw8sG/fPr36iIgI1KxZExYWFujQoQNSUlL06kNCQmBrawudTofhw4cjJydHqbt+/Tp69+4NrVaLatWqYcGCBcWdJxEREZUBxQo2VatWRUhICIYMGaJXnpOTA39/f3Tr1g3p6en46KOP0KVLF6SnpwMA4uLiEBQUhEWLFiEtLQ21a9dGv379lPZLlizB2rVrcezYMSQkJCAyMhJhYWFK/ciRI5Gbm4u//voLP/30EyZOnIhdu3Y9zbyJiIhIhYoVbLp3746uXbvC1tZWr3z37t24efMmPvjgA5iYmCAgIADOzs7YuHEjAGDlypXw8/NDu3btYGZmhmnTpuHAgQNITEwEAISHh2PMmDFwcnKCnZ0dQkJCsGzZMgDAjRs3sGHDBoSFhUGr1aJBgwYIDAxU6omIiIjyGRmik5iYGNSvXx/lyv2bk7y8vBATE6PU+/j4KHU2NjZwdHRETEwMXFxcEBMTA09PT722ly5dQkZGBpKSkiAicHd316ufM2dOkeNJTU1FampqgfLY2NinmicRERG92AwSbLKzs2Ftba1XptPpkJGR8cj6rKysQut1Oh0AICsrC9nZ2bCysiqybWEWLlyI0NDQ/zwfIiIiKp0MEmwsLS2RmZmpV5aRkQGtVvuf6vMDkVarfWzbwgwbNgz+/v4FymNjYxEQEFCMmREREVFpYpBg4+HhgU8//RR5eXnK6aioqCgMHz5cqY+Ojla2T09Px4ULF+Dh4aFX37x5c6Wtg4MDrK2tUadOHWg0GsTGxsLNzU2pz29bGHt7e9jb2xtiakRERFSKFOvi4dzcXNy+fRu5ubnIy8vD7du3kZOTA19fX5iammL27Nm4c+cO1qxZg6SkJHTr1g0AEBAQgK1bt2Lnzp24desWJk2ahGbNmsHFxQUAEBgYiLlz5+L8+fNIS0tDWFgYBg8eDACwsLBAz549MXHiRGRlZSE6OhrLly9HUFCQgZeCiIiISrtiBZuwsDCYmZlh+vTp2LBhA8zMzDBkyBCUL18eW7ZsQUREBHQ6HaZPn47NmzfDxsYGAODm5oalS5ciODgYFStWRHx8PNasWaP0GxwcjN69e8Pb2xsuLi7w8vJCSEiIUj9//nxoNBrY29vDz88PU6dORdu2bQ20BERERKQWGhGRkh7E8xIZGQlvb28cP34cDRs2NHj/Th/9bPA+n7XkmZ1LeghERESPVJzPbz5SgYiIiFSDwYaIiIhUg8GGiIiIVIPBhoiIiFSDwYaIiIhUg8GGiIiIVIPBhoiIiFSDwYaIiIhUg8GGiIiIVIPBhoiIiFSDwYaIiIhUg8GGiIiIVIPBhoiIiFSDwYaIiIhUg8GGiIiIVIPBhoiIiFSDwYaIiIhUg8GGiIiIVIPBhoiIiFSDwYaIiIhUg8GGiIiIVIPBhoiIiFSDwYaIiIhUg8GGiIiIVIPBhoiIiFSDwYaIiIhUg8GGiIiIVIPBhoiIiFSDwYaIiIhUg8GGiIiIVIPBhoiIiFSDwYaIiIhUg8GGiIiIVIPBhoiIiFSDwYaIiIhUw+DBJjk5GZ07d4aNjQ0qV66Mt956Czdu3AAAxMTEoGnTpjA3N4eHhwf27dun1zYiIgI1a9aEhYUFOnTogJSUFL36kJAQ2NraQqfTYfjw4cjJyTH08ImIiKgUM3iwGTZsGGxsbJCSkoLTp08jPj4e06ZNQ05ODvz9/dGtWzekp6fjo48+QpcuXZCeng4AiIuLQ1BQEBYtWoS0tDTUrl0b/fr1U/pdsmQJ1q5di2PHjiEhIQGRkZEICwsz9PCJiIioFDN4sElKSsKbb74JMzMzVKxYEd26dUNMTAx2796Nmzdv4oMPPoCJiQkCAgLg7OyMjRs3AgBWrlwJPz8/tGvXDmZmZpg2bRoOHDiAxMREAEB4eDjGjBkDJycn2NnZISQkBMuWLTP08ImIiKgUMzJ0h6NHj8aaNWvQunVr3LhxA99//z0CAgIQExOD+vXro1y5f7OUl5cXYmJiANw/TeXj46PU2djYwNHRETExMXBxcUFMTAw8PT312l66dAkZGRmwtrbWG0NqaipSU1MLjC02NtbQ0yUiIqIXiMGDTZs2bRAeHg4rKyvk5eXh9ddfx5AhQzBz5swCAUSn0yEjIwMAkJ2dXWh9VlZWofU6nQ4AkJWVVaDdwoULERoaauipERER0QvOoKei7t27h44dO6Jz5864ceMGMjIyYGdnh4CAAFhaWiIzM1Nv+4yMDGi1WgAodn1+IMqvf9CwYcNw/PjxAq9Vq1YZcrpERET0gjHoEZv09HRcunQJo0aNgqmpKUxNTTF8+HC0adMGwcHB+PTTT5GXl6ecjoqKisLw4cMBAB4eHoiOjtbr68KFC/Dw8NCrb968udLWwcGhwNEaALC3t4e9vb0hp0ZERESlgEGP2Nja2qJmzZpYsGAB7t69ixs3bmDRokXw9PSEr68vTE1NMXv2bNy5cwdr1qxBUlISunXrBgAICAjA1q1bsXPnTty6dQuTJk1Cs2bN4OLiAgAIDAzE3Llzcf78eaSlpSEsLAyDBw825PCJiIiolDP4XVGbNm3Cnj17UKVKFVSvXh1//fUXvv32W5QvXx5btmxBREQEdDodpk+fjs2bN8PGxgYA4ObmhqVLlyI4OBgVK1ZEfHw81qxZo/QbHByM3r17w9vbGy4uLvDy8kJISIihh09ERESlmEZEpKQH8bxERkbC29sbx48fR8OGDQ3ev9NHPxu8z2cteWbnkh4CERHRIxXn85uPVCAiIiLVYLAhIiIi1WCwISIiItVgsCEiIiLVYLAhIiIi1WCwISIiItVgsCEiIiLVYLAhIiIi1WCwISIiItVgsCEiIiLVYLAhIiIi1WCwISIiItVgsCEiIiLVYLAhIiIi1WCwISIiItVgsCEiIiLVYLAhIiIi1WCwISIiItVgsCEiIiLVYLAhIiIi1WCwISIiItVgsCEiIiLVYLAhIiIi1WCwISIiItVgsCEiIiLVYLAhIiIi1WCwISIiItVgsCEiIiLVYLAhIiIi1WCwISIiItVgsCEiIiLVYLAhIiIi1WCwISIiItVgsCEiIiLVYLAhIiIi1WCwISIiItV4JsHm+++/h4eHBywsLFCjRg1s3LgRABATE4OmTZvC3NwcHh4e2Ldvn167iIgI1KxZExYWFujQoQNSUlL06kNCQmBrawudTofhw4cjJyfnWQyfiIiISimDB5udO3di9OjR+Oabb5CVlYWjR4/Cy8sLOTk58Pf3R7du3ZCeno6PPvoIXbp0QXp6OgAgLi4OQUFBWLRoEdLS0lC7dm3069dP6XfJkiVYu3Ytjh07hoSEBERGRiIsLMzQwyciIqJSzODBZtKkSZg0aRJatmyJcuXKoVKlSqhZsyZ2796Nmzdv4oMPPoCJiQkCAgLg7OysHM1ZuXIl/Pz80K5dO5iZmWHatGk4cOAAEhMTAQDh4eEYM2YMnJycYGdnh5CQECxbtqzQMaSmpiIyMrLAKzY21tDTJSIioheIkSE7u3fvHo4cOYLOnTujVq1auHnzJtq3b4/PP/8cMTExqF+/PsqV+zdLeXl5ISYmBsD901Q+Pj5KnY2NDRwdHRETEwMXFxfExMTA09NTr+2lS5eQkZEBa2trvXEsXLgQoaGhhpwaERERlQIGDTaXL19GTk4O1q9fj927d8PS0hL9+vXD6NGjUatWrQIBRKfTISMjAwCQnZ1daH1WVlah9TqdDgCQlZVVoN2wYcPg7+9fYHyxsbEICAh46nkSERHRi8mgwcbc3BwAMHLkSDg4OAAAJkyYgK5du2L8+PHIzMzU2z4jIwNarRYAYGlpWaz6/ECUX/8ge3t72NvbG2hWREREVFoY9BobnU6H6tWrQ6PRFKjz8PDAyZMnkZeXp5RFRUXBw8NDqY+Ojlbq0tPTceHChSLro6Ki4ODgUOBoDREREZVdBr94ODg4GF999RX+/vtvZGVlYebMmfD394evry9MTU0xe/Zs3LlzB2vWrEFSUhK6desGAAgICMDWrVuxc+dO3Lp1C5MmTUKzZs3g4uICAAgMDMTcuXNx/vx5pKWlISwsDIMHDzb08ImIiKgUM3iwGT9+PFq2bAl3d3e4uLjA1tYWc+fORfny5bFlyxZERERAp9Nh+vTp2Lx5M2xsbAAAbm5uWLp0KYKDg1GxYkXEx8djzZo1Sr/BwcHo3bs3vL294eLiAi8vL4SEhBh6+ERERFSKaURESnoQz0tkZCS8vb1x/PhxNGzY0OD9O330s8H7fNaSZ3Yu6SEQERE9UnE+v/lIBSIiIlINBhsiIiJSDQYbIiIiUg0GGyIiIlINBhsiIiJSDQYbIiIiUg0GGyIiIlINBhsiIiJSDQYbIiIiUg0GGyIiIlINBhsiIiJSDQYbIiIiUg0GGyIiIlINBhsiIiJSDQYbIiIiUg0GGyIiIlINBhsiIiJSDQYbIiIiUg0GGyIiIlINBhsiIiJSDQYbIiIiUg0GGyIiIlINBhsiIiJSDQYbIiIiUg0GGyIiIlINBhsiIiJSDQYbIiIiUg0GGyIiIlINBhsiIiJSDQYbIiIiUg0GGyIiIlINBhsiIiJSDQYbIiIiUg0GGyIiIlINBhsiIiJSjWcSbK5evQpbW1s0bdpUKYuJiUHTpk1hbm4ODw8P7Nu3T69NREQEatasCQsLC3To0AEpKSl69SEhIbC1tYVOp8Pw4cORk5PzLIZOREREpdgzCTZjx45F/fr1lfc5OTnw9/dHt27dkJ6ejo8++ghdunRBeno6ACAuLg5BQUFYtGgR0tLSULt2bfTr109pv2TJEqxduxbHjh1DQkICIiMjERYW9iyGTkRERKWYwYPN7t27kZiYiIEDB+qV3bx5Ex988AFMTEwQEBAAZ2dnbNy4EQCwcuVK+Pn5oV27djAzM8O0adNw4MABJCYmAgDCw8MxZswYODk5wc7ODiEhIVi2bJmhh05ERESlnJEhO7tz5w5GjhyJ7777DsePH1fKY2JiUL9+fZQr92+O8vLyQkxMjFLv4+Oj1NnY2MDR0RExMTFwcXFBTEwMPD099dpeunQJGRkZsLa2LjCO1NRUpKamFiiPjY01yDyJiIjoxWTQYDNjxgx07NgR9evX1ws22dnZBQKITqdDRkbGI+uzsrIKrdfpdACArKysQoPNwoULERoaapA5ERERUelhsGCTkJCAlStXIjo6ukCdpaUlMjMz9coyMjKg1Wr/U31+IMqvf9iwYcPg7+9foDw2NhYBAQHFmBURERGVJgYLNvv370dKSgqcnJwA3D8tdfv2bdja2mLp0qU4efIk8vLylNNRUVFRGD58OADAw8NDLxClp6fjwoUL8PDw0Ktv3ry50tbBwaHQozUAYG9vD3t7e0NNjYiIiEoJg1083Lt3b5w9exZRUVGIiorC1KlTUb9+fURFRaFTp04wNTXF7NmzcefOHaxZswZJSUno1q0bACAgIABbt27Fzp07cevWLUyaNAnNmjWDi4sLACAwMBBz587F+fPnkZaWhrCwMAwePNhQQyciIiKVMNgRG3Nzc5ibmyvvK1SoAGNjYzg4OAAAtmzZguDgYEyaNAk1a9bE5s2bYWNjAwBwc3PD0qVLERwcjL///hstW7bEmjVrlL6Cg4Nx/vx5eHt7IycnB2+++SZCQkIMNXQiIiJSCY2ISEkP4nmJjIyEt7c3jh8/joYNGxq8f6ePfjZ4n89a8szOJT0EIiKiRyrO5zcfqUBERESqwWBDREREqsFgQ0RERKrBYENERESqwWBDREREqsFgQ0RERKrBYENERESqwWBDREREqsFgQ0RERKrBYENERESqwWBDREREqsFgQ0RERKrBYENERESqwWBDREREqsFgQ0RERKrBYENERESqwWBDREREqsFgQ0RERKrBYENERESqwWBDREREqsFgQ0RERKrBYENERESqwWBDREREqsFgQ0RERKphVNIDICIqy5w++rmkh1BsyTM7l/QQiIrEIzZERESkGgw2REREpBoMNkRERKQaDDZERESkGgw2REREpBq8K4qIVKM03mFERIbFIzZERESkGgw2REREpBoMNkRERKQavMaGiIiKpbRey8RvTC4bDHrE5s6dOwgODoazszO0Wi3q1auH1atXK/UxMTFo2rQpzM3N4eHhgX379um1j4iIQM2aNWFhYYEOHTogJSVFrz4kJAS2trbQ6XQYPnw4cnJyDDl8IiIiKuUMesQmNzcXVatWxY4dO+Dk5IQDBw6gc+fOqFmzJho1agR/f38MGzYMe/bswYYNG9ClSxckJiaiQoUKiIuLQ1BQEDZt2oQWLVpg3Lhx6NevH/bs2QMAWLJkCdauXYtjx47BwsICr7/+OsLCwhAaGmrIKRDR/1da/1VORGWbQYONhYUFpk6dqrxv2bIlWrRogQMHDiA7Oxs3b97EBx98gHLlyiEgIABz587Fxo0b8dZbb2HlypXw8/NDu3btAADTpk1D5cqVkZiYCBcXF4SHh2PMmDFwcnICcP/ozTvvvMNg85RK44cXDycTEVFRnuk1Njdu3MCxY8fw3nvvISYmBvXr10e5cv+e/fLy8kJMTAyA+6epfHx8lDobGxs4OjoiJiYGLi4uiImJgaenp17bS5cuISMjA9bW1nr7TU1NRWpqaoHxxMbGGnqKRERE9AJ5ZsFGRBAUFAQfHx906NAB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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", @@ -2042,25 +274,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "When the DataArray only has a `time` dimension, xarray plots a timeseries. In this case, xarray uses the `long_name` and `units` attributes provided by xclim to label the y-axis." + "When the DataArray only has a `time` dimension, xarray plots a timeseries. In this case, xarray uses the `long_name` and `units` attributes provided by xclim to label the y-axis. " ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "gdd.isel(lon=20, lat=10).plot()\n", "plt.suptitle(\"Time Series at a Given Geographical Coordinate\")\n", @@ -2076,20 +297,9 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "gdd.sel(time=\"2013-07-01\").plot()\n", "plt.suptitle(\"Spatial Pattern at a Specific Time Period\")\n", @@ -2148,4 +358,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file From 2782b8a6a4bef25a288a12227e4daa17a72828e6 Mon Sep 17 00:00:00 2001 From: Trevor James Smith <10819524+Zeitsperre@users.noreply.github.com> Date: Thu, 30 Mar 2023 12:03:23 -0400 Subject: [PATCH 15/30] update CHANGES.rst --- CHANGES.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 7ea334334..ca73256a7 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,7 +4,7 @@ Changelog v0.42.0 (unreleased) -------------------- -Contributors to this version: Trevor James Smith (:user:`Zeitsperre`). +Contributors to this version: Trevor James Smith (:user:`Zeitsperre`), Juliette Lavoie (:user:`juliettelavoie`) New features and enhancements ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -45,6 +45,8 @@ Internal changes * `tox` now include `sbck` and `eofs` flags for easier testing of dependencies. CI builds now test against `sbck-python` @ master. (:pull:`1328`). * `upstream` CI tests are now run on push to master, at midnight, and can also be triggered via `workflow_dispatch`. Failures from upstream build will open issues using `xarray-contrib/issue-from-pytest-log`. (:pull:`1327`). * Warnings from set ``_version_deprecated`` within Indicators now emit ``FutureWarning`` instead of ``DeprecationWarning`` for greater visibility. (:pull:`1319`). +* The `Graphics` section of the `Usage` notebook has been expanded upon while grammar and spelling mistakes within the notebook-generated documentation have been reduced. (:issue:`1335`, :pull:`1338`, suggested from `PyOpenSci Software Review `_). +* The Contributing guide now lists three separate subsections to help users understand the gains from optional dependencies. (:issue:`1335`, :pull:`1338`, suggested from `PyOpenSci Software Review `_). v0.41.0 (2023-02-28) -------------------- From 8914a77811204ed4c9fd07c85e6bccde13691de9 Mon Sep 17 00:00:00 2001 From: Trevor James Smith <10819524+Zeitsperre@users.noreply.github.com> Date: Thu, 30 Mar 2023 13:02:03 -0400 Subject: [PATCH 16/30] remove seaborn --- environment.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/environment.yml b/environment.yml index a3f53d74a..533de8114 100644 --- a/environment.yml +++ b/environment.yml @@ -54,7 +54,6 @@ dependencies: - pytest - pytest-cov - pytest-xdist>=3.2 - - seaborn - sphinx - sphinx-autodoc-typehints - sphinx-codeautolink From 83bdbd755c5791aad37617cac6a4270dea35f5a4 Mon Sep 17 00:00:00 2001 From: Trevor James Smith <10819524+Zeitsperre@users.noreply.github.com> Date: Thu, 30 Mar 2023 13:36:58 -0400 Subject: [PATCH 17/30] use proper call to seaborn styles --- docs/notebooks/ensembles-advanced.ipynb | 6 +++--- docs/notebooks/ensembles.ipynb | 2 +- docs/notebooks/example.ipynb | 5 ++--- docs/notebooks/sdba.ipynb | 2 +- docs/notebooks/usage.ipynb | 18 +++++++++--------- 5 files changed, 16 insertions(+), 17 deletions(-) diff --git a/docs/notebooks/ensembles-advanced.ipynb b/docs/notebooks/ensembles-advanced.ipynb index 1f2dbaaf0..1fe3875a7 100644 --- a/docs/notebooks/ensembles-advanced.ipynb +++ b/docs/notebooks/ensembles-advanced.ipynb @@ -100,7 +100,7 @@ "metadata": {}, "outputs": [], "source": [ - "plt.style.use(\"seaborn-dark\")\n", + "plt.style.use(\"seaborn-v0_8-dark\")\n", "plt.rcParams[\"figure.figsize\"] = (13, 5)\n", "fig = plt.figure(figsize=(11, 9))\n", "ax = plt.axes(projection=\"3d\")\n", @@ -183,7 +183,7 @@ "metadata": {}, "outputs": [], "source": [ - "plt.style.use(\"seaborn-dark\")\n", + "plt.style.use(\"seaborn-v0_8-dark\")\n", "fig = plt.figure(figsize=(11, 9))\n", "ax = plt.axes(projection=\"3d\")\n", "\n", @@ -272,7 +272,7 @@ "metadata": {}, "outputs": [], "source": [ - "plt.style.use(\"seaborn-dark\")\n", + "plt.style.use(\"seaborn-v0_8-dark\")\n", "fig = plt.figure(figsize=(9, 9))\n", "ax = plt.axes(projection=\"3d\")\n", "\n", diff --git a/docs/notebooks/ensembles.ipynb b/docs/notebooks/ensembles.ipynb index d98ac8635..072c1072d 100644 --- a/docs/notebooks/ensembles.ipynb +++ b/docs/notebooks/ensembles.ipynb @@ -158,7 +158,7 @@ "metadata": {}, "outputs": [], "source": [ - "plt.style.use(\"seaborn-dark\")\n", + "plt.style.use(\"seaborn-v0_8-dark\")\n", "plt.rcParams[\"figure.figsize\"] = (13, 5)\n", "ens.tas.plot(hue=\"realization\")\n", "plt.show()" diff --git a/docs/notebooks/example.ipynb b/docs/notebooks/example.ipynb index aad006931..64cdfa4a7 100644 --- a/docs/notebooks/example.ipynb +++ b/docs/notebooks/example.ipynb @@ -364,10 +364,9 @@ "source": [ "# import plotting stuff\n", "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", "\n", "%matplotlib inline\n", - "sns.set_context(\"notebook\")\n", + "\n", "\n", "plt.rcParams[\"figure.figsize\"] = (11, 5)" ] @@ -691,7 +690,7 @@ "outputs": [], "source": [ "out_hw2d.sel(time=\"1958\").plot()\n", - "plt.draw()" + "plt.draw()\n" ] } ], diff --git a/docs/notebooks/sdba.ipynb b/docs/notebooks/sdba.ipynb index dfa2905cc..effc36d15 100644 --- a/docs/notebooks/sdba.ipynb +++ b/docs/notebooks/sdba.ipynb @@ -28,7 +28,7 @@ "import xarray as xr\n", "\n", "%matplotlib inline\n", - "plt.style.use(\"seaborn\")\n", + "plt.style.use(\"seaborn-v0_8\")\n", "plt.rcParams[\"figure.figsize\"] = (11, 5)\n", "\n", "# Create toy data to explore bias adjustment, here fake temperature timeseries\n", diff --git a/docs/notebooks/usage.ipynb b/docs/notebooks/usage.ipynb index b2424683b..adf6c7ad7 100644 --- a/docs/notebooks/usage.ipynb +++ b/docs/notebooks/usage.ipynb @@ -215,7 +215,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Finally, xclim also allows to call indicators using datasets and variable names." + "Finally, `xclim` also allows us to call indicators using datasets and variable names." ] }, { @@ -251,7 +251,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The xarray plot functions creates an histogram when the DataArray has 3 or more dimensions. In previous steps, xclim automatically filled the `long_name` and `units` attributes which xarray uses to label the x-axis." + "The `xarray` plot functions creates an histogram when the `DataArray` has 3 or more dimensions. In previous steps, `xclim` automatically filled the `long_name` and `units` attributes, which `xarray` uses to label the x-axis." ] }, { @@ -267,7 +267,7 @@ "\n", "gdd.plot()\n", "plt.suptitle(\"Summary Statistics Histogram\")\n", - "plt.draw()" + "plt.show()" ] }, { @@ -285,7 +285,7 @@ "source": [ "gdd.isel(lon=20, lat=10).plot()\n", "plt.suptitle(\"Time Series at a Given Geographical Coordinate\")\n", - "plt.draw()" + "plt.show()" ] }, { @@ -303,7 +303,7 @@ "source": [ "gdd.sel(time=\"2013-07-01\").plot()\n", "plt.suptitle(\"Spatial Pattern at a Specific Time Period\")\n", - "plt.draw()" + "plt.show()" ] }, { @@ -339,9 +339,9 @@ ], "metadata": { "kernelspec": { - "display_name": "xclimDev", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "xclimdev" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -353,9 +353,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.13" + "version": "3.10.9" } }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} From b8a59915044ce52249e4250e896263512a50baeb Mon Sep 17 00:00:00 2001 From: Trevor James Smith <10819524+Zeitsperre@users.noreply.github.com> Date: Thu, 30 Mar 2023 13:42:29 -0400 Subject: [PATCH 18/30] remove eigen and pybind11 (needed for sbck only) --- environment.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/environment.yml b/environment.yml index 533de8114..fb01f5751 100644 --- a/environment.yml +++ b/environment.yml @@ -25,9 +25,7 @@ dependencies: # Extras - clisops - eofs - - eigen - flox - - pybind11 # Testing and development dependencies - black>=22.12 - blackdoc From a01ecdf287ffcb6211f5dec8df3e47c139cfb7d5 Mon Sep 17 00:00:00 2001 From: Trevor James Smith <10819524+Zeitsperre@users.noreply.github.com> Date: Thu, 30 Mar 2023 14:03:53 -0400 Subject: [PATCH 19/30] replace .draw() with .show() --- docs/notebooks/example.ipynb | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/docs/notebooks/example.ipynb b/docs/notebooks/example.ipynb index 64cdfa4a7..bec87ad94 100644 --- a/docs/notebooks/example.ipynb +++ b/docs/notebooks/example.ipynb @@ -39,7 +39,6 @@ "# Imports for xclim and xarray\n", "from __future__ import annotations\n", "\n", - "import numpy as np\n", "import xarray as xr\n", "\n", "import xclim\n", @@ -404,8 +403,7 @@ "plt.figure()\n", "hw_after.sel(time=\"2010-07-01\").plot(vmin=0, vmax=7)\n", "plt.title(\"Run length, then resample\")\n", - "\n", - "plt.draw()" + "plt.show()" ] }, { @@ -442,7 +440,7 @@ "plt.axhline(y=convert_units_to(thresh_tn, \"degC\"), color=\"orange\", label=thresh_tn)\n", "plt.axvline(x=[\"2010-08-01\"], color=\"green\", label=\"Aug. 1st\")\n", "plt.legend()\n", - "plt.draw()" + "plt.show()" ] }, { @@ -586,7 +584,7 @@ "out1.plot(label=\"From mm s-1\", linestyle=\"-\")\n", "out2.plot(label=\"From mm d-1\", linestyle=\"none\", marker=\"o\")\n", "plt.legend()\n", - "plt.draw()" + "plt.show()" ] }, { @@ -627,7 +625,7 @@ "out2.plot(label=\"degC and degC\", marker=\"s\", markersize=10, linestyle=\"none\")\n", "out3.plot(label=\"degC and K\", marker=\"o\", linestyle=\"none\")\n", "plt.legend()\n", - "plt.draw()" + "plt.show()" ] }, { @@ -690,7 +688,7 @@ "outputs": [], "source": [ "out_hw2d.sel(time=\"1958\").plot()\n", - "plt.draw()\n" + "plt.show()" ] } ], @@ -710,7 +708,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.10.10" }, "vscode": { "interpreter": { From ccfd2775dcb6686a889373bce96c56570db5803c Mon Sep 17 00:00:00 2001 From: Trevor James Smith <10819524+Zeitsperre@users.noreply.github.com> Date: Thu, 30 Mar 2023 14:04:49 -0400 Subject: [PATCH 20/30] documentation fixes --- CONTRIBUTING.rst | 4 ++-- docs/installation.rst | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst index c878cf098..7bf3bc1b2 100644 --- a/CONTRIBUTING.rst +++ b/CONTRIBUTING.rst @@ -4,8 +4,8 @@ Contributing ============ -Contributions are welcome, and they are greatly appreciated! Every little bit -helps, and credit will always be given. +Contributions are welcome, and they are greatly appreciated! +Every little bit helps, and credit will always be given. You can contribute in many ways: diff --git a/docs/installation.rst b/docs/installation.rst index 63fa15fbf..ab1bbc32c 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -13,8 +13,6 @@ To install `xclim` via `pip`, run this command in your terminal: $ pip install xclim -This is the preferred method to install `xclim`, as it will always install the most recent stable release. - If you don't have `pip`_ installed, this `Python installation guide`_ can guide you through the process. .. _pip: https://pip.pypa.io/ From b8345d3e8d47e5e84221773ffc7a34a61e287d3f Mon Sep 17 00:00:00 2001 From: Trevor James Smith <10819524+Zeitsperre@users.noreply.github.com> Date: Thu, 30 Mar 2023 14:06:07 -0400 Subject: [PATCH 21/30] you better work --- docs/installation.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation.rst b/docs/installation.rst index ab1bbc32c..060817c8d 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -41,7 +41,7 @@ Speedups and Helper Libraries To improve performance of `xclim`, we highly recommend you also install `flox`_ (see: :doc:`flox API `). This package seamlessly integrates into `xarray` and significantly improves the performance of the grouping and resampling algorithms, especially when using `dask` on large datasets. -For grid subsetting, we also recommend using the tools found in `clisops`_ (see: :doc:`clisops.core.subset API `) for spatial manipulation of geospatial data. `clisops` began as a component of `xclim` and is designed to alongside `xclim` and the `Pangeo`_ stack (`xarray`, `dask`, `jupyter`). In order to install `clisops`, the `GDAL`_ system libraries must be available. +For grid subsetting, we also recommend using the tools found in `clisops`_ (see: :doc:`clisops.core.subset API `) for spatial manipulation of geospatial data. `clisops` began as a component of `xclim` and is designed to work alongside `xclim` and the `Pangeo`_ stack (`xarray`, `dask`, `jupyter`). In order to install `clisops`, the `GDAL`_ system libraries must be available. On Debian/Ubuntu, `GDAL` can be installed via `apt`: From 2a5a8fd37caa7a20dd9e2cae61c2511b75e1eca7 Mon Sep 17 00:00:00 2001 From: Trevor James Smith <10819524+Zeitsperre@users.noreply.github.com> Date: Thu, 30 Mar 2023 14:22:47 -0400 Subject: [PATCH 22/30] use British English conventions --- docs/notebooks/analogs.ipynb | 6 ++-- docs/notebooks/frequency_analysis.ipynb | 46 +++++-------------------- 2 files changed, 12 insertions(+), 40 deletions(-) diff --git a/docs/notebooks/analogs.ipynb b/docs/notebooks/analogs.ipynb index 84c952e8c..060dea535 100644 --- a/docs/notebooks/analogs.ipynb +++ b/docs/notebooks/analogs.ipynb @@ -60,7 +60,7 @@ "id": "8168d92e", "metadata": {}, "source": [ - "The goal is to find regions where the present climate is similar to that of a simulated future climate. We call \"candidates\" the dataset that contains the present-day indices. Here we use gridded observations provided by Natural Resources Canada (NRCan). This is the same data that was used as a reference for the bias-adjustment of the target simulation, which is essential to ensure the comparison holds. \n", + "The goal is to find regions where the present climate is similar to that of a simulated future climate. We call \"candidates\" the dataset that contains the present-day indices. Here we use gridded observations provided by Natural Resources Canada (NRCan). This is the same data that was used as a reference for the bias-adjustment of the target simulation, which is essential to ensure the comparison holds.\n", "\n", "A good test to see if the data is appropriate for computing spatial analog is the so-called \"self-analog\" test. It consists in computing the analogs using the same time period on both the target and the candidates. The test passes if the best analog is the same point as the target. Some authors have found that in some cases, a second bias-adjustment over the indices is needed to ensure that the data passes this test (see [Grenier et al. (2019)](https://www.sciencedirect.com/science/article/pii/S2405880719300639)). However, in this introductory notebook, we can't run this test and will simply assume the data is coherent." ] @@ -123,7 +123,7 @@ "id": "34bef449", "metadata": {}, "source": [ - "All the work is encapsulated in the `xclim.analog.spatial_analogs` function. By default, the function expects that the distribution to be analyzed is along the \"time\" dimension, like in our case. Inputs are datasets of indices, the target and the candidates should have the same indices and at least the `time` variable in common. Normal `xarray` broadcasting rules apply for the other dimensions.\n", + "All the work is encapsulated in the `xclim.analog.spatial_analogs` function. By default, the function expects that the distribution to be analysed is along the \"time\" dimension, like in our case. Inputs are datasets of indices, the target and the candidates should have the same indices and at least the `time` variable in common. Normal `xarray` broadcasting rules apply for the other dimensions.\n", "\n", "There are many metrics available to compute the dissimilarity between the indicator distributions. For our first test, we'll use the mean annual temperature (`tg_mean`) and the simple standardized Euclidean distance metric (`seuclidean`). This is a very basic metric that only computes the distance between the means. All algorithms used to compare distributions are available through the `xclim.analog.spatial_analogs` function. They also live as well-documented functions in the same module or in the `xclim.analog.metrics` dictionary." ] @@ -245,7 +245,7 @@ " ax.set_title(metric)\n", "axs[0, 0].legend()\n", "axs[-1, -1].set_visible(False)\n", - "fig.tight_layout();" + "fig.tight_layout();\n" ] } ], diff --git a/docs/notebooks/frequency_analysis.ipynb b/docs/notebooks/frequency_analysis.ipynb index e41c36876..1fac916e1 100644 --- a/docs/notebooks/frequency_analysis.ipynb +++ b/docs/notebooks/frequency_analysis.ipynb @@ -18,11 +18,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "from __future__ import annotations\n", @@ -74,11 +70,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "# Compute the design value\n", @@ -99,11 +91,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "sub = select_resample_op(pr, op=\"max\", freq=\"Y\", month=[5, 6, 7, 8, 9, 10])\n", @@ -120,11 +108,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "# The fitting dimension is hard-coded as `time`.\n", @@ -142,11 +126,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "parametric_quantile(params, q=1 - 1.0 / 20)" @@ -156,17 +136,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "As a convenience utility, the two last steps (`fit` and `parametric_quantile`) are bundled into the `fa` function, which takes care of converting the return period into a quantile value, and renames the `quantile` output dimension to `return_period`. This dimension renaming is done to avoid name clashes with the `quantile` method. Indeed, it's often necessary when analyzing large ensembles, or probabilistic samples, to compute the quantiles of the quantiles, which will cause `xarray` to raise an error. The `mode` argument specifies whether we are working with maxima (max) or minima (min). This is important because a 100-year return period value for minima corresponds to a 0.01 quantile, while a 100-year return period value for maxima corresponds to a 0.99 quantile. " + "As a convenience utility, the two last steps (`fit` and `parametric_quantile`) are bundled into the `fa` function, which takes care of converting the return period into a quantile value, and renames the `quantile` output dimension to `return_period`. This dimension renaming is done to avoid name clashes with the `quantile` method. Indeed, it's often necessary when analysing large ensembles, or probabilistic samples, to compute the quantiles of the quantiles, which will cause `xarray` to raise an error. The `mode` argument specifies whether we are working with maxima (max) or minima (min). This is important because a 100-year return period value for minima corresponds to a 0.01 quantile, while a 100-year return period value for maxima corresponds to a 0.99 quantile." ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "fa(sub, t=20, dist=\"genextreme\", mode=\"max\")" @@ -184,11 +160,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "# Set the first half of the first year as missing.\n", @@ -198,7 +170,7 @@ "null = missing_pct(pr, tolerance=0.05, freq=\"Y\", month=[5, 6, 7, 8, 9, 10])\n", "\n", "# Compute stats on masked values\n", - "fa(sub.where(~null), t=20, dist=\"genextreme\", mode=\"high\")" + "fa(sub.where(~null), t=20, dist=\"genextreme\", mode=\"high\")\n" ] } ], From ac504e6b24cc590ba4a0eefbfe80f54d2429a4c9 Mon Sep 17 00:00:00 2001 From: Trevor James Smith <10819524+Zeitsperre@users.noreply.github.com> Date: Thu, 30 Mar 2023 14:29:22 -0400 Subject: [PATCH 23/30] consistency --- docs/notebooks/sdba-advanced.ipynb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/notebooks/sdba-advanced.ipynb b/docs/notebooks/sdba-advanced.ipynb index 284284ab7..97e2b9bfe 100644 --- a/docs/notebooks/sdba-advanced.ipynb +++ b/docs/notebooks/sdba-advanced.ipynb @@ -360,7 +360,7 @@ "If `append_ends` is True, the reconstructed timeseries will go from the first time point of the first window to the last time point of the last window. In the middle, the central `step` years are kept from each window.\n", "If `append_ends` is False, only the central `step` years are kept from each window. Which means the final timeseries has `(window - step) / 2` years missing on either side, with the extra year missing on the right in case of an odd `(window - step)`. We are missing data, but the contribution from each window is equal.\n", "\n", - "Here, as `ref` and `hist` cover 15 years, we will use a window of 15 on sim. With a step of two (2), this means the first window goes from 2000 to 2014 (inclusive). The last window goes from 2016 to 2030. `window - step = 13`, so 6 years will be missing at the beginning of the final `scen` and 7 years at the end." + "Here, as `ref` and `hist` cover 15 years, we will use a window of 15 on sim. With a step of two (2), this means the first window goes from 2000 to 2014 (inclusive). The last window goes from 2016 to 2030. `window - step = 13`, so six (6) years will be missing at the beginning of the final `scen` and seven (7) years at the end." ] }, { @@ -532,7 +532,7 @@ "\n", "Where $b$ is the lower bound, here 0 mm/d. However, we could have exact zeros (0 mm/d) in the datasets, which will translate into $-\\infty$. To avoid this, we simply replace the smallest values by a random distribution of very small, but not problematic, values. In the following, all values below 0.1 mm/d are replaced by a uniform random distribution of values within the range (0, 0.1) mm/d (bounds excluded).\n", "\n", - "Finally, the variables are stacked together into a single DataArray." + "Finally, the variables are stacked together into a single `DataArray`." ] }, { @@ -604,7 +604,7 @@ "metadata": {}, "source": [ "### 3. Adjustments\n", - "Following, Alavoine et Grenier (2022), we decided to perform the multivariate Principal Components adjustment first and then re-adjust with the simple quantile-mapping." + "Following, Alavoine et Grenier (2022), we decided to perform the multivariate Principal Components adjustment first and then re-adjust with the simple Quantile-Mapping." ] }, { @@ -829,7 +829,7 @@ "fig.suptitle(\n", " \"Bias of the mean of the warm spell length distribution compared to observations\"\n", ")\n", - "plt.tight_layout()" + "plt.tight_layout()\n" ] } ], From 47059a04ab7d1b236205864b1b59dbc87a78c135 Mon Sep 17 00:00:00 2001 From: Pascal Bourgault Date: Thu, 30 Mar 2023 18:49:31 -0400 Subject: [PATCH 24/30] Fix comment in notebook - varying thresholds --- docs/notebooks/example.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/notebooks/example.ipynb b/docs/notebooks/example.ipynb index bec87ad94..3919e959e 100644 --- a/docs/notebooks/example.ipynb +++ b/docs/notebooks/example.ipynb @@ -654,12 +654,12 @@ "metadata": {}, "outputs": [], "source": [ - "# The tasmin threshold is 15 °C for the northern half of the domain and 20 °C for the southern half.\n", + "# The tasmin threshold is 7 °C for the northern half of the domain and 11 °C for the southern half.\n", "# (notice that the lat coordinate is in decreasing order : from north to south)\n", "thresh_tasmin = xr.DataArray(\n", " [7] * 24 + [11] * 24, dims=(\"lat\",), coords={\"lat\": ds5.lat}, attrs={\"units\": \"°C\"}\n", ")\n", - "# The tasmax threshold is 16°C for the western half of the domain and 19°C for the eastern half.\n", + "# The tasmax threshold is 17°C for the western half of the domain and 21°C for the eastern half.\n", "thresh_tasmax = xr.DataArray(\n", " [17] * 24 + [21] * 24, dims=(\"lon\",), coords={\"lon\": ds5.lon}, attrs={\"units\": \"°C\"}\n", ")\n", From ad37be43a1b2444d99cbc4024add87836199a491 Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Fri, 31 Mar 2023 14:48:05 -0400 Subject: [PATCH 25/30] review comments --- docs/notebooks/customize.ipynb | 60 +++++-------------------- docs/notebooks/ensembles.ipynb | 21 +++------ docs/notebooks/example.ipynb | 6 +-- docs/notebooks/frequency_analysis.ipynb | 6 +-- 4 files changed, 24 insertions(+), 69 deletions(-) diff --git a/docs/notebooks/customize.ipynb b/docs/notebooks/customize.ipynb index 465f88f96..ff10696fa 100644 --- a/docs/notebooks/customize.ipynb +++ b/docs/notebooks/customize.ipynb @@ -12,11 +12,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "from __future__ import annotations\n", @@ -37,11 +33,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "tasmax = (\n", @@ -63,11 +55,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "tx_mean = xclim.atmos.tx_mean(tasmax=tasmax, freq=\"MS\") # compute monthly max tasmax" @@ -83,11 +71,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "xclim.set_options(cf_compliance=\"log\")\n", @@ -109,11 +93,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "with xclim.set_options(metadata_locales=[\"fr\"]):\n", @@ -135,11 +115,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "xclim.set_options(check_missing=\"pct\", missing_options={\"pct\": {\"tolerance\": 0.08}})\n", @@ -158,11 +134,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "with xclim.set_options(check_missing=\"wmo\"):\n", @@ -176,12 +148,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This method checks that there are less than `nm=5` invalid values in a month and that there are no consecutive runs of `nc>=4` invalid values. Thus, every month is now valid.\n", + "This method checks that there are less than `nm=11` invalid values in a month and that there are no consecutive runs of `nc>=5` invalid values. Thus, every month is now valid.\n", "\n", "Finally, it is possible for advanced users to register their own method. Xclim's missing methods are in fact based on class instances. Thus, to create a custom missing class, one should implement a subclass based on `xclim.core.checks.MissingBase` and overriding at least the `is_missing` method. The method should take a `null` argument and a `count` argument.\n", "\n", "- `null` is a `DataArrayResample` instance of the resampled mask of invalid values in the input data array.\n", - "- `count` is the number of days in each resampled periods and any number of other keyword arguments. \n", + "- `count` is the number of days in each resampled periods and any number of other keyword arguments.\n", "\n", "The `is_missing` method should return a boolean mask, at the same frequency as the indicator output (same as `count`), where True values are for elements that are considered missing and masked on the output.\n", "\n", @@ -191,11 +163,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "from xclim.core.missing import MissingBase, register_missing_method\n", @@ -224,11 +192,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "with xclim.set_options(\n", @@ -237,7 +201,7 @@ " tx_mean = xclim.atmos.tx_mean(\n", " tasmax=tasmax, freq=\"MS\"\n", " ) # compute monthly max tasmax\n", - "tx_mean.sel(time=\"2013\", lat=75, lon=200)" + "tx_mean.sel(time=\"2013\", lat=75, lon=200)\n" ] } ], diff --git a/docs/notebooks/ensembles.ipynb b/docs/notebooks/ensembles.ipynb index 072c1072d..4d6706649 100644 --- a/docs/notebooks/ensembles.ipynb +++ b/docs/notebooks/ensembles.ipynb @@ -115,12 +115,11 @@ "\n", "However, this is only successful when the dimensions of all the files are identical AND only if the calendar type of each netcdf file is the same\n", "\n", - "xclim's `create_ensemble()` method overcomes these constraints, selecting the common time period to all files and assigns a standard calendar type to the dataset. \n", + "xclim's `create_ensemble()` method overcomes these constraints, selecting the common time period to all files and assigns a standard calendar type to the dataset.\n", "\n", "
\n", "\n", - "Input netcdf files still require equal spatial dimension size (e.g. lon, lat dimensions).
\n", - "If input data contains multiple `cftime` calendar types, they must not be at daily frequency.\n", + "Input netcdf files still require equal spatial dimension size (e.g. lon, lat dimensions).\n", "\n", "
\n", "\n", @@ -203,18 +202,14 @@ "source": [ "### Ensemble percentiles\n", "\n", - "Here, we use xclim's `ensemble_percentiles()` to calculate percentile values across the 10 realizations. \n", + "Here, we use xclim's `ensemble_percentiles()` to calculate percentile values across the 10 realizations.\n", "The output has now a `percentiles` dimension instead of `realization`. Split variables can be created instead, by specifying `split=True` (the variable name `tas` will be appended with `_p{x}`). Compared to NumPy's `percentile()` and xarray's `quantile()`, this method handles more efficiently dataset with invalid values and the chunking along the realization dimension (which is automatic when dask arrays are used)." ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "ens_perc = ensembles.ensemble_percentiles(ens, values=[15, 50, 85], split=False)\n", @@ -224,11 +219,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "pycharm": { - "name": "#%%\n" - } - }, + "metadata": {}, "outputs": [], "source": [ "fig, ax = plt.subplots()\n", @@ -253,7 +244,7 @@ " ens_perc.time.values, ens_perc.tas.sel(percentiles=50), linewidth=2, label=\"Median\"\n", ")\n", "ax.legend()\n", - "plt.show()" + "plt.show()\n" ] } ], diff --git a/docs/notebooks/example.ipynb b/docs/notebooks/example.ipynb index 3919e959e..b7d78aaa1 100644 --- a/docs/notebooks/example.ipynb +++ b/docs/notebooks/example.ipynb @@ -295,7 +295,7 @@ }, "outputs": [], "source": [ - "out = xclim.indices.tx_days_above(ds2.tasmax, thresh=\"30 C\", freq=\"YS\")\n", + "out = xclim.indices.tx_days_above(ds2.tasmax, thresh=\"30 degC\", freq=\"YS\")\n", "print(out)" ] }, @@ -316,7 +316,7 @@ }, "outputs": [], "source": [ - "out = xclim.atmos.tx_days_above(ds2.tasmax, thresh=\"30 C\", freq=\"YS\")\n", + "out = xclim.atmos.tx_days_above(ds2.tasmax, thresh=\"30 degC\", freq=\"YS\")\n", "print(out)" ] }, @@ -688,7 +688,7 @@ "outputs": [], "source": [ "out_hw2d.sel(time=\"1958\").plot()\n", - "plt.show()" + "plt.show()\n" ] } ], diff --git a/docs/notebooks/frequency_analysis.ipynb b/docs/notebooks/frequency_analysis.ipynb index 1fac916e1..719020d22 100644 --- a/docs/notebooks/frequency_analysis.ipynb +++ b/docs/notebooks/frequency_analysis.ipynb @@ -75,7 +75,7 @@ "source": [ "# Compute the design value\n", "frequency_analysis(\n", - " pr, t=20, dist=\"genextreme\", mode=\"max\", freq=\"Y\", month=[5, 6, 7, 8, 9, 10]\n", + " pr, t=20, dist=\"genextreme\", mode=\"max\", freq=\"YS\", month=[5, 6, 7, 8, 9, 10]\n", ")" ] }, @@ -94,7 +94,7 @@ "metadata": {}, "outputs": [], "source": [ - "sub = select_resample_op(pr, op=\"max\", freq=\"Y\", month=[5, 6, 7, 8, 9, 10])\n", + "sub = select_resample_op(pr, op=\"max\", freq=\"YS\", month=[5, 6, 7, 8, 9, 10])\n", "sub" ] }, @@ -167,7 +167,7 @@ "pr[:200] = np.nan\n", "\n", "# Compute vector returning which years should be considered missing.\n", - "null = missing_pct(pr, tolerance=0.05, freq=\"Y\", month=[5, 6, 7, 8, 9, 10])\n", + "null = missing_pct(pr, tolerance=0.05, freq=\"YS\", month=[5, 6, 7, 8, 9, 10])\n", "\n", "# Compute stats on masked values\n", "fa(sub.where(~null), t=20, dist=\"genextreme\", mode=\"high\")\n" From 50629b502163cde435af19a3ba6ba3befbd8a49f Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Fri, 31 Mar 2023 14:57:29 -0400 Subject: [PATCH 26/30] indice to index --- docs/notebooks/extendxclim.ipynb | 22 +++++++++---------- docs/notebooks/usage.ipynb | 8 +++---- .../xclim_training/intro_xarray.ipynb | 4 ++-- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/notebooks/extendxclim.ipynb b/docs/notebooks/extendxclim.ipynb index 238fba078..07469b15f 100644 --- a/docs/notebooks/extendxclim.ipynb +++ b/docs/notebooks/extendxclim.ipynb @@ -12,14 +12,14 @@ "\n", "![modules](./Modules.svg)\n", "\n", - "This introduction will focus on the Indicator/Indice part of `xclim` and how one can extend it by implementing new ones.\n", + "This introduction will focus on the Indicator/Index part of `xclim` and how one can extend it by implementing new ones.\n", "\n", "\n", "## Indices vs Indicators\n", "\n", "Internally and in the documentation, `xclim` makes a distinction between \"indices\" and \"indicators\".\n", "\n", - "### indice\n", + "### index\n", "\n", " * A python function accepting DataArrays and other parameters (usually built-in types)\n", " * Returns one or several DataArrays.\n", @@ -29,14 +29,14 @@ "\n", "### indicator\n", "\n", - " * An instance of a subclass of `xclim.core.indicator.Indicator` that wraps around an `indice` (stored in its `compute` property).\n", + " * An instance of a subclass of `xclim.core.indicator.Indicator` that wraps around an `index` (stored in its `compute` property).\n", " * Returns one or several DataArrays.\n", " * Handles missing values, performs input data and metadata checks (see [usage](usage.ipynb#indicators)).\n", " * Always outputs data in the same units.\n", " * Adds dynamically generated metadata to the output after computation.\n", " * Accessible through [xclim.indicators](../indicators.rst)\n", "\n", - "Most metadata stored in the Indicators is parsed from the underlying indice documentation, so defining indices with complete documentation and an appropriate signature helps the process. The two next sections go into details on the definition of both objects.\n", + "Most metadata stored in the Indicators is parsed from the underlying index documentation, so defining indices with complete documentation and an appropriate signature helps the process. The two next sections go into details on the definition of both objects.\n", "\n", "#### Call sequence\n", "\n", @@ -59,7 +59,7 @@ "\n", "
\n", "\n", - "![indice doc](Indice.svg)\n", + "![index doc](Indice.svg)\n", "\n", "The following code is another example." ] @@ -136,11 +136,11 @@ "\n", "### Generic functions for common operations\n", "\n", - "The [xclim.indices.generic](../indices.rst#generic-indices-submodule) submodule contains useful functions for common computations (like `threshold_count` or `select_resample_op`) and many basic indice functions, as defined by [clix-meta](https://github.com/clix-meta/clix-meta). In order to reduce duplicate code, their use is recommended for xclim's indices. As previously said, the units handling has to be made explicitly when non-trivial, [xclim.core.units](../api.rst#units-handling-submodule) also exposes a few helpers for that (like `convert_units_to`, `to_agg_units` or `rate2amount`).\n", + "The [xclim.indices.generic](../indices.rst#generic-indices-submodule) submodule contains useful functions for common computations (like `threshold_count` or `select_resample_op`) and many basic index functions, as defined by [clix-meta](https://github.com/clix-meta/clix-meta). In order to reduce duplicate code, their use is recommended for xclim's indices. As previously said, the units handling has to be made explicitly when non-trivial, [xclim.core.units](../api.rst#units-handling-submodule) also exposes a few helpers for that (like `convert_units_to`, `to_agg_units` or `rate2amount`).\n", "\n", "### Documentation\n", "\n", - "As shown in both example, a certain level of convention is best followed when writing the docstring of the indice function. The general structure follows the NumpyDoc conventions, and some fields might be parsed when creating the indicator (see the image above and the section below). If you are contributing to the xclim codebase, when adding a citation to the docstring, this is best done by adding that reference to the ``references.bib`` file and then citing it using its label with the `:cite:cts:` directive (or one of its variant). See the [contributing docs](../contributing.rst#write-Documentation).\n", + "As shown in both example, a certain level of convention is best followed when writing the docstring of the index function. The general structure follows the NumpyDoc conventions, and some fields might be parsed when creating the indicator (see the image above and the section below). If you are contributing to the xclim codebase, when adding a citation to the docstring, this is best done by adding that reference to the ``references.bib`` file and then citing it using its label with the `:cite:cts:` directive (or one of its variant). See the [contributing docs](../contributing.rst#write-Documentation).\n", "\n", "## Defining new indicators\n", "\n", @@ -149,7 +149,7 @@ "\n", "* the `identifier`, as string that uniquely identifies the indicator, usually all caps.\n", "* the `realm`, one of \"atmos\", \"land\", \"seaIce\" or \"ocean\", classifying the domain of use of the indicator.\n", - "* the `compute` function that returns one or more DataArrays, the \"indice\",\n", + "* the `compute` function that returns one or more DataArrays, the \"index\",\n", "* the `cfcheck` and `datacheck` methods that make sure the inputs are appropriate and valid.\n", "* the `missing` function that masks elements based on null values in the input.\n", "* all metadata attributes that will be attributed to the output and that document the indicator:\n", @@ -168,7 +168,7 @@ "\n", "### Metadata parsing vs explicit setting\n", "\n", - "As explained above, most metadata can be parsed from the indice's signature and docstring. Otherwise, it can always be set when creating a new Indicator instance *or* a new subclass. When _creating_ an indicator, output metadata attributes can be given as strings, or list of strings in the case of an indicator returning multiple outputs. However, they are stored in the `cf_attrs` list of dictionaries on the instance.\n", + "As explained above, most metadata can be parsed from the index's signature and docstring. Otherwise, it can always be set when creating a new Indicator instance *or* a new subclass. When _creating_ an indicator, output metadata attributes can be given as strings, or list of strings in the case of an indicator returning multiple outputs. However, they are stored in the `cf_attrs` list of dictionaries on the instance.\n", "\n", "### Internationalization of metadata\n", "\n", @@ -176,7 +176,7 @@ "\n", "### Inputs and checks\n", "\n", - "xclim decides which input arguments of the indicator's call function are considered _variables_ and which are _parameters_ using the annotations of the underlying indice (the `compute` method). Arguments annotated with the `xarray.DataArray` type are considered _variables_ and can be read from the dataset passed in `ds`.\n", + "xclim decides which input arguments of the indicator's call function are considered _variables_ and which are _parameters_ using the annotations of the underlying index (the `compute` method). Arguments annotated with the `xarray.DataArray` type are considered _variables_ and can be read from the dataset passed in `ds`.\n", "\n", "### Indicator creation\n", "\n", @@ -290,7 +290,7 @@ "\n", "### YAML file\n", "\n", - "The first method is based on the YAML syntax proposed by `clix-meta`, expanded to xclim's needs. The full documentation on that syntax is [here](../api.rst#indicator-tools). This notebook shows an example of different complexities of indicator creation. It creates a minimal python module defining an indice, creates a YAML file with the metadata for several indicators and then parses it into xclim." + "The first method is based on the YAML syntax proposed by `clix-meta`, expanded to xclim's needs. The full documentation on that syntax is [here](../api.rst#indicator-tools). This notebook shows an example of different complexities of indicator creation. It creates a minimal python module defining an index, creates a YAML file with the metadata for several indicators and then parses it into xclim." ] }, { diff --git a/docs/notebooks/usage.ipynb b/docs/notebooks/usage.ipynb index adf6c7ad7..ad89eef19 100644 --- a/docs/notebooks/usage.ipynb +++ b/docs/notebooks/usage.ipynb @@ -33,7 +33,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Indice calculations are performed by opening a NetCDF-like file, accessing the variable of interest, and calling the indice function, which returns a new `xarray.DataArray`.\n", + "Index calculations are performed by opening a NetCDF-like file, accessing the variable of interest, and calling the index function, which returns a new `xarray.DataArray`.\n", "\n", "For this example, we'll first open a demonstration dataset storing surface air temperature and compute the number of growing degree days (the sum of degrees above a certain threshold) at the monthly frequency." ] @@ -66,7 +66,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "This computation was made using the `growing_degree_days` **indicator**. The same computation could be made through the **indice**. You can see how the metadata is alot poorer here." + "This computation was made using the `growing_degree_days` **indicator**. The same computation could be made through the **index**. You can see how the metadata is alot poorer here." ] }, { @@ -85,7 +85,7 @@ "source": [ "The call to `xclim.indices.growing_degree_days` first checked that the input variable units were units of temperature, ran the computation, then set the output's units to the appropriate unit (here ``\"K d\"`` or Kelvin days). As you can see, the **Indicator** returned the same output, but with more metadata, it also performed more checks as explained below.\n", "\n", - "`growing_degree_days` makes most sense with **daily input**, but could theoretically accept other source frequencies. The computational layer (*`Indice`*) assumes that users have checked that the input data has the expected temporal frequency and has no missing values. However, no checks are performed, so the output data could be wrong (which is why it's always safer to use **`Indicator`** objects from the CF layer, as demonstrated in the following section).\n", + "`growing_degree_days` makes most sense with **daily input**, but could theoretically accept other source frequencies. The computational layer (*`Index`*) assumes that users have checked that the input data has the expected temporal frequency and has no missing values. However, no checks are performed, so the output data could be wrong (which is why it's always safer to use **`Indicator`** objects from the CF layer, as demonstrated in the following section).\n", "\n", "Finally, as almost all indices, the function takes a `freq` argument to specify over what time period it is computed. These are called \"Offset Aliases\" and are the same as the resampling string arguments. Valid arguments are detailed in [pandas docs](https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases) (note that aliases involving \"business\" notions are not supported by `xarray` and thus could raise issues in xclim.\n", "\n", @@ -193,7 +193,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Some indicators also expose time-selection arguments as `**indexer` keywords. This allows to run the indice on a subset of the time coordinates, for example only on a specific season, month, or between two dates in every year. It relies on the [select_time](../xclim.core.rst#xclim.core.calendar.select_time) function. Some indicators will simply select the time period and run the calculations, while others will smartly perform the selection at the right time, when the order of operation makes a difference. All will pass the `indexer` kwargs to the missing value handling, ensuring that the missing values _outside_ the valid time period are **not** considered.\n", + "Some indicators also expose time-selection arguments as `**indexer` keywords. This allows to run the index on a subset of the time coordinates, for example only on a specific season, month, or between two dates in every year. It relies on the [select_time](../xclim.core.rst#xclim.core.calendar.select_time) function. Some indicators will simply select the time period and run the calculations, while others will smartly perform the selection at the right time, when the order of operation makes a difference. All will pass the `indexer` kwargs to the missing value handling, ensuring that the missing values _outside_ the valid time period are **not** considered.\n", "\n", "The next example computes the annual sum of growing degree days over 10 °C, but only considering days from the 1st of April to the 30th of September." ] diff --git a/docs/notebooks/xclim_training/intro_xarray.ipynb b/docs/notebooks/xclim_training/intro_xarray.ipynb index ce6cfaf0d..e07713293 100644 --- a/docs/notebooks/xclim_training/intro_xarray.ipynb +++ b/docs/notebooks/xclim_training/intro_xarray.ipynb @@ -102,7 +102,7 @@ "source": [ "## On accède aux dimensions par leur nom\n", "\n", - "Dans la plupart des interfaces netCDF, on manipule un cube de données en n-dimensions, et on doit se référer aux attributs pour savoir quel est l'indice de la dimension time, lat lon. Si vous voulez accéder aux éléments du premier time step, il faut d'abord savoir si la dimension du temps et la première, deuxième ou troisième. \n", + "Dans la plupart des interfaces netCDF, on manipule un cube de données en n-dimensions, et on doit se référer aux attributs pour savoir quel est l'index de la dimension time, lat lon. Si vous voulez accéder aux éléments du premier time step, il faut d'abord savoir si la dimension du temps et la première, deuxième ou troisième. \n", "\n", "On peut faire la même chose avec `xarray`:" ] @@ -128,7 +128,7 @@ } }, "source": [ - "Mais on peut aussi accéder aux données par le nom de leur dimension via leur indice par la méhode `isel`: " + "Mais on peut aussi accéder aux données par le nom de leur dimension via leur index par la méhode `isel`: " ] }, { From 8d1858ddb3006fc268c329cafd2a144fa75aa84f Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Fri, 31 Mar 2023 15:17:09 -0400 Subject: [PATCH 27/30] =?UTF-8?q?=C2=B0K=20to=20K?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/notebooks/units.ipynb | 2 +- .../xclim_training/XCLIM_calculate_index-Exemple.ipynb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/notebooks/units.ipynb b/docs/notebooks/units.ipynb index d1ffd46c8..5dbf8043c 100644 --- a/docs/notebooks/units.ipynb +++ b/docs/notebooks/units.ipynb @@ -35,7 +35,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "A lot of effort has been placed into automatic handling of input data units. `xclim` will automatically detect the input variable(s) units (e.g. °C versus °K or mm/s versus mm/day etc.) and adjust on-the-fly in order to calculate indices in the consistent manner. This comes with the obvious caveat that input data requires a metadata attribute for units : the `units` attribute is required, and the `standard_name` can be useful for automatic conversions.\n", + "A lot of effort has been placed into automatic handling of input data units. `xclim` will automatically detect the input variable(s) units (e.g. °C versus K or mm/s versus mm/day etc.) and adjust on-the-fly in order to calculate indices in the consistent manner. This comes with the obvious caveat that input data requires a metadata attribute for units : the `units` attribute is required, and the `standard_name` can be useful for automatic conversions.\n", "\n", "The main unit handling method is [`xclim.core.units.convert_units_to`](../xclim.core.rst#xclim.core.units.convert_units_to) which can also be useful on its own. `xclim` relies on [pint](https://pint.readthedocs.io/) for unit handling.\n", "\n", diff --git a/docs/notebooks/xclim_training/XCLIM_calculate_index-Exemple.ipynb b/docs/notebooks/xclim_training/XCLIM_calculate_index-Exemple.ipynb index b8904b6b3..7b3caf952 100644 --- a/docs/notebooks/xclim_training/XCLIM_calculate_index-Exemple.ipynb +++ b/docs/notebooks/xclim_training/XCLIM_calculate_index-Exemple.ipynb @@ -387,7 +387,7 @@ "source": [ "### XCLIM unit handling \n", "\n", - "A lot of effort has been placed into automatic handling of input data units. `xclim` will automatically detect the input variable(s) units (e.g. °C versus °K or mm/s versus mm/day etc.) and adjust on-the-fly in order to calculate indices in the consistent manner. This comes with the obvious caveat that input data requires metadata attribute for units\n", + "A lot of effort has been placed into automatic handling of input data units. `xclim` will automatically detect the input variable(s) units (e.g. °C versus K or mm/s versus mm/day etc.) and adjust on-the-fly in order to calculate indices in the consistent manner. This comes with the obvious caveat that input data requires metadata attribute for units\n", "\n", "In the example below, we compute weekly total precipitation in mm using inputs of mm/s and mm/d." ] @@ -486,7 +486,7 @@ "\n", "# Using Celsius but with threshold in Kelvin\n", "out3 = atmos.tx_days_above(dsTasmax_C.tasmax, thresh=\"293.15 K\", freq=\"MS\")\n", - "print(\"\\n3. results using inputs in °C : threshold in °K : \\n\\n\", out3.values)" + "print(\"\\n3. results using inputs in °C : threshold in K: \\n\\n\", out3.values)" ] }, { From 927b7c1232e8ed3c936f7a9b9b426a5a75c5db6f Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Fri, 31 Mar 2023 15:23:59 -0400 Subject: [PATCH 28/30] remove unnecessary ;, add mention of units handling --- docs/notebooks/analogs.ipynb | 2 +- docs/notebooks/example.ipynb | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/notebooks/analogs.ipynb b/docs/notebooks/analogs.ipynb index 060dea535..dff61fc20 100644 --- a/docs/notebooks/analogs.ipynb +++ b/docs/notebooks/analogs.ipynb @@ -245,7 +245,7 @@ " ax.set_title(metric)\n", "axs[0, 0].legend()\n", "axs[-1, -1].set_visible(False)\n", - "fig.tight_layout();\n" + "fig.tight_layout()\n" ] } ], diff --git a/docs/notebooks/example.ipynb b/docs/notebooks/example.ipynb index b7d78aaa1..55ea52075 100644 --- a/docs/notebooks/example.ipynb +++ b/docs/notebooks/example.ipynb @@ -553,6 +553,8 @@ "\n", "A lot of effort has been placed into automatic handling of input data units. `xclim` will automatically detect the input variable(s) units (e.g. `°C` versus `°K` or `mm/s` versus `mm/day` etc.) and adjust on-the-fly in order to calculate indices in the consistent manner. This comes with the obvious caveat that input data requires metadata attribute for units.\n", "\n", + "The [Units Handling](units.ipynb) page goes more into detail on how unit conversion can easily be done.\n", + "\n", "In the example below, we compute weekly total precipitation in mm using inputs of `mm/s` and `mm/d`. As we can see, the output is identical." ] }, From 5d44c40410540a2c56f3effe3e0389f06cf5892d Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Fri, 31 Mar 2023 15:37:49 -0400 Subject: [PATCH 29/30] add pytest-json-report in order to pass pip check --- environment.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/environment.yml b/environment.yml index fb01f5751..63fb857fe 100644 --- a/environment.yml +++ b/environment.yml @@ -26,6 +26,7 @@ dependencies: - clisops - eofs - flox + - pytest-json-report # Added due to a packaging bug with ESMPy. See: https://github.com/esmf-org/esmf/issues/115 # Testing and development dependencies - black>=22.12 - blackdoc From f5660187bb6ad091c15236a4334cd348bea6b0d7 Mon Sep 17 00:00:00 2001 From: Zeitsperre <10819524+Zeitsperre@users.noreply.github.com> Date: Fri, 31 Mar 2023 15:54:00 -0400 Subject: [PATCH 30/30] try loading dataset to prevent crash --- xclim/testing/tests/test_sdba/test_properties.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xclim/testing/tests/test_sdba/test_properties.py b/xclim/testing/tests/test_sdba/test_properties.py index 17ef1db7f..d57150a5f 100644 --- a/xclim/testing/tests/test_sdba/test_properties.py +++ b/xclim/testing/tests/test_sdba/test_properties.py @@ -303,7 +303,7 @@ def test_relative_frequency(self, open_dataset): open_dataset("sdba/CanESM2_1950-2100.nc") .sel(time=slice("1950", "1952"), location="Vancouver") .pr - ) + ).load() test = sdba.properties.relative_frequency(sim, thresh="25 mm d-1", op=">=") testjan = (