{ "cells": [ { "cell_type": "markdown", "id": "e332933a-960c-4dfc-92a7-6f39ad95f13c", "metadata": {}, "source": [ "# Conservative Region Aggregation with Xarray, Geopandas and Sparse\n", "\n", "**Goal:** Regrid a global precipitation dataset into countries _conservatively_, i.e. by exactly partitioning each grid cell into the precise region boundaries.\n", "\n", "**Meta Goal:** Demonstrate that we don't necessarily need a package for this workflow and showcase some of the new capabilities of GeoPandas along the way.\n", "\n", "**Approach:** We take a three step approach:\n", "- Represent both the original grid and target grid as GeoSeries with Polygon geometry\n", "- Compute their area overlay and turn it into a sparse matrix\n", "- Perform matrix multiplication on the full Xarray dataset (with a time dimension)\n", "\n", "It is quite fast and transparent." ] }, { "cell_type": "code", "execution_count": 1, "id": "10c5e445-cb29-4c40-89ff-f97e72193d17", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Exception reporting mode: Minimal\n" ] } ], "source": [ "import xarray as xr\n", "import geopandas as gp\n", "import pandas as pd\n", "import sparse\n", "%xmode minimal" ] }, { "cell_type": "markdown", "id": "4a26f08f-cf8e-4f11-b44d-ed80fda4150f", "metadata": {}, "source": [ "## Load Region Data\n", "\n", "To make this realistic, we will start from an actual shapefile. To download the data, run the following cell uncommented." ] }, { "cell_type": "code", "execution_count": 2, "id": "bc789221-73d8-4d3e-b0ad-c5b746a3958c", "metadata": {}, "outputs": [], "source": [ "# ! wget https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/50m/cultural/ne_50m_admin_0_countries.zip\n", "# ! unzip ne_50m_admin_0_countries.zip" ] }, { "cell_type": "markdown", "id": "c47aaa91-de9d-4653-9697-d6c6adbfb288", "metadata": {}, "source": [ "Load with geopandas:" ] }, { "cell_type": "code", "execution_count": 3, "id": "ec98354c-1cb4-4775-8226-909dc3739338", "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", "
featureclascalerankLABELRANKSOVEREIGNTSOV_A3ADM0_DIFLEVELTYPETLCADMIN...FCLASS_TRFCLASS_IDFCLASS_PLFCLASS_GRFCLASS_ITFCLASS_NLFCLASS_SEFCLASS_BDFCLASS_UAgeometry
0Admin-0 country13ZimbabweZWE02Sovereign country1Zimbabwe...NoneNoneNoneNoneNoneNoneNoneNoneNonePOLYGON ((31.28789 -22.40205, 31.19727 -22.344...
1Admin-0 country13ZambiaZMB02Sovereign country1Zambia...NoneNoneNoneNoneNoneNoneNoneNoneNonePOLYGON ((30.39609 -15.64307, 30.25068 -15.643...
2Admin-0 country13YemenYEM02Sovereign country1Yemen...NoneNoneNoneNoneNoneNoneNoneNoneNoneMULTIPOLYGON (((53.08564 16.64839, 52.58145 16...
3Admin-0 country32VietnamVNM02Sovereign country1Vietnam...NoneNoneNoneNoneNoneNoneNoneNoneNoneMULTIPOLYGON (((104.06396 10.39082, 104.08301 ...
4Admin-0 country53VenezuelaVEN02Sovereign country1Venezuela...NoneNoneNoneNoneNoneNoneNoneNoneNoneMULTIPOLYGON (((-60.82119 9.13838, -60.94141 9...
..................................................................
237Admin-0 country13AfghanistanAFG02Sovereign country1Afghanistan...NoneNoneNoneNoneNoneNoneNoneNoneNonePOLYGON ((66.52227 37.34849, 66.82773 37.37129...
238Admin-0 country15KashmirKAS02IndeterminateNoneSiachen Glacier...UnrecognizedUnrecognizedUnrecognizedUnrecognizedUnrecognizedUnrecognizedUnrecognizedUnrecognizedUnrecognizedPOLYGON ((77.04863 35.10991, 77.00449 35.19634...
239Admin-0 country34AntarcticaATA02Indeterminate1Antarctica...NoneNoneNoneNoneNoneNoneNoneNoneNoneMULTIPOLYGON (((-45.71777 -60.52090, -45.49971...
240Admin-0 country36NetherlandsNL112Country1Sint Maarten...NoneNoneNoneNoneNoneNoneNoneNoneNonePOLYGON ((-63.12305 18.06895, -63.01118 18.068...
241Admin-0 country56TuvaluTUV02Sovereign country1Tuvalu...NoneNoneNoneNoneNoneNoneNoneNoneNonePOLYGON ((179.21367 -8.52422, 179.20059 -8.534...
\n", "

242 rows × 169 columns

\n", "
" ], "text/plain": [ " featurecla scalerank LABELRANK SOVEREIGNT SOV_A3 ADM0_DIF \\\n", "0 Admin-0 country 1 3 Zimbabwe ZWE 0 \n", "1 Admin-0 country 1 3 Zambia ZMB 0 \n", "2 Admin-0 country 1 3 Yemen YEM 0 \n", "3 Admin-0 country 3 2 Vietnam VNM 0 \n", "4 Admin-0 country 5 3 Venezuela VEN 0 \n", ".. ... ... ... ... ... ... \n", "237 Admin-0 country 1 3 Afghanistan AFG 0 \n", "238 Admin-0 country 1 5 Kashmir KAS 0 \n", "239 Admin-0 country 3 4 Antarctica ATA 0 \n", "240 Admin-0 country 3 6 Netherlands NL1 1 \n", "241 Admin-0 country 5 6 Tuvalu TUV 0 \n", "\n", " LEVEL TYPE TLC ADMIN ... FCLASS_TR \\\n", "0 2 Sovereign country 1 Zimbabwe ... None \n", "1 2 Sovereign country 1 Zambia ... None \n", "2 2 Sovereign country 1 Yemen ... None \n", "3 2 Sovereign country 1 Vietnam ... None \n", "4 2 Sovereign country 1 Venezuela ... None \n", ".. ... ... ... ... ... ... \n", "237 2 Sovereign country 1 Afghanistan ... None \n", "238 2 Indeterminate None Siachen Glacier ... Unrecognized \n", "239 2 Indeterminate 1 Antarctica ... None \n", "240 2 Country 1 Sint Maarten ... None \n", "241 2 Sovereign country 1 Tuvalu ... None \n", "\n", " FCLASS_ID FCLASS_PL FCLASS_GR FCLASS_IT FCLASS_NL \\\n", "0 None None None None None \n", "1 None None None None None \n", "2 None None None None None \n", "3 None None None None None \n", "4 None None None None None \n", ".. ... ... ... ... ... \n", "237 None None None None None \n", "238 Unrecognized Unrecognized Unrecognized Unrecognized Unrecognized \n", "239 None None None None None \n", "240 None None None None None \n", "241 None None None None None \n", "\n", " FCLASS_SE FCLASS_BD FCLASS_UA \\\n", "0 None None None \n", "1 None None None \n", "2 None None None \n", "3 None None None \n", "4 None None None \n", ".. ... ... ... \n", "237 None None None \n", "238 Unrecognized Unrecognized Unrecognized \n", "239 None None None \n", "240 None None None \n", "241 None None None \n", "\n", " geometry \n", "0 POLYGON ((31.28789 -22.40205, 31.19727 -22.344... \n", "1 POLYGON ((30.39609 -15.64307, 30.25068 -15.643... \n", "2 MULTIPOLYGON (((53.08564 16.64839, 52.58145 16... \n", "3 MULTIPOLYGON (((104.06396 10.39082, 104.08301 ... \n", "4 MULTIPOLYGON (((-60.82119 9.13838, -60.94141 9... \n", ".. ... \n", "237 POLYGON ((66.52227 37.34849, 66.82773 37.37129... \n", "238 POLYGON ((77.04863 35.10991, 77.00449 35.19634... \n", "239 MULTIPOLYGON (((-45.71777 -60.52090, -45.49971... \n", "240 POLYGON ((-63.12305 18.06895, -63.01118 18.068... \n", "241 POLYGON ((179.21367 -8.52422, 179.20059 -8.534... \n", "\n", "[242 rows x 169 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regions_df = gp.read_file(\"ne_50m_admin_0_countries.shp\")\n", "regions_df" ] }, { "cell_type": "markdown", "id": "daf425d5-adea-4315-8dfc-0b1ac1e12ae7", "metadata": {}, "source": [ "All geodataframes should have a coordinate reference system. This is important (and sometimes unfamiliar to users coming from the global climate world).\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "57dd5dd8-64cd-48c4-aa5c-ff060f46b3a6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\n", "Name: WGS 84\n", "Axis Info [ellipsoidal]:\n", "- Lat[north]: Geodetic latitude (degree)\n", "- Lon[east]: Geodetic longitude (degree)\n", "Area of Use:\n", "- name: World.\n", "- bounds: (-180.0, -90.0, 180.0, 90.0)\n", "Datum: World Geodetic System 1984 ensemble\n", "- Ellipsoid: WGS 84\n", "- Prime Meridian: Greenwich" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regions_df.crs" ] }, { "cell_type": "code", "execution_count": 5, "id": "075df45a-04b4-4df5-b6d2-89f5e86ff41c", "metadata": {}, "outputs": [], "source": [ "crs_orig = \"EPSG:4326\"" ] }, { "cell_type": "markdown", "id": "fe2244de-ddd1-4950-a308-162db4fbf578", "metadata": {}, "source": [ "We will now transform to an area preserving projection. This is imporant because we want to do area-weighted regridding." ] }, { "cell_type": "code", "execution_count": 6, "id": "7dcbb8bc-993f-4b3f-8228-bcf2737da3e9", "metadata": {}, "outputs": [], "source": [ "# use an area preserving projections\n", "crs = \"ESRI:53034\"\n", "regions_df = regions_df.to_crs(crs)" ] }, { "cell_type": "markdown", "id": "5bab6aee-43db-4dd5-989e-2a5fa188abb6", "metadata": {}, "source": [ "Explore the dataset a bit." ] }, { "cell_type": "code", "execution_count": 7, "id": "81c88693-cbe9-49e2-bfec-c96607d80483", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "regions_df.geometry.plot()" ] }, { "cell_type": "code", "execution_count": 8, "id": "3cf23173-ac6e-41c2-98f1-28f42533e854", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regions_df.geometry.iloc[0]" ] }, { "cell_type": "markdown", "id": "3d25aee0-c33d-4840-9ca4-80039ada18c4", "metadata": {}, "source": [ "This is the area of all the land on earth:" ] }, { "cell_type": "code", "execution_count": 9, "id": "394b250c-d4b4-4353-b646-2be072881780", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "146631193254209.66" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regions_df.area.sum()" ] }, { "cell_type": "markdown", "id": "93dcdd5d-4362-4dcb-8a30-0a432d976e7a", "metadata": {}, "source": [ "## Load Precipitation Data\n", "\n", "This is the NASA / NOAA Global Precipitation Climatology Project processed and stored by Pangeo Forge: https://pangeo-forge.org/dashboard/feedstock/42. We want to aggregate the precipitation into countries defined in the shapefile.\n", "\n", "Note that we have the entire dataset in one object:" ] }, { "cell_type": "code", "execution_count": 10, "id": "b8b40efb-eab1-4762-ba1b-abe11acc3f23", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset>\n",
       "Dimensions:      (latitude: 180, nv: 2, longitude: 360, time: 9226)\n",
       "Coordinates:\n",
       "    lat_bounds   (latitude, nv) float32 dask.array<chunksize=(180, 2), meta=np.ndarray>\n",
       "  * latitude     (latitude) float32 -90.0 -89.0 -88.0 -87.0 ... 87.0 88.0 89.0\n",
       "    lon_bounds   (longitude, nv) float32 dask.array<chunksize=(360, 2), meta=np.ndarray>\n",
       "  * longitude    (longitude) float32 0.0 1.0 2.0 3.0 ... 356.0 357.0 358.0 359.0\n",
       "  * time         (time) datetime64[ns] 1996-10-01 1996-10-02 ... 2021-12-31\n",
       "    time_bounds  (time, nv) datetime64[ns] dask.array<chunksize=(200, 2), meta=np.ndarray>\n",
       "Dimensions without coordinates: nv\n",
       "Data variables:\n",
       "    precip       (time, latitude, longitude) float32 dask.array<chunksize=(200, 180, 360), meta=np.ndarray>\n",
       "Attributes: (12/45)\n",
       "    Conventions:                CF-1.6, ACDD 1.3\n",
       "    Metadata_Conventions:       CF-1.6, Unidata Dataset Discovery v1.0, NOAA ...\n",
       "    acknowledgment:             This project was supported in part by a grant...\n",
       "    cdm_data_type:              Grid\n",
       "    cdr_program:                NOAA Climate Data Record Program for satellit...\n",
       "    cdr_variable:               precipitation\n",
       "    ...                         ...\n",
       "    standard_name_vocabulary:   CF Standard Name Table (v41, 22 February 2017)\n",
       "    summary:                    Global Precipitation Climatology Project (GPC...\n",
       "    time_coverage_duration:     P1D\n",
       "    time_coverage_end:          1996-10-01T23:59:59Z\n",
       "    time_coverage_start:        1996-10-01T00:00:00Z\n",
       "    title:                      Global Precipitation Climatatology Project (G...
" ], "text/plain": [ "\n", "Dimensions: (latitude: 180, nv: 2, longitude: 360, time: 9226)\n", "Coordinates:\n", " lat_bounds (latitude, nv) float32 dask.array\n", " * latitude (latitude) float32 -90.0 -89.0 -88.0 -87.0 ... 87.0 88.0 89.0\n", " lon_bounds (longitude, nv) float32 dask.array\n", " * longitude (longitude) float32 0.0 1.0 2.0 3.0 ... 356.0 357.0 358.0 359.0\n", " * time (time) datetime64[ns] 1996-10-01 1996-10-02 ... 2021-12-31\n", " time_bounds (time, nv) datetime64[ns] dask.array\n", "Dimensions without coordinates: nv\n", "Data variables:\n", " precip (time, latitude, longitude) float32 dask.array\n", "Attributes: (12/45)\n", " Conventions: CF-1.6, ACDD 1.3\n", " Metadata_Conventions: CF-1.6, Unidata Dataset Discovery v1.0, NOAA ...\n", " acknowledgment: This project was supported in part by a grant...\n", " cdm_data_type: Grid\n", " cdr_program: NOAA Climate Data Record Program for satellit...\n", " cdr_variable: precipitation\n", " ... ...\n", " standard_name_vocabulary: CF Standard Name Table (v41, 22 February 2017)\n", " summary: Global Precipitation Climatology Project (GPC...\n", " time_coverage_duration: P1D\n", " time_coverage_end: 1996-10-01T23:59:59Z\n", " time_coverage_start: 1996-10-01T00:00:00Z\n", " title: Global Precipitation Climatatology Project (G..." ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "store = 'https://ncsa.osn.xsede.org/Pangeo/pangeo-forge/gpcp-feedstock/gpcp.zarr'\n", "ds = xr.open_dataset(store, engine='zarr', chunks={})\n", "ds" ] }, { "cell_type": "markdown", "id": "364d52da-f10c-4305-9ef1-9248db3175a5", "metadata": {}, "source": [ "Now we extract just the horizontal grid information.\n", "The dataset has information about the lat and lon bounds of each cell, which we need to create the polygons." ] }, { "cell_type": "code", "execution_count": 11, "id": "7518f137-6742-41a2-b1c4-3e19648b6f85", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset>\n",
       "Dimensions:     (latitude: 180, nv: 2, longitude: 360)\n",
       "Coordinates:\n",
       "  * latitude    (latitude) float32 -90.0 -89.0 -88.0 -87.0 ... 87.0 88.0 89.0\n",
       "  * longitude   (longitude) float32 0.0 1.0 2.0 3.0 ... 356.0 357.0 358.0 359.0\n",
       "Dimensions without coordinates: nv\n",
       "Data variables:\n",
       "    lat_bounds  (latitude, nv) float32 -90.0 -89.0 -89.0 ... 89.0 89.0 90.0\n",
       "    lon_bounds  (longitude, nv) float32 0.0 1.0 1.0 2.0 ... 359.0 359.0 360.0\n",
       "Attributes: (12/45)\n",
       "    Conventions:                CF-1.6, ACDD 1.3\n",
       "    Metadata_Conventions:       CF-1.6, Unidata Dataset Discovery v1.0, NOAA ...\n",
       "    acknowledgment:             This project was supported in part by a grant...\n",
       "    cdm_data_type:              Grid\n",
       "    cdr_program:                NOAA Climate Data Record Program for satellit...\n",
       "    cdr_variable:               precipitation\n",
       "    ...                         ...\n",
       "    standard_name_vocabulary:   CF Standard Name Table (v41, 22 February 2017)\n",
       "    summary:                    Global Precipitation Climatology Project (GPC...\n",
       "    time_coverage_duration:     P1D\n",
       "    time_coverage_end:          1996-10-01T23:59:59Z\n",
       "    time_coverage_start:        1996-10-01T00:00:00Z\n",
       "    title:                      Global Precipitation Climatatology Project (G...
" ], "text/plain": [ "\n", "Dimensions: (latitude: 180, nv: 2, longitude: 360)\n", "Coordinates:\n", " * latitude (latitude) float32 -90.0 -89.0 -88.0 -87.0 ... 87.0 88.0 89.0\n", " * longitude (longitude) float32 0.0 1.0 2.0 3.0 ... 356.0 357.0 358.0 359.0\n", "Dimensions without coordinates: nv\n", "Data variables:\n", " lat_bounds (latitude, nv) float32 -90.0 -89.0 -89.0 ... 89.0 89.0 90.0\n", " lon_bounds (longitude, nv) float32 0.0 1.0 1.0 2.0 ... 359.0 359.0 360.0\n", "Attributes: (12/45)\n", " Conventions: CF-1.6, ACDD 1.3\n", " Metadata_Conventions: CF-1.6, Unidata Dataset Discovery v1.0, NOAA ...\n", " acknowledgment: This project was supported in part by a grant...\n", " cdm_data_type: Grid\n", " cdr_program: NOAA Climate Data Record Program for satellit...\n", " cdr_variable: precipitation\n", " ... ...\n", " standard_name_vocabulary: CF Standard Name Table (v41, 22 February 2017)\n", " summary: Global Precipitation Climatology Project (GPC...\n", " time_coverage_duration: P1D\n", " time_coverage_end: 1996-10-01T23:59:59Z\n", " time_coverage_start: 1996-10-01T00:00:00Z\n", " title: Global Precipitation Climatatology Project (G..." ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid = ds.drop(['time', 'time_bounds', 'precip']).reset_coords().load()\n", "grid" ] }, { "cell_type": "markdown", "id": "8d05c230-409c-4384-b8d3-a0c55266676d", "metadata": {}, "source": [ "Now we \"stack\" the data into a single 1D array. This is the first step towards transitioning to pandas." ] }, { "cell_type": "code", "execution_count": 12, "id": "6c02bfde-c749-40e1-b6f8-17db360e3d62", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset>\n",
       "Dimensions:     (nv: 2, point: 64800)\n",
       "Coordinates:\n",
       "  * point       (point) MultiIndex\n",
       "  - latitude    (point) float64 -90.0 -90.0 -90.0 -90.0 ... 89.0 89.0 89.0 89.0\n",
       "  - longitude   (point) float64 0.0 1.0 2.0 3.0 4.0 ... 356.0 357.0 358.0 359.0\n",
       "Dimensions without coordinates: nv\n",
       "Data variables:\n",
       "    lat_bounds  (nv, point) float32 -90.0 -90.0 -90.0 -90.0 ... 90.0 90.0 90.0\n",
       "    lon_bounds  (nv, point) float32 0.0 1.0 2.0 3.0 ... 357.0 358.0 359.0 360.0\n",
       "Attributes: (12/45)\n",
       "    Conventions:                CF-1.6, ACDD 1.3\n",
       "    Metadata_Conventions:       CF-1.6, Unidata Dataset Discovery v1.0, NOAA ...\n",
       "    acknowledgment:             This project was supported in part by a grant...\n",
       "    cdm_data_type:              Grid\n",
       "    cdr_program:                NOAA Climate Data Record Program for satellit...\n",
       "    cdr_variable:               precipitation\n",
       "    ...                         ...\n",
       "    standard_name_vocabulary:   CF Standard Name Table (v41, 22 February 2017)\n",
       "    summary:                    Global Precipitation Climatology Project (GPC...\n",
       "    time_coverage_duration:     P1D\n",
       "    time_coverage_end:          1996-10-01T23:59:59Z\n",
       "    time_coverage_start:        1996-10-01T00:00:00Z\n",
       "    title:                      Global Precipitation Climatatology Project (G...
" ], "text/plain": [ "\n", "Dimensions: (nv: 2, point: 64800)\n", "Coordinates:\n", " * point (point) MultiIndex\n", " - latitude (point) float64 -90.0 -90.0 -90.0 -90.0 ... 89.0 89.0 89.0 89.0\n", " - longitude (point) float64 0.0 1.0 2.0 3.0 4.0 ... 356.0 357.0 358.0 359.0\n", "Dimensions without coordinates: nv\n", "Data variables:\n", " lat_bounds (nv, point) float32 -90.0 -90.0 -90.0 -90.0 ... 90.0 90.0 90.0\n", " lon_bounds (nv, point) float32 0.0 1.0 2.0 3.0 ... 357.0 358.0 359.0 360.0\n", "Attributes: (12/45)\n", " Conventions: CF-1.6, ACDD 1.3\n", " Metadata_Conventions: CF-1.6, Unidata Dataset Discovery v1.0, NOAA ...\n", " acknowledgment: This project was supported in part by a grant...\n", " cdm_data_type: Grid\n", " cdr_program: NOAA Climate Data Record Program for satellit...\n", " cdr_variable: precipitation\n", " ... ...\n", " standard_name_vocabulary: CF Standard Name Table (v41, 22 February 2017)\n", " summary: Global Precipitation Climatology Project (GPC...\n", " time_coverage_duration: P1D\n", " time_coverage_end: 1996-10-01T23:59:59Z\n", " time_coverage_start: 1996-10-01T00:00:00Z\n", " title: Global Precipitation Climatatology Project (G..." ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "points = grid.stack(point=(\"latitude\", \"longitude\"))\n", "points" ] }, { "cell_type": "markdown", "id": "58b99d30-0a51-4a7d-9ab8-5b8a56c8bc3a", "metadata": {}, "source": [ "This function creates geometries for a single pair of bounds.\n", "It is not fast, but it is fast enough here.\n", "Perhaps could be vectorized using pygeos..." ] }, { "cell_type": "code", "execution_count": 13, "id": "fd1a472e-2143-4417-ba27-6fda01392f55", "metadata": {}, "outputs": [], "source": [ "from shapely.geometry import Polygon\n", "\n", "def bounds_to_poly(lon_bounds, lat_bounds):\n", " if lon_bounds[0] >= 180:\n", " # geopandas needs this\n", " lon_bounds = lon_bounds - 360\n", " return Polygon([\n", " (lon_bounds[0], lat_bounds[0]),\n", " (lon_bounds[0], lat_bounds[1]),\n", " (lon_bounds[1], lat_bounds[1]),\n", " (lon_bounds[1], lat_bounds[0])\n", " ])" ] }, { "cell_type": "markdown", "id": "97f136cd-8fb8-4a47-8b1a-a11c3f0082cf", "metadata": {}, "source": [ "We apply this function to each grid cell." ] }, { "cell_type": "code", "execution_count": 14, "id": "f9716bc0-6c5b-44db-8ccd-d555e9f1d573", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 1.14 s, sys: 43.4 ms, total: 1.18 s\n", "Wall time: 1.16 s\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (point: 64800)>\n",
       "array([<shapely.geometry.polygon.Polygon object at 0x7fb5449d8c70>,\n",
       "       <shapely.geometry.polygon.Polygon object at 0x7fb5449d8fd0>,\n",
       "       <shapely.geometry.polygon.Polygon object at 0x7fb5449d8550>, ...,\n",
       "       <shapely.geometry.polygon.Polygon object at 0x7fb535d69ac0>,\n",
       "       <shapely.geometry.polygon.Polygon object at 0x7fb535d69af0>,\n",
       "       <shapely.geometry.polygon.Polygon object at 0x7fb535d69b20>],\n",
       "      dtype=object)\n",
       "Coordinates:\n",
       "  * point      (point) MultiIndex\n",
       "  - latitude   (point) float64 -90.0 -90.0 -90.0 -90.0 ... 89.0 89.0 89.0 89.0\n",
       "  - longitude  (point) float64 0.0 1.0 2.0 3.0 4.0 ... 356.0 357.0 358.0 359.0
" ], "text/plain": [ "\n", "array([,\n", " ,\n", " , ...,\n", " ,\n", " ,\n", " ],\n", " dtype=object)\n", "Coordinates:\n", " * point (point) MultiIndex\n", " - latitude (point) float64 -90.0 -90.0 -90.0 -90.0 ... 89.0 89.0 89.0 89.0\n", " - longitude (point) float64 0.0 1.0 2.0 3.0 4.0 ... 356.0 357.0 358.0 359.0" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%time\n", "import numpy as np\n", "boxes = xr.apply_ufunc(\n", " bounds_to_poly,\n", " points.lon_bounds,\n", " points.lat_bounds,\n", " input_core_dims=[(\"nv\",), (\"nv\",)],\n", " output_dtypes=[np.dtype('O')],\n", " vectorize=True\n", ")\n", "boxes" ] }, { "cell_type": "markdown", "id": "3de8dacc-8b87-4ac2-9a7e-6d565f08fea7", "metadata": {}, "source": [ "Finally, we convert to a GeoDataframe.\n", "We specify the CRS as `EPSG:4326` because the geometry is in lat/lon coordinates." ] }, { "cell_type": "code", "execution_count": 15, "id": "789f7c5e-31c5-4a06-91e4-7437c7686d50", "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", "
geometrylatitudelongitude
latitudelongitude
-90.00.0POLYGON ((0.00000 -90.00000, 0.00000 -89.00000...-90.00.0
1.0POLYGON ((1.00000 -90.00000, 1.00000 -89.00000...-90.01.0
2.0POLYGON ((2.00000 -90.00000, 2.00000 -89.00000...-90.02.0
3.0POLYGON ((3.00000 -90.00000, 3.00000 -89.00000...-90.03.0
4.0POLYGON ((4.00000 -90.00000, 4.00000 -89.00000...-90.04.0
...............
89.0355.0POLYGON ((-5.00000 89.00000, -5.00000 90.00000...89.0355.0
356.0POLYGON ((-4.00000 89.00000, -4.00000 90.00000...89.0356.0
357.0POLYGON ((-3.00000 89.00000, -3.00000 90.00000...89.0357.0
358.0POLYGON ((-2.00000 89.00000, -2.00000 90.00000...89.0358.0
359.0POLYGON ((-1.00000 89.00000, -1.00000 90.00000...89.0359.0
\n", "

64800 rows × 3 columns

\n", "
" ], "text/plain": [ " geometry \\\n", "latitude longitude \n", "-90.0 0.0 POLYGON ((0.00000 -90.00000, 0.00000 -89.00000... \n", " 1.0 POLYGON ((1.00000 -90.00000, 1.00000 -89.00000... \n", " 2.0 POLYGON ((2.00000 -90.00000, 2.00000 -89.00000... \n", " 3.0 POLYGON ((3.00000 -90.00000, 3.00000 -89.00000... \n", " 4.0 POLYGON ((4.00000 -90.00000, 4.00000 -89.00000... \n", "... ... \n", " 89.0 355.0 POLYGON ((-5.00000 89.00000, -5.00000 90.00000... \n", " 356.0 POLYGON ((-4.00000 89.00000, -4.00000 90.00000... \n", " 357.0 POLYGON ((-3.00000 89.00000, -3.00000 90.00000... \n", " 358.0 POLYGON ((-2.00000 89.00000, -2.00000 90.00000... \n", " 359.0 POLYGON ((-1.00000 89.00000, -1.00000 90.00000... \n", "\n", " latitude longitude \n", "latitude longitude \n", "-90.0 0.0 -90.0 0.0 \n", " 1.0 -90.0 1.0 \n", " 2.0 -90.0 2.0 \n", " 3.0 -90.0 3.0 \n", " 4.0 -90.0 4.0 \n", "... ... ... \n", " 89.0 355.0 89.0 355.0 \n", " 356.0 89.0 356.0 \n", " 357.0 89.0 357.0 \n", " 358.0 89.0 358.0 \n", " 359.0 89.0 359.0 \n", "\n", "[64800 rows x 3 columns]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid_df= gp.GeoDataFrame(\n", " data={\"geometry\": boxes.values, \"latitude\": boxes.latitude, \"longitude\": boxes.longitude},\n", " index=boxes.indexes[\"point\"],\n", " crs=crs_orig\n", ")\n", "grid_df" ] }, { "cell_type": "code", "execution_count": 16, "id": "faee6daf-af9d-454e-a790-24c81be5594c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\n", "Name: WGS 84\n", "Axis Info [ellipsoidal]:\n", "- Lat[north]: Geodetic latitude (degree)\n", "- Lon[east]: Geodetic longitude (degree)\n", "Area of Use:\n", "- name: World.\n", "- bounds: (-180.0, -90.0, 180.0, 90.0)\n", "Datum: World Geodetic System 1984 ensemble\n", "- Ellipsoid: WGS 84\n", "- Prime Meridian: Greenwich" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid_df.crs" ] }, { "cell_type": "markdown", "id": "fa070f5d-2c7b-4992-8f06-1e9d9dd42d7a", "metadata": {}, "source": [ "Now we transform to the area-preserving CRS." ] }, { "cell_type": "code", "execution_count": 17, "id": "9cc4e37f-3c55-41aa-aecf-f5bc39fb1d2a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\n", "Name: Sphere_Cylindrical_Equal_Area\n", "Axis Info [cartesian]:\n", "- E[east]: Easting (metre)\n", "- N[north]: Northing (metre)\n", "Area of Use:\n", "- name: World.\n", "- bounds: (-180.0, -90.0, 180.0, 90.0)\n", "Coordinate Operation:\n", "- name: Sphere_Cylindrical_Equal_Area\n", "- method: Lambert Cylindrical Equal Area (Spherical)\n", "Datum: Not specified (based on Authalic Sphere)\n", "- Ellipsoid: Sphere\n", "- Prime Meridian: Greenwich" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid_df = grid_df.to_crs(crs)\n", "grid_df.crs" ] }, { "cell_type": "markdown", "id": "cf2f4110-c459-4bbf-86f3-616c2fa7bb86", "metadata": {}, "source": [ "Plotting just shows the glob completely covered by grid boxes." ] }, { "cell_type": "code", "execution_count": 18, "id": "2707e5a3-4b00-4c48-b743-5ecdf0e5e784", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "grid_df.geometry.plot()" ] }, { "cell_type": "markdown", "id": "5b5512d1-2e8d-4dd3-89f7-32bffdd0a25f", "metadata": {}, "source": [ "The total area matches the expected area of the globe." ] }, { "cell_type": "code", "execution_count": 19, "id": "cf49e53e-0924-453c-92cb-9f5b12858375", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "510064471909788.25" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid_df.geometry.area.sum()" ] }, { "cell_type": "markdown", "id": "60a46779-1b8e-4ca0-a17f-7e51831d562a", "metadata": {}, "source": [ "## Key Step: Overlay the two geometries\n", "\n", "This is the magic of geopandas; it can calculate the overlap between the original grid and the regions.\n", "It is expensive because it has to compare 64800 grid boxes with 242 regions. \n", "\n", "In this dataframe, the `latitude` and `longitude` values are from the grid, while all the other columns are from the regions." ] }, { "cell_type": "code", "execution_count": 20, "id": "e8dc00dc-63d7-4561-a113-a04732f8554b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 13.4 s, sys: 72.7 ms, total: 13.5 s\n", "Wall time: 13.5 s\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/srv/conda/envs/notebook/lib/python3.9/site-packages/geopandas/geodataframe.py:2196: UserWarning: `keep_geom_type=True` in overlay resulted in 1 dropped geometries of different geometry types than df1 has. Set `keep_geom_type=False` to retain all geometries\n", " return geopandas.overlay(\n" ] }, { "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", "
latitudelongitudefeatureclascalerankLABELRANKSOVEREIGNTSOV_A3ADM0_DIFLEVELTYPE...FCLASS_TRFCLASS_IDFCLASS_PLFCLASS_GRFCLASS_ITFCLASS_NLFCLASS_SEFCLASS_BDFCLASS_UAgeometry
0-90.00.0Admin-0 country34AntarcticaATA02Indeterminate...NoneNoneNoneNoneNoneNoneNoneNoneNonePOLYGON ((0.000 -6370029.666, 111194.927 -6370...
1-90.01.0Admin-0 country34AntarcticaATA02Indeterminate...NoneNoneNoneNoneNoneNoneNoneNoneNonePOLYGON ((111194.927 -6370029.666, 222389.853 ...
2-90.02.0Admin-0 country34AntarcticaATA02Indeterminate...NoneNoneNoneNoneNoneNoneNoneNoneNonePOLYGON ((222389.853 -6370029.666, 333584.780 ...
3-90.03.0Admin-0 country34AntarcticaATA02Indeterminate...NoneNoneNoneNoneNoneNoneNoneNoneNonePOLYGON ((333584.780 -6370029.666, 444779.707 ...
4-90.04.0Admin-0 country34AntarcticaATA02Indeterminate...NoneNoneNoneNoneNoneNoneNoneNoneNonePOLYGON ((444779.707 -6370029.666, 555974.633 ...
..................................................................
2763466.0341.0Admin-0 country13IcelandISL02Sovereign country...NoneNoneNoneNoneNoneNoneNoneNoneNoneMULTIPOLYGON (((-2001508.680 5820198.111, -202...
2763566.0342.0Admin-0 country13IcelandISL02Sovereign country...NoneNoneNoneNoneNoneNoneNoneNoneNoneMULTIPOLYGON (((-1890313.753 5820198.111, -194...
2763666.0343.0Admin-0 country13IcelandISL02Sovereign country...NoneNoneNoneNoneNoneNoneNoneNoneNonePOLYGON ((-1890313.753 5828182.772, -1886925.7...
2763766.0344.0Admin-0 country13IcelandISL02Sovereign country...NoneNoneNoneNoneNoneNoneNoneNoneNonePOLYGON ((-1779118.826 5843385.413, -1777495.4...
2763866.0345.0Admin-0 country13IcelandISL02Sovereign country...NoneNoneNoneNoneNoneNoneNoneNoneNoneMULTIPOLYGON (((-1667923.900 5835808.462, -166...
\n", "

27639 rows × 171 columns

\n", "
" ], "text/plain": [ " latitude longitude featurecla scalerank LABELRANK SOVEREIGNT \\\n", "0 -90.0 0.0 Admin-0 country 3 4 Antarctica \n", "1 -90.0 1.0 Admin-0 country 3 4 Antarctica \n", "2 -90.0 2.0 Admin-0 country 3 4 Antarctica \n", "3 -90.0 3.0 Admin-0 country 3 4 Antarctica \n", "4 -90.0 4.0 Admin-0 country 3 4 Antarctica \n", "... ... ... ... ... ... ... \n", "27634 66.0 341.0 Admin-0 country 1 3 Iceland \n", "27635 66.0 342.0 Admin-0 country 1 3 Iceland \n", "27636 66.0 343.0 Admin-0 country 1 3 Iceland \n", "27637 66.0 344.0 Admin-0 country 1 3 Iceland \n", "27638 66.0 345.0 Admin-0 country 1 3 Iceland \n", "\n", " SOV_A3 ADM0_DIF LEVEL TYPE ... FCLASS_TR FCLASS_ID \\\n", "0 ATA 0 2 Indeterminate ... None None \n", "1 ATA 0 2 Indeterminate ... None None \n", "2 ATA 0 2 Indeterminate ... None None \n", "3 ATA 0 2 Indeterminate ... None None \n", "4 ATA 0 2 Indeterminate ... None None \n", "... ... ... ... ... ... ... ... \n", "27634 ISL 0 2 Sovereign country ... None None \n", "27635 ISL 0 2 Sovereign country ... None None \n", "27636 ISL 0 2 Sovereign country ... None None \n", "27637 ISL 0 2 Sovereign country ... None None \n", "27638 ISL 0 2 Sovereign country ... None None \n", "\n", " FCLASS_PL FCLASS_GR FCLASS_IT FCLASS_NL FCLASS_SE FCLASS_BD FCLASS_UA \\\n", "0 None None None None None None None \n", "1 None None None None None None None \n", "2 None None None None None None None \n", "3 None None None None None None None \n", "4 None None None None None None None \n", "... ... ... ... ... ... ... ... \n", "27634 None None None None None None None \n", "27635 None None None None None None None \n", "27636 None None None None None None None \n", "27637 None None None None None None None \n", "27638 None None None None None None None \n", "\n", " geometry \n", "0 POLYGON ((0.000 -6370029.666, 111194.927 -6370... \n", "1 POLYGON ((111194.927 -6370029.666, 222389.853 ... \n", "2 POLYGON ((222389.853 -6370029.666, 333584.780 ... \n", "3 POLYGON ((333584.780 -6370029.666, 444779.707 ... \n", "4 POLYGON ((444779.707 -6370029.666, 555974.633 ... \n", "... ... \n", "27634 MULTIPOLYGON (((-2001508.680 5820198.111, -202... \n", "27635 MULTIPOLYGON (((-1890313.753 5820198.111, -194... \n", "27636 POLYGON ((-1890313.753 5828182.772, -1886925.7... \n", "27637 POLYGON ((-1779118.826 5843385.413, -1777495.4... \n", "27638 MULTIPOLYGON (((-1667923.900 5835808.462, -166... \n", "\n", "[27639 rows x 171 columns]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%time overlay = grid_df.overlay(regions_df)\n", "overlay" ] }, { "cell_type": "markdown", "id": "f1a5624f-7c5b-41e6-875c-72c188aef887", "metadata": {}, "source": [ "This is essentially already a sparse matrix mapping one grid space to the other. How sparse?" ] }, { "cell_type": "code", "execution_count": 21, "id": "a0e3f3b0-1e72-4392-980b-5af7f2a4c72d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0017625114784205692" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sparsity = len(overlay) / (len(grid_df) * len(regions_df))\n", "sparsity" ] }, { "cell_type": "markdown", "id": "419302f4-45c3-449e-a42f-cea3e414fd4b", "metadata": {}, "source": [ "Let's explore these overlays a little bit" ] }, { "cell_type": "code", "execution_count": 22, "id": "db635849-5077-457f-b8f2-7b1e49391154", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "overlay[overlay.SOVEREIGNT == \"Italy\"].geometry.plot(edgecolor='k')" ] }, { "cell_type": "markdown", "id": "a9ebd8f0-3412-41c4-91e5-fad112aae01b", "metadata": {}, "source": [ "As we can see, filtering by country shows each of the grid boxes, partioned exactly on top of the country geometry.\n", "Plotting them all gives us back all the land." ] }, { "cell_type": "code", "execution_count": 23, "id": "6ff47662-78a7-4e0a-9f8c-425db73f1a23", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "overlay.plot()" ] }, { "cell_type": "markdown", "id": "6e11210f-81ee-4b46-a139-940000894fde", "metadata": {}, "source": [ "We can verify that each country's area is preserved in the overlay operation." ] }, { "cell_type": "code", "execution_count": 24, "id": "0a823e44-46e6-4d25-8f52-c7b7f2ec01a2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "SOVEREIGNT\n", "Russia 1.687963e+13\n", "Antarctica 1.225664e+13\n", "Canada 9.872058e+12\n", "United States of America 9.449645e+12\n", "China 9.372241e+12\n", "Brazil 8.499337e+12\n", "Australia 7.706575e+12\n", "India 3.155821e+12\n", "Argentina 2.782670e+12\n", "Kazakhstan 2.712770e+12\n", "dtype: float64" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "overlay.geometry.area.groupby(overlay.SOVEREIGNT).sum().nlargest(10)" ] }, { "cell_type": "code", "execution_count": 25, "id": "0b15ff6e-d27a-41fe-9edc-d42f6d410b55", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "SOVEREIGNT\n", "Russia 1.687963e+13\n", "Antarctica 1.225664e+13\n", "Canada 9.872058e+12\n", "United States of America 9.449645e+12\n", "China 9.372241e+12\n", "Brazil 8.499337e+12\n", "Australia 7.706575e+12\n", "India 3.155821e+12\n", "Argentina 2.782670e+12\n", "Kazakhstan 2.712770e+12\n", "dtype: float64" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regions_df.geometry.area.groupby(regions_df.SOVEREIGNT).sum().nlargest(10)" ] }, { "cell_type": "markdown", "id": "006ee3e3-2f06-4fb0-807a-01f3ddc459ff", "metadata": {}, "source": [ "## Calculate the area fraction for each region\n", "\n", "This is another key step. This transform tells us _how much of a country's total area comes from each of the grid cells._\n", "This is accurate because we used an area-preserving CRS." ] }, { "cell_type": "code", "execution_count": 26, "id": "288707a4-68a2-4b64-939c-4ba8faad87de", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 0.000009\n", "1 0.000009\n", "2 0.000009\n", "3 0.000009\n", "4 0.000009\n", " ... \n", "27634 0.005459\n", "27635 0.004817\n", "27636 0.016131\n", "27637 0.015022\n", "27638 0.001937\n", "Length: 27639, dtype: float64" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid_cell_fraction = overlay.geometry.area.groupby(overlay.SOVEREIGNT).transform(lambda x: x / x.sum())\n", "grid_cell_fraction" ] }, { "cell_type": "markdown", "id": "fe11503a-73e7-4969-8dc8-f21426da7fc1", "metadata": {}, "source": [ "We can verify that these all sum up to one." ] }, { "cell_type": "code", "execution_count": 27, "id": "e0e26cca-183b-4208-a698-135994250aba", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "SOVEREIGNT\n", "Afghanistan 1.0\n", "Albania 1.0\n", "Algeria 1.0\n", "Andorra 1.0\n", "Angola 1.0\n", " ... \n", "Western Sahara 1.0\n", "Yemen 1.0\n", "Zambia 1.0\n", "Zimbabwe 1.0\n", "eSwatini 1.0\n", "Length: 201, dtype: float64" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "grid_cell_fraction.groupby(overlay.SOVEREIGNT).sum()" ] }, { "cell_type": "markdown", "id": "8c761e17-d9b6-4374-ae77-c53c690701a0", "metadata": {}, "source": [ "## Turn this into a sparse Xarray DataArray\n", "\n", "The first step is making a MultIndex" ] }, { "cell_type": "code", "execution_count": 28, "id": "834ad60b-db35-4b56-95d8-d385386e9817", "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", "
weights
latitudelongitudeSOVEREIGNT
-90.00.0Antarctica0.000009
1.0Antarctica0.000009
2.0Antarctica0.000009
3.0Antarctica0.000009
4.0Antarctica0.000009
............
66.0341.0Iceland0.005459
342.0Iceland0.004817
343.0Iceland0.016131
344.0Iceland0.015022
345.0Iceland0.001937
\n", "

27639 rows × 1 columns

\n", "
" ], "text/plain": [ " weights\n", "latitude longitude SOVEREIGNT \n", "-90.0 0.0 Antarctica 0.000009\n", " 1.0 Antarctica 0.000009\n", " 2.0 Antarctica 0.000009\n", " 3.0 Antarctica 0.000009\n", " 4.0 Antarctica 0.000009\n", "... ...\n", " 66.0 341.0 Iceland 0.005459\n", " 342.0 Iceland 0.004817\n", " 343.0 Iceland 0.016131\n", " 344.0 Iceland 0.015022\n", " 345.0 Iceland 0.001937\n", "\n", "[27639 rows x 1 columns]" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "multi_index = overlay.set_index([\"latitude\", \"longitude\", \"SOVEREIGNT\"]).index\n", "df_weights = pd.DataFrame({\"weights\": grid_cell_fraction.values}, index=multi_index)\n", "df_weights" ] }, { "cell_type": "markdown", "id": "8a005718-1ac8-48ff-b109-f13b5dd92f40", "metadata": {}, "source": [ "We can bring this directly into xarray as a 1D Dataset." ] }, { "cell_type": "code", "execution_count": 29, "id": "88c2720d-b49a-4f6e-b181-14dfe1503fb5", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset>\n",
       "Dimensions:     (dim_0: 27639)\n",
       "Coordinates:\n",
       "  * dim_0       (dim_0) MultiIndex\n",
       "  - latitude    (dim_0) float64 -90.0 -90.0 -90.0 -90.0 ... 66.0 66.0 66.0 66.0\n",
       "  - longitude   (dim_0) float64 0.0 1.0 2.0 3.0 4.0 ... 342.0 343.0 344.0 345.0\n",
       "  - SOVEREIGNT  (dim_0) object 'Antarctica' 'Antarctica' ... 'Iceland' 'Iceland'\n",
       "Data variables:\n",
       "    weights     (dim_0) float64 8.803e-06 8.803e-06 ... 0.01502 0.001937
" ], "text/plain": [ "\n", "Dimensions: (dim_0: 27639)\n", "Coordinates:\n", " * dim_0 (dim_0) MultiIndex\n", " - latitude (dim_0) float64 -90.0 -90.0 -90.0 -90.0 ... 66.0 66.0 66.0 66.0\n", " - longitude (dim_0) float64 0.0 1.0 2.0 3.0 4.0 ... 342.0 343.0 344.0 345.0\n", " - SOVEREIGNT (dim_0) object 'Antarctica' 'Antarctica' ... 'Iceland' 'Iceland'\n", "Data variables:\n", " weights (dim_0) float64 8.803e-06 8.803e-06 ... 0.01502 0.001937" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import xarray as xr\n", "ds_weights = xr.Dataset(df_weights)\n", "ds_weights" ] }, { "cell_type": "markdown", "id": "8b834cd0-3844-4556-b548-9824d21c06af", "metadata": {}, "source": [ "Now we unstack it into a sparse array." ] }, { "cell_type": "code", "execution_count": 30, "id": "77a0714d-94cd-40d6-8111-92571b98fa3d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray 'weights' (latitude: 171, longitude: 360, SOVEREIGNT: 201)>\n",
       "<COO: shape=(171, 360, 201), dtype=float64, nnz=27627, fill_value=0.0>\n",
       "Coordinates:\n",
       "  * latitude    (latitude) float64 -90.0 -89.0 -88.0 -87.0 ... 81.0 82.0 83.0\n",
       "  * longitude   (longitude) float64 0.0 1.0 2.0 3.0 ... 356.0 357.0 358.0 359.0\n",
       "  * SOVEREIGNT  (SOVEREIGNT) object 'Afghanistan' 'Albania' ... 'eSwatini'
" ], "text/plain": [ "\n", "\n", "Coordinates:\n", " * latitude (latitude) float64 -90.0 -89.0 -88.0 -87.0 ... 81.0 82.0 83.0\n", " * longitude (longitude) float64 0.0 1.0 2.0 3.0 ... 356.0 357.0 358.0 359.0\n", " * SOVEREIGNT (SOVEREIGNT) object 'Afghanistan' 'Albania' ... 'eSwatini'" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "weights_sparse = ds_weights.unstack(sparse=True, fill_value=0.).weights\n", "weights_sparse" ] }, { "cell_type": "markdown", "id": "385348ce-7e05-414c-a2a5-fcd00efdc844", "metadata": {}, "source": [ "Here we can clearly see that this is a sparse matrix, mapping the input space (lat, lon) to the output space (SOVEREIGNT)." ] }, { "cell_type": "markdown", "id": "5f94d0f1-a29b-4fcb-b668-03702dfcdb3b", "metadata": {}, "source": [ "## Perform Matrix Multiplication\n", "\n", "To regrid the data, we just have to multiply the original precip dataset by this matrix.\n", "There are many different ways to do this.\n", "The simplest one would just be:" ] }, { "cell_type": "code", "execution_count": 31, "id": "ed039339-a8fd-4a30-a64e-15e03489e1f4", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/srv/conda/envs/notebook/lib/python3.9/site-packages/xarray/core/indexing.py:1228: PerformanceWarning: Slicing is producing a large chunk. To accept the large\n", "chunk and silence this warning, set the option\n", " >>> with dask.config.set(**{'array.slicing.split_large_chunks': False}):\n", " ... array[indexer]\n", "\n", "To avoid creating the large chunks, set the option\n", " >>> with dask.config.set(**{'array.slicing.split_large_chunks': True}):\n", " ... array[indexer]\n", " return self.array[key]\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (time: 9226, SOVEREIGNT: 201)>\n",
       "dask.array<sum-aggregate, shape=(9226, 201), dtype=float64, chunksize=(200, 201), chunktype=numpy.ndarray>\n",
       "Coordinates:\n",
       "  * time        (time) datetime64[ns] 1996-10-01 1996-10-02 ... 2021-12-31\n",
       "  * SOVEREIGNT  (SOVEREIGNT) object 'Afghanistan' 'Albania' ... 'eSwatini'
" ], "text/plain": [ "\n", "dask.array\n", "Coordinates:\n", " * time (time) datetime64[ns] 1996-10-01 1996-10-02 ... 2021-12-31\n", " * SOVEREIGNT (SOVEREIGNT) object 'Afghanistan' 'Albania' ... 'eSwatini'" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "regridded = xr.dot(ds.precip, weights_sparse)\n", "regridded" ] }, { "cell_type": "markdown", "id": "0e6e3db9-63c1-4993-95fd-751b40603579", "metadata": {}, "source": [ "Unfortunately, that doesn't work out of the box, because sparse doesn't implement einsum (see https://github.com/pydata/sparse/issues/31)." ] }, { "cell_type": "code", "execution_count": 32, "id": "3e070818-6815-45f2-be58-a671645449f5", "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "no implementation found for 'numpy.einsum' on types that implement __array_function__: [, ]", "output_type": "error", "traceback": [ "\u001b[0;31mTypeError\u001b[0m\u001b[0;31m:\u001b[0m no implementation found for 'numpy.einsum' on types that implement __array_function__: [, ]\n" ] } ], "source": [ "regridded[0].compute()" ] }, { "cell_type": "markdown", "id": "206b7675-edef-496b-a028-3b88fba0159e", "metadata": {}, "source": [ "There are many ways to work around this, starting from just using a dense matrix instead.\n", "Below is the fastest thing I came up with after some extensive experimentation.\n", "\n", "Sparse does implement matmul, so we can use that. But we have to do some reshaping to make it work with our data." ] }, { "cell_type": "code", "execution_count": 33, "id": "38302721-76e4-4ba1-9fef-0b16dba330ae", "metadata": {}, "outputs": [], "source": [ "def apply_weights_matmul_sparse(weights, data):\n", "\n", " assert isinstance(weights, sparse.SparseArray)\n", " assert isinstance(data, np.ndarray)\n", " data = sparse.COO.from_numpy(data)\n", " data_shape = data.shape\n", " # k = nlat * nlon\n", " n, k = data_shape[0], data_shape[1] * data_shape[2]\n", " data = data.reshape((n, k))\n", " weights_shape = weights.shape\n", " k_, m = weights_shape[0] * weights_shape[1], weights_shape[2]\n", " assert k == k_\n", " weights_data = weights.reshape((k, m))\n", "\n", " regridded = sparse.matmul(data, weights_data)\n", " assert regridded.shape == (n, m)\n", " return regridded.todense()" ] }, { "cell_type": "markdown", "id": "55616b1a-a842-4361-8dbb-bdf360d99591", "metadata": {}, "source": [ "Before applying this to the data, let's load it into memory and then chunk it again.\n", "This is not necessary (we could just stream the data from the cloud), but it is a cleaner benchmark.\n", "Chunking again allows us to leverage dask parallelism. We also eliminate some know corrupted values via a mask." ] }, { "cell_type": "code", "execution_count": 34, "id": "5e324401-4d90-42e3-ab15-c87288911e24", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray 'precip' (time: 9226, latitude: 180, longitude: 360)>\n",
       "dask.array<xarray-<this-array>, shape=(9226, 180, 360), dtype=float32, chunksize=(38, 180, 360), chunktype=numpy.ndarray>\n",
       "Coordinates:\n",
       "  * latitude   (latitude) float32 -90.0 -89.0 -88.0 -87.0 ... 87.0 88.0 89.0\n",
       "  * longitude  (longitude) float32 0.0 1.0 2.0 3.0 ... 356.0 357.0 358.0 359.0\n",
       "  * time       (time) datetime64[ns] 1996-10-01 1996-10-02 ... 2021-12-31\n",
       "Attributes:\n",
       "    cell_methods:   area: mean time: mean\n",
       "    long_name:      NOAA Climate Data Record (CDR) of Daily GPCP Satellite-Ga...\n",
       "    standard_name:  lwe_precipitation_rate\n",
       "    units:          mm/day\n",
       "    valid_range:    [0.0, 100.0]
" ], "text/plain": [ "\n", "dask.array, shape=(9226, 180, 360), dtype=float32, chunksize=(38, 180, 360), chunktype=numpy.ndarray>\n", "Coordinates:\n", " * latitude (latitude) float32 -90.0 -89.0 -88.0 -87.0 ... 87.0 88.0 89.0\n", " * longitude (longitude) float32 0.0 1.0 2.0 3.0 ... 356.0 357.0 358.0 359.0\n", " * time (time) datetime64[ns] 1996-10-01 1996-10-02 ... 2021-12-31\n", "Attributes:\n", " cell_methods: area: mean time: mean\n", " long_name: NOAA Climate Data Record (CDR) of Daily GPCP Satellite-Ga...\n", " standard_name: lwe_precipitation_rate\n", " units: mm/day\n", " valid_range: [0.0, 100.0]" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mask = (ds.precip >= 0) & (ds.precip < 3000)\n", "precip = ds.precip.where(mask)\n", "precip_in_mem = precip.compute().chunk({\"time\": \"10MB\"})\n", "precip_in_mem" ] }, { "cell_type": "code", "execution_count": 35, "id": "40d2f99c-80d0-414f-b624-6b418e17e202", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/ipykernel_1777/4033782278.py:1: FutureWarning: ``meta`` should be given in the ``dask_gufunc_kwargs`` parameter. It will be removed as direct parameter in a future version.\n", " precip_regridded = xr.apply_ufunc(\n", "/srv/conda/envs/notebook/lib/python3.9/site-packages/xarray/core/indexing.py:1228: PerformanceWarning: Slicing is producing a large chunk. To accept the large\n", "chunk and silence this warning, set the option\n", " >>> with dask.config.set(**{'array.slicing.split_large_chunks': False}):\n", " ... array[indexer]\n", "\n", "To avoid creating the large chunks, set the option\n", " >>> with dask.config.set(**{'array.slicing.split_large_chunks': True}):\n", " ... array[indexer]\n", " return self.array[key]\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (time: 9226, SOVEREIGNT: 201)>\n",
       "dask.array<transpose, shape=(9226, 201), dtype=float64, chunksize=(38, 201), chunktype=numpy.ndarray>\n",
       "Coordinates:\n",
       "  * SOVEREIGNT  (SOVEREIGNT) object 'Afghanistan' 'Albania' ... 'eSwatini'\n",
       "  * time        (time) datetime64[ns] 1996-10-01 1996-10-02 ... 2021-12-31
" ], "text/plain": [ "\n", "dask.array\n", "Coordinates:\n", " * SOVEREIGNT (SOVEREIGNT) object 'Afghanistan' 'Albania' ... 'eSwatini'\n", " * time (time) datetime64[ns] 1996-10-01 1996-10-02 ... 2021-12-31" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "precip_regridded = xr.apply_ufunc(\n", " apply_weights_matmul_sparse,\n", " weights_sparse,\n", " precip_in_mem,\n", " join=\"left\",\n", " input_core_dims=[[\"latitude\", \"longitude\", \"SOVEREIGNT\"], [\"latitude\", \"longitude\"]],\n", " output_core_dims=[[\"SOVEREIGNT\"]],\n", " dask=\"parallelized\",\n", " meta=[np.ndarray((0,))]\n", ")\n", "precip_regridded" ] }, { "cell_type": "markdown", "id": "728b8fbb-0b74-4ec7-bb0a-26cf9a325d8d", "metadata": {}, "source": [ "Finally, we compute it!" ] }, { "cell_type": "code", "execution_count": 36, "id": "3eda2269-f2f3-48dd-8a19-f42956c8fce0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ ] | 2% Completed | 1.4s" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/srv/conda/envs/notebook/lib/python3.9/site-packages/sparse/_common.py:232: RuntimeWarning: Nan will not be propagated in matrix multiplication\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[### ] | 8% Completed | 3.1s" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/srv/conda/envs/notebook/lib/python3.9/site-packages/sparse/_common.py:232: RuntimeWarning: Nan will not be propagated in matrix multiplication\n", " warnings.warn(\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[########################################] | 100% Completed | 8.5s\n" ] } ], "source": [ "from dask.diagnostics import ProgressBar\n", "\n", "with ProgressBar():\n", " precip_regridded.load()" ] }, { "cell_type": "markdown", "id": "ade5c8b5-bf48-4465-9d17-a5c86bc082fa", "metadata": {}, "source": [ "With this approach, it look us 6s to regrid the entire dataset (9226) timesteps!\n", "\n", "We can now explore the data by region." ] }, { "cell_type": "code", "execution_count": 37, "id": "7b7d2bcd-c7ae-4f9b-a731-2be08e08c1fa", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "precip_regridded.sel(SOVEREIGNT=\"Italy\").resample(time=\"MS\").mean().plot()" ] }, { "cell_type": "code", "execution_count": null, "id": "7719b9a9-0331-4290-aefa-1caec19436b9", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.13" } }, "nbformat": 4, "nbformat_minor": 5 }