From 16fccb3342b45876636ea0995f59734e20a560dd Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Mon, 27 Nov 2023 14:42:44 +0100 Subject: [PATCH 1/5] add a few more hooks --- .pre-commit-config.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a81f286..008a6e4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,6 +5,8 @@ repos: - id: trailing-whitespace - id: end-of-file-fixer - id: check-docstring-first + - id: check-yaml + - id: check-toml - repo: https://github.com/pre-commit/mirrors-prettier rev: v3.0.3 hooks: @@ -14,6 +16,16 @@ repos: hooks: - id: ruff - id: ruff-format + - repo: https://github.com/MarcoGorelli/absolufy-imports + rev: v0.3.1 + hooks: + - id: absolufy-imports + files: ^xdggs/ + - repo: https://github.com/kynan/nbstripout + rev: 0.6.1 + hooks: + - id: nbstripout + args: [--extra-keys=metadata.kernelspec metadata.langauge_info.version] ci: autofix_prs: false From 532df3e91ad58afceb1d9747559c0477bee83524 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Mon, 27 Nov 2023 14:43:25 +0100 Subject: [PATCH 2/5] run the hooks on all files --- examples/example_h3.ipynb | 1727 +---------------- examples/example_healpy.ipynb | 3017 +---------------------------- examples/prepare_dataset_h3.ipynb | 2036 +------------------ xdggs/index.py | 2 +- 4 files changed, 58 insertions(+), 6724 deletions(-) diff --git a/examples/example_h3.ipynb b/examples/example_h3.ipynb index 84977ad..0fbecbd 100644 --- a/examples/example_h3.ipynb +++ b/examples/example_h3.ipynb @@ -2,19 +2,10 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "d89cc742-1fbd-4c44-ba0f-83f8b697a318", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/bbovy/miniconda3/envs/xdggs-dev/lib/python3.12/site-packages/h3/unstable/__init__.py:4: UserWarning: Modules under `h3.unstable` are experimental, and may change at any time.\n", - " warnings.warn(\n" - ] - } - ], + "outputs": [], "source": [ "import xarray as xr\n", "import xdggs" @@ -22,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "dbf580e5-324a-4504-939a-144abf71575a", "metadata": {}, "outputs": [], @@ -33,431 +24,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "00ea9d06-61ff-436e-a0bd-2ae03930906b", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:  (time: 2920, cell: 5305)\n",
-       "Coordinates:\n",
-       "  * time     (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n",
-       "  * cell     (cell) int64 590733444024107007 ... 590995677547331583\n",
-       "Data variables:\n",
-       "    air      (time, cell) float64 ...\n",
-       "Indexes:\n",
-       "    cell     H3Index(resolution=3)\n",
-       "Attributes:\n",
-       "    Conventions:  COARDS\n",
-       "    title:        4x daily NMC reanalysis (1948)\n",
-       "    description:  Data is from NMC initialized reanalysis\\n(4x/day).  These a...\n",
-       "    platform:     Model\n",
-       "    references:   http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...
" - ], - "text/plain": [ - "\n", - "Dimensions: (time: 2920, cell: 5305)\n", - "Coordinates:\n", - " * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n", - " * cell (cell) int64 590733444024107007 ... 590995677547331583\n", - "Data variables:\n", - " air (time, cell) float64 ...\n", - "Indexes:\n", - " cell H3Index(resolution=3)\n", - "Attributes:\n", - " Conventions: COARDS\n", - " title: 4x daily NMC reanalysis (1948)\n", - " description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n", - " platform: Model\n", - " references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly..." - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "ds_idx = ds.drop_indexes(\"cell\").set_xindex(\"cell\", xdggs.DGGSIndex)\n", "\n", @@ -466,867 +36,20 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "396872d5-c76b-4768-a707-c39347d657f8", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:  (time: 2920, cell: 2)\n",
-       "Coordinates:\n",
-       "  * time     (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n",
-       "  * cell     (cell) int64 590733031707246591 590733444024107007\n",
-       "Data variables:\n",
-       "    air      (time, cell) float64 ...\n",
-       "Indexes:\n",
-       "    cell     H3Index(resolution=3)\n",
-       "Attributes:\n",
-       "    Conventions:  COARDS\n",
-       "    title:        4x daily NMC reanalysis (1948)\n",
-       "    description:  Data is from NMC initialized reanalysis\\n(4x/day).  These a...\n",
-       "    platform:     Model\n",
-       "    references:   http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...
" - ], - "text/plain": [ - "\n", - "Dimensions: (time: 2920, cell: 2)\n", - "Coordinates:\n", - " * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n", - " * cell (cell) int64 590733031707246591 590733444024107007\n", - "Data variables:\n", - " air (time, cell) float64 ...\n", - "Indexes:\n", - " cell H3Index(resolution=3)\n", - "Attributes:\n", - " Conventions: COARDS\n", - " title: 4x daily NMC reanalysis (1948)\n", - " description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n", - " platform: Model\n", - " references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly..." - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "ds_idx.dggs.sel_latlon([37., 37.5], [299.3, 299.5])" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "86959d2d-9316-4711-a765-c33b60315adf", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:    (time: 2920, cell: 5305)\n",
-       "Coordinates:\n",
-       "  * time       (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n",
-       "  * cell       (cell) int64 590733444024107007 ... 590995677547331583\n",
-       "    latitude   (cell) float64 37.81 40.86 33.94 39.28 ... 52.31 37.79 32.34\n",
-       "    longitude  (cell) float64 -60.7 -73.78 -131.0 ... -49.64 -45.58 -53.61\n",
-       "Data variables:\n",
-       "    air        (time, cell) float64 ...\n",
-       "Indexes:\n",
-       "    cell     H3Index(resolution=3)\n",
-       "Attributes:\n",
-       "    Conventions:  COARDS\n",
-       "    title:        4x daily NMC reanalysis (1948)\n",
-       "    description:  Data is from NMC initialized reanalysis\\n(4x/day).  These a...\n",
-       "    platform:     Model\n",
-       "    references:   http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...
" - ], - "text/plain": [ - "\n", - "Dimensions: (time: 2920, cell: 5305)\n", - "Coordinates:\n", - " * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n", - " * cell (cell) int64 590733444024107007 ... 590995677547331583\n", - " latitude (cell) float64 37.81 40.86 33.94 39.28 ... 52.31 37.79 32.34\n", - " longitude (cell) float64 -60.7 -73.78 -131.0 ... -49.64 -45.58 -53.61\n", - "Data variables:\n", - " air (time, cell) float64 ...\n", - "Indexes:\n", - " cell H3Index(resolution=3)\n", - "Attributes:\n", - " Conventions: COARDS\n", - " title: 4x daily NMC reanalysis (1948)\n", - " description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n", - " platform: Model\n", - " references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly..." - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "ds2 = ds_idx.dggs.assign_latlon_coords()\n", "ds2" @@ -1334,431 +57,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "96d7663d-6592-4c4b-8657-0071a1e1754c", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:  (time: 2920, cell: 5305)\n",
-       "Coordinates:\n",
-       "  * time     (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n",
-       "  * cell     (cell) int64 590733444024107007 ... 590995677547331583\n",
-       "Data variables:\n",
-       "    air      (time, cell) float64 ...\n",
-       "Indexes:\n",
-       "    cell     H3Index(resolution=3)\n",
-       "Attributes:\n",
-       "    Conventions:  COARDS\n",
-       "    title:        4x daily NMC reanalysis (1948)\n",
-       "    description:  Data is from NMC initialized reanalysis\\n(4x/day).  These a...\n",
-       "    platform:     Model\n",
-       "    references:   http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...
" - ], - "text/plain": [ - "\n", - "Dimensions: (time: 2920, cell: 5305)\n", - "Coordinates:\n", - " * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n", - " * cell (cell) int64 590733444024107007 ... 590995677547331583\n", - "Data variables:\n", - " air (time, cell) float64 ...\n", - "Indexes:\n", - " cell H3Index(resolution=3)\n", - "Attributes:\n", - " Conventions: COARDS\n", - " title: 4x daily NMC reanalysis (1948)\n", - " description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n", - " platform: Model\n", - " references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly..." - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "result = ds_idx.dggs.sel_latlon(ds2.latitude, ds2.longitude)\n", "result" @@ -1766,7 +68,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "144fdb06-1aa7-41fb-a166-ee49c9ef2aba", "metadata": {}, "outputs": [], @@ -1784,11 +86,6 @@ } ], "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, "language_info": { "codemirror_mode": { "name": "ipython", diff --git a/examples/example_healpy.ipynb b/examples/example_healpy.ipynb index c3e6b19..effd789 100644 --- a/examples/example_healpy.ipynb +++ b/examples/example_healpy.ipynb @@ -2,19 +2,10 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "d89cc742-1fbd-4c44-ba0f-83f8b697a318", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/bbovy/miniconda3/envs/xdggs-dev/lib/python3.12/site-packages/h3/unstable/__init__.py:4: UserWarning: Modules under `h3.unstable` are experimental, and may change at any time.\n", - " warnings.warn(\n" - ] - } - ], + "outputs": [], "source": [ "import xarray as xr\n", "import xdggs" @@ -30,429 +21,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "dbf580e5-324a-4504-939a-144abf71575a", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:     (cell: 28910)\n",
-       "Coordinates:\n",
-       "    cell_ids    (cell) int64 11320973 11320975 11320997 ... 11483581 11483583\n",
-       "    resolution  float64 0.0002498\n",
-       "Dimensions without coordinates: cell\n",
-       "Data variables:\n",
-       "    H0          (cell) float64 nan nan nan nan nan nan ... nan nan nan nan nan\n",
-       "Attributes: (12/56)\n",
-       "    Conventions:             CF-1.6 OCO-1.3.1 COMODO-1.0\n",
-       "    NCO:                     4.0.6\n",
-       "    arakawa_grid_type:       C1\n",
-       "    area:                    finis\n",
-       "    comment:                 Use of Meteo-France AROME meteorological data\n",
-       "    contact:                 cdoco-exploit@ifremer.fr\n",
-       "    ...                      ...\n",
-       "    southernmost_latitude:   47.5318\n",
-       "    title:                   PREVIMER F1 MANGAE2500 AGRIF hindcast\n",
-       "    westernmost_longitude:   -6.4567\n",
-       "    nside:                   4096\n",
-       "    rot_lat:                 0\n",
-       "    rot_lon:                 0
" - ], - "text/plain": [ - "\n", - "Dimensions: (cell: 28910)\n", - "Coordinates:\n", - " cell_ids (cell) int64 11320973 11320975 11320997 ... 11483581 11483583\n", - " resolution float64 0.0002498\n", - "Dimensions without coordinates: cell\n", - "Data variables:\n", - " H0 (cell) float64 nan nan nan nan nan nan ... nan nan nan nan nan\n", - "Attributes: (12/56)\n", - " Conventions: CF-1.6 OCO-1.3.1 COMODO-1.0\n", - " NCO: 4.0.6\n", - " arakawa_grid_type: C1\n", - " area: finis\n", - " comment: Use of Meteo-France AROME meteorological data\n", - " contact: cdoco-exploit@ifremer.fr\n", - " ... ...\n", - " southernmost_latitude: 47.5318\n", - " title: PREVIMER F1 MANGAE2500 AGRIF hindcast\n", - " westernmost_longitude: -6.4567\n", - " nside: 4096\n", - " rot_lat: 0\n", - " rot_lon: 0" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "ds = xr.open_dataset(\"data/healpix_nolotation.nc\")\n", "\n", @@ -474,433 +46,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "00ea9d06-61ff-436e-a0bd-2ae03930906b", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:     (cell: 28910)\n",
-       "Coordinates:\n",
-       "  * cell_ids    (cell) int64 11320973 11320975 11320997 ... 11483581 11483583\n",
-       "    resolution  float64 0.0002498\n",
-       "Dimensions without coordinates: cell\n",
-       "Data variables:\n",
-       "    H0          (cell) float64 nan nan nan nan nan nan ... nan nan nan nan nan\n",
-       "Indexes:\n",
-       "    cell_ids  HealpixIndex(nside=4096, nest=True, rot_latlon=(0.0, 0.0))\n",
-       "Attributes: (12/56)\n",
-       "    Conventions:             CF-1.6 OCO-1.3.1 COMODO-1.0\n",
-       "    NCO:                     4.0.6\n",
-       "    arakawa_grid_type:       C1\n",
-       "    area:                    finis\n",
-       "    comment:                 Use of Meteo-France AROME meteorological data\n",
-       "    contact:                 cdoco-exploit@ifremer.fr\n",
-       "    ...                      ...\n",
-       "    southernmost_latitude:   47.5318\n",
-       "    title:                   PREVIMER F1 MANGAE2500 AGRIF hindcast\n",
-       "    westernmost_longitude:   -6.4567\n",
-       "    nside:                   4096\n",
-       "    rot_lat:                 0\n",
-       "    rot_lon:                 0
" - ], - "text/plain": [ - "\n", - "Dimensions: (cell: 28910)\n", - "Coordinates:\n", - " * cell_ids (cell) int64 11320973 11320975 11320997 ... 11483581 11483583\n", - " resolution float64 0.0002498\n", - "Dimensions without coordinates: cell\n", - "Data variables:\n", - " H0 (cell) float64 nan nan nan nan nan nan ... nan nan nan nan nan\n", - "Indexes:\n", - " cell_ids HealpixIndex(nside=4096, nest=True, rot_latlon=(0.0, 0.0))\n", - "Attributes: (12/56)\n", - " Conventions: CF-1.6 OCO-1.3.1 COMODO-1.0\n", - " NCO: 4.0.6\n", - " arakawa_grid_type: C1\n", - " area: finis\n", - " comment: Use of Meteo-France AROME meteorological data\n", - " contact: cdoco-exploit@ifremer.fr\n", - " ... ...\n", - " southernmost_latitude: 47.5318\n", - " title: PREVIMER F1 MANGAE2500 AGRIF hindcast\n", - " westernmost_longitude: -6.4567\n", - " nside: 4096\n", - " rot_lat: 0\n", - " rot_lon: 0" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "ds_idx = ds.set_xindex(\"cell_ids\", xdggs.DGGSIndex)\n", "\n", @@ -909,433 +58,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "d7f006e3-6983-4749-8815-d2a893f6c28b", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:     (cell: 28910)\n",
-       "Coordinates:\n",
-       "  * cell_ids    (cell) int64 11320973 11320975 11320997 ... 11483581 11483583\n",
-       "    resolution  float64 0.0002498\n",
-       "Dimensions without coordinates: cell\n",
-       "Data variables:\n",
-       "    H0          (cell) float64 nan nan nan nan nan nan ... nan nan nan nan nan\n",
-       "Indexes:\n",
-       "    cell_ids  HealpixIndex(nside=4096, nest=True, rot_latlon=(0.0, 0.0))\n",
-       "Attributes: (12/56)\n",
-       "    Conventions:             CF-1.6 OCO-1.3.1 COMODO-1.0\n",
-       "    NCO:                     4.0.6\n",
-       "    arakawa_grid_type:       C1\n",
-       "    area:                    finis\n",
-       "    comment:                 Use of Meteo-France AROME meteorological data\n",
-       "    contact:                 cdoco-exploit@ifremer.fr\n",
-       "    ...                      ...\n",
-       "    southernmost_latitude:   47.5318\n",
-       "    title:                   PREVIMER F1 MANGAE2500 AGRIF hindcast\n",
-       "    westernmost_longitude:   -6.4567\n",
-       "    nside:                   4096\n",
-       "    rot_lat:                 0\n",
-       "    rot_lon:                 0
" - ], - "text/plain": [ - "\n", - "Dimensions: (cell: 28910)\n", - "Coordinates:\n", - " * cell_ids (cell) int64 11320973 11320975 11320997 ... 11483581 11483583\n", - " resolution float64 0.0002498\n", - "Dimensions without coordinates: cell\n", - "Data variables:\n", - " H0 (cell) float64 nan nan nan nan nan nan ... nan nan nan nan nan\n", - "Indexes:\n", - " cell_ids HealpixIndex(nside=4096, nest=True, rot_latlon=(0.0, 0.0))\n", - "Attributes: (12/56)\n", - " Conventions: CF-1.6 OCO-1.3.1 COMODO-1.0\n", - " NCO: 4.0.6\n", - " arakawa_grid_type: C1\n", - " area: finis\n", - " comment: Use of Meteo-France AROME meteorological data\n", - " contact: cdoco-exploit@ifremer.fr\n", - " ... ...\n", - " southernmost_latitude: 47.5318\n", - " title: PREVIMER F1 MANGAE2500 AGRIF hindcast\n", - " westernmost_longitude: -6.4567\n", - " nside: 4096\n", - " rot_lat: 0\n", - " rot_lon: 0" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "ds_idx = ds.set_xindex(\"cell_ids\", xdggs.HealpixIndex, nside=4096, nest=True)\n", "\n", @@ -1344,1305 +70,30 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "7daf589b-e96f-40c4-8a86-b4ee7dda1102", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:     (cell: 2)\n",
-       "Coordinates:\n",
-       "  * cell_ids    (cell) int64 11320973 11320975\n",
-       "    resolution  float64 0.0002498\n",
-       "Dimensions without coordinates: cell\n",
-       "Data variables:\n",
-       "    H0          (cell) float64 nan nan\n",
-       "Indexes:\n",
-       "    cell_ids  HealpixIndex(nside=4096, nest=True, rot_latlon=(0.0, 0.0))\n",
-       "Attributes: (12/56)\n",
-       "    Conventions:             CF-1.6 OCO-1.3.1 COMODO-1.0\n",
-       "    NCO:                     4.0.6\n",
-       "    arakawa_grid_type:       C1\n",
-       "    area:                    finis\n",
-       "    comment:                 Use of Meteo-France AROME meteorological data\n",
-       "    contact:                 cdoco-exploit@ifremer.fr\n",
-       "    ...                      ...\n",
-       "    southernmost_latitude:   47.5318\n",
-       "    title:                   PREVIMER F1 MANGAE2500 AGRIF hindcast\n",
-       "    westernmost_longitude:   -6.4567\n",
-       "    nside:                   4096\n",
-       "    rot_lat:                 0\n",
-       "    rot_lon:                 0
" - ], - "text/plain": [ - "\n", - "Dimensions: (cell: 2)\n", - "Coordinates:\n", - " * cell_ids (cell) int64 11320973 11320975\n", - " resolution float64 0.0002498\n", - "Dimensions without coordinates: cell\n", - "Data variables:\n", - " H0 (cell) float64 nan nan\n", - "Indexes:\n", - " cell_ids HealpixIndex(nside=4096, nest=True, rot_latlon=(0.0, 0.0))\n", - "Attributes: (12/56)\n", - " Conventions: CF-1.6 OCO-1.3.1 COMODO-1.0\n", - " NCO: 4.0.6\n", - " arakawa_grid_type: C1\n", - " area: finis\n", - " comment: Use of Meteo-France AROME meteorological data\n", - " contact: cdoco-exploit@ifremer.fr\n", - " ... ...\n", - " southernmost_latitude: 47.5318\n", - " title: PREVIMER F1 MANGAE2500 AGRIF hindcast\n", - " westernmost_longitude: -6.4567\n", - " nside: 4096\n", - " rot_lat: 0\n", - " rot_lon: 0" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "ds_idx.sel(cell_ids=[11320973, 11320975])" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "396872d5-c76b-4768-a707-c39347d657f8", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:     (cell: 2)\n",
-       "Coordinates:\n",
-       "  * cell_ids    (cell) int64 11423696 11426437\n",
-       "    resolution  float64 0.0002498\n",
-       "Dimensions without coordinates: cell\n",
-       "Data variables:\n",
-       "    H0          (cell) float64 53.46 82.05\n",
-       "Indexes:\n",
-       "    cell_ids  HealpixIndex(nside=4096, nest=True, rot_latlon=(0.0, 0.0))\n",
-       "Attributes: (12/56)\n",
-       "    Conventions:             CF-1.6 OCO-1.3.1 COMODO-1.0\n",
-       "    NCO:                     4.0.6\n",
-       "    arakawa_grid_type:       C1\n",
-       "    area:                    finis\n",
-       "    comment:                 Use of Meteo-France AROME meteorological data\n",
-       "    contact:                 cdoco-exploit@ifremer.fr\n",
-       "    ...                      ...\n",
-       "    southernmost_latitude:   47.5318\n",
-       "    title:                   PREVIMER F1 MANGAE2500 AGRIF hindcast\n",
-       "    westernmost_longitude:   -6.4567\n",
-       "    nside:                   4096\n",
-       "    rot_lat:                 0\n",
-       "    rot_lon:                 0
" - ], - "text/plain": [ - "\n", - "Dimensions: (cell: 2)\n", - "Coordinates:\n", - " * cell_ids (cell) int64 11423696 11426437\n", - " resolution float64 0.0002498\n", - "Dimensions without coordinates: cell\n", - "Data variables:\n", - " H0 (cell) float64 53.46 82.05\n", - "Indexes:\n", - " cell_ids HealpixIndex(nside=4096, nest=True, rot_latlon=(0.0, 0.0))\n", - "Attributes: (12/56)\n", - " Conventions: CF-1.6 OCO-1.3.1 COMODO-1.0\n", - " NCO: 4.0.6\n", - " arakawa_grid_type: C1\n", - " area: finis\n", - " comment: Use of Meteo-France AROME meteorological data\n", - " contact: cdoco-exploit@ifremer.fr\n", - " ... ...\n", - " southernmost_latitude: 47.5318\n", - " title: PREVIMER F1 MANGAE2500 AGRIF hindcast\n", - " westernmost_longitude: -6.4567\n", - " nside: 4096\n", - " rot_lat: 0\n", - " rot_lon: 0" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "ds_idx.dggs.sel_latlon([48.0, 48.1], -5.0)" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "86959d2d-9316-4711-a765-c33b60315adf", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:     (cell: 28910)\n",
-       "Coordinates:\n",
-       "  * cell_ids    (cell) int64 11320973 11320975 11320997 ... 11483581 11483583\n",
-       "    resolution  float64 0.0002498\n",
-       "    latitude    (cell) float64 46.15 46.17 46.18 46.19 ... 50.54 50.55 50.56\n",
-       "    longitude   (cell) float64 -6.283 -6.26 -6.238 ... -3.893 -3.867 -3.842\n",
-       "Dimensions without coordinates: cell\n",
-       "Data variables:\n",
-       "    H0          (cell) float64 nan nan nan nan nan nan ... nan nan nan nan nan\n",
-       "Indexes:\n",
-       "    cell_ids  HealpixIndex(nside=4096, nest=True, rot_latlon=(0.0, 0.0))\n",
-       "Attributes: (12/56)\n",
-       "    Conventions:             CF-1.6 OCO-1.3.1 COMODO-1.0\n",
-       "    NCO:                     4.0.6\n",
-       "    arakawa_grid_type:       C1\n",
-       "    area:                    finis\n",
-       "    comment:                 Use of Meteo-France AROME meteorological data\n",
-       "    contact:                 cdoco-exploit@ifremer.fr\n",
-       "    ...                      ...\n",
-       "    southernmost_latitude:   47.5318\n",
-       "    title:                   PREVIMER F1 MANGAE2500 AGRIF hindcast\n",
-       "    westernmost_longitude:   -6.4567\n",
-       "    nside:                   4096\n",
-       "    rot_lat:                 0\n",
-       "    rot_lon:                 0
" - ], - "text/plain": [ - "\n", - "Dimensions: (cell: 28910)\n", - "Coordinates:\n", - " * cell_ids (cell) int64 11320973 11320975 11320997 ... 11483581 11483583\n", - " resolution float64 0.0002498\n", - " latitude (cell) float64 46.15 46.17 46.18 46.19 ... 50.54 50.55 50.56\n", - " longitude (cell) float64 -6.283 -6.26 -6.238 ... -3.893 -3.867 -3.842\n", - "Dimensions without coordinates: cell\n", - "Data variables:\n", - " H0 (cell) float64 nan nan nan nan nan nan ... nan nan nan nan nan\n", - "Indexes:\n", - " cell_ids HealpixIndex(nside=4096, nest=True, rot_latlon=(0.0, 0.0))\n", - "Attributes: (12/56)\n", - " Conventions: CF-1.6 OCO-1.3.1 COMODO-1.0\n", - " NCO: 4.0.6\n", - " arakawa_grid_type: C1\n", - " area: finis\n", - " comment: Use of Meteo-France AROME meteorological data\n", - " contact: cdoco-exploit@ifremer.fr\n", - " ... ...\n", - " southernmost_latitude: 47.5318\n", - " title: PREVIMER F1 MANGAE2500 AGRIF hindcast\n", - " westernmost_longitude: -6.4567\n", - " nside: 4096\n", - " rot_lat: 0\n", - " rot_lon: 0" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "ds2 = ds_idx.dggs.assign_latlon_coords()\n", "ds2" @@ -2650,439 +101,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "96d7663d-6592-4c4b-8657-0071a1e1754c", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:     (cell: 28910)\n",
-       "Coordinates:\n",
-       "  * cell_ids    (cell) int64 11320973 11320975 11320997 ... 11483581 11483583\n",
-       "    resolution  float64 0.0002498\n",
-       "    latitude    (cell) float64 46.15 46.17 46.18 46.19 ... 50.54 50.55 50.56\n",
-       "    longitude   (cell) float64 -6.283 -6.26 -6.238 ... -3.893 -3.867 -3.842\n",
-       "Dimensions without coordinates: cell\n",
-       "Data variables:\n",
-       "    H0          (cell) float64 nan nan nan nan nan nan ... nan nan nan nan nan\n",
-       "Indexes:\n",
-       "    cell_ids  HealpixIndex(nside=4096, nest=True, rot_latlon=(0.0, 0.0))\n",
-       "Attributes: (12/56)\n",
-       "    Conventions:             CF-1.6 OCO-1.3.1 COMODO-1.0\n",
-       "    NCO:                     4.0.6\n",
-       "    arakawa_grid_type:       C1\n",
-       "    area:                    finis\n",
-       "    comment:                 Use of Meteo-France AROME meteorological data\n",
-       "    contact:                 cdoco-exploit@ifremer.fr\n",
-       "    ...                      ...\n",
-       "    southernmost_latitude:   47.5318\n",
-       "    title:                   PREVIMER F1 MANGAE2500 AGRIF hindcast\n",
-       "    westernmost_longitude:   -6.4567\n",
-       "    nside:                   4096\n",
-       "    rot_lat:                 0\n",
-       "    rot_lon:                 0
" - ], - "text/plain": [ - "\n", - "Dimensions: (cell: 28910)\n", - "Coordinates:\n", - " * cell_ids (cell) int64 11320973 11320975 11320997 ... 11483581 11483583\n", - " resolution float64 0.0002498\n", - " latitude (cell) float64 46.15 46.17 46.18 46.19 ... 50.54 50.55 50.56\n", - " longitude (cell) float64 -6.283 -6.26 -6.238 ... -3.893 -3.867 -3.842\n", - "Dimensions without coordinates: cell\n", - "Data variables:\n", - " H0 (cell) float64 nan nan nan nan nan nan ... nan nan nan nan nan\n", - "Indexes:\n", - " cell_ids HealpixIndex(nside=4096, nest=True, rot_latlon=(0.0, 0.0))\n", - "Attributes: (12/56)\n", - " Conventions: CF-1.6 OCO-1.3.1 COMODO-1.0\n", - " NCO: 4.0.6\n", - " arakawa_grid_type: C1\n", - " area: finis\n", - " comment: Use of Meteo-France AROME meteorological data\n", - " contact: cdoco-exploit@ifremer.fr\n", - " ... ...\n", - " southernmost_latitude: 47.5318\n", - " title: PREVIMER F1 MANGAE2500 AGRIF hindcast\n", - " westernmost_longitude: -6.4567\n", - " nside: 4096\n", - " rot_lat: 0\n", - " rot_lon: 0" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "result = ds_idx.dggs.sel_latlon(ds2.latitude, ds2.longitude)\n", "result" @@ -3090,7 +112,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "144fdb06-1aa7-41fb-a166-ee49c9ef2aba", "metadata": {}, "outputs": [], @@ -3100,11 +122,6 @@ } ], "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, "language_info": { "codemirror_mode": { "name": "ipython", diff --git a/examples/prepare_dataset_h3.ipynb b/examples/prepare_dataset_h3.ipynb index f9b884d..ddd1cb4 100644 --- a/examples/prepare_dataset_h3.ipynb +++ b/examples/prepare_dataset_h3.ipynb @@ -2,19 +2,10 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "0afdf1c4-7cdf-4192-8f78-0f3d8ae1c0a9", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/bbovy/miniconda3/envs/xdggs-dev/lib/python3.12/site-packages/h3/unstable/__init__.py:4: UserWarning: Modules under `h3.unstable` are experimental, and may change at any time.\n", - " warnings.warn(\n" - ] - } - ], + "outputs": [], "source": [ "import xarray as xr\n", "import h3\n", @@ -25,484 +16,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "e7463e7f-9890-4361-bb62-3291085325cc", "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: 25, time: 2920, lon: 53)\n",
-       "Coordinates:\n",
-       "  * lat      (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n",
-       "  * lon      (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n",
-       "  * time     (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n",
-       "Data variables:\n",
-       "    air      (time, lat, lon) float32 241.2 242.5 243.5 ... 296.5 296.2 295.7\n",
-       "Attributes:\n",
-       "    Conventions:  COARDS\n",
-       "    title:        4x daily NMC reanalysis (1948)\n",
-       "    description:  Data is from NMC initialized reanalysis\\n(4x/day).  These a...\n",
-       "    platform:     Model\n",
-       "    references:   http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...
" - ], - "text/plain": [ - "\n", - "Dimensions: (lat: 25, time: 2920, lon: 53)\n", - "Coordinates:\n", - " * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n", - " * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n", - " * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n", - "Data variables:\n", - " air (time, lat, lon) float32 241.2 242.5 243.5 ... 296.5 296.2 295.7\n", - "Attributes:\n", - " Conventions: COARDS\n", - " title: 4x daily NMC reanalysis (1948)\n", - " description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n", - " platform: Model\n", - " references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly..." - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "ds = xr.tutorial.load_dataset('air_temperature').load()\n", "ds" @@ -510,60 +27,20 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "d42d0ee9-9612-478d-b100-5acb72b29f08", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkMAAAHFCAYAAADxOP3DAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/SrBM8AAAACXBIWXMAAA9hAAAPYQGoP6dpAACPBElEQVR4nO3dd3wURf8H8M9eTQ9JII2EELqRIgJSpUhVlPYoKiIg6KMCQaQpoBJ4aKJ0BUUxoIigQgT1oQSBSEQUA0gVEEI1MYqQEEi9m98f/HIPR7JzubvAJbnP+/XaF2RnZ3dmb2/zzezsjCKEECAiIiJyUxpXF4CIiIjIlRgMERERkVtjMERERERujcEQERERuTUGQ0REROTWGAwRERGRW2MwRERERG6NwRARERG5NQZDRERE5NYYDFGFt3v3bsTFxeHKlSvF0jp27IiOHTve8TLdCSdOnMC4cePQrFkzVKlSBYGBgWjbti2+/PLLErfPyMjAkCFDULVqVXh5eaF169b47rvvim33zTffYNCgQWjUqBH0ej0URSlxf+fPn0ffvn1Rq1YteHt7w9/fH02bNsU777yDwsLCUtejrMtly+LFi9GgQQMYjUZER0dj6tSpKCgosNrmwoULGD16NDp06IAqVapAURSsWLHCoeMRUfnHYIgqvN27d2Pq1KklBkNLlizBkiVL7nyh7oCtW7fi22+/xb/+9S988cUX+PTTT1G3bl089thjmDZtmtW2eXl56Ny5M7777jssXLgQGzZsQEhICHr06IGkpCSrbRMSErBnzx7ExMSgSZMmqse/du0a/Pz88Prrr2Pjxo1Ys2YN2rVrh9jYWLzwwgulqsPtKJfMjBkz8NJLL6Ffv37YsmULhg8fjpkzZ2LEiBFW2/3+++/49NNPYTAY8NBDDzl0LCKqQARRBffWW28JACI1NdXVRbmj/vrrL2E2m4ut79mzp/Dy8hK5ubmWde+++64AIHbv3m1ZV1BQIGJiYsR9991nld9kMln+P2LECGHvbaJ///5Cp9NZHV/NnSzX33//LTw8PMS///1vq/UzZswQiqKII0eOlHisvXv3CgAiPj7eruMRUcXBliGq0OLi4jB+/HgAQHR0NBRFgaIo2LlzJ4Dij8nOnDkDRVHw1ltv4c0330TNmjXh6emJjh074sSJEygoKMCrr76K8PBw+Pv7o2/fvsjIyCh23LVr16J169bw9vaGj48Punfvjv3799+JKltUrVq1xEdF9913H65fv45//vnHsi4hIQH169dH69atLet0Oh0GDhyIn3/+GRcvXrSs12icuy1Uq1YNGo0GWq3W5rZ3slybN29Gbm4unnnmGav1zzzzDIQQ+Oqrr8rsWERUsfAbTxXas88+i9jYWADA+vXr8eOPP+LHH3/EvffeK8337rvv4ocffsC7776LDz/8EL/99hseeeQRDBs2DH/99Rc++ugjzJkzB9u2bcOzzz5rlXfmzJl48sknERMTg88//xyffPIJrl69ivvvvx9Hjx61WebCwsJSLUIIh87Jjh07UK1aNQQHB1vWHT58GI0bNy62bdG6I0eOOHQsABBCoLCwEJcvX8batWuxYsUKjB07Fjqdzmbe21muko4FAI0aNbJaHxYWhqpVq1rSicj92L5bEZVjERERqFGjBgCgadOmqFmzZqnyValSBV999ZWlBeDvv//G6NGj0aBBA2zYsMGy3W+//YYFCxYgKysLfn5+OH/+PKZMmYKRI0di0aJFlu26du2KunXrYurUqVi7dq3qcc+cOYPo6OhSlXHHjh12d/7+8MMPsXPnTixcuNCqZebSpUsIDAwstn3RukuXLtl1nJu9+eabmDhxIgBAURRMmjQJ06dPL1Xe21muko5lNBrh7e1d4vHK8lhEVLEwGCK39NBDD1k9CrnrrrsAAD179rTarmj9uXPn0LBhQ2zZsgWFhYUYNGiQ1RtTHh4e6NChA3bs2CE9bnh4OPbu3VuqMtavX79U2xXZtGkTRowYgUcffdTSWnYz2dtXjr6ZBQBDhgxBly5d8M8//2D79u146623kJmZicWLFwO40XJkMpms8tzcalTW5br1TTatVmvZz+06B0RUsTEYIrd0a2uEwWCQrs/NzQUA/PnnnwCAFi1alLhfW31NDAYD7rnnnlKVsTR9bops2bIF/fr1Q9euXfHpp58W+8UeFBRUYstHUb+iklpnSis0NBShoaEAgG7duiEgIACvvvoqhg4diqZNm2LlypXF+ukUPQK8HeXS6/VWP8fHx2PIkCEICgpCbm4url+/Di8vr2LHa9asmd3HIqLKgcEQkR2qVq0KAPjyyy8RFRVld/7b8Zhsy5Yt6NOnDzp06IB169ZZAribNWrUCIcOHSq2vmhdw4YNS1Wm0rjvvvsA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SZMmISUlBffcc49lm2eeeQZnzpzBmjVrEB4ejoSEBPTo0QOHDh1C3bp18cMPP+CFF17Am2++iV69emHbtm14/fXXix3r999/x+eff45169ZBq9UCAHr27InAwED897//hb+/P95//3107twZJ06cQGBgILZs2YKBAwdi0aJFuP/++3Hq1Cn8+9//BgBMmTIFX375JebPn481a9bg7rvvRnp6erFgSo2teuXm5qJZs2Z45ZVX4Ofnh2+//RZPP/00atWqhZYtWyItLQ1PPvkk5syZg759++Lq1avYtWsXhBAYN24cjh07hqysLMTHxwMAAgMDS/25EFE55Np5YonkBg8eLHr37l1i2qRJk0T9+vWtZi9/9913hY+PjzCZTEIIITp06CDatWtnla9FixbilVdeEUIIsWnTJqHT6URaWpolPTExUQAQCQkJQoj/za69f/9+IYQQO3bsEADE5cuXrfYbFRUl5s+fb7WuSZMmYsqUKUIIIbZs2SK0Wq04f/68JX3Tpk1Wx1q+fHmxOuXl5QlPT0+xZcuWEs9DSeW5evWqMBgMYs2aNZZ1ly5dEp6enuKll14SQgjx+++/C0VRxMWLF63217lzZzFx4kQhhBCPP/646Nmzp1X6U089Jfz9/S0/T5kyRej1epGRkWFZ99133wk/Pz+Rm5trlbd27dri/fffF0IIcf/994uZM2dapX/yySciLCxMCCHE3LlzRb169UR+fn6J9VZTmnqV5KGHHhJjx44VQgiRkpIiAIgzZ86UuK3suoyPj7c6P0RU/rFliCqsY8eOoXXr1lAUxbKubdu2yM7OxoULF1CjRg0AQOPGja3yhYWFISMjA8CNTseRkZEIDQ21pN933323rbw1atRARESEZV3r1q2ttklJScHvv/8OX19fq/W5ubk4depUqY916tQp5OfnW+0/MDAQ9evXt/y8b98+CCFQr149q7x5eXkICgoCcOP89O3b1yr9vvvuwzfffGO1LioqCtWqVbOqR3Z2tmU/RXJyciz1SElJwd69ezFjxgxLuslkQm5uLq5fv47HHnsMCxYsQK1atdCjRw889NBDeOSRR2z23SpNvUwmE2bPno21a9fi4sWLyMvLQ15eHry9vQEATZo0QefOndGoUSN0794d3bp1w6OPPoqAgADpsYmoYmIwRBWWEMIqECpaB8BqvV6vt9pGURSYzWbVfThKo9FYjl/k5s7Et6bdWk7gxqO0Zs2a4dNPPy227c3Bhi0lHetWZrMZWq0WKSkplkdbRXx8fCz7UTvHNysKIm7ed1hYWIl9aYr6G5nNZkydOhX9+vUrto2HhwciIyNx/PhxJCYmYtu2bRg+fDjeeustJCUlFftM7a3X3LlzMX/+fCxYsACNGjWCt7c3Ro8ejfz8fAA3Os0nJiZi9+7d2Lp1KxYvXozJkyfjp59+QnR0tOqxiahiYjBEFVZMTAzWrVtn9Qt79+7d8PX1RfXq1Uu1jwYNGuDcuXP4888/ERISAgDYu3evNE9Rvx2TyWS1vlq1akhLS7P8nJWVhdTUVKvynjt3Dn/88QfCw8MBAD/++KPVPu69916sXbvW0unYUXXq1IFer8eePXssLWSXL1/GiRMn0KFDBwBA06ZNYTKZkJGRgfvvv7/E/TRo0AA///yz1bpffvnF5vHvvfdepKenQ6fToWbNmqrbHD9+HHXq1FHdj6enJ3r16oVevXphxIgRaNCgAQ4dOoR7771XNU9p6rVr1y707t0bAwcOBHAjgDp58iTuuusuyzaKoqBt27Zo27Yt3njjDURFRSEhIQFjxoyBwWAo9vkTUcXFt8mo3MvMzMSBAweslnPnzmH48OE4f/48YmNj8dtvv2HDhg2YMmUKxowZA42mdJd2165dUbt2bQwePBgHDx7EDz/8gMmTJwMo3mpTJCoqCoqi4JtvvsFff/2F7OxsAMADDzyATz75BLt27cLhw4cxePBgq5aJLl26oH79+hg0aBB+/fVX7Nq1y3KsIk899RSqVq2K3r17Y9euXUhNTUVSUhJeeuklXLhwodTnzMfHB8OGDcP48ePx3Xff4fDhwxgyZIjVealXrx6eeuopDBo0COvXr0dqair27t2LN998E//9738BALGxsfjvf/+LefPm4eTJk3j//fexadMmm61pXbp0QevWrdGnTx9s2bIFZ86cwe7du/Haa69Zgqk33ngDH3/8MeLi4nDkyBEcO3YMa9euxWuvvQYAWLFiBZYvX47Dhw/j9OnT+OSTT+Dp6YmoqCjpsUtTrzp16lhafo4dO4bnn38e6enpln389NNPmDlzJn755RecO3cO69evx19//WUJlmrWrImDBw/i+PHj+Pvvv916OAGiSsFFfZWISmXw4MECQLFl8ODBQgghdu7cKVq0aCEMBoMIDQ0Vr7zyiigoKLDk79Chg6XDcJHevXtb8gshxLFjx0Tbtm2FwWAQDRo0EF9//bUAIDZv3iyEKN6BWgghpk2bJkJDQ4WiKJZ9ZWZmiv79+ws/Pz8RGRkpVqxYYdWBWgghjh8/Ltq1aycMBoOoV6+e2Lx5s1UHaiGESEtLE4MGDRJVq1YVRqNR1KpVSzz33HMiMzOzxHOk1qH76tWrYuDAgcLLy0uEhISIOXPmFDsf+fn54o033hA1a9YUer1ehIaGir59+4qDBw9atlm2bJmoXr268PT0FH369BHTp08XoaGhlvQpU6aIJk2aFCtXVlaWiI2NFeHh4UKv14vIyEjx1FNPiXPnzlm22bx5s2jTpo3w9PQUfn5+4r777hPLli0TQgiRkJAgWrZsKfz8/IS3t7do1aqV2LZtW4nn4Fa26nXp0iXRu3dv4ePjI4KDg8Vrr70mBg0aZOkUffToUdG9e3dRrVo1YTQaRb169cTixYst+8/IyBBdu3YVPj4+AoDYsWOHJY0dqIkqHkWIUnQuIHIjP/zwA9q1a4fff/8dtWvXdnVxbNq5cyc6deqEy5cv35FBF5977jn89ttv2LVr120/VkW0YsUKjB49utyNUE5E6thniNxeQkICfHx8ULduXfz+++946aWX0LZt2woRCN0sIiICjzzySLHBA5319ttvo2vXrvD29samTZuwcuVKLFmypEyPUVn4+PigsLAQHh4eri4KEdmBwRC5vatXr2LChAk4f/48qlatii5dupQ4WnN51bJlS5w8eRLA/96WKks///wz5syZg6tXr6JWrVpYtGgRnn322TI/Tmnt2rULDz74oGp6UR8uVyiazPfWt9iIqHzjYzIiqlBycnJw8eJF1XTZ22lERCVhMERERERuja/WExERkVtjMERERERujcEQERERuTUGQ0REROTWGAwRERGRW2MwRERERG6NwRARERG5NQZDRERE5Nb+D/se0KgIrfEhAAAAAElFTkSuQmCC", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "ds.air[0].plot()" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "28e4380f-ee01-4348-acea-fd92873466f9", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CPU times: user 1.73 ms, sys: 1.28 ms, total: 3.01 ms\n", - "Wall time: 1.82 ms\n" - ] - }, - { - "data": { - "text/plain": [ - "0.9690566037735849" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "resolution = 3\n", "\n", @@ -576,541 +53,30 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "d43cc328-eead-49c2-9736-320a21a43bce", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(53, 25)" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "index.shape" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "677f67bf-58a6-4ae5-9513-e28326f4a6fa", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(53,)" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "ds.lon.shape" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "342e314e-6a37-4a51-a7d8-cf3ac3fe7c9a", "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: 25, time: 2920, lon: 53)\n",
-       "Coordinates:\n",
-       "  * lat      (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n",
-       "  * lon      (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n",
-       "  * time     (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n",
-       "    index    (lat, lon) uint64 590203960455856127 ... 591508324843782143\n",
-       "Data variables:\n",
-       "    air      (time, lat, lon) float32 241.2 242.5 243.5 ... 296.5 296.2 295.7\n",
-       "Attributes:\n",
-       "    Conventions:  COARDS\n",
-       "    title:        4x daily NMC reanalysis (1948)\n",
-       "    description:  Data is from NMC initialized reanalysis\\n(4x/day).  These a...\n",
-       "    platform:     Model\n",
-       "    references:   http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...
" - ], - "text/plain": [ - "\n", - "Dimensions: (lat: 25, time: 2920, lon: 53)\n", - "Coordinates:\n", - " * lat (lat) float32 75.0 72.5 70.0 67.5 65.0 ... 25.0 22.5 20.0 17.5 15.0\n", - " * lon (lon) float32 200.0 202.5 205.0 207.5 ... 322.5 325.0 327.5 330.0\n", - " * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n", - " index (lat, lon) uint64 590203960455856127 ... 591508324843782143\n", - "Data variables:\n", - " air (time, lat, lon) float32 241.2 242.5 243.5 ... 296.5 296.2 295.7\n", - "Attributes:\n", - " Conventions: COARDS\n", - " title: 4x daily NMC reanalysis (1948)\n", - " description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n", - " platform: Model\n", - " references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly..." - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "ds.coords['index'] = ('lat', 'lon'), index.transpose()\n", "ds" @@ -1118,38 +84,17 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "3d8d33b5-fe1e-4699-ba40-2ce0ba6171e2", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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Gl9++SWmT5+OSZMmWVwBIiKiJolzkuwuJiYG33//fYP97733HuLi4iwuz+IlAGbMmIELFy6gT58+qK6uRq9evaBQKDB9+nQ8++yzFleAiIiIyB5efvlljBo1CuPHj8f777+Pc+fO4fHHH8ehQ4ewZs0ai8uzKEhSq9XYsWMHXnzxRcycORN//vknNBoNOnbsiObNm1t8ciIioiaLi0na3Ysvvoi+ffti3Lhx6NKlC86dO4f4+Hjs378fAQEBFpdn0XCbu7s7BgwYgAsXLqBZs2bo3r077r77bgZIREREluJwmywiIiLQqVMnFBYWorKyEiNHjrQqQAKsmJMUExODEydOWHUyIiIicoyUlBRIkqSzqVQqo3kWLlyIDh06QKlUon379sjMzNQ5fujQITzyyCMICwuDJElIT0/XW86iRYsQHh4Ob29v3HXXXdi+fbvOcSEEUlJSEBQUBKVSid69e+PQoUMWt/G3335Dly5dcOzYMezfvx+LFy/Gc889h5EjR6KiosLi8iwOkt5++21Mnz4dP/74I0pLS1FZWamzERERkRkc0JPUqVMnlJaWarcDBw4YTLt48WIkJycjJSUFhw4dwuzZszF58mT88MMP2jRVVVWIiIjAO++8YzDgWrNmDaZMmYKZM2di7969uPfeezFw4EAUFRVp08ybNw8LFizAxx9/jF27dkGlUqFfv364eNH48zdvdN9992HUqFHYuXMnOnTogKeffhp79+7FqVOnEBMTY1FZgBUTtx944AEAwMMPPwzpuge0CiEgSRLUarXFlSAiImpybB0ysyKvh4eHyd6jeitXrsTEiRMxatQoANeGsXJycjB37lwMHjwYABAbG4vY2FgAwCuvvKK3nAULFuAf//gHnn76aQBAeno6Nm7ciMWLF2POnDkQQiA9PR0zZ87E8OHDAQAZGRkICAjAqlWrMHHiRLPbt2nTJiQmJursi4yMxI4dO/D222+bXU49i4OkrVu3WnwSZyDcrm03C+FmfEKeTetjGMl76TZ341mNVMtoneScX2jkvH/H+8p4YsdwuypPucL4W9/0GPvMNrW5IO4OmiCsMXGhrX2PrD3mpG4cxVEoFFAoFHrT5ufnIygoCAqFAnFxcUhLSzO4xmFNTQ28vb119imVSuTm5qKurk7nqRuG1NbWIi8vr0EA1b9/f2RnZwMACgoKUFZWhv79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J57A6dOndcq5GdoKmPfeXm/ixImQJAnp6ek6+12tvYcPH8bDDz8Mf39/+Pr6Ij4+HkVFRdrjrtTeS5cu4dlnn0VwcDCUSiU6dOiAxYsX66S5Wdq7ePFidOnSRbsWUI8ePbBhwwbtcVf5nqpnrL2u9l1FLkq4gAEDBojly5eLgwcPin379omHHnpItG3bVly6dEmb5p133hG+vr5i7dq14sCBA2LUqFEiMDBQVFZWatM888wz4rbbbhObN28We/bsEX369BFdu3YVV69edUSz9DLV1vPnz4u+ffuKNWvWiL/++kvs3LlTxMXFibvuukunnJuhrUKY997WW7dunejatasICgoS77//vs4xV2rvsWPHRMuWLcVLL70k9uzZI44fPy5+/PFH8ffff2vTuFJ7n376aREZGSm2bt0qCgoKxKeffirc3d3Ft99+q01zs7T3+++/F+vXrxdHjhwRR44cEa+++qrw9PQUBw8eFEK4zvdUPWPtdbXvKnJNLhEk3ai8vFwAEFlZWUIIITQajVCpVOKdd97Rpqmurhb+/v7ik08+EUJcCy48PT3F6tWrtWlKSkqEm5ub+Pnnnxu3ARa4sa365ObmCgDi5MmTQoibt61CGG7vqVOnxG233SYOHjwoQkNDdYIkV2vvqFGjxLhx4wzmcbX2durUSbz55ps66e68807x2muvCSFu7vYKIUSLFi3EZ5995tLfU9erb68+rvRdRa7BJYbbbnThwgUAQMuWLQEABQUFKCsrQ//+/bVpFAoFEhMTkZ2dDQDIy8tDXV2dTpqgoCB07txZm8YZ3dhWQ2kkScItt9wC4OZtK6C/vRqNBo8//jheeukldOrUqUEeV2qvRqPB+vXrER0djQEDBqBNmzaIi4vDt99+q83jSu0FgJ49e+L7779HSUkJhBDYunUrjh49igEDBgC4edurVquxevVqXL58GT169HDp7ymgYXv1caXvKnINLhckCSEwbdo09OzZE507dwYA7ZOWAwICdNIGBARoj5WVlcHLywstWrQwmMbZ6Gvrjaqrq/HKK69gzJgx2uch3YxtBQy3d+7cufDw8MDzzz+vN58rtbe8vByXLl3CO++8gwceeACbNm3CsGHDMHz4cGRlZQFwrfYCwIcffoiOHTsiODgYXl5eeOCBB7Bo0SL07NkTwM3X3gMHDqB58+ZQKBR45plnsG7d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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "ds.index.plot()" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "0087d85f-4dcf-427a-8c65-36edc0e135f0", "metadata": {}, "outputs": [], @@ -1160,24 +105,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "b859838c-6795-4c9d-9674-fa0834b50d0a", "metadata": {}, - "outputs": [ - { - "data": { - "image/svg+xml": [ - "" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "import shapely\n", "bbox_coords = [\n", @@ -1193,42 +124,20 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "0034cd01-b4c0-444b-a504-7501eb50a860", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[(-160.0, 15.0), (-160.0, 75.0), (-30.0, 75.0), (-30.0, 15.0), (-160.0, 15.0)]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "bbox_coords" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "ef4010c4-ed57-48ff-9e3a-30d23fdeed80", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(5305,)" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# h3 wants lat first\n", "bbox_coords_lat_first = [(lat, lon) for lon, lat in bbox_coords]\n", @@ -1238,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "314d0ef5-ad12-47e3-8608-f3ddea0ec9ce", "metadata": {}, "outputs": [], @@ -1249,456 +158,10 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "c88beede-bcdb-4d73-a2ee-a65ef96aaa18", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:  (time: 2920, cell: 5305)\n",
-       "Coordinates:\n",
-       "  * time     (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n",
-       "    index    (cell) float64 5.907e+17 5.907e+17 5.907e+17 ... 5.909e+17 5.91e+17\n",
-       "    lon      (cell) float64 299.3 286.2 229.0 237.7 ... 250.0 310.4 314.4 306.4\n",
-       "    lat      (cell) float64 37.81 40.86 33.94 39.28 ... 56.72 52.31 37.79 32.34\n",
-       "  * cell     (cell) int64 590733444024107007 ... 590995677547331583\n",
-       "Data variables:\n",
-       "    air      (time, cell) float64 286.0 275.5 289.4 276.9 ... 266.6 291.5 294.9\n",
-       "Attributes:\n",
-       "    Conventions:  COARDS\n",
-       "    title:        4x daily NMC reanalysis (1948)\n",
-       "    description:  Data is from NMC initialized reanalysis\\n(4x/day).  These a...\n",
-       "    platform:     Model\n",
-       "    references:   http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...
" - ], - "text/plain": [ - "\n", - "Dimensions: (time: 2920, cell: 5305)\n", - "Coordinates:\n", - " * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n", - " index (cell) float64 5.907e+17 5.907e+17 5.907e+17 ... 5.909e+17 5.91e+17\n", - " lon (cell) float64 299.3 286.2 229.0 237.7 ... 250.0 310.4 314.4 306.4\n", - " lat (cell) float64 37.81 40.86 33.94 39.28 ... 56.72 52.31 37.79 32.34\n", - " * cell (cell) int64 590733444024107007 ... 590995677547331583\n", - "Data variables:\n", - " air (time, cell) float64 286.0 275.5 289.4 276.9 ... 266.6 291.5 294.9\n", - "Attributes:\n", - " Conventions: COARDS\n", - " title: 4x daily NMC reanalysis (1948)\n", - " description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n", - " platform: Model\n", - " references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly..." - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "coords={\"cell\": bbox_indexes}\n", "\n", @@ -1712,448 +175,10 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "b05fe8f0-777e-41d0-be1a-b0ea3a8c1bd1", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:  (time: 2920, cell: 5305)\n",
-       "Coordinates:\n",
-       "  * time     (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n",
-       "  * cell     (cell) int64 590733444024107007 ... 590995677547331583\n",
-       "Data variables:\n",
-       "    air      (time, cell) float64 286.0 275.5 289.4 276.9 ... 266.6 291.5 294.9\n",
-       "Attributes:\n",
-       "    Conventions:  COARDS\n",
-       "    title:        4x daily NMC reanalysis (1948)\n",
-       "    description:  Data is from NMC initialized reanalysis\\n(4x/day).  These a...\n",
-       "    platform:     Model\n",
-       "    references:   http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...
" - ], - "text/plain": [ - "\n", - "Dimensions: (time: 2920, cell: 5305)\n", - "Coordinates:\n", - " * time (time) datetime64[ns] 2013-01-01 ... 2014-12-31T18:00:00\n", - " * cell (cell) int64 590733444024107007 ... 590995677547331583\n", - "Data variables:\n", - " air (time, cell) float64 286.0 275.5 289.4 276.9 ... 266.6 291.5 294.9\n", - "Attributes:\n", - " Conventions: COARDS\n", - " title: 4x daily NMC reanalysis (1948)\n", - " description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n", - " platform: Model\n", - " references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly..." - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "dsi2 = dsi.drop_vars([\"lon\", \"lat\", \"index\"])\n", "dsi2.cell.attrs = {\"grid_name\": \"h3\", \"resolution\": resolution}\n", @@ -2171,11 +196,6 @@ } ], "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, "language_info": { "codemirror_mode": { "name": "ipython", diff --git a/xdggs/index.py b/xdggs/index.py index 11b0804..77558d9 100644 --- a/xdggs/index.py +++ b/xdggs/index.py @@ -5,7 +5,7 @@ import xarray as xr from xarray.indexes import Index, PandasIndex -from .utils import GRID_REGISTRY, _extract_cell_id_variable +from xdggs.utils import GRID_REGISTRY, _extract_cell_id_variable class DGGSIndex(Index): From 78cb66f70fcb1ea959b9c9b01fd81ff661c9e9cb Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Mon, 27 Nov 2023 15:05:33 +0100 Subject: [PATCH 3/5] actually replace `ruff format` with `black-jupyter` --- .pre-commit-config.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 008a6e4..fc93527 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,7 +15,10 @@ repos: rev: v0.1.4 hooks: - id: ruff - - id: ruff-format + - repo: https://github.com/psf/black-pre-commit-mirror + rev: 23.10.1 + hooks: + - id: black-jupyter - repo: https://github.com/MarcoGorelli/absolufy-imports rev: v0.3.1 hooks: From 6f8a31a556dcaedc9b9304d953a18584601765a4 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Mon, 27 Nov 2023 15:06:22 +0100 Subject: [PATCH 4/5] auto-update hook versions --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fc93527..8d4cf8f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,15 +8,15 @@ repos: - id: check-yaml - id: check-toml - repo: https://github.com/pre-commit/mirrors-prettier - rev: v3.0.3 + rev: v3.1.0 hooks: - id: prettier - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.4 + rev: v0.1.6 hooks: - id: ruff - repo: https://github.com/psf/black-pre-commit-mirror - rev: 23.10.1 + rev: 23.11.0 hooks: - id: black-jupyter - repo: https://github.com/MarcoGorelli/absolufy-imports From 32d8ae47441e22675e319f611496c0427a70dc03 Mon Sep 17 00:00:00 2001 From: Justus Magin Date: Mon, 27 Nov 2023 15:10:00 +0100 Subject: [PATCH 5/5] run the hooks on all files --- examples/example_h3.ipynb | 2 +- examples/example_healpy.ipynb | 3 +-- examples/prepare_dataset_h3.ipynb | 15 +++++++++------ xdggs/accessor.py | 8 ++++++-- xdggs/healpix.py | 8 ++++---- 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/examples/example_h3.ipynb b/examples/example_h3.ipynb index 0fbecbd..936440f 100644 --- a/examples/example_h3.ipynb +++ b/examples/example_h3.ipynb @@ -41,7 +41,7 @@ "metadata": {}, "outputs": [], "source": [ - "ds_idx.dggs.sel_latlon([37., 37.5], [299.3, 299.5])" + "ds_idx.dggs.sel_latlon([37.0, 37.5], [299.3, 299.5])" ] }, { diff --git a/examples/example_healpy.ipynb b/examples/example_healpy.ipynb index effd789..c33d23d 100644 --- a/examples/example_healpy.ipynb +++ b/examples/example_healpy.ipynb @@ -29,8 +29,7 @@ "ds = xr.open_dataset(\"data/healpix_nolotation.nc\")\n", "\n", "ds = (\n", - " ds\n", - " .load()\n", + " ds.load()\n", " .drop_vars([\"latitude\", \"longitude\"])\n", " .stack(cell=[\"x\", \"y\"], create_index=False)\n", ")\n", diff --git a/examples/prepare_dataset_h3.ipynb b/examples/prepare_dataset_h3.ipynb index ddd1cb4..ee00828 100644 --- a/examples/prepare_dataset_h3.ipynb +++ b/examples/prepare_dataset_h3.ipynb @@ -21,7 +21,7 @@ "metadata": {}, "outputs": [], "source": [ - "ds = xr.tutorial.load_dataset('air_temperature').load()\n", + "ds = xr.tutorial.load_dataset(\"air_temperature\").load()\n", "ds" ] }, @@ -78,7 +78,7 @@ "metadata": {}, "outputs": [], "source": [ - "ds.coords['index'] = ('lat', 'lon'), index.transpose()\n", + "ds.coords[\"index\"] = (\"lat\", \"lon\"), index.transpose()\n", "ds" ] }, @@ -111,12 +111,13 @@ "outputs": [], "source": [ "import shapely\n", + "\n", "bbox_coords = [\n", " (lon_min - 360, lat_min),\n", " (lon_min - 360, lat_max),\n", " (lon_max - 360, lat_max),\n", " (lon_max - 360, lat_min),\n", - " (lon_min - 360, lat_min)\n", + " (lon_min - 360, lat_min),\n", "]\n", "bbox = shapely.Polygon(bbox_coords)\n", "bbox" @@ -141,7 +142,9 @@ "source": [ "# h3 wants lat first\n", "bbox_coords_lat_first = [(lat, lon) for lon, lat in bbox_coords]\n", - "bbox_indexes = np.array(list(h3.api.basic_int.polyfill_polygon(bbox_coords_lat_first, resolution)))\n", + "bbox_indexes = np.array(\n", + " list(h3.api.basic_int.polyfill_polygon(bbox_coords_lat_first, resolution))\n", + ")\n", "bbox_indexes.shape" ] }, @@ -163,12 +166,12 @@ "metadata": {}, "outputs": [], "source": [ - "coords={\"cell\": bbox_indexes}\n", + "coords = {\"cell\": bbox_indexes}\n", "\n", "# remember to re-add the 360 degree offset\n", "dsi = ds.interp(\n", " lon=xr.DataArray(ll_points_lon_first[:, 0] + 360, dims=\"cell\", coords=coords),\n", - " lat=xr.DataArray(ll_points_lon_first[:, 1], dims=\"cell\", coords=coords)\n", + " lat=xr.DataArray(ll_points_lon_first[:, 1], dims=\"cell\", coords=coords),\n", ")\n", "dsi" ] diff --git a/xdggs/accessor.py b/xdggs/accessor.py index 3a5fb6b..c2bbdb6 100644 --- a/xdggs/accessor.py +++ b/xdggs/accessor.py @@ -19,7 +19,9 @@ def __init__(self, obj: xr.Dataset | xr.DataArray): for k, idx in obj.xindexes.items(): if isinstance(idx, DGGSIndex): if index is not None: - raise ValueError("Only one DGGSIndex per dataset or dataarray is supported") + raise ValueError( + "Only one DGGSIndex per dataset or dataarray is supported" + ) index = idx name = k self._name = name @@ -43,7 +45,9 @@ def coord(self) -> xr.DataArray: """ if not self._name: - raise ValueError("no coordinate with a DGGSIndex found on this Dataset or DataArray") + raise ValueError( + "no coordinate with a DGGSIndex found on this Dataset or DataArray" + ) return self._obj[self._name] def sel_latlon( diff --git a/xdggs/healpix.py b/xdggs/healpix.py index de9d791..9c28d94 100644 --- a/xdggs/healpix.py +++ b/xdggs/healpix.py @@ -42,7 +42,9 @@ def from_variables( return cls(var.data, dim, nside, nest, rot_latlon) def _replace(self, new_pd_index: PandasIndex): - return type(self)(new_pd_index, self._dim, self._nside, self._nest, self._rot_latlon) + return type(self)( + new_pd_index, self._dim, self._nside, self._nest, self._rot_latlon + ) def _latlon2cellid(self, lat: Any, lon: Any) -> np.ndarray: return healpy.ang2pix(self._nside, -lon, lat, lonlat=True, nest=self._nest) @@ -52,6 +54,4 @@ def _cellid2latlon(self, cell_ids: Any) -> tuple[np.ndarray, np.ndarray]: return lat, -lon def _repr_inline_(self, max_width: int): - return ( - f"HealpixIndex(nside={self._nside}, nest={self._nest}, rot_latlon={self._rot_latlon!r})" - ) + return f"HealpixIndex(nside={self._nside}, nest={self._nest}, rot_latlon={self._rot_latlon!r})"