{ "cells": [ { "cell_type": "markdown", "id": "d52e464a3b45c1ba", "metadata": {}, "source": [ "# Read CMIP-PPE data and emulate with Gaussian Processor" ] }, { "cell_type": "markdown", "id": "7f45a45c-df17-4238-b264-8b7a9aec1953", "metadata": {}, "source": [ "\n", "**Adjusted for the eScience course from Duncan Watson-Parris' example here: [gist.github.com/duncanwp](https://gist.github.com/duncanwp/89175a17b7221e4d3639765621c7f7f9)**" ] }, { "cell_type": "markdown", "id": "b58e60b8-51f6-4034-8bf3-526d5da67751", "metadata": {}, "source": [ "You have to use the env:ml-notebook to run this example. " ] }, { "cell_type": "code", "execution_count": 31, "id": "d98ac0ce-2f20-4e3d-8620-450325c76c25", "metadata": { "tags": [] }, "outputs": [], "source": [ "import xarray as xr\n", "import numpy as np\n", "import pandas as pd\n", "from esem import gp_model\n", "from esem.utils import validation_plot, get_param_mask\n", "from pathlib import Path\n", "xr.set_options(display_style='html')\n", "import intake\n", "import cftime\n", "import matplotlib.pyplot as plt\n", "import cartopy.crs as ccrs\n", "import datetime\n", "import seaborn as sns" ] }, { "cell_type": "code", "execution_count": 32, "id": "82ad6e05-9c2c-4c63-bc19-91eedd386cfa", "metadata": {}, "outputs": [], "source": [ "def global_mean(ds):\n", " weights = np.cos(np.deg2rad(ds.lat))\n", " return ds.weighted(weights).mean(['lat', 'lon'])\n", "\n", "def get_ensemble_member(ds):\n", " fname = ds.encoding['source']\n", " member = int(fname.split('.')[-4])\n", " return ds.assign_coords(member=member).expand_dims('member')" ] }, { "cell_type": "markdown", "id": "fe2babd9-e578-4f7e-84e7-0b663f382b5c", "metadata": {}, "source": [ "## Open the overview over the parameters in the CAM6 CESM PPE" ] }, { "cell_type": "code", "execution_count": 33, "id": "92417e17-40ad-4f5b-82fb-3eb2f7939743", "metadata": {}, "outputs": [], "source": [ "data_path = Path('~/shared-craas1-ns9989k-ns9560k/CAM6_CESM_PPE/')\n", "\n", "params = (xr.open_dataset(data_path / \"parameter_262_w_control.nc\")\n", " .to_pandas()\n", " .drop(columns = ['Sample_nmb'])\n", " )\n" ] }, { "cell_type": "markdown", "id": "ad02937f-4434-47c3-b722-7b4fd03bc5c5", "metadata": {}, "source": [ "### Open CMIP6 online catalog" ] }, { "cell_type": "code", "execution_count": 34, "id": "263acb2b-8f49-48ed-acc7-072f91c4edfb", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "

cesm-ppe catalog with 2 dataset(s) from 32571 asset(s):

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
unique
experiment1
ensemble262
frequency2
variable124
units27
long_name124
vertical_levels3
start_time2
end_time3
time_range3
path32571
derived_variable0
\n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cat_url = '/mnt/craas1-ns9989k-geo4992/data/catalogs/cesm-ppe.json'\n", "col = intake.open_esm_datastore(cat_url)\n", "col" ] }, { "cell_type": "markdown", "id": "16661a25-147f-40e3-b96a-a3c170b3ffc9", "metadata": {}, "source": [ "\n", "### Search corresponding data " ] }, { "cell_type": "markdown", "id": "a94ff4c4-8f03-46db-b19c-be4abe6d6b29", "metadata": {}, "source": [ "Please check [here](https://pangeo-data.github.io/escience-2022/pangeo101/data_discovery.html?highlight=cmip6) for info about CMIP and variables :) \n", "\n", "Particularly useful is maybe the variable search which you find here: https://clipc-services.ceda.ac.uk/dreq/mipVars.html " ] }, { "cell_type": "code", "execution_count": 35, "id": "2549450a-4a44-4e04-bfda-1b8eeade4f27", "metadata": { "scrolled": true, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
experimentensemblefrequencyvariableunitslong_namevertical_levelsstart_timeend_timetime_rangepath
0present-day0.0monthlySWCFW/m2Shortwave cloud forcing1.00001-01-160003-12-160001-01-16-0003-12-16/mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m...
1present-day1.0monthlySWCFW/m2Shortwave cloud forcing1.00001-01-160003-12-160001-01-16-0003-12-16/mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m...
2present-day2.0monthlySWCFW/m2Shortwave cloud forcing1.00001-01-160003-12-160001-01-16-0003-12-16/mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m...
3present-day3.0monthlySWCFW/m2Shortwave cloud forcing1.00001-01-160003-12-160001-01-16-0003-12-16/mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m...
4present-day4.0monthlySWCFW/m2Shortwave cloud forcing1.00001-01-160003-12-160001-01-16-0003-12-16/mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m...
....................................
257present-day258.0monthlySWCFW/m2Shortwave cloud forcing1.00001-01-160003-12-160001-01-16-0003-12-16/mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m...
258present-day259.0monthlySWCFW/m2Shortwave cloud forcing1.00001-01-160003-12-160001-01-16-0003-12-16/mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m...
259present-day260.0monthlySWCFW/m2Shortwave cloud forcing1.00001-01-160003-12-160001-01-16-0003-12-16/mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m...
260present-day261.0monthlySWCFW/m2Shortwave cloud forcing1.00001-01-160003-12-160001-01-16-0003-12-16/mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m...
261present-day262.0monthlySWCFW/m2Shortwave cloud forcing1.00001-01-160003-12-160001-01-16-0003-12-16/mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m...
\n", "

262 rows × 11 columns

\n", "
" ], "text/plain": [ " experiment ensemble frequency variable units long_name \\\n", "0 present-day 0.0 monthly SWCF W/m2 Shortwave cloud forcing \n", "1 present-day 1.0 monthly SWCF W/m2 Shortwave cloud forcing \n", "2 present-day 2.0 monthly SWCF W/m2 Shortwave cloud forcing \n", "3 present-day 3.0 monthly SWCF W/m2 Shortwave cloud forcing \n", "4 present-day 4.0 monthly SWCF W/m2 Shortwave cloud forcing \n", ".. ... ... ... ... ... ... \n", "257 present-day 258.0 monthly SWCF W/m2 Shortwave cloud forcing \n", "258 present-day 259.0 monthly SWCF W/m2 Shortwave cloud forcing \n", "259 present-day 260.0 monthly SWCF W/m2 Shortwave cloud forcing \n", "260 present-day 261.0 monthly SWCF W/m2 Shortwave cloud forcing \n", "261 present-day 262.0 monthly SWCF W/m2 Shortwave cloud forcing \n", "\n", " vertical_levels start_time end_time time_range \\\n", "0 1.0 0001-01-16 0003-12-16 0001-01-16-0003-12-16 \n", "1 1.0 0001-01-16 0003-12-16 0001-01-16-0003-12-16 \n", "2 1.0 0001-01-16 0003-12-16 0001-01-16-0003-12-16 \n", "3 1.0 0001-01-16 0003-12-16 0001-01-16-0003-12-16 \n", "4 1.0 0001-01-16 0003-12-16 0001-01-16-0003-12-16 \n", ".. ... ... ... ... \n", "257 1.0 0001-01-16 0003-12-16 0001-01-16-0003-12-16 \n", "258 1.0 0001-01-16 0003-12-16 0001-01-16-0003-12-16 \n", "259 1.0 0001-01-16 0003-12-16 0001-01-16-0003-12-16 \n", "260 1.0 0001-01-16 0003-12-16 0001-01-16-0003-12-16 \n", "261 1.0 0001-01-16 0003-12-16 0001-01-16-0003-12-16 \n", "\n", " path \n", "0 /mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m... \n", "1 /mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m... \n", "2 /mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m... \n", "3 /mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m... \n", "4 /mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m... \n", ".. ... \n", "257 /mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m... \n", "258 /mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m... \n", "259 /mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m... \n", "260 /mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m... \n", "261 /mnt/craas1-ns9989k-ns9560k/CAM6_CESM_PPE/PD/m... \n", "\n", "[262 rows x 11 columns]" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cat = col.search(\n", " experiment=['present-day'], \n", " variable = ['SWCF'], \n", " frequency='monthly'\n", ")\n", "\n", "cat.df\n" ] }, { "cell_type": "code", "execution_count": 36, "id": "4befa75c-7f95-4e1d-b5a2-f604fe54d12f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['SWCF'], dtype=object)" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cat.df['variable'].unique()" ] }, { "cell_type": "markdown", "id": "2d7858ef-8c0b-4d9d-9127-d1cef642b7ec", "metadata": {}, "source": [ "### Create dictionary from the list of datasets we found\n", "- This step may take several minutes so be patient!" ] }, { "cell_type": "code", "execution_count": 37, "id": "66132009-2292-4985-ad47-edf940999491", "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "--> The keys in the returned dictionary of datasets are constructed as follows:\n", "\t'experiment.frequency'\n" ] }, { "data": { "text/html": [ "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "
\n", " \n", " 100.00% [1/1 00:25<00:00]\n", "
\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dset_dict = cat.to_dataset_dict()#preprocess = get_ensemble_member,)" ] }, { "cell_type": "code", "execution_count": 38, "id": "b469a9fd-6e3f-4880-b5c3-4857147a9833", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 2GB\n",
       "Dimensions:   (lat: 192, lon: 288, time: 36, ensemble: 262)\n",
       "Coordinates:\n",
       "  * lat       (lat) float64 2kB -90.0 -89.06 -88.12 -87.17 ... 88.12 89.06 90.0\n",
       "  * lon       (lon) float64 2kB 0.0 1.25 2.5 3.75 ... 355.0 356.2 357.5 358.8\n",
       "  * time      (time) object 288B 0001-01-16 12:00:00 ... 0003-12-16 12:00:00\n",
       "  * ensemble  (ensemble) float64 2kB 0.0 1.0 2.0 3.0 ... 259.0 260.0 261.0 262.0\n",
       "Data variables:\n",
       "    SWCF      (ensemble, time, lat, lon) float32 2GB dask.array<chunksize=(1, 36, 192, 288), meta=np.ndarray>\n",
       "Attributes:\n",
       "    intake_esm_vars:                   ['SWCF']\n",
       "    intake_esm_attrs:experiment:       present-day\n",
       "    intake_esm_attrs:frequency:        monthly\n",
       "    intake_esm_attrs:variable:         SWCF\n",
       "    intake_esm_attrs:units:            W/m2\n",
       "    intake_esm_attrs:long_name:        Shortwave cloud forcing\n",
       "    intake_esm_attrs:vertical_levels:  1.0\n",
       "    intake_esm_attrs:start_time:       0001-01-16\n",
       "    intake_esm_attrs:end_time:         0003-12-16\n",
       "    intake_esm_attrs:time_range:       0001-01-16-0003-12-16\n",
       "    intake_esm_attrs:_data_format_:    netcdf\n",
       "    intake_esm_dataset_key:            present-day.monthly
" ], "text/plain": [ " Size: 2GB\n", "Dimensions: (lat: 192, lon: 288, time: 36, ensemble: 262)\n", "Coordinates:\n", " * lat (lat) float64 2kB -90.0 -89.06 -88.12 -87.17 ... 88.12 89.06 90.0\n", " * lon (lon) float64 2kB 0.0 1.25 2.5 3.75 ... 355.0 356.2 357.5 358.8\n", " * time (time) object 288B 0001-01-16 12:00:00 ... 0003-12-16 12:00:00\n", " * ensemble (ensemble) float64 2kB 0.0 1.0 2.0 3.0 ... 259.0 260.0 261.0 262.0\n", "Data variables:\n", " SWCF (ensemble, time, lat, lon) float32 2GB dask.array\n", "Attributes:\n", " intake_esm_vars: ['SWCF']\n", " intake_esm_attrs:experiment: present-day\n", " intake_esm_attrs:frequency: monthly\n", " intake_esm_attrs:variable: SWCF\n", " intake_esm_attrs:units: W/m2\n", " intake_esm_attrs:long_name: Shortwave cloud forcing\n", " intake_esm_attrs:vertical_levels: 1.0\n", " intake_esm_attrs:start_time: 0001-01-16\n", " intake_esm_attrs:end_time: 0003-12-16\n", " intake_esm_attrs:time_range: 0001-01-16-0003-12-16\n", " intake_esm_attrs:_data_format_: netcdf\n", " intake_esm_dataset_key: present-day.monthly" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dset_dict['present-day.monthly']" ] }, { "cell_type": "code", "execution_count": 39, "id": "ede46016-c40e-41e5-ab92-f75e9e96b9d8", "metadata": {}, "outputs": [], "source": [ "ds = dset_dict['present-day.monthly']\n", "SWCF = global_mean(ds['SWCF']).mean('time').compute()" ] }, { "cell_type": "code", "execution_count": 40, "id": "fea91992-0e87-4560-a526-8bfb18b1df3d", "metadata": {}, "outputs": [], "source": [ "# Some of the PPE ensemble members are missing data so just select the params we actually have\n", "sub_params = params.iloc[SWCF.ensemble.values]\n", "# Unit normalise all the parameters\n", "ppe_params = (sub_params - sub_params.min()) / (sub_params.max() - sub_params.min())" ] }, { "cell_type": "code", "execution_count": 41, "id": "df911922-a001-4ad2-8e25-eb19f5ae97c7", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/conda/envs/ml-notebook/lib/python3.11/site-packages/sklearn/linear_model/_least_angle.py:688: ConvergenceWarning: Regressors in active set degenerate. Dropping a regressor, after 9 iterations, i.e. alpha=4.397e-01, with an active set of 9 regressors, and the smallest cholesky pivot element being 5.960e-08. Reduce max_iter or increase eps parameters.\n", " warnings.warn(\n", "/opt/conda/envs/ml-notebook/lib/python3.11/site-packages/sklearn/linear_model/_least_angle.py:688: ConvergenceWarning: Regressors in active set degenerate. Dropping a regressor, after 20 iterations, i.e. alpha=1.975e-01, with an active set of 20 regressors, and the smallest cholesky pivot element being 5.960e-08. Reduce max_iter or increase eps parameters.\n", " warnings.warn(\n", "/opt/conda/envs/ml-notebook/lib/python3.11/site-packages/sklearn/linear_model/_least_angle.py:688: ConvergenceWarning: Regressors in active set degenerate. Dropping a regressor, after 22 iterations, i.e. alpha=1.077e-01, with an active set of 22 regressors, and the smallest cholesky pivot element being 5.960e-08. Reduce max_iter or increase eps parameters.\n", " warnings.warn(\n", "/opt/conda/envs/ml-notebook/lib/python3.11/site-packages/sklearn/linear_model/_least_angle.py:688: ConvergenceWarning: Regressors in active set degenerate. Dropping a regressor, after 35 iterations, i.e. alpha=2.229e-02, with an active set of 35 regressors, and the smallest cholesky pivot element being 5.960e-08. Reduce max_iter or increase eps parameters.\n", " warnings.warn(\n", "/opt/conda/envs/ml-notebook/lib/python3.11/site-packages/sklearn/linear_model/_least_angle.py:688: ConvergenceWarning: Regressors in active set degenerate. Dropping a regressor, after 39 iterations, i.e. alpha=4.559e-03, with an active set of 39 regressors, and the smallest cholesky pivot element being 5.960e-08. Reduce max_iter or increase eps parameters.\n", " warnings.warn(\n", "/opt/conda/envs/ml-notebook/lib/python3.11/site-packages/sklearn/linear_model/_least_angle.py:688: ConvergenceWarning: Regressors in active set degenerate. Dropping a regressor, after 41 iterations, i.e. alpha=2.061e-03, with an active set of 41 regressors, and the smallest cholesky pivot element being 5.960e-08. Reduce max_iter or increase eps parameters.\n", " warnings.warn(\n", "/opt/conda/envs/ml-notebook/lib/python3.11/site-packages/sklearn/linear_model/_least_angle.py:688: ConvergenceWarning: Regressors in active set degenerate. Dropping a regressor, after 42 iterations, i.e. alpha=5.161e-04, with an active set of 42 regressors, and the smallest cholesky pivot element being 5.960e-08. Reduce max_iter or increase eps parameters.\n", " warnings.warn(\n", "/opt/conda/envs/ml-notebook/lib/python3.11/site-packages/sklearn/linear_model/_least_angle.py:688: ConvergenceWarning: Regressors in active set degenerate. Dropping a regressor, after 42 iterations, i.e. alpha=1.493e-04, with an active set of 42 regressors, and the smallest cholesky pivot element being 5.960e-08. Reduce max_iter or increase eps parameters.\n", " warnings.warn(\n", "/opt/conda/envs/ml-notebook/lib/python3.11/site-packages/sklearn/linear_model/_least_angle.py:688: ConvergenceWarning: Regressors in active set degenerate. Dropping a regressor, after 43 iterations, i.e. alpha=6.496e-05, with an active set of 43 regressors, and the smallest cholesky pivot element being 5.960e-08. Reduce max_iter or increase eps parameters.\n", " warnings.warn(\n" ] }, { "data": { "text/plain": [ "Index(['micro_mg_autocon_nd_exp', 'micro_mg_dcs', 'cldfrc_dp1', 'cldfrc_dp2',\n", " 'clubb_C6thlb', 'clubb_C8', 'clubb_c1', 'clubb_c11', 'clubb_c14',\n", " 'dust_emis_fact', 'micro_mg_accre_enhan_fact', 'micro_mg_autocon_fact',\n", " 'micro_mg_autocon_lwp_exp', 'micro_mg_berg_eff_factor',\n", " 'micro_mg_homog_size', 'micro_mg_iaccr_factor', 'micro_mg_vtrmi_factor',\n", " 'microp_aero_wsub_scale', 'microp_aero_wsubi_scale',\n", " 'seasalt_emis_scale', 'zmconv_capelmt', 'zmconv_ke',\n", " 'zmconv_tiedke_add'],\n", " dtype='object')" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# We can use an information criterion to choose the best parameters automatically:\n", "best_params = ppe_params[ppe_params.columns[get_param_mask(ppe_params, SWCF)]]\n", "best_params.columns" ] }, { "cell_type": "code", "execution_count": 42, "id": "22a8ba21-2ad6-4ee4-9e28-7f9cb07a56ec", "metadata": {}, "outputs": [], "source": [ "n_test = 25\n", "\n", "X_test, X_train = best_params[:n_test], best_params[n_test:]\n", "Y_test, Y_train = SWCF[:n_test], SWCF[n_test:]" ] }, { "cell_type": "markdown", "id": "733d85db-b666-42be-8db5-196f978670b4", "metadata": {}, "source": [ "## Global mean GP Model\n" ] }, { "cell_type": "code", "execution_count": 43, "id": "268df2dc-a02d-4559-932b-4a6caa152747", "metadata": {}, "outputs": [], "source": [ "# Can try different kernels here\n", "gp = gp_model(X_train, Y_train, kernel=['Linear', 'RBF'])" ] }, { "cell_type": "code", "execution_count": 44, "id": "f6ee5f93-0fa2-412f-a540-943cd13cee21", "metadata": {}, "outputs": [], "source": [ "gp.train()\n" ] }, { "cell_type": "code", "execution_count": 45, "id": "da3f2342-ef8c-4684-a28d-205222695a52", "metadata": {}, "outputs": [], "source": [ "m, v = gp.predict(X_test)\n" ] }, { "cell_type": "code", "execution_count": null, "id": "9b22deab-48de-4ac1-9834-392b616a0646", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 46, "id": "42f0c7e2-bfef-4f65-b663-97e7fa2e55c7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Proportion of 'Bad' estimates : 8.00%\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "validation_plot(Y_test.data, m, v, figsize=(4,4))\n" ] }, { "cell_type": "markdown", "id": "922c6192-05da-485b-9f12-ef4a6c52d739", "metadata": {}, "source": [ "## Calibrate" ] }, { "cell_type": "code", "execution_count": 47, "id": "624c3fae-0ec3-498b-b8f1-f60adc2d4cad", "metadata": {}, "outputs": [], "source": [ "from esem.utils import get_random_params\n", "from esem.abc_sampler import ABCSampler, constrain" ] }, { "cell_type": "code", "execution_count": 48, "id": "a59b9590-cb49-41e2-834d-ac96512d3ed7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
micro_mg_autocon_nd_expmicro_mg_dcscldfrc_dp1cldfrc_dp2clubb_C6thlbclubb_C8clubb_c1clubb_c11clubb_c14dust_emis_fact...micro_mg_berg_eff_factormicro_mg_homog_sizemicro_mg_iaccr_factormicro_mg_vtrmi_factormicrop_aero_wsub_scalemicrop_aero_wsubi_scaleseasalt_emis_scalezmconv_capelmtzmconv_kezmconv_tiedke_add
nmb_sim
250.9715000.8058470.2064240.6714710.6842290.7939500.7797540.2276610.3005340.974161...0.1063400.5562510.4691440.5054580.9317980.0494840.9553140.0744890.7989510.634364
260.6498660.8946490.6181480.9383610.5183240.5382490.6655060.8129900.5670410.865573...0.0323050.3019090.4995150.0884590.7315000.0927610.4320790.0585860.0849650.833772
270.7037680.7675920.0511990.3489670.0864440.5492570.2732960.9793760.7156800.107133...0.7830430.6448650.8118430.9058360.9912890.2687220.4684690.8237170.6986780.404756
280.9483120.0000000.8882820.4815790.0584400.9642240.3793810.5302530.0697770.730504...0.7563680.7497650.7728500.6559380.4893640.4155440.1743670.4695520.5911950.371451
290.1235600.3652550.6749390.9795950.0720700.2719050.7065850.6542030.9235450.517474...0.8871580.4386710.9605350.4335220.6822040.2556070.7571540.7020680.8356470.854877
..................................................................
2580.7256040.9248490.0924770.6316730.7054860.7478390.6052310.5861430.3778380.898157...0.3575680.3207850.1393840.9896300.3797180.6670790.7515090.9236230.5225420.081568
2590.6336060.3411120.0767880.2648900.9774080.6683250.0178420.8786020.9769710.009132...0.9715030.0630190.1323570.0349850.0571830.4949460.3973520.8186350.4912360.056177
2600.6198600.5681490.7659960.9150390.3387420.9832730.2435260.0993710.3141780.179294...0.6934110.4488540.2050110.3710560.2736510.1853710.7721560.3230950.9594860.484692
2610.9926540.1260660.2554410.6986650.2495640.6835990.7187310.9176750.6277530.204757...0.4163350.6674220.2263510.1780840.9447020.4523940.8031220.0491630.2476090.997869
2620.2978730.8687200.8300210.9616610.9979730.3751010.0326010.5867630.0507060.727236...0.1590030.8560630.9251820.1082610.1058630.5604360.7200560.6497580.2054580.675950
\n", "

237 rows × 23 columns

\n", "
" ], "text/plain": [ " micro_mg_autocon_nd_exp micro_mg_dcs cldfrc_dp1 cldfrc_dp2 \\\n", "nmb_sim \n", "25 0.971500 0.805847 0.206424 0.671471 \n", "26 0.649866 0.894649 0.618148 0.938361 \n", "27 0.703768 0.767592 0.051199 0.348967 \n", "28 0.948312 0.000000 0.888282 0.481579 \n", "29 0.123560 0.365255 0.674939 0.979595 \n", "... ... ... ... ... \n", "258 0.725604 0.924849 0.092477 0.631673 \n", "259 0.633606 0.341112 0.076788 0.264890 \n", "260 0.619860 0.568149 0.765996 0.915039 \n", "261 0.992654 0.126066 0.255441 0.698665 \n", "262 0.297873 0.868720 0.830021 0.961661 \n", "\n", " clubb_C6thlb clubb_C8 clubb_c1 clubb_c11 clubb_c14 \\\n", "nmb_sim \n", "25 0.684229 0.793950 0.779754 0.227661 0.300534 \n", "26 0.518324 0.538249 0.665506 0.812990 0.567041 \n", "27 0.086444 0.549257 0.273296 0.979376 0.715680 \n", "28 0.058440 0.964224 0.379381 0.530253 0.069777 \n", "29 0.072070 0.271905 0.706585 0.654203 0.923545 \n", "... ... ... ... ... ... \n", "258 0.705486 0.747839 0.605231 0.586143 0.377838 \n", "259 0.977408 0.668325 0.017842 0.878602 0.976971 \n", "260 0.338742 0.983273 0.243526 0.099371 0.314178 \n", "261 0.249564 0.683599 0.718731 0.917675 0.627753 \n", "262 0.997973 0.375101 0.032601 0.586763 0.050706 \n", "\n", " dust_emis_fact ... micro_mg_berg_eff_factor micro_mg_homog_size \\\n", "nmb_sim ... \n", "25 0.974161 ... 0.106340 0.556251 \n", "26 0.865573 ... 0.032305 0.301909 \n", "27 0.107133 ... 0.783043 0.644865 \n", "28 0.730504 ... 0.756368 0.749765 \n", "29 0.517474 ... 0.887158 0.438671 \n", "... ... ... ... ... \n", "258 0.898157 ... 0.357568 0.320785 \n", "259 0.009132 ... 0.971503 0.063019 \n", "260 0.179294 ... 0.693411 0.448854 \n", "261 0.204757 ... 0.416335 0.667422 \n", "262 0.727236 ... 0.159003 0.856063 \n", "\n", " micro_mg_iaccr_factor micro_mg_vtrmi_factor microp_aero_wsub_scale \\\n", "nmb_sim \n", "25 0.469144 0.505458 0.931798 \n", "26 0.499515 0.088459 0.731500 \n", "27 0.811843 0.905836 0.991289 \n", "28 0.772850 0.655938 0.489364 \n", "29 0.960535 0.433522 0.682204 \n", "... ... ... ... \n", "258 0.139384 0.989630 0.379718 \n", "259 0.132357 0.034985 0.057183 \n", "260 0.205011 0.371056 0.273651 \n", "261 0.226351 0.178084 0.944702 \n", "262 0.925182 0.108261 0.105863 \n", "\n", " microp_aero_wsubi_scale seasalt_emis_scale zmconv_capelmt \\\n", "nmb_sim \n", "25 0.049484 0.955314 0.074489 \n", "26 0.092761 0.432079 0.058586 \n", "27 0.268722 0.468469 0.823717 \n", "28 0.415544 0.174367 0.469552 \n", "29 0.255607 0.757154 0.702068 \n", "... ... ... ... \n", "258 0.667079 0.751509 0.923623 \n", "259 0.494946 0.397352 0.818635 \n", "260 0.185371 0.772156 0.323095 \n", "261 0.452394 0.803122 0.049163 \n", "262 0.560436 0.720056 0.649758 \n", "\n", " zmconv_ke zmconv_tiedke_add \n", "nmb_sim \n", "25 0.798951 0.634364 \n", "26 0.084965 0.833772 \n", "27 0.698678 0.404756 \n", "28 0.591195 0.371451 \n", "29 0.835647 0.854877 \n", "... ... ... \n", "258 0.522542 0.081568 \n", "259 0.491236 0.056177 \n", "260 0.959486 0.484692 \n", "261 0.247609 0.997869 \n", "262 0.205458 0.675950 \n", "\n", "[237 rows x 23 columns]" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train" ] }, { "cell_type": "code", "execution_count": 49, "id": "bce220b1-d3b8-407b-b04f-282e242dc9db", "metadata": {}, "outputs": [], "source": [ "# Setup sampler with 1 million points\n", "sample_points = pd.DataFrame(data=get_random_params(23, int(1e6)), columns=X_train.columns)\n", "sampler = ABCSampler(gp, np.asarray([-40.5]), obs_uncertainty=0.5)" ] }, { "cell_type": "code", "execution_count": 50, "id": "1612dc29-7e37-4b3e-9c5d-bdfd906bb808", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "e2e1d419a6d54186bca265f5b0417216", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/1000000 [00:00" ] } ], "source": [ "valid_samples = sampler.batch_constrain(sample_points, batch_size=10000)\n" ] }, { "cell_type": "code", "execution_count": 51, "id": "f576276d-6729-4d04-977a-8d0283aff792", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Remaining points: 100\n" ] } ], "source": [ "print(\"Remaining points: {}\".format(valid_samples.sum()))\n" ] }, { "cell_type": "code", "execution_count": 52, "id": "6d556619-d81c-42b3-bf7d-e72b485b3741", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "numpy.ndarray" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(valid_samples)" ] } ], "metadata": { "kernelspec": { "display_name": "Python [conda env:ml-notebook]", "language": "python", "name": "conda-env-ml-notebook-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.11.8" } }, "nbformat": 4, "nbformat_minor": 5 }