--- /srv/reproducible-results/rbuild-debian/r-b-build.ndA8bsPQ/b1/python-xarray_2025.01.2-1_arm64.changes +++ /srv/reproducible-results/rbuild-debian/r-b-build.ndA8bsPQ/b2/python-xarray_2025.01.2-1_arm64.changes ├── Files │ @@ -1,3 +1,3 @@ │ │ - 1d4da7b15be6394460339dfbb6c127fc 2751444 doc optional python-xarray-doc_2025.01.2-1_all.deb │ + aaada36c91478faf36f4f663e8d14017 2751736 doc optional python-xarray-doc_2025.01.2-1_all.deb │ 65b17ea58f6b0a83ea67cd4000a96d9f 799856 python optional python3-xarray_2025.01.2-1_all.deb ├── python-xarray-doc_2025.01.2-1_all.deb │ ├── file list │ │ @@ -1,3 +1,3 @@ │ │ -rw-r--r-- 0 0 0 4 2025-02-02 11:36:57.000000 debian-binary │ │ --rw-r--r-- 0 0 0 6368 2025-02-02 11:36:57.000000 control.tar.xz │ │ --rw-r--r-- 0 0 0 2744884 2025-02-02 11:36:57.000000 data.tar.xz │ │ +-rw-r--r-- 0 0 0 6364 2025-02-02 11:36:57.000000 control.tar.xz │ │ +-rw-r--r-- 0 0 0 2745180 2025-02-02 11:36:57.000000 data.tar.xz │ ├── control.tar.xz │ │ ├── control.tar │ │ │ ├── ./control │ │ │ │ @@ -1,13 +1,13 @@ │ │ │ │ Package: python-xarray-doc │ │ │ │ Source: python-xarray │ │ │ │ Version: 2025.01.2-1 │ │ │ │ Architecture: all │ │ │ │ Maintainer: Debian Science Maintainers │ │ │ │ -Installed-Size: 8991 │ │ │ │ +Installed-Size: 8992 │ │ │ │ Depends: libjs-sphinxdoc (>= 8.1), libjs-mathjax, libjs-requirejs │ │ │ │ Built-Using: alabaster (= 0.7.16-0.1), sphinx (= 8.1.3-4) │ │ │ │ Section: doc │ │ │ │ Priority: optional │ │ │ │ Multi-Arch: foreign │ │ │ │ Homepage: https://xarray.pydata.org/ │ │ │ │ Description: documentation for xarray │ │ │ ├── ./md5sums │ │ │ │ ├── ./md5sums │ │ │ │ │┄ Files differ │ ├── data.tar.xz │ │ ├── data.tar │ │ │ ├── file list │ │ │ │ @@ -160,32 +160,32 @@ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 101581 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/contributing.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 461 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/dask.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 494 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/data-structures.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 8448 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/developers-meeting.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 479 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/duckarrays.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 22666 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/ecosystem.html │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/ │ │ │ │ --rw-r--r-- 0 root (0) root (0) 151021 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/ERA5-GRIB-example.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10290 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/ERA5-GRIB-example.ipynb.gz │ │ │ │ --rw-r--r-- 0 root (0) root (0) 51050 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/ROMS_ocean_model.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 24979 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/ROMS_ocean_model.ipynb.gz │ │ │ │ --rw-r--r-- 0 root (0) root (0) 134137 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/apply_ufunc_vectorize_1d.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10482 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/apply_ufunc_vectorize_1d.ipynb.gz │ │ │ │ --rw-r--r-- 0 root (0) root (0) 42089 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/area_weighted_temperature.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 22662 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/area_weighted_temperature.ipynb.gz │ │ │ │ --rw-r--r-- 0 root (0) root (0) 27905 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/blank_template.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 151036 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/ERA5-GRIB-example.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10275 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/ERA5-GRIB-example.ipynb.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 51051 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/ROMS_ocean_model.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 24970 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/ROMS_ocean_model.ipynb.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 134138 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/apply_ufunc_vectorize_1d.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10480 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/apply_ufunc_vectorize_1d.ipynb.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 42090 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/area_weighted_temperature.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 22658 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/area_weighted_temperature.ipynb.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 27906 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/blank_template.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2567 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/blank_template.ipynb.gz │ │ │ │ --rw-r--r-- 0 root (0) root (0) 50959 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/monthly-means.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4547 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/monthly-means.ipynb.gz │ │ │ │ --rw-r--r-- 0 root (0) root (0) 43740 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/multidimensional-coords.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12226 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/multidimensional-coords.ipynb.gz │ │ │ │ --rw-r--r-- 0 root (0) root (0) 50844 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/visualization_gallery.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4383 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/visualization_gallery.ipynb.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 50960 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/monthly-means.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4540 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/monthly-means.ipynb.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 43741 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/multidimensional-coords.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12222 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/multidimensional-coords.ipynb.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 50845 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/visualization_gallery.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4375 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/visualization_gallery.ipynb.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 87852 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/weather-data.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 367949 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/weather-data.ipynb.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 367958 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/examples/weather-data.ipynb.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 491 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/faq.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 15073 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/gallery.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 16306 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/genindex.html │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/getting-started-guide/ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 50398 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/getting-started-guide/faq.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 7741 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/getting-started-guide/index.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 23857 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/getting-started-guide/installing.html │ │ │ │ @@ -200,50 +200,50 @@ │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/internals/ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 81178 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/internals/chunked-arrays.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 19678 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/internals/duck-arrays-integration.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 22842 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/internals/extending-xarray.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 53506 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/internals/how-to-add-new-backend.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 30758 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/internals/how-to-create-custom-index.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 9035 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/internals/index.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 60255 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/internals/internal-design.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 60257 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/internals/internal-design.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 13589 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/internals/interoperability.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 27075 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/internals/zarr-encoding-spec.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 27076 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/internals/zarr-encoding-spec.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 488 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/interpolation.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 455 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/io.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 22249 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/objects.inv │ │ │ │ -rw-r--r-- 0 root (0) root (0) 467 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/pandas.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 473 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/plotting.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 6546 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/py-modindex.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 524 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/quick-overview.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 443 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/related-projects.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 476 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/reshaping.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 24474 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/roadmap.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 6341 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/search.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 249936 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/searchindex.js │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 250530 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/searchindex.js │ │ │ │ -rw-r--r-- 0 root (0) root (0) 482 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/terminology.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 482 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/time-series.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 13358 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/tutorials-and-videos.html │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 58676 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/combining.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 140195 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/computation.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 71343 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/dask.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 150022 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/data-structures.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 35119 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/duckarrays.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 50886 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/groupby.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 120196 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/hierarchical-data.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 120197 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/hierarchical-data.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 9025 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/index.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 139994 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/indexing.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 68719 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/interpolation.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 144483 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/io.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 139997 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/indexing.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 68720 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/interpolation.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 144485 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/io.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 11704 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/options.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 42224 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/pandas.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 136246 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/plotting.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 62916 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/reshaping.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 136248 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/plotting.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 62917 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/reshaping.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 46801 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/terminology.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 47980 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/testing.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 49044 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/testing.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 45637 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/time-series.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 45153 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/user-guide/weather-climate.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 494 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/weather-climate.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 1017509 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/whats-new.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 512 2025-02-02 11:36:57.000000 ./usr/share/doc/python-xarray-doc/html/why-xarray.html │ │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2025-02-02 11:36:57.000000 ./usr/share/doc-base/ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 290 2025-02-02 11:36:57.000000 ./usr/share/doc-base/python-xarray-doc.python-xarray-doc │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/ERA5-GRIB-example.html │ │ │ │ @@ -170,15 +170,15 @@ │ │ │ │ File /usr/lib/python3/dist-packages/pooch/utils.py:276, in make_local_storage(path, env) │ │ │ │ 272 if env is not None: │ │ │ │ 273 message.append( │ │ │ │ 274 f"Use environment variable '{env}' to specify a different location." │ │ │ │ 275 ) │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ │ │ │ │ │ │ │

Let’s create a simple plot of 2-m air temperature in degrees Celsius:

│ │ │ │
│ │ │ │
[3]:
│ │ │ │  
│ │ │ │
│ │ │ │ @@ -238,90 +238,90 @@ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Error in callback <function _draw_all_if_interactive at 0xffff4bb6a480> (for post_execute), with arguments args (),kwargs {}:
│ │ │ │ +Error in callback <function _draw_all_if_interactive at 0xffff3daea480> (for post_execute), with arguments args (),kwargs {}:
│ │ │ │  
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │  ---------------------------------------------------------------------------
│ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode, parents, exist_ok)
│ │ │ │      723 try:
│ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │      725 except FileNotFoundError:
│ │ │ │  
│ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share/cartopy/shapefiles/natural_earth/physical'
│ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share/cartopy/shapefiles/natural_earth/physical'
│ │ │ │  
│ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │  
│ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode, parents, exist_ok)
│ │ │ │      723 try:
│ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │      725 except FileNotFoundError:
│ │ │ │  
│ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share/cartopy/shapefiles/natural_earth'
│ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share/cartopy/shapefiles/natural_earth'
│ │ │ │  
│ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │  
│ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode, parents, exist_ok)
│ │ │ │      723 try:
│ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │      725 except FileNotFoundError:
│ │ │ │  
│ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share/cartopy/shapefiles'
│ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share/cartopy/shapefiles'
│ │ │ │  
│ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │  
│ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode, parents, exist_ok)
│ │ │ │      723 try:
│ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │      725 except FileNotFoundError:
│ │ │ │  
│ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share/cartopy'
│ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share/cartopy'
│ │ │ │  
│ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │  
│ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode, parents, exist_ok)
│ │ │ │      723 try:
│ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │      725 except FileNotFoundError:
│ │ │ │  
│ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share'
│ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share'
│ │ │ │  
│ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │  
│ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode, parents, exist_ok)
│ │ │ │      723 try:
│ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │      725 except FileNotFoundError:
│ │ │ │  
│ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-build/.local'
│ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-build/.local'
│ │ │ │  
│ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │  
│ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode, parents, exist_ok)
│ │ │ │      723 try:
│ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │      725 except FileNotFoundError:
│ │ │ │  
│ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-build'
│ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-build'
│ │ │ │  
│ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │  
│ │ │ │  PermissionError                           Traceback (most recent call last)
│ │ │ │  File /usr/lib/python3/dist-packages/matplotlib/pyplot.py:197, in _draw_all_if_interactive()
│ │ │ │      195 def _draw_all_if_interactive() -> None:
│ │ │ │      196     if matplotlib.is_interactive():
│ │ │ │ @@ -530,75 +530,75 @@
│ │ │ │  ---------------------------------------------------------------------------
│ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode, parents, exist_ok)
│ │ │ │      723 try:
│ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │      725 except FileNotFoundError:
│ │ │ │  
│ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share/cartopy/shapefiles/natural_earth/physical'
│ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share/cartopy/shapefiles/natural_earth/physical'
│ │ │ │  
│ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │  
│ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode, parents, exist_ok)
│ │ │ │      723 try:
│ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │      725 except FileNotFoundError:
│ │ │ │  
│ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share/cartopy/shapefiles/natural_earth'
│ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share/cartopy/shapefiles/natural_earth'
│ │ │ │  
│ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │  
│ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode, parents, exist_ok)
│ │ │ │      723 try:
│ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │      725 except FileNotFoundError:
│ │ │ │  
│ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share/cartopy/shapefiles'
│ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share/cartopy/shapefiles'
│ │ │ │  
│ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │  
│ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode, parents, exist_ok)
│ │ │ │      723 try:
│ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │      725 except FileNotFoundError:
│ │ │ │  
│ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share/cartopy'
│ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share/cartopy'
│ │ │ │  
│ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │  
│ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode, parents, exist_ok)
│ │ │ │      723 try:
│ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │      725 except FileNotFoundError:
│ │ │ │  
│ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share'
│ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share'
│ │ │ │  
│ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │  
│ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode, parents, exist_ok)
│ │ │ │      723 try:
│ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │      725 except FileNotFoundError:
│ │ │ │  
│ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-build/.local'
│ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-build/.local'
│ │ │ │  
│ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │  
│ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode, parents, exist_ok)
│ │ │ │      723 try:
│ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │      725 except FileNotFoundError:
│ │ │ │  
│ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-build'
│ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-build'
│ │ │ │  
│ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │  
│ │ │ │  PermissionError                           Traceback (most recent call last)
│ │ │ │  File /usr/lib/python3/dist-packages/IPython/core/formatters.py:402, in BaseFormatter.__call__(self, obj)
│ │ │ │      400     pass
│ │ │ │      401 else:
│ │ │ │ ├── html2text {}
│ │ │ │ │ @@ -99,15 +99,15 @@
│ │ │ │ │      273     message.append(
│ │ │ │ │      274         f"Use environment variable '{env}' to specify a different
│ │ │ │ │  location."
│ │ │ │ │      275     )
│ │ │ │ │  --> 276 raise PermissionError(" ".join(message)) from error
│ │ │ │ │  
│ │ │ │ │  PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not
│ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/
│ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/
│ │ │ │ │  xarray_tutorial_data'. Will not be able to download data files.
│ │ │ │ │  Let’s create a simple plot of 2-m air temperature in degrees Celsius:
│ │ │ │ │  [3]:
│ │ │ │ │  ds = ds - 273.15
│ │ │ │ │  ds.t2m[0].plot(cmap=plt.cm.coolwarm)
│ │ │ │ │  ---------------------------------------------------------------------------
│ │ │ │ │  NameError                                 Traceback (most recent call last)
│ │ │ │ │ @@ -138,97 +138,97 @@
│ │ │ │ │  ----> 7 plot = ds.t2m[0].plot(
│ │ │ │ │        8     cmap=plt.cm.coolwarm, transform=ccrs.PlateCarree(), cbar_kwargs=
│ │ │ │ │  {"shrink": 0.6}
│ │ │ │ │        9 )
│ │ │ │ │       10 plt.title("ERA5 - 2m temperature British Isles March 2019")
│ │ │ │ │  
│ │ │ │ │  NameError: name 'ds' is not defined
│ │ │ │ │ -Error in callback  (for
│ │ │ │ │ +Error in callback  (for
│ │ │ │ │  post_execute), with arguments args (),kwargs {}:
│ │ │ │ │  ---------------------------------------------------------------------------
│ │ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode,
│ │ │ │ │  parents, exist_ok)
│ │ │ │ │      723 try:
│ │ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │ │      725 except FileNotFoundError:
│ │ │ │ │  
│ │ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-
│ │ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-
│ │ │ │ │  build/.local/share/cartopy/shapefiles/natural_earth/physical'
│ │ │ │ │  
│ │ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │ │  
│ │ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode,
│ │ │ │ │  parents, exist_ok)
│ │ │ │ │      723 try:
│ │ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │ │      725 except FileNotFoundError:
│ │ │ │ │  
│ │ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-
│ │ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-
│ │ │ │ │  build/.local/share/cartopy/shapefiles/natural_earth'
│ │ │ │ │  
│ │ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │ │  
│ │ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode,
│ │ │ │ │  parents, exist_ok)
│ │ │ │ │      723 try:
│ │ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │ │      725 except FileNotFoundError:
│ │ │ │ │  
│ │ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-
│ │ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-
│ │ │ │ │  build/.local/share/cartopy/shapefiles'
│ │ │ │ │  
│ │ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │ │  
│ │ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode,
│ │ │ │ │  parents, exist_ok)
│ │ │ │ │      723 try:
│ │ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │ │      725 except FileNotFoundError:
│ │ │ │ │  
│ │ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-
│ │ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-
│ │ │ │ │  build/.local/share/cartopy'
│ │ │ │ │  
│ │ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │ │  
│ │ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode,
│ │ │ │ │  parents, exist_ok)
│ │ │ │ │      723 try:
│ │ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │ │      725 except FileNotFoundError:
│ │ │ │ │  
│ │ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-
│ │ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-
│ │ │ │ │  build/.local/share'
│ │ │ │ │  
│ │ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │ │  
│ │ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode,
│ │ │ │ │  parents, exist_ok)
│ │ │ │ │      723 try:
│ │ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │ │      725 except FileNotFoundError:
│ │ │ │ │  
│ │ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-
│ │ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-
│ │ │ │ │  build/.local'
│ │ │ │ │  
│ │ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │ │  
│ │ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode,
│ │ │ │ │  parents, exist_ok)
│ │ │ │ │      723 try:
│ │ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │ │      725 except FileNotFoundError:
│ │ │ │ │  
│ │ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-
│ │ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-
│ │ │ │ │  build'
│ │ │ │ │  
│ │ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │ │  
│ │ │ │ │  PermissionError                           Traceback (most recent call last)
│ │ │ │ │  File /usr/lib/python3/dist-packages/matplotlib/pyplot.py:197, in
│ │ │ │ │  _draw_all_if_interactive()
│ │ │ │ │ @@ -458,87 +458,87 @@
│ │ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode,
│ │ │ │ │  parents, exist_ok)
│ │ │ │ │      723 try:
│ │ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │ │      725 except FileNotFoundError:
│ │ │ │ │  
│ │ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-
│ │ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-
│ │ │ │ │  build/.local/share/cartopy/shapefiles/natural_earth/physical'
│ │ │ │ │  
│ │ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │ │  
│ │ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode,
│ │ │ │ │  parents, exist_ok)
│ │ │ │ │      723 try:
│ │ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │ │      725 except FileNotFoundError:
│ │ │ │ │  
│ │ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-
│ │ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-
│ │ │ │ │  build/.local/share/cartopy/shapefiles/natural_earth'
│ │ │ │ │  
│ │ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │ │  
│ │ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode,
│ │ │ │ │  parents, exist_ok)
│ │ │ │ │      723 try:
│ │ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │ │      725 except FileNotFoundError:
│ │ │ │ │  
│ │ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-
│ │ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-
│ │ │ │ │  build/.local/share/cartopy/shapefiles'
│ │ │ │ │  
│ │ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │ │  
│ │ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode,
│ │ │ │ │  parents, exist_ok)
│ │ │ │ │      723 try:
│ │ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │ │      725 except FileNotFoundError:
│ │ │ │ │  
│ │ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-
│ │ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-
│ │ │ │ │  build/.local/share/cartopy'
│ │ │ │ │  
│ │ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │ │  
│ │ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode,
│ │ │ │ │  parents, exist_ok)
│ │ │ │ │      723 try:
│ │ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │ │      725 except FileNotFoundError:
│ │ │ │ │  
│ │ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-
│ │ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-
│ │ │ │ │  build/.local/share'
│ │ │ │ │  
│ │ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │ │  
│ │ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode,
│ │ │ │ │  parents, exist_ok)
│ │ │ │ │      723 try:
│ │ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │ │      725 except FileNotFoundError:
│ │ │ │ │  
│ │ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-
│ │ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-
│ │ │ │ │  build/.local'
│ │ │ │ │  
│ │ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │ │  
│ │ │ │ │  FileNotFoundError                         Traceback (most recent call last)
│ │ │ │ │  File /usr/lib/python3.13/pathlib/_local.py:724, in Path.mkdir(self, mode,
│ │ │ │ │  parents, exist_ok)
│ │ │ │ │      723 try:
│ │ │ │ │  --> 724     os.mkdir(self, mode)
│ │ │ │ │      725 except FileNotFoundError:
│ │ │ │ │  
│ │ │ │ │ -FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/first-
│ │ │ │ │ +FileNotFoundError: [Errno 2] No such file or directory: '/nonexistent/second-
│ │ │ │ │  build'
│ │ │ │ │  
│ │ │ │ │  During handling of the above exception, another exception occurred:
│ │ │ │ │  
│ │ │ │ │  PermissionError                           Traceback (most recent call last)
│ │ │ │ │  File /usr/lib/python3/dist-packages/IPython/core/formatters.py:402, in
│ │ │ │ │  BaseFormatter.__call__(self, obj)
│ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/ERA5-GRIB-example.ipynb.gz
│ │ │ │ ├── ERA5-GRIB-example.ipynb
│ │ │ │ │ ├── Pretty-printed
│ │ │ │ │ │┄ Similarity: 0.9983703823622252%
│ │ │ │ │ │┄ Differences: {"'cells'": "{2: {'metadata': {'execution': {'iopub.execute_input': '2026-03-15T04:14:25.969341Z', "
│ │ │ │ │ │┄             "'iopub.status.busy': '2026-03-15T04:14:25.968321Z', 'iopub.status.idle': "
│ │ │ │ │ │┄             "'2026-03-15T04:14:27.342967Z', 'shell.execute_reply': "
│ │ │ │ │ │┄             "'2026-03-15T04:14:27.341813Z'}}}, 4: {'metadata': {'execution': "
│ │ │ │ │ │┄             "{'iopub.execute_input': '2026-03-15T04:14:27.346825Z', 'iopub.status.busy': "
│ │ │ │ │ │┄             "'2026-03-15T04:14:27.346378Z', 'iopub.status.idle': '2026-03-15T04:14:2 […]
│ │ │ │ │ │ @@ -15,18 +15,18 @@
│ │ │ │ │ │              ]
│ │ │ │ │ │          },
│ │ │ │ │ │          {
│ │ │ │ │ │              "cell_type": "code",
│ │ │ │ │ │              "execution_count": 1,
│ │ │ │ │ │              "metadata": {
│ │ │ │ │ │                  "execution": {
│ │ │ │ │ │ -                    "iopub.execute_input": "2025-02-09T21:17:35.061205Z",
│ │ │ │ │ │ -                    "iopub.status.busy": "2025-02-09T21:17:35.060907Z",
│ │ │ │ │ │ -                    "iopub.status.idle": "2025-02-09T21:17:36.781599Z",
│ │ │ │ │ │ -                    "shell.execute_reply": "2025-02-09T21:17:36.780891Z"
│ │ │ │ │ │ +                    "iopub.execute_input": "2026-03-15T04:14:25.969341Z",
│ │ │ │ │ │ +                    "iopub.status.busy": "2026-03-15T04:14:25.968321Z",
│ │ │ │ │ │ +                    "iopub.status.idle": "2026-03-15T04:14:27.342967Z",
│ │ │ │ │ │ +                    "shell.execute_reply": "2026-03-15T04:14:27.341813Z"
│ │ │ │ │ │                  }
│ │ │ │ │ │              },
│ │ │ │ │ │              "outputs": [
│ │ │ │ │ │                  {
│ │ │ │ │ │                      "name": "stderr",
│ │ │ │ │ │                      "output_type": "stream",
│ │ │ │ │ │                      "text": [
│ │ │ │ │ │ @@ -47,24 +47,24 @@
│ │ │ │ │ │              ]
│ │ │ │ │ │          },
│ │ │ │ │ │          {
│ │ │ │ │ │              "cell_type": "code",
│ │ │ │ │ │              "execution_count": 2,
│ │ │ │ │ │              "metadata": {
│ │ │ │ │ │                  "execution": {
│ │ │ │ │ │ -                    "iopub.execute_input": "2025-02-09T21:17:36.785323Z",
│ │ │ │ │ │ -                    "iopub.status.busy": "2025-02-09T21:17:36.784798Z",
│ │ │ │ │ │ -                    "iopub.status.idle": "2025-02-09T21:17:37.127713Z",
│ │ │ │ │ │ -                    "shell.execute_reply": "2025-02-09T21:17:37.126915Z"
│ │ │ │ │ │ +                    "iopub.execute_input": "2026-03-15T04:14:27.346825Z",
│ │ │ │ │ │ +                    "iopub.status.busy": "2026-03-15T04:14:27.346378Z",
│ │ │ │ │ │ +                    "iopub.status.idle": "2026-03-15T04:14:27.616026Z",
│ │ │ │ │ │ +                    "shell.execute_reply": "2026-03-15T04:14:27.615040Z"
│ │ │ │ │ │                  }
│ │ │ │ │ │              },
│ │ │ │ │ │              "outputs": [
│ │ │ │ │ │                  {
│ │ │ │ │ │                      "ename": "PermissionError",
│ │ │ │ │ │ -                    "evalue": "[Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.",
│ │ │ │ │ │ +                    "evalue": "[Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.",
│ │ │ │ │ │                      "output_type": "error",
│ │ │ │ │ │                      "traceback": [
│ │ │ │ │ │                          "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
│ │ │ │ │ │                          "\u001b[0;31mPermissionError\u001b[0m                           Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/utils.py:262\u001b[0m, in \u001b[0;36mmake_local_storage\u001b[0;34m(path, env)\u001b[0m\n\u001b[1;32m    258\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcreate\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m    259\u001b[0m     \u001b[38;5;66;03m# When running in parallel, it's possible that multiple jobs will\u001b[39;00m\n\u001b[1;32m    260\u001b[0m     \u001b[38;5;66;03m# try to create the path at the same time. Use exist_ok to avoid\u001b[39;00m\n\u001b[1;32m    261\u001b[0m     \u001b[38;5;66;03m# raising an error.\u001b[39;00m\n\u001b[0;32m--> 262\u001b[0m     \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m    263\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/os.py:217\u001b[0m, in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m    216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 217\u001b[0m     \u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhead\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexist_ok\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileExistsError\u001b[39;00m:\n\u001b[1;32m    219\u001b[0m     \u001b[38;5;66;03m# Defeats race condition when another thread created the path\u001b[39;00m\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/os.py:217\u001b[0m, in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m    216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 217\u001b[0m     \u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhead\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexist_ok\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileExistsError\u001b[39;00m:\n\u001b[1;32m    219\u001b[0m     \u001b[38;5;66;03m# Defeats race condition when another thread created the path\u001b[39;00m\n",
│ │ │ │ │ │ @@ -74,15 +74,15 @@
│ │ │ │ │ │                          "\nThe above exception was the direct cause of the following exception:\n",
│ │ │ │ │ │                          "\u001b[0;31mPermissionError\u001b[0m                           Traceback (most recent call last)",
│ │ │ │ │ │                          "Cell \u001b[0;32mIn[2], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m ds \u001b[38;5;241m=\u001b[39m \u001b[43mxr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtutorial\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mera5-2mt-2019-03-uk.grib\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mengine\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcfgrib\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/xarray/tutorial.py:213\u001b[0m, in \u001b[0;36mload_dataset\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    176\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mload_dataset\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dataset:\n\u001b[1;32m    177\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m    178\u001b[0m \u001b[38;5;124;03m    Open, load into memory, and close a dataset from the online repository\u001b[39;00m\n\u001b[1;32m    179\u001b[0m \u001b[38;5;124;03m    (requires internet).\u001b[39;00m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    211\u001b[0m \u001b[38;5;124;03m    load_dataset\u001b[39;00m\n\u001b[1;32m    212\u001b[0m \u001b[38;5;124;03m    \"\"\"\u001b[39;00m\n\u001b[0;32m--> 213\u001b[0m     \u001b[38;5;28;01mwith\u001b[39;00m \u001b[43mopen_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m ds:\n\u001b[1;32m    214\u001b[0m         \u001b[38;5;28;01mreturn\u001b[39;00m ds\u001b[38;5;241m.\u001b[39mload()\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/xarray/tutorial.py:165\u001b[0m, in \u001b[0;36mopen_dataset\u001b[0;34m(name, cache, cache_dir, engine, **kws)\u001b[0m\n\u001b[1;32m    162\u001b[0m downloader \u001b[38;5;241m=\u001b[39m pooch\u001b[38;5;241m.\u001b[39mHTTPDownloader(headers\u001b[38;5;241m=\u001b[39mheaders)\n\u001b[1;32m    164\u001b[0m \u001b[38;5;66;03m# retrieve the file\u001b[39;00m\n\u001b[0;32m--> 165\u001b[0m filepath \u001b[38;5;241m=\u001b[39m \u001b[43mpooch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mretrieve\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    166\u001b[0m \u001b[43m    \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mknown_hash\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcache_dir\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdownloader\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdownloader\u001b[49m\n\u001b[1;32m    167\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    168\u001b[0m ds \u001b[38;5;241m=\u001b[39m _open_dataset(filepath, engine\u001b[38;5;241m=\u001b[39mengine, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkws)\n\u001b[1;32m    169\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m cache:\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/core.py:227\u001b[0m, in \u001b[0;36mretrieve\u001b[0;34m(url, known_hash, fname, path, processor, downloader, progressbar)\u001b[0m\n\u001b[1;32m    222\u001b[0m action, verb \u001b[38;5;241m=\u001b[39m download_action(full_path, known_hash)\n\u001b[1;32m    224\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action \u001b[38;5;129;01min\u001b[39;00m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdownload\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mupdate\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m    225\u001b[0m     \u001b[38;5;66;03m# We need to write data, so create the local data directory if it\u001b[39;00m\n\u001b[1;32m    226\u001b[0m     \u001b[38;5;66;03m# doesn't already exist.\u001b[39;00m\n\u001b[0;32m--> 227\u001b[0m     \u001b[43mmake_local_storage\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    229\u001b[0m     get_logger()\u001b[38;5;241m.\u001b[39minfo(\n\u001b[1;32m    230\u001b[0m         \u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m data from \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to file \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m    231\u001b[0m         verb,\n\u001b[1;32m    232\u001b[0m         url,\n\u001b[1;32m    233\u001b[0m         \u001b[38;5;28mstr\u001b[39m(full_path),\n\u001b[1;32m    234\u001b[0m     )\n\u001b[1;32m    236\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m downloader \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/utils.py:276\u001b[0m, in \u001b[0;36mmake_local_storage\u001b[0;34m(path, env)\u001b[0m\n\u001b[1;32m    272\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m env \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m    273\u001b[0m     message\u001b[38;5;241m.\u001b[39mappend(\n\u001b[1;32m    274\u001b[0m         \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUse environment variable \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00menv\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to specify a different location.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m    275\u001b[0m     )\n\u001b[0;32m--> 276\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mPermissionError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(message)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merror\u001b[39;00m\n",
│ │ │ │ │ │ -                        "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files."
│ │ │ │ │ │ +                        "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files."
│ │ │ │ │ │                      ]
│ │ │ │ │ │                  }
│ │ │ │ │ │              ],
│ │ │ │ │ │              "source": [
│ │ │ │ │ │                  "ds = xr.tutorial.load_dataset(\"era5-2mt-2019-03-uk.grib\", engine=\"cfgrib\")"
│ │ │ │ │ │              ]
│ │ │ │ │ │          },
│ │ │ │ │ │ @@ -94,18 +94,18 @@
│ │ │ │ │ │              ]
│ │ │ │ │ │          },
│ │ │ │ │ │          {
│ │ │ │ │ │              "cell_type": "code",
│ │ │ │ │ │              "execution_count": 3,
│ │ │ │ │ │              "metadata": {
│ │ │ │ │ │                  "execution": {
│ │ │ │ │ │ -                    "iopub.execute_input": "2025-02-09T21:17:37.131140Z",
│ │ │ │ │ │ -                    "iopub.status.busy": "2025-02-09T21:17:37.130849Z",
│ │ │ │ │ │ -                    "iopub.status.idle": "2025-02-09T21:17:37.149772Z",
│ │ │ │ │ │ -                    "shell.execute_reply": "2025-02-09T21:17:37.149022Z"
│ │ │ │ │ │ +                    "iopub.execute_input": "2026-03-15T04:14:27.620381Z",
│ │ │ │ │ │ +                    "iopub.status.busy": "2026-03-15T04:14:27.620102Z",
│ │ │ │ │ │ +                    "iopub.status.idle": "2026-03-15T04:14:27.634855Z",
│ │ │ │ │ │ +                    "shell.execute_reply": "2026-03-15T04:14:27.633986Z"
│ │ │ │ │ │                  }
│ │ │ │ │ │              },
│ │ │ │ │ │              "outputs": [
│ │ │ │ │ │                  {
│ │ │ │ │ │                      "ename": "NameError",
│ │ │ │ │ │                      "evalue": "name 'ds' is not defined",
│ │ │ │ │ │                      "output_type": "error",
│ │ │ │ │ │ @@ -130,18 +130,18 @@
│ │ │ │ │ │              ]
│ │ │ │ │ │          },
│ │ │ │ │ │          {
│ │ │ │ │ │              "cell_type": "code",
│ │ │ │ │ │              "execution_count": 4,
│ │ │ │ │ │              "metadata": {
│ │ │ │ │ │                  "execution": {
│ │ │ │ │ │ -                    "iopub.execute_input": "2025-02-09T21:17:37.153344Z",
│ │ │ │ │ │ -                    "iopub.status.busy": "2025-02-09T21:17:37.153035Z",
│ │ │ │ │ │ -                    "iopub.status.idle": "2025-02-09T21:17:38.694680Z",
│ │ │ │ │ │ -                    "shell.execute_reply": "2025-02-09T21:17:38.693804Z"
│ │ │ │ │ │ +                    "iopub.execute_input": "2026-03-15T04:14:27.638257Z",
│ │ │ │ │ │ +                    "iopub.status.busy": "2026-03-15T04:14:27.637978Z",
│ │ │ │ │ │ +                    "iopub.status.idle": "2026-03-15T04:14:28.978184Z",
│ │ │ │ │ │ +                    "shell.execute_reply": "2026-03-15T04:14:28.976211Z"
│ │ │ │ │ │                  }
│ │ │ │ │ │              },
│ │ │ │ │ │              "outputs": [
│ │ │ │ │ │                  {
│ │ │ │ │ │                      "ename": "NameError",
│ │ │ │ │ │                      "evalue": "name 'ds' is not defined",
│ │ │ │ │ │                      "output_type": "error",
│ │ │ │ │ │ @@ -152,50 +152,50 @@
│ │ │ │ │ │                          "\u001b[0;31mNameError\u001b[0m: name 'ds' is not defined"
│ │ │ │ │ │                      ]
│ │ │ │ │ │                  },
│ │ │ │ │ │                  {
│ │ │ │ │ │                      "name": "stdout",
│ │ │ │ │ │                      "output_type": "stream",
│ │ │ │ │ │                      "text": [
│ │ │ │ │ │ -                        "Error in callback  (for post_execute), with arguments args (),kwargs {}:\n"
│ │ │ │ │ │ +                        "Error in callback  (for post_execute), with arguments args (),kwargs {}:\n"
│ │ │ │ │ │                      ]
│ │ │ │ │ │                  },
│ │ │ │ │ │                  {
│ │ │ │ │ │                      "ename": "PermissionError",
│ │ │ │ │ │                      "evalue": "[Errno 13] Permission denied: '/nonexistent'",
│ │ │ │ │ │                      "output_type": "error",
│ │ │ │ │ │                      "traceback": [
│ │ │ │ │ │                          "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
│ │ │ │ │ │                          "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/pathlib/_local.py:724\u001b[0m, in \u001b[0;36mPath.mkdir\u001b[0;34m(self, mode, parents, exist_ok)\u001b[0m\n\u001b[1;32m    723\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 724\u001b[0m     \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmkdir\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    725\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m:\n",
│ │ │ │ │ │ -                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share/cartopy/shapefiles/natural_earth/physical'",
│ │ │ │ │ │ +                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share/cartopy/shapefiles/natural_earth/physical'",
│ │ │ │ │ │                          "\nDuring handling of the above exception, another exception occurred:\n",
│ │ │ │ │ │                          "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/pathlib/_local.py:724\u001b[0m, in \u001b[0;36mPath.mkdir\u001b[0;34m(self, mode, parents, exist_ok)\u001b[0m\n\u001b[1;32m    723\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 724\u001b[0m     \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmkdir\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    725\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m:\n",
│ │ │ │ │ │ -                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share/cartopy/shapefiles/natural_earth'",
│ │ │ │ │ │ +                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share/cartopy/shapefiles/natural_earth'",
│ │ │ │ │ │                          "\nDuring handling of the above exception, another exception occurred:\n",
│ │ │ │ │ │                          "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/pathlib/_local.py:724\u001b[0m, in \u001b[0;36mPath.mkdir\u001b[0;34m(self, mode, parents, exist_ok)\u001b[0m\n\u001b[1;32m    723\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 724\u001b[0m     \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmkdir\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    725\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m:\n",
│ │ │ │ │ │ -                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share/cartopy/shapefiles'",
│ │ │ │ │ │ +                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share/cartopy/shapefiles'",
│ │ │ │ │ │                          "\nDuring handling of the above exception, another exception occurred:\n",
│ │ │ │ │ │                          "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/pathlib/_local.py:724\u001b[0m, in \u001b[0;36mPath.mkdir\u001b[0;34m(self, mode, parents, exist_ok)\u001b[0m\n\u001b[1;32m    723\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 724\u001b[0m     \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmkdir\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    725\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m:\n",
│ │ │ │ │ │ -                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share/cartopy'",
│ │ │ │ │ │ +                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share/cartopy'",
│ │ │ │ │ │                          "\nDuring handling of the above exception, another exception occurred:\n",
│ │ │ │ │ │                          "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/pathlib/_local.py:724\u001b[0m, in \u001b[0;36mPath.mkdir\u001b[0;34m(self, mode, parents, exist_ok)\u001b[0m\n\u001b[1;32m    723\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 724\u001b[0m     \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmkdir\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    725\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m:\n",
│ │ │ │ │ │ -                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share'",
│ │ │ │ │ │ +                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share'",
│ │ │ │ │ │                          "\nDuring handling of the above exception, another exception occurred:\n",
│ │ │ │ │ │                          "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/pathlib/_local.py:724\u001b[0m, in \u001b[0;36mPath.mkdir\u001b[0;34m(self, mode, parents, exist_ok)\u001b[0m\n\u001b[1;32m    723\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 724\u001b[0m     \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmkdir\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    725\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m:\n",
│ │ │ │ │ │ -                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/first-build/.local'",
│ │ │ │ │ │ +                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/second-build/.local'",
│ │ │ │ │ │                          "\nDuring handling of the above exception, another exception occurred:\n",
│ │ │ │ │ │                          "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/pathlib/_local.py:724\u001b[0m, in \u001b[0;36mPath.mkdir\u001b[0;34m(self, mode, parents, exist_ok)\u001b[0m\n\u001b[1;32m    723\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 724\u001b[0m     \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmkdir\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    725\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m:\n",
│ │ │ │ │ │ -                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/first-build'",
│ │ │ │ │ │ +                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/second-build'",
│ │ │ │ │ │                          "\nDuring handling of the above exception, another exception occurred:\n",
│ │ │ │ │ │                          "\u001b[0;31mPermissionError\u001b[0m                           Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/matplotlib/pyplot.py:197\u001b[0m, in \u001b[0;36m_draw_all_if_interactive\u001b[0;34m()\u001b[0m\n\u001b[1;32m    195\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_draw_all_if_interactive\u001b[39m() \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m    196\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m matplotlib\u001b[38;5;241m.\u001b[39mis_interactive():\n\u001b[0;32m--> 197\u001b[0m         \u001b[43mdraw_all\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/matplotlib/_pylab_helpers.py:132\u001b[0m, in \u001b[0;36mGcf.draw_all\u001b[0;34m(cls, force)\u001b[0m\n\u001b[1;32m    130\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m manager \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mcls\u001b[39m\u001b[38;5;241m.\u001b[39mget_all_fig_managers():\n\u001b[1;32m    131\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m force \u001b[38;5;129;01mor\u001b[39;00m manager\u001b[38;5;241m.\u001b[39mcanvas\u001b[38;5;241m.\u001b[39mfigure\u001b[38;5;241m.\u001b[39mstale:\n\u001b[0;32m--> 132\u001b[0m         \u001b[43mmanager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcanvas\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw_idle\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/matplotlib/backend_bases.py:1893\u001b[0m, in \u001b[0;36mFigureCanvasBase.draw_idle\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m   1891\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_is_idle_drawing:\n\u001b[1;32m   1892\u001b[0m     \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_idle_draw_cntx():\n\u001b[0;32m-> 1893\u001b[0m         \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/matplotlib/backends/backend_agg.py:388\u001b[0m, in \u001b[0;36mFigureCanvasAgg.draw\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    385\u001b[0m \u001b[38;5;66;03m# Acquire a lock on the shared font cache.\u001b[39;00m\n\u001b[1;32m    386\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoolbar\u001b[38;5;241m.\u001b[39m_wait_cursor_for_draw_cm() \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtoolbar\n\u001b[1;32m    387\u001b[0m       \u001b[38;5;28;01melse\u001b[39;00m nullcontext()):\n\u001b[0;32m--> 388\u001b[0m     \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfigure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    389\u001b[0m     \u001b[38;5;66;03m# A GUI class may be need to update a window using this draw, so\u001b[39;00m\n\u001b[1;32m    390\u001b[0m     \u001b[38;5;66;03m# don't forget to call the superclass.\u001b[39;00m\n\u001b[1;32m    391\u001b[0m     \u001b[38;5;28msuper\u001b[39m()\u001b[38;5;241m.\u001b[39mdraw()\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/matplotlib/artist.py:95\u001b[0m, in \u001b[0;36m_finalize_rasterization..draw_wrapper\u001b[0;34m(artist, renderer, *args, **kwargs)\u001b[0m\n\u001b[1;32m     93\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(draw)\n\u001b[1;32m     94\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdraw_wrapper\u001b[39m(artist, renderer, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m---> 95\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     96\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m renderer\u001b[38;5;241m.\u001b[39m_rasterizing:\n\u001b[1;32m     97\u001b[0m         renderer\u001b[38;5;241m.\u001b[39mstop_rasterizing()\n",
│ │ │ │ │ │ @@ -227,39 +227,39 @@
│ │ │ │ │ │                      "ename": "PermissionError",
│ │ │ │ │ │                      "evalue": "[Errno 13] Permission denied: '/nonexistent'",
│ │ │ │ │ │                      "output_type": "error",
│ │ │ │ │ │                      "traceback": [
│ │ │ │ │ │                          "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
│ │ │ │ │ │                          "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/pathlib/_local.py:724\u001b[0m, in \u001b[0;36mPath.mkdir\u001b[0;34m(self, mode, parents, exist_ok)\u001b[0m\n\u001b[1;32m    723\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 724\u001b[0m     \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmkdir\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    725\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m:\n",
│ │ │ │ │ │ -                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share/cartopy/shapefiles/natural_earth/physical'",
│ │ │ │ │ │ +                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share/cartopy/shapefiles/natural_earth/physical'",
│ │ │ │ │ │                          "\nDuring handling of the above exception, another exception occurred:\n",
│ │ │ │ │ │                          "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/pathlib/_local.py:724\u001b[0m, in \u001b[0;36mPath.mkdir\u001b[0;34m(self, mode, parents, exist_ok)\u001b[0m\n\u001b[1;32m    723\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 724\u001b[0m     \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmkdir\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    725\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m:\n",
│ │ │ │ │ │ -                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share/cartopy/shapefiles/natural_earth'",
│ │ │ │ │ │ +                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share/cartopy/shapefiles/natural_earth'",
│ │ │ │ │ │                          "\nDuring handling of the above exception, another exception occurred:\n",
│ │ │ │ │ │                          "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/pathlib/_local.py:724\u001b[0m, in \u001b[0;36mPath.mkdir\u001b[0;34m(self, mode, parents, exist_ok)\u001b[0m\n\u001b[1;32m    723\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 724\u001b[0m     \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmkdir\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    725\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m:\n",
│ │ │ │ │ │ -                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share/cartopy/shapefiles'",
│ │ │ │ │ │ +                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share/cartopy/shapefiles'",
│ │ │ │ │ │                          "\nDuring handling of the above exception, another exception occurred:\n",
│ │ │ │ │ │                          "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/pathlib/_local.py:724\u001b[0m, in \u001b[0;36mPath.mkdir\u001b[0;34m(self, mode, parents, exist_ok)\u001b[0m\n\u001b[1;32m    723\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 724\u001b[0m     \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmkdir\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    725\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m:\n",
│ │ │ │ │ │ -                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share/cartopy'",
│ │ │ │ │ │ +                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share/cartopy'",
│ │ │ │ │ │                          "\nDuring handling of the above exception, another exception occurred:\n",
│ │ │ │ │ │                          "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/pathlib/_local.py:724\u001b[0m, in \u001b[0;36mPath.mkdir\u001b[0;34m(self, mode, parents, exist_ok)\u001b[0m\n\u001b[1;32m    723\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 724\u001b[0m     \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmkdir\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    725\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m:\n",
│ │ │ │ │ │ -                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/first-build/.local/share'",
│ │ │ │ │ │ +                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/second-build/.local/share'",
│ │ │ │ │ │                          "\nDuring handling of the above exception, another exception occurred:\n",
│ │ │ │ │ │                          "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/pathlib/_local.py:724\u001b[0m, in \u001b[0;36mPath.mkdir\u001b[0;34m(self, mode, parents, exist_ok)\u001b[0m\n\u001b[1;32m    723\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 724\u001b[0m     \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmkdir\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    725\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m:\n",
│ │ │ │ │ │ -                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/first-build/.local'",
│ │ │ │ │ │ +                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/second-build/.local'",
│ │ │ │ │ │                          "\nDuring handling of the above exception, another exception occurred:\n",
│ │ │ │ │ │                          "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/pathlib/_local.py:724\u001b[0m, in \u001b[0;36mPath.mkdir\u001b[0;34m(self, mode, parents, exist_ok)\u001b[0m\n\u001b[1;32m    723\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 724\u001b[0m     \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmkdir\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    725\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileNotFoundError\u001b[39;00m:\n",
│ │ │ │ │ │ -                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/first-build'",
│ │ │ │ │ │ +                        "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '/nonexistent/second-build'",
│ │ │ │ │ │                          "\nDuring handling of the above exception, another exception occurred:\n",
│ │ │ │ │ │                          "\u001b[0;31mPermissionError\u001b[0m                           Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/IPython/core/formatters.py:402\u001b[0m, in \u001b[0;36mBaseFormatter.__call__\u001b[0;34m(self, obj)\u001b[0m\n\u001b[1;32m    400\u001b[0m     \u001b[38;5;28;01mpass\u001b[39;00m\n\u001b[1;32m    401\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 402\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mprinter\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    403\u001b[0m \u001b[38;5;66;03m# Finally look for special method names\u001b[39;00m\n\u001b[1;32m    404\u001b[0m method \u001b[38;5;241m=\u001b[39m get_real_method(obj, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprint_method)\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/IPython/core/pylabtools.py:170\u001b[0m, in \u001b[0;36mprint_figure\u001b[0;34m(fig, fmt, bbox_inches, base64, **kwargs)\u001b[0m\n\u001b[1;32m    167\u001b[0m     \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mmatplotlib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mbackend_bases\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m FigureCanvasBase\n\u001b[1;32m    168\u001b[0m     FigureCanvasBase(fig)\n\u001b[0;32m--> 170\u001b[0m \u001b[43mfig\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcanvas\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mprint_figure\u001b[49m\u001b[43m(\u001b[49m\u001b[43mbytes_io\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkw\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    171\u001b[0m data \u001b[38;5;241m=\u001b[39m bytes_io\u001b[38;5;241m.\u001b[39mgetvalue()\n\u001b[1;32m    172\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m fmt \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124msvg\u001b[39m\u001b[38;5;124m'\u001b[39m:\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/matplotlib/backend_bases.py:2164\u001b[0m, in \u001b[0;36mFigureCanvasBase.print_figure\u001b[0;34m(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, pad_inches, bbox_extra_artists, backend, **kwargs)\u001b[0m\n\u001b[1;32m   2161\u001b[0m     \u001b[38;5;66;03m# we do this instead of `self.figure.draw_without_rendering`\u001b[39;00m\n\u001b[1;32m   2162\u001b[0m     \u001b[38;5;66;03m# so that we can inject the orientation\u001b[39;00m\n\u001b[1;32m   2163\u001b[0m     \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mgetattr\u001b[39m(renderer, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m_draw_disabled\u001b[39m\u001b[38;5;124m\"\u001b[39m, nullcontext)():\n\u001b[0;32m-> 2164\u001b[0m         \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfigure\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m   2165\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m bbox_inches:\n\u001b[1;32m   2166\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m bbox_inches \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtight\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/matplotlib/artist.py:95\u001b[0m, in \u001b[0;36m_finalize_rasterization..draw_wrapper\u001b[0;34m(artist, renderer, *args, **kwargs)\u001b[0m\n\u001b[1;32m     93\u001b[0m \u001b[38;5;129m@wraps\u001b[39m(draw)\n\u001b[1;32m     94\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdraw_wrapper\u001b[39m(artist, renderer, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m---> 95\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     96\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m renderer\u001b[38;5;241m.\u001b[39m_rasterizing:\n\u001b[1;32m     97\u001b[0m         renderer\u001b[38;5;241m.\u001b[39mstop_rasterizing()\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/matplotlib/artist.py:72\u001b[0m, in \u001b[0;36mallow_rasterization..draw_wrapper\u001b[0;34m(artist, renderer)\u001b[0m\n\u001b[1;32m     69\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m     70\u001b[0m         renderer\u001b[38;5;241m.\u001b[39mstart_filter()\n\u001b[0;32m---> 72\u001b[0m     \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mdraw\u001b[49m\u001b[43m(\u001b[49m\u001b[43martist\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrenderer\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m     73\u001b[0m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[1;32m     74\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m artist\u001b[38;5;241m.\u001b[39mget_agg_filter() \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
│ │ │ │ │ │ @@ -317,18 +317,18 @@
│ │ │ │ │ │              ]
│ │ │ │ │ │          },
│ │ │ │ │ │          {
│ │ │ │ │ │              "cell_type": "code",
│ │ │ │ │ │              "execution_count": 5,
│ │ │ │ │ │              "metadata": {
│ │ │ │ │ │                  "execution": {
│ │ │ │ │ │ -                    "iopub.execute_input": "2025-02-09T21:17:38.699047Z",
│ │ │ │ │ │ -                    "iopub.status.busy": "2025-02-09T21:17:38.698755Z",
│ │ │ │ │ │ -                    "iopub.status.idle": "2025-02-09T21:17:38.752293Z",
│ │ │ │ │ │ -                    "shell.execute_reply": "2025-02-09T21:17:38.736440Z"
│ │ │ │ │ │ +                    "iopub.execute_input": "2026-03-15T04:14:28.984419Z",
│ │ │ │ │ │ +                    "iopub.status.busy": "2026-03-15T04:14:28.983154Z",
│ │ │ │ │ │ +                    "iopub.status.idle": "2026-03-15T04:14:29.014879Z",
│ │ │ │ │ │ +                    "shell.execute_reply": "2026-03-15T04:14:29.013426Z"
│ │ │ │ │ │                  }
│ │ │ │ │ │              },
│ │ │ │ │ │              "outputs": [
│ │ │ │ │ │                  {
│ │ │ │ │ │                      "ename": "NameError",
│ │ │ │ │ │                      "evalue": "name 'ds' is not defined",
│ │ │ │ │ │                      "output_type": "error",
│ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/ROMS_ocean_model.html
│ │ │ │ @@ -191,15 +191,15 @@
│ │ │ │  File /usr/lib/python3/dist-packages/pooch/utils.py:276, in make_local_storage(path, env)
│ │ │ │      272 if env is not None:
│ │ │ │      273     message.append(
│ │ │ │      274         f"Use environment variable '{env}' to specify a different location."
│ │ │ │      275     )
│ │ │ │  --> 276 raise PermissionError(" ".join(message)) from error
│ │ │ │  
│ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
│ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
│ │ │ │  
│ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │

Add a lazilly calculated vertical coordinates

│ │ │ │

Write equations to calculate the vertical coordinate. These will be only evaluated when data is requested. Information about the ROMS vertical coordinate can be found (here)[https://www.myroms.org/wiki/Vertical_S-coordinate]

│ │ │ │

In short, for Vtransform==2 as used in this example,

│ │ │ │ ├── html2text {} │ │ │ │ │ @@ -131,15 +131,15 @@ │ │ │ │ │ 273 message.append( │ │ │ │ │ 274 f"Use environment variable '{env}' to specify a different │ │ │ │ │ location." │ │ │ │ │ 275 ) │ │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ │ │ PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/ │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/ │ │ │ │ │ xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ ********** AAdddd aa llaazziillllyy ccaallccuullaatteedd vveerrttiiccaall ccoooorrddiinnaatteess_?¶ ********** │ │ │ │ │ Write equations to calculate the vertical coordinate. These will be only │ │ │ │ │ evaluated when data is requested. Information about the ROMS vertical │ │ │ │ │ coordinate can be found (here)[_h_t_t_p_s_:_/_/_w_w_w_._m_y_r_o_m_s_._o_r_g_/_w_i_k_i_/_V_e_r_t_i_c_a_l___S_- │ │ │ │ │ _c_o_o_r_d_i_n_a_t_e] │ │ │ │ │ In short, for Vtransform==2 as used in this example, │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/ROMS_ocean_model.ipynb.gz │ │ │ │ ├── ROMS_ocean_model.ipynb │ │ │ │ │ ├── Pretty-printed │ │ │ │ │ │┄ Similarity: 0.9987017463235294% │ │ │ │ │ │┄ Differences: {"'cells'": "{2: {'metadata': {'execution': {'iopub.execute_input': '2026-03-15T04:14:32.284744Z', " │ │ │ │ │ │┄ "'iopub.status.busy': '2026-03-15T04:14:32.283093Z', 'iopub.status.idle': " │ │ │ │ │ │┄ "'2026-03-15T04:14:33.159292Z', 'shell.execute_reply': " │ │ │ │ │ │┄ "'2026-03-15T04:14:33.158038Z'}}}, 5: {'metadata': {'execution': " │ │ │ │ │ │┄ "{'iopub.execute_input': '2026-03-15T04:14:33.163396Z', 'iopub.status.busy': " │ │ │ │ │ │┄ "'2026-03-15T04:14:33.162933Z', 'iopub.status.idle': '2026-03-15T04:14:3 […] │ │ │ │ │ │ @@ -17,18 +17,18 @@ │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": 1, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:43.597175Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:43.596894Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:45.369270Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:45.368527Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:32.284744Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:32.283093Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:33.159292Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:33.158038Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "import numpy as np\n", │ │ │ │ │ │ "import cartopy.crs as ccrs\n", │ │ │ │ │ │ "import cartopy.feature as cfeature\n", │ │ │ │ │ │ @@ -75,24 +75,24 @@ │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": 2, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:45.389361Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:45.388861Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:46.102494Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:46.100278Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:33.163396Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:33.162933Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:33.429760Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:33.428777Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "PermissionError", │ │ │ │ │ │ - "evalue": "[Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.", │ │ │ │ │ │ + "evalue": "[Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ "traceback": [ │ │ │ │ │ │ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", │ │ │ │ │ │ "\u001b[0;31mPermissionError\u001b[0m Traceback (most recent call last)", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/utils.py:262\u001b[0m, in \u001b[0;36mmake_local_storage\u001b[0;34m(path, env)\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcreate\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 259\u001b[0m \u001b[38;5;66;03m# When running in parallel, it's possible that multiple jobs will\u001b[39;00m\n\u001b[1;32m 260\u001b[0m \u001b[38;5;66;03m# try to create the path at the same time. Use exist_ok to avoid\u001b[39;00m\n\u001b[1;32m 261\u001b[0m \u001b[38;5;66;03m# raising an error.\u001b[39;00m\n\u001b[0;32m--> 262\u001b[0m \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 263\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3.13/os.py:217\u001b[0m, in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 217\u001b[0m \u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhead\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexist_ok\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileExistsError\u001b[39;00m:\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# Defeats race condition when another thread created the path\u001b[39;00m\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3.13/os.py:217\u001b[0m, in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 217\u001b[0m \u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhead\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexist_ok\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileExistsError\u001b[39;00m:\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# Defeats race condition when another thread created the path\u001b[39;00m\n", │ │ │ │ │ │ @@ -101,15 +101,15 @@ │ │ │ │ │ │ "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent'", │ │ │ │ │ │ "\nThe above exception was the direct cause of the following exception:\n", │ │ │ │ │ │ "\u001b[0;31mPermissionError\u001b[0m Traceback (most recent call last)", │ │ │ │ │ │ "Cell \u001b[0;32mIn[2], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# load in the file\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m ds \u001b[38;5;241m=\u001b[39m \u001b[43mxr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtutorial\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mopen_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mROMS_example.nc\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mchunks\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m{\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mocean_time\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m}\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 4\u001b[0m \u001b[38;5;66;03m# This is a way to turn on chunking and lazy evaluation. Opening with mfdataset, or\u001b[39;00m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;66;03m# setting the chunking in the open_dataset would also achieve this.\u001b[39;00m\n\u001b[1;32m 6\u001b[0m ds\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/xarray/tutorial.py:165\u001b[0m, in \u001b[0;36mopen_dataset\u001b[0;34m(name, cache, cache_dir, engine, **kws)\u001b[0m\n\u001b[1;32m 162\u001b[0m downloader \u001b[38;5;241m=\u001b[39m pooch\u001b[38;5;241m.\u001b[39mHTTPDownloader(headers\u001b[38;5;241m=\u001b[39mheaders)\n\u001b[1;32m 164\u001b[0m \u001b[38;5;66;03m# retrieve the file\u001b[39;00m\n\u001b[0;32m--> 165\u001b[0m filepath \u001b[38;5;241m=\u001b[39m \u001b[43mpooch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mretrieve\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 166\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mknown_hash\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcache_dir\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdownloader\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdownloader\u001b[49m\n\u001b[1;32m 167\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 168\u001b[0m ds \u001b[38;5;241m=\u001b[39m _open_dataset(filepath, engine\u001b[38;5;241m=\u001b[39mengine, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkws)\n\u001b[1;32m 169\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m cache:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/core.py:227\u001b[0m, in \u001b[0;36mretrieve\u001b[0;34m(url, known_hash, fname, path, processor, downloader, progressbar)\u001b[0m\n\u001b[1;32m 222\u001b[0m action, verb \u001b[38;5;241m=\u001b[39m download_action(full_path, known_hash)\n\u001b[1;32m 224\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action \u001b[38;5;129;01min\u001b[39;00m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdownload\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mupdate\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m 225\u001b[0m \u001b[38;5;66;03m# We need to write data, so create the local data directory if it\u001b[39;00m\n\u001b[1;32m 226\u001b[0m \u001b[38;5;66;03m# doesn't already exist.\u001b[39;00m\n\u001b[0;32m--> 227\u001b[0m \u001b[43mmake_local_storage\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 229\u001b[0m get_logger()\u001b[38;5;241m.\u001b[39minfo(\n\u001b[1;32m 230\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m data from \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to file \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 231\u001b[0m verb,\n\u001b[1;32m 232\u001b[0m url,\n\u001b[1;32m 233\u001b[0m \u001b[38;5;28mstr\u001b[39m(full_path),\n\u001b[1;32m 234\u001b[0m )\n\u001b[1;32m 236\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m downloader \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/utils.py:276\u001b[0m, in \u001b[0;36mmake_local_storage\u001b[0;34m(path, env)\u001b[0m\n\u001b[1;32m 272\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m env \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 273\u001b[0m message\u001b[38;5;241m.\u001b[39mappend(\n\u001b[1;32m 274\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUse environment variable \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00menv\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to specify a different location.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 275\u001b[0m )\n\u001b[0;32m--> 276\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mPermissionError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(message)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merror\u001b[39;00m\n", │ │ │ │ │ │ - "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files." │ │ │ │ │ │ + "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files." │ │ │ │ │ │ ] │ │ │ │ │ │ } │ │ │ │ │ │ ], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "# load in the file\n", │ │ │ │ │ │ "ds = xr.tutorial.open_dataset(\"ROMS_example.nc\", chunks={\"ocean_time\": 1})\n", │ │ │ │ │ │ "\n", │ │ │ │ │ │ @@ -136,18 +136,18 @@ │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": 3, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:46.117258Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:46.116925Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:46.157190Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:46.156341Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:33.433648Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:33.433371Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:33.451806Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:33.450869Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -181,18 +181,18 @@ │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": 4, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:46.160531Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:46.160235Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:46.197441Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:46.196270Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:33.455105Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:33.454822Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:33.469420Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:33.468597Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "scrolled": false │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds' is not defined", │ │ │ │ │ │ @@ -217,18 +217,18 @@ │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": 5, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:46.200770Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:46.200467Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:46.233545Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:46.232282Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:33.473483Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:33.473190Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:33.488887Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:33.487988Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -256,18 +256,18 @@ │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": 6, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:46.236881Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:46.236595Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:46.269461Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:46.268271Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:33.492485Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:33.492206Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:33.507588Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:33.506832Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -291,18 +291,18 @@ │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": 7, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:46.272747Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:46.272457Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:46.465497Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:46.464350Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:33.511119Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:33.510833Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:33.595411Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:33.594648Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/apply_ufunc_vectorize_1d.html │ │ │ │ @@ -185,15 +185,15 @@ │ │ │ │ File /usr/lib/python3/dist-packages/pooch/utils.py:276, in make_local_storage(path, env) │ │ │ │ 272 if env is not None: │ │ │ │ 273 message.append( │ │ │ │ 274 f"Use environment variable '{env}' to specify a different location." │ │ │ │ 275 ) │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ │ │ │ │ │ │ │

The function we will apply is np.interp which expects 1D numpy arrays. This functionality is already implemented in xarray so we use that capability to make sure we are not making mistakes.

│ │ │ │
│ │ │ │
[2]:
│ │ │ │  
│ │ │ │
│ │ │ │ ├── html2text {} │ │ │ │ │ @@ -123,15 +123,15 @@ │ │ │ │ │ 273 message.append( │ │ │ │ │ 274 f"Use environment variable '{env}' to specify a different │ │ │ │ │ location." │ │ │ │ │ 275 ) │ │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ │ │ PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/ │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/ │ │ │ │ │ xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ The function we will apply is np.interp which expects 1D numpy arrays. This │ │ │ │ │ functionality is already implemented in xarray so we use that capability to │ │ │ │ │ make sure we are not making mistakes. │ │ │ │ │ [2]: │ │ │ │ │ newlat = np.linspace(15, 75, 100) │ │ │ │ │ air.interp(lat=newlat) │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/apply_ufunc_vectorize_1d.ipynb.gz │ │ │ │ ├── apply_ufunc_vectorize_1d.ipynb │ │ │ │ │ ├── Pretty-printed │ │ │ │ │ │┄ Similarity: 0.9993857604017217% │ │ │ │ │ │┄ Differences: {"'cells'": "{2: {'metadata': {'execution': {'iopub.execute_input': '2026-03-15T04:14:36.285928Z', " │ │ │ │ │ │┄ "'iopub.status.busy': '2026-03-15T04:14:36.285661Z', 'iopub.status.idle': " │ │ │ │ │ │┄ "'2026-03-15T04:14:37.239271Z', 'shell.execute_reply': " │ │ │ │ │ │┄ '\'2026-03-15T04:14:37.238378Z\'}}, \'outputs\': {0: {\'evalue\': "[Errno 13] ' │ │ │ │ │ │┄ "Permission denied: '/nonexistent' | Pooch could not create data cache folder " │ │ │ │ │ │┄ "'/nonexistent/second-build/.cache/xarray_tutorial_data'. […] │ │ │ │ │ │ @@ -36,24 +36,24 @@ │ │ │ │ │ │ "execution_count": 1, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-15T14:45:51.659160Z", │ │ │ │ │ │ "start_time": "2020-01-15T14:45:50.528742Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:53.045118Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:53.044831Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:54.305054Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:54.304264Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:36.285928Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:36.285661Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:37.239271Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:37.238378Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "PermissionError", │ │ │ │ │ │ - "evalue": "[Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.", │ │ │ │ │ │ + "evalue": "[Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ "traceback": [ │ │ │ │ │ │ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", │ │ │ │ │ │ "\u001b[0;31mPermissionError\u001b[0m Traceback (most recent call last)", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/utils.py:262\u001b[0m, in \u001b[0;36mmake_local_storage\u001b[0;34m(path, env)\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcreate\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 259\u001b[0m \u001b[38;5;66;03m# When running in parallel, it's possible that multiple jobs will\u001b[39;00m\n\u001b[1;32m 260\u001b[0m \u001b[38;5;66;03m# try to create the path at the same time. Use exist_ok to avoid\u001b[39;00m\n\u001b[1;32m 261\u001b[0m \u001b[38;5;66;03m# raising an error.\u001b[39;00m\n\u001b[0;32m--> 262\u001b[0m \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 263\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3.13/os.py:217\u001b[0m, in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 217\u001b[0m \u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhead\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexist_ok\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileExistsError\u001b[39;00m:\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# Defeats race condition when another thread created the path\u001b[39;00m\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3.13/os.py:217\u001b[0m, in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 217\u001b[0m \u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhead\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexist_ok\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileExistsError\u001b[39;00m:\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# Defeats race condition when another thread created the path\u001b[39;00m\n", │ │ │ │ │ │ @@ -63,15 +63,15 @@ │ │ │ │ │ │ "\nThe above exception was the direct cause of the following exception:\n", │ │ │ │ │ │ "\u001b[0;31mPermissionError\u001b[0m Traceback (most recent call last)", │ │ │ │ │ │ "Cell \u001b[0;32mIn[1], line 7\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n\u001b[1;32m 4\u001b[0m xr\u001b[38;5;241m.\u001b[39mset_options(display_style\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhtml\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;66;03m# fancy HTML repr\u001b[39;00m\n\u001b[1;32m 6\u001b[0m air \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m----> 7\u001b[0m \u001b[43mxr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtutorial\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mair_temperature\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 8\u001b[0m \u001b[38;5;241m.\u001b[39mair\u001b[38;5;241m.\u001b[39msortby(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mlat\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;66;03m# np.interp needs coordinate in ascending order\u001b[39;00m\n\u001b[1;32m 9\u001b[0m \u001b[38;5;241m.\u001b[39misel(time\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mslice\u001b[39m(\u001b[38;5;241m4\u001b[39m), lon\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mslice\u001b[39m(\u001b[38;5;241m3\u001b[39m))\n\u001b[1;32m 10\u001b[0m ) \u001b[38;5;66;03m# choose a small subset for convenience\u001b[39;00m\n\u001b[1;32m 11\u001b[0m air\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/xarray/tutorial.py:213\u001b[0m, in \u001b[0;36mload_dataset\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mload_dataset\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dataset:\n\u001b[1;32m 177\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 178\u001b[0m \u001b[38;5;124;03m Open, load into memory, and close a dataset from the online repository\u001b[39;00m\n\u001b[1;32m 179\u001b[0m \u001b[38;5;124;03m (requires internet).\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 211\u001b[0m \u001b[38;5;124;03m load_dataset\u001b[39;00m\n\u001b[1;32m 212\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 213\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[43mopen_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m ds:\n\u001b[1;32m 214\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ds\u001b[38;5;241m.\u001b[39mload()\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/xarray/tutorial.py:165\u001b[0m, in \u001b[0;36mopen_dataset\u001b[0;34m(name, cache, cache_dir, engine, **kws)\u001b[0m\n\u001b[1;32m 162\u001b[0m downloader \u001b[38;5;241m=\u001b[39m pooch\u001b[38;5;241m.\u001b[39mHTTPDownloader(headers\u001b[38;5;241m=\u001b[39mheaders)\n\u001b[1;32m 164\u001b[0m \u001b[38;5;66;03m# retrieve the file\u001b[39;00m\n\u001b[0;32m--> 165\u001b[0m filepath \u001b[38;5;241m=\u001b[39m \u001b[43mpooch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mretrieve\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 166\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mknown_hash\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcache_dir\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdownloader\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdownloader\u001b[49m\n\u001b[1;32m 167\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 168\u001b[0m ds \u001b[38;5;241m=\u001b[39m _open_dataset(filepath, engine\u001b[38;5;241m=\u001b[39mengine, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkws)\n\u001b[1;32m 169\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m cache:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/core.py:227\u001b[0m, in \u001b[0;36mretrieve\u001b[0;34m(url, known_hash, fname, path, processor, downloader, progressbar)\u001b[0m\n\u001b[1;32m 222\u001b[0m action, verb \u001b[38;5;241m=\u001b[39m download_action(full_path, known_hash)\n\u001b[1;32m 224\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action \u001b[38;5;129;01min\u001b[39;00m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdownload\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mupdate\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m 225\u001b[0m \u001b[38;5;66;03m# We need to write data, so create the local data directory if it\u001b[39;00m\n\u001b[1;32m 226\u001b[0m \u001b[38;5;66;03m# doesn't already exist.\u001b[39;00m\n\u001b[0;32m--> 227\u001b[0m \u001b[43mmake_local_storage\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 229\u001b[0m get_logger()\u001b[38;5;241m.\u001b[39minfo(\n\u001b[1;32m 230\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m data from \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to file \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 231\u001b[0m verb,\n\u001b[1;32m 232\u001b[0m url,\n\u001b[1;32m 233\u001b[0m \u001b[38;5;28mstr\u001b[39m(full_path),\n\u001b[1;32m 234\u001b[0m )\n\u001b[1;32m 236\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m downloader \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/utils.py:276\u001b[0m, in \u001b[0;36mmake_local_storage\u001b[0;34m(path, env)\u001b[0m\n\u001b[1;32m 272\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m env \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 273\u001b[0m message\u001b[38;5;241m.\u001b[39mappend(\n\u001b[1;32m 274\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUse environment variable \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00menv\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to specify a different location.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 275\u001b[0m )\n\u001b[0;32m--> 276\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mPermissionError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(message)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merror\u001b[39;00m\n", │ │ │ │ │ │ - "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files." │ │ │ │ │ │ + "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files." │ │ │ │ │ │ ] │ │ │ │ │ │ } │ │ │ │ │ │ ], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "import xarray as xr\n", │ │ │ │ │ │ "import numpy as np\n", │ │ │ │ │ │ "\n", │ │ │ │ │ │ @@ -97,18 +97,18 @@ │ │ │ │ │ │ "execution_count": 2, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-15T14:45:55.431708Z", │ │ │ │ │ │ "start_time": "2020-01-15T14:45:55.104701Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:54.313197Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:54.312895Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:54.336953Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:54.336260Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:37.242596Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:37.242309Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:37.322405Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:37.306373Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'air' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -137,18 +137,18 @@ │ │ │ │ │ │ "execution_count": 3, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-15T14:45:57.889496Z", │ │ │ │ │ │ "start_time": "2020-01-15T14:45:57.792269Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:54.345143Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:54.344869Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:54.372945Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:54.372247Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:37.331335Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:37.331016Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:37.398782Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:37.394234Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'air' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -196,18 +196,18 @@ │ │ │ │ │ │ "execution_count": 4, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-15T14:45:59.768626Z", │ │ │ │ │ │ "start_time": "2020-01-15T14:45:59.543808Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:54.381112Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:54.380838Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:54.408979Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:54.408263Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:37.402077Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:37.401800Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:37.435133Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:37.434370Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'air' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -262,18 +262,18 @@ │ │ │ │ │ │ "execution_count": 5, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-15T14:46:02.187012Z", │ │ │ │ │ │ "start_time": "2020-01-15T14:46:02.105563Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:54.417119Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:54.416827Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:54.445001Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:54.444271Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:37.438338Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:37.438052Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:37.506404Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:37.490367Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'air' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -340,18 +340,18 @@ │ │ │ │ │ │ "execution_count": 6, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-15T14:46:05.031672Z", │ │ │ │ │ │ "start_time": "2020-01-15T14:46:04.947588Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:54.453196Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:54.452910Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:54.467617Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:54.466969Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:37.519241Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:37.518936Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:37.555122Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:37.554372Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'air' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -386,18 +386,18 @@ │ │ │ │ │ │ "execution_count": 7, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-15T14:46:09.325218Z", │ │ │ │ │ │ "start_time": "2020-01-15T14:46:09.303020Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:54.473073Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:54.472811Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:54.504956Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:54.504261Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:37.563220Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:37.562932Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:37.599127Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:37.598367Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'air' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -434,18 +434,18 @@ │ │ │ │ │ │ "execution_count": 8, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-15T14:46:11.295440Z", │ │ │ │ │ │ "start_time": "2020-01-15T14:46:11.226553Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:54.513122Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:54.512837Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:54.544944Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:54.544251Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:37.607247Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:37.606945Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:37.643113Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:37.642367Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'air' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -498,18 +498,18 @@ │ │ │ │ │ │ "execution_count": 9, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-15T14:46:13.808646Z", │ │ │ │ │ │ "start_time": "2020-01-15T14:46:13.680098Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:54.553097Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:54.552824Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:54.597011Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:54.596261Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:37.651340Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:37.651065Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:37.669632Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:37.668929Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'air' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -571,18 +571,18 @@ │ │ │ │ │ │ "execution_count": 10, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-15T14:46:26.633233Z", │ │ │ │ │ │ "start_time": "2020-01-15T14:46:26.515209Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:54.605086Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:54.604815Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:54.636982Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:54.636280Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:37.676712Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:37.676436Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:37.707201Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:37.706417Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'air' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -628,18 +628,18 @@ │ │ │ │ │ │ "execution_count": 11, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-15T14:46:30.026663Z", │ │ │ │ │ │ "start_time": "2020-01-15T14:46:29.893267Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:54.645160Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:54.644870Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:54.793010Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:54.792286Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:37.710254Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:37.710000Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:37.846405Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:37.831773Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'air' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -716,18 +716,18 @@ │ │ │ │ │ │ "execution_count": 12, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-15T14:48:42.469341Z", │ │ │ │ │ │ "start_time": "2020-01-15T14:48:42.344209Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:54.796209Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:54.795915Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:54.835793Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:54.835040Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:37.852952Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:37.852693Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:37.879088Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:37.878363Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'air' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -802,18 +802,18 @@ │ │ │ │ │ │ "execution_count": 13, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-15T14:48:45.267633Z", │ │ │ │ │ │ "start_time": "2020-01-15T14:48:44.943939Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:54.838932Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:54.838676Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:54.860075Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:54.859473Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:37.881982Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:37.881738Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:37.902775Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:37.900162Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "ModuleNotFoundError", │ │ │ │ │ │ "evalue": "No module named 'numba'", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -854,18 +854,18 @@ │ │ │ │ │ │ "execution_count": 14, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-15T14:48:54.755405Z", │ │ │ │ │ │ "start_time": "2020-01-15T14:48:54.634724Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:54.866746Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:54.866474Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:54.936293Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:54.920259Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:37.905735Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:37.905474Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:37.939442Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:37.938701Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'interp1d_np_gufunc' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -908,18 +908,18 @@ │ │ │ │ │ │ "execution_count": 15, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-15T14:49:28.667528Z", │ │ │ │ │ │ "start_time": "2020-01-15T14:49:28.103914Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:17:54.945240Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:17:54.944947Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:17:54.981016Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:17:54.980319Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:37.942418Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:37.942132Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:37.983128Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:37.982407Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "ModuleNotFoundError", │ │ │ │ │ │ "evalue": "No module named 'numba'", │ │ │ │ │ │ "output_type": "error", │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/area_weighted_temperature.html │ │ │ │ @@ -186,15 +186,15 @@ │ │ │ │ File /usr/lib/python3/dist-packages/pooch/utils.py:276, in make_local_storage(path, env) │ │ │ │ 272 if env is not None: │ │ │ │ 273 message.append( │ │ │ │ 274 f"Use environment variable '{env}' to specify a different location." │ │ │ │ 275 ) │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │
│ │ │ │ │ │ │ │

Plot the first timestep:

│ │ │ │
│ │ │ │
[3]:
│ │ │ │  
│ │ │ │
│ │ │ │ ├── html2text {} │ │ │ │ │ @@ -121,15 +121,15 @@ │ │ │ │ │ 273 message.append( │ │ │ │ │ 274 f"Use environment variable '{env}' to specify a different │ │ │ │ │ location." │ │ │ │ │ 275 ) │ │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ │ │ PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/ │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/ │ │ │ │ │ xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ Plot the first timestep: │ │ │ │ │ [3]: │ │ │ │ │ projection = ccrs.LambertConformal(central_longitude=-95, central_latitude=45) │ │ │ │ │ │ │ │ │ │ f, ax = plt.subplots(subplot_kw=dict(projection=projection)) │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/area_weighted_temperature.ipynb.gz │ │ │ │ ├── area_weighted_temperature.ipynb │ │ │ │ │ ├── Pretty-printed │ │ │ │ │ │┄ Similarity: 0.999094012605042% │ │ │ │ │ │┄ Differences: {"'cells'": "{2: {'metadata': {'execution': {'iopub.execute_input': '2026-03-15T04:14:43.623195Z', " │ │ │ │ │ │┄ "'iopub.status.busy': '2026-03-15T04:14:43.622888Z', 'iopub.status.idle': " │ │ │ │ │ │┄ "'2026-03-15T04:14:45.091133Z', 'shell.execute_reply': " │ │ │ │ │ │┄ "'2026-03-15T04:14:45.090382Z'}}}, 4: {'metadata': {'execution': " │ │ │ │ │ │┄ "{'iopub.execute_input': '2026-03-15T04:14:45.099378Z', 'iopub.status.busy': " │ │ │ │ │ │┄ "'2026-03-15T04:14:45.098920Z', 'iopub.status.idle': '2026-03-15T04:14:4 […] │ │ │ │ │ │ @@ -28,18 +28,18 @@ │ │ │ │ │ │ "execution_count": 1, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-03-17T14:43:57.222351Z", │ │ │ │ │ │ "start_time": "2020-03-17T14:43:56.147541Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:02.619573Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:02.619302Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:04.581134Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:04.580334Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:43.623195Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:43.622888Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:45.091133Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:45.090382Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "%matplotlib inline\n", │ │ │ │ │ │ "\n", │ │ │ │ │ │ "import cartopy.crs as ccrs\n", │ │ │ │ │ │ @@ -63,24 +63,24 @@ │ │ │ │ │ │ "execution_count": 2, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-03-17T14:43:57.831734Z", │ │ │ │ │ │ "start_time": "2020-03-17T14:43:57.651845Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:04.589407Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:04.588919Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:05.249107Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:05.248275Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:45.099378Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:45.098920Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:45.687167Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:45.686365Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "PermissionError", │ │ │ │ │ │ - "evalue": "[Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.", │ │ │ │ │ │ + "evalue": "[Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ "traceback": [ │ │ │ │ │ │ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", │ │ │ │ │ │ "\u001b[0;31mPermissionError\u001b[0m Traceback (most recent call last)", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/utils.py:262\u001b[0m, in \u001b[0;36mmake_local_storage\u001b[0;34m(path, env)\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcreate\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 259\u001b[0m \u001b[38;5;66;03m# When running in parallel, it's possible that multiple jobs will\u001b[39;00m\n\u001b[1;32m 260\u001b[0m \u001b[38;5;66;03m# try to create the path at the same time. Use exist_ok to avoid\u001b[39;00m\n\u001b[1;32m 261\u001b[0m \u001b[38;5;66;03m# raising an error.\u001b[39;00m\n\u001b[0;32m--> 262\u001b[0m \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 263\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3.13/os.py:217\u001b[0m, in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 217\u001b[0m \u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhead\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexist_ok\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileExistsError\u001b[39;00m:\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# Defeats race condition when another thread created the path\u001b[39;00m\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3.13/os.py:217\u001b[0m, in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 217\u001b[0m \u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhead\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexist_ok\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileExistsError\u001b[39;00m:\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# Defeats race condition when another thread created the path\u001b[39;00m\n", │ │ │ │ │ │ @@ -90,15 +90,15 @@ │ │ │ │ │ │ "\nThe above exception was the direct cause of the following exception:\n", │ │ │ │ │ │ "\u001b[0;31mPermissionError\u001b[0m Traceback (most recent call last)", │ │ │ │ │ │ "Cell \u001b[0;32mIn[2], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m ds \u001b[38;5;241m=\u001b[39m \u001b[43mxr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtutorial\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mair_temperature\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[38;5;66;03m# to celsius\u001b[39;00m\n\u001b[1;32m 4\u001b[0m air \u001b[38;5;241m=\u001b[39m ds\u001b[38;5;241m.\u001b[39mair \u001b[38;5;241m-\u001b[39m \u001b[38;5;241m273.15\u001b[39m\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/xarray/tutorial.py:213\u001b[0m, in \u001b[0;36mload_dataset\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mload_dataset\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dataset:\n\u001b[1;32m 177\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 178\u001b[0m \u001b[38;5;124;03m Open, load into memory, and close a dataset from the online repository\u001b[39;00m\n\u001b[1;32m 179\u001b[0m \u001b[38;5;124;03m (requires internet).\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 211\u001b[0m \u001b[38;5;124;03m load_dataset\u001b[39;00m\n\u001b[1;32m 212\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 213\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[43mopen_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m ds:\n\u001b[1;32m 214\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ds\u001b[38;5;241m.\u001b[39mload()\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/xarray/tutorial.py:165\u001b[0m, in \u001b[0;36mopen_dataset\u001b[0;34m(name, cache, cache_dir, engine, **kws)\u001b[0m\n\u001b[1;32m 162\u001b[0m downloader \u001b[38;5;241m=\u001b[39m pooch\u001b[38;5;241m.\u001b[39mHTTPDownloader(headers\u001b[38;5;241m=\u001b[39mheaders)\n\u001b[1;32m 164\u001b[0m \u001b[38;5;66;03m# retrieve the file\u001b[39;00m\n\u001b[0;32m--> 165\u001b[0m filepath \u001b[38;5;241m=\u001b[39m \u001b[43mpooch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mretrieve\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 166\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mknown_hash\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcache_dir\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdownloader\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdownloader\u001b[49m\n\u001b[1;32m 167\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 168\u001b[0m ds \u001b[38;5;241m=\u001b[39m _open_dataset(filepath, engine\u001b[38;5;241m=\u001b[39mengine, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkws)\n\u001b[1;32m 169\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m cache:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/core.py:227\u001b[0m, in \u001b[0;36mretrieve\u001b[0;34m(url, known_hash, fname, path, processor, downloader, progressbar)\u001b[0m\n\u001b[1;32m 222\u001b[0m action, verb \u001b[38;5;241m=\u001b[39m download_action(full_path, known_hash)\n\u001b[1;32m 224\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action \u001b[38;5;129;01min\u001b[39;00m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdownload\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mupdate\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m 225\u001b[0m \u001b[38;5;66;03m# We need to write data, so create the local data directory if it\u001b[39;00m\n\u001b[1;32m 226\u001b[0m \u001b[38;5;66;03m# doesn't already exist.\u001b[39;00m\n\u001b[0;32m--> 227\u001b[0m \u001b[43mmake_local_storage\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 229\u001b[0m get_logger()\u001b[38;5;241m.\u001b[39minfo(\n\u001b[1;32m 230\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m data from \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to file \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 231\u001b[0m verb,\n\u001b[1;32m 232\u001b[0m url,\n\u001b[1;32m 233\u001b[0m \u001b[38;5;28mstr\u001b[39m(full_path),\n\u001b[1;32m 234\u001b[0m )\n\u001b[1;32m 236\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m downloader \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/utils.py:276\u001b[0m, in \u001b[0;36mmake_local_storage\u001b[0;34m(path, env)\u001b[0m\n\u001b[1;32m 272\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m env \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 273\u001b[0m message\u001b[38;5;241m.\u001b[39mappend(\n\u001b[1;32m 274\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUse environment variable \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00menv\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to specify a different location.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 275\u001b[0m )\n\u001b[0;32m--> 276\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mPermissionError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(message)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merror\u001b[39;00m\n", │ │ │ │ │ │ - "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files." │ │ │ │ │ │ + "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files." │ │ │ │ │ │ ] │ │ │ │ │ │ } │ │ │ │ │ │ ], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "ds = xr.tutorial.load_dataset(\"air_temperature\")\n", │ │ │ │ │ │ "\n", │ │ │ │ │ │ "# to celsius\n", │ │ │ │ │ │ @@ -122,18 +122,18 @@ │ │ │ │ │ │ "execution_count": 3, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-03-17T14:43:59.887120Z", │ │ │ │ │ │ "start_time": "2020-03-17T14:43:59.582894Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:05.257213Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:05.256919Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:05.449019Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:05.448270Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:45.695264Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:45.694969Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:45.863104Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:45.862369Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'air' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -178,18 +178,18 @@ │ │ │ │ │ │ "execution_count": 4, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-03-17T14:44:18.777092Z", │ │ │ │ │ │ "start_time": "2020-03-17T14:44:18.736587Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:05.457178Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:05.456881Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:05.480903Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:05.480234Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:45.871228Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:45.870926Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:45.903119Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:45.902375Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'air' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -219,18 +219,18 @@ │ │ │ │ │ │ "execution_count": 5, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-03-17T14:44:52.607120Z", │ │ │ │ │ │ "start_time": "2020-03-17T14:44:52.564674Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:05.493128Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:05.492839Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:05.517807Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:05.517043Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:45.911226Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:45.910926Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:45.939092Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:45.938357Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'air' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -252,18 +252,18 @@ │ │ │ │ │ │ "execution_count": 6, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-03-17T14:44:54.334279Z", │ │ │ │ │ │ "start_time": "2020-03-17T14:44:54.280022Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:05.537177Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:05.536882Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:05.558126Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:05.557382Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:45.947332Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:45.947047Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:45.975101Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:45.974359Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'air_weighted' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -294,18 +294,18 @@ │ │ │ │ │ │ "execution_count": 7, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-03-17T14:45:08.877307Z", │ │ │ │ │ │ "start_time": "2020-03-17T14:45:08.673383Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:05.561493Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:05.561186Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:05.580280Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:05.579278Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:45.983363Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:45.983067Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:46.015108Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:46.014374Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'weighted_mean' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/blank_template.html │ │ │ │ @@ -160,15 +160,15 @@ │ │ │ │ File /usr/lib/python3/dist-packages/pooch/utils.py:276, in make_local_storage(path, env) │ │ │ │ 272 if env is not None: │ │ │ │ 273 message.append( │ │ │ │ 274 f"Use environment variable '{env}' to specify a different location." │ │ │ │ 275 ) │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
[ ]:
│ │ │ │  
│ │ │ │
│ │ │ │

│ │ │ │ ├── html2text {}
│ │ │ │ │ @@ -99,15 +99,15 @@
│ │ │ │ │      273     message.append(
│ │ │ │ │      274         f"Use environment variable '{env}' to specify a different
│ │ │ │ │  location."
│ │ │ │ │      275     )
│ │ │ │ │  --> 276 raise PermissionError(" ".join(message)) from error
│ │ │ │ │  
│ │ │ │ │  PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not
│ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/
│ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/
│ │ │ │ │  xarray_tutorial_data'. Will not be able to download data files.
│ │ │ │ │  [ ]:
│ │ │ │ │  _[_L_o_g_o_ _o_f_ _x_a_r_r_a_y_]
│ │ │ │ │  ************ _xx_aa_rr_rr_aa_yy ************
│ │ │ │ │  ******** NNaavviiggaattiioonn ********
│ │ │ │ │  For users
│ │ │ │ │      * _G_e_t_t_i_n_g_ _S_t_a_r_t_e_d
│ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/blank_template.ipynb.gz
│ │ │ │ ├── blank_template.ipynb
│ │ │ │ │ ├── Pretty-printed
│ │ │ │ │ │┄ Similarity: 0.9986468545751634%
│ │ │ │ │ │┄ Differences: {"'cells'": "{1: {'metadata': {'execution': {'iopub.execute_input': '2026-03-15T04:14:50.634683Z', "
│ │ │ │ │ │┄             "'iopub.status.busy': '2026-03-15T04:14:50.634094Z', 'iopub.status.idle': "
│ │ │ │ │ │┄             "'2026-03-15T04:14:51.348185Z', 'shell.execute_reply': "
│ │ │ │ │ │┄             '\'2026-03-15T04:14:51.347386Z\'}}, \'outputs\': {0: {\'evalue\': "[Errno 13] '
│ │ │ │ │ │┄             "Permission denied: '/nonexistent' | Pooch could not create data cache folder "
│ │ │ │ │ │┄             "'/nonexistent/second-build/.cache/xarray_tutorial_data'.  […]
│ │ │ │ │ │ @@ -12,24 +12,24 @@
│ │ │ │ │ │          },
│ │ │ │ │ │          {
│ │ │ │ │ │              "cell_type": "code",
│ │ │ │ │ │              "execution_count": 1,
│ │ │ │ │ │              "id": "41b90ede",
│ │ │ │ │ │              "metadata": {
│ │ │ │ │ │                  "execution": {
│ │ │ │ │ │ -                    "iopub.execute_input": "2025-02-09T21:18:10.209153Z",
│ │ │ │ │ │ -                    "iopub.status.busy": "2025-02-09T21:18:10.208885Z",
│ │ │ │ │ │ -                    "iopub.status.idle": "2025-02-09T21:18:11.353116Z",
│ │ │ │ │ │ -                    "shell.execute_reply": "2025-02-09T21:18:11.352312Z"
│ │ │ │ │ │ +                    "iopub.execute_input": "2026-03-15T04:14:50.634683Z",
│ │ │ │ │ │ +                    "iopub.status.busy": "2026-03-15T04:14:50.634094Z",
│ │ │ │ │ │ +                    "iopub.status.idle": "2026-03-15T04:14:51.348185Z",
│ │ │ │ │ │ +                    "shell.execute_reply": "2026-03-15T04:14:51.347386Z"
│ │ │ │ │ │                  }
│ │ │ │ │ │              },
│ │ │ │ │ │              "outputs": [
│ │ │ │ │ │                  {
│ │ │ │ │ │                      "ename": "PermissionError",
│ │ │ │ │ │ -                    "evalue": "[Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.",
│ │ │ │ │ │ +                    "evalue": "[Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.",
│ │ │ │ │ │                      "output_type": "error",
│ │ │ │ │ │                      "traceback": [
│ │ │ │ │ │                          "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
│ │ │ │ │ │                          "\u001b[0;31mPermissionError\u001b[0m                           Traceback (most recent call last)",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/utils.py:262\u001b[0m, in \u001b[0;36mmake_local_storage\u001b[0;34m(path, env)\u001b[0m\n\u001b[1;32m    258\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcreate\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m    259\u001b[0m     \u001b[38;5;66;03m# When running in parallel, it's possible that multiple jobs will\u001b[39;00m\n\u001b[1;32m    260\u001b[0m     \u001b[38;5;66;03m# try to create the path at the same time. Use exist_ok to avoid\u001b[39;00m\n\u001b[1;32m    261\u001b[0m     \u001b[38;5;66;03m# raising an error.\u001b[39;00m\n\u001b[0;32m--> 262\u001b[0m     \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m    263\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/os.py:217\u001b[0m, in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m    216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 217\u001b[0m     \u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhead\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexist_ok\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileExistsError\u001b[39;00m:\n\u001b[1;32m    219\u001b[0m     \u001b[38;5;66;03m# Defeats race condition when another thread created the path\u001b[39;00m\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3.13/os.py:217\u001b[0m, in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m    216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 217\u001b[0m     \u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhead\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexist_ok\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileExistsError\u001b[39;00m:\n\u001b[1;32m    219\u001b[0m     \u001b[38;5;66;03m# Defeats race condition when another thread created the path\u001b[39;00m\n",
│ │ │ │ │ │ @@ -39,15 +39,15 @@
│ │ │ │ │ │                          "\nThe above exception was the direct cause of the following exception:\n",
│ │ │ │ │ │                          "\u001b[0;31mPermissionError\u001b[0m                           Traceback (most recent call last)",
│ │ │ │ │ │                          "Cell \u001b[0;32mIn[1], line 5\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n\u001b[1;32m      3\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[0;32m----> 5\u001b[0m ds \u001b[38;5;241m=\u001b[39m \u001b[43mxr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtutorial\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mair_temperature\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m      6\u001b[0m da \u001b[38;5;241m=\u001b[39m ds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mair\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/xarray/tutorial.py:213\u001b[0m, in \u001b[0;36mload_dataset\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    176\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mload_dataset\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dataset:\n\u001b[1;32m    177\u001b[0m \u001b[38;5;250m    \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m    178\u001b[0m \u001b[38;5;124;03m    Open, load into memory, and close a dataset from the online repository\u001b[39;00m\n\u001b[1;32m    179\u001b[0m \u001b[38;5;124;03m    (requires internet).\u001b[39;00m\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    211\u001b[0m \u001b[38;5;124;03m    load_dataset\u001b[39;00m\n\u001b[1;32m    212\u001b[0m \u001b[38;5;124;03m    \"\"\"\u001b[39;00m\n\u001b[0;32m--> 213\u001b[0m     \u001b[38;5;28;01mwith\u001b[39;00m \u001b[43mopen_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m ds:\n\u001b[1;32m    214\u001b[0m         \u001b[38;5;28;01mreturn\u001b[39;00m ds\u001b[38;5;241m.\u001b[39mload()\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/xarray/tutorial.py:165\u001b[0m, in \u001b[0;36mopen_dataset\u001b[0;34m(name, cache, cache_dir, engine, **kws)\u001b[0m\n\u001b[1;32m    162\u001b[0m downloader \u001b[38;5;241m=\u001b[39m pooch\u001b[38;5;241m.\u001b[39mHTTPDownloader(headers\u001b[38;5;241m=\u001b[39mheaders)\n\u001b[1;32m    164\u001b[0m \u001b[38;5;66;03m# retrieve the file\u001b[39;00m\n\u001b[0;32m--> 165\u001b[0m filepath \u001b[38;5;241m=\u001b[39m \u001b[43mpooch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mretrieve\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m    166\u001b[0m \u001b[43m    \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mknown_hash\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcache_dir\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdownloader\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdownloader\u001b[49m\n\u001b[1;32m    167\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    168\u001b[0m ds \u001b[38;5;241m=\u001b[39m _open_dataset(filepath, engine\u001b[38;5;241m=\u001b[39mengine, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkws)\n\u001b[1;32m    169\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m cache:\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/core.py:227\u001b[0m, in \u001b[0;36mretrieve\u001b[0;34m(url, known_hash, fname, path, processor, downloader, progressbar)\u001b[0m\n\u001b[1;32m    222\u001b[0m action, verb \u001b[38;5;241m=\u001b[39m download_action(full_path, known_hash)\n\u001b[1;32m    224\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action \u001b[38;5;129;01min\u001b[39;00m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdownload\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mupdate\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m    225\u001b[0m     \u001b[38;5;66;03m# We need to write data, so create the local data directory if it\u001b[39;00m\n\u001b[1;32m    226\u001b[0m     \u001b[38;5;66;03m# doesn't already exist.\u001b[39;00m\n\u001b[0;32m--> 227\u001b[0m     \u001b[43mmake_local_storage\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m    229\u001b[0m     get_logger()\u001b[38;5;241m.\u001b[39minfo(\n\u001b[1;32m    230\u001b[0m         \u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m data from \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to file \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m    231\u001b[0m         verb,\n\u001b[1;32m    232\u001b[0m         url,\n\u001b[1;32m    233\u001b[0m         \u001b[38;5;28mstr\u001b[39m(full_path),\n\u001b[1;32m    234\u001b[0m     )\n\u001b[1;32m    236\u001b[0m     \u001b[38;5;28;01mif\u001b[39;00m downloader \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
│ │ │ │ │ │                          "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/utils.py:276\u001b[0m, in \u001b[0;36mmake_local_storage\u001b[0;34m(path, env)\u001b[0m\n\u001b[1;32m    272\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m env \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m    273\u001b[0m     message\u001b[38;5;241m.\u001b[39mappend(\n\u001b[1;32m    274\u001b[0m         \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUse environment variable \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00menv\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to specify a different location.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m    275\u001b[0m     )\n\u001b[0;32m--> 276\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mPermissionError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(message)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merror\u001b[39;00m\n",
│ │ │ │ │ │ -                        "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files."
│ │ │ │ │ │ +                        "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files."
│ │ │ │ │ │                      ]
│ │ │ │ │ │                  }
│ │ │ │ │ │              ],
│ │ │ │ │ │              "source": [
│ │ │ │ │ │                  "import xarray as xr\n",
│ │ │ │ │ │                  "import numpy as np\n",
│ │ │ │ │ │                  "import pandas as pd\n",
│ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/monthly-means.html
│ │ │ │ @@ -159,15 +159,15 @@
│ │ │ │  File /usr/lib/python3/dist-packages/pooch/utils.py:276, in make_local_storage(path, env)
│ │ │ │      272 if env is not None:
│ │ │ │      273     message.append(
│ │ │ │      274         f"Use environment variable '{env}' to specify a different location."
│ │ │ │      275     )
│ │ │ │  --> 276 raise PermissionError(" ".join(message)) from error
│ │ │ │  
│ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
│ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
│ │ │ │  
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │

Now for the heavy lifting:

│ │ │ │

We first have to come up with the weights, - calculate the month length for each monthly data record - calculate weights using groupby('time.season')

│ │ │ │

Finally, we just need to multiply our weights by the Dataset and sum along the time dimension. Creating a DataArray for the month length is as easy as using the days_in_month accessor on the time coordinate. The calendar type, in this case 'noleap', is automatically considered in this operation.

│ │ │ │ ├── html2text {} │ │ │ │ │ @@ -92,15 +92,15 @@ │ │ │ │ │ 273 message.append( │ │ │ │ │ 274 f"Use environment variable '{env}' to specify a different │ │ │ │ │ location." │ │ │ │ │ 275 ) │ │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ │ │ PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/ │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/ │ │ │ │ │ xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ ********** NNooww ffoorr tthhee hheeaavvyy lliiffttiinngg::_?¶ ********** │ │ │ │ │ We first have to come up with the weights, - calculate the month length for │ │ │ │ │ each monthly data record - calculate weights using groupby('time.season') │ │ │ │ │ Finally, we just need to multiply our weights by the Dataset and sum along the │ │ │ │ │ time dimension. Creating a DataArray for the month length is as easy as using │ │ │ │ │ the days_in_month accessor on the time coordinate. The calendar type, in this │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/monthly-means.ipynb.gz │ │ │ │ ├── monthly-means.ipynb │ │ │ │ │ ├── Pretty-printed │ │ │ │ │ │┄ Similarity: 0.9985617897727272% │ │ │ │ │ │┄ Differences: {"'cells'": "{1: {'metadata': {'execution': {'iopub.execute_input': '2026-03-15T04:14:53.306742Z', " │ │ │ │ │ │┄ "'iopub.status.busy': '2026-03-15T04:14:53.306156Z', 'iopub.status.idle': " │ │ │ │ │ │┄ "'2026-03-15T04:14:54.128844Z', 'shell.execute_reply': " │ │ │ │ │ │┄ "'2026-03-15T04:14:54.127830Z'}}}, 3: {'metadata': {'execution': " │ │ │ │ │ │┄ "{'iopub.execute_input': '2026-03-15T04:14:54.132815Z', 'iopub.status.busy': " │ │ │ │ │ │┄ "'2026-03-15T04:14:54.132376Z', 'iopub.status.idle': '2026-03-15T04:14:5 […] │ │ │ │ │ │ @@ -19,18 +19,18 @@ │ │ │ │ │ │ "execution_count": 1, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2018-11-28T20:51:35.958210Z", │ │ │ │ │ │ "start_time": "2018-11-28T20:51:35.936966Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:14.346006Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:14.345737Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:15.550717Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:15.549950Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:53.306742Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:53.306156Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:54.128844Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:54.127830Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "%matplotlib inline\n", │ │ │ │ │ │ "import numpy as np\n", │ │ │ │ │ │ "import pandas as pd\n", │ │ │ │ │ │ @@ -50,24 +50,24 @@ │ │ │ │ │ │ "execution_count": 2, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2018-11-28T20:51:36.072316Z", │ │ │ │ │ │ "start_time": "2018-11-28T20:51:36.016594Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:15.555055Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:15.554565Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:15.835526Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:15.834766Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:54.132815Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:54.132376Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:54.393606Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:54.392616Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "PermissionError", │ │ │ │ │ │ - "evalue": "[Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.", │ │ │ │ │ │ + "evalue": "[Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ "traceback": [ │ │ │ │ │ │ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", │ │ │ │ │ │ "\u001b[0;31mPermissionError\u001b[0m Traceback (most recent call last)", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/utils.py:262\u001b[0m, in \u001b[0;36mmake_local_storage\u001b[0;34m(path, env)\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcreate\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 259\u001b[0m \u001b[38;5;66;03m# When running in parallel, it's possible that multiple jobs will\u001b[39;00m\n\u001b[1;32m 260\u001b[0m \u001b[38;5;66;03m# try to create the path at the same time. Use exist_ok to avoid\u001b[39;00m\n\u001b[1;32m 261\u001b[0m \u001b[38;5;66;03m# raising an error.\u001b[39;00m\n\u001b[0;32m--> 262\u001b[0m \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 263\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3.13/os.py:217\u001b[0m, in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 217\u001b[0m \u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhead\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexist_ok\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileExistsError\u001b[39;00m:\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# Defeats race condition when another thread created the path\u001b[39;00m\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3.13/os.py:217\u001b[0m, in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 217\u001b[0m \u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhead\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexist_ok\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileExistsError\u001b[39;00m:\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# Defeats race condition when another thread created the path\u001b[39;00m\n", │ │ │ │ │ │ @@ -76,15 +76,15 @@ │ │ │ │ │ │ "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent'", │ │ │ │ │ │ "\nThe above exception was the direct cause of the following exception:\n", │ │ │ │ │ │ "\u001b[0;31mPermissionError\u001b[0m Traceback (most recent call last)", │ │ │ │ │ │ "Cell \u001b[0;32mIn[2], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m ds \u001b[38;5;241m=\u001b[39m \u001b[43mxr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtutorial\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mopen_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mrasm\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mload()\n\u001b[1;32m 2\u001b[0m ds\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/xarray/tutorial.py:165\u001b[0m, in \u001b[0;36mopen_dataset\u001b[0;34m(name, cache, cache_dir, engine, **kws)\u001b[0m\n\u001b[1;32m 162\u001b[0m downloader \u001b[38;5;241m=\u001b[39m pooch\u001b[38;5;241m.\u001b[39mHTTPDownloader(headers\u001b[38;5;241m=\u001b[39mheaders)\n\u001b[1;32m 164\u001b[0m \u001b[38;5;66;03m# retrieve the file\u001b[39;00m\n\u001b[0;32m--> 165\u001b[0m filepath \u001b[38;5;241m=\u001b[39m \u001b[43mpooch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mretrieve\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 166\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mknown_hash\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcache_dir\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdownloader\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdownloader\u001b[49m\n\u001b[1;32m 167\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 168\u001b[0m ds \u001b[38;5;241m=\u001b[39m _open_dataset(filepath, engine\u001b[38;5;241m=\u001b[39mengine, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkws)\n\u001b[1;32m 169\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m cache:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/core.py:227\u001b[0m, in \u001b[0;36mretrieve\u001b[0;34m(url, known_hash, fname, path, processor, downloader, progressbar)\u001b[0m\n\u001b[1;32m 222\u001b[0m action, verb \u001b[38;5;241m=\u001b[39m download_action(full_path, known_hash)\n\u001b[1;32m 224\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action \u001b[38;5;129;01min\u001b[39;00m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdownload\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mupdate\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m 225\u001b[0m \u001b[38;5;66;03m# We need to write data, so create the local data directory if it\u001b[39;00m\n\u001b[1;32m 226\u001b[0m \u001b[38;5;66;03m# doesn't already exist.\u001b[39;00m\n\u001b[0;32m--> 227\u001b[0m \u001b[43mmake_local_storage\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 229\u001b[0m get_logger()\u001b[38;5;241m.\u001b[39minfo(\n\u001b[1;32m 230\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m data from \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to file \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 231\u001b[0m verb,\n\u001b[1;32m 232\u001b[0m url,\n\u001b[1;32m 233\u001b[0m \u001b[38;5;28mstr\u001b[39m(full_path),\n\u001b[1;32m 234\u001b[0m )\n\u001b[1;32m 236\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m downloader \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/utils.py:276\u001b[0m, in \u001b[0;36mmake_local_storage\u001b[0;34m(path, env)\u001b[0m\n\u001b[1;32m 272\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m env \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 273\u001b[0m message\u001b[38;5;241m.\u001b[39mappend(\n\u001b[1;32m 274\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUse environment variable \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00menv\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to specify a different location.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 275\u001b[0m )\n\u001b[0;32m--> 276\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mPermissionError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(message)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merror\u001b[39;00m\n", │ │ │ │ │ │ - "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files." │ │ │ │ │ │ + "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files." │ │ │ │ │ │ ] │ │ │ │ │ │ } │ │ │ │ │ │ ], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "ds = xr.tutorial.open_dataset(\"rasm\").load()\n", │ │ │ │ │ │ "ds" │ │ │ │ │ │ ] │ │ │ │ │ │ @@ -102,18 +102,18 @@ │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": 3, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:15.839022Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:15.838734Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:15.855573Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:15.854933Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:54.397318Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:54.397010Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:54.411044Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:54.410121Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -135,18 +135,18 @@ │ │ │ │ │ │ "execution_count": 4, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2018-11-28T20:51:36.132413Z", │ │ │ │ │ │ "start_time": "2018-11-28T20:51:36.073708Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:15.858481Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:15.858197Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:15.881015Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:15.880321Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:54.414336Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:54.414022Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:54.429434Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:54.428561Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'month_length' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -176,18 +176,18 @@ │ │ │ │ │ │ "execution_count": 5, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2018-11-28T20:51:36.152913Z", │ │ │ │ │ │ "start_time": "2018-11-28T20:51:36.133997Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:15.889083Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:15.888809Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:15.919188Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:15.918543Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:54.433062Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:54.432794Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:54.454746Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:54.453904Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds_weighted' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -208,18 +208,18 @@ │ │ │ │ │ │ "execution_count": 6, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2018-11-28T20:51:36.190765Z", │ │ │ │ │ │ "start_time": "2018-11-28T20:51:36.154416Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:15.922094Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:15.921845Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:15.945016Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:15.944373Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:54.458219Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:54.457948Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:54.472414Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:54.471448Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -242,18 +242,18 @@ │ │ │ │ │ │ "execution_count": 7, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2018-11-28T20:51:40.264871Z", │ │ │ │ │ │ "start_time": "2018-11-28T20:51:36.192467Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:15.947844Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:15.947596Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:15.980912Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:15.980249Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:54.475787Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:54.475520Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:54.498179Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:54.497273Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds_unweighted' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -322,18 +322,18 @@ │ │ │ │ │ │ "execution_count": 8, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2018-11-28T20:51:40.284898Z", │ │ │ │ │ │ "start_time": "2018-11-28T20:51:40.266406Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:15.983844Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:15.983581Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:15.994658Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:15.993951Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:54.501776Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:54.501495Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:54.506554Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:54.505586Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "# Wrap it into a simple function\n", │ │ │ │ │ │ "def season_mean(ds, calendar=\"standard\"):\n", │ │ │ │ │ │ " # Make a DataArray with the number of days in each month, size = len(time)\n", │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/multidimensional-coords.html │ │ │ │ @@ -158,15 +158,15 @@ │ │ │ │ File /usr/lib/python3/dist-packages/pooch/utils.py:276, in make_local_storage(path, env) │ │ │ │ 272 if env is not None: │ │ │ │ 273 message.append( │ │ │ │ 274 f"Use environment variable '{env}' to specify a different location." │ │ │ │ 275 ) │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ │ │ │ │ │ │ │

In this example, the logical coordinates are x and y, while the physical coordinates are xc and yc, which represent the longitudes and latitudes of the data.

│ │ │ │
│ │ │ │
[3]:
│ │ │ │  
│ │ │ │
│ │ │ │ ├── html2text {} │ │ │ │ │ @@ -90,15 +90,15 @@ │ │ │ │ │ 273 message.append( │ │ │ │ │ 274 f"Use environment variable '{env}' to specify a different │ │ │ │ │ location." │ │ │ │ │ 275 ) │ │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ │ │ PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/ │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/ │ │ │ │ │ xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ In this example, the llooggiiccaall ccoooorrddiinnaatteess are x and y, while the pphhyyssiiccaall │ │ │ │ │ ccoooorrddiinnaatteess are xc and yc, which represent the longitudes and latitudes of the │ │ │ │ │ data. │ │ │ │ │ [3]: │ │ │ │ │ print(ds.xc.attrs) │ │ │ │ │ print(ds.yc.attrs) │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/multidimensional-coords.ipynb.gz │ │ │ │ ├── multidimensional-coords.ipynb │ │ │ │ │ ├── Pretty-printed │ │ │ │ │ │┄ Similarity: 0.9991536458333333% │ │ │ │ │ │┄ Differences: {"'cells'": "{1: {'metadata': {'execution': {'iopub.execute_input': '2026-03-15T04:14:56.799268Z', " │ │ │ │ │ │┄ "'iopub.status.busy': '2026-03-15T04:14:56.798974Z', 'iopub.status.idle': " │ │ │ │ │ │┄ "'2026-03-15T04:14:57.720120Z', 'shell.execute_reply': " │ │ │ │ │ │┄ "'2026-03-15T04:14:57.719535Z'}}}, 3: {'metadata': {'execution': " │ │ │ │ │ │┄ "{'iopub.execute_input': '2026-03-15T04:14:57.723834Z', 'iopub.status.busy': " │ │ │ │ │ │┄ "'2026-03-15T04:14:57.722436Z', 'iopub.status.idle': '2026-03-15T04:14:5 […] │ │ │ │ │ │ @@ -16,18 +16,18 @@ │ │ │ │ │ │ "execution_count": 1, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2018-11-28T20:49:56.068395Z", │ │ │ │ │ │ "start_time": "2018-11-28T20:49:56.035349Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:18.869039Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:18.868777Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:19.889068Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:19.888372Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:56.799268Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:56.798974Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:57.720120Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:57.719535Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "%matplotlib inline\n", │ │ │ │ │ │ "import numpy as np\n", │ │ │ │ │ │ "import pandas as pd\n", │ │ │ │ │ │ @@ -48,24 +48,24 @@ │ │ │ │ │ │ "execution_count": 2, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2018-11-28T20:50:13.629720Z", │ │ │ │ │ │ "start_time": "2018-11-28T20:50:13.484542Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:19.897506Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:19.897030Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:20.293072Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:20.292324Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:57.723834Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:57.722436Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:57.996536Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:57.995562Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "PermissionError", │ │ │ │ │ │ - "evalue": "[Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.", │ │ │ │ │ │ + "evalue": "[Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ "traceback": [ │ │ │ │ │ │ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", │ │ │ │ │ │ "\u001b[0;31mPermissionError\u001b[0m Traceback (most recent call last)", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/utils.py:262\u001b[0m, in \u001b[0;36mmake_local_storage\u001b[0;34m(path, env)\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcreate\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 259\u001b[0m \u001b[38;5;66;03m# When running in parallel, it's possible that multiple jobs will\u001b[39;00m\n\u001b[1;32m 260\u001b[0m \u001b[38;5;66;03m# try to create the path at the same time. Use exist_ok to avoid\u001b[39;00m\n\u001b[1;32m 261\u001b[0m \u001b[38;5;66;03m# raising an error.\u001b[39;00m\n\u001b[0;32m--> 262\u001b[0m \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 263\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3.13/os.py:217\u001b[0m, in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 217\u001b[0m \u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhead\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexist_ok\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileExistsError\u001b[39;00m:\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# Defeats race condition when another thread created the path\u001b[39;00m\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3.13/os.py:217\u001b[0m, in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 217\u001b[0m \u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhead\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexist_ok\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileExistsError\u001b[39;00m:\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# Defeats race condition when another thread created the path\u001b[39;00m\n", │ │ │ │ │ │ @@ -74,15 +74,15 @@ │ │ │ │ │ │ "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent'", │ │ │ │ │ │ "\nThe above exception was the direct cause of the following exception:\n", │ │ │ │ │ │ "\u001b[0;31mPermissionError\u001b[0m Traceback (most recent call last)", │ │ │ │ │ │ "Cell \u001b[0;32mIn[2], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m ds \u001b[38;5;241m=\u001b[39m \u001b[43mxr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtutorial\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mopen_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mrasm\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[38;5;241m.\u001b[39mload()\n\u001b[1;32m 2\u001b[0m ds\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/xarray/tutorial.py:165\u001b[0m, in \u001b[0;36mopen_dataset\u001b[0;34m(name, cache, cache_dir, engine, **kws)\u001b[0m\n\u001b[1;32m 162\u001b[0m downloader \u001b[38;5;241m=\u001b[39m pooch\u001b[38;5;241m.\u001b[39mHTTPDownloader(headers\u001b[38;5;241m=\u001b[39mheaders)\n\u001b[1;32m 164\u001b[0m \u001b[38;5;66;03m# retrieve the file\u001b[39;00m\n\u001b[0;32m--> 165\u001b[0m filepath \u001b[38;5;241m=\u001b[39m \u001b[43mpooch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mretrieve\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 166\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mknown_hash\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcache_dir\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdownloader\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdownloader\u001b[49m\n\u001b[1;32m 167\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 168\u001b[0m ds \u001b[38;5;241m=\u001b[39m _open_dataset(filepath, engine\u001b[38;5;241m=\u001b[39mengine, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkws)\n\u001b[1;32m 169\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m cache:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/core.py:227\u001b[0m, in \u001b[0;36mretrieve\u001b[0;34m(url, known_hash, fname, path, processor, downloader, progressbar)\u001b[0m\n\u001b[1;32m 222\u001b[0m action, verb \u001b[38;5;241m=\u001b[39m download_action(full_path, known_hash)\n\u001b[1;32m 224\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action \u001b[38;5;129;01min\u001b[39;00m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdownload\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mupdate\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m 225\u001b[0m \u001b[38;5;66;03m# We need to write data, so create the local data directory if it\u001b[39;00m\n\u001b[1;32m 226\u001b[0m \u001b[38;5;66;03m# doesn't already exist.\u001b[39;00m\n\u001b[0;32m--> 227\u001b[0m \u001b[43mmake_local_storage\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 229\u001b[0m get_logger()\u001b[38;5;241m.\u001b[39minfo(\n\u001b[1;32m 230\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m data from \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to file \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 231\u001b[0m verb,\n\u001b[1;32m 232\u001b[0m url,\n\u001b[1;32m 233\u001b[0m \u001b[38;5;28mstr\u001b[39m(full_path),\n\u001b[1;32m 234\u001b[0m )\n\u001b[1;32m 236\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m downloader \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/utils.py:276\u001b[0m, in \u001b[0;36mmake_local_storage\u001b[0;34m(path, env)\u001b[0m\n\u001b[1;32m 272\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m env \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 273\u001b[0m message\u001b[38;5;241m.\u001b[39mappend(\n\u001b[1;32m 274\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUse environment variable \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00menv\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to specify a different location.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 275\u001b[0m )\n\u001b[0;32m--> 276\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mPermissionError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(message)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merror\u001b[39;00m\n", │ │ │ │ │ │ - "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files." │ │ │ │ │ │ + "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files." │ │ │ │ │ │ ] │ │ │ │ │ │ } │ │ │ │ │ │ ], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "ds = xr.tutorial.open_dataset(\"rasm\").load()\n", │ │ │ │ │ │ "ds" │ │ │ │ │ │ ] │ │ │ │ │ │ @@ -99,18 +99,18 @@ │ │ │ │ │ │ "execution_count": 3, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2018-11-28T20:50:15.836061Z", │ │ │ │ │ │ "start_time": "2018-11-28T20:50:15.768376Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:20.305189Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:20.304919Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:20.344968Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:20.344271Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:58.000155Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:57.999893Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:58.014669Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:58.013622Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -141,18 +141,18 @@ │ │ │ │ │ │ "execution_count": 4, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2018-11-28T20:50:17.928556Z", │ │ │ │ │ │ "start_time": "2018-11-28T20:50:17.031211Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:20.353103Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:20.352829Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:20.597008Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:20.596265Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:58.018259Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:58.017992Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:58.234530Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:58.233326Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -194,18 +194,18 @@ │ │ │ │ │ │ "execution_count": 5, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2018-11-28T20:50:20.567749Z", │ │ │ │ │ │ "start_time": "2018-11-28T20:50:19.999393Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:20.605085Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:20.604818Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:20.628895Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:20.628239Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:58.238220Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:58.237934Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:58.252052Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:58.251429Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -233,18 +233,18 @@ │ │ │ │ │ │ "execution_count": 6, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2018-11-28T20:50:31.131708Z", │ │ │ │ │ │ "start_time": "2018-11-28T20:50:30.444697Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:20.634561Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:20.634299Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:20.706011Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:20.705324Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:58.255722Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:58.255442Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:58.326872Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:58.326039Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -291,18 +291,18 @@ │ │ │ │ │ │ "execution_count": 7, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2018-11-28T20:50:43.670463Z", │ │ │ │ │ │ "start_time": "2018-11-28T20:50:43.245501Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:20.709031Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:20.708775Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:20.728648Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:20.727917Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:14:58.330529Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:14:58.330230Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:14:58.349186Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:14:58.347466Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/visualization_gallery.html │ │ │ │ @@ -165,15 +165,15 @@ │ │ │ │ File /usr/lib/python3/dist-packages/pooch/utils.py:276, in make_local_storage(path, env) │ │ │ │ 272 if env is not None: │ │ │ │ 273 message.append( │ │ │ │ 274 f"Use environment variable '{env}' to specify a different location." │ │ │ │ 275 ) │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │

Multiple plots and map projections

│ │ │ │

Control the map projection parameters on multiple axes

│ │ │ │

This example illustrates how to plot multiple maps and control their extent and aspect ratio.

│ │ │ │

For more details see this discussion on github.

│ │ │ │ ├── html2text {} │ │ │ │ │ @@ -98,15 +98,15 @@ │ │ │ │ │ 273 message.append( │ │ │ │ │ 274 f"Use environment variable '{env}' to specify a different │ │ │ │ │ location." │ │ │ │ │ 275 ) │ │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ │ │ PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/ │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/ │ │ │ │ │ xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ ********** MMuullttiippllee pplloottss aanndd mmaapp pprroojjeeccttiioonnss_?¶ ********** │ │ │ │ │ Control the map projection parameters on multiple axes │ │ │ │ │ This example illustrates how to plot multiple maps and control their extent and │ │ │ │ │ aspect ratio. │ │ │ │ │ For more details see _t_h_i_s_ _d_i_s_c_u_s_s_i_o_n on github. │ │ │ │ │ [3]: │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/visualization_gallery.ipynb.gz │ │ │ │ ├── visualization_gallery.ipynb │ │ │ │ │ ├── Pretty-printed │ │ │ │ │ │┄ Similarity: 0.9982919730392157% │ │ │ │ │ │┄ Differences: {"'cells'": "{1: {'metadata': {'execution': {'iopub.execute_input': '2026-03-15T04:15:01.194974Z', " │ │ │ │ │ │┄ "'iopub.status.busy': '2026-03-15T04:15:01.193714Z', 'iopub.status.idle': " │ │ │ │ │ │┄ "'2026-03-15T04:15:02.037517Z', 'shell.execute_reply': " │ │ │ │ │ │┄ "'2026-03-15T04:15:02.036499Z'}}}, 3: {'metadata': {'execution': " │ │ │ │ │ │┄ "{'iopub.execute_input': '2026-03-15T04:15:02.041544Z', 'iopub.status.busy': " │ │ │ │ │ │┄ "'2026-03-15T04:15:02.041117Z', 'iopub.status.idle': '2026-03-15T04:15:0 […] │ │ │ │ │ │ @@ -10,18 +10,18 @@ │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": 1, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:25.095183Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:25.094919Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:26.589025Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:26.588265Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:15:01.194974Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:15:01.193714Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:15:02.037517Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:15:02.036499Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "import cartopy.crs as ccrs\n", │ │ │ │ │ │ "import matplotlib.pyplot as plt\n", │ │ │ │ │ │ "import xarray as xr\n", │ │ │ │ │ │ @@ -37,24 +37,24 @@ │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": 2, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:26.592031Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:26.591630Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:26.965044Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:26.964264Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:15:02.041544Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:15:02.041117Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:15:02.314860Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:15:02.313919Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "PermissionError", │ │ │ │ │ │ - "evalue": "[Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.", │ │ │ │ │ │ + "evalue": "[Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ "traceback": [ │ │ │ │ │ │ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", │ │ │ │ │ │ "\u001b[0;31mPermissionError\u001b[0m Traceback (most recent call last)", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/utils.py:262\u001b[0m, in \u001b[0;36mmake_local_storage\u001b[0;34m(path, env)\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcreate\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 259\u001b[0m \u001b[38;5;66;03m# When running in parallel, it's possible that multiple jobs will\u001b[39;00m\n\u001b[1;32m 260\u001b[0m \u001b[38;5;66;03m# try to create the path at the same time. Use exist_ok to avoid\u001b[39;00m\n\u001b[1;32m 261\u001b[0m \u001b[38;5;66;03m# raising an error.\u001b[39;00m\n\u001b[0;32m--> 262\u001b[0m \u001b[43mos\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 263\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3.13/os.py:217\u001b[0m, in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 217\u001b[0m \u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhead\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexist_ok\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileExistsError\u001b[39;00m:\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# Defeats race condition when another thread created the path\u001b[39;00m\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3.13/os.py:217\u001b[0m, in \u001b[0;36mmakedirs\u001b[0;34m(name, mode, exist_ok)\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 217\u001b[0m \u001b[43mmakedirs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mhead\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexist_ok\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexist_ok\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 218\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mFileExistsError\u001b[39;00m:\n\u001b[1;32m 219\u001b[0m \u001b[38;5;66;03m# Defeats race condition when another thread created the path\u001b[39;00m\n", │ │ │ │ │ │ @@ -64,15 +64,15 @@ │ │ │ │ │ │ "\nThe above exception was the direct cause of the following exception:\n", │ │ │ │ │ │ "\u001b[0;31mPermissionError\u001b[0m Traceback (most recent call last)", │ │ │ │ │ │ "Cell \u001b[0;32mIn[2], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m ds \u001b[38;5;241m=\u001b[39m \u001b[43mxr\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtutorial\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mair_temperature\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/xarray/tutorial.py:213\u001b[0m, in \u001b[0;36mload_dataset\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mload_dataset\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m Dataset:\n\u001b[1;32m 177\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 178\u001b[0m \u001b[38;5;124;03m Open, load into memory, and close a dataset from the online repository\u001b[39;00m\n\u001b[1;32m 179\u001b[0m \u001b[38;5;124;03m (requires internet).\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 211\u001b[0m \u001b[38;5;124;03m load_dataset\u001b[39;00m\n\u001b[1;32m 212\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 213\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[43mopen_dataset\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mas\u001b[39;00m ds:\n\u001b[1;32m 214\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m ds\u001b[38;5;241m.\u001b[39mload()\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/xarray/tutorial.py:165\u001b[0m, in \u001b[0;36mopen_dataset\u001b[0;34m(name, cache, cache_dir, engine, **kws)\u001b[0m\n\u001b[1;32m 162\u001b[0m downloader \u001b[38;5;241m=\u001b[39m pooch\u001b[38;5;241m.\u001b[39mHTTPDownloader(headers\u001b[38;5;241m=\u001b[39mheaders)\n\u001b[1;32m 164\u001b[0m \u001b[38;5;66;03m# retrieve the file\u001b[39;00m\n\u001b[0;32m--> 165\u001b[0m filepath \u001b[38;5;241m=\u001b[39m \u001b[43mpooch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mretrieve\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 166\u001b[0m \u001b[43m \u001b[49m\u001b[43murl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43murl\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mknown_hash\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcache_dir\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdownloader\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdownloader\u001b[49m\n\u001b[1;32m 167\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 168\u001b[0m ds \u001b[38;5;241m=\u001b[39m _open_dataset(filepath, engine\u001b[38;5;241m=\u001b[39mengine, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkws)\n\u001b[1;32m 169\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m cache:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/core.py:227\u001b[0m, in \u001b[0;36mretrieve\u001b[0;34m(url, known_hash, fname, path, processor, downloader, progressbar)\u001b[0m\n\u001b[1;32m 222\u001b[0m action, verb \u001b[38;5;241m=\u001b[39m download_action(full_path, known_hash)\n\u001b[1;32m 224\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m action \u001b[38;5;129;01min\u001b[39;00m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdownload\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mupdate\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m 225\u001b[0m \u001b[38;5;66;03m# We need to write data, so create the local data directory if it\u001b[39;00m\n\u001b[1;32m 226\u001b[0m \u001b[38;5;66;03m# doesn't already exist.\u001b[39;00m\n\u001b[0;32m--> 227\u001b[0m \u001b[43mmake_local_storage\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpath\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 229\u001b[0m get_logger()\u001b[38;5;241m.\u001b[39minfo(\n\u001b[1;32m 230\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m data from \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to file \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m.\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 231\u001b[0m verb,\n\u001b[1;32m 232\u001b[0m url,\n\u001b[1;32m 233\u001b[0m \u001b[38;5;28mstr\u001b[39m(full_path),\n\u001b[1;32m 234\u001b[0m )\n\u001b[1;32m 236\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m downloader \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", │ │ │ │ │ │ "File \u001b[0;32m/usr/lib/python3/dist-packages/pooch/utils.py:276\u001b[0m, in \u001b[0;36mmake_local_storage\u001b[0;34m(path, env)\u001b[0m\n\u001b[1;32m 272\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m env \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 273\u001b[0m message\u001b[38;5;241m.\u001b[39mappend(\n\u001b[1;32m 274\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mUse environment variable \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;132;01m{\u001b[39;00menv\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m to specify a different location.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 275\u001b[0m )\n\u001b[0;32m--> 276\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mPermissionError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(message)) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merror\u001b[39;00m\n", │ │ │ │ │ │ - "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files." │ │ │ │ │ │ + "\u001b[0;31mPermissionError\u001b[0m: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files." │ │ │ │ │ │ ] │ │ │ │ │ │ } │ │ │ │ │ │ ], │ │ │ │ │ │ "source": [ │ │ │ │ │ │ "ds = xr.tutorial.load_dataset(\"air_temperature\")" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ @@ -91,18 +91,18 @@ │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": 3, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:26.968261Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:26.967974Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:27.048285Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:27.032256Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:15:02.318798Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:15:02.318531Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:15:02.336021Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:15:02.335131Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -144,18 +144,18 @@ │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": 4, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:27.057213Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:27.056842Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:27.148280Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:27.132287Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:15:02.339881Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:15:02.339603Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:15:02.358221Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:15:02.357388Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -208,18 +208,18 @@ │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": 5, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:27.157092Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:27.156813Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:27.228280Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:27.212298Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:15:02.361513Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:15:02.361260Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:15:02.394137Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:15:02.393177Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ │ │ │ @@ -264,18 +264,18 @@ │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ "cell_type": "code", │ │ │ │ │ │ "execution_count": 6, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:27.237075Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:27.236809Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:27.312280Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:27.296252Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:15:02.399357Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:15:02.398965Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:15:02.417125Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:15:02.416117Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "ename": "NameError", │ │ │ │ │ │ "evalue": "name 'ds' is not defined", │ │ │ │ │ │ "output_type": "error", │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/weather-data.html │ │ │ │ @@ -470,37 +470,37 @@ │ │ │ │
<xarray.Dataset> Size: 41kB
│ │ │ │  Dimensions:   (time: 731, location: 3)
│ │ │ │  Coordinates:
│ │ │ │    * time      (time) datetime64[ns] 6kB 2000-01-01 2000-01-02 ... 2001-12-31
│ │ │ │    * location  (location) <U2 24B 'IA' 'IN' 'IL'
│ │ │ │  Data variables:
│ │ │ │      tmin      (time, location) float64 18kB -8.037 -1.788 ... -1.346 -4.544
│ │ │ │ -    tmax      (time, location) float64 18kB 12.98 3.31 6.779 ... 3.343 3.805
  • location
    PandasIndex
    PandasIndex(Index(['IA', 'IN', 'IL'], dtype='object', name='location'))
  • │ │ │ │ │ │ │ │
    │ │ │ │

    Examine a dataset with pandas and seaborn

    │ │ │ │
    │ │ │ │

    Convert to a pandas DataFrame

    │ │ │ │
    │ │ │ │
    [2]:
    │ │ │ │ @@ -697,15 +697,15 @@
    │ │ │ │  
    │ │ │ │
    │ │ │ │
    [5]:
    │ │ │ │  
    │ │ │ │
    │ │ │ │
    │ │ │ │
    │ │ │ │ -<seaborn.axisgrid.PairGrid at 0xffff3b81ae40>
    │ │ │ │ +<seaborn.axisgrid.PairGrid at 0xffff5ee4ae40>
    │ │ │ │  
    │ │ │ │
    │ │ │ │
    │ │ │ │
    │ │ │ │
    │ │ │ │
    │ │ │ │ ../_images/examples_weather-data_9_1.png │ │ │ │ @@ -1110,26 +1110,26 @@ │ │ │ │ [0. , 0. , 0. ], │ │ │ │ [0. , 0. , 0. ], │ │ │ │ [0. , 0.01612903, 0. ], │ │ │ │ [0.33333333, 0.35 , 0.23333333], │ │ │ │ [0.93548387, 0.85483871, 0.82258065]]) │ │ │ │ Coordinates: │ │ │ │ * location (location) <U2 24B 'IA' 'IN' 'IL' │ │ │ │ - * month (month) int64 96B 1 2 3 4 5 6 7 8 9 10 11 12
    • location
      (location)
      <U2
      'IA' 'IN' 'IL'
      array(['IA', 'IN', 'IL'], dtype='<U2')
    • month
      (month)
      int64
      1 2 3 4 5 6 7 8 9 10 11 12
      array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
    • location
      PandasIndex
      PandasIndex(Index(['IA', 'IN', 'IL'], dtype='object', name='location'))
    • month
      PandasIndex
      PandasIndex(Index([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], dtype='int64', name='month'))
  • │ │ │ │ │ │ │ │
    │ │ │ │
    [7]:
    │ │ │ │  
    │ │ │ │
    │ │ │ │
    freeze.to_pandas().plot()
    │ │ │ │  
    │ │ │ │ @@ -1642,18 +1642,18 @@ │ │ │ │ Dimensions: (time: 731, location: 3) │ │ │ │ Coordinates: │ │ │ │ * time (time) datetime64[ns] 6kB 2000-01-01 2000-01-02 ... 2001-12-31 │ │ │ │ * location (location) <U2 24B 'IA' 'IN' 'IL' │ │ │ │ month (time) int64 6kB 1 1 1 1 1 1 1 1 1 ... 12 12 12 12 12 12 12 12 │ │ │ │ Data variables: │ │ │ │ some_missing (time, location) float64 18kB nan nan nan ... -1.346 -4.544 │ │ │ │ - filled (time, location) float64 18kB -5.163 -4.216 ... -1.346 -4.544
  • location
    PandasIndex
    PandasIndex(Index(['IA', 'IN', 'IL'], dtype='object', name='location'))
  • │ │ │ │ │ │ │ │
    │ │ │ │
    [12]:
    │ │ │ │  
    │ │ │ │
    │ │ │ │
    df = both.sel(time="2000").mean("location").reset_coords(drop=True).to_dataframe()
    │ │ │ │  df.head()
    │ │ │ │ ├── html2text {}
    │ │ │ │ │ @@ -142,15 +142,15 @@
    │ │ │ │ │  [4]:
    │ │ │ │ │  
    │ │ │ │ │  [../_images/examples_weather-data_7_1.png]
    │ │ │ │ │  ******** VViissuuaalliizzee uussiinngg sseeaabboorrnn_?¶ ********
    │ │ │ │ │  [5]:
    │ │ │ │ │  sns.pairplot(df.reset_index(), vars=ds.data_vars)
    │ │ │ │ │  [5]:
    │ │ │ │ │ -
    │ │ │ │ │ +
    │ │ │ │ │  [../_images/examples_weather-data_9_1.png]
    │ │ │ │ │  ********** PPrroobbaabbiilliittyy ooff ffrreeeezzee bbyy ccaalleennddaarr mmoonntthh_?¶ **********
    │ │ │ │ │  [6]:
    │ │ │ │ │  freeze = (ds["tmin"] <= 0).groupby("time.month").mean("time")
    │ │ │ │ │  freeze
    │ │ │ │ │  [6]:
    │ │ │ │ │   Size: 288B
    │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/examples/weather-data.ipynb.gz
    │ │ │ │ ├── weather-data.ipynb
    │ │ │ │ │ ├── Pretty-printed
    │ │ │ │ │ │┄ Similarity: 0.9992323269378145%
    │ │ │ │ │ │┄ Differences: {"'cells'": "{1: {'metadata': {'execution': {'iopub.execute_input': '2026-03-15T04:15:05.203543Z', "
    │ │ │ │ │ │┄             "'iopub.status.busy': '2026-03-15T04:15:05.203041Z', 'iopub.status.idle': "
    │ │ │ │ │ │┄             "'2026-03-15T04:15:06.483169Z', 'shell.execute_reply': "
    │ │ │ │ │ │┄             "'2026-03-15T04:15:06.482052Z'}}, 'outputs': {0: {'data': {'text/html': {insert: "
    │ │ │ │ │ │┄             '[(377, "    tmax      (time, location) float64 18kB 12.98 3.31 6.779 ... 3.343 '
    │ │ │ │ │ │┄             "3.805
    " │ │ │ │ │ │ ], │ │ │ │ │ │ "text/plain": [ │ │ │ │ │ │ " Size: 41kB\n", │ │ │ │ │ │ "Dimensions: (time: 731, location: 3)\n", │ │ │ │ │ │ "Coordinates:\n", │ │ │ │ │ │ " * time (time) datetime64[ns] 6kB 2000-01-01 2000-01-02 ... 2001-12-31\n", │ │ │ │ │ │ " * location (location) \n", │ │ │ │ │ │ @@ -594,18 +594,18 @@ │ │ │ │ │ │ "execution_count": 3, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-27T15:47:32.682065Z", │ │ │ │ │ │ "start_time": "2020-01-27T15:47:32.652629Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:35.051700Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:35.051443Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:35.076928Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:35.076215Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:15:06.505758Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:15:06.505489Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:15:06.519357Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:15:06.518578Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "data": { │ │ │ │ │ │ "text/html": [ │ │ │ │ │ │ "
    \n", │ │ │ │ │ │ @@ -708,18 +708,18 @@ │ │ │ │ │ │ "execution_count": 4, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-27T15:47:34.617042Z", │ │ │ │ │ │ "start_time": "2020-01-27T15:47:34.282605Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:35.079958Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:35.079695Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:35.768626Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:35.765444Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:15:06.522632Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:15:06.522350Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:15:06.760611Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:15:06.759665Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "data": { │ │ │ │ │ │ "text/plain": [ │ │ │ │ │ │ "" │ │ │ │ │ │ @@ -756,25 +756,25 @@ │ │ │ │ │ │ "execution_count": 5, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-27T15:47:37.643175Z", │ │ │ │ │ │ "start_time": "2020-01-27T15:47:37.202479Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:35.774669Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:35.774410Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:38.065031Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:38.064270Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:15:06.764120Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:15:06.763601Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:15:07.544866Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:15:07.543990Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "data": { │ │ │ │ │ │ "text/plain": [ │ │ │ │ │ │ - "" │ │ │ │ │ │ + "" │ │ │ │ │ │ ] │ │ │ │ │ │ }, │ │ │ │ │ │ "execution_count": 5, │ │ │ │ │ │ "metadata": {}, │ │ │ │ │ │ "output_type": "execute_result" │ │ │ │ │ │ }, │ │ │ │ │ │ { │ │ │ │ │ │ @@ -804,18 +804,18 @@ │ │ │ │ │ │ "execution_count": 6, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-27T15:48:11.241224Z", │ │ │ │ │ │ "start_time": "2020-01-27T15:48:11.211156Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:38.074643Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:38.074356Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:38.120976Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:38.120260Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:15:07.549161Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:15:07.548478Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:15:07.587826Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:15:07.586790Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "data": { │ │ │ │ │ │ "text/html": [ │ │ │ │ │ │ "
    \n", │ │ │ │ │ │ @@ -1199,26 +1199,26 @@ │ │ │ │ │ │ " [0. , 0. , 0. ],\n", │ │ │ │ │ │ " [0. , 0. , 0. ],\n", │ │ │ │ │ │ " [0. , 0.01612903, 0. ],\n", │ │ │ │ │ │ " [0.33333333, 0.35 , 0.23333333],\n", │ │ │ │ │ │ " [0.93548387, 0.85483871, 0.82258065]])\n", │ │ │ │ │ │ "Coordinates:\n", │ │ │ │ │ │ " * location (location) <U2 24B 'IA' 'IN' 'IL'\n", │ │ │ │ │ │ - " * month (month) int64 96B 1 2 3 4 5 6 7 8 9 10 11 12
    • location
      (location)
      <U2
      'IA' 'IN' 'IL'
      array(['IA', 'IN', 'IL'], dtype='<U2')
    • month
      (month)
      int64
      1 2 3 4 5 6 7 8 9 10 11 12
      array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
    • location
      PandasIndex
      PandasIndex(Index(['IA', 'IN', 'IL'], dtype='object', name='location'))
    • month
      PandasIndex
      PandasIndex(Index([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], dtype='int64', name='month'))
  • " │ │ │ │ │ │ ], │ │ │ │ │ │ "text/plain": [ │ │ │ │ │ │ " Size: 288B\n", │ │ │ │ │ │ "array([[0.9516129 , 0.88709677, 0.93548387],\n", │ │ │ │ │ │ " [0.84210526, 0.71929825, 0.77192982],\n", │ │ │ │ │ │ " [0.24193548, 0.12903226, 0.16129032],\n", │ │ │ │ │ │ " [0. , 0. , 0. ],\n", │ │ │ │ │ │ @@ -1250,18 +1250,18 @@ │ │ │ │ │ │ "execution_count": 7, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-27T15:48:13.131247Z", │ │ │ │ │ │ "start_time": "2020-01-27T15:48:12.924985Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:38.124349Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:38.124028Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:38.621018Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:38.620262Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:15:07.591211Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:15:07.590916Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:15:07.799988Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:15:07.798650Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "data": { │ │ │ │ │ │ "text/plain": [ │ │ │ │ │ │ "" │ │ │ │ │ │ @@ -1298,18 +1298,18 @@ │ │ │ │ │ │ "execution_count": 8, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-27T15:48:08.498259Z", │ │ │ │ │ │ "start_time": "2020-01-27T15:48:08.210890Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:38.624973Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:38.624678Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:39.364557Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:39.363775Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:15:07.804999Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:15:07.804563Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:15:08.092952Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:15:08.092082Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "data": { │ │ │ │ │ │ "text/plain": [ │ │ │ │ │ │ "" │ │ │ │ │ │ @@ -1363,18 +1363,18 @@ │ │ │ │ │ │ "execution_count": 9, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-27T15:49:34.855086Z", │ │ │ │ │ │ "start_time": "2020-01-27T15:49:34.406439Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:39.369259Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:39.368962Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:40.029010Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:40.028269Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:15:08.096729Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:15:08.096461Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:15:08.355008Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:15:08.354094Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "data": { │ │ │ │ │ │ "text/plain": [ │ │ │ │ │ │ "" │ │ │ │ │ │ @@ -1422,18 +1422,18 @@ │ │ │ │ │ │ "execution_count": 10, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-27T15:50:09.144586Z", │ │ │ │ │ │ "start_time": "2020-01-27T15:50:08.734682Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:40.037173Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:40.036881Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:40.865000Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:40.864265Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:15:08.358507Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:15:08.358201Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:15:08.658446Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:15:08.657536Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "data": { │ │ │ │ │ │ "text/plain": [ │ │ │ │ │ │ "" │ │ │ │ │ │ @@ -1491,18 +1491,18 @@ │ │ │ │ │ │ "execution_count": 11, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-27T15:51:40.279299Z", │ │ │ │ │ │ "start_time": "2020-01-27T15:51:40.220342Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:40.870732Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:40.870456Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:40.995285Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:40.994576Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:15:08.661959Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:15:08.661689Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:15:08.703110Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:15:08.702385Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "data": { │ │ │ │ │ │ "text/html": [ │ │ │ │ │ │ "
    \n", │ │ │ │ │ │ @@ -1879,18 +1879,18 @@ │ │ │ │ │ │ "Dimensions: (time: 731, location: 3)\n", │ │ │ │ │ │ "Coordinates:\n", │ │ │ │ │ │ " * time (time) datetime64[ns] 6kB 2000-01-01 2000-01-02 ... 2001-12-31\n", │ │ │ │ │ │ " * location (location) <U2 24B 'IA' 'IN' 'IL'\n", │ │ │ │ │ │ " month (time) int64 6kB 1 1 1 1 1 1 1 1 1 ... 12 12 12 12 12 12 12 12\n", │ │ │ │ │ │ "Data variables:\n", │ │ │ │ │ │ " some_missing (time, location) float64 18kB nan nan nan ... -1.346 -4.544\n", │ │ │ │ │ │ - " filled (time, location) float64 18kB -5.163 -4.216 ... -1.346 -4.544
  • " │ │ │ │ │ │ ], │ │ │ │ │ │ "text/plain": [ │ │ │ │ │ │ " Size: 47kB\n", │ │ │ │ │ │ "Dimensions: (time: 731, location: 3)\n", │ │ │ │ │ │ "Coordinates:\n", │ │ │ │ │ │ " * time (time) datetime64[ns] 6kB 2000-01-01 2000-01-02 ... 2001-12-31\n", │ │ │ │ │ │ " * location (location) \n", │ │ │ │ │ │ @@ -2073,18 +2073,18 @@ │ │ │ │ │ │ "execution_count": 13, │ │ │ │ │ │ "metadata": { │ │ │ │ │ │ "ExecuteTime": { │ │ │ │ │ │ "end_time": "2020-01-27T15:52:14.867866Z", │ │ │ │ │ │ "start_time": "2020-01-27T15:52:14.449684Z" │ │ │ │ │ │ }, │ │ │ │ │ │ "execution": { │ │ │ │ │ │ - "iopub.execute_input": "2025-02-09T21:18:41.029062Z", │ │ │ │ │ │ - "iopub.status.busy": "2025-02-09T21:18:41.028800Z", │ │ │ │ │ │ - "iopub.status.idle": "2025-02-09T21:18:41.782726Z", │ │ │ │ │ │ - "shell.execute_reply": "2025-02-09T21:18:41.782006Z" │ │ │ │ │ │ + "iopub.execute_input": "2026-03-15T04:15:08.720615Z", │ │ │ │ │ │ + "iopub.status.busy": "2026-03-15T04:15:08.720351Z", │ │ │ │ │ │ + "iopub.status.idle": "2026-03-15T04:15:09.070738Z", │ │ │ │ │ │ + "shell.execute_reply": "2026-03-15T04:15:09.069831Z" │ │ │ │ │ │ } │ │ │ │ │ │ }, │ │ │ │ │ │ "outputs": [ │ │ │ │ │ │ { │ │ │ │ │ │ "data": { │ │ │ │ │ │ "text/plain": [ │ │ │ │ │ │ "" │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/getting-started-guide/quick-overview.html │ │ │ │ @@ -324,15 +324,15 @@ │ │ │ │
    │ │ │ │ │ │ │ │
    │ │ │ │
    │ │ │ │

    Plotting

    │ │ │ │

    Visualizing your datasets is quick and convenient:

    │ │ │ │
    In [37]: data.plot()
    │ │ │ │ -Out[37]: <matplotlib.collections.QuadMesh at 0xffff534bf380>
    │ │ │ │ +Out[37]: <matplotlib.collections.QuadMesh at 0xffff84797380>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/plotting_quick_overview.png │ │ │ │

    Note the automatic labeling with names and units. Our effort in adding metadata attributes has paid off! Many aspects of these figures are customizable: see Plotting.

    │ │ │ │
    │ │ │ │
    │ │ │ │

    pandas

    │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -253,15 +253,15 @@ │ │ │ │ │ [0.37342613, 1.49497537, 1.33584385]]) │ │ │ │ │ Coordinates: │ │ │ │ │ * x (x) int64 16B 10 20 │ │ │ │ │ Dimensions without coordinates: y │ │ │ │ │ ********** PPlloottttiinngg_?¶ ********** │ │ │ │ │ Visualizing your datasets is quick and convenient: │ │ │ │ │ In [37]: data.plot() │ │ │ │ │ -Out[37]: │ │ │ │ │ +Out[37]: │ │ │ │ │ [_build/html/_static/plotting_quick_overview.png] │ │ │ │ │ Note the automatic labeling with names and units. Our effort in adding metadata │ │ │ │ │ attributes has paid off! Many aspects of these figures are customizable: see │ │ │ │ │ _P_l_o_t_t_i_n_g. │ │ │ │ │ ********** ppaannddaass_?¶ ********** │ │ │ │ │ Xarray objects can be easily converted to and from pandas objects using the │ │ │ │ │ to_series(), to_dataframe() and _t_o___x_a_r_r_a_y_(_) methods: │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/internals/internal-design.html │ │ │ │ @@ -210,15 +210,15 @@ │ │ │ │ File /usr/lib/python3/dist-packages/pooch/utils.py:276, in make_local_storage(path, env) │ │ │ │ 272 if env is not None: │ │ │ │ 273 message.append( │ │ │ │ 274 f"Use environment variable '{env}' to specify a different location." │ │ │ │ 275 ) │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ │ │ │ In [2]: var = da.variable │ │ │ │ --------------------------------------------------------------------------- │ │ │ │ AttributeError Traceback (most recent call last) │ │ │ │ Cell In[2], line 1 │ │ │ │ ----> 1 var = da.variable │ │ │ │ │ │ │ │ @@ -312,15 +312,15 @@ │ │ │ │ File /usr/lib/python3/dist-packages/pooch/utils.py:276, in make_local_storage(path, env) │ │ │ │ 272 if env is not None: │ │ │ │ 273 message.append( │ │ │ │ 274 f"Use environment variable '{env}' to specify a different location." │ │ │ │ 275 ) │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ │ │ │ In [8]: var = da.variable │ │ │ │ --------------------------------------------------------------------------- │ │ │ │ AttributeError Traceback (most recent call last) │ │ │ │ Cell In[8], line 1 │ │ │ │ ----> 1 var = da.variable │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -159,15 +159,15 @@ │ │ │ │ │ 273 message.append( │ │ │ │ │ 274 f"Use environment variable '{env}' to specify a different │ │ │ │ │ location." │ │ │ │ │ 275 ) │ │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ │ │ PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/ │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/ │ │ │ │ │ xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ │ │ │ │ │ In [2]: var = da.variable │ │ │ │ │ --------------------------------------------------------------------------- │ │ │ │ │ AttributeError Traceback (most recent call last) │ │ │ │ │ Cell In[2], line 1 │ │ │ │ │ ----> 1 var = da.variable │ │ │ │ │ @@ -260,15 +260,15 @@ │ │ │ │ │ 273 message.append( │ │ │ │ │ 274 f"Use environment variable '{env}' to specify a different │ │ │ │ │ location." │ │ │ │ │ 275 ) │ │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ │ │ PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/ │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/ │ │ │ │ │ xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ │ │ │ │ │ In [8]: var = da.variable │ │ │ │ │ --------------------------------------------------------------------------- │ │ │ │ │ AttributeError Traceback (most recent call last) │ │ │ │ │ Cell In[8], line 1 │ │ │ │ │ ----> 1 var = da.variable │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/internals/zarr-encoding-spec.html │ │ │ │ @@ -163,23 +163,23 @@ │ │ │ │ File /usr/lib/python3/dist-packages/pooch/utils.py:276, in make_local_storage(path, env) │ │ │ │ 272 if env is not None: │ │ │ │ 273 message.append( │ │ │ │ 274 f"Use environment variable '{env}' to specify a different location." │ │ │ │ 275 ) │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ │ │ │ In [5]: ds.to_zarr("rasm.zarr", mode="w") │ │ │ │ -Out[5]: <xarray.backends.zarr.ZarrStore at 0xffff36012c20> │ │ │ │ +Out[5]: <xarray.backends.zarr.ZarrStore at 0xffff5e436c20> │ │ │ │ │ │ │ │ In [6]: zgroup = zarr.open("rasm.zarr") │ │ │ │ │ │ │ │ In [7]: print(os.listdir("rasm.zarr")) │ │ │ │ -['.zmetadata', 'latitude', 'longitude', '.zattrs', '.zgroup'] │ │ │ │ +['.zmetadata', 'longitude', 'latitude', '.zattrs', '.zgroup'] │ │ │ │ │ │ │ │ In [8]: print(zgroup.tree()) │ │ │ │ / │ │ │ │ ├── latitude (50,) float64 │ │ │ │ └── longitude (50,) float64 │ │ │ │ │ │ │ │ In [9]: dict(zgroup["Tair"].attrs) │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -111,24 +111,24 @@ │ │ │ │ │ 273 message.append( │ │ │ │ │ 274 f"Use environment variable '{env}' to specify a different │ │ │ │ │ location." │ │ │ │ │ 275 ) │ │ │ │ │ --> 276 raise PermissionError(" ".join(message)) from error │ │ │ │ │ │ │ │ │ │ PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/ │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/ │ │ │ │ │ xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ │ │ │ │ │ In [5]: ds.to_zarr("rasm.zarr", mode="w") │ │ │ │ │ -Out[5]: │ │ │ │ │ +Out[5]: │ │ │ │ │ │ │ │ │ │ In [6]: zgroup = zarr.open("rasm.zarr") │ │ │ │ │ │ │ │ │ │ In [7]: print(os.listdir("rasm.zarr")) │ │ │ │ │ -['.zmetadata', 'latitude', 'longitude', '.zattrs', '.zgroup'] │ │ │ │ │ +['.zmetadata', 'longitude', 'latitude', '.zattrs', '.zgroup'] │ │ │ │ │ │ │ │ │ │ In [8]: print(zgroup.tree()) │ │ │ │ │ / │ │ │ │ │ ├── latitude (50,) float64 │ │ │ │ │ └── longitude (50,) float64 │ │ │ │ │ │ │ │ │ │ In [9]: dict(zgroup["Tair"].attrs) │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/searchindex.js │ │ │ │ ├── js-beautify {} │ │ │ │ │ @@ -2374,21 +2374,18 @@ │ │ │ │ │ "001j": 51, │ │ │ │ │ "005": 51, │ │ │ │ │ "005036": 40, │ │ │ │ │ "005e": 37, │ │ │ │ │ "00688889": 36, │ │ │ │ │ "006e": 37, │ │ │ │ │ "007e": 51, │ │ │ │ │ - "007j": 51, │ │ │ │ │ - "008j": 51, │ │ │ │ │ "00914929": 36, │ │ │ │ │ "00941742": 36, │ │ │ │ │ "00968205": 36, │ │ │ │ │ "00973567": 36, │ │ │ │ │ - "00e": 51, │ │ │ │ │ "00j": 51, │ │ │ │ │ "01": [14, 16, 20, 26, 30, 32, 37, 38, 41, 43, 44, 45, 47, 48, 52, 53], │ │ │ │ │ "010569": 14, │ │ │ │ │ "01082401": 36, │ │ │ │ │ "01183847": 36, │ │ │ │ │ "015": 51, │ │ │ │ │ "016": 51, │ │ │ │ │ @@ -2398,22 +2395,24 @@ │ │ │ │ │ "01652764": 36, │ │ │ │ │ "0165891": 36, │ │ │ │ │ "01670071": 36, │ │ │ │ │ "01670121": 36, │ │ │ │ │ "01671269": 36, │ │ │ │ │ "01671847": 36, │ │ │ │ │ "01672": 36, │ │ │ │ │ + "016j": 51, │ │ │ │ │ "017": 43, │ │ │ │ │ "01806694": 36, │ │ │ │ │ "01814439": 36, │ │ │ │ │ "0182217": 36, │ │ │ │ │ "018e": 37, │ │ │ │ │ "019": 40, │ │ │ │ │ "01906": 48, │ │ │ │ │ "019e": 37, │ │ │ │ │ + "01j": 51, │ │ │ │ │ "01t00": [14, 37, 38, 52, 54], │ │ │ │ │ "01t03": 52, │ │ │ │ │ "01t12": 52, │ │ │ │ │ "02": [11, 14, 36, 37, 38, 41, 43, 44, 45, 48, 52, 53], │ │ │ │ │ "020e": 37, │ │ │ │ │ "021e": [37, 45], │ │ │ │ │ "023e": 37, │ │ │ │ │ @@ -2436,29 +2435,28 @@ │ │ │ │ │ "03642301": 36, │ │ │ │ │ "036e": 48, │ │ │ │ │ "037": 14, │ │ │ │ │ "037369": 14, │ │ │ │ │ "03736932": 14, │ │ │ │ │ "0379266750948": 45, │ │ │ │ │ "037e": 37, │ │ │ │ │ - "038": [43, 51], │ │ │ │ │ + "038": 43, │ │ │ │ │ "03835": 41, │ │ │ │ │ "03957499": 19, │ │ │ │ │ "03t00": [14, 37, 38], │ │ │ │ │ "04": [14, 19, 36, 37, 38, 41, 43, 47, 52], │ │ │ │ │ "040347": 14, │ │ │ │ │ "04096206": 36, │ │ │ │ │ "04097352": 36, │ │ │ │ │ "040e": 48, │ │ │ │ │ "0417827": 45, │ │ │ │ │ "042e": 37, │ │ │ │ │ "044": [35, 47], │ │ │ │ │ "04423597": 19, │ │ │ │ │ "044236": 47, │ │ │ │ │ - "045": 51, │ │ │ │ │ "045588": 14, │ │ │ │ │ "04569531": 36, │ │ │ │ │ "04569651": 14, │ │ │ │ │ "04703446": 36, │ │ │ │ │ "047e": [37, 48], │ │ │ │ │ "04835611": 36, │ │ │ │ │ "04862391": 36, │ │ │ │ │ @@ -2467,25 +2465,23 @@ │ │ │ │ │ "05": [14, 36, 38, 45, 48, 52, 53], │ │ │ │ │ "05405954": 36, │ │ │ │ │ "05556": 44, │ │ │ │ │ "056": 44, │ │ │ │ │ "057e": 37, │ │ │ │ │ "058e": 37, │ │ │ │ │ "05912615": 36, │ │ │ │ │ - "05j": 51, │ │ │ │ │ "05t00": 37, │ │ │ │ │ "06": [14, 28, 36, 38, 45, 52], │ │ │ │ │ "060403": 14, │ │ │ │ │ "061": 43, │ │ │ │ │ "06141": 41, │ │ │ │ │ "06187252": 14, │ │ │ │ │ "062": 41, │ │ │ │ │ "063": [14, 38], │ │ │ │ │ "06327582": 14, │ │ │ │ │ - "065": 51, │ │ │ │ │ "06683875": 36, │ │ │ │ │ "06683951": 36, │ │ │ │ │ "06683976": 36, │ │ │ │ │ "06689": 36, │ │ │ │ │ "066e": [37, 48], │ │ │ │ │ "06732": 41, │ │ │ │ │ "067e": 48, │ │ │ │ │ @@ -2496,17 +2492,19 @@ │ │ │ │ │ "070e": 37, │ │ │ │ │ "07180381": 19, │ │ │ │ │ "071804": 47, │ │ │ │ │ "072": 47, │ │ │ │ │ "072e": 48, │ │ │ │ │ "074e": 37, │ │ │ │ │ "078": 41, │ │ │ │ │ + "07j": 51, │ │ │ │ │ "07t00": 37, │ │ │ │ │ - "08": [14, 38, 51, 52], │ │ │ │ │ + "08": [14, 38, 52], │ │ │ │ │ "08002": 40, │ │ │ │ │ + "080e": 51, │ │ │ │ │ "08172729": 36, │ │ │ │ │ "08203696": 36, │ │ │ │ │ "08285275": 36, │ │ │ │ │ "08299933": 36, │ │ │ │ │ "08305695": 36, │ │ │ │ │ "08341016": 36, │ │ │ │ │ "08341265": 36, │ │ │ │ │ @@ -2518,125 +2516,121 @@ │ │ │ │ │ "08444113": 36, │ │ │ │ │ "084e": 48, │ │ │ │ │ "0868139": 36, │ │ │ │ │ "08724442": 36, │ │ │ │ │ "08729468": 36, │ │ │ │ │ "088": 38, │ │ │ │ │ "089e": 37, │ │ │ │ │ - "08j": 51, │ │ │ │ │ "08t00": 37, │ │ │ │ │ "09": [14, 36, 38, 52], │ │ │ │ │ "09179": 36, │ │ │ │ │ "091e": 37, │ │ │ │ │ "094": [41, 43], │ │ │ │ │ "094e": 48, │ │ │ │ │ "096": 43, │ │ │ │ │ "096e": 48, │ │ │ │ │ "09705329": 36, │ │ │ │ │ "097e": 37, │ │ │ │ │ "099": 41, │ │ │ │ │ "09t00": 37, │ │ │ │ │ "0alpha10": 54, │ │ │ │ │ "0d": 54, │ │ │ │ │ - "0d4a828336a0": 45, │ │ │ │ │ "0dev": 54, │ │ │ │ │ "0th": [37, 43], │ │ │ │ │ "0x0l": 54, │ │ │ │ │ - "0xffff34781480": 45, │ │ │ │ │ - "0xffff347824d0": 45, │ │ │ │ │ - "0xffff34782b00": 45, │ │ │ │ │ - "0xffff34783400": 45, │ │ │ │ │ - "0xffff34783d00": 45, │ │ │ │ │ - "0xffff34783d90": 45, │ │ │ │ │ - "0xffff34944dc0": 45, │ │ │ │ │ - "0xffff349f82d0": 54, │ │ │ │ │ - "0xffff34c04d60": 48, │ │ │ │ │ - "0xffff34cf8a50": 48, │ │ │ │ │ - "0xffff35b6b230": 48, │ │ │ │ │ - "0xffff35b6be00": 48, │ │ │ │ │ - "0xffff36012c20": 32, │ │ │ │ │ - "0xffff3b81ae40": 14, │ │ │ │ │ - "0xffff3c76fb60": 48, │ │ │ │ │ - "0xffff4bb6a480": 6, │ │ │ │ │ - "0xffff500fae90": 38, │ │ │ │ │ - "0xffff500fb390": 38, │ │ │ │ │ - "0xffff53338410": 48, │ │ │ │ │ - "0xffff5333c2f0": 48, │ │ │ │ │ - "0xffff5333c590": 44, │ │ │ │ │ - "0xffff5336fb10": 44, │ │ │ │ │ - "0xffff5336fc50": 44, │ │ │ │ │ - "0xffff5336fed0": 44, │ │ │ │ │ - "0xffff534bf380": 19, │ │ │ │ │ - "0xffff534d4cd0": 48, │ │ │ │ │ - "0xffff68482fd0": 48, │ │ │ │ │ - "0xffff68483110": 48, │ │ │ │ │ - "0xffff68483250": 48, │ │ │ │ │ - "0xffff68483390": 48, │ │ │ │ │ - "0xffff684a56d0": 48, │ │ │ │ │ - "0xffff684a5810": 48, │ │ │ │ │ - "0xffff684a5950": 48, │ │ │ │ │ - "0xffff684a5a90": 48, │ │ │ │ │ - "0xffff684a5bd0": 48, │ │ │ │ │ - "0xffff686a0cd0": 48, │ │ │ │ │ - "0xffff686f0050": 48, │ │ │ │ │ - "0xffff686f3110": 48, │ │ │ │ │ - "0xffff687edd10": 48, │ │ │ │ │ - "0xffff688391d0": 48, │ │ │ │ │ - "0xffff68e8d450": 48, │ │ │ │ │ - "0xffff68e8de50": 48, │ │ │ │ │ - "0xffff68e8e210": 48, │ │ │ │ │ - "0xffff68f4afd0": 48, │ │ │ │ │ - "0xffff68f4b110": 48, │ │ │ │ │ - "0xffff68f62490": 48, │ │ │ │ │ - "0xffff691eaad0": 48, │ │ │ │ │ - "0xffff693e5bd0": 48, │ │ │ │ │ - "0xffff69470410": 48, │ │ │ │ │ - "0xffff6957a710": 48, │ │ │ │ │ - "0xffff69b6da90": 48, │ │ │ │ │ - "0xffff69c8d1d0": 48, │ │ │ │ │ - "0xffff69d387d0": 48, │ │ │ │ │ - "0xffff69d38910": 48, │ │ │ │ │ - "0xffff69dbf890": 48, │ │ │ │ │ - "0xffff6a3b0ec0": 48, │ │ │ │ │ - "0xffff6a78c8b0": 45, │ │ │ │ │ - "0\u013ao\u0137\u0119": 51, │ │ │ │ │ + "0xffff3daea480": 6, │ │ │ │ │ + "0xffff5cb9d480": 45, │ │ │ │ │ + "0xffff5cb9e4d0": 45, │ │ │ │ │ + "0xffff5cb9eb00": 45, │ │ │ │ │ + "0xffff5cb9f400": 45, │ │ │ │ │ + "0xffff5cb9fd00": 45, │ │ │ │ │ + "0xffff5cb9fd90": 45, │ │ │ │ │ + "0xffff5cc18050": 48, │ │ │ │ │ + "0xffff5cd64dc0": 45, │ │ │ │ │ + "0xffff5d114a50": 48, │ │ │ │ │ + "0xffff5db70050": 54, │ │ │ │ │ + "0xffff5df8b230": 48, │ │ │ │ │ + "0xffff5df8be00": 48, │ │ │ │ │ + "0xffff5e436c20": 32, │ │ │ │ │ + "0xffff5ee4ae40": 14, │ │ │ │ │ + "0xffff60b5fb60": 48, │ │ │ │ │ + "0xffff7c0cee90": 38, │ │ │ │ │ + "0xffff7c0cf390": 38, │ │ │ │ │ + "0xffff84590410": 48, │ │ │ │ │ + "0xffff845942f0": 48, │ │ │ │ │ + "0xffff84594590": 44, │ │ │ │ │ + "0xffff845c7b10": 44, │ │ │ │ │ + "0xffff845c7c50": 44, │ │ │ │ │ + "0xffff845c7ed0": 44, │ │ │ │ │ + "0xffff84797380": 19, │ │ │ │ │ + "0xffff847accd0": 48, │ │ │ │ │ + "0xffff9486afd0": 48, │ │ │ │ │ + "0xffff9486b110": 48, │ │ │ │ │ + "0xffff9486b250": 48, │ │ │ │ │ + "0xffff9486b390": 48, │ │ │ │ │ + "0xffff948896d0": 48, │ │ │ │ │ + "0xffff94889810": 48, │ │ │ │ │ + "0xffff94889950": 48, │ │ │ │ │ + "0xffff94889a90": 48, │ │ │ │ │ + "0xffff94889bd0": 48, │ │ │ │ │ + "0xffff94a80cd0": 48, │ │ │ │ │ + "0xffff94ad0050": 48, │ │ │ │ │ + "0xffff94ad3110": 48, │ │ │ │ │ + "0xffff94bc9d10": 48, │ │ │ │ │ + "0xffff94c191d0": 48, │ │ │ │ │ + "0xffff9526d450": 48, │ │ │ │ │ + "0xffff9526de50": 48, │ │ │ │ │ + "0xffff9526e210": 48, │ │ │ │ │ + "0xffff95326fd0": 48, │ │ │ │ │ + "0xffff95327110": 48, │ │ │ │ │ + "0xffff9533a490": 48, │ │ │ │ │ + "0xffff955c6ad0": 48, │ │ │ │ │ + "0xffff957c5bd0": 48, │ │ │ │ │ + "0xffff95850410": 48, │ │ │ │ │ + "0xffff9595a710": 48, │ │ │ │ │ + "0xffff95f4da90": 48, │ │ │ │ │ + "0xffff960711d0": 48, │ │ │ │ │ + "0xffff961187d0": 48, │ │ │ │ │ + "0xffff96118910": 48, │ │ │ │ │ + "0xffff9619f890": 48, │ │ │ │ │ + "0xffff9678cec0": 48, │ │ │ │ │ + "0xffff96b6c8b0": 45, │ │ │ │ │ "1": [3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19, 20, 22, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ "10": [3, 6, 7, 8, 12, 13, 14, 16, 18, 19, 24, 25, 26, 27, 28, 30, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ "100": [3, 7, 8, 27, 28, 35, 36, 37, 38, 41, 43, 44, 45, 48, 49, 50, 54], │ │ │ │ │ "1000": [27, 37, 54], │ │ │ │ │ "10000": 36, │ │ │ │ │ "100000": 37, │ │ │ │ │ "1000x1000": [6, 37], │ │ │ │ │ "1003": 36, │ │ │ │ │ "100b": 47, │ │ │ │ │ - "100e": 51, │ │ │ │ │ "101": [36, 38, 41, 43, 48, 54], │ │ │ │ │ "101985": 45, │ │ │ │ │ "101e": 37, │ │ │ │ │ "102": [36, 38, 41, 43, 48, 54], │ │ │ │ │ "1025": 41, │ │ │ │ │ "102e": 37, │ │ │ │ │ "103": [36, 38, 41, 43, 48, 54], │ │ │ │ │ "104": [36, 38, 41, 43, 48, 54], │ │ │ │ │ "104569": 47, │ │ │ │ │ "10456922": 19, │ │ │ │ │ "104b": [35, 38], │ │ │ │ │ - "104e": 51, │ │ │ │ │ "105": [35, 36, 38, 41, 43, 47, 48], │ │ │ │ │ "1054": 30, │ │ │ │ │ "1055": 30, │ │ │ │ │ "1056": 30, │ │ │ │ │ "105e": 37, │ │ │ │ │ - "106": [36, 38, 41, 43, 48], │ │ │ │ │ + "106": [36, 38, 41, 43, 48, 51], │ │ │ │ │ "10614938": 36, │ │ │ │ │ "107": [36, 38, 41, 43, 48], │ │ │ │ │ "1074": 30, │ │ │ │ │ "1075": 30, │ │ │ │ │ "1076": 30, │ │ │ │ │ "1078": 30, │ │ │ │ │ + "10782": 51, │ │ │ │ │ "107e": 48, │ │ │ │ │ "108": [36, 38, 41, 43, 48, 52], │ │ │ │ │ "1080": [26, 30], │ │ │ │ │ "1081": 30, │ │ │ │ │ "108232": 14, │ │ │ │ │ "1087": 41, │ │ │ │ │ "109": [6, 36, 38, 41, 43, 48], │ │ │ │ │ @@ -2644,35 +2638,35 @@ │ │ │ │ │ "10m": [6, 7], │ │ │ │ │ "10t00": 37, │ │ │ │ │ "10t23": 52, │ │ │ │ │ "10th": [50, 54], │ │ │ │ │ "10x180x180": 37, │ │ │ │ │ "11": [3, 7, 8, 14, 19, 27, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ "110": [6, 36, 38, 43, 48], │ │ │ │ │ - "111": [6, 36, 38, 43, 48], │ │ │ │ │ + "111": [6, 36, 38, 43, 48, 51], │ │ │ │ │ "11111111": 36, │ │ │ │ │ "112": [6, 36, 38, 43, 48], │ │ │ │ │ "1126": 41, │ │ │ │ │ - "113": [6, 36, 38, 43, 48], │ │ │ │ │ - "113e": 51, │ │ │ │ │ + "113": [6, 36, 38, 43, 48, 51], │ │ │ │ │ + "11332": 51, │ │ │ │ │ "114": [6, 36, 38, 43, 48], │ │ │ │ │ "115": [6, 36, 38, 43, 48], │ │ │ │ │ "11567869": 14, │ │ │ │ │ "116": [36, 38, 43, 48], │ │ │ │ │ "116e": 37, │ │ │ │ │ "117": [36, 38, 43, 48, 52], │ │ │ │ │ "118": [36, 38, 43, 48, 52], │ │ │ │ │ "119": [36, 38, 43, 44, 48, 52], │ │ │ │ │ "1192": [35, 47], │ │ │ │ │ "11920871": 19, │ │ │ │ │ "119209": 47, │ │ │ │ │ "119e": 37, │ │ │ │ │ "11t00": 37, │ │ │ │ │ "12": [8, 11, 14, 18, 19, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ - "120": [36, 38, 43, 45, 48, 50, 51, 52], │ │ │ │ │ + "120": [36, 38, 43, 45, 48, 50, 52], │ │ │ │ │ "1209": 36, │ │ │ │ │ "120b": [35, 36, 41, 47], │ │ │ │ │ "121": [36, 38, 43, 48, 52], │ │ │ │ │ "1212": 36, │ │ │ │ │ "122": [36, 38, 43, 48, 52], │ │ │ │ │ "123": [14, 19, 36, 38, 43, 47, 48, 49, 52, 54], │ │ │ │ │ "1231": 40, │ │ │ │ │ @@ -2720,18 +2714,18 @@ │ │ │ │ │ "13t00": 37, │ │ │ │ │ "14": [8, 11, 12, 13, 19, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ "140": [36, 48], │ │ │ │ │ "1402938": 19, │ │ │ │ │ "1405": 45, │ │ │ │ │ "140kb": 52, │ │ │ │ │ "141": [36, 44, 48], │ │ │ │ │ - "14189": 51, │ │ │ │ │ "141e": [37, 48], │ │ │ │ │ "142": [19, 36, 48], │ │ │ │ │ "1422": 45, │ │ │ │ │ + "14275": 51, │ │ │ │ │ "143": [36, 48], │ │ │ │ │ "143e": 37, │ │ │ │ │ "144": [36, 48], │ │ │ │ │ "1443657600": 45, │ │ │ │ │ "144b": [19, 38, 40, 43], │ │ │ │ │ "145": [36, 48], │ │ │ │ │ "145e": 37, │ │ │ │ │ @@ -2750,44 +2744,42 @@ │ │ │ │ │ "14990579": 36, │ │ │ │ │ "14kb": 36, │ │ │ │ │ "14t00": 37, │ │ │ │ │ "15": [6, 7, 8, 9, 13, 14, 19, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ "150": [36, 48], │ │ │ │ │ "1505": 36, │ │ │ │ │ "150e": 48, │ │ │ │ │ - "151": 48, │ │ │ │ │ + "151": [48, 51], │ │ │ │ │ "152": [38, 48], │ │ │ │ │ "152b": [38, 50], │ │ │ │ │ "153": 48, │ │ │ │ │ "153e": 37, │ │ │ │ │ "154e": 37, │ │ │ │ │ "155": 41, │ │ │ │ │ "158": [41, 44], │ │ │ │ │ "158e": 37, │ │ │ │ │ "15b": 36, │ │ │ │ │ - "15j": 51, │ │ │ │ │ "15t00": 37, │ │ │ │ │ "15th": 50, │ │ │ │ │ "16": [8, 11, 19, 33, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ "160": 13, │ │ │ │ │ - "160b": [25, 45, 51, 54], │ │ │ │ │ + "160b": [25, 45, 54], │ │ │ │ │ "16129032": 14, │ │ │ │ │ "162": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "16274935": 14, │ │ │ │ │ "162e": 48, │ │ │ │ │ "163": 14, │ │ │ │ │ "163e": 37, │ │ │ │ │ "164": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "165": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "166": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32, 41], │ │ │ │ │ "1667": 44, │ │ │ │ │ "167": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32, 38], │ │ │ │ │ "1678": [18, 52, 53], │ │ │ │ │ "168": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ - "16814": 51, │ │ │ │ │ "168b": [35, 36], │ │ │ │ │ "169": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32, 41], │ │ │ │ │ "16959064": 36, │ │ │ │ │ "16b": [19, 35, 36, 38, 40, 43, 44, 45, 47, 49, 50, 53, 54], │ │ │ │ │ "16j": 51, │ │ │ │ │ "16t00": 37, │ │ │ │ │ "17": [8, 19, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ @@ -2800,29 +2792,29 @@ │ │ │ │ │ "173": [47, 49], │ │ │ │ │ "1732": [19, 35, 47], │ │ │ │ │ "17321465": [19, 35], │ │ │ │ │ "173215": [19, 47], │ │ │ │ │ "173e": 37, │ │ │ │ │ "174": [37, 38], │ │ │ │ │ "175": 37, │ │ │ │ │ - "175e": 51, │ │ │ │ │ "176": [6, 8, 9, 10, 13, 32, 37], │ │ │ │ │ - "177": [6, 8, 9, 10, 13, 32, 37], │ │ │ │ │ + "177": [6, 8, 9, 10, 13, 32, 37, 51], │ │ │ │ │ "1779": 36, │ │ │ │ │ - "177e": 37, │ │ │ │ │ + "177e": [37, 51], │ │ │ │ │ "178": [6, 8, 9, 10, 13, 32, 37], │ │ │ │ │ "179": [6, 8, 9, 10, 13, 32, 37, 41], │ │ │ │ │ "17t00": 37, │ │ │ │ │ "18": [3, 8, 18, 19, 27, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ "180": [6, 37, 44], │ │ │ │ │ "18072141": 14, │ │ │ │ │ "181": 6, │ │ │ │ │ - "182": [6, 36, 38], │ │ │ │ │ + "182": [6, 36, 38, 51], │ │ │ │ │ "183": 6, │ │ │ │ │ "184": 6, │ │ │ │ │ + "18446744073709551614": 51, │ │ │ │ │ "184b": 47, │ │ │ │ │ "185": 6, │ │ │ │ │ "18672976": 36, │ │ │ │ │ "187": 6, │ │ │ │ │ "188": 6, │ │ │ │ │ "189": [6, 44], │ │ │ │ │ "1891": 6, │ │ │ │ │ @@ -2833,20 +2825,19 @@ │ │ │ │ │ "19": [8, 14, 19, 35, 36, 37, 38, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ "190": 6, │ │ │ │ │ "1900": 45, │ │ │ │ │ "191": [40, 41], │ │ │ │ │ "19101252": 19, │ │ │ │ │ "191e": 48, │ │ │ │ │ "1926": 40, │ │ │ │ │ - "192b": [36, 38, 51, 53], │ │ │ │ │ + "192b": [36, 38, 53], │ │ │ │ │ "192e": [37, 51], │ │ │ │ │ - "19324": 51, │ │ │ │ │ - "194599019": 51, │ │ │ │ │ "195": 6, │ │ │ │ │ "196": 6, │ │ │ │ │ + "1969": 51, │ │ │ │ │ "197": 6, │ │ │ │ │ "1970": [27, 54], │ │ │ │ │ "1991": 54, │ │ │ │ │ "1999": 36, │ │ │ │ │ "19t00": 37, │ │ │ │ │ "1b": 51, │ │ │ │ │ "1d": [8, 24, 36, 38, 44, 47, 48, 49, 50, 54], │ │ │ │ │ @@ -2858,36 +2849,38 @@ │ │ │ │ │ "1st": [43, 50], │ │ │ │ │ "1ye": 54, │ │ │ │ │ "2": [3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ "20": [8, 13, 14, 16, 19, 24, 25, 26, 28, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ "200": [6, 36, 43, 48, 49], │ │ │ │ │ "2000": [14, 16, 27, 36, 38, 43, 44, 45, 47, 52, 54], │ │ │ │ │ "2001": [7, 14, 45, 53, 54], │ │ │ │ │ - "201": [6, 38, 43], │ │ │ │ │ + "201": [6, 38, 43, 51], │ │ │ │ │ "2014": [20, 38], │ │ │ │ │ "2015": [34, 37], │ │ │ │ │ "2016": 16, │ │ │ │ │ "2017": [16, 45], │ │ │ │ │ "2018": 33, │ │ │ │ │ "2019": 6, │ │ │ │ │ "202": [6, 43], │ │ │ │ │ "2020": [34, 37], │ │ │ │ │ "2021": [33, 34], │ │ │ │ │ "2022": [34, 38], │ │ │ │ │ "2023": 38, │ │ │ │ │ "2025": [26, 30, 32, 45], │ │ │ │ │ "202e": 37, │ │ │ │ │ "203": 6, │ │ │ │ │ + "203e": 51, │ │ │ │ │ "205": [6, 43], │ │ │ │ │ "206e": 37, │ │ │ │ │ - "207": 45, │ │ │ │ │ + "207": [45, 51], │ │ │ │ │ "208e": 37, │ │ │ │ │ "20995484": 19, │ │ │ │ │ "20b": 19, │ │ │ │ │ "20t00": 37, │ │ │ │ │ + "20t23": 51, │ │ │ │ │ "21": [8, 19, 35, 36, 37, 38, 40, 41, 43, 44, 45, 47, 48, 49, 51, 52, 53], │ │ │ │ │ "210e": 37, │ │ │ │ │ "211": [6, 8, 9, 10, 13, 32], │ │ │ │ │ "212": [6, 8, 9, 10, 13, 19, 32, 35, 47, 49], │ │ │ │ │ "212112": [19, 47], │ │ │ │ │ "21211203": [19, 35], │ │ │ │ │ "213": [6, 8, 9, 10, 13, 32], │ │ │ │ │ @@ -2901,57 +2894,58 @@ │ │ │ │ │ "2165": 6, │ │ │ │ │ "2166": 6, │ │ │ │ │ "217": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "2174": 36, │ │ │ │ │ "218": [6, 7, 8, 9, 10, 11, 12, 13], │ │ │ │ │ "219": [6, 7, 8, 9, 10, 11, 12, 13], │ │ │ │ │ "2193": 14, │ │ │ │ │ + "2196677581": 51, │ │ │ │ │ "21t00": 37, │ │ │ │ │ "22": [14, 19, 33, 35, 36, 37, 38, 40, 41, 43, 44, 45, 47, 48, 49, 51, 52, 53], │ │ │ │ │ "220": 43, │ │ │ │ │ "220e": 51, │ │ │ │ │ "222": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "22222222": 36, │ │ │ │ │ "224": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "224e": 37, │ │ │ │ │ "225": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "22546326": 36, │ │ │ │ │ - "225e": 51, │ │ │ │ │ "226": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "2262": [18, 52, 53], │ │ │ │ │ "226e": 48, │ │ │ │ │ "227": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ + "22760": 51, │ │ │ │ │ "228": [6, 7, 8, 9, 10, 11, 12, 13], │ │ │ │ │ "2288873043216132": 54, │ │ │ │ │ "229": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32, 38, 54], │ │ │ │ │ - "22e": 51, │ │ │ │ │ "22t00": 37, │ │ │ │ │ "23": [14, 18, 19, 35, 36, 37, 38, 40, 41, 43, 44, 45, 47, 48, 49, 51, 52, 53], │ │ │ │ │ "230": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "231": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "232": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "23207067": 36, │ │ │ │ │ "233": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "2333": 14, │ │ │ │ │ "23333333": 14, │ │ │ │ │ "234": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "234e": 37, │ │ │ │ │ + "235": 51, │ │ │ │ │ "2355": 43, │ │ │ │ │ "236": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "2380": 54, │ │ │ │ │ "23859177": 36, │ │ │ │ │ - "238e": 51, │ │ │ │ │ "23991312": 36, │ │ │ │ │ "23kb": 52, │ │ │ │ │ "23t00": 37, │ │ │ │ │ "23t12": 36, │ │ │ │ │ "24": [7, 14, 19, 35, 36, 37, 38, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ "240": [44, 48, 52], │ │ │ │ │ "240b": [37, 45], │ │ │ │ │ "240e": 48, │ │ │ │ │ + "241": 51, │ │ │ │ │ "24193548": 14, │ │ │ │ │ "241e": 37, │ │ │ │ │ "242e": 37, │ │ │ │ │ "244": 38, │ │ │ │ │ "2442": 37, │ │ │ │ │ "245": [13, 43], │ │ │ │ │ "245e": 48, │ │ │ │ │ @@ -2966,32 +2960,35 @@ │ │ │ │ │ "24t00": 37, │ │ │ │ │ "25": [7, 8, 14, 19, 35, 36, 37, 38, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ "250": [13, 48], │ │ │ │ │ "2509": 36, │ │ │ │ │ "251": 36, │ │ │ │ │ "2515": 36, │ │ │ │ │ "25176289": 14, │ │ │ │ │ + "25194": 51, │ │ │ │ │ "253": 38, │ │ │ │ │ "255": [13, 43, 45], │ │ │ │ │ + "25504": 51, │ │ │ │ │ "2554": 40, │ │ │ │ │ "258": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32, 43], │ │ │ │ │ "25828142": 36, │ │ │ │ │ + "258f": 45, │ │ │ │ │ "259": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32, 41, 44], │ │ │ │ │ "25t00": 37, │ │ │ │ │ "26": [14, 19, 35, 36, 37, 38, 40, 41, 43, 44, 45, 47, 48, 49, 51, 52, 53], │ │ │ │ │ "260": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32, 43], │ │ │ │ │ "26047600586578334": 54, │ │ │ │ │ "2605": [38, 40], │ │ │ │ │ "261": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "261e": 48, │ │ │ │ │ "262": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "26297658": 36, │ │ │ │ │ "263": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "263e": 48, │ │ │ │ │ - "264": 44, │ │ │ │ │ + "264": [44, 51], │ │ │ │ │ "26410385": 36, │ │ │ │ │ "264b": 38, │ │ │ │ │ "265": 13, │ │ │ │ │ "26522911": 36, │ │ │ │ │ "26585059": 36, │ │ │ │ │ "266": 49, │ │ │ │ │ "26652587": 36, │ │ │ │ │ @@ -3003,40 +3000,42 @@ │ │ │ │ │ "271148": 14, │ │ │ │ │ "27185989": 19, │ │ │ │ │ "2719": 19, │ │ │ │ │ "272": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "272b": 38, │ │ │ │ │ "273": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32, 48], │ │ │ │ │ "2733209": 36, │ │ │ │ │ + "27371": 51, │ │ │ │ │ "274": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32, 53], │ │ │ │ │ "27483458": 36, │ │ │ │ │ "274e": [37, 48], │ │ │ │ │ "275": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32, 43], │ │ │ │ │ "276": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "2762": 19, │ │ │ │ │ "27623202": 19, │ │ │ │ │ "2778": 44, │ │ │ │ │ "277e": 37, │ │ │ │ │ "278": 44, │ │ │ │ │ "27861203": 36, │ │ │ │ │ + "278j": 51, │ │ │ │ │ "27910634": 19, │ │ │ │ │ "27980632": 36, │ │ │ │ │ "27t00": 37, │ │ │ │ │ "28": [14, 19, 35, 36, 37, 38, 40, 41, 43, 44, 45, 48, 49, 51, 52, 53, 54], │ │ │ │ │ "280": 13, │ │ │ │ │ "28099849": 36, │ │ │ │ │ "280b": 36, │ │ │ │ │ "280e": 37, │ │ │ │ │ "282863": [19, 47], │ │ │ │ │ "28286334": [19, 35], │ │ │ │ │ "2829": [19, 35, 47], │ │ │ │ │ "283": [41, 47, 49], │ │ │ │ │ "285": [13, 38], │ │ │ │ │ "286e": 36, │ │ │ │ │ - "288b": [14, 36, 53], │ │ │ │ │ + "288b": [14, 36, 51, 53], │ │ │ │ │ "289": 6, │ │ │ │ │ "2899444": 36, │ │ │ │ │ "28t00": 37, │ │ │ │ │ "29": [7, 14, 18, 19, 35, 36, 38, 40, 41, 43, 44, 45, 48, 49, 51, 52, 53], │ │ │ │ │ "290": [6, 13], │ │ │ │ │ "291": 6, │ │ │ │ │ "2917": 45, │ │ │ │ │ @@ -3071,38 +3070,35 @@ │ │ │ │ │ "304": [6, 26], │ │ │ │ │ "305": [6, 26, 53], │ │ │ │ │ "30555813": 36, │ │ │ │ │ "305e": 37, │ │ │ │ │ "306": [6, 26], │ │ │ │ │ "3067": 6, │ │ │ │ │ "3068": 6, │ │ │ │ │ + "30682": 51, │ │ │ │ │ "30682759": 36, │ │ │ │ │ "306e": 37, │ │ │ │ │ "307": [6, 26], │ │ │ │ │ "3070": 6, │ │ │ │ │ "3071": 6, │ │ │ │ │ "3073": 6, │ │ │ │ │ "3074": 6, │ │ │ │ │ "307e": 37, │ │ │ │ │ - "308": [6, 51], │ │ │ │ │ + "308": 6, │ │ │ │ │ "30852683": 36, │ │ │ │ │ - "308j": 51, │ │ │ │ │ "309": [6, 44], │ │ │ │ │ - "309j": 51, │ │ │ │ │ "30t00": [14, 37, 52], │ │ │ │ │ "30t1": 52, │ │ │ │ │ "30t12": 52, │ │ │ │ │ "30t18": 52, │ │ │ │ │ "30t21": 52, │ │ │ │ │ "31": [14, 19, 35, 36, 37, 38, 40, 41, 43, 44, 45, 48, 49, 51, 52, 53], │ │ │ │ │ "310": 13, │ │ │ │ │ "310409": 14, │ │ │ │ │ "31040942": 14, │ │ │ │ │ - "311": 51, │ │ │ │ │ - "311j": 51, │ │ │ │ │ "3151": 6, │ │ │ │ │ "3153": 6, │ │ │ │ │ "3154": 6, │ │ │ │ │ "3155": 6, │ │ │ │ │ "3157": 6, │ │ │ │ │ "3158": 6, │ │ │ │ │ "315e": 37, │ │ │ │ │ @@ -3121,22 +3117,21 @@ │ │ │ │ │ "3226808": 19, │ │ │ │ │ "32269851": 14, │ │ │ │ │ "322e": 37, │ │ │ │ │ "3261": 40, │ │ │ │ │ "32618": 45, │ │ │ │ │ "326e": 37, │ │ │ │ │ "3297": 41, │ │ │ │ │ - "329a0716": 45, │ │ │ │ │ "32b": [19, 35, 36, 38, 40, 43, 44, 45, 48, 49, 50, 52, 54], │ │ │ │ │ "33": [14, 19, 35, 36, 38, 40, 41, 43, 44, 45, 48, 49, 51, 52, 54], │ │ │ │ │ "331e": 37, │ │ │ │ │ "333": 49, │ │ │ │ │ "33326004": 19, │ │ │ │ │ "33333333": 14, │ │ │ │ │ - "333e": 37, │ │ │ │ │ + "333e": [37, 51], │ │ │ │ │ "33419587": 36, │ │ │ │ │ "335": [40, 53], │ │ │ │ │ "3356": 41, │ │ │ │ │ "33584385": 19, │ │ │ │ │ "336": [38, 43, 54], │ │ │ │ │ "3362": 40, │ │ │ │ │ "33622174433445307": 54, │ │ │ │ │ @@ -3146,27 +3141,27 @@ │ │ │ │ │ "340": 13, │ │ │ │ │ "340921626611": 45, │ │ │ │ │ "34115662": 14, │ │ │ │ │ "341157": 14, │ │ │ │ │ "341e": [37, 48], │ │ │ │ │ "342": 43, │ │ │ │ │ "34271537": 14, │ │ │ │ │ - "342e": 48, │ │ │ │ │ + "342e": [48, 51], │ │ │ │ │ "343": 14, │ │ │ │ │ "34301681": 36, │ │ │ │ │ "344": 43, │ │ │ │ │ "34495e": 48, │ │ │ │ │ "34576404": 14, │ │ │ │ │ + "34591": 51, │ │ │ │ │ "346": [14, 41], │ │ │ │ │ "34723825": 14, │ │ │ │ │ "348": 44, │ │ │ │ │ "3498db": 48, │ │ │ │ │ "35": [7, 14, 19, 35, 36, 38, 41, 43, 44, 45, 48, 49, 50, 51, 54], │ │ │ │ │ "350e": 48, │ │ │ │ │ - "35168": 51, │ │ │ │ │ "352": [6, 54], │ │ │ │ │ "35205353914802473": 54, │ │ │ │ │ "3521": 43, │ │ │ │ │ "354": [6, 40], │ │ │ │ │ "355": 6, │ │ │ │ │ "35677824": 19, │ │ │ │ │ "357": [6, 52], │ │ │ │ │ @@ -3216,28 +3211,26 @@ │ │ │ │ │ "37674971618967135": 54, │ │ │ │ │ "377": [38, 43, 54], │ │ │ │ │ "378e": 48, │ │ │ │ │ "38": [19, 35, 36, 38, 41, 43, 44, 45, 48, 49, 51, 54], │ │ │ │ │ "381": 44, │ │ │ │ │ "381e": 48, │ │ │ │ │ "383": 51, │ │ │ │ │ - "38406": 51, │ │ │ │ │ "384b": 53, │ │ │ │ │ "384e": 37, │ │ │ │ │ "385": 6, │ │ │ │ │ "386": 6, │ │ │ │ │ "387": 6, │ │ │ │ │ "388": 6, │ │ │ │ │ "3884": [36, 52], │ │ │ │ │ "3885": 52, │ │ │ │ │ "3886": 52, │ │ │ │ │ "3887": 52, │ │ │ │ │ "389": 6, │ │ │ │ │ "389e": 45, │ │ │ │ │ - "38j": 51, │ │ │ │ │ "39": [6, 7, 8, 9, 10, 11, 12, 13, 14, 19, 35, 36, 38, 41, 43, 44, 45, 48, 49, 54], │ │ │ │ │ "390": 6, │ │ │ │ │ "391": 6, │ │ │ │ │ "391e": 37, │ │ │ │ │ "392e": 45, │ │ │ │ │ "395": [41, 43], │ │ │ │ │ "395763": 14, │ │ │ │ │ @@ -3252,29 +3245,27 @@ │ │ │ │ │ "3min": 53, │ │ │ │ │ "3rd": 28, │ │ │ │ │ "4": [3, 6, 7, 8, 9, 11, 12, 13, 14, 16, 19, 25, 27, 30, 32, 33, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 49, 50, 51, 52, 53], │ │ │ │ │ "40": [19, 28, 35, 36, 38, 40, 41, 43, 44, 45, 48, 49, 50, 54], │ │ │ │ │ "400": [6, 48, 49], │ │ │ │ │ "400e": 48, │ │ │ │ │ "401": [6, 43], │ │ │ │ │ - "401e": 51, │ │ │ │ │ "402": 6, │ │ │ │ │ "403": 6, │ │ │ │ │ "40324704": 36, │ │ │ │ │ - "403e": 51, │ │ │ │ │ "404": [6, 43], │ │ │ │ │ "405": 43, │ │ │ │ │ "406e": 48, │ │ │ │ │ "4074": 41, │ │ │ │ │ "407e": 37, │ │ │ │ │ "408": 41, │ │ │ │ │ "40824829": 36, │ │ │ │ │ "40880017": 36, │ │ │ │ │ "408b": 45, │ │ │ │ │ - "40b": [19, 35, 36, 38, 43, 44, 45, 51, 54], │ │ │ │ │ + "40b": [19, 35, 36, 38, 43, 44, 45, 54], │ │ │ │ │ "41": [19, 35, 36, 38, 41, 43, 44, 45, 48, 49, 54], │ │ │ │ │ "410e": 48, │ │ │ │ │ "41155042": 36, │ │ │ │ │ "41156272": 36, │ │ │ │ │ "41184582": 36, │ │ │ │ │ "41198807": 36, │ │ │ │ │ "412": 41, │ │ │ │ │ @@ -3293,15 +3284,14 @@ │ │ │ │ │ "424": 38, │ │ │ │ │ "42497233": 19, │ │ │ │ │ "425": [19, 41], │ │ │ │ │ "427": 44, │ │ │ │ │ "428": 48, │ │ │ │ │ "4281": 36, │ │ │ │ │ "42b": 36, │ │ │ │ │ - "42b7": 45, │ │ │ │ │ "43": [14, 19, 35, 36, 38, 41, 43, 44, 45, 48, 49, 54], │ │ │ │ │ "4326": 45, │ │ │ │ │ "4333": 44, │ │ │ │ │ "439e": 37, │ │ │ │ │ "44": [19, 35, 36, 38, 41, 43, 44, 45, 48, 49, 54], │ │ │ │ │ "440e": 48, │ │ │ │ │ "441e": 37, │ │ │ │ │ @@ -3324,15 +3314,14 @@ │ │ │ │ │ "453e": 48, │ │ │ │ │ "4555": 41, │ │ │ │ │ "456060": 14, │ │ │ │ │ "456b": 38, │ │ │ │ │ "457e": 52, │ │ │ │ │ "458e": 52, │ │ │ │ │ "459e": 52, │ │ │ │ │ - "45j": 51, │ │ │ │ │ "46": [19, 36, 38, 40, 41, 43, 44, 45, 48, 49, 54], │ │ │ │ │ "46194319": 36, │ │ │ │ │ "462": 43, │ │ │ │ │ "46376911": 14, │ │ │ │ │ "46462434": 19, │ │ │ │ │ "464e": 37, │ │ │ │ │ "465e": 37, │ │ │ │ │ @@ -3340,14 +3329,15 @@ │ │ │ │ │ "467e": [36, 37], │ │ │ │ │ "46830462": 36, │ │ │ │ │ "469": [45, 47, 49], │ │ │ │ │ "4691": [19, 35, 37, 47], │ │ │ │ │ "469112": [19, 47], │ │ │ │ │ "4691123": [19, 35], │ │ │ │ │ "47": [7, 19, 36, 38, 41, 43, 44, 45, 48, 49, 54], │ │ │ │ │ + "47015": 51, │ │ │ │ │ "471": 43, │ │ │ │ │ "47145519": 36, │ │ │ │ │ "47146929": 36, │ │ │ │ │ "4715": 45, │ │ │ │ │ "47179359": 36, │ │ │ │ │ "47195655": 36, │ │ │ │ │ "472e": 37, │ │ │ │ │ @@ -3361,36 +3351,39 @@ │ │ │ │ │ "48541500": 45, │ │ │ │ │ "485e": 37, │ │ │ │ │ "4867138": 36, │ │ │ │ │ "48671934": 36, │ │ │ │ │ "48672119": 36, │ │ │ │ │ "4875": 36, │ │ │ │ │ "487e": 37, │ │ │ │ │ - "48b": [19, 35, 36, 40, 43, 44, 47, 49, 51, 54], │ │ │ │ │ + "48b": [19, 35, 36, 40, 43, 44, 47, 49, 54], │ │ │ │ │ + "48b4": 45, │ │ │ │ │ "49": [19, 36, 38, 41, 43, 44, 45, 48, 49, 54], │ │ │ │ │ "4909415": 19, │ │ │ │ │ "494929": 47, │ │ │ │ │ "49492927": 19, │ │ │ │ │ "49497537": 19, │ │ │ │ │ "495": 47, │ │ │ │ │ "495e": 48, │ │ │ │ │ "497": [43, 44], │ │ │ │ │ "499e": 37, │ │ │ │ │ "4b": [35, 43, 49, 54], │ │ │ │ │ "4d": 48, │ │ │ │ │ + "4dbdeb02": 45, │ │ │ │ │ "4kb": [48, 52], │ │ │ │ │ + "4\u010b": 51, │ │ │ │ │ "5": [6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 19, 25, 27, 30, 32, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ "50": [7, 14, 19, 28, 32, 35, 36, 38, 40, 41, 43, 44, 45, 48, 49, 54], │ │ │ │ │ "500": [13, 45, 48, 54], │ │ │ │ │ + "500e": 51, │ │ │ │ │ "502": 44, │ │ │ │ │ "504": 40, │ │ │ │ │ "505": 38, │ │ │ │ │ "505e": 48, │ │ │ │ │ "506234": 14, │ │ │ │ │ - "5066": 51, │ │ │ │ │ "508": 44, │ │ │ │ │ "5081": 30, │ │ │ │ │ "509": [19, 32, 35, 47, 49], │ │ │ │ │ "5090585": [19, 35], │ │ │ │ │ "509059": [19, 47], │ │ │ │ │ "5093": 36, │ │ │ │ │ "509e": 37, │ │ │ │ │ @@ -3408,28 +3401,27 @@ │ │ │ │ │ "519": 6, │ │ │ │ │ "5199731": 19, │ │ │ │ │ "519e": 37, │ │ │ │ │ "52": [19, 36, 38, 41, 43, 44, 45, 48, 49, 54], │ │ │ │ │ "520": 6, │ │ │ │ │ "521": 6, │ │ │ │ │ "522": 6, │ │ │ │ │ - "522e": 36, │ │ │ │ │ + "522e": [36, 51], │ │ │ │ │ "524": 6, │ │ │ │ │ "524e": [37, 48], │ │ │ │ │ "52571455": 36, │ │ │ │ │ "5281": 16, │ │ │ │ │ "528e": 48, │ │ │ │ │ "52925136": 36, │ │ │ │ │ "52926718": 36, │ │ │ │ │ "52963124": 36, │ │ │ │ │ "52981418": 36, │ │ │ │ │ "53": [8, 19, 36, 38, 41, 43, 44, 45, 48, 49, 54], │ │ │ │ │ "531e": 37, │ │ │ │ │ "5334": 16, │ │ │ │ │ - "53378": 51, │ │ │ │ │ "534e": 37, │ │ │ │ │ "538": 44, │ │ │ │ │ "538e": 37, │ │ │ │ │ "53916524": 19, │ │ │ │ │ "54": [3, 18, 19, 36, 38, 41, 43, 44, 45, 48, 49, 54], │ │ │ │ │ "540e": 48, │ │ │ │ │ "5417": 45, │ │ │ │ │ @@ -3440,15 +3432,15 @@ │ │ │ │ │ "544": 14, │ │ │ │ │ "54401285": 36, │ │ │ │ │ "54401905": 36, │ │ │ │ │ "54402111": 36, │ │ │ │ │ "544arrai": 14, │ │ │ │ │ "544xarrai": 14, │ │ │ │ │ "545e": 37, │ │ │ │ │ - "546e": [37, 51], │ │ │ │ │ + "546e": 37, │ │ │ │ │ "547e": 48, │ │ │ │ │ "549": 41, │ │ │ │ │ "55": [19, 36, 38, 41, 43, 44, 45, 48, 49, 54], │ │ │ │ │ "550e": 37, │ │ │ │ │ "551": 38, │ │ │ │ │ "552": 41, │ │ │ │ │ "552b": 38, │ │ │ │ │ @@ -3461,15 +3453,15 @@ │ │ │ │ │ "55807323": 14, │ │ │ │ │ "56": [3, 19, 36, 38, 41, 43, 44, 45, 48, 49, 54], │ │ │ │ │ "5607": 45, │ │ │ │ │ "561": 43, │ │ │ │ │ "562": 38, │ │ │ │ │ "567": 19, │ │ │ │ │ "56702035": 19, │ │ │ │ │ - "568e": [37, 51], │ │ │ │ │ + "568e": 37, │ │ │ │ │ "56b": [38, 43, 54], │ │ │ │ │ "57": [19, 36, 38, 41, 43, 44, 45, 48, 49, 54], │ │ │ │ │ "572e": 37, │ │ │ │ │ "574": 43, │ │ │ │ │ "574e": 37, │ │ │ │ │ "5753": 41, │ │ │ │ │ "577e": 37, │ │ │ │ │ @@ -3503,35 +3495,37 @@ │ │ │ │ │ "61": [19, 36, 38, 41, 43, 44, 45, 48, 54], │ │ │ │ │ "611": 43, │ │ │ │ │ "611e": [37, 48], │ │ │ │ │ "612e": 45, │ │ │ │ │ "613": [38, 43], │ │ │ │ │ "616e": 37, │ │ │ │ │ "617e": 48, │ │ │ │ │ - "61958": 51, │ │ │ │ │ "619e": 48, │ │ │ │ │ "62": [19, 36, 38, 41, 43, 44, 45, 48, 54], │ │ │ │ │ "621": 45, │ │ │ │ │ "622e": 37, │ │ │ │ │ "623e": 37, │ │ │ │ │ + "62409": 51, │ │ │ │ │ "624e": 37, │ │ │ │ │ "625": 45, │ │ │ │ │ "625e": 37, │ │ │ │ │ "6285": 41, │ │ │ │ │ "62kb": 36, │ │ │ │ │ "63": [3, 19, 36, 38, 41, 43, 44, 45, 48, 54], │ │ │ │ │ + "63321": 51, │ │ │ │ │ "634": 38, │ │ │ │ │ "634e": 37, │ │ │ │ │ "635": 44, │ │ │ │ │ "63593435": 14, │ │ │ │ │ "63696169": 36, │ │ │ │ │ "638e": 48, │ │ │ │ │ "64": [19, 36, 38, 41, 43, 44, 45, 48, 54], │ │ │ │ │ "642": 43, │ │ │ │ │ "645e": 37, │ │ │ │ │ + "64836": 51, │ │ │ │ │ "648b": 38, │ │ │ │ │ "64b": [35, 36, 40, 43, 49, 50, 51, 52], │ │ │ │ │ "65": [19, 36, 38, 41, 43, 45, 48, 54], │ │ │ │ │ "650e": 37, │ │ │ │ │ "651e": 37, │ │ │ │ │ "6525": 36, │ │ │ │ │ "652e": 37, │ │ │ │ │ @@ -3551,19 +3545,20 @@ │ │ │ │ │ "68": [36, 38, 41, 43, 45, 48, 54], │ │ │ │ │ "6807": 24, │ │ │ │ │ "680b": 38, │ │ │ │ │ "68137385": 14, │ │ │ │ │ "683e": 37, │ │ │ │ │ "684": 38, │ │ │ │ │ "686763": 14, │ │ │ │ │ - "69": [6, 36, 38, 41, 43, 45, 48, 54], │ │ │ │ │ + "69": [6, 36, 38, 41, 43, 45, 48, 51, 54], │ │ │ │ │ "691e": [37, 48], │ │ │ │ │ "693e": 37, │ │ │ │ │ + "694e": 51, │ │ │ │ │ "6981": 41, │ │ │ │ │ - "6b": 35, │ │ │ │ │ + "6b": [35, 51], │ │ │ │ │ "6h": [52, 54], │ │ │ │ │ "6kb": [14, 52], │ │ │ │ │ "7": [3, 6, 7, 8, 9, 11, 12, 14, 19, 25, 27, 30, 32, 33, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ "70": [6, 36, 38, 41, 43, 44, 45, 48, 54], │ │ │ │ │ "701": 44, │ │ │ │ │ "702": 43, │ │ │ │ │ "703e": 48, │ │ │ │ │ @@ -3668,16 +3663,17 @@ │ │ │ │ │ "789": [38, 44], │ │ │ │ │ "79": [36, 38, 41, 43, 48, 54], │ │ │ │ │ "790e": 48, │ │ │ │ │ "791": 45, │ │ │ │ │ "79119196": 36, │ │ │ │ │ "7917": 45, │ │ │ │ │ "792": 45, │ │ │ │ │ + "795e": 51, │ │ │ │ │ "797e": 53, │ │ │ │ │ - "798e": [37, 51], │ │ │ │ │ + "798e": 37, │ │ │ │ │ "8": [3, 6, 7, 8, 11, 12, 13, 14, 16, 18, 19, 25, 27, 30, 32, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ "80": [36, 38, 41, 43, 48, 49, 54], │ │ │ │ │ "800": 30, │ │ │ │ │ "800b": [25, 36], │ │ │ │ │ "800e": 37, │ │ │ │ │ "800mb": 37, │ │ │ │ │ "801": 30, │ │ │ │ │ @@ -3698,25 +3694,24 @@ │ │ │ │ │ "811": 44, │ │ │ │ │ "812e": 37, │ │ │ │ │ "81327024": 36, │ │ │ │ │ "814": 44, │ │ │ │ │ "814e": 37, │ │ │ │ │ "81649658": 16, │ │ │ │ │ "816497": 16, │ │ │ │ │ - "816e": 51, │ │ │ │ │ "81min": 53, │ │ │ │ │ "82": [19, 36, 38, 41, 43, 48, 54], │ │ │ │ │ "8204": 43, │ │ │ │ │ "821e": 37, │ │ │ │ │ "82258065": 14, │ │ │ │ │ "8226arrai": 14, │ │ │ │ │ "825e": 36, │ │ │ │ │ "82678535": [19, 35], │ │ │ │ │ "826e": 45, │ │ │ │ │ - "827e": [37, 45, 51], │ │ │ │ │ + "827e": [37, 45], │ │ │ │ │ "829e": 37, │ │ │ │ │ "83": [3, 36, 38, 41, 43, 48, 54], │ │ │ │ │ "830e": 37, │ │ │ │ │ "833": 45, │ │ │ │ │ "8331": 41, │ │ │ │ │ "8333": 45, │ │ │ │ │ "837e": 37, │ │ │ │ │ @@ -3781,80 +3776,78 @@ │ │ │ │ │ "89": [36, 37, 38, 41, 43, 48, 54], │ │ │ │ │ "893": 44, │ │ │ │ │ "893e": [37, 48], │ │ │ │ │ "897": [38, 43], │ │ │ │ │ "8972": 40, │ │ │ │ │ "897e": 48, │ │ │ │ │ "8987": 41, │ │ │ │ │ - "8a": 45, │ │ │ │ │ "8b": [16, 19, 35, 36, 38, 40, 41, 43, 44, 47, 49, 51, 52, 54], │ │ │ │ │ "8kb": 54, │ │ │ │ │ "8mb": 37, │ │ │ │ │ "8x": 54, │ │ │ │ │ "9": [3, 6, 7, 8, 12, 14, 19, 25, 27, 30, 32, 33, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53], │ │ │ │ │ "90": [3, 12, 35, 36, 38, 41, 43, 48, 49, 54], │ │ │ │ │ - "900e": [48, 51], │ │ │ │ │ + "900e": 48, │ │ │ │ │ "904e": 48, │ │ │ │ │ "905e": 48, │ │ │ │ │ "90680094": 19, │ │ │ │ │ "906e": 48, │ │ │ │ │ "91": [12, 36, 38, 41, 43, 48, 54], │ │ │ │ │ "911": 44, │ │ │ │ │ "912": 44, │ │ │ │ │ "91275558": 36, │ │ │ │ │ "912e": 37, │ │ │ │ │ "913e": 37, │ │ │ │ │ "915": 38, │ │ │ │ │ "915e": 48, │ │ │ │ │ "916": 36, │ │ │ │ │ "9167": 45, │ │ │ │ │ + "9168af1a0c2a": 45, │ │ │ │ │ "917": 45, │ │ │ │ │ "92": [7, 36, 38, 41, 43, 48, 54], │ │ │ │ │ "921e": 37, │ │ │ │ │ "927": 38, │ │ │ │ │ "929e": 37, │ │ │ │ │ "93": [6, 36, 38, 41, 43, 44, 48, 54], │ │ │ │ │ "931542": 14, │ │ │ │ │ "93154201": 14, │ │ │ │ │ "93221199": 14, │ │ │ │ │ "933": 36, │ │ │ │ │ "933e": 48, │ │ │ │ │ "93548387": 14, │ │ │ │ │ "9355": 14, │ │ │ │ │ - "935e": 51, │ │ │ │ │ "9363595": 19, │ │ │ │ │ "937": 40, │ │ │ │ │ "9399": 36, │ │ │ │ │ "94": [6, 36, 38, 41, 43, 48, 54], │ │ │ │ │ "942": 43, │ │ │ │ │ "944e": [48, 53], │ │ │ │ │ + "9461": 51, │ │ │ │ │ "947726688477": 45, │ │ │ │ │ "95": [6, 9, 13, 36, 38, 41, 43, 48, 54], │ │ │ │ │ "9516": 14, │ │ │ │ │ "9516129": 14, │ │ │ │ │ "953": 38, │ │ │ │ │ "9537291": 36, │ │ │ │ │ "953e": 48, │ │ │ │ │ "958": 45, │ │ │ │ │ "95902648": 36, │ │ │ │ │ "95a5a6": 48, │ │ │ │ │ "96": [6, 36, 38, 41, 43, 48, 54], │ │ │ │ │ "960b": 25, │ │ │ │ │ - "960e": 51, │ │ │ │ │ "961e": 37, │ │ │ │ │ "963228": 14, │ │ │ │ │ "96641818": 19, │ │ │ │ │ "9667": [38, 40], │ │ │ │ │ "967": [36, 38, 43], │ │ │ │ │ "967409": 14, │ │ │ │ │ "967e": 37, │ │ │ │ │ "968e": 37, │ │ │ │ │ - "96b": [14, 19, 35, 36, 38, 40, 43, 48, 50, 53, 54], │ │ │ │ │ - "96e": 51, │ │ │ │ │ - "97": [6, 36, 38, 41, 43, 48, 54], │ │ │ │ │ + "96b": [14, 19, 35, 36, 38, 40, 43, 48, 50, 51, 53, 54], │ │ │ │ │ + "97": [6, 36, 38, 41, 43, 48, 51, 54], │ │ │ │ │ "971e": 48, │ │ │ │ │ "973": 38, │ │ │ │ │ "974": 44, │ │ │ │ │ "97498828": 36, │ │ │ │ │ "975426": 14, │ │ │ │ │ "9781708": 19, │ │ │ │ │ "978e": 37, │ │ │ │ │ @@ -3986,15 +3979,14 @@ │ │ │ │ │ "_title_for_slic": 54, │ │ │ │ │ "_unsign": 54, │ │ │ │ │ "_urlopen": 6, │ │ │ │ │ "_variabl": 54, │ │ │ │ │ "_wait_cursor_for_draw_cm": 6, │ │ │ │ │ "_xy_index": 28, │ │ │ │ │ "a0": [36, 48], │ │ │ │ │ - "a0cc": 45, │ │ │ │ │ "a2": [36, 54], │ │ │ │ │ "aaron": 54, │ │ │ │ │ "ab": [36, 41, 43, 47], │ │ │ │ │ "abandon": 54, │ │ │ │ │ "abba": 40, │ │ │ │ │ "abbrevi": 19, │ │ │ │ │ "abc": [19, 38, 43, 54], │ │ │ │ │ @@ -4347,14 +4339,15 @@ │ │ │ │ │ "axi": [11, 16, 18, 19, 20, 22, 24, 30, 36, 37, 38, 39, 40, 41, 45, 47, 50, 51, 54], │ │ │ │ │ "axisarrai": 5, │ │ │ │ │ "axisgrid": 14, │ │ │ │ │ "ayrton": 54, │ │ │ │ │ "azur": 54, │ │ │ │ │ "b": [3, 19, 25, 35, 36, 37, 38, 40, 41, 43, 44, 47, 48, 49, 50, 51, 52, 54], │ │ │ │ │ "b2": [36, 54], │ │ │ │ │ + "b6f6": 45, │ │ │ │ │ "ba": 54, │ │ │ │ │ "back": [1, 8, 16, 19, 20, 26, 30, 31, 36, 37, 38, 39, 40, 41, 43, 45, 48, 49, 51, 54], │ │ │ │ │ "backend": [1, 5, 6, 16, 24, 29, 30, 31, 32, 33, 37, 38, 43, 45, 53, 54], │ │ │ │ │ "backend_agg": 6, │ │ │ │ │ "backend_arrai": 27, │ │ │ │ │ "backend_bas": 6, │ │ │ │ │ "backend_kwarg": [27, 45, 54], │ │ │ │ │ @@ -5609,15 +5602,15 @@ │ │ │ │ │ "find_common_ancestor": 41, │ │ │ │ │ "findal": 54, │ │ │ │ │ "fine": [3, 19, 45, 51], │ │ │ │ │ "finer": 54, │ │ │ │ │ "finish": [3, 54], │ │ │ │ │ "finit": [5, 12, 36, 54], │ │ │ │ │ "firm": 16, │ │ │ │ │ - "first": [3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18, 19, 24, 28, 30, 32, 33, 35, 36, 38, 41, 43, 44, 45, 48, 49, 52, 54], │ │ │ │ │ + "first": [3, 8, 9, 11, 13, 14, 18, 19, 24, 28, 32, 33, 35, 36, 38, 41, 43, 44, 45, 48, 52, 54], │ │ │ │ │ "fiscal": [33, 54], │ │ │ │ │ "fischer": 54, │ │ │ │ │ "fish": 41, │ │ │ │ │ "fit": [16, 33, 37, 41, 45, 48, 54], │ │ │ │ │ "fitzgerald": [16, 54], │ │ │ │ │ "five": [36, 48, 54], │ │ │ │ │ "fix": [3, 8, 16, 37, 38, 45, 48, 50, 53], │ │ │ │ │ @@ -6879,15 +6872,14 @@ │ │ │ │ │ "gundersen": 54, │ │ │ │ │ "gunyh\u00f3": 54, │ │ │ │ │ "gupta": 54, │ │ │ │ │ "guvector": 36, │ │ │ │ │ "gzip": [45, 54], │ │ │ │ │ "g\u00f3rny": 54, │ │ │ │ │ "g\u00f6bel": 54, │ │ │ │ │ - "g\u016dn\u0140d": 51, │ │ │ │ │ "h": [7, 52, 54], │ │ │ │ │ "h5": [16, 37, 45], │ │ │ │ │ "h5netcdf": [16, 18, 22, 37, 45, 54], │ │ │ │ │ "h5netcdfstor": 54, │ │ │ │ │ "h5py": [16, 45, 54], │ │ │ │ │ "h_c": 7, │ │ │ │ │ "ha": [3, 7, 8, 9, 11, 12, 16, 19, 20, 24, 26, 28, 30, 33, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 54], │ │ │ │ │ @@ -7040,14 +7032,15 @@ │ │ │ │ │ "hypercub": 54, │ │ │ │ │ "hypothesi": [3, 5, 18, 54], │ │ │ │ │ "hyrax": 45, │ │ │ │ │ "h\u00e4fner": 54, │ │ │ │ │ "h\u00f6chenberg": 54, │ │ │ │ │ "h\u00f6rsch": 54, │ │ │ │ │ "h\u00f8xbro": 54, │ │ │ │ │ + "h\u017e\u0173\u017f\u017c": 51, │ │ │ │ │ "i": [1, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 17, 18, 19, 20, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54], │ │ │ │ │ "ia": [14, 38, 43], │ │ │ │ │ "ian": 54, │ │ │ │ │ "ical": 4, │ │ │ │ │ "idea": [3, 19, 24, 31, 33, 36, 37, 40, 44, 45, 51, 54], │ │ │ │ │ "ideal": [3, 24, 27, 37], │ │ │ │ │ "ident": [16, 19, 24, 37, 39, 40, 41, 54], │ │ │ │ │ @@ -7161,15 +7154,15 @@ │ │ │ │ │ "instanti": [27, 54], │ │ │ │ │ "instead": [3, 6, 8, 12, 19, 20, 24, 29, 30, 31, 33, 35, 36, 37, 38, 39, 40, 41, 43, 45, 47, 48, 50, 51, 54], │ │ │ │ │ "institut": 34, │ │ │ │ │ "instruct": [3, 45, 54], │ │ │ │ │ "instrument": 38, │ │ │ │ │ "insuffici": 36, │ │ │ │ │ "int": [24, 36, 50, 51, 54], │ │ │ │ │ - "int16": [3, 45], │ │ │ │ │ + "int16": [3, 45, 51], │ │ │ │ │ "int32": [3, 54], │ │ │ │ │ "int64": [3, 14, 19, 35, 36, 37, 38, 40, 41, 43, 44, 45, 47, 48, 49, 50, 52, 53, 54], │ │ │ │ │ "int641": 14, │ │ │ │ │ "int8": [3, 51], │ │ │ │ │ "intact": 54, │ │ │ │ │ "intarr": 36, │ │ │ │ │ "integ": [19, 20, 24, 27, 30, 36, 38, 43, 45, 51, 54], │ │ │ │ │ @@ -7252,15 +7245,16 @@ │ │ │ │ │ "iter": [6, 8, 24, 27, 35, 36, 38, 40, 54], │ │ │ │ │ "itertool": [27, 53], │ │ │ │ │ "its": [3, 9, 16, 18, 19, 20, 27, 30, 32, 33, 36, 38, 40, 41, 43, 45, 47, 49, 50, 52, 54], │ │ │ │ │ "itself": [3, 18, 19, 20, 24, 28, 30, 36, 38, 43, 45, 47, 54], │ │ │ │ │ "iv": 41, │ │ │ │ │ "ix": 43, │ │ │ │ │ "ix_": 43, │ │ │ │ │ - "j": [16, 24, 39, 41, 43, 51, 54], │ │ │ │ │ + "i\u0135zw": 51, │ │ │ │ │ + "j": [16, 24, 39, 41, 43, 54], │ │ │ │ │ "jack": 54, │ │ │ │ │ "jacob": 54, │ │ │ │ │ "jaeschk": 54, │ │ │ │ │ "jahren": 54, │ │ │ │ │ "jame": 54, │ │ │ │ │ "jan": [52, 53], │ │ │ │ │ "jansen": 54, │ │ │ │ │ @@ -7518,15 +7512,15 @@ │ │ │ │ │ "lt": [6, 14], │ │ │ │ │ "luka": 54, │ │ │ │ │ "luke": 54, │ │ │ │ │ "lurcock": 54, │ │ │ │ │ "lusewel": 54, │ │ │ │ │ "lxml": 54, │ │ │ │ │ "lzf": 54, │ │ │ │ │ - "l\u016b\u00fe\u0142\u0101": 51, │ │ │ │ │ + "l\u0109": 51, │ │ │ │ │ "m": [3, 6, 8, 14, 18, 24, 37, 47, 52, 53, 54], │ │ │ │ │ "ma": 54, │ │ │ │ │ "maahn": 54, │ │ │ │ │ "machin": [3, 18, 37, 49, 54], │ │ │ │ │ "machineri": [32, 52, 54], │ │ │ │ │ "maciek": 54, │ │ │ │ │ "maco": [3, 54], │ │ │ │ │ @@ -7823,15 +7817,15 @@ │ │ │ │ │ "nanosecond": [44, 52, 54], │ │ │ │ │ "nanquantil": 54, │ │ │ │ │ "nansum": 36, │ │ │ │ │ "narr": 54, │ │ │ │ │ "narrai": 16, │ │ │ │ │ "nasa": 45, │ │ │ │ │ "nascent": [49, 54], │ │ │ │ │ - "nat": 54, │ │ │ │ │ + "nat": [51, 54], │ │ │ │ │ "nathan": 54, │ │ │ │ │ "nation": 37, │ │ │ │ │ "nativ": [16, 26, 36, 45, 48, 52, 54], │ │ │ │ │ "nattino": 54, │ │ │ │ │ "natur": [6, 16, 20, 24, 30, 37, 38, 43, 49, 54], │ │ │ │ │ "natural_earth": 6, │ │ │ │ │ "naturalearthfeatur": [6, 7], │ │ │ │ │ @@ -7970,14 +7964,15 @@ │ │ │ │ │ "numfocu": 54, │ │ │ │ │ "numpi": [1, 3, 7, 8, 9, 10, 11, 12, 14, 16, 18, 19, 20, 22, 24, 25, 27, 28, 29, 30, 31, 33, 35, 36, 37, 38, 43, 44, 45, 47, 48, 49, 50, 51, 52, 54], │ │ │ │ │ "numpy_experimental_array_funct": 54, │ │ │ │ │ "numpyindexingadapt": 54, │ │ │ │ │ "nx": 40, │ │ │ │ │ "nxarrai": 5, │ │ │ │ │ "ny": 40, │ │ │ │ │ + "n\u00f5": 51, │ │ │ │ │ "o": [6, 7, 8, 9, 10, 11, 12, 13, 18, 24, 27, 30, 32, 44, 47, 48, 54], │ │ │ │ │ "obei": 25, │ │ │ │ │ "obj": [6, 22, 24, 37], │ │ │ │ │ "object": [3, 5, 8, 14, 16, 18, 19, 20, 22, 24, 25, 26, 27, 28, 31, 32, 33, 35, 36, 37, 38, 41, 43, 44, 45, 47, 49, 50, 51, 52, 53, 54], │ │ │ │ │ "oblivi": 54, │ │ │ │ │ "observ": [5, 14, 31, 33, 36, 41, 47, 48, 54], │ │ │ │ │ "obsolet": 54, │ │ │ │ │ @@ -9443,15 +9438,14 @@ │ │ │ │ │ "runtim": [24, 54], │ │ │ │ │ "runtimewarn": [45, 54], │ │ │ │ │ "russel": 54, │ │ │ │ │ "russotto": 54, │ │ │ │ │ "rutger": 54, │ │ │ │ │ "ryan": [12, 34, 54], │ │ │ │ │ "s1": [45, 54], │ │ │ │ │ - "s14": 51, │ │ │ │ │ "s2": 39, │ │ │ │ │ "s3": [45, 54], │ │ │ │ │ "s_da": 39, │ │ │ │ │ "s_rho": 7, │ │ │ │ │ "saboo": 54, │ │ │ │ │ "safe": [27, 44, 45, 54], │ │ │ │ │ "safe_chunk": 54, │ │ │ │ │ @@ -9531,15 +9525,15 @@ │ │ │ │ │ "seamlessli": [3, 39], │ │ │ │ │ "search": [3, 45, 52], │ │ │ │ │ "searchstrategi": 51, │ │ │ │ │ "season": [14, 15, 40, 52, 53, 54], │ │ │ │ │ "season_mean": 11, │ │ │ │ │ "sebastian": 54, │ │ │ │ │ "sec": 19, │ │ │ │ │ - "second": [3, 8, 13, 19, 27, 32, 35, 38, 39, 43, 45, 47, 52, 53, 54], │ │ │ │ │ + "second": [3, 6, 7, 8, 9, 10, 11, 12, 13, 19, 27, 30, 32, 35, 38, 39, 41, 43, 44, 45, 47, 48, 49, 52, 53, 54], │ │ │ │ │ "section": [5, 7, 16, 18, 29, 30, 33, 37, 40, 45, 47, 48, 50, 51, 52, 53, 54], │ │ │ │ │ "see": [1, 3, 5, 7, 8, 13, 16, 18, 19, 20, 22, 24, 25, 26, 27, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54], │ │ │ │ │ "seed": [14, 38, 48], │ │ │ │ │ "seek": 27, │ │ │ │ │ "seem": [7, 8, 48, 54], │ │ │ │ │ "seen": [36, 40, 51], │ │ │ │ │ "segment": 54, │ │ │ │ │ @@ -10198,26 +10192,32 @@ │ │ │ │ │ "typeerror": [27, 54], │ │ │ │ │ "typehint": 54, │ │ │ │ │ "typic": [3, 7, 14, 16, 30, 33, 37, 45, 50], │ │ │ │ │ "typing_extens": 54, │ │ │ │ │ "typo": [3, 23, 54], │ │ │ │ │ "tyre": 54, │ │ │ │ │ "u": [3, 8, 12, 19, 21, 24, 26, 31, 33, 41, 43, 44, 45, 48, 49, 54], │ │ │ │ │ + "u0001a8cb": 51, │ │ │ │ │ + "u00068234\u00f1": 51, │ │ │ │ │ + "u00087b86\u00eb": 51, │ │ │ │ │ + "u0008850a": 51, │ │ │ │ │ + "u000b9adc": 51, │ │ │ │ │ + "u000d1bc2": 51, │ │ │ │ │ "u1": [19, 35, 36, 38, 40, 43, 44, 45, 47, 49, 54], │ │ │ │ │ "u2": [14, 36, 38, 43], │ │ │ │ │ "u3": [52, 53, 54], │ │ │ │ │ "u4": 54, │ │ │ │ │ "u5": [19, 48], │ │ │ │ │ "u6": [38, 41], │ │ │ │ │ "u7": [36, 38], │ │ │ │ │ "u8": [36, 38], │ │ │ │ │ "ubiqu": 16, │ │ │ │ │ "ufunc": [1, 8, 24, 36, 37, 39, 54], │ │ │ │ │ - "uint16": 51, │ │ │ │ │ "uint32": 51, │ │ │ │ │ + "uint64": 51, │ │ │ │ │ "uint8": [39, 45], │ │ │ │ │ "uk": [6, 16, 45], │ │ │ │ │ "ulrich": 54, │ │ │ │ │ "ultim": 24, │ │ │ │ │ "unabl": [16, 37], │ │ │ │ │ "unaddress": 54, │ │ │ │ │ "unalign": [19, 41], │ │ │ │ │ @@ -10328,15 +10328,14 @@ │ │ │ │ │ "usr": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32], │ │ │ │ │ "usual": [3, 16, 20, 27, 36, 37, 40, 43, 45, 49, 50, 54], │ │ │ │ │ "utf": 45, │ │ │ │ │ "util": [3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 20, 30, 32, 33, 45, 54], │ │ │ │ │ "utilis": 52, │ │ │ │ │ "uw": 34, │ │ │ │ │ "uxarrai": 26, │ │ │ │ │ - "u\u012f\u00eawv": 51, │ │ │ │ │ "v": [3, 8, 13, 16, 18, 28, 38, 41, 48, 49, 50], │ │ │ │ │ "v0": [16, 38, 43, 49], │ │ │ │ │ "v1": [36, 48, 54], │ │ │ │ │ "v2": 54, │ │ │ │ │ "v2022": 28, │ │ │ │ │ "v3": [45, 54], │ │ │ │ │ "vacant": 35, │ │ │ │ │ @@ -10420,15 +10419,15 @@ │ │ │ │ │ "voltag": 41, │ │ │ │ │ "volum": [5, 16, 54], │ │ │ │ │ "volunt": 20, │ │ │ │ │ "voluntari": 54, │ │ │ │ │ "vrt": 54, │ │ │ │ │ "vtk": 5, │ │ │ │ │ "vtransform": 7, │ │ │ │ │ - "w": [7, 32, 41, 45, 48, 49, 51], │ │ │ │ │ + "w": [7, 32, 41, 45, 48, 49], │ │ │ │ │ "wa": [3, 6, 7, 8, 9, 10, 11, 12, 13, 16, 20, 24, 30, 31, 32, 33, 35, 38, 39, 41, 45, 47, 48, 51, 52, 53, 54], │ │ │ │ │ "wai": [3, 7, 8, 12, 16, 18, 19, 21, 24, 26, 30, 31, 33, 37, 38, 39, 41, 43, 44, 45, 47, 50, 51, 54], │ │ │ │ │ "wait": 3, │ │ │ │ │ "wale": 54, │ │ │ │ │ "walk": 39, │ │ │ │ │ "wall": 37, │ │ │ │ │ "wang": 54, │ │ │ │ │ @@ -10538,19 +10537,27 @@ │ │ │ │ │ "write_inherited_coord": 54, │ │ │ │ │ "written": [3, 18, 24, 29, 36, 37, 38, 45, 51, 54], │ │ │ │ │ "wrong": [3, 54], │ │ │ │ │ "wrongli": 54, │ │ │ │ │ "wrote": 35, │ │ │ │ │ "www": [7, 18], │ │ │ │ │ "x": [3, 5, 7, 8, 12, 13, 14, 18, 19, 20, 24, 25, 27, 28, 30, 35, 36, 37, 38, 39, 40, 41, 43, 44, 45, 47, 49, 50, 51, 53, 54], │ │ │ │ │ + "x048ca": 51, │ │ │ │ │ + "x06un": 51, │ │ │ │ │ "x0pahjgysxk": 18, │ │ │ │ │ "x1": 35, │ │ │ │ │ + "x11": 51, │ │ │ │ │ + "x1a": 51, │ │ │ │ │ "x2": [35, 39], │ │ │ │ │ "x27": 14, │ │ │ │ │ "x64": 54, │ │ │ │ │ + "x80": 51, │ │ │ │ │ + "x86": 51, │ │ │ │ │ + "x87c": 51, │ │ │ │ │ + "x8c": 51, │ │ │ │ │ "x_and_i": 36, │ │ │ │ │ "x_bin": 40, │ │ │ │ │ "x_bin_label": 40, │ │ │ │ │ "x_chunk": 24, │ │ │ │ │ "x_coars": 49, │ │ │ │ │ "x_fine": 49, │ │ │ │ │ "x_matrix_rank": 36, │ │ │ │ │ @@ -10564,28 +10571,25 @@ │ │ │ │ │ "xarray_einstat": 5, │ │ │ │ │ "xarray_extra": [5, 45], │ │ │ │ │ "xarray_obj": 26, │ │ │ │ │ "xarray_object": 8, │ │ │ │ │ "xarray_tutorial_data": [6, 7, 8, 9, 10, 11, 12, 13, 30, 32, 41, 43, 44, 45, 48, 49], │ │ │ │ │ "xarray_v0_8_0": 16, │ │ │ │ │ "xbatcher": 5, │ │ │ │ │ - "xbd": 51, │ │ │ │ │ "xbpch": 5, │ │ │ │ │ "xc": [12, 36, 45], │ │ │ │ │ "xc0": 36, │ │ │ │ │ - "xc6": 51, │ │ │ │ │ "xcdat": [5, 54], │ │ │ │ │ "xclim": 5, │ │ │ │ │ - "xd": 37, │ │ │ │ │ + "xd": [37, 51], │ │ │ │ │ "xdev": 34, │ │ │ │ │ "xdist": [3, 18, 54], │ │ │ │ │ "xenomorph": 41, │ │ │ │ │ "xeof": 5, │ │ │ │ │ "xesmf": [5, 12], │ │ │ │ │ - "xf4": 51, │ │ │ │ │ "xfail": [3, 54], │ │ │ │ │ "xframe": 5, │ │ │ │ │ "xgcm": [5, 7], │ │ │ │ │ "xi": 8, │ │ │ │ │ "xi_rho": 7, │ │ │ │ │ "xianxiang": 54, │ │ │ │ │ "xin": 54, │ │ │ │ │ @@ -10611,14 +10615,15 @@ │ │ │ │ │ "xtick": [48, 54], │ │ │ │ │ "xtrude": 5, │ │ │ │ │ "xx": 36, │ │ │ │ │ "xxxx": 3, │ │ │ │ │ "xy_index": 28, │ │ │ │ │ "xyz": 38, │ │ │ │ │ "xyzpi": 5, │ │ │ │ │ + "x\u016f\u017c\u00fa\u017c": 51, │ │ │ │ │ "y": [7, 11, 12, 18, 19, 20, 24, 25, 28, 35, 36, 37, 38, 40, 41, 43, 44, 45, 47, 49, 50, 51, 53, 54], │ │ │ │ │ "y_coars": 49, │ │ │ │ │ "y_fine": 49, │ │ │ │ │ "y_rank": 37, │ │ │ │ │ "y_win": 36, │ │ │ │ │ "yai": 8, │ │ │ │ │ "yalpha": 36, │ │ │ │ │ @@ -10685,36 +10690,51 @@ │ │ │ │ │ "zmetadata": [32, 45], │ │ │ │ │ "zo_rho": 7, │ │ │ │ │ "zonal": [5, 37, 48], │ │ │ │ │ "zoom": 4, │ │ │ │ │ "zstd": 45, │ │ │ │ │ "zuckerberg": 54, │ │ │ │ │ "z\u00fchlke": 54, │ │ │ │ │ - "\u00b5\u00ea": 51, │ │ │ │ │ - "\u00bd\u016f": 51, │ │ │ │ │ - "\u00e7": 51, │ │ │ │ │ - "\u00f3\u0135i\u0307": 51, │ │ │ │ │ - "\u0105\u00e1i\u0105\u017e": 51, │ │ │ │ │ - "\u0105\u0129": 51, │ │ │ │ │ - "\u0107\u017c": 51, │ │ │ │ │ - "\u0127y": 51, │ │ │ │ │ - "\u0146\u015d\u016fl\u017e": 51, │ │ │ │ │ - "\u0148ya\u013e\u0142": 51, │ │ │ │ │ - "\u0169": 51, │ │ │ │ │ - "\u017c": 51, │ │ │ │ │ - "\u017ch\u013az\u0137": 51, │ │ │ │ │ - "\u017c\u00f3\u00b2\u0113": 51, │ │ │ │ │ - "\u017c\u0175": 51, │ │ │ │ │ - "\u017c\u017c": 51, │ │ │ │ │ + "\u00bd\u00fa": 51, │ │ │ │ │ + "\u00e2": 51, │ │ │ │ │ + "\u00ea": 51, │ │ │ │ │ + "\u00f4": 51, │ │ │ │ │ + "\u00f4\u017e\u0163": 51, │ │ │ │ │ + "\u00f6\u010d\u0161": 51, │ │ │ │ │ + "\u00fc": 51, │ │ │ │ │ + "\u00fcg": 51, │ │ │ │ │ + "\u00fd\u017e\u017e\u00f9\u0105": 51, │ │ │ │ │ + "\u010b\u0101\u017e\u017e\u0165": 51, │ │ │ │ │ + "\u010fq\u00fe\u00ec": 51, │ │ │ │ │ + "\u0113": 51, │ │ │ │ │ + "\u0121\u01465\u00be\u015b": 51, │ │ │ │ │ + "\u0123\u0129": 51, │ │ │ │ │ + "\u0125\u0127\u00eb": 51, │ │ │ │ │ + "\u0125\u017e\u00e6\u00f0p": 51, │ │ │ │ │ + "\u012d\u017e\u010b\u011b\u017e": 51, │ │ │ │ │ + "\u0133": 51, │ │ │ │ │ + "\u013as\u010d": 51, │ │ │ │ │ + "\u0148": 51, │ │ │ │ │ + "\u0149": 51, │ │ │ │ │ + "\u014f\u0157": 51, │ │ │ │ │ + "\u014f\u017c\u0163w\u00f4": 51, │ │ │ │ │ + "\u015f\u00e6\u017er": 51, │ │ │ │ │ + "\u015f\u00fe": 51, │ │ │ │ │ + "\u016f\u00e3\u00e4\u00b9\u0148": 51, │ │ │ │ │ + "\u0173ig4f": 51, │ │ │ │ │ + "\u0177\u00ef\u00f4\u0138\u017c": 51, │ │ │ │ │ + "\u017cu\u017f\u00e4p": 51, │ │ │ │ │ + "\u017c\u0148lj\u0155": 51, │ │ │ │ │ + "\u017c\u017f\u017f\u017c\u00f1": 51, │ │ │ │ │ "\u017e": 51, │ │ │ │ │ - "\u017e\u00ebck\u017f": 51, │ │ │ │ │ - "\u017e\u00f2\u017c": 51, │ │ │ │ │ - "\u017f\u00f3\u0155\u00b9": 51, │ │ │ │ │ - "\u017f\u010f": 51, │ │ │ │ │ - "\u017f\u0142w\u0123\u0133": 51 │ │ │ │ │ + "\u017e\u017c\u017c": 51, │ │ │ │ │ + "\u017fa\u017e\u00ea\u00fd": 51, │ │ │ │ │ + "\u017f\u017c\u00dfh\u00f1": 51, │ │ │ │ │ + "\u017f\u017c\u014ft\u00e2": 51, │ │ │ │ │ + "\u017f\u017e": 51 │ │ │ │ │ }, │ │ │ │ │ "titles": ["xarray", "API reference", "<no title>", "Contributing to xarray", "Developers meeting", "Xarray related projects", "GRIB Data Example", "ROMS Ocean Model Example", "Applying unvectorized functions with apply_ufunc", "Compare weighted and unweighted mean temperature", "Blank template", "Calculating Seasonal Averages from Time Series of Monthly Means", "Working with Multidimensional Coordinates", "Visualization Gallery", "Toy weather data", "Gallery", "Frequently Asked Questions", "Getting Started", "Installation", "Quick overview", "Overview: Why xarray?", "Getting Help", "How do I \u2026", "Xarray documentation", "Alternative chunked array types", "Integrating with duck arrays", "Extending xarray using accessors", "How to add a new backend", "How to create a custom index", "Xarray Internals", "Internal Design", "Interoperability of Xarray", "Zarr Encoding Specification", "Development roadmap", "Tutorials and Videos", "Combining data", "Computation", "Parallel Computing with Dask", "Data Structures", "Working with numpy-like arrays", "GroupBy: Group and Bin Data", "Hierarchical data", "User Guide", "Indexing and selecting data", "Interpolating data", "Reading and writing files", "Configuration", "Working with pandas", "Plotting", "Reshaping and reorganizing data", "Terminology", "Testing your code", "Time series data", "Weather and climate data", "What\u2019s New"], │ │ │ │ │ "titleterms": { │ │ │ │ │ "": [13, 54], │ │ │ │ │ "0": 54, │ │ │ │ │ "01": 54, │ │ │ │ │ "02": 54, │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/user-guide/data-structures.html │ │ │ │ @@ -731,18 +731,18 @@ │ │ │ │ a method call with an external function (e.g., ds.pipe(func)) instead of │ │ │ │ simply calling it (e.g., func(ds)). This allows you to write pipelines for │ │ │ │ transforming your data (using “method chaining”) instead of writing hard to │ │ │ │ follow nested function calls:

    │ │ │ │
    # these lines are equivalent, but with pipe we can make the logic flow
    │ │ │ │  # entirely from left to right
    │ │ │ │  In [64]: plt.plot((2 * ds.temperature.sel(loc=0)).mean("instrument"))
    │ │ │ │ -Out[64]: [<matplotlib.lines.Line2D at 0xffff500fae90>]
    │ │ │ │ +Out[64]: [<matplotlib.lines.Line2D at 0xffff7c0cee90>]
    │ │ │ │  
    │ │ │ │  In [65]: (ds.temperature.sel(loc=0).pipe(lambda x: 2 * x).mean("instrument").pipe(plt.plot))
    │ │ │ │ -Out[65]: [<matplotlib.lines.Line2D at 0xffff500fb390>]
    │ │ │ │ +Out[65]: [<matplotlib.lines.Line2D at 0xffff7c0cf390>]
    │ │ │ │  
    │ │ │ │
    │ │ │ │

    Both pipe and assign replicate the pandas methods of the same names │ │ │ │ (DataFrame.pipe and │ │ │ │ DataFrame.assign).

    │ │ │ │

    With xarray, there is no performance penalty for creating new datasets, even if │ │ │ │ variables are lazily loaded from a file on disk. Creating new objects instead │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -585,19 +585,19 @@ │ │ │ │ │ There is also the pipe() method that allows you to use a method call with an │ │ │ │ │ external function (e.g., ds.pipe(func)) instead of simply calling it (e.g., │ │ │ │ │ func(ds)). This allows you to write pipelines for transforming your data (using │ │ │ │ │ “method chaining”) instead of writing hard to follow nested function calls: │ │ │ │ │ # these lines are equivalent, but with pipe we can make the logic flow │ │ │ │ │ # entirely from left to right │ │ │ │ │ In [64]: plt.plot((2 * ds.temperature.sel(loc=0)).mean("instrument")) │ │ │ │ │ -Out[64]: [] │ │ │ │ │ +Out[64]: [] │ │ │ │ │ │ │ │ │ │ In [65]: (ds.temperature.sel(loc=0).pipe(lambda x: 2 * x).mean │ │ │ │ │ ("instrument").pipe(plt.plot)) │ │ │ │ │ -Out[65]: [] │ │ │ │ │ +Out[65]: [] │ │ │ │ │ Both pipe and assign replicate the pandas methods of the same names │ │ │ │ │ (_D_a_t_a_F_r_a_m_e_._p_i_p_e and _D_a_t_a_F_r_a_m_e_._a_s_s_i_g_n). │ │ │ │ │ With xarray, there is no performance penalty for creating new datasets, even if │ │ │ │ │ variables are lazily loaded from a file on disk. Creating new objects instead │ │ │ │ │ of mutating existing objects often results in easier to understand code, so we │ │ │ │ │ encourage using this approach. │ │ │ │ │ ******** RReennaammiinngg vvaarriiaabblleess_?¶ ******** │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/user-guide/hierarchical-data.html │ │ │ │ @@ -982,15 +982,15 @@ │ │ │ │

    If you were a previous user of the prototype xarray-contrib/datatree package, this is different from what you’re used to! │ │ │ │ In that package the data model was that the data stored in each node actually was completely unrelated. The data model is now slightly stricter. │ │ │ │ This allows us to provide features like Coordinate Inheritance.

    │ │ │ │ │ │ │ │

    To demonstrate, let’s first generate some example datasets which are not aligned with one another:

    │ │ │ │
    # (drop the attributes just to make the printed representation shorter)
    │ │ │ │  In [89]: ds = xr.tutorial.open_dataset("air_temperature").drop_attrs()
    │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │  
    │ │ │ │  
    │ │ │ │  In [90]: ds_daily = ds.resample(time="D").mean("time")
    │ │ │ │  KeyError: "No variable named 'time'. Variables on the dataset include ['foo', 'x', 'letters']"
    │ │ │ │  
    │ │ │ │  
    │ │ │ │  In [91]: ds_weekly = ds.resample(time="W").mean("time")
    │ │ │ │ ├── html2text {}
    │ │ │ │ │ @@ -868,15 +868,15 @@
    │ │ │ │ │  model is now slightly stricter. This allows us to provide features like
    │ │ │ │ │  _C_o_o_r_d_i_n_a_t_e_ _I_n_h_e_r_i_t_a_n_c_e.
    │ │ │ │ │  To demonstrate, let’s first generate some example datasets which are not
    │ │ │ │ │  aligned with one another:
    │ │ │ │ │  # (drop the attributes just to make the printed representation shorter)
    │ │ │ │ │  In [89]: ds = xr.tutorial.open_dataset("air_temperature").drop_attrs()
    │ │ │ │ │  PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not
    │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/
    │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/
    │ │ │ │ │  xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │ │  
    │ │ │ │ │  
    │ │ │ │ │  In [90]: ds_daily = ds.resample(time="D").mean("time")
    │ │ │ │ │  KeyError: "No variable named 'time'. Variables on the dataset include ['foo',
    │ │ │ │ │  'x', 'letters']"
    │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/user-guide/indexing.html
    │ │ │ │ @@ -653,15 +653,15 @@
    │ │ │ │  to a collection specified weather station latitudes and longitudes.
    │ │ │ │  To trigger vectorized indexing behavior
    │ │ │ │  you will need to provide the selection dimensions with a new
    │ │ │ │  shared output dimension name. In the example below, the selections
    │ │ │ │  of the closest latitude and longitude are renamed to an output
    │ │ │ │  dimension named “points”:

    │ │ │ │
    In [52]: ds = xr.tutorial.open_dataset("air_temperature")
    │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │  
    │ │ │ │  
    │ │ │ │  # Define target latitude and longitude (where weather stations might be)
    │ │ │ │  In [53]: target_lon = xr.DataArray([200, 201, 202, 205], dims="points")
    │ │ │ │  
    │ │ │ │  In [54]: target_lat = xr.DataArray([31, 41, 42, 42], dims="points")
    │ │ │ │  
    │ │ │ │ @@ -697,15 +697,15 @@
    │ │ │ │  
    │ │ │ │
    │ │ │ │
    │ │ │ │

    Assigning values with indexing

    │ │ │ │

    To select and assign values to a portion of a DataArray() you │ │ │ │ can use indexing with .loc :

    │ │ │ │
    In [57]: ds = xr.tutorial.open_dataset("air_temperature")
    │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │  
    │ │ │ │  
    │ │ │ │  # add an empty 2D dataarray
    │ │ │ │  In [58]: ds["empty"] = xr.full_like(ds.air.mean("time"), fill_value=0)
    │ │ │ │  AttributeError: 'Dataset' object has no attribute 'air'
    │ │ │ │  
    │ │ │ │  
    │ │ │ │ @@ -869,15 +869,15 @@
    │ │ │ │  
    │ │ │ │
    │ │ │ │

    You can also assign values to all variables of a Dataset at once:

    │ │ │ │
    In [83]: ds_org = xr.tutorial.open_dataset("eraint_uvz").isel(
    │ │ │ │     ....:     latitude=slice(56, 59), longitude=slice(255, 258), level=0
    │ │ │ │     ....: )
    │ │ │ │     ....: 
    │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │  
    │ │ │ │  
    │ │ │ │  # set all values to 0
    │ │ │ │  In [84]: ds = xr.zeros_like(ds_org)
    │ │ │ │  NameError: name 'ds_org' is not defined
    │ │ │ │ ├── html2text {}
    │ │ │ │ │ @@ -474,15 +474,15 @@
    │ │ │ │ │  collection specified weather station latitudes and longitudes. To trigger
    │ │ │ │ │  vectorized indexing behavior you will need to provide the selection dimensions
    │ │ │ │ │  with a new shared output dimension name. In the example below, the selections
    │ │ │ │ │  of the closest latitude and longitude are renamed to an output dimension named
    │ │ │ │ │  “points”:
    │ │ │ │ │  In [52]: ds = xr.tutorial.open_dataset("air_temperature")
    │ │ │ │ │  PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not
    │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/
    │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/
    │ │ │ │ │  xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │ │  
    │ │ │ │ │  
    │ │ │ │ │  # Define target latitude and longitude (where weather stations might be)
    │ │ │ │ │  In [53]: target_lon = xr.DataArray([200, 201, 202, 205], dims="points")
    │ │ │ │ │  
    │ │ │ │ │  In [54]: target_lat = xr.DataArray([31, 41, 42, 42], dims="points")
    │ │ │ │ │ @@ -513,15 +513,15 @@
    │ │ │ │ │  selected subpart of the target array (except for the explicitly indexed
    │ │ │ │ │  dimensions with .loc/.sel). Otherwise, IndexError will be raised.
    │ │ │ │ │  ********** AAssssiiggnniinngg vvaalluueess wwiitthh iinnddeexxiinngg_?¶ **********
    │ │ │ │ │  To select and assign values to a portion of a DataArray() you can use indexing
    │ │ │ │ │  with .loc :
    │ │ │ │ │  In [57]: ds = xr.tutorial.open_dataset("air_temperature")
    │ │ │ │ │  PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not
    │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/
    │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/
    │ │ │ │ │  xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │ │  
    │ │ │ │ │  
    │ │ │ │ │  # add an empty 2D dataarray
    │ │ │ │ │  In [58]: ds["empty"] = xr.full_like(ds.air.mean("time"), fill_value=0)
    │ │ │ │ │  AttributeError: 'Dataset' object has no attribute 'air'
    │ │ │ │ │  
    │ │ │ │ │ @@ -673,15 +673,15 @@
    │ │ │ │ │  Dimensions without coordinates: x
    │ │ │ │ │  You can also assign values to all variables of a Dataset at once:
    │ │ │ │ │  In [83]: ds_org = xr.tutorial.open_dataset("eraint_uvz").isel(
    │ │ │ │ │     ....:     latitude=slice(56, 59), longitude=slice(255, 258), level=0
    │ │ │ │ │     ....: )
    │ │ │ │ │     ....:
    │ │ │ │ │  PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not
    │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/
    │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/
    │ │ │ │ │  xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │ │  
    │ │ │ │ │  
    │ │ │ │ │  # set all values to 0
    │ │ │ │ │  In [84]: ds = xr.zeros_like(ds_org)
    │ │ │ │ │  NameError: name 'ds_org' is not defined
    │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/user-guide/interpolation.html
    │ │ │ │ @@ -237,24 +237,24 @@
    │ │ │ │     ....:     np.sin(np.linspace(0, 2 * np.pi, 10)),
    │ │ │ │     ....:     dims="x",
    │ │ │ │     ....:     coords={"x": np.linspace(0, 1, 10)},
    │ │ │ │     ....: )
    │ │ │ │     ....: 
    │ │ │ │  
    │ │ │ │  In [17]: da.plot.line("o", label="original")
    │ │ │ │ -Out[17]: [<matplotlib.lines.Line2D at 0xffff5336fed0>]
    │ │ │ │ +Out[17]: [<matplotlib.lines.Line2D at 0xffff845c7ed0>]
    │ │ │ │  
    │ │ │ │  In [18]: da.interp(x=np.linspace(0, 1, 100)).plot.line(label="linear (default)")
    │ │ │ │ -Out[18]: [<matplotlib.lines.Line2D at 0xffff5336fc50>]
    │ │ │ │ +Out[18]: [<matplotlib.lines.Line2D at 0xffff845c7c50>]
    │ │ │ │  
    │ │ │ │  In [19]: da.interp(x=np.linspace(0, 1, 100), method="cubic").plot.line(label="cubic")
    │ │ │ │ -Out[19]: [<matplotlib.lines.Line2D at 0xffff5336fb10>]
    │ │ │ │ +Out[19]: [<matplotlib.lines.Line2D at 0xffff845c7b10>]
    │ │ │ │  
    │ │ │ │  In [20]: plt.legend()
    │ │ │ │ -Out[20]: <matplotlib.legend.Legend at 0xffff5333c590>
    │ │ │ │ +Out[20]: <matplotlib.legend.Legend at 0xffff84594590>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/interpolation_sample1.png │ │ │ │ │ │ │ │

    Additional keyword arguments can be passed to scipy’s functions.

    │ │ │ │
    # fill 0 for the outside of the original coordinates.
    │ │ │ │  In [21]: da.interp(x=np.linspace(-0.5, 1.5, 10), kwargs={"fill_value": 0.0})
    │ │ │ │ @@ -439,15 +439,15 @@
    │ │ │ │  see Missing values.

    │ │ │ │
    │ │ │ │
    │ │ │ │

    Example

    │ │ │ │

    Let’s see how interp() works on real data.

    │ │ │ │
    # Raw data
    │ │ │ │  In [44]: ds = xr.tutorial.open_dataset("air_temperature").isel(time=0)
    │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │  
    │ │ │ │  
    │ │ │ │  In [45]: fig, axes = plt.subplots(ncols=2, figsize=(10, 4))
    │ │ │ │  
    │ │ │ │  In [46]: ds.air.plot(ax=axes[0])
    │ │ │ │  AttributeError: 'Dataset' object has no attribute 'air'
    │ │ │ │ ├── html2text {}
    │ │ │ │ │ @@ -154,26 +154,26 @@
    │ │ │ │ │     ....:     np.sin(np.linspace(0, 2 * np.pi, 10)),
    │ │ │ │ │     ....:     dims="x",
    │ │ │ │ │     ....:     coords={"x": np.linspace(0, 1, 10)},
    │ │ │ │ │     ....: )
    │ │ │ │ │     ....:
    │ │ │ │ │  
    │ │ │ │ │  In [17]: da.plot.line("o", label="original")
    │ │ │ │ │ -Out[17]: []
    │ │ │ │ │ +Out[17]: []
    │ │ │ │ │  
    │ │ │ │ │  In [18]: da.interp(x=np.linspace(0, 1, 100)).plot.line(label="linear
    │ │ │ │ │  (default)")
    │ │ │ │ │ -Out[18]: []
    │ │ │ │ │ +Out[18]: []
    │ │ │ │ │  
    │ │ │ │ │  In [19]: da.interp(x=np.linspace(0, 1, 100), method="cubic").plot.line
    │ │ │ │ │  (label="cubic")
    │ │ │ │ │ -Out[19]: []
    │ │ │ │ │ +Out[19]: []
    │ │ │ │ │  
    │ │ │ │ │  In [20]: plt.legend()
    │ │ │ │ │ -Out[20]: 
    │ │ │ │ │ +Out[20]: 
    │ │ │ │ │  _[___b_u_i_l_d_/_h_t_m_l_/___s_t_a_t_i_c_/_i_n_t_e_r_p_o_l_a_t_i_o_n___s_a_m_p_l_e_1_._p_n_g_]
    │ │ │ │ │  Additional keyword arguments can be passed to scipy’s functions.
    │ │ │ │ │  # fill 0 for the outside of the original coordinates.
    │ │ │ │ │  In [21]: da.interp(x=np.linspace(-0.5, 1.5, 10), kwargs={"fill_value": 0.0})
    │ │ │ │ │  Out[21]:
    │ │ │ │ │   Size: 80B
    │ │ │ │ │  array([ 0.   ,  0.   ,  0.   ,  0.814,  0.604, -0.604, -0.814,  0.   ,  0.   ,
    │ │ │ │ │ @@ -337,15 +337,15 @@
    │ │ │ │ │    * x        (x) float64 24B 0.5 1.5 2.5
    │ │ │ │ │  For the details of interpolate_na(), see _M_i_s_s_i_n_g_ _v_a_l_u_e_s.
    │ │ │ │ │  ********** EExxaammppllee_?¶ **********
    │ │ │ │ │  Let’s see how interp() works on real data.
    │ │ │ │ │  # Raw data
    │ │ │ │ │  In [44]: ds = xr.tutorial.open_dataset("air_temperature").isel(time=0)
    │ │ │ │ │  PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not
    │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/
    │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/
    │ │ │ │ │  xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │ │  
    │ │ │ │ │  
    │ │ │ │ │  In [45]: fig, axes = plt.subplots(ncols=2, figsize=(10, 4))
    │ │ │ │ │  
    │ │ │ │ │  In [46]: ds.air.plot(ax=axes[0])
    │ │ │ │ │  AttributeError: 'Dataset' object has no attribute 'air'
    │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/user-guide/io.html
    │ │ │ │ @@ -630,15 +630,15 @@
    │ │ │ │     ....:         "y": pd.date_range("2000-01-01", periods=5),
    │ │ │ │     ....:         "z": ("x", list("abcd")),
    │ │ │ │     ....:     },
    │ │ │ │     ....: )
    │ │ │ │     ....: 
    │ │ │ │  
    │ │ │ │  In [13]: ds.to_zarr("path/to/directory.zarr")
    │ │ │ │ -Out[13]: <xarray.backends.zarr.ZarrStore at 0xffff34781480>
    │ │ │ │ +Out[13]: <xarray.backends.zarr.ZarrStore at 0xffff5cb9d480>
    │ │ │ │  
    │ │ │ │
    │ │ │ │

    (The suffix .zarr is optional–just a reminder that a zarr store lives │ │ │ │ there.) If the directory does not exist, it will be created. If a zarr │ │ │ │ store is already present at that path, an error will be raised, preventing it │ │ │ │ from being overwritten. To override this behavior and overwrite an existing │ │ │ │ store, add mode='w' when invoking to_zarr().

    │ │ │ │ @@ -724,36 +724,36 @@ │ │ │ │ │ │ │ │ In [18]: ds = xr.Dataset({"foo": ("x", dummies)}, coords={"x": np.arange(30)}) │ │ │ │ │ │ │ │ In [19]: path = "path/to/directory.zarr" │ │ │ │ │ │ │ │ # Now we write the metadata without computing any array values │ │ │ │ In [20]: ds.to_zarr(path, compute=False) │ │ │ │ -Out[20]: Delayed('_finalize_store-329a0716-8aed-42b7-a0cc-0d4a828336a0') │ │ │ │ +Out[20]: Delayed('_finalize_store-4dbdeb02-258f-48b4-b6f6-9168af1a0c2a') │ │ │ │ │ │ │ │ │ │ │ │

    Now, a Zarr store with the correct variable shapes and attributes exists that │ │ │ │ can be filled out by subsequent calls to to_zarr. │ │ │ │ Setting region="auto" will open the existing store and determine the │ │ │ │ correct alignment of the new data with the existing dimensions, or as an │ │ │ │ explicit mapping from dimension names to Python slice objects indicating │ │ │ │ where the data should be written (in index space, not label space), e.g.,

    │ │ │ │
    # For convenience, we'll slice a single dataset, but in the real use-case
    │ │ │ │  # we would create them separately possibly even from separate processes.
    │ │ │ │  In [21]: ds = xr.Dataset({"foo": ("x", np.arange(30))}, coords={"x": np.arange(30)})
    │ │ │ │  
    │ │ │ │  # Any of the following region specifications are valid
    │ │ │ │  In [22]: ds.isel(x=slice(0, 10)).to_zarr(path, region="auto")
    │ │ │ │ -Out[22]: <xarray.backends.zarr.ZarrStore at 0xffff34782b00>
    │ │ │ │ +Out[22]: <xarray.backends.zarr.ZarrStore at 0xffff5cb9eb00>
    │ │ │ │  
    │ │ │ │  In [23]: ds.isel(x=slice(10, 20)).to_zarr(path, region={"x": "auto"})
    │ │ │ │ -Out[23]: <xarray.backends.zarr.ZarrStore at 0xffff347824d0>
    │ │ │ │ +Out[23]: <xarray.backends.zarr.ZarrStore at 0xffff5cb9e4d0>
    │ │ │ │  
    │ │ │ │  In [24]: ds.isel(x=slice(20, 30)).to_zarr(path, region={"x": slice(20, 30)})
    │ │ │ │ -Out[24]: <xarray.backends.zarr.ZarrStore at 0xffff34944dc0>
    │ │ │ │ +Out[24]: <xarray.backends.zarr.ZarrStore at 0xffff5cd64dc0>
    │ │ │ │  
    │ │ │ │
    │ │ │ │

    Concurrent writes with region are safe as long as they modify distinct │ │ │ │ chunks in the underlying Zarr arrays (or use an appropriate lock).

    │ │ │ │

    As a safety check to make it harder to inadvertently override existing values, │ │ │ │ if you set region then all variables included in a Dataset must have │ │ │ │ dimensions included in region. Other variables (typically coordinates) │ │ │ │ @@ -769,15 +769,15 @@ │ │ │ │

    In [25]: import zarr
    │ │ │ │  
    │ │ │ │  In [26]: from numcodecs.blosc import Blosc
    │ │ │ │  
    │ │ │ │  In [27]: compressor = Blosc(cname="zstd", clevel=3, shuffle=2)
    │ │ │ │  
    │ │ │ │  In [28]: ds.to_zarr("foo.zarr", encoding={"foo": {"compressor": compressor}})
    │ │ │ │ -Out[28]: <xarray.backends.zarr.ZarrStore at 0xffff34783400>
    │ │ │ │ +Out[28]: <xarray.backends.zarr.ZarrStore at 0xffff5cb9f400>
    │ │ │ │  
    │ │ │ │
    │ │ │ │
    │ │ │ │

    Note

    │ │ │ │

    Not all native zarr compression and filtering options have been tested with │ │ │ │ xarray.

    │ │ │ │
    │ │ │ │ @@ -816,28 +816,28 @@ │ │ │ │ ....: "y": [1, 2, 3, 4, 5], │ │ │ │ ....: "t": pd.date_range("2001-01-01", periods=2), │ │ │ │ ....: }, │ │ │ │ ....: ) │ │ │ │ ....: │ │ │ │ │ │ │ │ In [30]: ds1.to_zarr("path/to/directory.zarr") │ │ │ │ -Out[30]: <xarray.backends.zarr.ZarrStore at 0xffff34783d00> │ │ │ │ +Out[30]: <xarray.backends.zarr.ZarrStore at 0xffff5cb9fd00> │ │ │ │ │ │ │ │ In [31]: ds2 = xr.Dataset( │ │ │ │ ....: {"foo": (("x", "y", "t"), np.random.rand(4, 5, 2))}, │ │ │ │ ....: coords={ │ │ │ │ ....: "x": [10, 20, 30, 40], │ │ │ │ ....: "y": [1, 2, 3, 4, 5], │ │ │ │ ....: "t": pd.date_range("2001-01-03", periods=2), │ │ │ │ ....: }, │ │ │ │ ....: ) │ │ │ │ ....: │ │ │ │ │ │ │ │ In [32]: ds2.to_zarr("path/to/directory.zarr", append_dim="t") │ │ │ │ -Out[32]: <xarray.backends.zarr.ZarrStore at 0xffff34783d90> │ │ │ │ +Out[32]: <xarray.backends.zarr.ZarrStore at 0xffff5cb9fd90> │ │ │ │ │ │ │ │ │ │ │ │
    │ │ │ │
    │ │ │ │

    Specifying chunks in a zarr store

    │ │ │ │

    Chunk sizes may be specified in one of three ways when writing to a zarr store:

    │ │ │ │
      │ │ │ │ @@ -861,15 +861,15 @@ │ │ │ │ positional ordering of the dimensions in each array. Watch out for arrays with │ │ │ │ differently-ordered dimensions within a single Dataset.

      │ │ │ │ │ │ │ │

      For example, let’s say we’re working with a dataset with dimensions │ │ │ │ ('time', 'x', 'y'), a variable Tair which is chunked in x and y, │ │ │ │ and two multi-dimensional coordinates xc and yc:

      │ │ │ │
      In [33]: ds = xr.tutorial.open_dataset("rasm")
      │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
      │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
      │ │ │ │  
      │ │ │ │  
      │ │ │ │  In [34]: ds["Tair"] = ds["Tair"].chunk({"x": 100, "y": 100})
      │ │ │ │  KeyError: "No variable named 'Tair'. Variables on the dataset include ['foo', 'x']"
      │ │ │ │  
      │ │ │ │  
      │ │ │ │  In [35]: ds
      │ │ │ │ @@ -882,15 +882,15 @@
      │ │ │ │      foo      (x) int64 240B 0 1 2 3 4 5 6 7 8 9 ... 21 22 23 24 25 26 27 28 29
      │ │ │ │  
      │ │ │ │
      │ │ │ │

      These multi-dimensional coordinates are only two-dimensional and take up very little │ │ │ │ space on disk or in memory, yet when writing to disk the default zarr behavior is to │ │ │ │ split them into chunks:

      │ │ │ │
      In [36]: ds.to_zarr("path/to/directory.zarr", mode="w")
      │ │ │ │ -Out[36]: <xarray.backends.zarr.ZarrStore at 0xffff6a78c8b0>
      │ │ │ │ +Out[36]: <xarray.backends.zarr.ZarrStore at 0xffff96b6c8b0>
      │ │ │ │  
      │ │ │ │  In [37]: ! ls -R path/to/directory.zarr
      │ │ │ │  path/to/directory.zarr:
      │ │ │ │  foo  x
      │ │ │ │  
      │ │ │ │  path/to/directory.zarr/foo:
      │ │ │ │  0
      │ │ │ │ @@ -1062,15 +1062,15 @@
      │ │ │ │  

      Ncdata

      │ │ │ │

      Ncdata provides more sophisticated means of transferring data, including entire │ │ │ │ datasets. It uses the file saving and loading functions in both projects to provide a │ │ │ │ more “correct” translation between them, but still with very low overhead and not │ │ │ │ using actual disk files.

      │ │ │ │

      For example:

      │ │ │ │
      In [48]: ds = xr.tutorial.open_dataset("air_temperature_gradient")
      │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
      │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
      │ │ │ │  
      │ │ │ │  
      │ │ │ │  In [49]: cubes = ncdata.iris_xarray.cubes_from_xarray(ds)
      │ │ │ │  NameError: name 'ncdata' is not defined
      │ │ │ │  
      │ │ │ │  
      │ │ │ │  In [50]: print(cubes)
      │ │ │ │ ├── html2text {}
      │ │ │ │ │ @@ -481,15 +481,15 @@
      │ │ │ │ │     ....:         "y": pd.date_range("2000-01-01", periods=5),
      │ │ │ │ │     ....:         "z": ("x", list("abcd")),
      │ │ │ │ │     ....:     },
      │ │ │ │ │     ....: )
      │ │ │ │ │     ....:
      │ │ │ │ │  
      │ │ │ │ │  In [13]: ds.to_zarr("path/to/directory.zarr")
      │ │ │ │ │ -Out[13]: 
      │ │ │ │ │ +Out[13]: 
      │ │ │ │ │  (The suffix .zarr is optional–just a reminder that a zarr store lives there.)
      │ │ │ │ │  If the directory does not exist, it will be created. If a zarr store is already
      │ │ │ │ │  present at that path, an error will be raised, preventing it from being
      │ │ │ │ │  overwritten. To override this behavior and overwrite an existing store, add
      │ │ │ │ │  mode='w' when invoking to_zarr().
      │ │ │ │ │  DataArrays can also be saved to disk using the DataArray.to_zarr() method, and
      │ │ │ │ │  loaded from disk using the open_dataarray() function with engine='zarr'.
      │ │ │ │ │ @@ -562,35 +562,35 @@
      │ │ │ │ │  
      │ │ │ │ │  In [18]: ds = xr.Dataset({"foo": ("x", dummies)}, coords={"x": np.arange(30)})
      │ │ │ │ │  
      │ │ │ │ │  In [19]: path = "path/to/directory.zarr"
      │ │ │ │ │  
      │ │ │ │ │  # Now we write the metadata without computing any array values
      │ │ │ │ │  In [20]: ds.to_zarr(path, compute=False)
      │ │ │ │ │ -Out[20]: Delayed('_finalize_store-329a0716-8aed-42b7-a0cc-0d4a828336a0')
      │ │ │ │ │ +Out[20]: Delayed('_finalize_store-4dbdeb02-258f-48b4-b6f6-9168af1a0c2a')
      │ │ │ │ │  Now, a Zarr store with the correct variable shapes and attributes exists that
      │ │ │ │ │  can be filled out by subsequent calls to to_zarr. Setting region="auto" will
      │ │ │ │ │  open the existing store and determine the correct alignment of the new data
      │ │ │ │ │  with the existing dimensions, or as an explicit mapping from dimension names to
      │ │ │ │ │  Python slice objects indicating where the data should be written (in index
      │ │ │ │ │  space, not label space), e.g.,
      │ │ │ │ │  # For convenience, we'll slice a single dataset, but in the real use-case
      │ │ │ │ │  # we would create them separately possibly even from separate processes.
      │ │ │ │ │  In [21]: ds = xr.Dataset({"foo": ("x", np.arange(30))}, coords={"x": np.arange
      │ │ │ │ │  (30)})
      │ │ │ │ │  
      │ │ │ │ │  # Any of the following region specifications are valid
      │ │ │ │ │  In [22]: ds.isel(x=slice(0, 10)).to_zarr(path, region="auto")
      │ │ │ │ │ -Out[22]: 
      │ │ │ │ │ +Out[22]: 
      │ │ │ │ │  
      │ │ │ │ │  In [23]: ds.isel(x=slice(10, 20)).to_zarr(path, region={"x": "auto"})
      │ │ │ │ │ -Out[23]: 
      │ │ │ │ │ +Out[23]: 
      │ │ │ │ │  
      │ │ │ │ │  In [24]: ds.isel(x=slice(20, 30)).to_zarr(path, region={"x": slice(20, 30)})
      │ │ │ │ │ -Out[24]: 
      │ │ │ │ │ +Out[24]: 
      │ │ │ │ │  Concurrent writes with region are safe as long as they modify distinct chunks
      │ │ │ │ │  in the underlying Zarr arrays (or use an appropriate lock).
      │ │ │ │ │  As a safety check to make it harder to inadvertently override existing values,
      │ │ │ │ │  if you set region then aallll variables included in a Dataset must have dimensions
      │ │ │ │ │  included in region. Other variables (typically coordinates) need to be
      │ │ │ │ │  explicitly dropped and/or written in a separate calls to to_zarr with mode='a'.
      │ │ │ │ │  ******** ZZaarrrr CCoommpprreessssoorrss aanndd FFiilltteerrss_?¶ ********
      │ │ │ │ │ @@ -601,15 +601,15 @@
      │ │ │ │ │  In [25]: import zarr
      │ │ │ │ │  
      │ │ │ │ │  In [26]: from numcodecs.blosc import Blosc
      │ │ │ │ │  
      │ │ │ │ │  In [27]: compressor = Blosc(cname="zstd", clevel=3, shuffle=2)
      │ │ │ │ │  
      │ │ │ │ │  In [28]: ds.to_zarr("foo.zarr", encoding={"foo": {"compressor": compressor}})
      │ │ │ │ │ -Out[28]: 
      │ │ │ │ │ +Out[28]: 
      │ │ │ │ │  Note
      │ │ │ │ │  Not all native zarr compression and filtering options have been tested with
      │ │ │ │ │  xarray.
      │ │ │ │ │  ******** MMooddiiffyyiinngg eexxiissttiinngg ZZaarrrr ssttoorreess_?¶ ********
      │ │ │ │ │  Xarray supports several ways of incrementally writing variables to a Zarr
      │ │ │ │ │  store. These options are useful for scenarios when it is infeasible or
      │ │ │ │ │  undesirable to write your entire dataset at once.
      │ │ │ │ │ @@ -635,28 +635,28 @@
      │ │ │ │ │     ....:         "y": [1, 2, 3, 4, 5],
      │ │ │ │ │     ....:         "t": pd.date_range("2001-01-01", periods=2),
      │ │ │ │ │     ....:     },
      │ │ │ │ │     ....: )
      │ │ │ │ │     ....:
      │ │ │ │ │  
      │ │ │ │ │  In [30]: ds1.to_zarr("path/to/directory.zarr")
      │ │ │ │ │ -Out[30]: 
      │ │ │ │ │ +Out[30]: 
      │ │ │ │ │  
      │ │ │ │ │  In [31]: ds2 = xr.Dataset(
      │ │ │ │ │     ....:     {"foo": (("x", "y", "t"), np.random.rand(4, 5, 2))},
      │ │ │ │ │     ....:     coords={
      │ │ │ │ │     ....:         "x": [10, 20, 30, 40],
      │ │ │ │ │     ....:         "y": [1, 2, 3, 4, 5],
      │ │ │ │ │     ....:         "t": pd.date_range("2001-01-03", periods=2),
      │ │ │ │ │     ....:     },
      │ │ │ │ │     ....: )
      │ │ │ │ │     ....:
      │ │ │ │ │  
      │ │ │ │ │  In [32]: ds2.to_zarr("path/to/directory.zarr", append_dim="t")
      │ │ │ │ │ -Out[32]: 
      │ │ │ │ │ +Out[32]: 
      │ │ │ │ │  ******** SSppeecciiffyyiinngg cchhuunnkkss iinn aa zzaarrrr ssttoorree_?¶ ********
      │ │ │ │ │  Chunk sizes may be specified in one of three ways when writing to a zarr store:
      │ │ │ │ │     1. Manual chunk sizing through the use of the encoding argument in
      │ │ │ │ │        Dataset.to_zarr():
      │ │ │ │ │     2. Automatic chunking based on chunks in dask arrays
      │ │ │ │ │     3. Default chunk behavior determined by the zarr library
      │ │ │ │ │  The resulting chunks will be determined based on the order of the above list;
      │ │ │ │ │ @@ -675,15 +675,15 @@
      │ │ │ │ │  positional ordering of the dimensions in each array. Watch out for arrays with
      │ │ │ │ │  differently-ordered dimensions within a single Dataset.
      │ │ │ │ │  For example, let’s say we’re working with a dataset with dimensions ('time',
      │ │ │ │ │  'x', 'y'), a variable Tair which is chunked in x and y, and two multi-
      │ │ │ │ │  dimensional coordinates xc and yc:
      │ │ │ │ │  In [33]: ds = xr.tutorial.open_dataset("rasm")
      │ │ │ │ │  PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not
      │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/
      │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/
      │ │ │ │ │  xarray_tutorial_data'. Will not be able to download data files.
      │ │ │ │ │  
      │ │ │ │ │  
      │ │ │ │ │  In [34]: ds["Tair"] = ds["Tair"].chunk({"x": 100, "y": 100})
      │ │ │ │ │  KeyError: "No variable named 'Tair'. Variables on the dataset include ['foo',
      │ │ │ │ │  'x']"
      │ │ │ │ │  
      │ │ │ │ │ @@ -696,15 +696,15 @@
      │ │ │ │ │    * x        (x) int64 240B 0 1 2 3 4 5 6 7 8 9 ... 21 22 23 24 25 26 27 28 29
      │ │ │ │ │  Data variables:
      │ │ │ │ │      foo      (x) int64 240B 0 1 2 3 4 5 6 7 8 9 ... 21 22 23 24 25 26 27 28 29
      │ │ │ │ │  These multi-dimensional coordinates are only two-dimensional and take up very
      │ │ │ │ │  little space on disk or in memory, yet when writing to disk the default zarr
      │ │ │ │ │  behavior is to split them into chunks:
      │ │ │ │ │  In [36]: ds.to_zarr("path/to/directory.zarr", mode="w")
      │ │ │ │ │ -Out[36]: 
      │ │ │ │ │ +Out[36]: 
      │ │ │ │ │  
      │ │ │ │ │  In [37]: ! ls -R path/to/directory.zarr
      │ │ │ │ │  path/to/directory.zarr:
      │ │ │ │ │  foo  x
      │ │ │ │ │  
      │ │ │ │ │  path/to/directory.zarr/foo:
      │ │ │ │ │  0
      │ │ │ │ │ @@ -850,15 +850,15 @@
      │ │ │ │ │  _N_c_d_a_t_a provides more sophisticated means of transferring data, including entire
      │ │ │ │ │  datasets. It uses the file saving and loading functions in both projects to
      │ │ │ │ │  provide a more “correct” translation between them, but still with very low
      │ │ │ │ │  overhead and not using actual disk files.
      │ │ │ │ │  For example:
      │ │ │ │ │  In [48]: ds = xr.tutorial.open_dataset("air_temperature_gradient")
      │ │ │ │ │  PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not
      │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/
      │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/
      │ │ │ │ │  xarray_tutorial_data'. Will not be able to download data files.
      │ │ │ │ │  
      │ │ │ │ │  
      │ │ │ │ │  In [49]: cubes = ncdata.iris_xarray.cubes_from_xarray(ds)
      │ │ │ │ │  NameError: name 'ncdata' is not defined
      │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/user-guide/plotting.html
      │ │ │ │ @@ -100,15 +100,15 @@
      │ │ │ │  In [3]: import matplotlib.pyplot as plt
      │ │ │ │  
      │ │ │ │  In [4]: import xarray as xr
      │ │ │ │  
      │ │ │ │
      │ │ │ │

      For these examples we’ll use the North American air temperature dataset.

      │ │ │ │
      In [5]: airtemps = xr.tutorial.open_dataset("air_temperature")
      │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
      │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
      │ │ │ │  
      │ │ │ │  
      │ │ │ │  In [6]: airtemps
      │ │ │ │  NameError: name 'airtemps' is not defined
      │ │ │ │  
      │ │ │ │  
      │ │ │ │  # Convert to celsius
      │ │ │ │ @@ -445,15 +445,15 @@
      │ │ │ │  
      │ │ │ │  # Apply a nonlinear transformation to one of the coords
      │ │ │ │  In [50]: b.coords["lat"] = np.log(b.coords["lat"])
      │ │ │ │  KeyError: 'lat'
      │ │ │ │  
      │ │ │ │  
      │ │ │ │  In [51]: b.plot()
      │ │ │ │ -Out[51]: [<matplotlib.lines.Line2D at 0xffff69dbf890>]
      │ │ │ │ +Out[51]: [<matplotlib.lines.Line2D at 0xffff9619f890>]
      │ │ │ │  
      │ │ │ │
      │ │ │ │ _build/html/_static/plotting_nonuniform_coords.png │ │ │ │ │ │ │ │
    │ │ │ │
    │ │ │ │

    Other types of plot

    │ │ │ │ @@ -857,117 +857,117 @@ │ │ │ │ * y (y) float64 88B 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 │ │ │ │ * z (z) int64 32B 0 1 2 3 │ │ │ │ * w (w) <U5 80B 'one' 'two' 'three' 'five' │ │ │ │ Attributes: │ │ │ │ units: Aunits │ │ │ │ │ │ │ │ In [99]: ds.A.plot.scatter(x="y") │ │ │ │ -Out[99]: <matplotlib.collections.PathCollection at 0xffff6a3b0ec0> │ │ │ │ +Out[99]: <matplotlib.collections.PathCollection at 0xffff9678cec0> │ │ │ │ │ │ │ │ │ │ │ │ _build/html/_static/da_A_y.png │ │ │ │

    Same plot can be displayed using the dataset:

    │ │ │ │
    In [100]: ds.plot.scatter(x="y", y="A")
    │ │ │ │ -Out[100]: <matplotlib.collections.PathCollection at 0xffff69c8d1d0>
    │ │ │ │ +Out[100]: <matplotlib.collections.PathCollection at 0xffff960711d0>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/ds_A_y.png │ │ │ │

    Now suppose we want to scatter the A DataArray against the B DataArray

    │ │ │ │
    In [101]: ds.plot.scatter(x="A", y="B")
    │ │ │ │ -Out[101]: <matplotlib.collections.PathCollection at 0xffff69d387d0>
    │ │ │ │ +Out[101]: <matplotlib.collections.PathCollection at 0xffff961187d0>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/ds_simple_scatter.png │ │ │ │

    The hue kwarg lets you vary the color by variable value

    │ │ │ │
    In [102]: ds.plot.scatter(x="A", y="B", hue="w")
    │ │ │ │ -Out[102]: <matplotlib.collections.PathCollection at 0xffff69b6da90>
    │ │ │ │ +Out[102]: <matplotlib.collections.PathCollection at 0xffff95f4da90>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/ds_hue_scatter.png │ │ │ │

    You can force a legend instead of a colorbar by setting add_legend=True, add_colorbar=False.

    │ │ │ │
    In [103]: ds.plot.scatter(x="A", y="B", hue="w", add_legend=True, add_colorbar=False)
    │ │ │ │ -Out[103]: <matplotlib.collections.PathCollection at 0xffff69d38910>
    │ │ │ │ +Out[103]: <matplotlib.collections.PathCollection at 0xffff96118910>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/ds_discrete_legend_hue_scatter.png │ │ │ │
    In [104]: ds.plot.scatter(x="A", y="B", hue="w", add_legend=False, add_colorbar=True)
    │ │ │ │ -Out[104]: <matplotlib.collections.PathCollection at 0xffff34cf8a50>
    │ │ │ │ +Out[104]: <matplotlib.collections.PathCollection at 0xffff5d114a50>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/ds_discrete_colorbar_hue_scatter.png │ │ │ │

    The markersize kwarg lets you vary the point’s size by variable value. │ │ │ │ You can additionally pass size_norm to control how the variable’s values are mapped to point sizes.

    │ │ │ │
    In [105]: ds.plot.scatter(x="A", y="B", hue="y", markersize="z")
    │ │ │ │ -Out[105]: <matplotlib.collections.PathCollection at 0xffff534d4cd0>
    │ │ │ │ +Out[105]: <matplotlib.collections.PathCollection at 0xffff847accd0>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/ds_hue_size_scatter.png │ │ │ │

    The z kwarg lets you plot the data along the z-axis as well.

    │ │ │ │
    In [106]: ds.plot.scatter(x="A", y="B", z="z", hue="y", markersize="x")
    │ │ │ │ -Out[106]: <mpl_toolkits.mplot3d.art3d.Path3DCollection at 0xffff53338410>
    │ │ │ │ +Out[106]: <mpl_toolkits.mplot3d.art3d.Path3DCollection at 0xffff84590410>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/ds_hue_size_scatter_z.png │ │ │ │

    Faceting is also possible

    │ │ │ │
    In [107]: ds.plot.scatter(x="A", y="B", hue="y", markersize="x", row="x", col="w")
    │ │ │ │ -Out[107]: <xarray.plot.facetgrid.FacetGrid at 0xffff35b6b230>
    │ │ │ │ +Out[107]: <xarray.plot.facetgrid.FacetGrid at 0xffff5df8b230>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/ds_facet_scatter.png │ │ │ │

    And adding the z-axis

    │ │ │ │
    In [108]: ds.plot.scatter(x="A", y="B", z="z", hue="y", markersize="x", row="x", col="w")
    │ │ │ │ -Out[108]: <xarray.plot.facetgrid.FacetGrid at 0xffff6957a710>
    │ │ │ │ +Out[108]: <xarray.plot.facetgrid.FacetGrid at 0xffff9595a710>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/ds_facet_scatter_z.png │ │ │ │

    For more advanced scatter plots, we recommend converting the relevant data variables │ │ │ │ to a pandas DataFrame and using the extensive plotting capabilities of seaborn.

    │ │ │ │
    │ │ │ │
    │ │ │ │

    Quiver

    │ │ │ │

    Visualizing vector fields is supported with quiver plots:

    │ │ │ │
    In [109]: ds.isel(w=1, z=1).plot.quiver(x="x", y="y", u="A", v="B")
    │ │ │ │ -Out[109]: <matplotlib.quiver.Quiver at 0xffff5333c2f0>
    │ │ │ │ +Out[109]: <matplotlib.quiver.Quiver at 0xffff845942f0>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/ds_simple_quiver.png │ │ │ │

    where u and v denote the x and y direction components of the arrow vectors. Again, faceting is also possible:

    │ │ │ │
    In [110]: ds.plot.quiver(x="x", y="y", u="A", v="B", col="w", row="z", scale=4)
    │ │ │ │ -Out[110]: <xarray.plot.facetgrid.FacetGrid at 0xffff693e5bd0>
    │ │ │ │ +Out[110]: <xarray.plot.facetgrid.FacetGrid at 0xffff957c5bd0>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/ds_facet_quiver.png │ │ │ │

    scale is required for faceted quiver plots. │ │ │ │ The scale determines the number of data units per arrow length unit, i.e. a smaller scale parameter makes the arrow longer.

    │ │ │ │
    │ │ │ │
    │ │ │ │

    Streamplot

    │ │ │ │

    Visualizing vector fields is also supported with streamline plots:

    │ │ │ │
    In [111]: ds.isel(w=1, z=1).plot.streamplot(x="x", y="y", u="A", v="B")
    │ │ │ │ -Out[111]: <matplotlib.collections.LineCollection at 0xffff691eaad0>
    │ │ │ │ +Out[111]: <matplotlib.collections.LineCollection at 0xffff955c6ad0>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/ds_simple_streamplot.png │ │ │ │

    where u and v denote the x and y direction components of the vectors tangent to the streamlines. │ │ │ │ Again, faceting is also possible:

    │ │ │ │
    In [112]: ds.plot.streamplot(x="x", y="y", u="A", v="B", col="w", row="z")
    │ │ │ │ -Out[112]: <xarray.plot.facetgrid.FacetGrid at 0xffff34c04d60>
    │ │ │ │ +Out[112]: <xarray.plot.facetgrid.FacetGrid at 0xffff5cc18050>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/ds_facet_streamplot.png │ │ │ │
    │ │ │ │
    │ │ │ │
    │ │ │ │

    Maps

    │ │ │ │

    To follow this section you’ll need to have Cartopy installed and working.

    │ │ │ │

    This script will plot the air temperature on a map.

    │ │ │ │
    In [113]: import cartopy.crs as ccrs
    │ │ │ │  
    │ │ │ │  In [114]: air = xr.tutorial.open_dataset("air_temperature").air
    │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │  
    │ │ │ │  
    │ │ │ │  In [115]: p = air.isel(time=0).plot(
    │ │ │ │     .....:     subplot_kws=dict(projection=ccrs.Orthographic(-80, 35), facecolor="gray"),
    │ │ │ │     .....:     transform=ccrs.PlateCarree(),
    │ │ │ │     .....: )
    │ │ │ │     .....: 
    │ │ │ │ @@ -1024,24 +1024,24 @@
    │ │ │ │  
    In [121]: import xarray.plot as xplt
    │ │ │ │  
    │ │ │ │  In [122]: da = xr.DataArray(range(5))
    │ │ │ │  
    │ │ │ │  In [123]: fig, axs = plt.subplots(ncols=2, nrows=2)
    │ │ │ │  
    │ │ │ │  In [124]: da.plot(ax=axs[0, 0])
    │ │ │ │ -Out[124]: [<matplotlib.lines.Line2D at 0xffff68f4afd0>]
    │ │ │ │ +Out[124]: [<matplotlib.lines.Line2D at 0xffff95326fd0>]
    │ │ │ │  
    │ │ │ │  In [125]: da.plot.line(ax=axs[0, 1])
    │ │ │ │ -Out[125]: [<matplotlib.lines.Line2D at 0xffff68f4b110>]
    │ │ │ │ +Out[125]: [<matplotlib.lines.Line2D at 0xffff95327110>]
    │ │ │ │  
    │ │ │ │  In [126]: xplt.plot(da, ax=axs[1, 0])
    │ │ │ │ -Out[126]: [<matplotlib.lines.Line2D at 0xffff69470410>]
    │ │ │ │ +Out[126]: [<matplotlib.lines.Line2D at 0xffff95850410>]
    │ │ │ │  
    │ │ │ │  In [127]: xplt.line(da, ax=axs[1, 1])
    │ │ │ │ -Out[127]: [<matplotlib.lines.Line2D at 0xffff686f3110>]
    │ │ │ │ +Out[127]: [<matplotlib.lines.Line2D at 0xffff94ad3110>]
    │ │ │ │  
    │ │ │ │  In [128]: plt.tight_layout()
    │ │ │ │  
    │ │ │ │  In [129]: plt.draw()
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/plotting_ways_to_use.png │ │ │ │ @@ -1091,15 +1091,15 @@ │ │ │ │
    │ │ │ │

    The plot will produce an image corresponding to the values of the array. │ │ │ │ Hence the top left pixel will be a different color than the others. │ │ │ │ Before reading on, you may want to look at the coordinates and │ │ │ │ think carefully about what the limits, labels, and orientation for │ │ │ │ each of the axes should be.

    │ │ │ │
    In [134]: a.plot()
    │ │ │ │ -Out[134]: <matplotlib.collections.QuadMesh at 0xffff686a0cd0>
    │ │ │ │ +Out[134]: <matplotlib.collections.QuadMesh at 0xffff94a80cd0>
    │ │ │ │  
    │ │ │ │
    │ │ │ │
    _build/html/_static/plotting_example_2d_simple.png │ │ │ │ │ │ │ │

    It may seem strange that │ │ │ │ the values on the y axis are decreasing with -0.5 on the top. This is because │ │ │ │ the pixels are centered over their coordinates, and the │ │ │ │ @@ -1122,57 +1122,57 @@ │ │ │ │ .....: np.arange(20).reshape(4, 5), │ │ │ │ .....: dims=["y", "x"], │ │ │ │ .....: coords={"lat": (("y", "x"), lat), "lon": (("y", "x"), lon)}, │ │ │ │ .....: ) │ │ │ │ .....: │ │ │ │ │ │ │ │ In [139]: da.plot.pcolormesh(x="lon", y="lat") │ │ │ │ -Out[139]: <matplotlib.collections.QuadMesh at 0xffff68f62490> │ │ │ │ +Out[139]: <matplotlib.collections.QuadMesh at 0xffff9533a490> │ │ │ │

    │ │ │ │ │ │ │ │ _build/html/_static/plotting_example_2d_irreg.png │ │ │ │ │ │ │ │

    Note that in this case, xarray still follows the pixel centered convention. │ │ │ │ This might be undesirable in some cases, for example when your data is defined │ │ │ │ on a polar projection (GH781). This is why the default is to not follow │ │ │ │ this convention when plotting on a map:

    │ │ │ │
    In [140]: import cartopy.crs as ccrs
    │ │ │ │  
    │ │ │ │  In [141]: ax = plt.subplot(projection=ccrs.PlateCarree())
    │ │ │ │  
    │ │ │ │  In [142]: da.plot.pcolormesh(x="lon", y="lat", ax=ax)
    │ │ │ │ -Out[142]: <cartopy.mpl.geocollection.GeoQuadMesh at 0xffff686f0050>
    │ │ │ │ +Out[142]: <cartopy.mpl.geocollection.GeoQuadMesh at 0xffff94ad0050>
    │ │ │ │  
    │ │ │ │  In [143]: ax.scatter(lon, lat, transform=ccrs.PlateCarree())
    │ │ │ │ -Out[143]: <matplotlib.collections.PathCollection at 0xffff688391d0>
    │ │ │ │ +Out[143]: <matplotlib.collections.PathCollection at 0xffff94c191d0>
    │ │ │ │  
    │ │ │ │  In [144]: ax.coastlines()
    │ │ │ │ -Out[144]: <cartopy.mpl.feature_artist.FeatureArtist at 0xffff3c76fb60>
    │ │ │ │ +Out[144]: <cartopy.mpl.feature_artist.FeatureArtist at 0xffff60b5fb60>
    │ │ │ │  
    │ │ │ │  In [145]: ax.gridlines(draw_labels=True)
    │ │ │ │ -Out[145]: <cartopy.mpl.gridliner.Gridliner at 0xffff35b6be00>
    │ │ │ │ +Out[145]: <cartopy.mpl.gridliner.Gridliner at 0xffff5df8be00>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/plotting_example_2d_irreg_map.png │ │ │ │ │ │ │ │

    You can however decide to infer the cell boundaries and use the │ │ │ │ infer_intervals keyword:

    │ │ │ │
    In [146]: ax = plt.subplot(projection=ccrs.PlateCarree())
    │ │ │ │  
    │ │ │ │  In [147]: da.plot.pcolormesh(x="lon", y="lat", ax=ax, infer_intervals=True)
    │ │ │ │ -Out[147]: <cartopy.mpl.geocollection.GeoQuadMesh at 0xffff687edd10>
    │ │ │ │ +Out[147]: <cartopy.mpl.geocollection.GeoQuadMesh at 0xffff94bc9d10>
    │ │ │ │  
    │ │ │ │  In [148]: ax.scatter(lon, lat, transform=ccrs.PlateCarree())
    │ │ │ │ -Out[148]: <matplotlib.collections.PathCollection at 0xffff68e8d450>
    │ │ │ │ +Out[148]: <matplotlib.collections.PathCollection at 0xffff9526d450>
    │ │ │ │  
    │ │ │ │  In [149]: ax.coastlines()
    │ │ │ │ -Out[149]: <cartopy.mpl.feature_artist.FeatureArtist at 0xffff68e8e210>
    │ │ │ │ +Out[149]: <cartopy.mpl.feature_artist.FeatureArtist at 0xffff9526e210>
    │ │ │ │  
    │ │ │ │  In [150]: ax.gridlines(draw_labels=True)
    │ │ │ │ -Out[150]: <cartopy.mpl.gridliner.Gridliner at 0xffff68e8de50>
    │ │ │ │ +Out[150]: <cartopy.mpl.gridliner.Gridliner at 0xffff9526de50>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/plotting_example_2d_irreg_map_infer.png │ │ │ │ │ │ │ │
    │ │ │ │

    Note

    │ │ │ │

    The data model of xarray does not support datasets with cell boundaries │ │ │ │ @@ -1180,26 +1180,26 @@ │ │ │ │ outside the xarray framework.

    │ │ │ │
    │ │ │ │

    One can also make line plots with multidimensional coordinates. In this case, hue must be a dimension name, not a coordinate name.

    │ │ │ │
    In [151]: f, ax = plt.subplots(2, 1)
    │ │ │ │  
    │ │ │ │  In [152]: da.plot.line(x="lon", hue="y", ax=ax[0])
    │ │ │ │  Out[152]: 
    │ │ │ │ -[<matplotlib.lines.Line2D at 0xffff68482fd0>,
    │ │ │ │ - <matplotlib.lines.Line2D at 0xffff68483110>,
    │ │ │ │ - <matplotlib.lines.Line2D at 0xffff68483250>,
    │ │ │ │ - <matplotlib.lines.Line2D at 0xffff68483390>]
    │ │ │ │ +[<matplotlib.lines.Line2D at 0xffff9486afd0>,
    │ │ │ │ + <matplotlib.lines.Line2D at 0xffff9486b110>,
    │ │ │ │ + <matplotlib.lines.Line2D at 0xffff9486b250>,
    │ │ │ │ + <matplotlib.lines.Line2D at 0xffff9486b390>]
    │ │ │ │  
    │ │ │ │  In [153]: da.plot.line(x="lon", hue="x", ax=ax[1])
    │ │ │ │  Out[153]: 
    │ │ │ │ -[<matplotlib.lines.Line2D at 0xffff684a56d0>,
    │ │ │ │ - <matplotlib.lines.Line2D at 0xffff684a5810>,
    │ │ │ │ - <matplotlib.lines.Line2D at 0xffff684a5950>,
    │ │ │ │ - <matplotlib.lines.Line2D at 0xffff684a5a90>,
    │ │ │ │ - <matplotlib.lines.Line2D at 0xffff684a5bd0>]
    │ │ │ │ +[<matplotlib.lines.Line2D at 0xffff948896d0>,
    │ │ │ │ + <matplotlib.lines.Line2D at 0xffff94889810>,
    │ │ │ │ + <matplotlib.lines.Line2D at 0xffff94889950>,
    │ │ │ │ + <matplotlib.lines.Line2D at 0xffff94889a90>,
    │ │ │ │ + <matplotlib.lines.Line2D at 0xffff94889bd0>]
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/plotting_example_2d_hue_xy.png │ │ │ │
    │ │ │ │
    │ │ │ │
    │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -30,15 +30,15 @@ │ │ │ │ │ │ │ │ │ │ In [3]: import matplotlib.pyplot as plt │ │ │ │ │ │ │ │ │ │ In [4]: import xarray as xr │ │ │ │ │ For these examples we’ll use the North American air temperature dataset. │ │ │ │ │ In [5]: airtemps = xr.tutorial.open_dataset("air_temperature") │ │ │ │ │ PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/ │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/ │ │ │ │ │ xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ In [6]: airtemps │ │ │ │ │ NameError: name 'airtemps' is not defined │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -292,15 +292,15 @@ │ │ │ │ │ │ │ │ │ │ # Apply a nonlinear transformation to one of the coords │ │ │ │ │ In [50]: b.coords["lat"] = np.log(b.coords["lat"]) │ │ │ │ │ KeyError: 'lat' │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ In [51]: b.plot() │ │ │ │ │ -Out[51]: [] │ │ │ │ │ +Out[51]: [] │ │ │ │ │ _[___b_u_i_l_d_/_h_t_m_l_/___s_t_a_t_i_c_/_p_l_o_t_t_i_n_g___n_o_n_u_n_i_f_o_r_m___c_o_o_r_d_s_._p_n_g_] │ │ │ │ │ ****** OOtthheerr ttyyppeess ooff pplloott_?¶ ****** │ │ │ │ │ There are several other options for plotting 2D data. │ │ │ │ │ Contour plot using DataArray.plot.contour() │ │ │ │ │ In [52]: air2d.plot.contour() │ │ │ │ │ NameError: name 'air2d' is not defined │ │ │ │ │ _[___b_u_i_l_d_/_h_t_m_l_/___s_t_a_t_i_c_/_p_l_o_t_t_i_n_g___c_o_n_t_o_u_r_._p_n_g_] │ │ │ │ │ @@ -612,92 +612,92 @@ │ │ │ │ │ * y (y) float64 88B 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 │ │ │ │ │ * z (z) int64 32B 0 1 2 3 │ │ │ │ │ * w (w) │ │ │ │ │ +Out[99]: │ │ │ │ │ [_build/html/_static/da_A_y.png] │ │ │ │ │ Same plot can be displayed using the dataset: │ │ │ │ │ In [100]: ds.plot.scatter(x="y", y="A") │ │ │ │ │ -Out[100]: │ │ │ │ │ +Out[100]: │ │ │ │ │ [_build/html/_static/ds_A_y.png] │ │ │ │ │ Now suppose we want to scatter the A DataArray against the B DataArray │ │ │ │ │ In [101]: ds.plot.scatter(x="A", y="B") │ │ │ │ │ -Out[101]: │ │ │ │ │ +Out[101]: │ │ │ │ │ [_build/html/_static/ds_simple_scatter.png] │ │ │ │ │ The hue kwarg lets you vary the color by variable value │ │ │ │ │ In [102]: ds.plot.scatter(x="A", y="B", hue="w") │ │ │ │ │ -Out[102]: │ │ │ │ │ +Out[102]: │ │ │ │ │ [_build/html/_static/ds_hue_scatter.png] │ │ │ │ │ You can force a legend instead of a colorbar by setting add_legend=True, │ │ │ │ │ add_colorbar=False. │ │ │ │ │ In [103]: ds.plot.scatter(x="A", y="B", hue="w", add_legend=True, │ │ │ │ │ add_colorbar=False) │ │ │ │ │ -Out[103]: │ │ │ │ │ +Out[103]: │ │ │ │ │ [_build/html/_static/ds_discrete_legend_hue_scatter.png] │ │ │ │ │ In [104]: ds.plot.scatter(x="A", y="B", hue="w", add_legend=False, │ │ │ │ │ add_colorbar=True) │ │ │ │ │ -Out[104]: │ │ │ │ │ +Out[104]: │ │ │ │ │ [_build/html/_static/ds_discrete_colorbar_hue_scatter.png] │ │ │ │ │ The markersize kwarg lets you vary the point’s size by variable value. You can │ │ │ │ │ additionally pass size_norm to control how the variable’s values are mapped to │ │ │ │ │ point sizes. │ │ │ │ │ In [105]: ds.plot.scatter(x="A", y="B", hue="y", markersize="z") │ │ │ │ │ -Out[105]: │ │ │ │ │ +Out[105]: │ │ │ │ │ [_build/html/_static/ds_hue_size_scatter.png] │ │ │ │ │ The z kwarg lets you plot the data along the z-axis as well. │ │ │ │ │ In [106]: ds.plot.scatter(x="A", y="B", z="z", hue="y", markersize="x") │ │ │ │ │ -Out[106]: │ │ │ │ │ +Out[106]: │ │ │ │ │ [_build/html/_static/ds_hue_size_scatter_z.png] │ │ │ │ │ Faceting is also possible │ │ │ │ │ In [107]: ds.plot.scatter(x="A", y="B", hue="y", markersize="x", row="x", │ │ │ │ │ col="w") │ │ │ │ │ -Out[107]: │ │ │ │ │ +Out[107]: │ │ │ │ │ [_build/html/_static/ds_facet_scatter.png] │ │ │ │ │ And adding the z-axis │ │ │ │ │ In [108]: ds.plot.scatter(x="A", y="B", z="z", hue="y", markersize="x", │ │ │ │ │ row="x", col="w") │ │ │ │ │ -Out[108]: │ │ │ │ │ +Out[108]: │ │ │ │ │ [_build/html/_static/ds_facet_scatter_z.png] │ │ │ │ │ For more advanced scatter plots, we recommend converting the relevant data │ │ │ │ │ variables to a pandas DataFrame and using the extensive plotting capabilities │ │ │ │ │ of seaborn. │ │ │ │ │ ******** QQuuiivveerr_?¶ ******** │ │ │ │ │ Visualizing vector fields is supported with quiver plots: │ │ │ │ │ In [109]: ds.isel(w=1, z=1).plot.quiver(x="x", y="y", u="A", v="B") │ │ │ │ │ -Out[109]: │ │ │ │ │ +Out[109]: │ │ │ │ │ [_build/html/_static/ds_simple_quiver.png] │ │ │ │ │ where u and v denote the x and y direction components of the arrow vectors. │ │ │ │ │ Again, faceting is also possible: │ │ │ │ │ In [110]: ds.plot.quiver(x="x", y="y", u="A", v="B", col="w", row="z", scale=4) │ │ │ │ │ -Out[110]: │ │ │ │ │ +Out[110]: │ │ │ │ │ [_build/html/_static/ds_facet_quiver.png] │ │ │ │ │ scale is required for faceted quiver plots. The scale determines the number of │ │ │ │ │ data units per arrow length unit, i.e. a smaller scale parameter makes the │ │ │ │ │ arrow longer. │ │ │ │ │ ******** SSttrreeaammpplloott_?¶ ******** │ │ │ │ │ Visualizing vector fields is also supported with streamline plots: │ │ │ │ │ In [111]: ds.isel(w=1, z=1).plot.streamplot(x="x", y="y", u="A", v="B") │ │ │ │ │ -Out[111]: │ │ │ │ │ +Out[111]: │ │ │ │ │ [_build/html/_static/ds_simple_streamplot.png] │ │ │ │ │ where u and v denote the x and y direction components of the vectors tangent to │ │ │ │ │ the streamlines. Again, faceting is also possible: │ │ │ │ │ In [112]: ds.plot.streamplot(x="x", y="y", u="A", v="B", col="w", row="z") │ │ │ │ │ -Out[112]: │ │ │ │ │ +Out[112]: │ │ │ │ │ [_build/html/_static/ds_facet_streamplot.png] │ │ │ │ │ ********** MMaappss_?¶ ********** │ │ │ │ │ To follow this section you’ll need to have Cartopy installed and working. │ │ │ │ │ This script will plot the air temperature on a map. │ │ │ │ │ In [113]: import cartopy.crs as ccrs │ │ │ │ │ │ │ │ │ │ In [114]: air = xr.tutorial.open_dataset("air_temperature").air │ │ │ │ │ PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/ │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/ │ │ │ │ │ xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ In [115]: p = air.isel(time=0).plot( │ │ │ │ │ .....: subplot_kws=dict(projection=ccrs.Orthographic(-80, 35), │ │ │ │ │ facecolor="gray"), │ │ │ │ │ .....: transform=ccrs.PlateCarree(), │ │ │ │ │ @@ -744,24 +744,24 @@ │ │ │ │ │ In [121]: import xarray.plot as xplt │ │ │ │ │ │ │ │ │ │ In [122]: da = xr.DataArray(range(5)) │ │ │ │ │ │ │ │ │ │ In [123]: fig, axs = plt.subplots(ncols=2, nrows=2) │ │ │ │ │ │ │ │ │ │ In [124]: da.plot(ax=axs[0, 0]) │ │ │ │ │ -Out[124]: [] │ │ │ │ │ +Out[124]: [] │ │ │ │ │ │ │ │ │ │ In [125]: da.plot.line(ax=axs[0, 1]) │ │ │ │ │ -Out[125]: [] │ │ │ │ │ +Out[125]: [] │ │ │ │ │ │ │ │ │ │ In [126]: xplt.plot(da, ax=axs[1, 0]) │ │ │ │ │ -Out[126]: [] │ │ │ │ │ +Out[126]: [] │ │ │ │ │ │ │ │ │ │ In [127]: xplt.line(da, ax=axs[1, 1]) │ │ │ │ │ -Out[127]: [] │ │ │ │ │ +Out[127]: [] │ │ │ │ │ │ │ │ │ │ In [128]: plt.tight_layout() │ │ │ │ │ │ │ │ │ │ In [129]: plt.draw() │ │ │ │ │ _[___b_u_i_l_d_/_h_t_m_l_/___s_t_a_t_i_c_/_p_l_o_t_t_i_n_g___w_a_y_s___t_o___u_s_e_._p_n_g_] │ │ │ │ │ Here the output is the same. Since the data is 1 dimensional the line plot was │ │ │ │ │ used. │ │ │ │ │ @@ -792,15 +792,15 @@ │ │ │ │ │ [0., 0., 0.]]) │ │ │ │ │ Dimensions without coordinates: y, x │ │ │ │ │ The plot will produce an image corresponding to the values of the array. Hence │ │ │ │ │ the top left pixel will be a different color than the others. Before reading │ │ │ │ │ on, you may want to look at the coordinates and think carefully about what the │ │ │ │ │ limits, labels, and orientation for each of the axes should be. │ │ │ │ │ In [134]: a.plot() │ │ │ │ │ -Out[134]: │ │ │ │ │ +Out[134]: │ │ │ │ │ _[___b_u_i_l_d_/_h_t_m_l_/___s_t_a_t_i_c_/_p_l_o_t_t_i_n_g___e_x_a_m_p_l_e___2_d___s_i_m_p_l_e_._p_n_g_] │ │ │ │ │ It may seem strange that the values on the y axis are decreasing with -0.5 on │ │ │ │ │ the top. This is because the pixels are centered over their coordinates, and │ │ │ │ │ the axis labels and ranges correspond to the values of the coordinates. │ │ │ │ │ ******** MMuullttiiddiimmeennssiioonnaall ccoooorrddiinnaatteess_?¶ ******** │ │ │ │ │ See also: _W_o_r_k_i_n_g_ _w_i_t_h_ _M_u_l_t_i_d_i_m_e_n_s_i_o_n_a_l_ _C_o_o_r_d_i_n_a_t_e_s. │ │ │ │ │ You can plot irregular grids defined by multidimensional coordinates with │ │ │ │ │ @@ -817,74 +817,74 @@ │ │ │ │ │ .....: np.arange(20).reshape(4, 5), │ │ │ │ │ .....: dims=["y", "x"], │ │ │ │ │ .....: coords={"lat": (("y", "x"), lat), "lon": (("y", "x"), lon)}, │ │ │ │ │ .....: ) │ │ │ │ │ .....: │ │ │ │ │ │ │ │ │ │ In [139]: da.plot.pcolormesh(x="lon", y="lat") │ │ │ │ │ -Out[139]: │ │ │ │ │ +Out[139]: │ │ │ │ │ _[___b_u_i_l_d_/_h_t_m_l_/___s_t_a_t_i_c_/_p_l_o_t_t_i_n_g___e_x_a_m_p_l_e___2_d___i_r_r_e_g_._p_n_g_] │ │ │ │ │ Note that in this case, xarray still follows the pixel centered convention. │ │ │ │ │ This might be undesirable in some cases, for example when your data is defined │ │ │ │ │ on a polar projection (_G_H_7_8_1). This is why the default is to not follow this │ │ │ │ │ convention when plotting on a map: │ │ │ │ │ In [140]: import cartopy.crs as ccrs │ │ │ │ │ │ │ │ │ │ In [141]: ax = plt.subplot(projection=ccrs.PlateCarree()) │ │ │ │ │ │ │ │ │ │ In [142]: da.plot.pcolormesh(x="lon", y="lat", ax=ax) │ │ │ │ │ -Out[142]: │ │ │ │ │ +Out[142]: │ │ │ │ │ │ │ │ │ │ In [143]: ax.scatter(lon, lat, transform=ccrs.PlateCarree()) │ │ │ │ │ -Out[143]: │ │ │ │ │ +Out[143]: │ │ │ │ │ │ │ │ │ │ In [144]: ax.coastlines() │ │ │ │ │ -Out[144]: │ │ │ │ │ +Out[144]: │ │ │ │ │ │ │ │ │ │ In [145]: ax.gridlines(draw_labels=True) │ │ │ │ │ -Out[145]: │ │ │ │ │ +Out[145]: │ │ │ │ │ _[___b_u_i_l_d_/_h_t_m_l_/___s_t_a_t_i_c_/_p_l_o_t_t_i_n_g___e_x_a_m_p_l_e___2_d___i_r_r_e_g___m_a_p_._p_n_g_] │ │ │ │ │ You can however decide to infer the cell boundaries and use the infer_intervals │ │ │ │ │ keyword: │ │ │ │ │ In [146]: ax = plt.subplot(projection=ccrs.PlateCarree()) │ │ │ │ │ │ │ │ │ │ In [147]: da.plot.pcolormesh(x="lon", y="lat", ax=ax, infer_intervals=True) │ │ │ │ │ -Out[147]: │ │ │ │ │ +Out[147]: │ │ │ │ │ │ │ │ │ │ In [148]: ax.scatter(lon, lat, transform=ccrs.PlateCarree()) │ │ │ │ │ -Out[148]: │ │ │ │ │ +Out[148]: │ │ │ │ │ │ │ │ │ │ In [149]: ax.coastlines() │ │ │ │ │ -Out[149]: │ │ │ │ │ +Out[149]: │ │ │ │ │ │ │ │ │ │ In [150]: ax.gridlines(draw_labels=True) │ │ │ │ │ -Out[150]: │ │ │ │ │ +Out[150]: │ │ │ │ │ _[___b_u_i_l_d_/_h_t_m_l_/___s_t_a_t_i_c_/_p_l_o_t_t_i_n_g___e_x_a_m_p_l_e___2_d___i_r_r_e_g___m_a_p___i_n_f_e_r_._p_n_g_] │ │ │ │ │ Note │ │ │ │ │ The data model of xarray does not support datasets with _c_e_l_l_ _b_o_u_n_d_a_r_i_e_s yet. If │ │ │ │ │ you want to use these coordinates, you’ll have to make the plots outside the │ │ │ │ │ xarray framework. │ │ │ │ │ One can also make line plots with multidimensional coordinates. In this case, │ │ │ │ │ hue must be a dimension name, not a coordinate name. │ │ │ │ │ In [151]: f, ax = plt.subplots(2, 1) │ │ │ │ │ │ │ │ │ │ In [152]: da.plot.line(x="lon", hue="y", ax=ax[0]) │ │ │ │ │ Out[152]: │ │ │ │ │ -[, │ │ │ │ │ - , │ │ │ │ │ - , │ │ │ │ │ - ] │ │ │ │ │ +[, │ │ │ │ │ + , │ │ │ │ │ + , │ │ │ │ │ + ] │ │ │ │ │ │ │ │ │ │ In [153]: da.plot.line(x="lon", hue="x", ax=ax[1]) │ │ │ │ │ Out[153]: │ │ │ │ │ -[, │ │ │ │ │ - , │ │ │ │ │ - , │ │ │ │ │ - , │ │ │ │ │ - ] │ │ │ │ │ +[, │ │ │ │ │ + , │ │ │ │ │ + , │ │ │ │ │ + , │ │ │ │ │ + ] │ │ │ │ │ [_build/html/_static/plotting_example_2d_hue_xy.png] │ │ │ │ │ _[_L_o_g_o_ _o_f_ _x_a_r_r_a_y_] │ │ │ │ │ ************ _xx_aa_rr_rr_aa_yy ************ │ │ │ │ │ ******** NNaavviiggaattiioonn ******** │ │ │ │ │ For users │ │ │ │ │ * _G_e_t_t_i_n_g_ _S_t_a_r_t_e_d │ │ │ │ │ * _U_s_e_r_ _G_u_i_d_e │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/user-guide/reshaping.html │ │ │ │ @@ -554,15 +554,15 @@ │ │ │ │
    │ │ │ │

    Reshaping via coarsen

    │ │ │ │

    Whilst coarsen is normally used for reducing your data’s resolution by applying a reduction function │ │ │ │ (see the page on computation), │ │ │ │ it can also be used to reorganise your data without applying a computation via construct().

    │ │ │ │

    Taking our example tutorial air temperature dataset over the Northern US

    │ │ │ │
    In [56]: air = xr.tutorial.open_dataset("air_temperature")["air"]
    │ │ │ │ -PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/first-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │ +PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not create data cache folder '/nonexistent/second-build/.cache/xarray_tutorial_data'. Will not be able to download data files.
    │ │ │ │  
    │ │ │ │  
    │ │ │ │  In [57]: air.isel(time=0).plot(x="lon", y="lat")
    │ │ │ │  NameError: name 'air' is not defined
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/pre_coarsening.png │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -440,15 +440,15 @@ │ │ │ │ │ ********** RReesshhaappiinngg vviiaa ccooaarrsseenn_?¶ ********** │ │ │ │ │ Whilst coarsen is normally used for reducing your data’s resolution by applying │ │ │ │ │ a reduction function (see the _p_a_g_e_ _o_n_ _c_o_m_p_u_t_a_t_i_o_n), it can also be used to │ │ │ │ │ reorganise your data without applying a computation via construct(). │ │ │ │ │ Taking our example tutorial air temperature dataset over the Northern US │ │ │ │ │ In [56]: air = xr.tutorial.open_dataset("air_temperature")["air"] │ │ │ │ │ PermissionError: [Errno 13] Permission denied: '/nonexistent' | Pooch could not │ │ │ │ │ -create data cache folder '/nonexistent/first-build/.cache/ │ │ │ │ │ +create data cache folder '/nonexistent/second-build/.cache/ │ │ │ │ │ xarray_tutorial_data'. Will not be able to download data files. │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ In [57]: air.isel(time=0).plot(x="lon", y="lat") │ │ │ │ │ NameError: name 'air' is not defined │ │ │ │ │ [_build/html/_static/pre_coarsening.png] │ │ │ │ │ we can split this up into sub-regions of size (9, 18) points using construct(): │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/user-guide/testing.html │ │ │ │ @@ -84,36 +84,53 @@ │ │ │ │

    Generating Examples

    │ │ │ │

    To see an example of what each of these strategies might produce, you can call one followed by the .example() method, │ │ │ │ which is a general hypothesis method valid for all strategies.

    │ │ │ │
    In [2]: import xarray.testing.strategies as xrst
    │ │ │ │  
    │ │ │ │  In [3]: xrst.variables().example()
    │ │ │ │  Out[3]: 
    │ │ │ │ -<xarray.Variable (óĴİ: 5)> Size: 40B
    │ │ │ │ -array([-0.00e+00+1.175e-38j,  5.96e-08+6.104e-05j,  2.22e-16-1.175e-38j,       nan+5.960e-08j,
    │ │ │ │ -       -0.00e+00+1.175e-38j], dtype=complex64)
    │ │ │ │ -Attributes:
    │ │ │ │ -    Ž:        {}
    │ │ │ │ -    :         {'ąÁIĄž': None, '': array([b'\xc6\xbd\xf4', b''], dtype='|S14')...
    │ │ │ │ +<xarray.Variable (0: 1)> Size: 1B
    │ │ │ │ +array([0], dtype=int8)
    │ │ │ │  
    │ │ │ │  In [4]: xrst.variables().example()
    │ │ │ │  Out[4]: 
    │ │ │ │ -<xarray.Variable (ſď: 6)> Size: 48B
    │ │ │ │ -array([2.225e-311, 2.225e-311, 1.401e-045, 2.225e-311,        nan, 2.225e-311])
    │ │ │ │ +<xarray.Variable (hžŲſŻ: 3, nÕ: 2)> Size: 12B
    │ │ │ │ +array([[25194,  9461],
    │ │ │ │ +       [11332, 30682],
    │ │ │ │ +       [27371, 25504]], dtype=int16)
    │ │ │ │  Attributes:
    │ │ │ │ -    ŻHĹZĶ:    {'ż': True, 'ąĨ': array([-2.238e+16+2.j]), '': None, 'ſóŔ¹': 'w...
    │ │ │ │ +    :         [[':\U000b9adc\U0008850a¯ü!½Ú\x1a«ô' '\U0001a8cb\x8c\U000d1bc2']]
    │ │ │ │ +    žżŻ:      
    │ │ │ │ +    ž:        None
    │ │ │ │ +    Ň:        ['ê|\x86®Â^8§' '\U00068234Ñ>\x87c\U00087b86Ë']
    │ │ │ │ +    ģĩ:       iĴZW
    │ │ │ │ +    öčŠ:      False
    │ │ │ │ +    ŻuſÄP:    
    │ │ │ │ +    ſżßHÑ:    False
    │ │ │ │ +    ŏŖ:       [0.5]
    │ │ │ │ +    ĤĦë:      [b'' b'\x06un\x11\x048ca\x80']
    │ │ │ │  
    │ │ │ │  In [5]: xrst.variables().example()
    │ │ │ │  Out[5]: 
    │ │ │ │ -<xarray.Variable (ħy: 1)> Size: 8B
    │ │ │ │ -array([inf+9.007e+15j], dtype=complex64)
    │ │ │ │ +<xarray.Variable (ſżŎTâ: 4, Şþ: 2, ʼn: 4)> Size: 64B
    │ │ │ │ +array([[[inf, inf, inf, inf],
    │ │ │ │ +        [-1., inf, inf, inf]],
    │ │ │ │ +
    │ │ │ │ +       [[inf, inf, inf, inf],
    │ │ │ │ +        [inf, inf, inf, inf]],
    │ │ │ │ +
    │ │ │ │ +       [[inf, inf, inf, inf],
    │ │ │ │ +        [inf, inf, inf, inf]],
    │ │ │ │ +
    │ │ │ │ +       [[inf, inf, inf, inf],
    │ │ │ │ +        [inf, inf, inf, inf]]], dtype=float16)
    │ │ │ │  Attributes:
    │ │ │ │ -    żÓ²Ē:     {'': True}
    │ │ │ │ -    ſŁwĢij:    {'': False, 'uįÊwv': None, 'µê': True}
    │ │ │ │ -    Żŵ:       {}
    │ │ │ │ +    ĊāŽžť:    None
    │ │ │ │ +    XŮżúŻ:    None
    │ │ │ │ +    ďqÞì:     True
    │ │ │ │  
    │ │ │ │
    │ │ │ │

    You can see that calling .example() multiple times will generate different examples, giving you an idea of the wide │ │ │ │ range of data that the xarray strategies can generate.

    │ │ │ │

    In your tests however you should not use .example() - instead you should parameterize your tests with the │ │ │ │ hypothesis.given() decorator:

    │ │ │ │
    In [6]: from hypothesis import given
    │ │ │ │ @@ -131,108 +148,114 @@
    │ │ │ │  

    Xarray’s strategies can accept other strategies as arguments, allowing you to customise the contents of the generated │ │ │ │ examples.

    │ │ │ │
    # generate a Variable containing an array with a complex number dtype, but all other details still arbitrary
    │ │ │ │  In [8]: from hypothesis.extra.numpy import complex_number_dtypes
    │ │ │ │  
    │ │ │ │  In [9]: xrst.variables(dtype=complex_number_dtypes()).example()
    │ │ │ │  Out[9]: 
    │ │ │ │ -<xarray.Variable (ŻŻ: 6, LūÞłĀ: 1, Ćż: 4)> Size: 192B
    │ │ │ │ -array([[[inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j]],
    │ │ │ │ -
    │ │ │ │ -       [[inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j]],
    │ │ │ │ -
    │ │ │ │ -       [[inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j]],
    │ │ │ │ -
    │ │ │ │ -       [[inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j]],
    │ │ │ │ -
    │ │ │ │ -       [[inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j, nan-1.175e-38j]],
    │ │ │ │ -
    │ │ │ │ -       [[inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j]]], dtype=complex64)
    │ │ │ │ +<xarray.Variable (ſAŽÊý: 6)> Size: 96B
    │ │ │ │ +array([ 1.333e+016       -infj,  9.007e+015-0.000e+000j, -1.000e-005-6.203e+016j,
    │ │ │ │ +        1.000e+000-1.177e-278j, -1.694e-264-4.080e+016j,  1.500e+000-3.333e-001j])
    │ │ │ │ +Attributes:
    │ │ │ │ +    4ċ:       True
    │ │ │ │ +    :         
    │ │ │ │ +    şÆžR:     True
    │ │ │ │ +    lĈ:       True
    │ │ │ │ +    ÝŽŽÙĄ:    True
    │ │ │ │ +    ġŅ5¾Ś:    None
    │ │ │ │ +    ij:        ŻňlJŔ
    │ │ │ │  
    │ │ │ │
    │ │ │ │

    This also works with custom strategies, or strategies defined in other packages. │ │ │ │ For example you could imagine creating a chunks strategy to specify particular chunking patterns for a dask-backed array.

    │ │ │ │
    │ │ │ │
    │ │ │ │

    Fixing Arguments

    │ │ │ │

    If you want to fix one aspect of the data structure, whilst allowing variation in the generated examples │ │ │ │ over all other aspects, then use hypothesis.strategies.just().

    │ │ │ │
    In [10]: import hypothesis.strategies as st
    │ │ │ │  
    │ │ │ │  # Generates only variable objects with dimensions ["x", "y"]
    │ │ │ │  In [11]: xrst.variables(dims=st.just(["x", "y"])).example()
    │ │ │ │  Out[11]: 
    │ │ │ │ -<xarray.Variable (x: 1, y: 1)> Size: 1B
    │ │ │ │ -array([[0]], dtype=int8)
    │ │ │ │ +<xarray.Variable (x: 6, y: 6)> Size: 288B
    │ │ │ │ +array([[               63321,                63321,                63321,                63321,
    │ │ │ │ +                       63321,                  207],
    │ │ │ │ +       [               63321,                  182,                63321,                  111,
    │ │ │ │ +                       63321,                  177],
    │ │ │ │ +       [               34591,                63321,                63321,                63321,
    │ │ │ │ +                       63321,                63321],
    │ │ │ │ +       [               63321,                63321,                63321,                63321,
    │ │ │ │ +                       63321,                63321],
    │ │ │ │ +       [               63321,                63321,                63321,                  201,
    │ │ │ │ +                       63321,                63321],
    │ │ │ │ +       [               63321,                63321,                63321, 18446744073709551614,
    │ │ │ │ +                       63321,                10782]], dtype=uint64)
    │ │ │ │ +Attributes:
    │ │ │ │ +    ĺSČ:      ĤžÆðP
    │ │ │ │ +    :         [[ True  True]\n [ True  True]]
    │ │ │ │  
    │ │ │ │
    │ │ │ │

    (This is technically another example of chaining strategies - hypothesis.strategies.just() is simply a │ │ │ │ special strategy that just contains a single example.)

    │ │ │ │

    To fix the length of dimensions you can instead pass dims as a mapping of dimension names to lengths │ │ │ │ (i.e. following xarray objects’ .sizes() property), e.g.

    │ │ │ │
    # Generates only variables with dimensions ["x", "y"], of lengths 2 & 3 respectively
    │ │ │ │  In [12]: xrst.variables(dims=st.just({"x": 2, "y": 3})).example()
    │ │ │ │  Out[12]: 
    │ │ │ │ -<xarray.Variable (x: 2, y: 3)> Size: 12B
    │ │ │ │ -array([[16814,  5066, 14189],
    │ │ │ │ -       [38406, 19324, 61958]], dtype=uint16)
    │ │ │ │ +<xarray.Variable (x: 2, y: 3)> Size: 6B
    │ │ │ │ +array([[0, 0, 0],
    │ │ │ │ +       [0, 0, 0]], dtype=int8)
    │ │ │ │  
    │ │ │ │
    │ │ │ │

    You can also use this to specify that you want examples which are missing some part of the data structure, for instance

    │ │ │ │
    # Generates a Variable with no attributes
    │ │ │ │  In [13]: xrst.variables(attrs=st.just({})).example()
    │ │ │ │  Out[13]: 
    │ │ │ │ -<xarray.Variable (ç: 5, ŅŝŮlž: 4)> Size: 160B
    │ │ │ │ -array([[-0.00e+00      -infj, -0.00e+00+2.568e+16j,       nan-0.000e+00j,       nan-0.000e+00j],
    │ │ │ │ -       [-0.00e+00-1.100e+00j,       nan-0.000e+00j,       nan-0.000e+00j,  0.00e+00+1.175e-38j],
    │ │ │ │ -       [      nan-0.000e+00j,       nan-0.000e+00j,       nan-0.000e+00j,       nan-0.000e+00j],
    │ │ │ │ -       [      nan-0.000e+00j,       nan-0.000e+00j,       nan-0.000e+00j,       nan-0.000e+00j],
    │ │ │ │ -       [      nan-0.000e+00j,       nan-0.000e+00j,      -inf-1.546e+16j,  2.22e-16+0.000e+00j]],
    │ │ │ │ -      dtype=complex64)
    │ │ │ │ +<xarray.Variable (Xd: 1)> Size: 8B
    │ │ │ │ +array([22760], dtype=uint64)
    │ │ │ │  
    │ │ │ │
    │ │ │ │

    Through a combination of chaining strategies and fixing arguments, you can specify quite complicated requirements on the │ │ │ │ objects your chained strategy will generate.

    │ │ │ │
    In [14]: fixed_x_variable_y_maybe_z = st.fixed_dictionaries(
    │ │ │ │     ....:     {"x": st.just(2), "y": st.integers(3, 4)}, optional={"z": st.just(2)}
    │ │ │ │     ....: )
    │ │ │ │     ....: 
    │ │ │ │  
    │ │ │ │  In [15]: fixed_x_variable_y_maybe_z.example()
    │ │ │ │ -Out[15]: {'x': 2, 'y': 4}
    │ │ │ │ +Out[15]: {'x': 2, 'y': 3, 'z': 2}
    │ │ │ │  
    │ │ │ │  In [16]: special_variables = xrst.variables(dims=fixed_x_variable_y_maybe_z)
    │ │ │ │  
    │ │ │ │  In [17]: special_variables.example()
    │ │ │ │  Out[17]: 
    │ │ │ │ -<xarray.Variable (x: 2, y: 4, z: 2)> Size: 64B
    │ │ │ │ -array([[[    53378,     53378],
    │ │ │ │ -        [    35168,     53378],
    │ │ │ │ -        [    53378,     53378],
    │ │ │ │ -        [    53378,     53378]],
    │ │ │ │ -
    │ │ │ │ -       [[    53378,     53378],
    │ │ │ │ -        [    53378,       120],
    │ │ │ │ -        [194599019,     53378],
    │ │ │ │ -        [    53378,     53378]]], dtype=uint32)
    │ │ │ │ +<xarray.Variable (x: 2, y: 4)> Size: 64B
    │ │ │ │ +array([[       nan      +infj, -0.000e+00-0.000e+00j, -6.795e+16+2.220e-16j,
    │ │ │ │ +               nan      +nanj],
    │ │ │ │ +       [ 0.000e+00+0.000e+00j, -7.342e+33      +infj,  8.522e+15+5.000e-01j,
    │ │ │ │ +               nan-1.192e-07j]], dtype=complex64)
    │ │ │ │ +Attributes:
    │ │ │ │ +    ŎŻţWÔ:    {'ôžţ': array(['1969-12-20T23:16',              'NaT'], dtype='...
    │ │ │ │  
    │ │ │ │  In [18]: special_variables.example()
    │ │ │ │  Out[18]: 
    │ │ │ │ -<xarray.Variable (x: 2, y: 3, z: 2)> Size: 192B
    │ │ │ │ -array([[[ 6.816e-065-1.798e+308j,  4.935e+016+2.225e-311j],
    │ │ │ │ -        [ 1.900e+000-1.000e+000j,  2.220e-016-2.000e+000j],
    │ │ │ │ -        [-6.104e-005-2.225e-309j, -1.900e+000+5.960e-008j]],
    │ │ │ │ -
    │ │ │ │ -       [[-2.225e-311-1.113e-308j, -3.403e+038-1.192e-007j],
    │ │ │ │ -        [ 0.000e+000-5.000e-001j, -9.827e+015       +nanj],
    │ │ │ │ -        [-1.798e+308       -infj,        -inf-1.100e+000j]]])
    │ │ │ │ +<xarray.Variable (x: 2, y: 4, z: 2)> Size: 64B
    │ │ │ │ +array([[[     14275,      64836],
    │ │ │ │ +        [2196677581,         69],
    │ │ │ │ +        [       113,        235],
    │ │ │ │ +        [     14275,      14275]],
    │ │ │ │ +
    │ │ │ │ +       [[       241,         97],
    │ │ │ │ +        [     14275,      47015],
    │ │ │ │ +        [     62409,        151],
    │ │ │ │ +        [     14275,        106]]], dtype=uint32)
    │ │ │ │  Attributes:
    │ │ │ │ -    žÒŻ:      {}
    │ │ │ │ -    žëCkſ:    {'GŭNŀD': None, '½Ů': '', 'ŇYAľŁ': True, '0ĺOķĘ': '', '': True,...
    │ │ │ │ -    Ũ:        {}
    │ │ │ │ +    :         {'': 'ĬžċĚŽ', 'ųIg4F': False, 'żſſżñ': 'ŶïôĸŻ', 'ē': None, 'ÜG'...
    │ │ │ │ +    E:        {'ůãä¹ň': True, 'ſž': False}
    │ │ │ │  
    │ │ │ │
    │ │ │ │

    Here we have used one of hypothesis’ built-in strategies hypothesis.strategies.fixed_dictionaries() to create a │ │ │ │ strategy which generates mappings of dimension names to lengths (i.e. the size of the xarray object we want). │ │ │ │ This particular strategy will always generate an x dimension of length 2, and a y dimension of │ │ │ │ length either 3 or 4, and will sometimes also generate a z dimension of length 2. │ │ │ │ By feeding this strategy for dictionaries into the dims argument of xarray’s variables() strategy, │ │ │ │ @@ -350,28 +373,28 @@ │ │ │ │

    A common task when testing xarray user code is checking that your function works for all valid input dimensions. │ │ │ │ We can chain strategies to achieve this, for which the helper strategy unique_subset_of() │ │ │ │ is useful.

    │ │ │ │

    It works for lists of dimension names

    │ │ │ │
    In [33]: dims = ["x", "y", "z"]
    │ │ │ │  
    │ │ │ │  In [34]: xrst.unique_subset_of(dims).example()
    │ │ │ │ -Out[34]: ['x', 'z', 'y']
    │ │ │ │ +Out[34]: []
    │ │ │ │  
    │ │ │ │  In [35]: xrst.unique_subset_of(dims).example()
    │ │ │ │ -Out[35]: ['z', 'y', 'x']
    │ │ │ │ +Out[35]: ['y', 'x']
    │ │ │ │  
    │ │ │ │
    │ │ │ │

    as well as for mappings of dimension names to sizes

    │ │ │ │
    In [36]: dim_sizes = {"x": 2, "y": 3, "z": 4}
    │ │ │ │  
    │ │ │ │  In [37]: xrst.unique_subset_of(dim_sizes).example()
    │ │ │ │ -Out[37]: {'x': 2, 'z': 4, 'y': 3}
    │ │ │ │ +Out[37]: {'z': 4, 'y': 3}
    │ │ │ │  
    │ │ │ │  In [38]: xrst.unique_subset_of(dim_sizes).example()
    │ │ │ │ -Out[38]: {'y': 3}
    │ │ │ │ +Out[38]: {}
    │ │ │ │  
    │ │ │ │
    │ │ │ │

    This is useful because operations like reductions can be performed over any subset of the xarray object’s dimensions. │ │ │ │ For example we can write a pytest test that tests that a reduction gives the expected result when applying that reduction │ │ │ │ along any possible valid subset of the Variable’s dimensions.

    │ │ │ │
    import numpy.testing as npt
    │ │ │ │ ├── html2text {}
    │ │ │ │ │ @@ -28,39 +28,53 @@
    │ │ │ │ │  To see an example of what each of these strategies might produce, you can call
    │ │ │ │ │  one followed by the .example() method, which is a general hypothesis method
    │ │ │ │ │  valid for all strategies.
    │ │ │ │ │  In [2]: import xarray.testing.strategies as xrst
    │ │ │ │ │  
    │ │ │ │ │  In [3]: xrst.variables().example()
    │ │ │ │ │  Out[3]:
    │ │ │ │ │ - Size: 40B
    │ │ │ │ │ -array([-0.00e+00+1.175e-38j,  5.96e-08+6.104e-05j,  2.22e-16-1.175e-38j,
    │ │ │ │ │ -nan+5.960e-08j,
    │ │ │ │ │ -       -0.00e+00+1.175e-38j], dtype=complex64)
    │ │ │ │ │ -Attributes:
    │ │ │ │ │ -    Ž:        {}
    │ │ │ │ │ -    :         {'ąÁIĄž': None, '': array([b'\xc6\xbd\xf4', b''],
    │ │ │ │ │ -dtype='|S14')...
    │ │ │ │ │ + Size: 1B
    │ │ │ │ │ +array([0], dtype=int8)
    │ │ │ │ │  
    │ │ │ │ │  In [4]: xrst.variables().example()
    │ │ │ │ │  Out[4]:
    │ │ │ │ │ - Size: 48B
    │ │ │ │ │ -array([2.225e-311, 2.225e-311, 1.401e-045, 2.225e-311,        nan, 2.225e-311])
    │ │ │ │ │ + Size: 12B
    │ │ │ │ │ +array([[25194,  9461],
    │ │ │ │ │ +       [11332, 30682],
    │ │ │ │ │ +       [27371, 25504]], dtype=int16)
    │ │ │ │ │  Attributes:
    │ │ │ │ │ -    ŻHĹZĶ:    {'ż': True, 'ąĨ': array([-2.238e+16+2.j]), '': None, 'ſóŔ¹':
    │ │ │ │ │ -'w...
    │ │ │ │ │ +    :         [[':\U000b9adc\U0008850a¯ü!½Ú\x1a«ô' '\U0001a8cb\x8c\U000d1bc2']]
    │ │ │ │ │ +    žżŻ:
    │ │ │ │ │ +    ž:        None
    │ │ │ │ │ +    Ň:        ['ê|\x86®Â^8§' '\U00068234Ñ>\x87c\U00087b86Ë']
    │ │ │ │ │ +    ģĩ:       iĴZW
    │ │ │ │ │ +    öčŠ:      False
    │ │ │ │ │ +    ŻuſÄP:
    │ │ │ │ │ +    ſżßHÑ:    False
    │ │ │ │ │ +    ŏŖ:       [0.5]
    │ │ │ │ │ +    ĤĦë:      [b'' b'\x06un\x11\x048ca\x80']
    │ │ │ │ │  
    │ │ │ │ │  In [5]: xrst.variables().example()
    │ │ │ │ │  Out[5]:
    │ │ │ │ │ - Size: 8B
    │ │ │ │ │ -array([inf+9.007e+15j], dtype=complex64)
    │ │ │ │ │ + Size: 64B
    │ │ │ │ │ +array([[[inf, inf, inf, inf],
    │ │ │ │ │ +        [-1., inf, inf, inf]],
    │ │ │ │ │ +
    │ │ │ │ │ +       [[inf, inf, inf, inf],
    │ │ │ │ │ +        [inf, inf, inf, inf]],
    │ │ │ │ │ +
    │ │ │ │ │ +       [[inf, inf, inf, inf],
    │ │ │ │ │ +        [inf, inf, inf, inf]],
    │ │ │ │ │ +
    │ │ │ │ │ +       [[inf, inf, inf, inf],
    │ │ │ │ │ +        [inf, inf, inf, inf]]], dtype=float16)
    │ │ │ │ │  Attributes:
    │ │ │ │ │ -    żÓ²Ē:     {'': True}
    │ │ │ │ │ -    ſŁwĢij:    {'': False, 'uįÊwv': None, 'µê': True}
    │ │ │ │ │ -    Żŵ:       {}
    │ │ │ │ │ +    ĊāŽžť:    None
    │ │ │ │ │ +    XŮżúŻ:    None
    │ │ │ │ │ +    ďqÞì:     True
    │ │ │ │ │  You can see that calling .example() multiple times will generate different
    │ │ │ │ │  examples, giving you an idea of the wide range of data that the xarray
    │ │ │ │ │  strategies can generate.
    │ │ │ │ │  In your tests however you should not use .example() - instead you should
    │ │ │ │ │  parameterize your tests with the hypothesis.given() decorator:
    │ │ │ │ │  In [6]: from hypothesis import given
    │ │ │ │ │  In [7]: @given(xrst.variables())
    │ │ │ │ │ @@ -72,113 +86,122 @@
    │ │ │ │ │  customise the contents of the generated examples.
    │ │ │ │ │  # generate a Variable containing an array with a complex number dtype, but all
    │ │ │ │ │  other details still arbitrary
    │ │ │ │ │  In [8]: from hypothesis.extra.numpy import complex_number_dtypes
    │ │ │ │ │  
    │ │ │ │ │  In [9]: xrst.variables(dtype=complex_number_dtypes()).example()
    │ │ │ │ │  Out[9]:
    │ │ │ │ │ - Size: 192B
    │ │ │ │ │ -array([[[inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j]],
    │ │ │ │ │ -
    │ │ │ │ │ -       [[inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j]],
    │ │ │ │ │ -
    │ │ │ │ │ -       [[inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j]],
    │ │ │ │ │ -
    │ │ │ │ │ -       [[inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j]],
    │ │ │ │ │ -
    │ │ │ │ │ -       [[inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j, nan-1.175e-38j]],
    │ │ │ │ │ -
    │ │ │ │ │ -       [[inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j, inf-1.401e-45j]]],
    │ │ │ │ │ -dtype=complex64)
    │ │ │ │ │ + Size: 96B
    │ │ │ │ │ +array([ 1.333e+016       -infj,  9.007e+015-0.000e+000j, -1.000e-005-
    │ │ │ │ │ +6.203e+016j,
    │ │ │ │ │ +        1.000e+000-1.177e-278j, -1.694e-264-4.080e+016j,  1.500e+000-3.333e-
    │ │ │ │ │ +001j])
    │ │ │ │ │ +Attributes:
    │ │ │ │ │ +    4ċ:       True
    │ │ │ │ │ +    :
    │ │ │ │ │ +    şÆžR:     True
    │ │ │ │ │ +    lĈ:       True
    │ │ │ │ │ +    ÝŽŽÙĄ:    True
    │ │ │ │ │ +    ġŅ5¾Ś:    None
    │ │ │ │ │ +    ij:        ŻňlJŔ
    │ │ │ │ │  This also works with custom strategies, or strategies defined in other
    │ │ │ │ │  packages. For example you could imagine creating a chunks strategy to specify
    │ │ │ │ │  particular chunking patterns for a dask-backed array.
    │ │ │ │ │  ******** FFiixxiinngg AArrgguummeennttss_?¶ ********
    │ │ │ │ │  If you want to fix one aspect of the data structure, whilst allowing variation
    │ │ │ │ │  in the generated examples over all other aspects, then use
    │ │ │ │ │  hypothesis.strategies.just().
    │ │ │ │ │  In [10]: import hypothesis.strategies as st
    │ │ │ │ │  
    │ │ │ │ │  # Generates only variable objects with dimensions ["x", "y"]
    │ │ │ │ │  In [11]: xrst.variables(dims=st.just(["x", "y"])).example()
    │ │ │ │ │  Out[11]:
    │ │ │ │ │ - Size: 1B
    │ │ │ │ │ -array([[0]], dtype=int8)
    │ │ │ │ │ + Size: 288B
    │ │ │ │ │ +array([[               63321,                63321,                63321,
    │ │ │ │ │ +63321,
    │ │ │ │ │ +                       63321,                  207],
    │ │ │ │ │ +       [               63321,                  182,                63321,
    │ │ │ │ │ +111,
    │ │ │ │ │ +                       63321,                  177],
    │ │ │ │ │ +       [               34591,                63321,                63321,
    │ │ │ │ │ +63321,
    │ │ │ │ │ +                       63321,                63321],
    │ │ │ │ │ +       [               63321,                63321,                63321,
    │ │ │ │ │ +63321,
    │ │ │ │ │ +                       63321,                63321],
    │ │ │ │ │ +       [               63321,                63321,                63321,
    │ │ │ │ │ +201,
    │ │ │ │ │ +                       63321,                63321],
    │ │ │ │ │ +       [               63321,                63321,                63321,
    │ │ │ │ │ +18446744073709551614,
    │ │ │ │ │ +                       63321,                10782]], dtype=uint64)
    │ │ │ │ │ +Attributes:
    │ │ │ │ │ +    ĺSČ:      ĤžÆðP
    │ │ │ │ │ +    :         [[ True  True]\n [ True  True]]
    │ │ │ │ │  (This is technically another example of chaining strategies -
    │ │ │ │ │  hypothesis.strategies.just() is simply a special strategy that just contains a
    │ │ │ │ │  single example.)
    │ │ │ │ │  To fix the length of dimensions you can instead pass dims as a mapping of
    │ │ │ │ │  dimension names to lengths (i.e. following xarray objects’ .sizes() property),
    │ │ │ │ │  e.g.
    │ │ │ │ │  # Generates only variables with dimensions ["x", "y"], of lengths 2 & 3
    │ │ │ │ │  respectively
    │ │ │ │ │  In [12]: xrst.variables(dims=st.just({"x": 2, "y": 3})).example()
    │ │ │ │ │  Out[12]:
    │ │ │ │ │ - Size: 12B
    │ │ │ │ │ -array([[16814,  5066, 14189],
    │ │ │ │ │ -       [38406, 19324, 61958]], dtype=uint16)
    │ │ │ │ │ + Size: 6B
    │ │ │ │ │ +array([[0, 0, 0],
    │ │ │ │ │ +       [0, 0, 0]], dtype=int8)
    │ │ │ │ │  You can also use this to specify that you want examples which are missing some
    │ │ │ │ │  part of the data structure, for instance
    │ │ │ │ │  # Generates a Variable with no attributes
    │ │ │ │ │  In [13]: xrst.variables(attrs=st.just({})).example()
    │ │ │ │ │  Out[13]:
    │ │ │ │ │ - Size: 160B
    │ │ │ │ │ -array([[-0.00e+00      -infj, -0.00e+00+2.568e+16j,       nan-0.000e+00j,
    │ │ │ │ │ -nan-0.000e+00j],
    │ │ │ │ │ -       [-0.00e+00-1.100e+00j,       nan-0.000e+00j,       nan-0.000e+00j,
    │ │ │ │ │ -0.00e+00+1.175e-38j],
    │ │ │ │ │ -       [      nan-0.000e+00j,       nan-0.000e+00j,       nan-0.000e+00j,
    │ │ │ │ │ -nan-0.000e+00j],
    │ │ │ │ │ -       [      nan-0.000e+00j,       nan-0.000e+00j,       nan-0.000e+00j,
    │ │ │ │ │ -nan-0.000e+00j],
    │ │ │ │ │ -       [      nan-0.000e+00j,       nan-0.000e+00j,      -inf-1.546e+16j,
    │ │ │ │ │ -2.22e-16+0.000e+00j]],
    │ │ │ │ │ -      dtype=complex64)
    │ │ │ │ │ + Size: 8B
    │ │ │ │ │ +array([22760], dtype=uint64)
    │ │ │ │ │  Through a combination of chaining strategies and fixing arguments, you can
    │ │ │ │ │  specify quite complicated requirements on the objects your chained strategy
    │ │ │ │ │  will generate.
    │ │ │ │ │  In [14]: fixed_x_variable_y_maybe_z = st.fixed_dictionaries(
    │ │ │ │ │     ....:     {"x": st.just(2), "y": st.integers(3, 4)}, optional={"z": st.just
    │ │ │ │ │  (2)}
    │ │ │ │ │     ....: )
    │ │ │ │ │     ....:
    │ │ │ │ │  
    │ │ │ │ │  In [15]: fixed_x_variable_y_maybe_z.example()
    │ │ │ │ │ -Out[15]: {'x': 2, 'y': 4}
    │ │ │ │ │ +Out[15]: {'x': 2, 'y': 3, 'z': 2}
    │ │ │ │ │  
    │ │ │ │ │  In [16]: special_variables = xrst.variables(dims=fixed_x_variable_y_maybe_z)
    │ │ │ │ │  
    │ │ │ │ │  In [17]: special_variables.example()
    │ │ │ │ │  Out[17]:
    │ │ │ │ │ - Size: 64B
    │ │ │ │ │ -array([[[    53378,     53378],
    │ │ │ │ │ -        [    35168,     53378],
    │ │ │ │ │ -        [    53378,     53378],
    │ │ │ │ │ -        [    53378,     53378]],
    │ │ │ │ │ -
    │ │ │ │ │ -       [[    53378,     53378],
    │ │ │ │ │ -        [    53378,       120],
    │ │ │ │ │ -        [194599019,     53378],
    │ │ │ │ │ -        [    53378,     53378]]], dtype=uint32)
    │ │ │ │ │ + Size: 64B
    │ │ │ │ │ +array([[       nan      +infj, -0.000e+00-0.000e+00j, -6.795e+16+2.220e-16j,
    │ │ │ │ │ +               nan      +nanj],
    │ │ │ │ │ +       [ 0.000e+00+0.000e+00j, -7.342e+33      +infj,  8.522e+15+5.000e-01j,
    │ │ │ │ │ +               nan-1.192e-07j]], dtype=complex64)
    │ │ │ │ │ +Attributes:
    │ │ │ │ │ +    ŎŻţWÔ:    {'ôžţ': array(['1969-12-20T23:16',              'NaT'],
    │ │ │ │ │ +dtype='...
    │ │ │ │ │  
    │ │ │ │ │  In [18]: special_variables.example()
    │ │ │ │ │  Out[18]:
    │ │ │ │ │ - Size: 192B
    │ │ │ │ │ -array([[[ 6.816e-065-1.798e+308j,  4.935e+016+2.225e-311j],
    │ │ │ │ │ -        [ 1.900e+000-1.000e+000j,  2.220e-016-2.000e+000j],
    │ │ │ │ │ -        [-6.104e-005-2.225e-309j, -1.900e+000+5.960e-008j]],
    │ │ │ │ │ -
    │ │ │ │ │ -       [[-2.225e-311-1.113e-308j, -3.403e+038-1.192e-007j],
    │ │ │ │ │ -        [ 0.000e+000-5.000e-001j, -9.827e+015       +nanj],
    │ │ │ │ │ -        [-1.798e+308       -infj,        -inf-1.100e+000j]]])
    │ │ │ │ │ + Size: 64B
    │ │ │ │ │ +array([[[     14275,      64836],
    │ │ │ │ │ +        [2196677581,         69],
    │ │ │ │ │ +        [       113,        235],
    │ │ │ │ │ +        [     14275,      14275]],
    │ │ │ │ │ +
    │ │ │ │ │ +       [[       241,         97],
    │ │ │ │ │ +        [     14275,      47015],
    │ │ │ │ │ +        [     62409,        151],
    │ │ │ │ │ +        [     14275,        106]]], dtype=uint32)
    │ │ │ │ │  Attributes:
    │ │ │ │ │ -    žÒŻ:      {}
    │ │ │ │ │ -    žëCkſ:    {'GŭNŀD': None, '½Ů': '', 'ŇYAľŁ': True, '0ĺOķĘ': '', '':
    │ │ │ │ │ -True,...
    │ │ │ │ │ -    Ũ:        {}
    │ │ │ │ │ +    :         {'': 'ĬžċĚŽ', 'ųIg4F': False, 'żſſżñ': 'ŶïôĸŻ', 'ē': None,
    │ │ │ │ │ +'ÜG'...
    │ │ │ │ │ +    E:        {'ůãä¹ň': True, 'ſž': False}
    │ │ │ │ │  Here we have used one of hypothesis’ built-in strategies
    │ │ │ │ │  hypothesis.strategies.fixed_dictionaries() to create a strategy which generates
    │ │ │ │ │  mappings of dimension names to lengths (i.e. the size of the xarray object we
    │ │ │ │ │  want). This particular strategy will always generate an x dimension of length
    │ │ │ │ │  2, and a y dimension of length either 3 or 4, and will sometimes also generate
    │ │ │ │ │  a z dimension of length 2. By feeding this strategy for dictionaries into the
    │ │ │ │ │  dims argument of xarray’s variables() strategy, we can generate arbitrary
    │ │ │ │ │ @@ -288,26 +311,26 @@
    │ │ │ │ │  A common task when testing xarray user code is checking that your function
    │ │ │ │ │  works for all valid input dimensions. We can chain strategies to achieve this,
    │ │ │ │ │  for which the helper strategy unique_subset_of() is useful.
    │ │ │ │ │  It works for lists of dimension names
    │ │ │ │ │  In [33]: dims = ["x", "y", "z"]
    │ │ │ │ │  
    │ │ │ │ │  In [34]: xrst.unique_subset_of(dims).example()
    │ │ │ │ │ -Out[34]: ['x', 'z', 'y']
    │ │ │ │ │ +Out[34]: []
    │ │ │ │ │  
    │ │ │ │ │  In [35]: xrst.unique_subset_of(dims).example()
    │ │ │ │ │ -Out[35]: ['z', 'y', 'x']
    │ │ │ │ │ +Out[35]: ['y', 'x']
    │ │ │ │ │  as well as for mappings of dimension names to sizes
    │ │ │ │ │  In [36]: dim_sizes = {"x": 2, "y": 3, "z": 4}
    │ │ │ │ │  
    │ │ │ │ │  In [37]: xrst.unique_subset_of(dim_sizes).example()
    │ │ │ │ │ -Out[37]: {'x': 2, 'z': 4, 'y': 3}
    │ │ │ │ │ +Out[37]: {'z': 4, 'y': 3}
    │ │ │ │ │  
    │ │ │ │ │  In [38]: xrst.unique_subset_of(dim_sizes).example()
    │ │ │ │ │ -Out[38]: {'y': 3}
    │ │ │ │ │ +Out[38]: {}
    │ │ │ │ │  This is useful because operations like reductions can be performed over any
    │ │ │ │ │  subset of the xarray object’s dimensions. For example we can write a pytest
    │ │ │ │ │  test that tests that a reduction gives the expected result when applying that
    │ │ │ │ │  reduction along any possible valid subset of the Variable’s dimensions.
    │ │ │ │ │  import numpy.testing as npt
    │ │ │ ├── ./usr/share/doc/python-xarray-doc/html/whats-new.html
    │ │ │ │ @@ -7936,15 +7936,15 @@
    │ │ │ │  
  • New xray.Dataset.where method for masking xray objects according │ │ │ │ to some criteria. This works particularly well with multi-dimensional data:

    │ │ │ │
    In [44]: ds = xray.Dataset(coords={"x": range(100), "y": range(100)})
    │ │ │ │  
    │ │ │ │  In [45]: ds["distance"] = np.sqrt(ds.x**2 + ds.y**2)
    │ │ │ │  
    │ │ │ │  In [46]: ds.distance.where(ds.distance < 100).plot()
    │ │ │ │ -Out[46]: <matplotlib.collections.QuadMesh at 0xffff349f82d0>
    │ │ │ │ +Out[46]: <matplotlib.collections.QuadMesh at 0xffff5db70050>
    │ │ │ │  
    │ │ │ │
    │ │ │ │ _build/html/_static/where_example.png │ │ │ │ │ │ │ │
  • │ │ │ │
  • Added new methods xray.DataArray.diff and xray.Dataset.diff │ │ │ │ for finite difference calculations along a given axis.

  • │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5100,15 +5100,15 @@ │ │ │ │ │ * New xray.Dataset.where method for masking xray objects according to some │ │ │ │ │ criteria. This works particularly well with multi-dimensional data: │ │ │ │ │ In [44]: ds = xray.Dataset(coords={"x": range(100), "y": range(100)}) │ │ │ │ │ │ │ │ │ │ In [45]: ds["distance"] = np.sqrt(ds.x**2 + ds.y**2) │ │ │ │ │ │ │ │ │ │ In [46]: ds.distance.where(ds.distance < 100).plot() │ │ │ │ │ - Out[46]: │ │ │ │ │ + Out[46]: │ │ │ │ │ _[___b_u_i_l_d_/_h_t_m_l_/___s_t_a_t_i_c_/_w_h_e_r_e___e_x_a_m_p_l_e_._p_n_g_] │ │ │ │ │ * Added new methods xray.DataArray.diff and xray.Dataset.diff for finite │ │ │ │ │ difference calculations along a given axis. │ │ │ │ │ * New xray.DataArray.to_masked_array convenience method for returning a │ │ │ │ │ numpy.ma.MaskedArray. │ │ │ │ │ In [47]: da = xray.DataArray(np.random.random_sample(size=(5, 4)))