diff --git a/cmec/extremes/pmp_extremes_driver.sh b/cmec/extremes/pmp_extremes_driver.sh new file mode 100755 index 000000000..bafab3aac --- /dev/null +++ b/cmec/extremes/pmp_extremes_driver.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +source $CONDA_SOURCE +conda activate $CONDA_ENV_ROOT/_CMEC_pcmdi_metrics + +cd $CMEC_WK_DIR + +tmp_param=$CMEC_WK_DIR/extremes_param.py + +python $CMEC_CODE_DIR/../scripts/pmp_param_generator.py $CMEC_CONFIG_DIR/cmec.json $tmp_param "extremes" + +if [[ $? = 0 ]]; then + extremes_driver.py -p $tmp_param + +else + echo "Failure in PMP/extremes parameter file generation" +fi diff --git a/cmec/scripts/pmp_param_generator.py b/cmec/scripts/pmp_param_generator.py index b7a435942..114d5f651 100644 --- a/cmec/scripts/pmp_param_generator.py +++ b/cmec/scripts/pmp_param_generator.py @@ -67,6 +67,18 @@ def check_for_opt(key, settings): print("\nGenerating climatologies") settings = make_climatologies(settings, model_dir, wk_dir) + if pmp_config == "extremes": + settings["test_data_path"] = model_dir + settings["metrics_output_path"] = wk_dir + if "sftlf_filename_template" in settings: + settings["sftlf_filename_template"] = os.path.join( + model_dir, settings["sftlf_filename_template"] + ) + if obs_dir is not None and "reference_data_path" in settings: + settings["reference_data_path"] = os.path.join( + obs_dir, settings["reference_data_path"] + ) + if pmp_config == "monsoon_wang": settings["test_data_path"] = os.path.join(model_dir, settings["test_data_path"]) settings["reference_data_path"] = os.path.join( diff --git a/conda-env/dev.yml b/conda-env/dev.yml index 4ba49e993..0a14f0395 100644 --- a/conda-env/dev.yml +++ b/conda-env/dev.yml @@ -28,6 +28,7 @@ dependencies: - regionmask=0.9.0 - rasterio=1.3.6 - shapely=2.0.1 + - numdifftools # ================== # Testing # ================== diff --git a/contents.json b/contents.json index 52dd66a9c..589e8f0e0 100644 --- a/contents.json +++ b/contents.json @@ -11,6 +11,7 @@ "cmec/mean_climate/pmp_mean_climate.json", "cmec/diurnal_cycle/pmp_diurnal_cycle.json", "cmec/monsoon_wang/pmp_monsoon_wang.json", - "cmec/monsoon_sperber/pmp_monsoon_sperber.json" + "cmec/monsoon_sperber/pmp_monsoon_sperber.json", + "cmec/extremes/pmp_extremes.json" ] } diff --git a/doc/jupyter/Demo/Demo_0_download_data.ipynb b/doc/jupyter/Demo/Demo_0_download_data.ipynb index 3a54344c1..74149ab13 100644 --- a/doc/jupyter/Demo/Demo_0_download_data.ipynb +++ b/doc/jupyter/Demo/Demo_0_download_data.ipynb @@ -50,7 +50,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In below cell, you are going to download sample input files from PCMDI server. The total size of dataset is about 2 GB, and so please be aware that downloading will take some time to complete. List of downloading files can be found in `data_files.txt` file." + "In below cell, you are going to download sample input files from PCMDI server. The total size of dataset is about 2 GB, and so please be aware that downloading will take some time to complete. List of downloading files can be found in [`data_files.txt`](data_files.txt) file." ] }, { @@ -62,31 +62,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "Downloading: 'CMIP5_demo_clims/cmip5.historical.ACCESS1-0.r1i1p1.mon.pr.198101-200512.AC.v20200426.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/CMIP5_demo_clims/cmip5.historical.ACCESS1-0.r1i1p1.mon.pr.198101-200512.AC.v20200426.nc\n", - "Downloading: 'CMIP5_demo_clims/cmip5.historical.ACCESS1-0.r1i1p1.mon.rlut.198101-200512.AC.v20200426.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/CMIP5_demo_clims/cmip5.historical.ACCESS1-0.r1i1p1.mon.rlut.198101-200512.AC.v20200426.nc\n", - "Downloading: 'CMIP5_demo_clims/cmip5.historical.ACCESS1-0.r1i1p1.mon.zg.198101-200512.AC.v20200426.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/CMIP5_demo_clims/cmip5.historical.ACCESS1-0.r1i1p1.mon.zg.198101-200512.AC.v20200426.nc\n", - "Downloading: 'CMIP5_demo_clims/cmip5.historical.CanCM4.r1i1p1.mon.pr.198101-200512.AC.v20200426.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/CMIP5_demo_clims/cmip5.historical.CanCM4.r1i1p1.mon.pr.198101-200512.AC.v20200426.nc\n", - "Downloading: 'CMIP5_demo_clims/cmip5.historical.CanCM4.r1i1p1.mon.rlut.198101-200512.AC.v20200426.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/CMIP5_demo_clims/cmip5.historical.CanCM4.r1i1p1.mon.rlut.198101-200512.AC.v20200426.nc\n", - "Downloading: 'CMIP5_demo_clims/cmip5.historical.CanCM4.r1i1p1.mon.zg.198101-200512.AC.v20200426.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/CMIP5_demo_clims/cmip5.historical.CanCM4.r1i1p1.mon.zg.198101-200512.AC.v20200426.nc\n", - "Downloading: 'CMIP5_demo_clims/cmip6.historical.MCM-UA-1-0.r1i1p1f1.mon.zg.198101-200512.AC.v20201119.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/CMIP5_demo_clims/cmip6.historical.MCM-UA-1-0.r1i1p1f1.mon.zg.198101-200512.AC.v20201119.nc\n", - "Downloading: 'CMIP5_demo_data/psl_Amon_ACCESS1-0_historical_r1i1p1_185001-200512.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/CMIP5_demo_data/psl_Amon_ACCESS1-0_historical_r1i1p1_185001-200512.nc\n", - "Downloading: 'CMIP5_demo_data/sftlf_fx_ACCESS1-0_amip_r0i0p0.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/CMIP5_demo_data/sftlf_fx_ACCESS1-0_amip_r0i0p0.nc\n", - "Downloading: 'CMIP5_demo_data/cmip5.amip.ACCESS1-0.sftlf.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/CMIP5_demo_data/cmip5.amip.ACCESS1-0.sftlf.nc\n", - "Downloading: 'CMIP5_demo_data/cmip5.historical.GISS-E2-H.sftlf.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/CMIP5_demo_data/cmip5.historical.GISS-E2-H.sftlf.nc\n", - "Downloading: 'CMIP5_demo_data/ts_Amon_ACCESS1-0_historical_r1i1p1_185001-200512.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/CMIP5_demo_data/ts_Amon_ACCESS1-0_historical_r1i1p1_185001-200512.nc\n", - "Downloading: 'CMIP5_demo_timeseries/historical/atmos/day/pr/pr_day_GISS-E2-H_historical_r6i1p1_20000101-20051231.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/CMIP5_demo_timeseries/historical/atmos/day/pr/pr_day_GISS-E2-H_historical_r6i1p1_20000101-20051231.nc\n", - "Downloading: 'obs4MIPs_PCMDI_clims/rlut/CERES-EBAF-4-0/v20210804/rlut_mon_CERES-EBAF-4-0_PCMDI_gn.200301-201812.AC.v20210804.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/obs4MIPs_PCMDI_clims/rlut/CERES-EBAF-4-0/v20210804/rlut_mon_CERES-EBAF-4-0_PCMDI_gn.200301-201812.AC.v20210804.nc\n", - "Downloading: 'obs4MIPs_PCMDI_clims/rlut/CERES-EBAF-4-1/v20210804/rlut_mon_CERES-EBAF-4-1_PCMDI_gn.200301-201812.AC.v20210804.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/obs4MIPs_PCMDI_clims/rlut/CERES-EBAF-4-1/v20210804/rlut_mon_CERES-EBAF-4-1_PCMDI_gn.200301-201812.AC.v20210804.nc\n", - "Downloading: 'obs4MIPs_PCMDI_clims/pr/GPCP-2-3/v20210804/pr_mon_GPCP-2-3_PCMDI_gn.200301-201812.AC.v20210804.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/obs4MIPs_PCMDI_clims/pr/GPCP-2-3/v20210804/pr_mon_GPCP-2-3_PCMDI_gn.200301-201812.AC.v20210804.nc\n", - "Downloading: 'obs4MIPs_PCMDI_clims/zg/ERA-INT/v20210804/zg_mon_ERA-INT_PCMDI_gn.200301-201812.AC.v20210804.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/obs4MIPs_PCMDI_clims/zg/ERA-INT/v20210804/zg_mon_ERA-INT_PCMDI_gn.200301-201812.AC.v20210804.nc\n", - "Downloading: 'obs4MIPs_PCMDI_monthly/ECMWF/ERA-INT/mon/zg/gn/v20210727/zg_mon_ERA-INT_PCMDI_gn_198901-201001.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/obs4MIPs_PCMDI_monthly/ECMWF/ERA-INT/mon/zg/gn/v20210727/zg_mon_ERA-INT_PCMDI_gn_198901-201001.nc\n", - "Downloading: 'obs4MIPs_PCMDI_monthly/NASA-LaRC/CERES-EBAF-4-1/mon/rlut/gn/v20210727/rlut_mon_CERES-EBAF-4-1_PCMDI_gn_200301-201812.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/obs4MIPs_PCMDI_monthly/NASA-LaRC/CERES-EBAF-4-1/mon/rlut/gn/v20210727/rlut_mon_CERES-EBAF-4-1_PCMDI_gn_200301-201812.nc\n", - "Downloading: 'obs4MIPs_PCMDI_monthly/NOAA-NCEI/GPCP-2-3/mon/pr/gn/v20210727/pr_mon_GPCP-2-3_PCMDI_gn_197901-201907.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/obs4MIPs_PCMDI_monthly/NOAA-NCEI/GPCP-2-3/mon/pr/gn/v20210727/pr_mon_GPCP-2-3_PCMDI_gn_197901-201907.nc\n", - "Downloading: 'obs4MIPs_PCMDI_monthly/NOAA-ESRL-PSD/20CR/mon/psl/gn/v20210727/psl_mon_20CR_PCMDI_gn_187101-201212.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/obs4MIPs_PCMDI_monthly/NOAA-ESRL-PSD/20CR/mon/psl/gn/v20210727/psl_mon_20CR_PCMDI_gn_187101-201212.nc\n", - "Downloading: 'obs4MIPs_PCMDI_monthly/MOHC/HadISST-1-1/mon/ts/gn/v20210727/ts_mon_HadISST-1-1_PCMDI_gn_187001-201907.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/obs4MIPs_PCMDI_monthly/MOHC/HadISST-1-1/mon/ts/gn/v20210727/ts_mon_HadISST-1-1_PCMDI_gn_187001-201907.nc\n", - "Downloading: 'obs4MIPs_PCMDI_daily/NASA-JPL/GPCP-1-3/day/pr/gn/latest/pr_day_GPCP-1-3_PCMDI_gn_19961002-20170101.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/obs4MIPs_PCMDI_daily/NASA-JPL/GPCP-1-3/day/pr/gn/latest/pr_day_GPCP-1-3_PCMDI_gn_19961002-20170101.nc\n", - "Downloading: 'misc_demo_data/atm/3hr/pr/pr_3hr_IPSL-CM5A-LR_historical_r1i1p1_5x5_1997-1999.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/misc_demo_data/atm/3hr/pr/pr_3hr_IPSL-CM5A-LR_historical_r1i1p1_5x5_1997-1999.nc\n", - "Downloading: 'misc_demo_data/fx/sftlf.GPCP-IP.1x1.nc' from 'https://pcmdiweb.llnl.gov/pss/pmpdata/' in: demo_data/misc_demo_data/fx/sftlf.GPCP-IP.1x1.nc\n", "All files downloaded\n" ] } @@ -128,6 +103,7 @@ "Preparing parameter file: basic_diurnal_fourier.py\n", "Preparing parameter file: basic_enso_param.py\n", "Preparing parameter file: basic_annual_cycle_param.py\n", + "Preparing parameter file: basic_extremes_param.py\n", "Preparing parameter file: basic_diurnal_std_hourly_mean.py\n", "Preparing parameter file: basic_diurnal_fourierAllGrid.py\n", "Preparing parameter file: basic_mov_param.py\n", @@ -166,7 +142,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.9.7" }, "selected_variables": [], "vcdat_file_path": "", diff --git a/doc/jupyter/Demo/Demo_8_extremes.ipynb b/doc/jupyter/Demo/Demo_8_extremes.ipynb new file mode 100644 index 000000000..20b261a38 --- /dev/null +++ b/doc/jupyter/Demo/Demo_8_extremes.ipynb @@ -0,0 +1,2282 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f7a56918", + "metadata": {}, + "source": [ + "# Extremes Metrics\n", + "\n", + "This notebook shows users how to run the PMP Extremes metrics driver. This driver can produce annual and seasonal block extremes and return values for temperature or precipitation data.\n", + "\n", + "This notebook should be run in an environment with python, jupyterlab, pcmdi metrics package, and cdat installed. It is expected that you have downloaded the sample data as demonstrated in the download notebook.\n" + ] + }, + { + "cell_type": "markdown", + "id": "c6687756", + "metadata": {}, + "source": [ + "The following cell reads in the choices you made during the download data step:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "42b45684", + "metadata": {}, + "outputs": [], + "source": [ + "from user_choices import demo_data_directory, demo_output_directory" + ] + }, + { + "cell_type": "markdown", + "id": "2e9dd07f", + "metadata": {}, + "source": [ + "## Create low resolution datasets" + ] + }, + { + "cell_type": "markdown", + "id": "4731d673", + "metadata": {}, + "source": [ + "This next cell creates very low resolution versions of the input datasets to speed up the demo. \n", + "\n", + "This step is for the purposes of this demo only. Do not follow this step when working with your own data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4a78e63d", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import xcdat as xc" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "13fba1ed", + "metadata": {}, + "outputs": [], + "source": [ + "# Set up sample data for demo \n", + "os.makedirs(os.path.join(demo_output_directory, \"extremes_tmp\"), exist_ok=True)\n", + " \n", + "def make_lower_resolution_model_data_for_demo(inpath: str, outpath: str, overwrite: bool=False):\n", + " if not os.path.isfile(outpath) or overwrite:\n", + " ds = xc.open_dataset(inpath)\n", + " out_grid = xc.create_uniform_grid(-90, 90, 10., 0.5, 360, 10.)\n", + " output_data = ds.regridder.horizontal(\"pr\", out_grid, tool=\"regrid2\")\n", + " output_data.to_netcdf(outpath, \"w\") \n", + "\n", + "# Make low resolution model data\n", + "inpath = os.path.join(demo_data_directory, \"CMIP5_demo_timeseries/historical/atmos/day/pr/pr_day_GISS-E2-H_historical_r6i1p1_20000101-20051231.nc\")\n", + "outpath = os.path.join(demo_output_directory, \"extremes_tmp/pr_day_GISS-E2-H_historical_r6i1p1_20000101-20051231.nc\")\n", + "make_lower_resolution_model_data_for_demo(inpath, outpath)\n", + "\n", + "# Make low resolution obs data\n", + "inpath = os.path.join(demo_data_directory, \"obs4MIPs_PCMDI_daily/NASA-JPL/GPCP-1-3/day/pr/gn/latest/pr_day_GPCP-1-3_PCMDI_gn_19961002-20170101.nc\")\n", + "outpath = os.path.join(demo_output_directory, \"extremes_tmp/pr_day_GPCP-1-3_PCMDI_gn_19961002-20170101.nc\")\n", + "make_lower_resolution_model_data_for_demo(inpath, outpath)" + ] + }, + { + "cell_type": "markdown", + "id": "e090f07d", + "metadata": {}, + "source": [ + "## Basic Use\n", + "\n", + "The PMP Extremes driver is controlled via a parameter file. The parameter file for this demo is shown here:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7439eab4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# Settings for extremes driver\n", + "\n", + "# These settings are required\n", + "vars = ['pr'] # Choices are 'pr','tasmax', 'tasmin'\n", + "test_data_set = ['GISS-E2-H']\n", + "realization = ['r6i1p1']\n", + "test_data_path = 'demo_output/extremes_tmp/'\n", + "filename_template = '%(variable)_day_%(model)_historical_%(realization)_20000101-20051231.nc'\n", + "metrics_output_path = 'demo_output/%(case_id)'\n", + "\n", + "# Note: You can use the following placeholders in file templates:\n", + "# %(variable) to substitute variable name from \"vars\" (except in sftlf filenames)\n", + "# %(model) to substitute model name from \"test_data_set\"\n", + "# %(realization) to substitute realization from \"realization\"\n", + "\n", + "# Optional settings\n", + "# See the README for more information about these settings\n", + "case_id = 'extremes_ex1'\n", + "#sftlf_filename_template = 'demo_data/CMIP5_demo_data/cmip5.historical.%(model).sftlf.nc'\n", + "\n", + "ModUnitsAdjust = (True,'multiply',86400.,'mm/day') # Convert model units from kg/m2/s to mm/day\n", + "ObsUnitsAdjust = (True,'multiply',86400.,'mm/day') # Convert obs units\n", + "dec_mode='JFD'\n", + "annual_strict = True\n", + "drop_incomplete_djf = True\n", + "regrid=False\n", + "plots=False\n", + "generate_sftlf = True\n", + "return_period = 2\n", + "\n" + ] + } + ], + "source": [ + "with open(\"basic_extremes_param.py\") as f:\n", + " print(f.read())" + ] + }, + { + "cell_type": "markdown", + "id": "f54dbc23", + "metadata": {}, + "source": [ + "#### How to run\n", + "\n", + "To run the extremes driver, use the following command in the terminal. This will generate a metrics file based on the models, observations, and other criteria in `basic_param.py`\n", + "```\n", + "extremes_driver.py -p basic_extremes_param.py\n", + "``` \n", + "\n", + "This driver takes daily data on a regular lat/lon grid. The input variables can be precipitation (pr), maximum daily temperature (tasmax), or minimum daily temperature (tasmin). \n", + "\n", + "In the next cell, bash cell magic is used to run the driver as a subprocess (this may take several minutes):" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "8adaf0fb", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO::2023-12-23 09:52::pcmdi_metrics:: Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex1/GISS-E2-H_block_extremes_metrics.json\n", + "2023-12-23 09:52:54,152 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex1/GISS-E2-H_block_extremes_metrics.json\n", + "2023-12-23 09:52:54,152 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex1/GISS-E2-H_block_extremes_metrics.json\n", + "INFO::2023-12-23 09:53::pcmdi_metrics:: Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex1/block_extremes_metrics.json\n", + "2023-12-23 09:53:09,441 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex1/block_extremes_metrics.json\n", + "2023-12-23 09:53:09,441 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex1/block_extremes_metrics.json\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1584: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:423: RuntimeWarning: overflow encountered in power\n", + " result = np.sum(np.log(scale) + y**(-1 / shape) + np.log(y)*(1/shape + 1))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1584: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1584: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1584: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1584: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1584: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1584: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1584: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:423: RuntimeWarning: overflow encountered in power\n", + " result = np.sum(np.log(scale) + y**(-1 / shape) + np.log(y)*(1/shape + 1))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1584: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:423: RuntimeWarning: overflow encountered in power\n", + " result = np.sum(np.log(scale) + y**(-1 / shape) + np.log(y)*(1/shape + 1))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:423: RuntimeWarning: overflow encountered in power\n", + " result = np.sum(np.log(scale) + y**(-1 / shape) + np.log(y)*(1/shape + 1))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:423: RuntimeWarning: overflow encountered in power\n", + " result = np.sum(np.log(scale) + y**(-1 / shape) + np.log(y)*(1/shape + 1))\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:423: RuntimeWarning: overflow encountered in power\n", + " result = np.sum(np.log(scale) + y**(-1 / shape) + np.log(y)*(1/shape + 1))\n", + "2023-10-19 16:00:57,855 [WARNING]: dataset.py(open_dataset:109) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1879: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1879: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1879: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1879: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1879: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "2023-10-19 16:00:58,459 [WARNING]: dataset.py(open_dataset:109) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1879: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/home/ordonez4/miniconda3/envs/pmp_climex_2/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1879: RuntimeWarning: Degrees of freedom <= 0 for slice.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:484: RuntimeWarning: invalid value encountered in sqrt\n", + " se = np.sqrt(np.diag(B))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Metrics output path not found.\n", + "Creating metrics output directory demo_output/extremes_ex1\n", + "No sftlf file found for GISS-E2-H r6i1p1\n", + "\n", + "-----------------------\n", + "model, run, variable: GISS-E2-H r6i1p1 pr\n", + "test_data (model in this case) full_path:\n", + " demo_output/extremes_tmp/pr_day_GISS-E2-H_historical_r6i1p1_20000101-20051231.nc\n", + "Generating land sea mask.\n", + "Generating precipitation block extrema.\n", + "Writing results to netCDF.\n", + "Generating metrics.\n", + "Generating return values.\n", + "demo_output/extremes_ex1/netcdf/GISS-E2-H_r6i1p1_land_Rx5day_2000-2005.nc\n", + "Return value for single realization\n", + "Stationary case\n", + "demo_output/extremes_ex1/netcdf/GISS-E2-H_r6i1p1_land_Rx1day_2000-2005.nc\n", + "Return value for single realization\n", + "Stationary case\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:484: RuntimeWarning: invalid value encountered in sqrt\n", + " se = np.sqrt(np.diag(B))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "2023-12-23 09:58:00,844 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 09:58:00,844 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "2023-12-23 09:58:02,050 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 09:58:02,050 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "INFO::2023-12-23 09:58::pcmdi_metrics:: Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex1/return_value_metrics.json\n", + "2023-12-23 09:58:19,524 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex1/return_value_metrics.json\n", + "2023-12-23 09:58:19,524 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex1/return_value_metrics.json\n" + ] + } + ], + "source": [ + "%%bash\n", + "extremes_driver.py -p basic_extremes_param.py" + ] + }, + { + "cell_type": "markdown", + "id": "99f3942e", + "metadata": {}, + "source": [ + "Running the mean climate driver produces an output json file in the demo output directory. The metrics are stored in the \"RESULTS\" object of the json. Since only one model was provided as input, the only metrics generated are the overall mean and spatial standard deviation of the time mean." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "3bd1bba7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"GISS-E2-H\": {\n", + " \"r6i1p1\": {\n", + " \"Rx1day\": {\n", + " \"land\": {\n", + " \"mean\": {\n", + " \"ANN\": 13.893658659590225,\n", + " \"DJF\": 9.31502969871792,\n", + " \"JJA\": 9.874547701271384,\n", + " \"MAM\": 9.673421213370716,\n", + " \"SON\": 10.26557454847975\n", + " },\n", + " \"std_xy\": {\n", + " \"ANN\": 5.945030862687258,\n", + " \"DJF\": 6.146237023726763,\n", + " \"JJA\": 5.5616445472124205,\n", + " \"MAM\": 5.691253427868338,\n", + " \"SON\": 4.706666979280209\n", + " }\n", + " }\n", + " },\n", + " \"Rx5day\": {\n", + " \"land\": {\n", + " \"mean\": {\n", + " \"ANN\": 8.671242963046646,\n", + " \"DJF\": 5.676891390638716,\n", + " \"JJA\": 6.3377633184316595,\n", + " \"MAM\": 5.979513632245038,\n", + " \"SON\": 6.398284822480362\n", + " },\n", + " \"std_xy\": {\n", + " \"ANN\": 4.360349983232101,\n", + " \"DJF\": 4.075258006799149,\n", + " \"JJA\": 4.252590359970838,\n", + " \"MAM\": 3.9340937638845,\n", + " \"SON\": 3.5241812625764277\n", + " }\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "import os\n", + "import json\n", + "output_path = os.path.join(demo_output_directory, \"extremes_ex1/GISS-E2-H_block_extremes_metrics.json\")\n", + "with open(output_path) as f:\n", + " metric = json.load(f)[\"RESULTS\"]\n", + "print(json.dumps(metric, indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "ba32a12e", + "metadata": {}, + "source": [ + "There is a also a JSON file containing metrics for the return values in the output directory. All of the model results are found in this file." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0600155d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"GISS-E2-H\": {\n", + " \"r6i1p1\": {\n", + " \"Rx1day\": {\n", + " \"land\": {\n", + " \"mean\": {\n", + " \"ANN\": 13.624745420109296,\n", + " \"DJF\": 9.135198382216965,\n", + " \"JJA\": 9.69544213448287,\n", + " \"MAM\": 9.494820971523852,\n", + " \"SON\": 10.085447982915195\n", + " },\n", + " \"std_xy\": {\n", + " \"ANN\": 5.84905794939727,\n", + " \"DJF\": 6.013623428632656,\n", + " \"JJA\": 5.727349593864466,\n", + " \"MAM\": 5.823259373316453,\n", + " \"SON\": 4.879802456134834\n", + " }\n", + " }\n", + " },\n", + " \"Rx5day\": {\n", + " \"land\": {\n", + " \"mean\": {\n", + " \"ANN\": 8.612002894301867,\n", + " \"DJF\": 5.639755083301711,\n", + " \"JJA\": 6.327901109603924,\n", + " \"MAM\": 5.881137864856613,\n", + " \"SON\": 6.4227782133202105\n", + " },\n", + " \"std_xy\": {\n", + " \"ANN\": 4.350524537048482,\n", + " \"DJF\": 4.133374175749511,\n", + " \"JJA\": 4.293717108920656,\n", + " \"MAM\": 3.970563425657647,\n", + " \"SON\": 3.6943723619808524\n", + " }\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "output_path = os.path.join(demo_output_directory, \"extremes_ex1/return_value_metrics.json\")\n", + "with open(output_path) as f:\n", + " metric = json.load(f)[\"RESULTS\"]\n", + "print(json.dumps(metric, indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "ffb61d87", + "metadata": {}, + "source": [ + "In addition, the Extremes Driver saves netcdf files containing the block extremes, the return values, and the standard error for the return values. The standard error can be used to calculate confidence intervals. These files can be found in a \"netcdf\" subfolder of the output directory, as demonstrated here:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "b6ebd1fc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "demo_output/extremes_ex1/netcdf/GISS-E2-H_r6i1p1_land_Rx1day_2000-2005.nc\n", + "demo_output/extremes_ex1/netcdf/GISS-E2-H_r6i1p1_land_Rx1day_2000-2005_return_value.nc\n", + "demo_output/extremes_ex1/netcdf/GISS-E2-H_r6i1p1_land_Rx1day_2000-2005_standard_error.nc\n", + "demo_output/extremes_ex1/netcdf/GISS-E2-H_r6i1p1_land_Rx5day_2000-2005.nc\n", + "demo_output/extremes_ex1/netcdf/GISS-E2-H_r6i1p1_land_Rx5day_2000-2005_return_value.nc\n", + "demo_output/extremes_ex1/netcdf/GISS-E2-H_r6i1p1_land_Rx5day_2000-2005_standard_error.nc\n" + ] + } + ], + "source": [ + "!ls {demo_output_directory + \"/extremes_ex1/netcdf/*.nc\"}" + ] + }, + { + "cell_type": "markdown", + "id": "54bbb78e", + "metadata": {}, + "source": [ + "## Customizing parameters in the extremes driver\n", + "\n", + "It is possible to override the parameter file from the command line. Use `pmp_extremes_driver.py --help` to see all the flag options. " + ] + }, + { + "cell_type": "markdown", + "id": "d6a22f0f", + "metadata": {}, + "source": [ + "### Reference data\n", + "\n", + "A reference data set (e.g. observations or a control run) can be provided to generate additional metrics. Each test data set will be compared to this reference. \n", + "\n", + "These are the parameters that control the reference data settings: \n", + "\n", + "--reference_data_path: The file path for the reference data set. \n", + "--reference_data_set: A short name for the reference data set. \n", + "--reference_sftlf_template: The file path for the reference land/sea mask (optional if --generate_sftlf = True). \n", + "--ObsUnitsAdjust: Tuple that controls obs units conversion (in this example, to mm/day). \n", + "\n", + "An example of using reference data is shown next:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "0b619de5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No reference sftlf file template provided.\n", + "\n", + "-----------------------\n", + "model, run, variable: Reference GPCP-1-3 pr\n", + "test_data (model in this case) full_path:\n", + " demo_output/extremes_tmp/pr_day_GPCP-1-3_PCMDI_gn_19961002-20170101.nc\n", + "Generating land sea mask.\n", + "Generating precipitation block extrema.\n", + "Writing results to netCDF.\n", + "No sftlf file found for GISS-E2-H r6i1p1\n", + "\n", + "-----------------------\n", + "model, run, variable: GISS-E2-H r6i1p1 pr\n", + "test_data (model in this case) full_path:\n", + " demo_output/extremes_tmp/pr_day_GISS-E2-H_historical_r6i1p1_20000101-20051231.nc\n", + "Generating land sea mask.\n", + "Generating precipitation block extrema.\n", + "Writing results to netCDF.\n", + "Generating metrics.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO::2023-12-23 09:59::pcmdi_metrics:: Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex2/GISS-E2-H_block_extremes_metrics.json\n", + "2023-12-23 09:59:11,868 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex2/GISS-E2-H_block_extremes_metrics.json\n", + "2023-12-23 09:59:11,868 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex2/GISS-E2-H_block_extremes_metrics.json\n", + "INFO::2023-12-23 09:59::pcmdi_metrics:: Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex2/block_extremes_metrics.json\n", + "2023-12-23 09:59:26,902 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex2/block_extremes_metrics.json\n", + "2023-12-23 09:59:26,902 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex2/block_extremes_metrics.json\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating return values.\n", + "demo_output/extremes_ex2/netcdf/Reference_GPCP-1-3_land_Rx5day_1996-2017.nc\n", + "Return value for single realization\n", + "Stationary case\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "demo_output/extremes_ex2/netcdf/Reference_GPCP-1-3_land_Rx1day_1996-2017.nc\n", + "Return value for single realization\n", + "Stationary case\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:484: RuntimeWarning: invalid value encountered in sqrt\n", + " se = np.sqrt(np.diag(B))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "demo_output/extremes_ex2/netcdf/GISS-E2-H_r6i1p1_land_Rx5day_2000-2005.nc\n", + "Return value for single realization\n", + "Stationary case\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:484: RuntimeWarning: invalid value encountered in sqrt\n", + " se = np.sqrt(np.diag(B))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "demo_output/extremes_ex2/netcdf/GISS-E2-H_r6i1p1_land_Rx1day_2000-2005.nc\n", + "Return value for single realization\n", + "Stationary case\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:484: RuntimeWarning: invalid value encountered in sqrt\n", + " se = np.sqrt(np.diag(B))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "2023-12-23 10:08:14,726 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 10:08:14,726 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 10:08:14,973 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 10:08:14,973 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "2023-12-23 10:08:22,427 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 10:08:22,427 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 10:08:22,575 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 10:08:22,575 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "2023-12-23 10:08:29,821 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 10:08:29,821 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 10:08:29,980 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 10:08:29,980 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "2023-12-23 10:08:36,321 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 10:08:36,321 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 10:08:36,452 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 10:08:36,452 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "INFO::2023-12-23 10:08::pcmdi_metrics:: Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex2/return_value_metrics.json\n", + "2023-12-23 10:08:58,977 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex2/return_value_metrics.json\n", + "2023-12-23 10:08:58,977 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex2/return_value_metrics.json\n" + ] + } + ], + "source": [ + "%%bash\n", + "extremes_driver.py -p basic_extremes_param.py \\\n", + "--case_id extremes_ex2 \\\n", + "--reference_data_path demo_output/extremes_tmp/pr_day_GPCP-1-3_PCMDI_gn_19961002-20170101.nc \\\n", + "--reference_data_set GPCP-1-3 \\\n", + "--generate_sftlf \\\n", + "--regrid True" + ] + }, + { + "cell_type": "markdown", + "id": "6019f0eb", + "metadata": {}, + "source": [ + "In this case, the results JSON contains more statistics." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "22886f3e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"GISS-E2-H\": {\n", + " \"r6i1p1\": {\n", + " \"Rx1day\": {\n", + " \"land\": {\n", + " \"bias_xy\": {\n", + " \"ANN\": -2.9638201041287924,\n", + " \"DJF\": -2.495281430585827,\n", + " \"JJA\": -0.2946765460481996,\n", + " \"MAM\": -1.5971789954641609,\n", + " \"SON\": -1.6977973313872894\n", + " },\n", + " \"cor_xy\": {\n", + " \"ANN\": 0.6837044814847419,\n", + " \"DJF\": 0.9684347121108853,\n", + " \"JJA\": 0.8459034898918713,\n", + " \"MAM\": 0.8129768025803042,\n", + " \"SON\": 0.8747028133107926\n", + " },\n", + " \"mae_xy\": {\n", + " \"ANN\": 4.685738060858886,\n", + " \"DJF\": 4.098482865854706,\n", + " \"JJA\": 3.189920892588137,\n", + " \"MAM\": 3.519019913781204,\n", + " \"SON\": 3.067846179868978\n", + " },\n", + " \"mean\": {\n", + " \"ANN\": 13.893658659590225,\n", + " \"DJF\": 9.31502969871792,\n", + " \"JJA\": 9.874547701271384,\n", + " \"MAM\": 9.673421213370716,\n", + " \"SON\": 10.26557454847975\n", + " },\n", + " \"pct_dif\": {\n", + " \"ANN\": -66.8082970235577,\n", + " \"DJF\": -80.28406965543556,\n", + " \"JJA\": -11.011054941202895,\n", + " \"MAM\": -53.84901064903107,\n", + " \"SON\": -53.926648100473614\n", + " },\n", + " \"rms_xy\": {\n", + " \"ANN\": 6.158825385201947,\n", + " \"DJF\": 5.5348495442351435,\n", + " \"JJA\": 4.457176775824264,\n", + " \"MAM\": 4.843059889942635,\n", + " \"SON\": 4.2149516325799965\n", + " },\n", + " \"rmsc_xy\": {\n", + " \"ANN\": 13.543723552492386,\n", + " \"DJF\": 10.006858144663193,\n", + " \"JJA\": 8.713505649340128,\n", + " \"MAM\": 9.479984080166622,\n", + " \"SON\": 9.622265181792287\n", + " },\n", + " \"std-obs_xy\": {\n", + " \"ANN\": 8.460047158200908,\n", + " \"DJF\": 6.663753740526669,\n", + " \"JJA\": 5.556742814616796,\n", + " \"MAM\": 6.022988998851917,\n", + " \"SON\": 6.280888402234044\n", + " },\n", + " \"std_xy\": {\n", + " \"ANN\": 5.945030862687258,\n", + " \"DJF\": 6.146237023726763,\n", + " \"JJA\": 5.5616445472124205,\n", + " \"MAM\": 5.691253427868338,\n", + " \"SON\": 4.706666979280209\n", + " }\n", + " }\n", + " },\n", + " \"Rx5day\": {\n", + " \"land\": {\n", + " \"bias_xy\": {\n", + " \"ANN\": -0.33917185914832654,\n", + " \"DJF\": -0.38991880664836837,\n", + " \"JJA\": 0.7233060324395061,\n", + " \"MAM\": 0.016367233863598916,\n", + " \"SON\": -0.05164734025943446\n", + " },\n", + " \"cor_xy\": {\n", + " \"ANN\": 0.7975986941318791,\n", + " \"DJF\": 1.0614730586402408,\n", + " \"JJA\": 0.9415359797200796,\n", + " \"MAM\": 0.9483063370862885,\n", + " \"SON\": 0.9365535144620619\n", + " },\n", + " \"mae_xy\": {\n", + " \"ANN\": 2.246793312811029,\n", + " \"DJF\": 1.944207191163086,\n", + " \"JJA\": 2.1452026697714044,\n", + " \"MAM\": 1.8653627522017895,\n", + " \"SON\": 1.6125921503923708\n", + " },\n", + " \"mean\": {\n", + " \"ANN\": 8.671242963046646,\n", + " \"DJF\": 5.676891390638716,\n", + " \"JJA\": 6.3377633184316595,\n", + " \"MAM\": 5.979513632245038,\n", + " \"SON\": 6.398284822480362\n", + " },\n", + " \"pct_dif\": {\n", + " \"ANN\": -14.303628094408946,\n", + " \"DJF\": -24.422209800808893,\n", + " \"JJA\": 48.953696182196545,\n", + " \"MAM\": 1.042968037591726,\n", + " \"SON\": -3.042734069238085\n", + " },\n", + " \"rms_xy\": {\n", + " \"ANN\": 3.1524699315330738,\n", + " \"DJF\": 2.8539928314777017,\n", + " \"JJA\": 2.9890377112319646,\n", + " \"MAM\": 2.5737013801878934,\n", + " \"SON\": 2.233005422299144\n", + " },\n", + " \"rmsc_xy\": {\n", + " \"ANN\": 7.341785199420232,\n", + " \"DJF\": 5.289257452710296,\n", + " \"JJA\": 5.052260285355741,\n", + " \"MAM\": 5.092112589680367,\n", + " \"SON\": 5.250734845752278\n", + " },\n", + " \"std-obs_xy\": {\n", + " \"ANN\": 4.678522874655352,\n", + " \"DJF\": 3.621532272277169,\n", + " \"JJA\": 3.2163523875175306,\n", + " \"MAM\": 3.33323565469098,\n", + " \"SON\": 3.488610711147975\n", + " },\n", + " \"std_xy\": {\n", + " \"ANN\": 4.360349983232101,\n", + " \"DJF\": 4.075258006799149,\n", + " \"JJA\": 4.252590359970838,\n", + " \"MAM\": 3.9340937638845,\n", + " \"SON\": 3.5241812625764277\n", + " }\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "import os\n", + "import json\n", + "output_path = os.path.join(demo_output_directory, \"extremes_ex2/GISS-E2-H_block_extremes_metrics.json\")\n", + "with open(output_path) as f:\n", + " metric = json.load(f)[\"RESULTS\"]\n", + "print(json.dumps(metric, indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "f229ed11", + "metadata": {}, + "source": [ + "Similarly, the return value metrics JSON shows more metrics comparing the model and observed return values." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "c86f0eb9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"GISS-E2-H\": {\n", + " \"r6i1p1\": {\n", + " \"Rx1day\": {\n", + " \"land\": {\n", + " \"bias_xy\": {\n", + " \"ANN\": -3.772317802925131,\n", + " \"DJF\": -2.8204298940888224,\n", + " \"JJA\": -0.7104342862321072,\n", + " \"MAM\": -2.0548532566379154,\n", + " \"SON\": -1.9267126342291894\n", + " },\n", + " \"cor_xy\": {\n", + " \"ANN\": 0.6953329102062709,\n", + " \"DJF\": 1.0144557369093798,\n", + " \"JJA\": 0.8717147420454912,\n", + " \"MAM\": 0.8570303881672487,\n", + " \"SON\": 0.8547260892720185\n", + " },\n", + " \"mae_xy\": {\n", + " \"ANN\": 5.212922565882905,\n", + " \"DJF\": 4.239025302742928,\n", + " \"JJA\": 3.511290894780589,\n", + " \"MAM\": 3.617308119033,\n", + " \"SON\": 3.422695495665447\n", + " },\n", + " \"mean\": {\n", + " \"ANN\": 13.624745420109296,\n", + " \"DJF\": 9.135198382216965,\n", + " \"JJA\": 9.69544213448287,\n", + " \"MAM\": 9.494820971523852,\n", + " \"SON\": 10.085447982915195\n", + " },\n", + " \"pct_dif\": {\n", + " \"ANN\": -82.39550400308971,\n", + " \"DJF\": -89.64252661175453,\n", + " \"JJA\": -25.94277517225058,\n", + " \"MAM\": -67.60553618236206,\n", + " \"SON\": -60.94905800323612\n", + " },\n", + " \"rms_xy\": {\n", + " \"ANN\": 6.799522859091312,\n", + " \"DJF\": 5.783533715648842,\n", + " \"JJA\": 4.849648962808867,\n", + " \"MAM\": 5.140713726278351,\n", + " \"SON\": 4.848500076949931\n", + " },\n", + " \"rmsc_xy\": {\n", + " \"ANN\": 14.011555296387773,\n", + " \"DJF\": 10.153746254129677,\n", + " \"JJA\": 9.044531409187776,\n", + " \"MAM\": 9.727692917047234,\n", + " \"SON\": 9.906336169092766\n", + " },\n", + " \"std-obs_xy\": {\n", + " \"ANN\": 5.84905794939727,\n", + " \"DJF\": 6.013623428632656,\n", + " \"JJA\": 5.727349593864466,\n", + " \"MAM\": 5.823259373316453,\n", + " \"SON\": 4.879802456134834\n", + " },\n", + " \"std_xy\": {\n", + " \"ANN\": 5.84905794939727,\n", + " \"DJF\": 6.013623428632656,\n", + " \"JJA\": 5.727349593864466,\n", + " \"MAM\": 5.823259373316453,\n", + " \"SON\": 4.879802456134834\n", + " }\n", + " }\n", + " },\n", + " \"Rx5day\": {\n", + " \"land\": {\n", + " \"bias_xy\": {\n", + " \"ANN\": -0.6689568518426141,\n", + " \"DJF\": -0.4649576550476801,\n", + " \"JJA\": 0.4432814449040144,\n", + " \"MAM\": -0.28804918489369696,\n", + " \"SON\": -0.09186559287153301\n", + " },\n", + " \"cor_xy\": {\n", + " \"ANN\": 0.7897175107203418,\n", + " \"DJF\": 1.0432040182169595,\n", + " \"JJA\": 0.9568041308531043,\n", + " \"MAM\": 0.9744603276841419,\n", + " \"SON\": 0.9256014276768241\n", + " },\n", + " \"mae_xy\": {\n", + " \"ANN\": 2.43575621494916,\n", + " \"DJF\": 2.1275398910641865,\n", + " \"JJA\": 2.24245804570134,\n", + " \"MAM\": 1.9322676715282434,\n", + " \"SON\": 1.8028077830317968\n", + " },\n", + " \"mean\": {\n", + " \"ANN\": 8.612002894301867,\n", + " \"DJF\": 5.639755083301711,\n", + " \"JJA\": 6.327901109603924,\n", + " \"MAM\": 5.881137864856613,\n", + " \"SON\": 6.4227782133202105\n", + " },\n", + " \"pct_dif\": {\n", + " \"ANN\": -27.389014158119508,\n", + " \"DJF\": -28.941387809171086,\n", + " \"JJA\": 28.624132739473623,\n", + " \"MAM\": -17.742299067561806,\n", + " \"SON\": -5.358378529994827\n", + " },\n", + " \"rms_xy\": {\n", + " \"ANN\": 3.3983206619821558,\n", + " \"DJF\": 3.1274141776424766,\n", + " \"JJA\": 3.141553282208936,\n", + " \"MAM\": 2.630126131170074,\n", + " \"SON\": 2.522403251893798\n", + " },\n", + " \"rmsc_xy\": {\n", + " \"ANN\": 7.607010019233525,\n", + " \"DJF\": 5.458755205252023,\n", + " \"JJA\": 5.336073364645669,\n", + " \"MAM\": 5.243825916009218,\n", + " \"SON\": 5.4218208680489575\n", + " },\n", + " \"std-obs_xy\": {\n", + " \"ANN\": 4.350524537048482,\n", + " \"DJF\": 4.133374175749511,\n", + " \"JJA\": 4.293717108920656,\n", + " \"MAM\": 3.970563425657647,\n", + " \"SON\": 3.6943723619808524\n", + " },\n", + " \"std_xy\": {\n", + " \"ANN\": 4.350524537048482,\n", + " \"DJF\": 4.133374175749511,\n", + " \"JJA\": 4.293717108920656,\n", + " \"MAM\": 3.970563425657647,\n", + " \"SON\": 3.6943723619808524\n", + " }\n", + " }\n", + " }\n", + " }\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "import os\n", + "import json\n", + "output_path = os.path.join(demo_output_directory, \"extremes_ex2/return_value_metrics.json\")\n", + "with open(output_path) as f:\n", + " metric = json.load(f)[\"RESULTS\"]\n", + "print(json.dumps(metric, indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "9d024265", + "metadata": {}, + "source": [ + "### Saving additional output" + ] + }, + { + "cell_type": "markdown", + "id": "fcf1f210", + "metadata": {}, + "source": [ + "Along with the JSON file of metrics, this driver can also produce a set of diagnostic plots and save the block extrema data as netcdf files. \n", + "\n", + "To save the netcdf files, use the flag \"--nc_out\" on the command line or nc_out = True in the parameter file. \n", + "To generate plots, use the flag \"--plots\" on the command line or plots = True in the parameter file.\n", + "\n", + "The diagnostics plots will always display a world map. If a reference data set is included, Taylor Diagrams will be produced for each model. Users can access the same underlying data in the output netcdf files and metrics JSONs to generate their own visualizations.\n", + "\n", + "The next cell demonstrates these flags." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "a14ccb13", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No sftlf file found for GISS-E2-H r6i1p1\n", + "\n", + "-----------------------\n", + "model, run, variable: GISS-E2-H r6i1p1 pr\n", + "test_data (model in this case) full_path:\n", + " demo_output/extremes_tmp/pr_day_GISS-E2-H_historical_r6i1p1_20000101-20051231.nc\n", + "Generating land sea mask.\n", + "Generating precipitation block extrema.\n", + "Writing results to netCDF.\n", + "Creating maps\n", + "Generating metrics.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO::2023-12-23 10:09::pcmdi_metrics:: Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex3/GISS-E2-H_block_extremes_metrics.json\n", + "2023-12-23 10:09:43,553 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex3/GISS-E2-H_block_extremes_metrics.json\n", + "2023-12-23 10:09:43,553 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex3/GISS-E2-H_block_extremes_metrics.json\n", + "INFO::2023-12-23 10:09::pcmdi_metrics:: Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex3/block_extremes_metrics.json\n", + "2023-12-23 10:09:59,431 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex3/block_extremes_metrics.json\n", + "2023-12-23 10:09:59,431 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex3/block_extremes_metrics.json\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating return values.\n", + "demo_output/extremes_ex3/netcdf/GISS-E2-H_r6i1p1_land_Rx5day_2000-2005.nc\n", + "Return value for single realization\n", + "Stationary case\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:484: RuntimeWarning: invalid value encountered in sqrt\n", + " se = np.sqrt(np.diag(B))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "demo_output/extremes_ex3/netcdf/GISS-E2-H_r6i1p1_land_Rx1day_2000-2005.nc\n", + "Return value for single realization\n", + "Stationary case\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:484: RuntimeWarning: invalid value encountered in sqrt\n", + " se = np.sqrt(np.diag(B))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "2023-12-23 10:14:29,933 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 10:14:29,933 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "2023-12-23 10:14:30,960 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 10:14:30,960 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "INFO::2023-12-23 10:14::pcmdi_metrics:: Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex3/return_value_metrics.json\n", + "2023-12-23 10:14:47,566 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex3/return_value_metrics.json\n", + "2023-12-23 10:14:47,566 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex3/return_value_metrics.json\n" + ] + } + ], + "source": [ + "%%bash\n", + "extremes_driver.py -p basic_extremes_param.py --case_id \"extremes_ex3\" --plots" + ] + }, + { + "cell_type": "markdown", + "id": "d75ded77", + "metadata": {}, + "source": [ + "The plots and netcdf files can be found in the output directory. The next cell will display the map. The contours are rough on this map because this demo uses data with very low spatial resolution." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "43ef81af", + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import Image\n", + "from IPython.core.display import HTML " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "d871e429", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image\n", + "from IPython.core.display import HTML \n", + "\n", + "Image(filename = demo_output_directory + \"/extremes_ex3/plots/maps/GISS-E2-H_r6i1p1_land_Rx1day_ANN.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "d4c301a2", + "metadata": {}, + "source": [ + "### Nonstationary Return Values" + ] + }, + { + "cell_type": "markdown", + "id": "d9b5f9ba", + "metadata": {}, + "source": [ + "The examples in this notebook produce return values assuming that the data is stationary in time. The Extremes Driver also has an option to produce nonstationary return values for model data only.\n", + "\n", + "To generate nonstationary return values, the user must provide two variables:\n", + "\n", + "--covariate_path: Path to covariate time series netcdf file. The only dimension should be time, in years (with time bounds). \n", + "--covariate: Name of covariate variable in file given by --covariate_path. \n", + "\n", + "\n", + "This static example would run the driver with a covariate file \"covariate_file.nc\" that contains the variable \"mole_fraction_or_carbon_dioxide_in_air\":\n", + "\n", + "```\n", + "extremes_driver.py -p basic_extremes_param.py --covariate_path ./covariate_file.nc --covariate \"mole_fraction_of_carbon_dioxide_in_air\"\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "543b0373", + "metadata": {}, + "source": [ + "### Regional metrics" + ] + }, + { + "cell_type": "markdown", + "id": "a6dcd691", + "metadata": {}, + "source": [ + "Users can define a custom region over which to calculate the extremes metrics. There are two way to do this.\n", + "\n", + "#### Coordinate method\n", + "\n", + "The first method is to provide coordinate pairs that define a contiguous region. This region does not have to be rectangular, but it cannot have holes. \n", + "\n", + "The following example provides lon/lat pairs that define the western hemisphere. The region name flag \"--region_name\" is optional in this case.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "36771ecb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Region settings are:\n", + " Coordinates: [[180.0, -90.0], [360.0, -90.0], [360.0, 90.0], [180.0, 90.0]]\n", + " Region name: WestHemi\n", + "\n", + "Metrics output path not found.\n", + "Creating metrics output directory demo_output/extremes_ex4\n", + "No sftlf file found for GISS-E2-H r6i1p1\n", + "\n", + "-----------------------\n", + "model, run, variable: GISS-E2-H r6i1p1 pr\n", + "test_data (model in this case) full_path:\n", + " demo_output/extremes_tmp/pr_day_GISS-E2-H_historical_r6i1p1_20000101-20051231.nc\n", + "Generating land sea mask.\n", + "\n", + "Creating sftlf region mask.\n", + "Creating dataset mask.\n", + "Generating precipitation block extrema.\n", + "Writing results to netCDF.\n", + "Creating maps\n", + "Generating metrics.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO::2023-12-23 10:15::pcmdi_metrics:: Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex4/GISS-E2-H_block_extremes_metrics.json\n", + "2023-12-23 10:15:25,709 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex4/GISS-E2-H_block_extremes_metrics.json\n", + "2023-12-23 10:15:25,709 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex4/GISS-E2-H_block_extremes_metrics.json\n", + "INFO::2023-12-23 10:15::pcmdi_metrics:: Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex4/block_extremes_metrics.json\n", + "2023-12-23 10:15:40,415 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex4/block_extremes_metrics.json\n", + "2023-12-23 10:15:40,415 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex4/block_extremes_metrics.json\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Generating return values.\n", + "demo_output/extremes_ex4/netcdf/GISS-E2-H_r6i1p1_WestHemi_Rx5day_2000-2005.nc\n", + "Return value for single realization\n", + "Stationary case\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "demo_output/extremes_ex4/netcdf/GISS-E2-H_r6i1p1_WestHemi_Rx1day_2000-2005.nc\n", + "Return value for single realization\n", + "Stationary case\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1583: RuntimeWarning: All-NaN slice encountered\n", + " result = np.apply_along_axis(_nanquantile_1d, axis, a, q,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:401: RuntimeWarning: overflow encountered in exp\n", + " result = np.sum(n * np.log(scale) + y + np.exp(-y))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:484: RuntimeWarning: invalid value encountered in sqrt\n", + " se = np.sqrt(np.diag(B))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numdifftools/limits.py:150: UserWarning: All-NaN slice encountered\n", + " warnings.warn(str(msg))\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/pcmdi_metrics/extremes/lib/return_value.py:409: RuntimeWarning: overflow encountered in power\n", + " np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1)\n", + "2023-12-23 10:17:07,225 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 10:17:07,225 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "2023-12-23 10:17:08,197 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "2023-12-23 10:17:08,197 [WARNING]: dataset.py(open_dataset:128) >> \"No time coordinates were found in this dataset to decode. If time coordinates were expected to exist, make sure they are detectable by setting the CF 'axis' or 'standard_name' attribute (e.g., ds['time'].attrs['axis'] = 'T' or ds['time'].attrs['standard_name'] = 'time'). Afterwards, try decoding again with `xcdat.decode_time`.\"\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "/Users/lee1043/mambaforge/envs/pmp_devel_20231129/lib/python3.10/site-packages/numpy/lib/nanfunctions.py:1878: RuntimeWarning: Degrees of freedom <= 0 for slice.\n", + " var = nanvar(a, axis=axis, dtype=dtype, out=out, ddof=ddof,\n", + "INFO::2023-12-23 10:17::pcmdi_metrics:: Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex4/return_value_metrics.json\n", + "2023-12-23 10:17:26,185 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex4/return_value_metrics.json\n", + "2023-12-23 10:17:26,185 [INFO]: base.py(write:251) >> Results saved to a json file: /Users/lee1043/Documents/Research/git/pcmdi_metrics_20230620_pcmdi/pcmdi_metrics/doc/jupyter/Demo/demo_output/extremes_ex4/return_value_metrics.json\n" + ] + } + ], + "source": [ + "%%bash\n", + "extremes_driver.py -p basic_extremes_param.py \\\n", + "--case_id \"extremes_ex4\" \\\n", + "--plots \\\n", + "--region_name \"WestHemi\" \\\n", + "--coords [[180,-90],[360,-90],[360,90],[180,90]]" + ] + }, + { + "cell_type": "markdown", + "id": "4488c7ce", + "metadata": {}, + "source": [ + "Viewing the automatic plots verifies that the region of interest has been used. Again, the contours will look rough because of the low spatial resolution of the demo data." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "aa7cbc57", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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ujJjxoxhPyvjzzE4OJi2traMHTs206dPH1ZfRqvVatra2vLzn/88O3bsyK5du7J58+bavJMpU6Zk4cKFWbx4ce2m7wsuuCAXX3xxbR7Htm3b8tJLL2XevHnZvn17jhw5kuuuuy7bt2/PL37xi3R3d6enpyfVajXXXnttrrvuuixevDjTp0/PtGnTMnny5Hf0nJ26j+WUT37yk2lpacmFF16YKVOmZNy4camvr8+oUaNSX1+fq6++OhdccPpBYu/1Odu/f38GBwcza9asM/7M1/vpd7/7XTo6OjJlypS88MILefLJJ7Ns2bLaZPCR9r7fs2dP1q1bl+9973t5/fXXc9ttt2XNmjW55pprzqrX/Wx17NixTJ48Oa++9HKq1Wouu/Iv093dPSzu+/ugCRA4Q/X29mb9+vVZt25dfvzjH+eKK67IqlWrcssttwzLZTrfqUqlkrq6uhw/fjyHDh3KlClTzooP64GBgbS1tWX69OkZN27cUG/Oe9LW1paf/OQn6erqSmdnZ5599tm0trZm2rRpmTZtWnp7e7N79+50dXVlzJgxtQFvv/nNbzJ37txMnDgxL774Ypqbm7N8+fI0NjZm0qRJ6evry3PPPZetW7f+0fX95513Xj70oQ9lzpw5mTx5ciZOnJhJkyalUqmko6MjHR0d6evry/jx47N3794cPnw4R48eTUdHx5/cj29+85tvO7zu3Thy5Eg6Ozsze/bsIVnut7Rjx46lq6srU6dOzZgxY1KtVkf0l+/9+/fnsccey7p16/LKK6+kpaUlq1atysqVK4ftIgO8ey3LluemG/8q1Wo1//lfm/PUM08P9SadEQQIDAOdnZ154oknsm7duvzsZz/L0qVL85nPfCYrVqzIzJkzh3rzPhADAwN566230t3dnfHjx58VIXJqjsaJEycyevToYXUm5N3o6enJzp07kySXX375H9371NfXlzFjxpz2ORgYGEhra2sOHjyYgwcPpq2tLbt3705bW1sOHz6cw4cPp6enJ8nJmRoXXXRRxo0blyNHjtSW3D106FDa29tTqVRqj/uHNyNfeumleeCBB952MvGfo1qtpr+/v/YlfKS/vqfC49RR4IaGhhEbXK2trdm4cWN+8IMfZOvWrVmyZEk+97nP5eabb05DQ8NQbx5D6P77788Lzz2farWa6264Pvfcc89Qb9IZQYDAMLNv37488cQT2bhxY7Zs2ZLLL788K1euzIoVKzJ//vwR96VmYGAghw4dyrnnnpuJEyfm+PHjGTt27Ijbz1Oq1WpaW1uH5eVY70bJe0BO928fPHgwkydP/kAutfpDlUolBw4cyMDAQGbPnj1iX9dqtZq+vr6ce+656e7uTn9/fxoaGkbcwhrVajXbtm3Lhg0bsmHDhmzfvj1Lly7NypUrc/PNN5vZQc2rr76aa665JtVqNVu3bj1r7u18OwIEhrGurq5s2rQpGzZsyFNPPZXGxsYsX748LS0tueGGGzJlypSh3sT3VaVSyZ49e1JfX59JkyZlwoQJI/KIan9/f9rb23POOeekqalpRO7jKUMZIKUMDAxk//79SU7eZD0SX8+BgYH09vbW7tWZO3fuiIusjo6O/OhHP8rTTz+dZ555Jr29vfn0pz+dlStX5sYbbzwrB8zy9iqVSm1J5wMHDoy498W7JUBghDh27Fi2bNlS++X461//OnPnzj3t9N/hrlKp1C6dGWlHVv/Q4OBg6urqRvT18snJQZ0j+fK6UwPyRmJ4nDIwMJC6uroR+//1xIkT2bt3by677LK0tLRk+fLlueqqq97XS/QYuf7+b/8udXV1eeBfHxzqTTljCBAYoTo6OvLqq6/GWxzgvRk1alQuu+yyEXdWGYaKAAEAAIoZeedJAQCAM5YAAQAAihEgAABAMQIEAAAoRoAAAADFCBAAAKAYAQIAABQjQAAAgGIECAAAUIwAAQAAihEgAABAMQIEAAAoRoAAAADFCBAAAKAYAQIAABQjQAAAgGIECAAAUIwAAQAAihEgAABAMQIEAAAoRoAAAADFCBAAAKAYAQIAABQjQAAAgGIECAAAUIwAAQAAihEgAABAMQIEAAAoRoAAAADFCBAAAKAYAQIAABQjQAAAgGIECAAAUIwAAQAAihEgAABAMQIEAAAoRoAAAADFCBAAAKAYAQIAABQjQAAAgGIECAAAUIwAAQAAihEgAABAMQIEAAAoRoAAAADFCBAAAKAYAQIAABQjQAAAgGIECAAAUIwAAQAAihEgAABAMQIEAAAoRoAAAADFCBAAAKAYAQIAABQjQAAAgGIECAAAUIwAAQAAihEgAABAMQIEAAAoRoAAAADFCBAAAKAYAQIAABQjQAAAgGIECAAAUIwAAQAAihEgAABAMQIEAAAoRoAAAADFCBAAAKAYAQIAABQjQAAAgGIECAAAUIwAAQAAihEgAABAMQIEAAAoRoAAAADFCBAAAKAYAQIAABQjQAAAgGIECAAAUIwAAQAAihEgAABAMQIEAAAoRoAAAADFCBAAAKAYAQIAABQjQAAAgGIECAAAUIwAAQAAihEgAABAMQIEAAAoRoAAAADFCBAAAKAYAQIAABQjQAAAgGIECAAAUIwAAQAAihEgAABAMQIEAAAoRoAAAADFCBAAAKAYAQIAABQjQAAAgGIECAAAUIwAAQAAihEgAABAMQIEAAAoRoAAAADFCBAAAKAYAQIAABQjQAAAgGIECAAAUIwAAQAAihEgAABAMQIEAAAoRoAAAADFCBAAAKAYAQIAABQjQAAAgGIECAAAUIwAAQAAihEgAABAMQIEAAAoRoAAAADFCBAAAKAYAQIAABQjQAAAgGIECAAAUIwAAQAAihEgAABAMQIEAAAoRoAAAADF/Dd2gaCXyHD/EQAAAABJRU5ErkJggg==", + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image\n", + "from IPython.core.display import HTML \n", + "\n", + "Image(filename = demo_output_directory + \"/extremes_ex4/plots/maps/GISS-E2-H_r6i1p1_WestHemi_Rx1day_ANN.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "54cedea7", + "metadata": {}, + "source": [ + "#### Shapefile method\n", + "The second method is to provide a shapefile containing the region of interest. The region of interest must be completely defined by a single, uniquely identifiable feature in the shapefile. For example, if the region of interest is the fifty states of the USA, there must be a single feature in the shapefile that contains all the land areas of all fifty states. The --region_name flag is required in this case.\n", + "\n", + "--shp_path is the path of the shapefile containing your region \n", + "--region_name must match the name of your region as recorded under the shapefile attribute \"--attribute\"\n", + "\n", + "Here is a static example of a command to get metrics for a region called \"CANADA\" under the \"COUNTRY\" attribute in a shapefile called \"world_countries.shp\": \n", + "```\n", + "extremes_driver.py -p basic_extremes_param.py --shp_path world_countries.shp --attribute \"COUNTRY\" --region_name \"CANADA\"\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "54feec95", + "metadata": {}, + "source": [ + "## Other options\n", + "\n", + "Consult the [README file]() for the extremes metrics to find the full set of user options. " + ] + }, + { + "cell_type": "markdown", + "id": "6dcbcd5b", + "metadata": {}, + "source": [ + "## Clean up\n", + "\n", + "Run this cell to delete the low resolution datasets we created at the start of this demo." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "40e73627", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash -s \"$demo_output_directory\"\n", + "rm -r $1/extremes_tmp" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e8ff050a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:pmp_climex_2] *", + "language": "python", + "name": "conda-env-pmp_climex_2-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/doc/jupyter/Demo/basic_extremes_param.py.in b/doc/jupyter/Demo/basic_extremes_param.py.in new file mode 100644 index 000000000..a1bb3703c --- /dev/null +++ b/doc/jupyter/Demo/basic_extremes_param.py.in @@ -0,0 +1,29 @@ +# Settings for extremes driver + +# These settings are required +vars = ['pr'] # Choices are 'pr','tasmax', 'tasmin' +test_data_set = ['GISS-E2-H'] +realization = ['r6i1p1'] +test_data_path = '$OUTPUT_DIR$/extremes_tmp/' +filename_template = '%(variable)_day_%(model)_historical_%(realization)_20000101-20051231.nc' +metrics_output_path = '$OUTPUT_DIR$/%(case_id)' + +# Note: You can use the following placeholders in file templates: +# %(variable) to substitute variable name from "vars" (except in sftlf filenames) +# %(model) to substitute model name from "test_data_set" +# %(realization) to substitute realization from "realization" + +# Optional settings +# See the README for more information about these settings +case_id = 'extremes_ex1' +#sftlf_filename_template = 'demo_data/CMIP5_demo_data/cmip5.historical.%(model).sftlf.nc' + +ModUnitsAdjust = (True,'multiply',86400.,'mm/day') # Convert model units from kg/m2/s to mm/day +ObsUnitsAdjust = (True,'multiply',86400.,'mm/day') # Convert obs units +dec_mode='JFD' +annual_strict = True +drop_incomplete_djf = True +regrid=False +plots=False +generate_sftlf = True +return_period = 2 diff --git a/pcmdi_metrics/extremes/README.md b/pcmdi_metrics/extremes/README.md new file mode 100644 index 000000000..ecdda520a --- /dev/null +++ b/pcmdi_metrics/extremes/README.md @@ -0,0 +1,105 @@ +# PMP Extremes Metrics + +## Inputs + +The Extremes Driver works on daily gridded climate data. This package expects input netcdf files to be cf-compliant and on regular latitude/longitude grids. X and Y dimensions must be named "lon" and "lat", and the time dimension must be named "time". The input variables must be called "tasmax", "tasmin", or "pr". Input files must contain lat, lon, and time bounds. + +### Reference data +A reference (observation) input is not required, but it is necessary to create (optional) Taylor Diagrams. Reference data sets must follow the above rules for variable names and bounds. + +### Land/sea mask +Block extrema and return values will only be generated over land areas, so a land/sea mask is required for all datasets. Land is defined as grid cells where the land area percentage is between 50 and 100. Areas south of 50S will be masked out. + +If available, users should provide the land/sea mask that accompanies their datasets. The mask variable in the land/sea mask file must be called "sftlf". If land/sea masks are scaled from 0-1, they will be rescaled to 0-100 on-the-fly. If land/sea masks are not provided, there is an option to generate them on-the-fly using pcmdi_utils. See "Other Parameters" for more information. + +### Covariate data and stationarity +The extremes driver can produce nonstationary return values for model-only runs. To generate nonstationary return values, users must provide a covariate file path and name (see "Other Parameters" for these settings). If no covariate file is provided, the Extremes Driver will generate stationary return values. + +The covariate file must contain an annual time series of the covariate variable. Covariate data must be provided in a netcdf file with time bounds included. The covariate time dimension must either 1) be exactly the same length in years as the input data, or 2) overlap in years with the input data time dimension. It is recommended that a log transformation be applied to nonlinear time series such as recent carbon dioxide values. + +### Other options +See the "Other Parameters" table for options to select a year range, convert units, and control regridding. + +## Run + +To run the extremes metrics, use the following command format in a PMP environment: +```extremes_driver.py -p parameter_file --other_params``` + +## Outputs +The outputs will be written to a single directory. This directory will be created by the driver if it does not already exist. Otherwise, the output directory should be empty before the driver starts. The name of the output directory is controlled by the `metrics_output_path` and `case_id` parameters. + +This script will produce metrics JSONs, netcdf files, and figures (optional). There will be netcdf files containing block max/min values for temperature and/or precipitation, along with return value and standard error files. A metadata file called "output.json" will be generated with more detailed information about the files in the output bundle. Return value statistics will be provided for stationary return values only. + +All netcdf files will contain data for 5 time periods: Annual ("ANN"), DJF, MAM, JJA, and SON. Data is masked to be over land only (50<=sftlf<=100). Antarctica is excluded. + +If multiple realizations are provided for a single model, a single return value file will be produced for that model which makes use of all provided realizations in the return value computation. + +A demo is provided to show users how to generate a portrait plot of the bias in return values in ../graphics/portrait_plot/return_value_portrait_plot_demo.ipynb. + +### Metrics +Metrics are produced to describe the time mean extrema values, along with spatial statistics comparing the mean model field to mean observed field. Metrics are output for Annual, DJF, MAM, JJA, and SON seasons. +Model only: "mean", "std_xy" +If reference dataset is available: "mean", "std_xy", "std-obs_xy", "pct_dif", "bias_xy", "cor_xy", "mae_xy", "rms_xy", "rmsc_xy" + +## Regional Analysis + +You can either use a region from a shapefile or provide coordinate pairs that define the region. Consult the parameters section for more information. + +## Parameters + +### Shapefile + +| Parameter | Definition | +--------------|------------- +| shp_path | (str) path to shapefile. | +| attribute | (str) Attribute used to identify region (eg, column of attribute table). For example, "COUNTRY" in a shapefile of countries. | +| region_name | (str) Unique feature value of the region that occurs in the attribute given by "--attribute". Must match only one geometry in the shapefile. An example is "NORTH_AMERICA" under the attribute "CONTINENTS". | + +### Coordinates +| Parameter | Definition | +--------------|------------- +| coords | (list) Coordinate lat/lon pair lists. The coordinate must be listed in consecutive order, as they would occur when walking the perimeter of the bounding shape. Does not need to be a box, but cannot have holes. For example [[lat1,lon1],[lat1,lon2],[lat2,lon2],[lat2,lon1]]. | +| region_name | (str) Name of region. Default is "custom". | + +## Time series settings + +| Parameter | Definition | +--------------|------------- +| dec_mode | (str) Toggle how season containing December, January, and February is defined. "DJF" or "JFD". Default "DJF". | +| annual_strict | (bool) This only matters for Rx5day. If True, only use data from within a given year in the 5-day means. If False, the rolling mean will include the last 4 days of the prior year. Default False. | +| drop_incomplete_djf | (bool) If True, don't include data from the first January/February and last December in the analysis. Default False. | + +## Other parameters +| Parameter | Definition | +--------------|------------- +| case_id | (str) Will be appended to the metrics_output_path if present. | +| model_list | (list) List of model names. | +| realization | (list) List of realizations. | +| vars | (list) List of variables: "pr", "tasmax", and/or "tasmin". | +| filename_template | (str) The template for the model file name. May contain placeholders %(variable), %(model), %(model_version), or %(realization) | +| test_data_path | (str) The template for the directory containing the model file. May contain placeholders %(variable), %(model), %(model_version), or %(realization) | +| sftlf_filename_template | (str) The template for the model land/sea mask file. May contain placeholders %(model), %(model_version), or %(realization). Takes precedence over --generate_sftlf | +| generate_sftlf | (bool) If true, generate a land/sea mask on the fly when the model or reference land/sea mask is not found. If false, skip datasets when land/sea mask is not found. | +| reference_data_path | (str) The full path of the reference data file. | +| reference_data_set | (str) The short name of the reference datas set for labeling output files. | +| reference_sftlf_template | (str) The full path of the reference data set land/sea mask. | +| metrics_output_path | (str) The directory to write output files to. | +| covariate_path | (str) File path of covariate timeseries netcdf. | +| covariate | (str) Name of covariate variable in file given by --covariate_path. | +| plots | (bool) True to save world map figures of mean metrics. | +| debug | (bool) True to use debug mode. | +| msyear | (int) Start year for model data set. | +| meyear | (int) End year for model data set. | +| osyear | (int) Start year for reference data set. | +| oeyear | (int) End year for model data set. | +| regrid | (bool) Set to False to skip regridding if all datasets are on the same grid. Default True. | +| ModUnitsAdjust | (tuple) Provide information for units conversion. Uses format (flag (bool), operation (str), value (float), new units (str)). Operation can be "add", "subtract", "multiply", or "divide". For example, use (True, 'multiply', 86400, 'mm/day') to convert kg/m2/s to mm/day.| +| ObsUnitsAdjust | (tuple) Similar to ModUnitsAdjust, but for reference dataset. | + +## Extreme value analysis details + +For this driver, we have implemented the Generalized Extreme Value analysis in pure Python. The return value results may vary from those obtained with the R climextRemes package, which was used to conduct the return value analysis in Wehner, Gleckler, and Lee (2000). In the nonstationary case, the GEV location parameter is linearly dependent on the covariate. + +## References + +Michael Wehner, Peter Gleckler, Jiwoo Lee, 2020: Characterization of long period return values of extreme daily temperature and precipitation in the CMIP6 models: Part 1, model evaluation, Weather and Climate Extremes, 30, 100283, https://doi.org/10.1016/j.wace.2020.100283. diff --git a/pcmdi_metrics/extremes/__init__.py b/pcmdi_metrics/extremes/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pcmdi_metrics/extremes/extremes_driver.py b/pcmdi_metrics/extremes/extremes_driver.py new file mode 100644 index 000000000..3c7b8e952 --- /dev/null +++ b/pcmdi_metrics/extremes/extremes_driver.py @@ -0,0 +1,646 @@ +#!/usr/bin/env python +import glob +import json +import os + +import xcdat + +from pcmdi_metrics.extremes.lib import ( + compute_metrics, + create_extremes_parser, + metadata, + plot_extremes, + region_utilities, + return_value, + utilities, +) + +########## +# Set up +########## + +parser = create_extremes_parser.create_extremes_parser() +parameter = parser.get_parameter(argparse_vals_only=False) + +# Parameters +# I/O settings +case_id = parameter.case_id +model_list = parameter.test_data_set +realization = parameter.realization +variable_list = parameter.vars +filename_template = parameter.filename_template +sftlf_filename_template = parameter.sftlf_filename_template +test_data_path = parameter.test_data_path +reference_data_path = parameter.reference_data_path +reference_data_set = parameter.reference_data_set +reference_sftlf_template = parameter.reference_sftlf_template +metrics_output_path = parameter.metrics_output_path +ModUnitsAdjust = parameter.ModUnitsAdjust +ObsUnitsAdjust = parameter.ObsUnitsAdjust +# nc_out = parameter.nc_out +nc_out = True +plots = parameter.plots +debug = parameter.debug +cmec = parameter.cmec +msyear = parameter.msyear +meyear = parameter.meyear +osyear = parameter.osyear +oeyear = parameter.oeyear +generate_sftlf = parameter.generate_sftlf +regrid = parameter.regrid +cov_file = parameter.covariate_path +cov_name = parameter.covariate +return_period = parameter.return_period +# Block extrema related settings +annual_strict = parameter.annual_strict +exclude_leap = parameter.exclude_leap +dec_mode = parameter.dec_mode +drop_incomplete_djf = parameter.drop_incomplete_djf +# Region masking +shp_path = parameter.shp_path +col = parameter.attribute +region_name = parameter.region_name +coords = parameter.coords + +# Check the region masking parameters, if provided +use_region_mask, region_name, coords = region_utilities.check_region_params( + shp_path, coords, region_name, col, "land" +) + +# Verifying output directory +metrics_output_path = utilities.verify_output_path(metrics_output_path, case_id) + +if isinstance(reference_data_set, list): + # Fix a command line issue + reference_data_set = reference_data_set[0] + +# Verify years +ok_mod = utilities.verify_years( + msyear, + meyear, + msg="Error: Model msyear and meyear must both be set or both be None (unset).", +) +ok_obs = utilities.verify_years( + osyear, + oeyear, + msg="Error: Obs osyear and oeyear must both be set or both be None (unset).", +) + +# Initialize output.json file +meta = metadata.MetadataFile(metrics_output_path) + +# Initialize other directories +nc_dir = os.path.join(metrics_output_path, "netcdf") +os.makedirs(nc_dir, exist_ok=True) +if plots: + plot_dir_maps = os.path.join(metrics_output_path, "plots", "maps") + os.makedirs(plot_dir_maps, exist_ok=True) + if reference_data_path is not None: + plot_dir_taylor = os.path.join(metrics_output_path, "plots", "taylor") + os.makedirs(plot_dir_taylor, exist_ok=True) + +# Setting up model realization list +find_all_realizations, realizations = utilities.set_up_realizations(realization) + +# Only include reference data in loop if it exists +if reference_data_path is not None: + model_loop_list = ["Reference"] + model_list +else: + model_loop_list = model_list + +# Initialize output JSON structures +# FYI: if the analysis output JSON is changed, remember to update this function! +metrics_dict = compute_metrics.init_metrics_dict( + model_loop_list, + variable_list, + dec_mode, + drop_incomplete_djf, + annual_strict, + region_name, +) + +obs = {} + +############## +# Run Analysis +############## + +# Loop over models +for model in model_loop_list: + if model == "Reference": + list_of_runs = [str(reference_data_set)] + elif find_all_realizations: + tags = {"%(model)": model, "%(model_version)": model, "%(realization)": "*"} + test_data_full_path = os.path.join(test_data_path, filename_template) + test_data_full_path = utilities.replace_multi(test_data_full_path, tags) + ncfiles = glob.glob(test_data_full_path) + realizations = [] + for ncfile in ncfiles: + realizations.append(ncfile.split("/")[-1].split(".")[3]) + print("=================================") + print("model, runs:", model, realizations) + list_of_runs = realizations + else: + list_of_runs = realizations + + metrics_dict["RESULTS"][model] = {} + + # Loop over realizations + for run in list_of_runs: + # SFTLF + sftlf_exists = True + if run == reference_data_set: + if reference_sftlf_template is not None and os.path.exists( + reference_sftlf_template + ): + sftlf_filename = reference_sftlf_template + else: + print("No reference sftlf file template provided.") + if not generate_sftlf: + print("Skipping reference data") + else: + # Set flag to generate sftlf after loading data + sftlf_exists = False + else: + try: + tags = { + "%(model)": model, + "%(model_version)": model, + "%(realization)": run, + } + sftlf_filename_list = utilities.replace_multi( + sftlf_filename_template, tags + ) + sftlf_filename = glob.glob(sftlf_filename_list)[0] + except (AttributeError, IndexError): + print("No sftlf file found for", model, run) + if not generate_sftlf: + print("Skipping realization", run) + continue + else: + # Set flag to generate sftlf after loading data + sftlf_exists = False + if sftlf_exists: + sftlf = xcdat.open_dataset(sftlf_filename, decode_times=False) + # Stats calculation is expecting sfltf scaled from 0-100 + if sftlf["sftlf"].max() <= 20: + sftlf["sftlf"] = sftlf["sftlf"] * 100.0 + if use_region_mask: + print("\nCreating sftlf region mask.") + sftlf = region_utilities.mask_region( + sftlf, region_name, coords=coords, shp_path=shp_path, column=col + ) + + if run == reference_data_set: + units_adjust = ObsUnitsAdjust + else: + units_adjust = ModUnitsAdjust + + metrics_dict["RESULTS"][model][run] = {} + + # Loop over variables - tasmax, tasmin, or pr + for varname in variable_list: + # Find model data, determine number of files, check if they exist + if run == reference_data_set: + test_data_full_path = reference_data_path + start_year = osyear + end_year = oeyear + else: + tags = { + "%(variable)": varname, + "%(model)": model, + "%(model_version)": model, + "%(realization)": run, + } + test_data_full_path = os.path.join(test_data_path, filename_template) + test_data_full_path = utilities.replace_multi(test_data_full_path, tags) + start_year = msyear + end_year = meyear + yrs = [str(start_year), str(end_year)] # for output file names + test_data_full_path = glob.glob(test_data_full_path) + test_data_full_path.sort() + if len(test_data_full_path) == 0: + print("") + print("-----------------------") + print("Not found: model, run, variable:", model, run, varname) + continue + else: + print("") + print("-----------------------") + print("model, run, variable:", model, run, varname) + print("test_data (model in this case) full_path:") + for t in test_data_full_path: + print(" ", t) + + # Load and prep data + ds = utilities.load_dataset(test_data_full_path) + + if not sftlf_exists and generate_sftlf: + print("Generating land sea mask.") + sftlf = utilities.generate_land_sea_mask(ds, debug=debug) + if use_region_mask: + print("\nCreating sftlf region mask.") + sftlf = region_utilities.mask_region( + sftlf, region_name, coords=coords, shp_path=shp_path, column=col + ) + + # Mask out Antarctica + sftlf["sftlf"] = sftlf["sftlf"].where(sftlf.lat > -60) + + if use_region_mask: + print("Creating dataset mask.") + ds = region_utilities.mask_region( + ds, region_name, coords=coords, shp_path=shp_path, column=col + ) + + # Get time slice if year parameters exist + if start_year is not None: + ds = utilities.slice_dataset(ds, start_year, end_year) + else: + # Get labels for start/end years from dataset + yrs = [str(int(ds.time.dt.year[0])), str(int(ds.time.dt.year[-1]))] + + if ds.time.encoding["calendar"] != "noleap" and exclude_leap: + ds = ds.convert_calendar("noleap") + + # This dict is going to hold results for just this run + stats_dict = {} + + # Here's where the extremes calculations are happening + if varname == "tasmax": + TXx, TXn = compute_metrics.temperature_indices( + ds, + varname, + sftlf, + units_adjust, + dec_mode, + drop_incomplete_djf, + annual_strict, + ) + stats_dict["TXx"] = TXx + stats_dict["TXn"] = TXn + + if run == reference_data_set: + obs["TXx"] = TXx + obs["TXn"] = TXn + + if nc_out: + print("Writing results to netCDF.") + desc = "Seasonal maximum of maximum temperature." + meta = utilities.write_to_nc( + TXx, model, run, region_name, "TXx", yrs, nc_dir, desc, meta + ) + desc = "Seasonal minimum of maximum temperature." + meta = utilities.write_to_nc( + TXn, model, run, region_name, "TXn", yrs, nc_dir, desc, meta + ) + + if plots: + print("Creating maps") + yrs = [start_year, end_year] + desc = "Seasonal maximum of maximum temperature." + meta = plot_extremes.make_maps( + TXx, + model, + run, + region_name, + "TXx", + yrs, + plot_dir_maps, + desc, + meta, + ) + desc = "Seasonal minimum of maximum temperature." + meta = plot_extremes.make_maps( + TXn, + model, + run, + region_name, + "TXn", + yrs, + plot_dir_maps, + desc, + meta, + ) + + if varname == "tasmin": + TNx, TNn = compute_metrics.temperature_indices( + ds, + varname, + sftlf, + units_adjust, + dec_mode, + drop_incomplete_djf, + annual_strict, + ) + stats_dict["TNx"] = TNx + stats_dict["TNn"] = TNn + + if run == reference_data_set: + obs["TNx"] = TNx + obs["TNn"] = TNn + + if nc_out: + print("Writing results to netCDF.") + desc = "Seasonal maximum of minimum temperature." + meta = utilities.write_to_nc( + TNx, model, run, region_name, "TNx", yrs, nc_dir, desc, meta + ) + desc = "Seasonal minimum of minimum temperature." + meta = utilities.write_to_nc( + TNn, model, run, region_name, "TNn", yrs, nc_dir, desc, meta + ) + + if plots: + print("Creating maps") + yrs = [start_year, end_year] + desc = "Seasonal maximum of minimum temperature." + meta = plot_extremes.make_maps( + TNx, + model, + run, + region_name, + "TNx", + yrs, + plot_dir_maps, + desc, + meta, + ) + desc = "Seasonal minimum of minimum temperature." + meta = plot_extremes.make_maps( + TNn, + model, + run, + region_name, + "TNn", + yrs, + plot_dir_maps, + desc, + meta, + ) + + if varname in ["pr", "PRECT", "precip"]: + # Rename possible precipitation variable names for consistency + if varname in ["precip", "PRECT"]: + ds = ds.rename({varname: "pr"}) + Rx1day, Rx5day = compute_metrics.precipitation_indices( + ds, + sftlf, + units_adjust, + dec_mode, + drop_incomplete_djf, + annual_strict, + ) + stats_dict["Rx1day"] = Rx1day + stats_dict["Rx5day"] = Rx5day + + if run == reference_data_set: + obs["Rx1day"] = Rx1day + obs["Rx5day"] = Rx5day + + if nc_out: + print("Writing results to netCDF.") + desc = "Seasonal maximum value of daily precipitation." + meta = utilities.write_to_nc( + Rx1day, + model, + run, + region_name, + "Rx1day", + yrs, + nc_dir, + desc, + meta, + ) + desc = "Seasonal maximum value of 5-day mean precipitation." + meta = utilities.write_to_nc( + Rx5day, + model, + run, + region_name, + "Rx5day", + yrs, + nc_dir, + desc, + meta, + ) + + if plots: + print("Creating maps") + desc = "Seasonal maximum value of 5-day mean precipitation." + meta = plot_extremes.make_maps( + Rx5day, + model, + run, + region_name, + "Rx5day", + yrs, + plot_dir_maps, + desc, + meta, + ) + desc = "Seasonal maximum value of daily precipitation." + meta = plot_extremes.make_maps( + Rx1day, + model, + run, + region_name, + "Rx1day", + yrs, + plot_dir_maps, + desc, + meta, + ) + + if model != "Reference": + # Get stats and update metrics dictionary + print("Generating metrics.") + result_dict = compute_metrics.metrics_json( + stats_dict, obs_dict=obs, region=region_name, regrid=regrid + ) + metrics_dict["RESULTS"][model][run].update(result_dict) + if run not in metrics_dict["DIMENSIONS"]["realization"]: + metrics_dict["DIMENSIONS"]["realization"].append(run) + + if model != "Reference": + # Pull out metrics for just this model + # and write to JSON + metrics_tmp = metrics_dict.copy() + metrics_tmp["DIMENSIONS"]["model"] = model + metrics_tmp["DIMENSIONS"]["realization"] = list_of_runs + metrics_tmp["RESULTS"] = {model: metrics_dict["RESULTS"][model]} + metrics_path = "{0}_block_extremes_metrics.json".format(model) + utilities.write_to_json(metrics_output_path, metrics_path, metrics_tmp) + + meta.update_metrics( + model, + os.path.join(metrics_output_path, metrics_path), + model + " results", + "Seasonal metrics for block extrema for single dataset", + ) + +# Output single file with all models +model_write_list = model_loop_list.copy() +if "Reference" in model_write_list: + model_write_list.remove("Reference") +metrics_dict["DIMENSIONS"]["model"] = model_write_list +utilities.write_to_json( + metrics_output_path, "block_extremes_metrics.json", metrics_dict +) +fname = os.path.join(metrics_output_path, "block_extremes_metrics.json") +meta.update_metrics( + "All", fname, "All results", "Seasonal metrics for block extrema for all datasets" +) + +# Taylor Diagram +if plots and (reference_data_path is not None): + print("Making Taylor Diagrams") + years = "-".join(yrs) + outfile_template = os.path.join( + plot_dir_taylor, + "_".join(["taylor", "realization", "region", "index", "season", years]), + ) + try: + plot_extremes.taylor_diag(fname, outfile_template) + meta.update_plots( + "Taylor_Diagrams", + outfile_template, + "Taylor Diagrams", + "Taylor Diagrams for block extrema results.", + ) + except Exception as e: + print("Error. Could not create Taylor Diagram for ", outfile_template, ":") + print(e) + +# Calculate Return Values +# If more metrics are added to this analysis, +# Update the stat list in the inner loop and in the +# max/min check. +print("Generating return values.") +for model in model_loop_list: + # Skip obs if nonstationary + if model == "Reference" and cov_file is not None: + continue + for stat in ["TXx", "TXn", "TNx", "TNn", "Rx5day", "Rx1day"]: + if stat in ["TXx", "TNx", "Rx5day", "Rx1day"]: + maxes = True + else: + # TXn and TNn + maxes = False + filelist = glob.glob(nc_dir + "/*{0}*{1}*".format(model, stat)) + # Skip over results that might be left from old run + filelist = [ + f + for f in filelist + if ("return_value" not in f) and ("standard_error" not in f) + ] + if len(filelist) > 1: + # Use all realizations + print(model) + meta = return_value.compute_rv_for_model( + filelist, cov_file, cov_name, nc_dir, return_period, meta, maxes=maxes + ) + elif len(filelist) == 1: + # Return value from single realization + meta = return_value.compute_rv_from_file( + filelist, cov_file, cov_name, nc_dir, return_period, meta, maxes=maxes + ) + +rv_metrics_dict = compute_metrics.init_metrics_dict( + model_loop_list, + variable_list, + dec_mode, + drop_incomplete_djf, + annual_strict, + region_name, +) + +# Write metrics file for return values +# Can only do this for stationary case +if cov_file is None: + filelist = glob.glob(nc_dir + "/*return_value.nc") + for file in filelist: + # Use the file name to get variables + if len(os.path.basename(file).split("_")) > 6: + rz = os.path.basename(file).split("_")[1] + else: + rz = "all" + model = os.path.basename(file).split("_")[0] + stat = os.path.basename(file).split("_")[-4] + region = os.path.basename(file).split("_")[-5] + + if rz == "all": + # Use the realization file name that comes first, sorted + bmfilelist = glob.glob( + nc_dir + "/{0}_*_{1}_{2}_*.nc".format(model, region, stat) + ) + bmfilelist.sort() + bm = xcdat.open_dataset(bmfilelist[0]) + else: + block_file = file.replace("_return_value", "") + bm = xcdat.open_dataset(block_file) + + # Get reference data if present + refds = None + bm_ref = None + if "Reference" in model_loop_list: + ref_file = nc_dir + "/Reference_{0}_{1}_{2}_*_return_value.nc".format( + reference_data_set, region, stat + ) + ref_file = glob.glob(ref_file)[0] + refds = xcdat.open_dataset(ref_file) + refds = refds.drop_vars("lat_bnds") + refds = refds.drop_vars("lon_bnds") + refds.lat["bounds"] = "" + refds.lon["bounds"] = "" + refds = refds.bounds.add_missing_bounds() + + bm_ref_file = ref_file.replace("_return_value", "") + bm_ref = xcdat.open_dataset(bm_ref_file) + + rv = xcdat.open_dataset(file) + rv = rv.drop_vars("lat_bnds") + rv = rv.drop_vars("lon_bnds") + rv.lat["bounds"] = "" + rv.lon["bounds"] = "" + rv = rv.bounds.add_missing_bounds() + tmp = compute_metrics.metrics_json_return_value( + rv, bm, refds, bm_ref, stat, region=region, regrid=regrid + ) + # store the stats correctly in the metrics dictionary + if model != "Reference": + if model in rv_metrics_dict["RESULTS"]: + if rz in rv_metrics_dict["RESULTS"][model]: + rv_metrics_dict["RESULTS"][model][rz].update(tmp) + else: + rv_metrics_dict["RESULTS"][model].update({rz: tmp}) + else: + rv_metrics_dict["RESULTS"][model] = {rz: tmp} + + if "Reference" in model_loop_list: + model_loop_list.remove("Reference") + rv_metrics_dict["DIMENSIONS"]["model"] = model_loop_list + utilities.write_to_json( + metrics_output_path, "return_value_metrics.json", rv_metrics_dict + ) + fname = os.path.join(metrics_output_path, "return_value_metrics.json") + meta.update_metrics( + "All", + fname, + "All results", + "Seasonal metrics for return value for all datasets", + ) + +# Update and write metadata file +try: + with open(fname, "r") as f: + tmp = json.load(f) + meta.update_provenance("environment", tmp["provenance"]) +except Exception: + # Skip provenance if there's an issue + print("Error: Could not get provenance from extremes json for output.json.") + +meta.update_provenance("modeldata", test_data_path) +if reference_data_path is not None: + meta.update_provenance("obsdata", reference_data_path) +meta.write() diff --git a/pcmdi_metrics/extremes/lib/__init__.py b/pcmdi_metrics/extremes/lib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/pcmdi_metrics/extremes/lib/compute_metrics.py b/pcmdi_metrics/extremes/lib/compute_metrics.py new file mode 100644 index 000000000..649fe58c7 --- /dev/null +++ b/pcmdi_metrics/extremes/lib/compute_metrics.py @@ -0,0 +1,709 @@ +#!/usr/bin/env python +import datetime + +import cftime +import numpy as np +import xarray as xr +import xcdat as xc + +from pcmdi_metrics.mean_climate.lib import compute_statistics + + +class TimeSeriesData: + # Track years and calendar for time series grids + # Store methods to act on time series grids + def __init__(self, ds, ds_var): + self.ds = ds + self.ds_var = ds_var + self.freq = xr.infer_freq(ds.time) + self._set_years() + self.calendar = ds.time.encoding["calendar"] + self.time_units = ds.time.encoding["units"] + + def _set_years(self): + self.year_beg = self.ds.isel({"time": 0}).time.dt.year.item() + self.year_end = self.ds.isel({"time": -1}).time.dt.year.item() + + if self.year_end < self.year_beg + 1: + raise Exception("Error: Final year must be greater than beginning year.") + + self.year_range = np.arange(self.year_beg, self.year_end + 1, 1) + + def return_data_array(self): + return self.ds[self.ds_var] + + def rolling_5day(self): + # Use on daily data + return self.ds[self.ds_var].rolling(time=5).mean() + + +class SeasonalAverager: + # Make seasonal averages of data in TimeSeriesData class + + def __init__( + self, TSD, sftlf, dec_mode="DJF", drop_incomplete_djf=True, annual_strict=True + ): + self.TSD = TSD + self.dec_mode = dec_mode + self.drop_incomplete_djf = drop_incomplete_djf + self.annual_strict = annual_strict + self.del1d = datetime.timedelta(days=1) + self.del0d = datetime.timedelta(days=0) + self.pentad = None + self.sftlf = sftlf["sftlf"] + + def masked_ds(self, ds): + # Mask land where 50<=sftlf<=100 + return ds.where(self.sftlf >= 50).where(self.sftlf <= 100) + + def calc_5day_mean(self): + # Get the 5-day mean dataset + self.pentad = self.TSD.rolling_5day() + + def fix_time_coord(self, ds): + cal = self.TSD.calendar + ds = ds.rename({"year": "time"}) + y_to_cft = [cftime.datetime(y, 1, 1, calendar=cal) for y in ds.time] + ds["time"] = y_to_cft + ds.time.attrs["axis"] = "T" + ds["time"].encoding["calendar"] = cal + ds["time"].attrs["standard_name"] = "time" + ds.time.encoding["units"] = self.TSD.time_units + return ds + + def annual_stats(self, stat, pentad=False): + # Acquire annual statistics + # Arguments: + # stat: Can be "max", "min" + # pentad: True to run on 5-day mean + # Returns: + # ds_ann: Dataset containing annual max or min grid + + if pentad: + if self.pentad is None: + self.calc_5day_mean() + ds = self.pentad + else: + ds = self.TSD.return_data_array() + cal = self.TSD.calendar + + if self.annual_strict and pentad: + # This setting is for means using 5 day rolling average values, where + # we do not want to include any data from the prior year + year_range = self.TSD.year_range + hr = int(ds.time[0].dt.hour) # get hour to help with selecting nearest time + + # Only use data from that year - start on Jan 5 avg + date_range = [ + xr.cftime_range( + start=cftime.datetime(year, 1, 5, hour=hr, calendar=cal) + - self.del0d, + end=cftime.datetime(year + 1, 1, 1, hour=hr, calendar=cal) + - self.del1d, + freq="D", + calendar=cal, + ) + for year in year_range + ] + date_range = [item for sublist in date_range for item in sublist] + if stat == "max": + ds_ann = ( + ds.sel(time=date_range, method="nearest") + .groupby("time.year") + .max(dim="time") + ) + elif stat == "min": + ds_ann = ( + ds.sel(time=date_range, method="nearest") + .groupby("time.year") + .min(dim="time") + ) + else: + # Group by date + if stat == "max": + ds_ann = ds.groupby("time.year").max(dim="time") + elif stat == "min": + ds_ann = ds.groupby("time.year").min(dim="time") + + # Need to fix time axis if groupby operation happened + if "year" in ds_ann.coords: + ds_ann = self.fix_time_coord(ds_ann) + return self.masked_ds(ds_ann) + + def seasonal_stats(self, season, stat, pentad=False): + # Acquire statistics for a given season + # Arguments: + # season: Can be "DJF","MAM","JJA","SON" + # stat: Can be "max", "min" + # pentad: True to run on 5-day mean + # Returns: + # ds_stat: Dataset containing seasonal max or min grid + + year_range = self.TSD.year_range + + if pentad: + if self.pentad is None: + self.calc_5day_mean() + ds = self.pentad + else: + ds = self.TSD.return_data_array() + cal = self.TSD.calendar + + hr = int(ds.time[0].dt.hour) # help with selecting nearest time + + if season == "DJF" and self.dec_mode == "DJF": + # Resample DJF to count prior DJF in current year + if stat == "max": + ds_stat = ds.resample(time="QS-DEC").max(dim="time") + elif stat == "min": + ds_stat = ds.resample(time="QS-DEC").min(dim="time") + + ds_stat = ds_stat.isel(time=ds_stat.time.dt.month.isin([12])) + + # Deal with inconsistencies between QS-DEC calendar and block exremes calendar + if self.drop_incomplete_djf: + ds_stat = ds_stat.sel( + {"time": slice(str(year_range[0]), str(year_range[-1] - 1))} + ) + ds_stat["time"] = [ + cftime.datetime(y, 1, 1, calendar=cal) + for y in np.arange(year_range[0] + 1, year_range[-1] + 1) + ] + else: + ds_stat = ds_stat.sel( + {"time": slice(str(year_range[0] - 1), str(year_range[-1] - 1))} + ) + ds_stat["time"] = [ + cftime.datetime(y, 1, 1, calendar=cal) + for y in np.arange(year_range[0], year_range[-1] + 1) + ] + + elif season == "DJF" and self.dec_mode == "JFD": + # Make date lists that capture JF and D in all years, then merge and sort + if self.annual_strict and pentad: + # Only use data from that year - start on Jan 5 avg + date_range_1 = [ + xr.cftime_range( + start=cftime.datetime(year, 1, 5, hour=hr, calendar=cal) + - self.del0d, + end=cftime.datetime(year, 3, 1, hour=hr, calendar=cal) + - self.del1d, + freq="D", + calendar=cal, + ) + for year in year_range + ] + else: + date_range_1 = [ + xr.cftime_range( + start=cftime.datetime(year, 1, 1, hour=hr, calendar=cal) + - self.del0d, + end=cftime.datetime(year, 3, 1, hour=hr, calendar=cal) + - self.del1d, + freq="D", + calendar=cal, + ) + for year in year_range + ] + date_range_1 = [item for sublist in date_range_1 for item in sublist] + date_range_2 = [ + xr.cftime_range( + start=cftime.datetime(year, 12, 1, hour=hr, calendar=cal) + - self.del0d, + end=cftime.datetime(year + 1, 1, 1, hour=hr, calendar=cal) + - self.del1d, + freq="D", + calendar=cal, + ) + for year in year_range + ] + date_range_2 = [item for sublist in date_range_2 for item in sublist] + date_range = sorted(date_range_1 + date_range_2) + + if stat == "max": + ds_stat = ( + ds.sel(time=date_range, method="nearest") + .groupby("time.year") + .max(dim="time") + ) + elif stat == "min": + ds_stat = ( + ds.sel(time=date_range, method="nearest") + .groupby("time.year") + .min(dim="time") + ) + + else: # Other 3 seasons + dates = { # Month/day tuples + "MAM": [(3, 1), (6, 1)], + "JJA": [(6, 1), (9, 1)], + "SON": [(9, 1), (12, 1)], + } + + mo_st = dates[season][0][0] + day_st = dates[season][0][1] + mo_en = dates[season][1][0] + day_en = dates[season][1][1] + + cal = self.TSD.calendar + + date_range = [ + xr.cftime_range( + start=cftime.datetime(year, mo_st, day_st, hour=hr, calendar=cal) + - self.del0d, + end=cftime.datetime(year, mo_en, day_en, hour=hr, calendar=cal) + - self.del1d, + freq="D", + calendar=cal, + ) + for year in year_range + ] + date_range = [item for sublist in date_range for item in sublist] + + if stat == "max": + ds_stat = ( + ds.sel(time=date_range, method="nearest") + .groupby("time.year") + .max(dim="time") + ) + elif stat == "min": + ds_stat = ( + ds.sel(time=date_range, method="nearest") + .groupby("time.year") + .min(dim="time") + ) + + # Need to fix time axis if groupby operation happened + if "year" in ds_stat.coords: + ds_stat = self.fix_time_coord(ds_stat) + return self.masked_ds(ds_stat) + + +def update_nc_attrs(ds, dec_mode, drop_incomplete_djf, annual_strict): + # Add bounds and record user settings in attributes + # Use this function for any general dataset updates. + ds.lat.attrs["standard_name"] = "Y" + ds.lon.attrs["standard_name"] = "X" + bnds_dict = {"lat": "Y", "lon": "X", "time": "T"} + for item in bnds_dict: + if "bounds" in ds[item].attrs: + bnds_var = ds[item].attrs["bounds"] + if bnds_var not in ds.keys(): + ds[item].attrs["bounds"] = "" + ds = ds.bounds.add_missing_bounds([bnds_dict[item]]) + else: + ds = ds.bounds.add_missing_bounds([bnds_dict[item]]) + ds.attrs["december_mode"] = str(dec_mode) + ds.attrs["drop_incomplete_djf"] = str(drop_incomplete_djf) + ds.attrs["annual_strict"] = str(annual_strict) + + # Update fill value encoding + ds.lat.encoding["_FillValue"] = None + ds.lon.encoding["_FillValue"] = None + ds.time.encoding["_FillValue"] = None + ds.lat_bnds.encoding["_FillValue"] = None + ds.lon_bnds.encoding["_FillValue"] = None + ds.time_bnds.encoding["_FillValue"] = None + for season in ["ANN", "DJF", "MAM", "JJA", "SON"]: + ds[season].encoding["_FillValue"] = float(1e20) + + # Drop type attribute that comes from land mask + if "type" in ds: + ds = ds.drop("type") + return ds + + +def convert_units(data, units_adjust): + # Convert the units of the input data + # units_adjust is a tuple of form + # (flag (bool), operation (str), value (float), units (str)). + # For example, (True, "multiply", 86400., "mm/day") + # If flag is False, data is returned unaltered. + if bool(units_adjust[0]): + op_dict = {"add": "+", "subtract": "-", "multiply": "*", "divide": "/"} + if str(units_adjust[1]) not in op_dict: + print( + "Error in units conversion. Operation must be add, subtract, multiply, or divide." + ) + print("Skipping units conversion.") + return data + op = op_dict[str(units_adjust[1])] + val = float(units_adjust[2]) + operation = "data {0} {1}".format(op, val) + data = eval(operation) + data.attrs["units"] = str(units_adjust[3]) + else: + # No adjustment, but check that units attr is populated + if "units" not in data.attrs: + data.attrs["units"] = "" + return data + + +def temperature_indices( + ds, varname, sftlf, units_adjust, dec_mode, drop_incomplete_djf, annual_strict +): + # Returns annual max and min of provided temperature dataset + # Temperature input can be "tasmax" or "tasmin". + + print("Generating temperature block extrema.") + + ds[varname] = convert_units(ds[varname], units_adjust) + + TS = TimeSeriesData(ds, varname) + S = SeasonalAverager( + TS, + sftlf, + dec_mode=dec_mode, + drop_incomplete_djf=drop_incomplete_djf, + annual_strict=annual_strict, + ) + + Tmax = xr.Dataset() + Tmin = xr.Dataset() + Tmax["ANN"] = S.annual_stats("max") + Tmin["ANN"] = S.annual_stats("min") + + for season in ["DJF", "MAM", "JJA", "SON"]: + Tmax[season] = S.seasonal_stats(season, "max") + Tmin[season] = S.seasonal_stats(season, "min") + + Tmax = update_nc_attrs(Tmax, dec_mode, drop_incomplete_djf, annual_strict) + Tmin = update_nc_attrs(Tmin, dec_mode, drop_incomplete_djf, annual_strict) + + return Tmax, Tmin + + +def precipitation_indices( + ds, sftlf, units_adjust, dec_mode, drop_incomplete_djf, annual_strict +): + # Returns annual Rx1day and Rx5day of provided precipitation dataset. + # Precipitation variable must be called "pr". + # Input data expected to have units of kg/m2/s + + print("Generating precipitation block extrema.") + + ds["pr"] = convert_units(ds["pr"], units_adjust) + + PR = TimeSeriesData(ds, "pr") + S = SeasonalAverager( + PR, + sftlf, + dec_mode=dec_mode, + drop_incomplete_djf=drop_incomplete_djf, + annual_strict=annual_strict, + ) + + # Rx1day + P1day = xr.Dataset() + P1day["ANN"] = S.annual_stats("max", pentad=False) + # Can end up with very small negative values that should be 0 + # Possibly related to this issue? https://github.com/pydata/bottleneck/issues/332 + # (from https://github.com/pydata/xarray/issues/3855) + P1day["ANN"] = ( + P1day["ANN"].where(P1day["ANN"] > 0, 0).where(~np.isnan(P1day["ANN"]), np.nan) + ) + for season in ["DJF", "MAM", "JJA", "SON"]: + P1day[season] = S.seasonal_stats(season, "max", pentad=False) + P1day[season] = ( + P1day[season] + .where(P1day[season] > 0, 0) + .where(~np.isnan(P1day[season]), np.nan) + ) + P1day = update_nc_attrs(P1day, dec_mode, drop_incomplete_djf, annual_strict) + + # Rx5day + P5day = xr.Dataset() + P5day["ANN"] = S.annual_stats("max", pentad=True) + P5day["ANN"] = ( + P5day["ANN"].where(P5day["ANN"] > 0, 0).where(~np.isnan(P5day["ANN"]), np.nan) + ) + for season in ["DJF", "MAM", "JJA", "SON"]: + P5day[season] = S.seasonal_stats(season, "max", pentad=True) + P5day[season] = ( + P5day[season] + .where(P5day[season] > 0, 0) + .where(~np.isnan(P5day[season]), np.nan) + ) + P5day = update_nc_attrs(P5day, dec_mode, drop_incomplete_djf, annual_strict) + + return P1day, P5day + + +# A couple of statistics that aren't being loaded from mean_climate +def mean_xy(data, varname): + # Spatial mean of single dataset + mean_xy = data.spatial.average(varname)[varname].mean() + return float(mean_xy) + + +def percent_difference(ref, bias_xy, varname, weights): + # bias as percentage of reference dataset "ref" + pct_dif = float( + 100.0 + * bias_xy + / ref.spatial.average(varname, axis=["X", "Y"], weights=weights)[varname] + ) + return pct_dif + + +def init_metrics_dict( + model_list, var_list, dec_mode, drop_incomplete_djf, annual_strict, region_name +): + # Return initial version of the metrics dictionary + metrics = { + "DIMENSIONS": { + "json_structure": [ + "model", + "realization", + "index", + "region", + "statistic", + "season", + ], + "region": {region_name: "Areas where 50<=sftlf<=100"}, + "season": ["ANN", "DJF", "MAM", "JJA", "SON"], + "index": {}, + "statistic": { + "mean": compute_statistics.mean_xy(None), + "std_xy": compute_statistics.std_xy(None, None), + "bias_xy": compute_statistics.bias_xy(None, None), + "cor_xy": compute_statistics.cor_xy(None, None), + "mae_xy": compute_statistics.meanabs_xy(None, None), + "rms_xy": compute_statistics.rms_xy(None, None), + "rmsc_xy": compute_statistics.rmsc_xy(None, None), + "std-obs_xy": compute_statistics.std_xy(None, None), + "pct_dif": { + "Abstract": "Bias xy as a percentage of the Observed mean.", + "Contact": "pcmdi-metrics@llnl.gov", + "Name": "Spatial Difference Percentage", + }, + }, + "model": model_list, + "realization": [], + }, + "RESULTS": {}, + "RUNTIME_CALENDAR_SETTINGS": { + "december_mode": str(dec_mode), + "drop_incomplete_djf": str(drop_incomplete_djf), + "annual_strict": str(annual_strict), + }, + } + + # Only include the definitions for the indices in this particular analysis. + for v in var_list: + if v == "tasmax": + metrics["DIMENSIONS"]["index"].update( + {"TXx": "Maximum value of daily maximum temperature"} + ) + metrics["DIMENSIONS"]["index"].update( + {"TXn": "Minimum value of daily maximum temperature"} + ) + if v == "tasmin": + metrics["DIMENSIONS"]["index"].update( + {"TNx": "Maximum value of daily minimum temperature"} + ) + metrics["DIMENSIONS"]["index"].update( + {"TNn": "Minimum value of daily minimum temperature"} + ) + if v in ["pr", "PRECT", "precip"]: + metrics["DIMENSIONS"]["index"].update( + {"Rx5day": "Maximum consecutive 5-day mean precipitation, mm/day"} + ) + metrics["DIMENSIONS"]["index"].update( + {"Rx1day": "Maximum daily precipitation, mm/day"} + ) + + return metrics + + +def metrics_json(data_dict, obs_dict={}, region="land", regrid=True): + # Format, calculate, and return the global mean value over land + # for all datasets in the input dictionary + # Arguments: + # data_dict: Dictionary containing block extrema datasets + # obs_dict: Dictionary containing block extrema for + # reference dataset + # region: Name of region. + # Returns: + # met_dict: A dictionary containing metrics + + met_dict = {} + seasons_dict = {"ANN": "", "DJF": "", "MAM": "", "JJA": "", "SON": ""} + + # Looping over each type of extrema in data_dict + for m in data_dict: + met_dict[m] = { + region: {"mean": seasons_dict.copy(), "std_xy": seasons_dict.copy()} + } + # If obs available, add metrics comparing with obs + # If new statistics are added, be sure to update + # "statistic" entry in init_metrics_dict() + if len(obs_dict) > 0: + for k in [ + "std-obs_xy", + "pct_dif", + "bias_xy", + "cor_xy", + "mae_xy", + "rms_xy", + "rmsc_xy", + ]: + met_dict[m][region][k] = seasons_dict.copy() + + ds_m = data_dict[m] + for season in ["ANN", "DJF", "MAM", "JJA", "SON"]: + # Global mean over land + met_dict[m][region]["mean"][season] = mean_xy(ds_m, season) + a = ds_m.temporal.average(season) + std_xy = compute_statistics.std_xy(a, season) + met_dict[m][region]["std_xy"][season] = std_xy + + if len(obs_dict) > 0 and not obs_dict[m].equals(ds_m): + # Regrid obs to model grid + if regrid: + target = xc.create_grid(ds_m.lat, ds_m.lon) + target = target.bounds.add_missing_bounds(["X", "Y"]) + obs_m = obs_dict[m].regridder.horizontal( + season, target, tool="regrid2" + ) + else: + obs_m = obs_dict[m] + shp1 = (len(ds_m[season].lat), len(ds_m[season].lon)) + shp2 = (len(obs_m[season].lat), len(obs_m[season].lon)) + assert ( + shp1 == shp2 + ), "Model and Reference data dimensions 'lat' and 'lon' must match." + + # Get xy stats for temporal average + a = ds_m.temporal.average(season) + b = obs_m.temporal.average(season) + weights = ds_m.spatial.get_weights(axis=["X", "Y"]) + rms_xy = compute_statistics.rms_xy(a, b, var=season, weights=weights) + meanabs_xy = compute_statistics.meanabs_xy( + a, b, var=season, weights=weights + ) + bias_xy = compute_statistics.bias_xy(a, b, var=season, weights=weights) + cor_xy = compute_statistics.cor_xy(a, b, var=season, weights=weights) + rmsc_xy = compute_statistics.rmsc_xy(a, b, var=season, weights=weights) + std_obs_xy = compute_statistics.std_xy(b, season) + pct_dif = percent_difference(b, bias_xy, season, weights) + + met_dict[m][region]["pct_dif"][season] = pct_dif + met_dict[m][region]["rms_xy"][season] = rms_xy + met_dict[m][region]["mae_xy"][season] = meanabs_xy + met_dict[m][region]["bias_xy"][season] = bias_xy + met_dict[m][region]["cor_xy"][season] = cor_xy + met_dict[m][region]["rmsc_xy"][season] = rmsc_xy + met_dict[m][region]["std-obs_xy"][season] = std_obs_xy + + return met_dict + + +def metrics_json_return_value( + rv, blockex, obs, blockex_obs, stat, region="land", regrid=True +): + # Generate metrics for stationary return value comparing model and obs + # Arguments: + # rv: dataset + # blockex: dataset + # obs: dataset + # stat: string + # region: string + # regrid: bool + # Returns: + # met_dict: dictionary + met_dict = {stat: {}} + seasons_dict = {"ANN": "", "DJF": "", "MAM": "", "JJA": "", "SON": ""} + + # Looping over each type of extrema in data_dict + met_dict[stat] = { + region: {"mean": seasons_dict.copy(), "std_xy": seasons_dict.copy()} + } + # If obs available, add metrics comparing with obs + # If new statistics are added, be sure to update + # "statistic" entry in init_metrics_dict() + if obs is not None: + obs = obs.bounds.add_missing_bounds() + for k in [ + "std-obs_xy", + "pct_dif", + "bias_xy", + "cor_xy", + "mae_xy", + "rms_xy", + "rmsc_xy", + ]: + met_dict[stat][region][k] = seasons_dict.copy() + + rv_tmp = rv.copy(deep=True) + + for season in ["ANN", "DJF", "MAM", "JJA", "SON"]: + # Global mean over land + rv_tmp[season] = remove_outliers(rv[season], blockex[season]) + met_dict[stat][region]["mean"][season] = mean_xy(rv_tmp, season) + std_xy = compute_statistics.std_xy(rv_tmp, season) + met_dict[stat][region]["std_xy"][season] = std_xy + + if obs is not None and not obs[season].equals(rv_tmp): + obs[season] = remove_outliers(obs[season], blockex_obs[season]) + # Regrid obs to model grid + if regrid: + target = xc.create_grid(rv_tmp.lat, rv_tmp.lon) + target = target.bounds.add_missing_bounds(["X", "Y"]) + obs_m = obs.regridder.horizontal(season, target, tool="regrid2") + else: + obs_m = obs + shp1 = (len(rv_tmp.lat), len(rv_tmp.lon)) + shp2 = (len(obs.lat), len(obs.lon)) + assert ( + shp1 == shp2 + ), "Model and Reference data dimensions 'lat' and 'lon' must match." + + # Get xy stats for temporal average + weights = rv_tmp.spatial.get_weights(axis=["X", "Y"]) + rms_xy = compute_statistics.rms_xy( + rv_tmp, obs_m, var=season, weights=weights + ) + meanabs_xy = compute_statistics.meanabs_xy( + rv_tmp, obs_m, var=season, weights=weights + ) + bias_xy = compute_statistics.bias_xy( + rv_tmp, obs_m, var=season, weights=weights + ) + cor_xy = compute_statistics.cor_xy( + rv_tmp, obs_m, var=season, weights=weights + ) + rmsc_xy = compute_statistics.rmsc_xy( + rv_tmp, obs_m, var=season, weights=weights + ) + std_obs_xy = compute_statistics.std_xy(rv_tmp, season) + pct_dif = percent_difference(obs_m, bias_xy, season, weights) + + met_dict[stat][region]["pct_dif"][season] = pct_dif + met_dict[stat][region]["rms_xy"][season] = rms_xy + met_dict[stat][region]["mae_xy"][season] = meanabs_xy + met_dict[stat][region]["bias_xy"][season] = bias_xy + met_dict[stat][region]["cor_xy"][season] = cor_xy + met_dict[stat][region]["rmsc_xy"][season] = rmsc_xy + met_dict[stat][region]["std-obs_xy"][season] = std_obs_xy + + return met_dict + + +def remove_outliers(rv, blockex): + # Remove outlier return values for metrics computation + # filtering by comparing to the block extreme values + # rv: data array + # blckex: data array + block_max = blockex.max("time", skipna=True).data + block_min = blockex.min("time", skipna=True).data + block_std = blockex.std("time", skipna=True).data + + # Remove values that are either: + # 8 standard deviations above the max value in block extema + # 8 standard deviations below the min value in block extrema + tol = 8 * block_std + plussig = block_max + tol + minsig = block_min - tol + rv_remove_outliers = rv.where((rv < plussig) & (rv > minsig)) + return rv_remove_outliers diff --git a/pcmdi_metrics/extremes/lib/create_extremes_parser.py b/pcmdi_metrics/extremes/lib/create_extremes_parser.py new file mode 100644 index 000000000..8992bb128 --- /dev/null +++ b/pcmdi_metrics/extremes/lib/create_extremes_parser.py @@ -0,0 +1,291 @@ +#!/usr/bin/env python +from pcmdi_metrics.mean_climate.lib import pmp_parser + + +def create_extremes_parser(): + parser = pmp_parser.PMPMetricsParser() + parser.add_argument( + "--case_id", + dest="case_id", + help="Defines a subdirectory to the metrics output, so multiple" + + "cases can be compared", + required=False, + ) + + parser.add_argument( + "-v", + "--vars", + type=str, + nargs="+", + dest="vars", + help="Variables to use", + required=False, + ) + + parser.add_argument( + "-r", + "--reference_data_set", + default=None, + type=str, + nargs="+", + dest="reference_data_set", + help="List of observations or models that are used as a " + + "reference against the test_data_set", + required=False, + ) + + parser.add_argument( + "--reference_data_path", + default=None, + dest="reference_data_path", + help="Path for the reference climitologies", + required=False, + ) + parser.add_argument( + "--reference_sftlf_template", + default=None, + dest="reference_sftlf_template", + help="Path for the reference sftlf file", + required=False, + ) + + parser.add_argument( + "-t", + "--test_data_set", + type=str, + nargs="+", + dest="test_data_set", + help="List of observations or models to test " + + "against the reference_data_set", + required=False, + ) + + parser.add_argument( + "--test_data_path", + dest="test_data_path", + help="Path for the test climitologies", + required=False, + ) + + parser.add_argument( + "--realization", + dest="realization", + help="A simulation parameter", + required=False, + ) + + parser.add_argument( + "--dry_run", + # If input is 'True' or 'true', return True. Otherwise False. + type=lambda x: x.lower() == "true", + dest="dry_run", + help="True if output is to be created, False otherwise", + required=False, + ) + + parser.add_argument( + "--filename_template", + dest="filename_template", + help="Template for climatology files", + required=False, + ) + + parser.add_argument( + "--sftlf_filename_template", + dest="sftlf_filename_template", + help='Filename template for landsea masks ("sftlf")', + required=False, + ) + + parser.add_argument( + "--metrics_output_path", + dest="metrics_output_path", + default=None, + help="Directory of where to put the results", + required=False, + ) + + parser.add_argument( + "--filename_output_template", + dest="filename_output_template", + help="Filename for the interpolated test climatologies", + required=False, + ) + + parser.add_argument( + "--output_json_template", + help="Filename template for results json files", + required=False, + ) + + parser.add_argument( + "--user_notes", + dest="user_notes", + help="Provide a short description to help identify this run of the PMP mean climate.", + required=False, + ) + + parser.add_argument( + "--debug", + dest="debug", + action="store_true", + help="Turn on debugging mode by printing more information to track progress", + required=False, + ) + + parser.add_argument( + "--cmec", + dest="cmec", + action="store_true", + help="Save metrics in CMEC format", + required=False, + ) + + parser.add_argument( + "--no_cmec", + dest="cmec", + action="store_false", + help="Option to not save metrics in CMEC format", + required=False, + ) + + parser.add_argument( + "--chunk_size", + dest="chunk_size", + default=None, + help="Chunk size for latitude/longitude", + required=False, + ) + + parser.add_argument( + "--annual_strict", + dest="annual_strict", + action="store_true", + help="Flag to only include current year in rolling data calculations", + ) + + parser.add_argument( + "--exclude_leap_day", + dest="exclude_leap", + action="store_true", + help="Flag to exclude leap days", + ) + + parser.add_argument( + "--keep_incomplete_djf", + dest="drop_incomplete_djf", + action="store_false", + help="Flag to include data from incomplete DJF seasons", + ) + + parser.add_argument( + "--dec_mode", + dest="dec_mode", + default="DJF", + help="'DJF' or 'JFD' format for December/January/February season", + ) + + parser.add_argument( + "--year_range", + type=list, + default=[None, None], + help="List containing the start and end year", + ), + parser.add_argument( + "--covariate_path", type=str, default=None, help="Covariate file path" + ) + parser.add_argument( + "--covariate", type=str, default="CO2mass", help="Covariate variable name" + ) + + parser.add_argument( + "--shp_path", + type=str, + default=None, + help="Region shapefile path. Must also provide --column and --region_name. Only one of --shp_path, --coords can be used.", + required=False, + ) + + parser.add_argument( + "--attribute", + type=str, + default=None, + help="Name of region attribute column in shapefile", + required=False, + ) + parser.add_argument( + "--region_name", + type=str, + default=None, + help="Name of region. If from shapefile, value must be found under attribute given by --column", + required=False, + ) + + parser.add_argument( + "--coords", + type=list, + default=None, + help="List of coordinates for region bounds. Must be provided in consecutive order around shape perimeter. Only one of --shp_path, --coords can be used.", + required=False, + ) + + parser.add_argument( + "--generate_sftlf", + action="store_true", + help="Flag to generate land sea mask if not found.", + required=False, + ) + + parser.add_argument( + "--regrid", + type=bool, + default=True, + help="Set to False if model and reference data all use same grid.", + required=False, + ) + + parser.add_argument( + "--plots", + action="store_true", + help="Set to True to generate figures.", + required=False, + ) + parser.add_argument( + "--osyear", dest="osyear", type=int, help="Start year for reference data set" + ) + parser.add_argument( + "--msyear", dest="msyear", type=int, help="Start year for model data set" + ) + parser.add_argument( + "--oeyear", dest="oeyear", type=int, help="End year for reference data set" + ) + parser.add_argument( + "--meyear", dest="meyear", type=int, help="End year for model data set" + ) + parser.add_argument( + "--ObsUnitsAdjust", + type=tuple, + default=(False, 0, 0, None), + help="For unit adjust for OBS dataset. For example:\n" + "- (True, 'divide', 100.0, 'hPa') # Pa to hPa\n" + "- (True, 'subtract', 273.15, 'C') # degK to degC\n" + "- (False, 0, 0, None) # No adjustment (default)", + ) + parser.add_argument( + "--ModUnitsAdjust", + type=tuple, + default=(False, 0, 0, None), + help="For unit adjust for model dataset. For example:\n" + "- (True, 'divide', 100.0, 'hPa') # Pa to hPa\n" + "- (True, 'subtract', 273.15, 'C') # degK to degC\n" + "- (False, 0, 0, None) # No adjustment (default)", + ) + + parser.add_argument( + "--return_period", + type=int, + default=20, + help="Return period, in years, for obtaining return values.", + ) + + return parser diff --git a/pcmdi_metrics/extremes/lib/metadata.py b/pcmdi_metrics/extremes/lib/metadata.py new file mode 100644 index 000000000..df7edc791 --- /dev/null +++ b/pcmdi_metrics/extremes/lib/metadata.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python +import json +import os + + +class MetadataFile: + # This class organizes the contents for the CMEC + # metadata file called output.json, which describes + # the other files in the output bundle. + + def __init__(self, metrics_output_path): + self.outfile = os.path.join(metrics_output_path, "output.json") + self.json = { + "provenance": { + "environment": "", + "modeldata": "", + "obsdata": "", + "log": "", + }, + "metrics": {}, + "data": {}, + "plots": {}, + } + + def update_metrics(self, kw, filename, longname, desc): + tmp = {"filename": filename, "longname": longname, "description": desc} + self.json["metrics"].update({kw: tmp}) + return + + def update_data(self, kw, filename, longname, desc): + tmp = {"filename": filename, "longname": longname, "description": desc} + self.json["data"].update({kw: tmp}) + return + + def update_plots(self, kw, filename, longname, desc): + tmp = {"filename": filename, "longname": longname, "description": desc} + self.json["plots"].update({kw: tmp}) + + def update_provenance(self, kw, data): + self.json["provenance"].update({kw: data}) + return + + def update_index(self, val): + self.json["index"] = val + return + + def write(self): + with open(self.outfile, "w") as f: + json.dump(self.json, f, indent=4) diff --git a/pcmdi_metrics/extremes/lib/plot_extremes.py b/pcmdi_metrics/extremes/lib/plot_extremes.py new file mode 100644 index 000000000..a8d74358c --- /dev/null +++ b/pcmdi_metrics/extremes/lib/plot_extremes.py @@ -0,0 +1,206 @@ +#!/usr/bin/env python +import json +import math +import os + +import cartopy.crs as ccrs +import matplotlib.pyplot as plt +import numpy as np +from cartopy.mpl.ticker import LatitudeFormatter, LongitudeFormatter + +from pcmdi_metrics.graphics import TaylorDiagram + + +def make_maps(data, model, run, region_name, index, yrs, plot_dir, desc, meta): + # Consolidating some plotting code here to streamline main function + output_template = os.path.join( + plot_dir, "_".join([model, run, region_name, index, "season"]) + ) + plot_extremes(data, index, model, run, yrs, output_template) + meta.update_plots( + os.path.basename(output_template), output_template + ".png", index, desc + ) + return meta + + +def plot_extremes(data, metric, model, run, yrs, output_template): + if yrs == [None, None]: + start_year = int(data.time[0].dt.year) + end_year = int(data.time[-1].dt.year) + else: + start_year = yrs[0] + end_year = yrs[1] + yrs_str = "({0}-{1})".format(start_year, end_year) + + if metric in ["TXx", "TXn", "TNx", "TNn"]: + colors = "YlOrRd" + elif metric in ["Rx1day", "Rx5day"]: + colors = "PuBu" + + for season in ["ANN", "DJF", "MAM", "JJA", "SON"]: + ds = data[season].mean("time") + outfile = output_template.replace("season", season) + title = " ".join([model, run, season, "mean", metric, yrs_str]) + min_lev = math.floor(ds.min() / 10) * 10 + max_lev = math.floor(ds.max() / 10) * 10 + levels = np.arange(min_lev, max_lev + 10, 10) + try: + plot_map_cartopy( + ds, outfile, title=title, proj="Robinson", cmap=colors, levels=levels + ) + except Exception as e: + print("Error. Could not create figure", outfile, ":") + print(" ", e) + return + + +def plot_map_cartopy( + data, + filename, + title=None, + gridline=True, + levels=None, + proj="PlateCarree", + data_area="global", + cmap="RdBu_r", + center_lon_global=180, + maskout=None, + debug=False, +): + # Taken from similar function in variability_mode.lib.plot_map + + lons = data.lon + lats = data.lat + + min_lon = min(lons) + max_lon = max(lons) + min_lat = min(lats) + max_lat = max(lats) + if debug: + print(min_lon, max_lon, min_lat, max_lat) + + """ map types: + https://github.com/SciTools/cartopy-tutorial/blob/master/tutorial/projections_crs_and_terms.ipynb + """ + if proj == "PlateCarree": + projection = ccrs.PlateCarree(central_longitude=center_lon_global) + elif proj == "Robinson": + projection = ccrs.Robinson(central_longitude=center_lon_global) + + # Generate plot + fig = plt.figure(figsize=(8, 6)) + ax = plt.axes(projection=projection) + im = ax.contourf( + lons, + lats, + data, + transform=ccrs.PlateCarree(), + cmap=cmap, + levels=levels, + extend="both", + ) + ax.coastlines() + + # Grid Lines and tick labels + if proj == "PlateCarree": + if data_area == "global": + if gridline: + ax.gridlines(alpha=0.5, linestyle="--") + ax.set_xticks([0, 60, 120, 180, 240, 300, 360], crs=ccrs.PlateCarree()) + ax.set_yticks([-90, -60, -30, 0, 30, 60, 90], crs=ccrs.PlateCarree()) + lon_formatter = LongitudeFormatter(zero_direction_label=True) + lat_formatter = LatitudeFormatter() + ax.xaxis.set_major_formatter(lon_formatter) + ax.yaxis.set_major_formatter(lat_formatter) + else: + if gridline: + ax.gridlines(draw_labels=True, alpha=0.5, linestyle="--") + elif proj == "Robinson": + if gridline: + ax.gridlines(alpha=0.5, linestyle="--") + + # Add title + plt.title(title, pad=15, fontsize=15) + + # Add colorbar + posn = ax.get_position() + cbar_ax = fig.add_axes([0, 0, 0.1, 0.1]) + cbar_ax.set_position([posn.x0 + posn.width + 0.01, posn.y0, 0.01, posn.height]) + cbar = plt.colorbar(im, cax=cbar_ax) + cbar.ax.tick_params(labelsize=10) + + if proj == "PlateCarree": + ax.set_aspect("auto", adjustable=None) + + # Done, save figure + fig.savefig(filename) + plt.close("all") + + return + + +def taylor_diag(fname, outfile_template): + with open(fname, "r") as metrics_file: + metrics = json.load(metrics_file) + + models = metrics["DIMENSIONS"]["model"] + realizations = metrics["DIMENSIONS"]["realization"] + region = metrics["DIMENSIONS"]["region"] + indices = metrics["DIMENSIONS"]["index"] + + # For legend + models_label = models.copy() + if "Reference" in models_label: + models_label.remove("Reference") + + nc = 1 + fsize = (8, 5) + if len(models_label) > 10: + nc = 2 + fsize = (12, 5) + + for s in ["ANN", "DJF", "MAM", "SON", "JJA"]: + for r in realizations: + # Possible for a realization to be not found for every model + if r not in metrics["RESULTS"][models[1]]: + continue + for idx in indices: + if idx not in metrics["RESULTS"][models[1]][r]: + continue + for rg in region: + stat_dict = {} + for stat in ["std_xy", "std-obs_xy", "cor_xy"]: + tmp = [] + for m in models: + if m == "Reference": + continue + else: + tmp.append(metrics["RESULTS"][m][r][idx][rg][stat][s]) + stat_dict[stat] = np.array(tmp) + + stddev = stat_dict["std_xy"] + corrcoeff = stat_dict["cor_xy"] + refstd = stat_dict["std-obs_xy"] + + plottitle = " ".join([r, s, idx, rg]) + outfile = ( + outfile_template.replace("realization", r) + .replace("region", rg) + .replace("index", idx) + .replace("season", s) + ) + + fig = plt.figure(figsize=fsize) + fig, ax = TaylorDiagram( + stddev, + corrcoeff, + refstd, + fig=fig, + labels=models_label, + ref_label="Reference", + ) + + ax.legend(bbox_to_anchor=(1.05, 0), loc="lower left", ncol=nc) + fig.suptitle(plottitle, fontsize=20) + plt.savefig(outfile) + return diff --git a/pcmdi_metrics/extremes/lib/region_utilities.py b/pcmdi_metrics/extremes/lib/region_utilities.py new file mode 100644 index 000000000..d2f599a55 --- /dev/null +++ b/pcmdi_metrics/extremes/lib/region_utilities.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python +import os +import sys + +import geopandas as gpd +import numpy as np +import regionmask + + +def check_region_params(shp_path, coords, region_name, col, default): + use_region_mask = False + + # Underscore will mess with file name slicing in extremes driver + if region_name is not None and "_" in region_name: + print("Error: Underscore character not permitted in region_name.") + sys.exit() + + if shp_path is not None: + use_region_mask = True + if not os.path.exists(shp_path): + print("Error: Shapefile path does not exist.") + print("Must provide valid shapefile path.") + sys.exit() + if region_name is None: + print( + "Error: Region name parameter --region_name must be provided with shapefile." + ) + sys.exit() + if col is None: + print( + "Error: Column name parameter --column must be provided with shapefile." + ) + sys.exit() + print("Region settings are:") + print(" Shapefile:", shp_path) + print(" Column name:", col) + print(" Region name:", region_name) + elif coords is not None: + use_region_mask = True + # Coords is a list that might be ingested badly + # from command line, so some cleanup is done here if needed. + if isinstance(coords, list): + if coords[0] == "[": + tmp = "" + for n in range(0, len(coords)): + tmp = tmp + str(coords[n]) + coords = tmp + if isinstance(coords, str): + tmp = coords.replace("[", "").replace("]", "").split(",") + coords = [ + [float(tmp[n]), float(tmp[n + 1])] for n in range(0, len(tmp) - 1, 2) + ] + if region_name is None: + print("No region name provided. Using 'custom'.") + region_name = "custom" + print("Region settings are:") + print(" Coordinates:", coords) + print(" Region name:", region_name) + else: + region_name = default + + return use_region_mask, region_name, coords + + +def mask_region(data, name, coords=None, shp_path=None, column=None): + # Return data masked from coordinate list or shapefile. + # Masks a single region + + lon = data["lon"].data + lat = data["lat"].data + + # Option 1: Region is defined by coord pairs + if coords is not None: + try: + names = [name] + regions = regionmask.Regions([np.array(coords)], names=names) + mask = regions.mask(lon, lat) + val = 0 + except Exception as e: + print("Error in creating mask from provided coordinates:") + print(" ", e) + sys.exit() + + # Option 2: region is defined by shapefile + elif shp_path is not None: + try: + regions_file = gpd.read_file(shp_path) + if column is not None: + regions = regionmask.from_geopandas(regions_file, names=column) + else: + print("Column name not provided.") + regions = regionmask.from_geopandas(regions_file) + mask = regions.mask(lon, lat) + # Can't match mask by name, rather index of name + val = list(regions_file[column]).index(name) + except Exception as e: + print("Error in creating mask from shapefile:") + print(" ", e) + sys.exit() + + else: + print("Error in masking: Region coordinates or shapefile must be provided.") + sys.exit() + + try: + masked_data = data.where(mask == val) + except Exception as e: + print("Error: Masking failed.") + print(" ", e) + sys.exit() + + return masked_data diff --git a/pcmdi_metrics/extremes/lib/return_value.py b/pcmdi_metrics/extremes/lib/return_value.py new file mode 100644 index 000000000..376d00b9c --- /dev/null +++ b/pcmdi_metrics/extremes/lib/return_value.py @@ -0,0 +1,579 @@ +#!/usr/bin/env python +import os + +import numpy as np +import xarray as xr +import xcdat as xc +from numdifftools.core import Hessian +from scipy.optimize import minimize +from scipy.stats import genextreme + +from pcmdi_metrics.extremes.lib import utilities + + +def compute_rv_from_file( + filelist, cov_filepath, cov_name, outdir, return_period, meta, maxes=True +): + # Go through all files and get return value and standard error by file. + # Write results to netcdf file. + if cov_filepath is None: + desc1 = "Return value from stationary GEV fit for single realization" + desc2 = ( + "Standard error for return value from stationary fit for single realization" + ) + else: + desc1 = "Return value from nonstationary GEV fit for single realization" + desc2 = "Standard error for return value from nonstationary fit for single realization" + + for ncfile in filelist: + ds = xc.open_dataset(ncfile) + print(ncfile) + rv, se = get_dataset_rv(ds, cov_filepath, cov_name, return_period, maxes) + if rv is None: + print("Error in calculating return value for", ncfile) + print("Skipping file.") + continue + + fname = os.path.basename(ncfile).replace(".nc", "") + rv_file = outdir + "/" + fname + "_return_value.nc" + utilities.write_netcdf_file(rv_file, rv) + meta.update_data( + os.path.basename(rv_file), + rv_file, + "return_value", + desc1, + ) + + se_file = outdir + "/" + fname + "_standard_error.nc" + utilities.write_netcdf_file(se_file, se) + meta.update_data( + os.path.basename(se_file), + se_file, + "standard_error", + desc2, + ) + + return meta + + +def compute_rv_for_model( + filelist, cov_filepath, cov_varname, ncdir, return_period, meta, maxes=True +): + # Similar to compute_rv_from_dataset, but to work on multiple realizations + # from the same model + # Arguments: + # ds: xarray dataset + # cov_filepath: string + # cov_varname: string + # return_period: int + # maxes: bool + + nreal = len(filelist) + + ds = xc.open_dataset(filelist[0]) + units = ds.ANN.attrs["units"] + + print("Return value for multiple realizations") + if cov_filepath is not None: + nonstationary = True + print("Nonstationary case") + else: + nonstationary = False + print("Stationary case") + + if nonstationary: + cov_ds = utilities.load_dataset([cov_filepath]) + + if len(cov_ds.time) != len(ds.time): + start_year = int(ds.time.dt.year[0]) + end_year = int(ds.time.dt.year[-1]) + cov_ds = utilities.slice_dataset(cov_ds, start_year, end_year) + + # Even after slicing, it's possible that time ranges didn't overlap + if len(cov_ds.time) != len(ds.time): + print( + "Covariate timeseries must have same number of years as block extremes dataset." + ) + print("Skipping return value calculation for files:") + print(filelist) + return meta + + # To numpy array + cov_np = cov_ds[cov_varname].data.squeeze() + cov_ds.close() + + dec_mode = str(ds.attrs["december_mode"]) + drop_incomplete_djf = ds.attrs["drop_incomplete_djf"] + if drop_incomplete_djf == "False": + drop_incomplete_djf = False + else: + drop_incomplete_djf = True + + time = len(ds.time) # This will change for DJF cases + lat = len(ds.lat) + lon = len(ds.lon) + + if nonstationary: + return_value = xr.zeros_like(ds) + else: + return_value = xr.zeros_like(ds.isel({"time": 0})) + return_value = return_value.drop(labels=["time"]) + return_value.drop(labels=["lon_bnds", "lat_bnds", "time_bnds"]) + standard_error = xr.zeros_like(return_value) + ds.close() + + for season in ["ANN", "DJF", "MAM", "JJA", "SON"]: + print("*****\n", season, "\n*****") + if season == "DJF" and dec_mode == "DJF" and drop_incomplete_djf: + # Step first time index to skip all-nan block + i1 = 1 + else: + i1 = 0 + if nonstationary: + cov = cov_np[i1:].squeeze() + else: + cov = None + # Flatten input data and create output arrays + t = time - i1 + arr = np.ones((t * nreal, lat * lon)) + rep_ind = np.zeros((t * nreal)) + count = 0 + for ncfile in filelist: + ds = xc.open_dataset(ncfile) + print(ncfile) + data = np.reshape(ds[season].data, (time, lat * lon)) + ind1 = count * t + ind2 = ind1 + t + count += 1 + arr[ind1:ind2, :] = data[i1:, :] + rep_ind[ind1:ind2] = count + ds.close() + scale_factor = np.abs(np.nanmean(arr)) + arr = arr / scale_factor + if nonstationary: + rv_array = np.ones((t, lat * lon)) * np.nan + else: + rv_array = np.ones((lat * lon)) * np.nan + se_array = rv_array.copy() + # Here's where we're doing the return value calculation + for j in range(0, lat * lon): + if np.sum(arr[:, j]) == 0: + continue + elif np.isnan(np.sum(arr[:, j])): + continue + rv, se = calc_rv_py( + arr[:, j].squeeze(), cov, return_period, nreplicates=nreal, maxes=maxes + ) + if rv is not None: + if nonstationary: + rv_array[i1:, j] = np.squeeze(rv * scale_factor) + se_array[i1:, j] = np.squeeze(se * scale_factor) + else: + rv_array[j] = rv * scale_factor + se_array[j] = se * scale_factor + + # reshape array to match desired dimensions and add to Dataset + # Also reorder dimensions for nonstationary case + if nonstationary: + rv_array = np.reshape(rv_array, (time, lat, lon)) + se_array = np.reshape(se_array, (time, lat, lon)) + return_value[season] = (("time", "lat", "lon"), rv_array) + standard_error[season] = (("time", "lat", "lon"), se_array) + else: + rv_array = np.reshape(rv_array, (lat, lon)) + se_array = np.reshape(se_array, (lat, lon)) + return_value[season] = (("lat", "lon"), rv_array) + standard_error[season] = (("lat", "lon"), se_array) + + return_value.attrs["description"] = "{0}-year return value".format(return_period) + standard_error.attrs["description"] = "standard error" + for season in ["ANN", "DJF", "MAM", "JJA", "SON"]: + return_value[season].attrs["units"] = units + standard_error[season].attrs["units"] = units + + # Update attributes + return_value.attrs["description"] = "{0}-year return value".format(return_period) + standard_error.attrs["description"] = "standard error" + for season in ["ANN", "DJF", "MAM", "JJA", "SON"]: + return_value[season].attrs["units"] = units + standard_error[season].attrs["units"] = units + + return_value = return_value.bounds.add_missing_bounds() + standard_error = standard_error.bounds.add_missing_bounds() + + # Set descriptions for metadata + if nonstationary: + desc1 = "Return value from stationary GEV fit for multiple realizations" + desc2 = "Standard error for return value from stationary fit for multiple realizations" + else: + desc1 = "Return value from nonstationary GEV fit for multiple realizations" + desc2 = "Standard error for return value from nonstationary fit for multiple realizations" + + fname = os.path.basename(filelist[0]) + real = fname.split("_")[1] + fname = fname.replace(real + "_", "").replace(".nc", "") + outfile = os.path.join(ncdir, fname + "_return_value.nc") + utilities.write_netcdf_file(outfile, return_value) + meta.update_data(os.path.basename(outfile), outfile, "return_value", desc1) + + outfile = os.path.join(ncdir, fname + "_standard_error.nc") + utilities.write_netcdf_file(outfile, standard_error) + meta.update_data(os.path.basename(outfile), outfile, "standard_error", desc2) + + return meta + + +def get_dataset_rv(ds, cov_filepath, cov_varname, return_period=20, maxes=True): + # Get the return value for a single model & realization + # Set cov_filepath and cov_varname to None for stationary GEV. + # Arguments: + # ds: xarray dataset + # cov_filepath: string + # cov_varname: string + # return_period: int + # maxes: bool + + dec_mode = str(ds.attrs["december_mode"]) + drop_incomplete_djf = ds.attrs["drop_incomplete_djf"] + if drop_incomplete_djf == "False": + drop_incomplete_djf = False + else: + drop_incomplete_djf = True + units = ds.ANN.attrs["units"] + + print( + "Return value for single realization", + ) + if cov_filepath is not None: + nonstationary = True + print("Nonstationary case") + else: + nonstationary = False + print("Stationary case") + + if nonstationary: + cov_ds = utilities.load_dataset([cov_filepath]) + if len(cov_ds.time) != len(ds.time): + start_year = int(ds.time.dt.year[0]) + end_year = int(ds.time.dt.year[-1]) + cov_ds = utilities.slice_dataset(cov_ds, start_year, end_year) + + # Even after slicing, it's possible that time ranges didn't overlap + if len(cov_ds.time) != len(ds.time): + print( + "Covariate timeseries must have same number of years as block extremes dataset." + ) + print("Skipping return value calculation.") + return None, None + + # To numpy array + cov_ds = cov_ds[cov_varname].data.squeeze() + + lat = len(ds["lat"]) + lon = len(ds["lon"]) + time = len(ds["time"]) + dim2 = lat * lon + + if nonstationary: + return_value = xr.zeros_like(ds) + else: + return_value = xr.zeros_like(ds.isel({"time": 0})) + return_value = return_value.drop(labels=["time"]) + return_value.drop(labels=["lon_bnds", "lat_bnds", "time_bnds"]) + standard_error = return_value.copy() + + for season in ["ANN", "DJF", "MAM", "JJA", "SON"]: + data = ds[season].data + # Scale x to be around magnitude 1 + scale_factor = np.abs(np.nanmean(data)) + data = data / scale_factor + + if season == "DJF" and dec_mode == "DJF" and drop_incomplete_djf: + # Step first time index to skip all-nan block + i1 = 1 + else: + i1 = 0 + + data = np.reshape(data, (time, dim2)) + if nonstationary: + rv_array = np.ones(np.shape(data)) * np.nan + else: + rv_array = np.ones((dim2)) * np.nan + se_array = rv_array.copy() + + # Turn nans to zeros + data = np.nan_to_num(data) + + if nonstationary: + cov_slice = cov_ds[i1:] + else: + cov_slice = None + + for j in range(0, dim2): + b = data[i1:, j] + if np.sum(b) == 0: + continue + elif np.isnan(np.sum(b)): + continue + rv_tmp, se_tmp = calc_rv_py( + data[i1:, j].squeeze(), cov_slice, return_period, 1, maxes + ) + if rv_tmp is not None: + if nonstationary: + rv_array[i1:, j] = rv_tmp * scale_factor + se_array[i1:, j] = se_tmp * scale_factor + else: + rv_array[j] = rv_tmp * scale_factor + se_array[j] = se_tmp * scale_factor + + if nonstationary: + rv_array = np.reshape(rv_array, (time, lat, lon)) + se_array = np.reshape(se_array, (time, lat, lon)) + return_value[season] = (("time", "lat", "lon"), rv_array) + standard_error[season] = (("time", "lat", "lon"), se_array) + + else: + rv_array = np.reshape(rv_array, (lat, lon)) + se_array = np.reshape(se_array, (lat, lon)) + return_value[season] = (("lat", "lon"), rv_array) + standard_error[season] = (("lat", "lon"), se_array) + + return_value.attrs["description"] = "{0}-year return value".format(return_period) + standard_error.attrs["description"] = "standard error" + for season in ["ANN", "DJF", "MAM", "JJA", "SON"]: + return_value[season].attrs["units"] = units + standard_error[season].attrs["units"] = units + + return_value = return_value.bounds.add_missing_bounds() + standard_error = standard_error.bounds.add_missing_bounds() + + return return_value, standard_error + + +def calc_rv_py(x, covariate, return_period, nreplicates=1, maxes=True): + # An implementation of the return value and standard error + # that does not use climextRemes. + # Arguments: + # ds: numpy array + # covariate: numpy array + # nreplicates: int + # return_period: int + # maxes: bool + + if maxes: + mins = False + else: + mins = True + x = -1 * x + + nonstationary = True + if covariate is None: + nonstationary = False + + # Need to tile covariate if multiple replicates + if nonstationary and nreplicates > 1: + covariate_tiled = np.tile(covariate, nreplicates) + elif nonstationary: + covariate_tiled = covariate + + # Use the stationary gev to make initial parameter guess + fit = genextreme.fit(x) + shape, loc, scale = fit + + def ll(params): + # Negative Log liklihood function to minimize for GEV + + n = len(x) + if nonstationary: + beta1 = params[0] + beta2 = params[1] + scale = params[2] + shape = params[3] + location = beta1 + beta2 * covariate_tiled + else: + location = params[0] + scale = params[1] + shape = params[2] + + if np.allclose(np.array(shape), np.array(0)): + shape = 0 + y = (x - location) / scale + result = np.sum(n * np.log(scale) + y + np.exp(-y)) + else: + # This value must be > 0, Coles 2001 + y = 1 + shape * (x - location) / scale + check = [True for item in y if item <= 0] + if len(check) > 0: + return 1e10 + result = np.sum( + np.log(scale) + y ** (-1 / shape) + np.log(y) * (1 / shape + 1) + ) + + return result + + # Get GEV parameters + if nonstationary: + ll_min = minimize(ll, (loc, 0, scale, shape), tol=1e-7, method="nelder-mead") + else: + ll_min = minimize(ll, (loc, scale, shape), tol=1e-7, method="nelder-mead") + + params = ll_min["x"] + success = ll_min["success"] + + if nonstationary: + scale = params[2] + shape = params[3] + else: + location = params[0] + scale = params[1] + shape = params[2] + covariate = [1] # set cov size to 1 + + # Calculate return value + return_value = np.ones((len(covariate), 1)) * np.nan + for time in range(0, len(covariate)): + if nonstationary: + location = params[0] + params[1] * covariate[time] + rv = genextreme.isf(1 / return_period, shape, location, scale) + return_value[time] = np.squeeze(np.where(success == 1, rv, np.nan)) + if mins: + return_value = -1 * return_value + + # Calculate standard error + try: + hs = Hessian(ll, step=None, method="central", order=None) + vcov = np.linalg.inv(hs(ll_min.x)) + var_theta = np.diag(vcov) + if (var_theta < 0).any(): + # Try again with a different method + hs = Hessian(ll, step=None, method="complex", order=None) + vcov = np.linalg.inv(hs(ll_min.x)) + var_theta = np.diag(vcov) + if (var_theta < 0).any(): + # Negative values on diagonal not good + raise RuntimeError("Negative value in diagonal of Hessian.") + + if nonstationary: + cov = covariate + y = -np.log(1 - 1 / return_period) + if shape == 0: + grad = np.array([1, -np.log(y)]) + else: + db1 = np.ones(len(cov)) + db2 = cov + dsh = np.ones(len(cov)) * (-1 / shape) * (1 - y ** (-shape)) + dsc = np.ones(len(cov)) * scale * (shape**-2) * (1 - y**-shape) - ( + scale / shape * (y**-shape) * np.log(y) + ) + grad = np.array([db1, db2, dsh, dsc]) + else: + y = -np.log(1 - 1 / return_period) + if shape == 0: + grad = np.array([1, -np.log(y)]) + else: + db1 = 1 + dsh = (-1 / shape) * (1 - y ** (-shape)) + dsc = scale * (shape**-2) * (1 - y**-shape) - ( + scale / shape * (y**-shape) * np.log(y) + ) + grad = np.array([db1, dsh, dsc]) + grad = np.expand_dims(grad, axis=1) + + A = np.matmul(np.transpose(grad), vcov) + B = np.matmul(A, grad) + se = np.sqrt(np.diag(B)) + except Exception: + se = np.ones(np.shape(return_value)) * np.nan + + return return_value.squeeze(), se.squeeze() + + +def calc_rv_interpolated(tseries, return_period, average=False): + # A function to get a stationary return period + # interpolated from the block maximum data + # The "average" parameter works best for the 100 + # year timeseries. + if return_period < 1: + return None + nyrs = len(tseries) + tsorted = np.sort(tseries)[::-1] + if return_period > nyrs: + print("Return period cannot be greater than length of timeseries.") + return None + rplist = [nyrs / n for n in range(1, nyrs + 1)] + count = 0 + for item in rplist: + try: + if item > return_period: + continue + if item < return_period: + # linearly interpolate between measurements + # to estimate return value + rp_upper = rplist[count - 1] + rp_lower = rplist[count] + + def f(x): + m = (tsorted[count - 1] - tsorted[count]) / (rp_upper - rp_lower) + b = tsorted[count] - (m * rp_lower) + return m * x + b + + rv = f(return_period) + break + elif item == return_period: + if average: + rv = (tsorted[count] + tsorted[count - 1]) / 2.0 + else: + rv = tsorted[count] + break + except Exception: # any issues, set to NaN + rv = np.nan + break + count += 1 + return rv, np.nan + + +""" +def calc_rv_climex(data, covariate, return_period, nreplicates=1, maxes=True): + # Use climextRemes to get the return value and standard error + # This function exists for easy comparison with the pure Python + # implementation in calc_rv_py. However, generating the return + # value this way is not supported as part of the PMP. + # Returns the return value and standard error. + # Arguments: + # ds: numpy array + # covariate: numpy array + # nreplicates: int + # return_period: int + # maxes: bool + return_value = None + standard_error = None + if covariate is None: # Stationary + tmp = climextremes.fit_gev( + data.squeeze(), + returnPeriod=return_period, + nReplicates=nreplicates, + maxes=maxes, + ) + else: # Nonstationary + if len(covariate) < len(data): + covariate_tiled = np.tile(covariate, nreplicates) + xnew = covariate + else: + covariate_tiled = covariate + xlen = len(covariate) / nreplicates + xnew = covariate[0:xlen] + tmp = climextremes.fit_gev( + data.squeeze(), + covariate_tiled, + returnPeriod=return_period, + nReplicates=nreplicates, + locationFun=1, + maxes=maxes, + xNew=xnew, + ) + success = tmp["info"]["failure"][0] + if success == 0: + return_value = tmp["returnValue"] + standard_error = tmp["se_returnValue"] + return return_value, standard_error +""" diff --git a/pcmdi_metrics/extremes/lib/utilities.py b/pcmdi_metrics/extremes/lib/utilities.py new file mode 100644 index 000000000..701dad016 --- /dev/null +++ b/pcmdi_metrics/extremes/lib/utilities.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python +import datetime +import os +import sys + +import cftime +import xcdat + +from pcmdi_metrics.io import xcdat_openxml +from pcmdi_metrics.io.base import Base +from pcmdi_metrics.utils import create_land_sea_mask + + +def load_dataset(filepath): + # Load an xarray dataset from the given filepath. + # If list of netcdf files, opens mfdataset. + # If list of xmls, open last file in list. + if filepath[-1].endswith(".xml"): + # Final item of sorted list would have most recent version date + ds = xcdat_openxml.xcdat_openxml(filepath[-1]) + elif len(filepath) > 1: + ds = xcdat.open_mfdataset(filepath, chunks=None) + else: + ds = xcdat.open_dataset(filepath[0]) + return ds + + +def slice_dataset(ds, start_year, end_year): + cal = ds.time.encoding["calendar"] + start_time = cftime.datetime(start_year, 1, 1, calendar=cal) - datetime.timedelta( + days=0 + ) + end_time = cftime.datetime(end_year + 1, 1, 1, calendar=cal) - datetime.timedelta( + days=1 + ) + ds = ds.sel(time=slice(start_time, end_time)) + return ds + + +def replace_multi(string, rdict): + # Replace multiple keyworks in a string template + # based on key-value pairs in 'rdict'. + for k in rdict.keys(): + string = string.replace(k, rdict[k]) + return string + + +def write_to_nc(data, model, run, region_name, index, years, ncdir, desc, meta): + # Consolidating some netcdf writing code here to streamline main function + yrs = "-".join(years) + filepath = os.path.join( + ncdir, "_".join([model, run, region_name, index, yrs]) + ".nc" + ) + write_netcdf_file(filepath, data) + meta.update_data(os.path.basename(filepath), filepath, index, desc) + return meta + + +def write_netcdf_file(filepath, ds): + try: + ds.to_netcdf(filepath, mode="w") + except PermissionError as e: + if os.path.exists(filepath): + print(" Permission error. Removing existing file", filepath) + os.remove(filepath) + print(" Writing new netcdf file", filepath) + ds.to_netcdf(filepath, mode="w") + else: + print(" Permission error. Could not write netcdf file", filepath) + print(" ", e) + except Exception as e: + print(" Error: Could not write netcdf file", filepath) + print(" ", e) + + +def write_to_json(outdir, json_filename, json_dict): + # Open JSON + JSON = Base(outdir, json_filename) + json_structure = json_dict["DIMENSIONS"]["json_structure"] + + JSON.write( + json_dict, + json_structure=json_structure, + sort_keys=True, + indent=4, + separators=(",", ": "), + ) + return + + +def verify_years(start_year, end_year, msg="Error: Invalid start or end year"): + if start_year is None and end_year is None: + return + elif start_year is None or end_year is None: + # If only one of the two is set, exit. + print(msg) + print("Exiting") + sys.exit() + + +def verify_output_path(metrics_output_path, case_id): + if metrics_output_path is None: + metrics_output_path = datetime.datetime.now().strftime("v%Y%m%d") + if case_id is not None: + metrics_output_path = metrics_output_path.replace("%(case_id)", case_id) + if not os.path.exists(metrics_output_path): + print("\nMetrics output path not found.") + print("Creating metrics output directory", metrics_output_path) + try: + os.makedirs(metrics_output_path) + except Exception as e: + print("\nError: Could not create metrics output path", metrics_output_path) + print(e) + print("Exiting.") + sys.exit() + return metrics_output_path + + +def set_up_realizations(realization): + find_all_realizations = False + if realization is None: + realization = "" + realizations = [realization] + elif isinstance(realization, str): + if realization.lower() in ["all", "*"]: + find_all_realizations = True + else: + realizations = [realization] + elif isinstance(realization, list): + realizations = realization + + return find_all_realizations, realizations + + +def generate_land_sea_mask(data, debug=False): + # generate sftlf if not provided. + sft = create_land_sea_mask(data) + sftlf = data.copy(data=None) + sftlf["sftlf"] = sft * 100 + + return sftlf diff --git a/pcmdi_metrics/extremes/param/daily_model_data.py b/pcmdi_metrics/extremes/param/daily_model_data.py new file mode 100644 index 000000000..465e3cb9b --- /dev/null +++ b/pcmdi_metrics/extremes/param/daily_model_data.py @@ -0,0 +1,50 @@ +# This parameter file can be used as a guide +# for setting up the extremes parameter file. + +# ====tasmax==== +# vars = ["tasmax"] +# ModUnitsAdjust=(True,"subtract",273,"C") + +# ===pr==== +# Note: Variables do not have to be run separately +# if units do not require adjusting. +vars = ["pr"] +ModUnitsAdjust = (True, "multiply", 86400, "mm/day") + + +metrics_output_path = "./%(case_id)" + +# Covariate - comment out to do nonstationary +# covariate = "mole_fraction_of_carbon_dioxide_in_air" +# covariate_path ="/home/ordonez4/git/pcmdi_metrics/pcmdi_metrics/extremes/co2_annual_1850-1999.nc" + +# Model data settings +test_data_set = ["MRI-ESM2-0"] +realization = ["r1i1p1f1"] +test_data_path = "/p/user_pub/xclim/CMIP6/CMIP/1pctCO2/atmos/day/%(variable)" +filename_template = "CMIP6.CMIP.1pctCO2.*.%(model).%(realization).day.%(variable).atmos.*.v????????.0000000.0.xml" +sftlf_filename_template = "/p/css03/esgf_publish/CMIP6/CMIP/*/%(model)/piControl/r1i1p1f1/fx/sftlf/gn/v????????/sftlf_fx_%(model)_piControl_r1i1p1f1_gn.nc" + +case_id = "demo" +dec_mode = "DJF" +annual_strict = False +drop_incomplete_djf = False +regrid = True +plots = False +generate_sftlf = True +msyear = 1980 +meyear = 1999 +return_period = 5 + +# Regional selection settings +# coords="" +# shp_path = "" +# column = "" +# region_name = "" + +# Observational settings +reference_data_path = "/p/user_pub/PCMDIobs/obs4MIPs/NASA-JPL/GPCP-1-3/day/pr/gn/latest/pr_day_GPCP-1-3_PCMDI_gn_19961002-20170101.nc" +reference_data_set = "GPCP-1-3" +osyear = 1997 +oeyear = 2016 +ObsUnitsAdjust = (True, "multiply", 86400, "mm/day") diff --git a/pcmdi_metrics/graphics/portrait_plot/return_value_portrait_plot_demo.ipynb b/pcmdi_metrics/graphics/portrait_plot/return_value_portrait_plot_demo.ipynb new file mode 100644 index 000000000..e719b7ceb --- /dev/null +++ b/pcmdi_metrics/graphics/portrait_plot/return_value_portrait_plot_demo.ipynb @@ -0,0 +1,470 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "566f9c84", + "metadata": {}, + "source": [ + "# Return Value Portrait Plot Demo\n", + "\n", + "This notebook demostrates one way to make a portrait plot using the return value metrics from the PMP Extremes Driver. \n", + "\n", + "The portrait plot will show the bias in return values relative to observations for a single region.\n", + "\n", + "Users have two options for running this notebook: they can either use randomly generated data or provide their own return value metrics files." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "b714a299", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "import numpy as np\n", + "\n", + "from pcmdi_metrics.graphics import portrait_plot" + ] + }, + { + "cell_type": "markdown", + "id": "3305ec0c", + "metadata": {}, + "source": [ + "This function will be used to get the seasonal average bias across all realizations. To use a different statistics than 'bias_xy', make that change here:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "35b1d5ed", + "metadata": {}, + "outputs": [], + "source": [ + "# Average over realizations\n", + "def avg_all_real(metrics_dict,model,stat,region,season):\n", + " vals = []\n", + " for real in metrics_dict[model]:\n", + " vals.append(metrics_dict[model][real][stat][region][\"bias_xy\"][season])\n", + " avg = np.array(vals)\n", + " avg = np.nanmean(vals)\n", + " return avg\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "8d2d85e0", + "metadata": {}, + "source": [ + "# Part 1: Process data" + ] + }, + { + "cell_type": "markdown", + "id": "c3179b90", + "metadata": {}, + "source": [ + "## Option 1: Create random data for demo only\n", + "\n", + "If you do not have run results to plot but want to see how to generate a portrait plot, use this randomly generated array instead.\n", + "\n", + "After running this cell, skip to the section **Part 2: Create Figure**." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "357ea9c9", + "metadata": {}, + "outputs": [], + "source": [ + "data_all = np.random.rand(4,3,6)*3\n", + "model_list = [\"Model1\",\"Model2\",\"Model3\"]\n", + "region = \"land\"" + ] + }, + { + "cell_type": "markdown", + "id": "d23f2369", + "metadata": {}, + "source": [ + "## Option 2: Use Extremes Driver Output" + ] + }, + { + "cell_type": "markdown", + "id": "e131f988", + "metadata": {}, + "source": [ + "If you do not have your own runs and would like to generate synthetic data, please use the **Option 1** instead.\n", + "\n", + "This portrait plot will show the model bias relative to observations. This means that the results would come from a run of the Extremes Driver using the stationary return value option with observations included.\n", + "\n", + "If multiple models and variables are being plotted, results will likely be needed from multiple different runs of the Extremes Driver. This notebook assumes that results for each variable (pr, tasmax, tasmin) are in separate runs, and therefore separate files. Different realizations for the same model should not be split across different runs.\n", + "\n", + "Once each metrics file is loaded, results from multiple realizations are averaged by model. The results for each variable are then concatenated into a single array to make the portrait plot." + ] + }, + { + "cell_type": "markdown", + "id": "804d7cf1", + "metadata": {}, + "source": [ + "### Global settings\n", + "\n", + "Provide the list of models (they will appear in this order in the figure). Also provide the region of the results." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a8e0b0a6", + "metadata": {}, + "outputs": [], + "source": [ + "# Edit this cell\n", + "model_list = [\"MRI-ESM2-0\"]\n", + "region = \"land\"" + ] + }, + { + "cell_type": "markdown", + "id": "608ab579", + "metadata": {}, + "source": [ + "### Precipitation\n", + "\n", + "Provide the path to the JSON file containing precipitation (Rx1day and Rx5day) return value metrics in the first cell and run. Then run the following cell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a7469b15", + "metadata": {}, + "outputs": [], + "source": [ + "# Edit this cell\n", + "\n", + "# Your metrics JSON path goes here.\n", + "# This can be a single string or a list of strings for multiple files.\n", + "RxFile=\"demo2/return_value_metrics.json\"\n", + "\n", + "# Example of using a list of files, where each run has different models:\n", + "# RxFile = [\"case1/return_value_metrics.json\",\"case2/return_value_metrics.json\"]\n", + "\n", + "# If there is no precipitation data, set RxFile to empty:\n", + "# RxFile = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61b1ca11", + "metadata": {}, + "outputs": [], + "source": [ + "# Do not edit this cell\n", + "if len(RxFile) > 0:\n", + " # Load metrics\n", + " if isinstance(RxFile,str):\n", + " with open(RxFile,\"r\") as metrics_json:\n", + " metrics=json.load(metrics_json)[\"RESULTS\"]\n", + " elif isinstance(RxFile,list):\n", + " metrics = {}\n", + " for fpath in RxFile:\n", + " with open(fpath,\"r\") as metrics_json:\n", + " metrics.update(json.load(metrics_json)[\"RESULTS\"])\n", + "\n", + " # Get averages for multiple realizations\n", + " statlist=[\"Rx1day\",\"Rx5day\"]\n", + " nmodels=len(model_list)\n", + " nstats = len(statlist)\n", + " # Averages are stored in a season x models x indices sized array\n", + " data_pr = np.ones((4,nmodels,nstats))*np.nan\n", + " for s_ind,season in enumerate([\"DJF\",\"MAM\",\"JJA\",\"SON\"]):\n", + " for st_ind,stat in enumerate(statlist):\n", + " for m_ind,model in enumerate(model_list):\n", + " data_pr[s_ind,m_ind,st_ind] = avg_all_real(metrics,model,stat,region,season)\n", + "else:\n", + " data_pr = None" + ] + }, + { + "cell_type": "markdown", + "id": "4f1a63cf", + "metadata": {}, + "source": [ + "### Max Temperature\n", + "\n", + "Provide the path to the JSON file containing maximum temperature (TXx and TXn) return value metrics in the first cell and run. Then run the following cell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "73380216", + "metadata": {}, + "outputs": [], + "source": [ + "# Edit this cell\n", + "\n", + "# Your metrics JSON path goes here.\n", + "# This can be a single string or a list of strings for multiple files.\n", + "TxFile=\"tasmax_json/return_value_metrics.json\"\n", + "\n", + "# If there is no temperature data, set TxFile to empty:\n", + "# TxFile = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d065630", + "metadata": {}, + "outputs": [], + "source": [ + "# Do not edit this cell\n", + "if len(TxFile) > 0:\n", + " # Load metrics\n", + " if isinstance(TxFile,str):\n", + " with open(TxFile,\"r\") as metrics_json:\n", + " metrics=json.load(metrics_json)[\"RESULTS\"]\n", + " elif isinstance(TxFile,list):\n", + " metrics = {}\n", + " for fpath in TxFile:\n", + " with open(fpath,\"r\") as metrics_json:\n", + " metrics.update(json.load(metrics_json)[\"RESULTS\"])\n", + "\n", + " # Get averages for multiple realizations\n", + " statlist=[\"TXx\",\"TXn\"]\n", + " nmodels=len(model_list)\n", + " nstats = len(statlist)\n", + " # Averages are stored in a season x models x indices sized array\n", + " data_tx = np.ones((4,nmodels,nstats))*np.nan\n", + " for s_ind,season in enumerate([\"DJF\",\"MAM\",\"JJA\",\"SON\"]):\n", + " for st_ind,stat in enumerate(statlist):\n", + " for m_ind,model in enumerate(model_list):\n", + " data_tx[s_ind,m_ind,st_ind] = avg_all_real(metrics,model,stat,region,season)\n", + "else:\n", + " data_tx = None" + ] + }, + { + "cell_type": "markdown", + "id": "514310b7", + "metadata": {}, + "source": [ + "### Min Temperature\n", + "\n", + "Provide the path to the JSON file containing minimum temperature (TNx and TNn) return value metrics in the first cell and run. Then run the following cell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ad614e2", + "metadata": {}, + "outputs": [], + "source": [ + "# Edit this cell\n", + "\n", + "# Your metrics JSON path goes here.\n", + "# This can be a single string or a list of strings for multiple files.\n", + "TnFile=\"tasmin_json/return_value_metrics.json\"\n", + "\n", + "# If there is no temperature data, set TnFile to empty:\n", + "# TnFile = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56016d83", + "metadata": {}, + "outputs": [], + "source": [ + "# Do not edit this cell\n", + "if len(TnFile) > 0:\n", + " # Load metrics\n", + " if isinstance(TnFile,str):\n", + " with open(TnFile,\"r\") as metrics_json:\n", + " metrics=json.load(metrics_json)[\"RESULTS\"]\n", + " elif isinstance(TnFile,list):\n", + " metrics = {}\n", + " for fpath in TnFile:\n", + " with open(fpath,\"r\") as metrics_json:\n", + " metrics.update(json.load(metrics_json)[\"RESULTS\"])\n", + "\n", + " # Get averages for multiple realizations\n", + " statlist=[\"TNx\",\"TNn\"]\n", + " nmodels=len(model_list)\n", + " nstats = len(statlist)\n", + " # Averages are stored in a season x models x indices sized array\n", + " data_tn = np.ones((4,nmodels,nstats))*np.nan\n", + " for s_ind,season in enumerate([\"DJF\",\"MAM\",\"JJA\",\"SON\"]):\n", + " for st_ind,stat in enumerate(statlist):\n", + " for m_ind,model in enumerate(model_list):\n", + " data_tn[s_ind,m_ind,st_ind] = avg_all_real(metrics,model,stat,region,season)\n", + "else:\n", + " data_tn = None" + ] + }, + { + "cell_type": "markdown", + "id": "0e442d6a", + "metadata": {}, + "source": [ + "Once all data files have been loaded and model averages have been created, concatenate the results into a single array." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7ea7f9ee", + "metadata": {}, + "outputs": [], + "source": [ + "# Do not edit this cell\n", + "# Checking for what data exists\n", + "data_list = []\n", + "for item in [data_pr,data_tx,data_tn]:\n", + " if item is not None:\n", + " data_list.append(item)\n", + "\n", + "# Concatenate existing data\n", + "data_tuple = tuple(data_list)\n", + "data_all = np.concatenate(data_tuple,axis=2)" + ] + }, + { + "cell_type": "markdown", + "id": "e7c7e041", + "metadata": {}, + "source": [ + "You are now ready to continue to **Part 2: Create Figure**." + ] + }, + { + "cell_type": "markdown", + "id": "bd0af793", + "metadata": {}, + "source": [ + "# Part 2: Create figure" + ] + }, + { + "cell_type": "markdown", + "id": "c847b694", + "metadata": {}, + "source": [ + "This cell generates the portrait plot figure using the return value data previously gathered.\n", + "\n", + "More options for the portrait_plot() function are documented in the [Mean Climate Portrait Plot Demo](https://github.com/PCMDI/pcmdi_metrics/blob/main/pcmdi_metrics/graphics/portrait_plot/portrait_plot_mean_clim.ipynb). The current settings are for a 3x6 portrait plot, but if you have a different number of models and indices you may need to change the settings to make an appealing figure.\n", + "\n", + "First, provide the list of metrics and models for the figure. Take care that the labels match the order of the models and indices in the data_all array." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "f50adaf3", + "metadata": {}, + "outputs": [], + "source": [ + "# Xaxis labels are the names of the block extremes\n", + "# This must follow the order that stats take in the data_all array\n", + "xaxis_labels = ['Rx1day', 'Rx5day', 'TXx', 'TXn', 'TNx', 'TNn']\n", + "# Yaxis labels are model names\n", + "yaxis_labels = model_list" + ] + }, + { + "cell_type": "markdown", + "id": "4f7b053b", + "metadata": {}, + "source": [ + "This cell contains the portrait plot code along with some extra details like the plot title. Run this cell to see the portrait plot." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c0cc6263", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(1.25, 0.4, 'Data version\\nversion')" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABMUAAAJNCAYAAAAxncLuAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3hT5cPG8fskHbR0AQUKZZSytzJkbxBkKBvZCCr+GAKCslRAERkqW2XIUKYgWxmyhDLKBtkUKKNltJRSoDt53j94T2w6k2adJPfnunJp0jOe9KSh+fYMSQghQERERERERERE5ERUth4AERERERERERGRtTGKERERERERERGR02EUIyIiIiIiIiIip8MoRkRERERERERETodRjIiIiIiIiIiInA6jGBEREREREREROR1GMSIiIiIiIiIicjqMYkRERERERERE5HQYxYiIiIiIiIiIyOkwipFivHz5EocPH8by5csxe/ZsTJ06Fd999x0WLVqEP//8E5cuXUJKSoqth0mEyZMnQ5Ik3e3gwYNmX0dQUJBu+UFBQWZfvuzgwYN6z2Xy5MkWW5c94veHyP6tWLFC7+d4xYoVth4SERERKYSLrQdAzk2r1WL9+vVYsmQJ/vnnH2i12mynd3d3R7Vq1dC4cWO0bt0ajRs3hru7u5VGS0RERERERESOgnuKkc1cuXIF9erVQ69evXDgwIEcgxgAJCUl4eTJk/j+++/x5ptvYufOnVYYKRERWQv3ziMiIiIia+GeYmQT586dQ4sWLRATE6P3uEqlQtmyZVG2bFn4+PggOTkZMTExuHr1KiIjI200WiIiIiIiIiJyNIxiZHUvX75Ehw4d9IKYj48Pxo4di4EDByIgICDT+R4+fIg9e/Zg8+bN2LlzJ5KSkqw1ZCIiIiIiIiJyMIxiZHUzZ87E/fv3dfcLFSqEgwcPomLFitnOFxAQgH79+qFfv36IiorC4sWL4e/vb+nhEjm0pk2bQghh62EoFr8/RERERESOi1GMrG7NmjV693/44Yccg1h6BQsWxMSJE805LCIiIiIiIiJyIjzRPlnVgwcPEBYWprvv6uqKrl272nBEREREREREROSMuKcYWVX6k+X7+/vD3d3d6uN48eIFjhw5gsjISERFRUGtVqNQoUKoWLEiatSoAZXKtF588+ZNXL16FXfu3EFcXBwkSUK+fPlQtGhR1KlTBwULFjT5OYSFheHChQuIiIjA8+fPIUkSPD09UbhwYZQqVQpVq1aFp6dnrpadmpqK0NBQ3Lx5E1FRUdBoNChYsCCCgoJQv359s28zjUaDI0eO4NatW3j48CE8PT0RGBiIxo0bm/y9ssa2sIXw8HCcOXMGERERSEhIQEBAAKpVq4bXXnvNquN49OgRLl++jJs3byI2NhbJycnw8/ODv78/atasidKlS5tlHefOncOtW7cQFxeH1NRUeHh4oECBAihZsiQqV65sN9sxOjoaR48exf379/Hs2TMUKFAAFSpUQL169eDq6mrr4eHcuXO4du0aHj58iJcvX6Jw4cLo169fjmN78OABQkND8fjxYzx58gReXl4oVKgQateujeDgYCuNXnkSEhIQEhKCiIgIPHr0CGq1Gm+88QYaN25s8DIuXLiAS5cuISIiApIkoVChQqhXrx7KlCljwZHbzr1793DlyhXdz7tGo0G+fPlQqFAh1KlTB4GBgbYeosUlJibi2LFjuHv3LqKioiCEQMGCBVGmTBnUrVsXLi65//U9MTERFy5cwOXLlxETE4OXL1/C3d0d3t7eKF68OMqWLYty5cpBkiQzPiMiIiIFE0RWdPz4cQFAd/P09BSpqalWW/+uXbtEs2bNhKurq9440t78/f3F2LFjRUxMjMHLffHihVi3bp3o3r27KFSoUJbLlm81atQQq1atMvq5JyYmipkzZ4qyZcvmuA61Wi1q1qwpvv76a/Hy5UuDlh8eHi4GDhwofH19s1yup6en6Natm7h8+bLB4540aZLeMg4cOCCEECIhIUF8/vnnIiAgINN1SZIk3n77bXHlyhWD12WNbZHV8zGnkiVL6pZfsmRJ3eM7d+4UTZo0EZIkZfp8SpcuLZYvX27weg4cOKA3/6RJk7KdPjU1Vezbt0/873//M+h1WKxYMTFt2jQRGxtr9Pdg48aNokGDBlk+1/TP++OPPxY3b940ej3ZMfb7k9V2u3z5sujYsWOW7z0+Pj5iypQpIj4+3qzjN+S5pKamipkzZ4oyZcpkOranT59murzk5GTx008/iapVq2a7bcqWLSsWLVokUlJSsh1fTts4q1v6nz9jt1l6WW3DzPTv319vXbdv3xZCCHH37l3Rp08f4eXllWG877zzjkFjXbFihahSpUqWz7t69epi586dRj03QyQlJQl/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Pj4ICAhAtWrVULJkSbOu88KFC7h8+TJiYmIQGxuLPHnywMfHB0FBQahYsaJBv0Bm5u7duzhy5AgiIyORkpKCQoUKoWjRomjQoAG8vb1NHntCQgIuXbqEmzdv4uHDh3j58iUkSYKPjw9KlChhlu9VSkoKQkNDERYWhujoaGg0GhQsWBAlS5ZEgwYNkCdPHpOfhzVYelvYknw4a2RkJBISEnQ/J6+//rrVxhAbG4uQkBDcunULL168QP78+REQEIBatWqhWLFiJi9fo9Hg2rVruHHjBu7fv4/nz59Do9HAy8sLhQsXRpUqVVCxYkWo1WozPBsyRWJiIkJDQ3Hnzh08efIEL1++RN68eZEvXz6UKVMGFStWtOlhrSkpKTh+/LjuPd/b2xvFihVDvXr1DAoQZB2PHj1CSEgI7t69i4SEBBQsWBBFihRB3bp1jfpDmLnZ4vVz5coVXLhwAU+ePEFsbCxcXFzg4+OD4sWLo0KFCggODjb6j1IPHjzAlStXEB4ejpiYGCQkJMDDwwN+fn4oX748qlevbvAfKomIiBwFoxgRERERERERETkdHj5JREREREREREROh1GMiIiIiIiIiIicDqMYERERERERERE5HUYxIiIiIiIiIiJyOoxiRERERERERETkdBjFiIiIiIiIiIjI6TCKERERERERERGR02EUIyIiIiIiIiIip8MoRkRERERERERETodRjIiIiIiIiIiInA6jGBEREREREREROR1GMSIiIiIiIiIicjqMYkRERERERERE5HQYxYiIiMhiBgwYAEmSdLfw8HBbD4mIiIiICACjGBGRWQUFBekFgIMHD1pt3c+ePYOnp6fe+vPmzYu4uLhcLzM8PFxvefKtT58+Ji+rSpUqOc6T2brT3lQqFfLkyYN8+fKhTJkyaNiwId577z18//33OHbsGFJSUnLztImIiIiIyAkwihEROYi1a9ciISFB77H4+HisXbvW7Otas2YNzp07Z/blGksIgaSkJMTGxuLmzZs4cuQIVqxYgTFjxqB+/foICAjABx98gAsXLth6qEREREREpDCMYkREDuKXX34x6nFTCCEwbtw4sy/X3GJiYrB06VJUr14dPXr0QEREhK2HRERERERECuFi6wEQEZHpLly4gFOnTmX6tZMnT+Lff/9F1apVzbrO3bt348CBA2jWrJlZl5udw4cPo1ix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vXr1Mml56ec39wn3AeDrr7/Wu9Lh5s2bzb6OrAghsHv3brRs2RKjRo1CSkqK7muenp7YsGFDhnN4KUGZMmXw3nvv6e4nJiaibdu2uHz5slHLSUpKwooVK7L8+pAhQ/RObB8SEoLevXtnee43IQRmzZqF7777zqhxGGv06NF693/44Qds374923kePXqEXr166UW9Tp06ITg42CJjJCIiIiLH4ZLzJERElFsPHz7M9AqAhggKCgIAPH78GH/++afe13r27GnSuN59912MGTNGd9jk1q1bER0dneEKiKYoWbIkhgwZgtmzZ5ttmffv38/wWHJyMp49e4bY2FiEhYUhNDQUhw4dyvQCAgULFsTGjRv19khSmh9++AGhoaG6Qxrv3r2LWrVqYdSoUfjoo49QvHjxTOdLSEjAkSNHsG3bNqxbtw5RUVEYMGBAptMWKlQICxcu1HsdrV+/HseOHcPgwYPRpEkTFCpUCM+ePcOZM2ewbNkyhIaGAnj12lm3bp15n/T/e+edd9ClSxfdXl+pqano2rUrJk6ciE8++QReXl66aYUQ2LVrF4YOHaq3rfPnz4+5c+daZHxERERE5FgYxYiILMiUeCWfVH/lypV6ezrVqVMHpUuXNmlcRYoUQdOmTbF//34Ar8LSqlWrMHLkSJOWm97EiRPxyy+/GHVuqOyYErO6d++O2bNno2jRomYZi6V4eXlhx44dePPNN3H16lUAr4LXtGnTMG3aNAQHB6NChQrw8/NDamoqnj17hvDwcISFhRl0CKTs3Xffxe3btzFhwgTdY3fv3sXEiROznKdy5cpYsmSJXhSTJCkXzzJrS5YswfXr13VXuUxOTsakSZPw7bffom7duggICMDz589x/vz5DJE0T548WL16NQIDA806JiIiIiJyTDx8kohI4dIf2mjqoZNZLSf9IZrmUKBAAb2rXVpb/vz58cEHH+D8+fNYv3694oOYrHjx4jh58qTeedlkt27dwl9//YU1a9bg999/x+7du3Ht2rUMQczPzy/H9YwfPx6//fYbChYsmOO03bp1w9GjR6FWq/Ue9/b2znFeY+TLlw8hISEZLjqQmJiIgwcPYt26dfjzzz8zBLGAgADs27cPbdq0Met4iIiIiMhxMYoRESnYkSNHdHsLAYBarUaPHj3MsuwuXbronfPr4sWLOHHihFmWndaoUaP0rnZobm5ubvDx8UFwcDAaNGiA/v37Y9asWTh69CgePXqExYsXo1q1ahZbv6V4eXlh1apVOH/+PPr06YN8+fLlOE/RokXRu3dvbNiwAQ8fPjRoPX369MH169cxf/58tGzZEsWKFYO7uzv8/f1RvXp1DBkyBMePH8fvv/8OHx8fxMbG6s3v6+ubm6eXLR8fH+zatQvbtm1DvXr19K5kml6xYsUwZcoU3LhxA/Xr1zf7WIiIiIjIcUlCPj6HiIiIFEur1eLChQu4fPkyYmJiEBsbizx58sDHxwdBQUGoWLFilucbM6d9+/ahZcuWuvtjxozBrFmzLLrO6OhoHDlyBA8ePEBMTAzy5s2LggULolq1aqhSpYpF101EREREjovnFCMiIrIDKpUKr732Gl577TWbjuPQoUN692vWrGnxdfr7++Odd96x+HqIiIiIyLlwTzEiIiIySEpKCkqVKoWIiAjdY7dv39ZdKZWIiIiIyJ7wnGJERERkkIkTJ+oFscaNGzOIEREREZHdYhQjIiJyUj179sSePXuQ007jycnJGDduXIZzh40cOdKCoyMiIiIisiwePklEROSkgoKCcOfOHQQFBaFLly6oU6cOgoOD4evri5cvXyIyMhKHDx/Gr7/+qreHGAD06NED69ats9HIiYiIiIhMxyhGRETkpOQoZqwWLVpg06ZN8PHxscCoiIiIiIisg4dPEhEROSl/f3+jpvfx8cGXX36JXbt2MYgRERERkd3jnmJEREROSgiB0NBQHDhwACdOnEBYWBgiIyPx4sULCCHg5+eHAgUKoGbNmmjSpAm6desGPz8/Ww+biIiIiMgsGMWIiIiIiIiIiMjp8PBJIiIiIiIiIiJyOoxiRERERERERETkdBjFiIiIiIiIiIjI6TCKERERERERERGR02EUIyIiIiIiIiIip8MoRkRERERERERETodRjIiIiIiIiIiInA6jGBEREREREREROR1GMSIiIiIiIiIicjqMYkRERERERERE5HQYxYiIiIiIiIiIyOkwihERERERERERkdNhFCMiIiIiIiIiIqfDKEZERERERERERE6HUYyIiIiIiIiIiJwOoxgRERERERERETkdRjEiIiIiIiIiInI6jGJEREREREREROR0GMWIiIiIiIiIiMjpMIoREREREREREZHTYRQjIiIiIiIiIiKnwyhGRERERERERERO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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax, cbar = portrait_plot(data_all, # or [data1, data2, data3, data4] (top, right, bottom, left: clockwise from top)\n", + " xaxis_labels=xaxis_labels, \n", + " yaxis_labels=yaxis_labels, \n", + " cbar_label='Bias',\n", + " cbar_kw = {\"shrink\":0.5},\n", + " legend_on=True,\n", + " legend_labels=['DJF','MAM','JJA','SON'],\n", + " box_as_square=True,\n", + " logo_off=True\n", + " )\n", + "\n", + "# Add title\n", + "ax.set_title(\"Seasonal bias in return values\\n{0} region\".format(region.upper()), fontsize=30, pad=30)\n", + "\n", + "# Add data info\n", + "data_version=\"version\"\n", + "fig.text(1.25, 0.4, 'Data version\\n'+data_version, transform=ax.transAxes,\n", + " fontsize=12, color='black', alpha=0.6, ha='left', va='top',)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "efd8bee0", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:pmp_climex]", + "language": "python", + "name": "conda-env-pmp_climex-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/setup.py b/setup.py index 70b8075b1..5755f7372 100644 --- a/setup.py +++ b/setup.py @@ -39,6 +39,7 @@ "pcmdi_metrics/misc/scripts/get_pmp_data.py", "pcmdi_metrics/precip_distribution/precip_distribution_driver.py", "pcmdi_metrics/cloud_feedback/cloud_feedback_driver.py", + "pcmdi_metrics/extremes/extremes_driver.py", ] entry_points = { diff --git a/tests/test_extremes.py b/tests/test_extremes.py new file mode 100644 index 000000000..727c163a0 --- /dev/null +++ b/tests/test_extremes.py @@ -0,0 +1,291 @@ +import numpy as np +import xarray as xr + +from pcmdi_metrics.extremes.lib import compute_metrics + + +def create_random_precip(years, max_val=None, min_val=None): + # Returns array of precip along with covariate and sftlf + times = xr.cftime_range( + start="{0}-01-01".format(years[0]), + end="{0}-12-31".format(years[1]), + freq="D", + calendar="noleap", + name="time", + ) + latd = 2 + lond = 2 + + nyears = int(len(times) / 365) + total_inc = 3 + n = np.arange(0, total_inc, total_inc / nyears) + fake_cov = np.arange(0, 0 + total_inc, total_inc / nyears)[0:nyears] + co2arr = np.zeros((len(times), latd, lond)) + n0 = 0 + for n in fake_cov: + n1 = n0 + 365 + co2arr[n0:n1, :, :] = n + n0 += 365 + + values = ( + np.ones((len(times), latd, lond)) * 20 + + np.random.randint(-10, high=10, size=(len(times), latd, lond)) + + co2arr * np.random.random() + ) + values = values / 86400 # convert to kg m-2 s-1 + lat = np.arange(0, latd) + lon = np.arange(0, lond) + fake_ds = xr.Dataset( + { + "pr": xr.DataArray( + data=values, # enter data here + dims=["time", "lat", "lon"], + coords={"time": times, "lat": lat, "lon": lon}, + attrs={"_FillValue": -999.9, "units": "kg m-2 s-1"}, + ) + } + ) + + fake_ds["time"].encoding["calendar"] = "noleap" + fake_ds["time"].encoding["units"] = "days since 0000-01-01" + fake_ds = fake_ds.bounds.add_missing_bounds() + + if max_val is not None: + fake_ds["pr"] = fake_ds.pr.where(fake_ds.pr <= max_val, max_val) + if min_val is not None: + fake_ds["pr"] = fake_ds.pr.where(fake_ds.pr >= min_val, min_val) + + sftlf_arr = np.ones((latd, lond)) * 100 + sftlf_arr[0, 0] = 0 + sftlf = xr.Dataset( + { + "sftlf": xr.DataArray( + data=sftlf_arr, + dims=["lat", "lon"], + coords={"lat": lat, "lon": lon}, + attrs={"_FillValue": -999.9}, + ) + } + ) + sftlf = sftlf.bounds.add_missing_bounds(["X", "Y"]) + + return fake_ds, fake_cov, sftlf + + +def create_seasonal_precip(season): + # Returns array of precip along with covariate and sftlf + sd = {"DJF": [1, 2, 12], "MAM": [3, 4, 5], "JJA": [6, 7, 8], "SON": [9, 10, 11]} + mos = sd[season] + + years = [1980, 1981] + times = xr.cftime_range( + start="{0}-01-01".format(years[0]), + end="{0}-12-31".format(years[1]), + freq="D", + calendar="noleap", + name="time", + ) + latd = 2 + lond = 2 + + values = np.ones((len(times), latd, lond)) + lat = np.arange(0, latd) + lon = np.arange(0, lond) + fake_ds = xr.Dataset( + { + "pr": xr.DataArray( + data=values, # enter data here + dims=["time", "lat", "lon"], + coords={"time": times, "lat": lat, "lon": lon}, + attrs={"_FillValue": -999.9, "units": "kg m-2 s-1"}, + ) + } + ) + fake_ds = fake_ds.where( + ( + (fake_ds["time.month"] == mos[0]) + | (fake_ds["time.month"] == mos[1]) + | (fake_ds["time.month"] == mos[2]) + ), + 0.0, + ) + fake_ds["time"].encoding["calendar"] = "noleap" + fake_ds["time"].encoding["units"] = "days since 0000-01-01" + fake_ds = fake_ds.bounds.add_missing_bounds() + + sftlf_arr = np.ones((latd, lond)) * 100 + sftlf_arr[0, 0] = 0 + sftlf = xr.Dataset( + { + "sftlf": xr.DataArray( + data=sftlf_arr, + dims=["lat", "lon"], + coords={"lat": lat, "lon": lon}, + attrs={"_FillValue": -999.9}, + ) + } + ) + sftlf = sftlf.bounds.add_missing_bounds(["X", "Y"]) + + return fake_ds, sftlf + + +def test_seasonal_averager_settings(): + # Testing that the defaults and mask are set + ds, _, sftlf = create_random_precip([1980, 1981]) + PR = compute_metrics.TimeSeriesData(ds, "pr") + S = compute_metrics.SeasonalAverager(PR, sftlf) + + assert S.dec_mode == "DJF" + assert S.drop_incomplete_djf + assert S.annual_strict + assert S.sftlf.equals(sftlf["sftlf"]) + + +def test_seasonal_averager_ann_max(): + drop_incomplete_djf = True + dec_mode = "DJF" + annual_strict = True + ds, _, sftlf = create_random_precip([1980, 1981]) + PR = compute_metrics.TimeSeriesData(ds, "pr") + S = compute_metrics.SeasonalAverager( + PR, + sftlf, + dec_mode=dec_mode, + drop_incomplete_djf=drop_incomplete_djf, + annual_strict=annual_strict, + ) + ann_max = S.annual_stats("max", pentad=False) + + assert np.mean(ann_max) == np.mean(ds.groupby("time.year").max(dim="time")) + + +def test_seasonal_averager_ann_min(): + drop_incomplete_djf = True + dec_mode = "DJF" + annual_strict = True + ds, _, sftlf = create_random_precip([1980, 1981]) + PR = compute_metrics.TimeSeriesData(ds, "pr") + S = compute_metrics.SeasonalAverager( + PR, + sftlf, + dec_mode=dec_mode, + drop_incomplete_djf=drop_incomplete_djf, + annual_strict=annual_strict, + ) + ann_min = S.annual_stats("min", pentad=False) + + assert np.mean(ann_min) == np.mean(ds.groupby("time.year").min(dim="time")) + + +# Test that drop_incomplete_djf puts nans in correct places +# Test that rolling averages for say a month is matching manual version + + +def test_seasonal_averager_ann_djf(): + drop_incomplete_djf = True + dec_mode = "DJF" + annual_strict = True + ds, sftlf = create_seasonal_precip("DJF") + PR = compute_metrics.TimeSeriesData(ds, "pr") + S = compute_metrics.SeasonalAverager( + PR, + sftlf, + dec_mode=dec_mode, + drop_incomplete_djf=drop_incomplete_djf, + annual_strict=annual_strict, + ) + djf = S.seasonal_stats("DJF", "max", pentad=False) + + assert djf.max() == 1.0 + assert djf.mean() == 1.0 + + +def test_seasonal_averager_rolling_mam(): + ds, sftlf = create_seasonal_precip("MAM") + PR = compute_metrics.TimeSeriesData(ds, "pr") + S = compute_metrics.SeasonalAverager(PR, sftlf) + S.calc_5day_mean() + + # Get the MAM mean value of the rolling mean calculated by the seasonal averager + rolling_mean = float( + S.pentad.where(((ds["time.month"] >= 3) & (ds["time.month"] <= 5))).mean() + ) + + # This is what the mean value of the 5-day rolling means should be, if + # MAM are 1 and all other times are 0 + true_mean = ((1 / 5) + (2 / 5) + (3 / 5) + (4 / 5) + 1 * (31 - 4) + 30 + 31) / ( + 31 + 30 + 31 + ) + + assert rolling_mean == true_mean + + +def test_seasonal_averager_rolling_djf(): + drop_incomplete_djf = False + dec_mode = "DJF" + annual_strict = True + ds, sftlf = create_seasonal_precip("DJF") + PR = compute_metrics.TimeSeriesData(ds, "pr") + S = compute_metrics.SeasonalAverager( + PR, + sftlf, + dec_mode=dec_mode, + drop_incomplete_djf=drop_incomplete_djf, + annual_strict=annual_strict, + ) + S.calc_5day_mean() + + # Get the DJF mean value of the rolling mean calculated by the seasonal averager + rolling_mean = float( + S.pentad.where( + ( + (ds["time.month"] == 1) + | (ds["time.month"] == 2) + | (ds["time.month"] == 12) + ) + ).mean() + ) + + # This is what the mean value of the 5-day rolling means should be, if + # DJF are 1 and all other times are 0. Have to slice off 4 days from the first January + # because that is where the time series starts + D = 31 + J = 31 + F = 28 + total_days = D + J + F + true_mean = ( + (J - 4) + + F + + (1 / 5) + + (2 / 5) + + (3 / 5) + + (4 / 5) + + (D - 4) + + J + + F + + (1 / 5) + + (2 / 5) + + (3 / 5) + + (4 / 5) + + (D - 4) + ) / (2 * total_days - 4) + + assert rolling_mean == true_mean + + +"""def test_seasonal_averager_drop_djf(): + drop_incomplete_djf = True + dec_mode = "DJF" + annual_strict = True + ds, sftlf = create_seasonal_precip("DJF") + PR = compute_metrics.TimeSeriesData(ds, "pr") + S = compute_metrics.SeasonalAverager( + PR, + sftlf, + dec_mode=dec_mode, + drop_incomplete_djf=drop_incomplete_djf, + annual_strict=annual_strict, + ) + djf = S.seasonal_stats("DJF", "max", pentad=False) +"""