{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# From xarray to pandas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Import python packages" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "import xarray as xr\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 pandas as pd\n", "import dask\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Open CMIP6 online catalog" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "

pangeo-cmip6 catalog with 7632 dataset(s) from 517667 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", "
unique
activity_id18
institution_id36
source_id88
experiment_id170
member_id657
table_id37
variable_id709
grid_label10
zstore517667
dcpp_init_year60
version715
\n", "
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cat_url = \"https://storage.googleapis.com/cmip6/pangeo-cmip6.json\"\n", "col = intake.open_esm_datastore(cat_url)\n", "col" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Search corresponding data " ] }, { "cell_type": "code", "execution_count": 14, "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", "
activity_idinstitution_idsource_idexperiment_idmember_idtable_idvariable_idgrid_labelzstoredcpp_init_yearversion
0CMIPNCARCESM2-WACCMhistoricalr1i1p1f1AERmonso2gngs://cmip6/CMIP6/CMIP/NCAR/CESM2-WACCM/histori...NaN20190227
\n", "
" ], "text/plain": [ " activity_id institution_id source_id experiment_id member_id table_id \\\n", "0 CMIP NCAR CESM2-WACCM historical r1i1p1f1 AERmon \n", "\n", " variable_id grid_label zstore \\\n", "0 so2 gn gs://cmip6/CMIP6/CMIP/NCAR/CESM2-WACCM/histori... \n", "\n", " dcpp_init_year version \n", "0 NaN 20190227 " ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cat = col.search(source_id=['CESM2-WACCM'], experiment_id=['historical'], table_id=['AERmon'], variable_id=['so2'], member_id=['r1i1p1f1'])\n", "cat.df" ] }, { "cell_type": "markdown", "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": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "--> The keys in the returned dictionary of datasets are constructed as follows:\n", "\t'activity_id.institution_id.source_id.experiment_id.table_id.grid_label'\n" ] }, { "data": { "text/html": [ "\n", "
\n", " \n", " \n", " 100.00% [1/1 00:00<00:00]\n", "
\n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dset_dict = cat.to_dataset_dict(zarr_kwargs={'use_cftime':True})" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['CMIP.NCAR.CESM2-WACCM.historical.AERmon.gn']\n" ] } ], "source": [ "lconf = list(dset_dict.keys())\n", "print(lconf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Open dataset\n", "\n", "- Use `xarray` python package to analyze netCDF dataset\n", "- `open_dataset` allows to get all the metadata without loading data into memory. \n", "- with `xarray`, we only load into memory what is needed." ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "dset = dset_dict[lconf[0]]\n", "dset = dset.squeeze()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Get metadata corresponding to the whole dataset" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset>\n",
       "Dimensions:    (lat: 192, lev: 70, lon: 288, nbnd: 2, time: 1980)\n",
       "Coordinates:\n",
       "  * lat        (lat) float64 -90.0 -89.06 -88.12 -87.17 ... 88.12 89.06 90.0\n",
       "    lat_bnds   (lat, nbnd) float32 dask.array<chunksize=(192, 2), meta=np.ndarray>\n",
       "  * lev        (lev) float64 -5.96e-06 -9.827e-06 -1.62e-05 ... -976.3 -992.6\n",
       "    lev_bnds   (lev, nbnd) float32 dask.array<chunksize=(70, 2), meta=np.ndarray>\n",
       "  * lon        (lon) float64 0.0 1.25 2.5 3.75 5.0 ... 355.0 356.2 357.5 358.8\n",
       "    lon_bnds   (lon, nbnd) float32 dask.array<chunksize=(288, 2), meta=np.ndarray>\n",
       "  * time       (time) object 1850-01-15 12:00:00 ... 2014-12-15 12:00:00\n",
       "    time_bnds  (time, nbnd) object dask.array<chunksize=(1980, 2), meta=np.ndarray>\n",
       "    member_id  <U8 'r1i1p1f1'\n",
       "Dimensions without coordinates: nbnd\n",
       "Data variables:\n",
       "    so2        (time, lev, lat, lon) float32 dask.array<chunksize=(5, 70, 192, 288), meta=np.ndarray>\n",
       "Attributes: (12/48)\n",
       "    Conventions:             CF-1.7 CMIP-6.2\n",
       "    activity_id:             CMIP\n",
       "    branch_method:           standard\n",
       "    branch_time_in_child:    674885.0\n",
       "    branch_time_in_parent:   20075.0\n",
       "    case_id:                 4\n",
       "    ...                      ...\n",
       "    variable_id:             so2\n",
       "    variant_info:            CMIP6 CESM2 hindcast (1850-2014) with high-top a...\n",
       "    variant_label:           r1i1p1f1\n",
       "    status:                  2019-11-05;created;by nhn2@columbia.edu\n",
       "    intake_esm_varname:      ['so2']\n",
       "    intake_esm_dataset_key:  CMIP.NCAR.CESM2-WACCM.historical.AERmon.gn
" ], "text/plain": [ "\n", "Dimensions: (lat: 192, lev: 70, lon: 288, nbnd: 2, time: 1980)\n", "Coordinates:\n", " * lat (lat) float64 -90.0 -89.06 -88.12 -87.17 ... 88.12 89.06 90.0\n", " lat_bnds (lat, nbnd) float32 dask.array\n", " * lev (lev) float64 -5.96e-06 -9.827e-06 -1.62e-05 ... -976.3 -992.6\n", " lev_bnds (lev, nbnd) float32 dask.array\n", " * lon (lon) float64 0.0 1.25 2.5 3.75 5.0 ... 355.0 356.2 357.5 358.8\n", " lon_bnds (lon, nbnd) float32 dask.array\n", " * time (time) object 1850-01-15 12:00:00 ... 2014-12-15 12:00:00\n", " time_bnds (time, nbnd) object dask.array\n", " member_id \n", "Attributes: (12/48)\n", " Conventions: CF-1.7 CMIP-6.2\n", " activity_id: CMIP\n", " branch_method: standard\n", " branch_time_in_child: 674885.0\n", " branch_time_in_parent: 20075.0\n", " case_id: 4\n", " ... ...\n", " variable_id: so2\n", " variant_info: CMIP6 CESM2 hindcast (1850-2014) with high-top a...\n", " variant_label: r1i1p1f1\n", " status: 2019-11-05;created;by nhn2@columbia.edu\n", " intake_esm_varname: ['so2']\n", " intake_esm_dataset_key: CMIP.NCAR.CESM2-WACCM.historical.AERmon.gn" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Get metadata corresponding to SO2" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "dask.array\n", "Coordinates:\n", " * lat (lat) float64 -90.0 -89.06 -88.12 -87.17 ... 88.12 89.06 90.0\n", " * lev (lev) float64 -5.96e-06 -9.827e-06 -1.62e-05 ... -976.3 -992.6\n", " * lon (lon) float64 0.0 1.25 2.5 3.75 5.0 ... 355.0 356.2 357.5 358.8\n", " * time (time) object 1850-01-15 12:00:00 ... 2014-12-15 12:00:00\n", " member_id \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray 'so2' (time: 1980, lat: 192)>\n",
       "array([[4.4148924e-11, 4.3374932e-11, 4.1744469e-11, ..., 2.0261100e-12,\n",
       "        1.8938171e-12, 1.8695366e-12],\n",
       "       [3.1989539e-11, 3.1808257e-11, 3.1800659e-11, ..., 1.2741638e-12,\n",
       "        1.2158472e-12, 1.1790553e-12],\n",
       "       [2.9416582e-12, 2.6269848e-12, 2.5257598e-12, ..., 6.3785300e-13,\n",
       "        6.2758875e-13, 6.3872253e-13],\n",
       "       ...,\n",
       "       [8.3957434e-13, 8.9930792e-13, 8.8156679e-13, ..., 4.1710988e-12,\n",
       "        4.0890802e-12, 5.4941021e-12],\n",
       "       [7.7786545e-12, 7.8954681e-12, 8.0431321e-12, ..., 2.4857640e-11,\n",
       "        2.7402766e-11, 3.3165942e-11],\n",
       "       [1.2275407e-11, 1.2175271e-11, 1.2504974e-11, ..., 4.6298299e-10,\n",
       "        4.6481125e-10, 4.7047843e-10]], dtype=float32)\n",
       "Coordinates:\n",
       "  * lat        (lat) float64 -90.0 -89.06 -88.12 -87.17 ... 88.12 89.06 90.0\n",
       "    lev        float64 -992.6\n",
       "  * time       (time) object 1850-01-15 12:00:00 ... 2014-12-15 12:00:00\n",
       "    member_id  <U8 'r1i1p1f1'
" ], "text/plain": [ "\n", "array([[4.4148924e-11, 4.3374932e-11, 4.1744469e-11, ..., 2.0261100e-12,\n", " 1.8938171e-12, 1.8695366e-12],\n", " [3.1989539e-11, 3.1808257e-11, 3.1800659e-11, ..., 1.2741638e-12,\n", " 1.2158472e-12, 1.1790553e-12],\n", " [2.9416582e-12, 2.6269848e-12, 2.5257598e-12, ..., 6.3785300e-13,\n", " 6.2758875e-13, 6.3872253e-13],\n", " ...,\n", " [8.3957434e-13, 8.9930792e-13, 8.8156679e-13, ..., 4.1710988e-12,\n", " 4.0890802e-12, 5.4941021e-12],\n", " [7.7786545e-12, 7.8954681e-12, 8.0431321e-12, ..., 2.4857640e-11,\n", " 2.7402766e-11, 3.3165942e-11],\n", " [1.2275407e-11, 1.2175271e-11, 1.2504974e-11, ..., 4.6298299e-10,\n", " 4.6481125e-10, 4.7047843e-10]], dtype=float32)\n", "Coordinates:\n", " * lat (lat) float64 -90.0 -89.06 -88.12 -87.17 ... 88.12 89.06 90.0\n", " lev float64 -992.6\n", " * time (time) object 1850-01-15 12:00:00 ... 2014-12-15 12:00:00\n", " member_id ]" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "dset_selection.sel(time=cftime.DatetimeNoLeap(2003, 10, 15), method=\"nearest\").plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Convert to pandas dataframe" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 56.4 ms, sys: 2.27 ms, total: 58.7 ms\n", "Wall time: 85.7 ms\n" ] } ], "source": [ "%%time\n", "pdf = dset_selection.to_dataframe()" ] }, { "cell_type": "code", "execution_count": 78, "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", "
levmember_idso2
timelat
1850-01-15 12:00:00-90.000000-992.556095r1i1p1f14.414892e-11
-89.057592-992.556095r1i1p1f14.337493e-11
-88.115183-992.556095r1i1p1f14.174447e-11
-87.172775-992.556095r1i1p1f14.043559e-11
-86.230366-992.556095r1i1p1f14.044334e-11
\n", "
" ], "text/plain": [ " lev member_id so2\n", "time lat \n", "1850-01-15 12:00:00 -90.000000 -992.556095 r1i1p1f1 4.414892e-11\n", " -89.057592 -992.556095 r1i1p1f1 4.337493e-11\n", " -88.115183 -992.556095 r1i1p1f1 4.174447e-11\n", " -87.172775 -992.556095 r1i1p1f1 4.043559e-11\n", " -86.230366 -992.556095 r1i1p1f1 4.044334e-11" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pdf.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Drop a column" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [], "source": [ "pdf.drop('member_id', axis=1, inplace=True)" ] }, { "cell_type": "code", "execution_count": 81, "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", "
levso2
timelat
1850-01-15 12:00:00-90.000000-992.5560954.414892e-11
-89.057592-992.5560954.337493e-11
-88.115183-992.5560954.174447e-11
-87.172775-992.5560954.043559e-11
-86.230366-992.5560954.044334e-11
\n", "
" ], "text/plain": [ " lev so2\n", "time lat \n", "1850-01-15 12:00:00 -90.000000 -992.556095 4.414892e-11\n", " -89.057592 -992.556095 4.337493e-11\n", " -88.115183 -992.556095 4.174447e-11\n", " -87.172775 -992.556095 4.043559e-11\n", " -86.230366 -992.556095 4.044334e-11" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pdf.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Save to local file" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [], "source": [ "pdf.to_csv(\"CMIP_NCAR_CESM2-WACCM_historical_AERmon_zonal_mean.csv\", sep='\\t')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Save your results to Remote private object storage\n", "- your credentials are in `$HOME/.aws/credentials` \n", "- check with your instructor to get the secret access key (replace XXX by the right key)\n", "\n", "```\n", "[default]\n", "aws_access_key_id=forces2021-work\n", "aws_secret_access_key=XXXXXXXXXXXX\n", "aws_endpoint_url=https://forces2021.uiogeo-apps.sigma2.no/\n", "```\n", "
\n", " It is important to save your results in a place that can last longer than a few days/weeks!\n", "
" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [], "source": [ "import s3fs" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [], "source": [ "fsg = s3fs.S3FileSystem(anon=False,\n", " client_kwargs={\n", " 'endpoint_url': 'https://forces2021.uiogeo-apps.sigma2.no/'\n", " })" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Upload local file to remote storage" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "s3://work/annefou/CMIP_NCAR_CESM2-WACCM_historical_AERmon_zonal_mean.csv\n" ] } ], "source": [ "s3_path = \"s3://work/annefou/CMIP_NCAR_CESM2-WACCM_historical_AERmon_zonal_mean.csv\"\n", "print(s3_path)" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [], "source": [ "fsg.put('CMIP_NCAR_CESM2-WACCM_historical_AERmon_zonal_mean.csv', s3_path)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "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.8.8" } }, "nbformat": 4, "nbformat_minor": 4 }