{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "toc": true
   },
   "source": [
    "
Table of Contents
\n",
    "

- 1  Compare weighted and unweighted mean temperature

- 

- 1.0.1  Data
- 1.0.2  Creating weights
- 1.0.3  Weighted mean
- 1.0.4  Plot: comparison with unweighted mean

"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Compare weighted and unweighted mean temperature\n",
    "\n",
    "\n",
    "Author: [Mathias Hauser](https://github.com/mathause/)\n",
    "\n",
    "\n",
    "We use the `air_temperature` example dataset to calculate the area-weighted temperature over its domain. This dataset has a regular latitude/ longitude grid, thus the grid cell area decreases towards the pole. For this grid we can use the cosine of the latitude as proxy for the grid cell area.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-17T14:43:57.222351Z",
     "start_time": "2020-03-17T14:43:56.147541Z"
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import cartopy.crs as ccrs\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "import xarray as xr"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Data\n",
    "\n",
    "Load the data, convert to celsius, and resample to daily values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-17T14:43:57.831734Z",
     "start_time": "2020-03-17T14:43:57.651845Z"
    }
   },
   "outputs": [],
   "source": [
    "ds = xr.tutorial.load_dataset(\"air_temperature\")\n",
    "\n",
    "# to celsius\n",
    "air = ds.air - 273.15\n",
    "\n",
    "# resample from 6-hourly to daily values\n",
    "air = air.resample(time=\"D\").mean()\n",
    "\n",
    "air"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plot the first timestep:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-17T14:43:59.887120Z",
     "start_time": "2020-03-17T14:43:59.582894Z"
    }
   },
   "outputs": [],
   "source": [
    "projection = ccrs.LambertConformal(central_longitude=-95, central_latitude=45)\n",
    "\n",
    "f, ax = plt.subplots(subplot_kw=dict(projection=projection))\n",
    "\n",
    "air.isel(time=0).plot(transform=ccrs.PlateCarree(), cbar_kwargs=dict(shrink=0.7))\n",
    "ax.coastlines()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Creating weights\n",
    "\n",
    "For a rectangular grid the cosine of the latitude is proportional to the grid cell area."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-17T14:44:18.777092Z",
     "start_time": "2020-03-17T14:44:18.736587Z"
    }
   },
   "outputs": [],
   "source": [
    "weights = np.cos(np.deg2rad(air.lat))\n",
    "weights.name = \"weights\"\n",
    "weights"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Weighted mean"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-17T14:44:52.607120Z",
     "start_time": "2020-03-17T14:44:52.564674Z"
    }
   },
   "outputs": [],
   "source": [
    "air_weighted = air.weighted(weights)\n",
    "air_weighted"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-17T14:44:54.334279Z",
     "start_time": "2020-03-17T14:44:54.280022Z"
    }
   },
   "outputs": [],
   "source": [
    "weighted_mean = air_weighted.mean((\"lon\", \"lat\"))\n",
    "weighted_mean"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot: comparison with unweighted mean\n",
    "\n",
    "Note how the weighted mean temperature is higher than the unweighted."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-03-17T14:45:08.877307Z",
     "start_time": "2020-03-17T14:45:08.673383Z"
    }
   },
   "outputs": [],
   "source": [
    "weighted_mean.plot(label=\"weighted\")\n",
    "air.mean((\"lon\", \"lat\")).plot(label=\"unweighted\")\n",
    "\n",
    "plt.legend()"
   ]
  }
 ],
 "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.7.6"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": true,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
