{ "cells": [ { "cell_type": "markdown", "id": "95b55d06-3772-4f2c-bbe3-49278d74ce66", "metadata": { "tags": [] }, "source": [ "# Demo of data cube functionalities: Ozone hole size computation\n", "Here we demonstrate how to analyse the ozone hole area as a function of time on the basis of Sentinel 5P/TROPOMI-observations using EOC data cube functionalities. " ] }, { "cell_type": "markdown", "id": "bfcc83d2-dd7d-4b8b-b5cf-262991f6c8b6", "metadata": { "jp-MarkdownHeadingCollapsed": true, "tags": [] }, "source": [ "## Do some preparation (only need to be done once for each environment)." ] }, { "cell_type": "code", "execution_count": 12, "id": "665851e2-98aa-42e4-9aa6-e0b19deb152d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: pystac_client in ./py-env-inpuls/lib/python3.8/site-packages (0.7.5)\n", "Requirement already satisfied: pystac[validation]>=1.8.2 in ./py-env-inpuls/lib/python3.8/site-packages (from pystac_client) (1.8.4)\n", "Requirement already satisfied: requests>=2.28.2 in ./py-env-inpuls/lib/python3.8/site-packages (from pystac_client) (2.31.0)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in ./py-env-inpuls/lib/python3.8/site-packages (from pystac_client) (2.8.2)\n", "Requirement already satisfied: importlib-resources>=5.12.0; python_version < \"3.9\" in ./py-env-inpuls/lib/python3.8/site-packages (from pystac[validation]>=1.8.2->pystac_client) (6.1.0)\n", "Requirement already satisfied: jsonschema~=4.18; extra == \"validation\" in ./py-env-inpuls/lib/python3.8/site-packages (from pystac[validation]>=1.8.2->pystac_client) (4.19.1)\n", "Requirement already satisfied: idna<4,>=2.5 in ./py-env-inpuls/lib/python3.8/site-packages (from requests>=2.28.2->pystac_client) (3.4)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in ./py-env-inpuls/lib/python3.8/site-packages (from requests>=2.28.2->pystac_client) (2.0.6)\n", "Requirement already satisfied: certifi>=2017.4.17 in ./py-env-inpuls/lib/python3.8/site-packages (from requests>=2.28.2->pystac_client) (2023.7.22)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in ./py-env-inpuls/lib/python3.8/site-packages (from requests>=2.28.2->pystac_client) (3.3.0)\n", "Requirement already satisfied: six>=1.5 in ./py-env-inpuls/lib/python3.8/site-packages (from python-dateutil>=2.8.2->pystac_client) (1.16.0)\n", "Requirement already satisfied: zipp>=3.1.0; python_version < \"3.10\" in ./py-env-inpuls/lib/python3.8/site-packages (from importlib-resources>=5.12.0; python_version < \"3.9\"->pystac[validation]>=1.8.2->pystac_client) (3.17.0)\n", "Requirement already satisfied: referencing>=0.28.4 in ./py-env-inpuls/lib/python3.8/site-packages (from jsonschema~=4.18; extra == \"validation\"->pystac[validation]>=1.8.2->pystac_client) (0.30.2)\n", "Requirement already satisfied: pkgutil-resolve-name>=1.3.10; python_version < \"3.9\" in ./py-env-inpuls/lib/python3.8/site-packages (from jsonschema~=4.18; extra == \"validation\"->pystac[validation]>=1.8.2->pystac_client) (1.3.10)\n", "Requirement already satisfied: jsonschema-specifications>=2023.03.6 in ./py-env-inpuls/lib/python3.8/site-packages (from jsonschema~=4.18; extra == \"validation\"->pystac[validation]>=1.8.2->pystac_client) (2023.7.1)\n", "Requirement already satisfied: rpds-py>=0.7.1 in ./py-env-inpuls/lib/python3.8/site-packages (from jsonschema~=4.18; extra == \"validation\"->pystac[validation]>=1.8.2->pystac_client) (0.10.4)\n", "Requirement already satisfied: attrs>=22.2.0 in ./py-env-inpuls/lib/python3.8/site-packages (from jsonschema~=4.18; extra == \"validation\"->pystac[validation]>=1.8.2->pystac_client) (23.1.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "pip install pystac_client" ] }, { "cell_type": "code", "execution_count": 10, "id": "68bb76e0-df73-4ccc-9aff-0652f75dafe1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting odc.stac\n", " Downloading odc_stac-0.3.6-py3-none-any.whl (56 kB)\n", "\u001b[K |████████████████████████████████| 56 kB 1.6 MB/s eta 0:00:011\n", "\u001b[?25hCollecting dask[array]\n", " Downloading dask-2023.5.0-py3-none-any.whl (1.2 MB)\n", "\u001b[K |████████████████████████████████| 1.2 MB 6.1 MB/s eta 0:00:01\n", "\u001b[?25hRequirement already satisfied: pystac<2,>=1.0.0 in ./py-env-inpuls/lib/python3.8/site-packages (from odc.stac) (1.8.4)\n", "Collecting toolz\n", " Using cached toolz-0.12.0-py3-none-any.whl (55 kB)\n", "Collecting rasterio!=1.3.0,!=1.3.1,>=1.0.0\n", " Downloading rasterio-1.3.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (21.3 MB)\n", "\u001b[K |████████████████████████████████| 21.3 MB 83.5 MB/s eta 0:00:01\n", "\u001b[?25hCollecting pandas\n", " Using cached pandas-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.4 MB)\n", "Collecting xarray>=0.19\n", " Using cached xarray-2023.1.0-py3-none-any.whl (973 kB)\n", "Collecting affine\n", " Using cached affine-2.4.0-py3-none-any.whl (15 kB)\n", "Collecting numpy>=1.20.0\n", " Downloading numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (17.3 MB)\n", "\u001b[K |████████████████████████████████| 17.3 MB 87.9 MB/s eta 0:00:01\n", "\u001b[?25hCollecting odc-geo>=0.3.0\n", " Downloading odc_geo-0.4.1-py3-none-any.whl (122 kB)\n", "\u001b[K |████████████████████████████████| 122 kB 94.0 MB/s eta 0:00:01\n", "\u001b[?25hCollecting pyyaml>=5.3.1\n", " Downloading PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (736 kB)\n", "\u001b[K |████████████████████████████████| 736 kB 65.5 MB/s eta 0:00:01\n", "\u001b[?25hCollecting partd>=1.2.0\n", " Downloading partd-1.4.1-py3-none-any.whl (18 kB)\n", "Collecting click>=8.0\n", " Downloading click-8.1.7-py3-none-any.whl (97 kB)\n", "\u001b[K |████████████████████████████████| 97 kB 30.7 MB/s eta 0:00:01\n", "\u001b[?25hRequirement already satisfied: packaging>=20.0 in ./py-env-inpuls/lib/python3.8/site-packages (from dask[array]->odc.stac) (23.2)\n", "Collecting cloudpickle>=1.5.0\n", " Using cached cloudpickle-2.2.1-py3-none-any.whl (25 kB)\n", "Requirement already satisfied: importlib-metadata>=4.13.0 in ./py-env-inpuls/lib/python3.8/site-packages (from dask[array]->odc.stac) (6.8.0)\n", "Collecting fsspec>=2021.09.0\n", " Downloading fsspec-2023.9.2-py3-none-any.whl (173 kB)\n", "\u001b[K |████████████████████████████████| 173 kB 97.2 MB/s eta 0:00:01\n", "\u001b[?25hRequirement already satisfied: python-dateutil>=2.7.0 in ./py-env-inpuls/lib/python3.8/site-packages (from pystac<2,>=1.0.0->odc.stac) (2.8.2)\n", "Requirement already satisfied: importlib-resources>=5.12.0; python_version < \"3.9\" in ./py-env-inpuls/lib/python3.8/site-packages (from pystac<2,>=1.0.0->odc.stac) (6.1.0)\n", "Requirement already satisfied: setuptools in ./py-env-inpuls/lib/python3.8/site-packages (from rasterio!=1.3.0,!=1.3.1,>=1.0.0->odc.stac) (44.0.0)\n", "Requirement already satisfied: certifi in ./py-env-inpuls/lib/python3.8/site-packages (from rasterio!=1.3.0,!=1.3.1,>=1.0.0->odc.stac) (2023.7.22)\n", "Requirement already satisfied: attrs in ./py-env-inpuls/lib/python3.8/site-packages (from rasterio!=1.3.0,!=1.3.1,>=1.0.0->odc.stac) (23.1.0)\n", "Collecting cligj>=0.5\n", " Using cached cligj-0.7.2-py3-none-any.whl (7.1 kB)\n", "Collecting snuggs>=1.4.1\n", " Using cached snuggs-1.4.7-py3-none-any.whl (5.4 kB)\n", "Collecting click-plugins\n", " Using cached click_plugins-1.1.1-py2.py3-none-any.whl (7.5 kB)\n", "Collecting pytz>=2020.1\n", " Downloading pytz-2023.3.post1-py2.py3-none-any.whl (502 kB)\n", "\u001b[K |████████████████████████████████| 502 kB 107.9 MB/s eta 0:00:01\n", "\u001b[?25hCollecting tzdata>=2022.1\n", " Using cached tzdata-2023.3-py2.py3-none-any.whl (341 kB)\n", "Collecting pyproj>=3.0.0\n", " Downloading pyproj-3.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB)\n", "\u001b[K |████████████████████████████████| 7.8 MB 116.5 MB/s eta 0:00:01\n", "\u001b[?25hCollecting cachetools\n", " Downloading cachetools-5.3.1-py3-none-any.whl (9.3 kB)\n", "Collecting shapely\n", " Downloading shapely-2.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.3 MB)\n", "\u001b[K |████████████████████████████████| 2.3 MB 151.8 MB/s eta 0:00:01\n", "\u001b[?25hCollecting locket\n", " Using cached locket-1.0.0-py2.py3-none-any.whl (4.4 kB)\n", "Requirement already satisfied: zipp>=0.5 in ./py-env-inpuls/lib/python3.8/site-packages (from importlib-metadata>=4.13.0->dask[array]->odc.stac) (3.17.0)\n", "Requirement already satisfied: six>=1.5 in ./py-env-inpuls/lib/python3.8/site-packages (from python-dateutil>=2.7.0->pystac<2,>=1.0.0->odc.stac) (1.16.0)\n", "Collecting pyparsing>=2.1.6\n", " Downloading pyparsing-3.1.1-py3-none-any.whl (103 kB)\n", "\u001b[K |████████████████████████████████| 103 kB 98.3 MB/s eta 0:00:01\n", "\u001b[?25hInstalling collected packages: pyyaml, toolz, locket, partd, click, cloudpickle, fsspec, numpy, dask, cligj, affine, pyparsing, snuggs, click-plugins, rasterio, pytz, tzdata, pandas, xarray, pyproj, cachetools, shapely, odc-geo, odc.stac\n", "Successfully installed affine-2.4.0 cachetools-5.3.1 click-8.1.7 click-plugins-1.1.1 cligj-0.7.2 cloudpickle-2.2.1 dask-2023.5.0 fsspec-2023.9.2 locket-1.0.0 numpy-1.24.4 odc-geo-0.4.1 odc.stac pandas-2.0.3 partd-1.4.1 pyparsing-3.1.1 pyproj-3.5.0 pytz-2023.3.post1 pyyaml-6.0.1 rasterio-1.3.8 shapely-2.0.1 snuggs-1.4.7 toolz-0.12.0 tzdata-2023.3 xarray-2023.1.0\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "pip install odc.stac" ] }, { "cell_type": "code", "execution_count": 11, "id": "c612ed95-b50e-4feb-bdce-ffac16049460", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: xarray in ./py-env-inpuls/lib/python3.8/site-packages (2023.1.0)\n", "Requirement already satisfied: numpy>=1.20 in ./py-env-inpuls/lib/python3.8/site-packages (from xarray) (1.24.4)\n", "Requirement already satisfied: pandas>=1.3 in ./py-env-inpuls/lib/python3.8/site-packages (from xarray) (2.0.3)\n", "Requirement already satisfied: packaging>=21.3 in ./py-env-inpuls/lib/python3.8/site-packages (from xarray) (23.2)\n", "Requirement already satisfied: pytz>=2020.1 in ./py-env-inpuls/lib/python3.8/site-packages (from pandas>=1.3->xarray) (2023.3.post1)\n", "Requirement already satisfied: tzdata>=2022.1 in ./py-env-inpuls/lib/python3.8/site-packages (from pandas>=1.3->xarray) (2023.3)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in ./py-env-inpuls/lib/python3.8/site-packages (from pandas>=1.3->xarray) (2.8.2)\n", "Requirement already satisfied: six>=1.5 in ./py-env-inpuls/lib/python3.8/site-packages (from python-dateutil>=2.8.2->pandas>=1.3->xarray) (1.16.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "pip install xarray" ] }, { "cell_type": "code", "execution_count": 14, "id": "0f7de7ae-f018-4fdb-a50f-532d5ff111d1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: numpy in ./py-env-inpuls/lib/python3.8/site-packages (1.24.4)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "pip install numpy" ] }, { "cell_type": "code", "execution_count": 14, "id": "23d6c418-97fb-456d-a57c-bcaea2f8d7f7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting matplotlib\n", " Downloading matplotlib-3.7.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (9.2 MB)\n", "\u001b[K |████████████████████████████████| 9.2 MB 3.4 MB/s eta 0:00:01\n", "\u001b[?25hCollecting fonttools>=4.22.0\n", " Downloading fonttools-4.43.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB)\n", "\u001b[K |████████████████████████████████| 4.6 MB 153.1 MB/s eta 0:00:01\n", "\u001b[?25hRequirement already satisfied: packaging>=20.0 in ./py-env-inpuls/lib/python3.8/site-packages (from matplotlib) (23.2)\n", "Collecting cycler>=0.10\n", " Downloading cycler-0.12.0-py3-none-any.whl (8.2 kB)\n", "Requirement already satisfied: python-dateutil>=2.7 in ./py-env-inpuls/lib/python3.8/site-packages (from matplotlib) (2.8.2)\n", "Collecting kiwisolver>=1.0.1\n", " Downloading kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl (1.2 MB)\n", "\u001b[K |████████████████████████████████| 1.2 MB 55.4 MB/s eta 0:00:01\n", "\u001b[?25hRequirement already satisfied: importlib-resources>=3.2.0; python_version < \"3.10\" in ./py-env-inpuls/lib/python3.8/site-packages (from matplotlib) (6.1.0)\n", "Requirement already satisfied: pyparsing>=2.3.1 in ./py-env-inpuls/lib/python3.8/site-packages (from matplotlib) (3.1.1)\n", "Requirement already satisfied: numpy<2,>=1.20 in ./py-env-inpuls/lib/python3.8/site-packages (from matplotlib) (1.24.4)\n", "Collecting pillow>=6.2.0\n", " Downloading Pillow-10.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.5 MB)\n", "\u001b[K |████████████████████████████████| 3.5 MB 85.0 MB/s eta 0:00:01\n", "\u001b[?25hCollecting contourpy>=1.0.1\n", " Downloading contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (301 kB)\n", "\u001b[K |████████████████████████████████| 301 kB 135.6 MB/s eta 0:00:01\n", "\u001b[?25hRequirement already satisfied: six>=1.5 in ./py-env-inpuls/lib/python3.8/site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n", "Requirement already satisfied: zipp>=3.1.0; python_version < \"3.10\" in ./py-env-inpuls/lib/python3.8/site-packages (from importlib-resources>=3.2.0; python_version < \"3.10\"->matplotlib) (3.17.0)\n", "Installing collected packages: fonttools, cycler, kiwisolver, pillow, contourpy, matplotlib\n", "Successfully installed contourpy-1.1.1 cycler-0.12.0 fonttools-4.43.0 kiwisolver-1.4.5 matplotlib-3.7.3 pillow-10.0.1\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "pip install matplotlib" ] }, { "cell_type": "markdown", "id": "7f402fff-3dd8-4bde-a31c-37cc7a58d208", "metadata": { "tags": [] }, "source": [ "## Let's start with some relevant settings\n", "
<xarray.Dataset>\n", "Dimensions: (latitude: 667, longitude: 4000, time: 65)\n", "Coordinates:\n", " * latitude (latitude) float64 -30.02 -30.11 -30.2 ... -89.78 -89.86 -89.95\n", " * longitude (longitude) float64 -180.0 -179.9 -179.8 ... 179.8 179.9 180.0\n", " spatial_ref int32 4326\n", " * time (time) datetime64[ns] 2023-08-01 2023-08-02 ... 2023-10-04\n", "Data variables:\n", " o3 (time, latitude, longitude) float32 9.969e+36 ... 124.3
<xarray.DataArray (latitude: 667, longitude: 4000)>\n", "array([[8.67688927e+01, 8.67688927e+01, 8.67688927e+01, ...,\n", " 8.67688927e+01, 8.67688927e+01, 8.67688927e+01],\n", " [8.66900474e+01, 8.66900474e+01, 8.66900474e+01, ...,\n", " 8.66900474e+01, 8.66900474e+01, 8.66900474e+01],\n", " [8.66109882e+01, 8.66109882e+01, 8.66109882e+01, ...,\n", " 8.66109882e+01, 8.66109882e+01, 8.66109882e+01],\n", " ...,\n", " [3.93511888e-01, 3.93511888e-01, 3.93511888e-01, ...,\n", " 3.93511888e-01, 3.93511888e-01, 3.93511888e-01],\n", " [2.36107521e-01, 2.36107521e-01, 2.36107521e-01, ...,\n", " 2.36107521e-01, 2.36107521e-01, 2.36107521e-01],\n", " [7.87025717e-02, 7.87025717e-02, 7.87025717e-02, ...,\n", " 7.87025717e-02, 7.87025717e-02, 7.87025717e-02]])\n", "Coordinates:\n", " * latitude (latitude) float64 -30.02 -30.11 -30.2 ... -89.78 -89.86 -89.95\n", " * longitude (longitude) float64 -180.0 -179.9 -179.8 ... 179.8 179.9 180.0
\n", " | datetime | \n", "size_ozone_hole | \n", "mean_O3_value | \n", "
---|---|---|---|
0 | \n", "2023-08-01 | \n", "0.465779 | \n", "1.0120476 | \n", "
1 | \n", "2023-08-02 | \n", "0.766681 | \n", "1.6748397 | \n", "
2 | \n", "2023-08-03 | \n", "0.152626 | \n", "0.35741448 | \n", "
3 | \n", "2023-08-04 | \n", "0.309330 | \n", "0.70260465 | \n", "
4 | \n", "2023-08-05 | \n", "1.282763 | \n", "2.7660265 | \n", "
... | \n", "... | \n", "... | \n", "... | \n", "
60 | \n", "2023-09-30 | \n", "21.626477 | \n", "58.531498 | \n", "
61 | \n", "2023-10-01 | \n", "22.014644 | \n", "58.67384 | \n", "
62 | \n", "2023-10-02 | \n", "21.924252 | \n", "56.59337 | \n", "
63 | \n", "2023-10-03 | \n", "21.753539 | \n", "55.88885 | \n", "
64 | \n", "2023-10-04 | \n", "21.813658 | \n", "56.404713 | \n", "
65 rows × 3 columns
\n", "