diff --git a/.binder/apt.txt b/.binder/apt.txt deleted file mode 100644 index 4d956093..00000000 --- a/.binder/apt.txt +++ /dev/null @@ -1 +0,0 @@ -graphviz diff --git a/.binder/environment.yml b/.binder/environment.yml index 0f565b35..0e722a9a 100644 --- a/.binder/environment.yml +++ b/.binder/environment.yml @@ -1,32 +1,43 @@ -name: xarray +name: default channels: - conda-forge + - nodefaults dependencies: - - python=3.8 - - bokeh>=2.0.0 - - cartopy - - cf_xarray - - dask=2.20.0 - - dask-labextension>=2.0.0 - - distributed=2.20.0 - - fsspec - - gcsfs - - geoviews - - gsw - - hvplot - - ipywidgets>=7.5 - - jupyter-server-proxy - - jupyterlab>=2.0.0 - - matplotlib!=3.3.1 - - notebook - - nodejs - - netcdf4 - - numpy>=1.18.1 - - pandas<1.1 - - pydap - - python-graphviz - - scipy>=1.3.0 - - zarr - - pip - - pip: - - expectexception + - jupyter-book >=1.0.4.post1,<2 + - pre-commit >=4.2.0,<5 + - dask-labextension >=7.0.0,<8 + - jupyterlab >=4.4.4,<5 + - jupyter_bokeh >=4.0.5,<5 + - jupyterlab-myst >=2.4.2,<3 + - jupyter-resource-usage >=1.1.1,<2 + - cartopy >=0.24.0,<0.25 + - cf_xarray >=0.10.6,<0.11 + - dask >=2025.5.1,<2026 + - datashader >=0.18.1,<0.19 + - distributed >=2025.5.1,<2026 + - gcsfs >=2025.5.1,<2026 + - geoviews-core >=1.14.0,<2 + - gsw >=3.6.19,<4 + - hvplot >=0.11.3,<0.12 + - h5netcdf >=1.6.3,<2 + - ipykernel >=6.29.5,<7 + - matplotlib-base >=3.10.3,<4 + - netcdf4 >=1.7.2,<2 + - numpy >=2.2.6,<3 + - pint-xarray >=0.5.0,<0.6 + - pydap >=3.5.5,<4 + - python-graphviz >=0.21,<0.22 + - pooch >=1.8.2,<2 + - rioxarray >=0.19.0,<0.20 + - scipy >=1.16.0,<2 + - sphinx-codeautolink >=0.17.4,<0.18 + - sphinxcontrib-mermaid >=1.0.0,<2 + - sphinx-notfound-page >=1.1.0,<2 + - sphinxext-rediraffe >=0.2.7,<0.3 + - s3fs >=2025.5.1,<2026 + - xarray >=2025.7.0,<2026 + - zarr >=3.0.10,<4 + - flox >=0.10.4,<0.11 + - numbagg >=0.9.0,<0.10 + - rich >=14.0.0,<15 + - python >=3.10 diff --git a/.binder/jupyterlab-workspace.json b/.binder/jupyterlab-workspace.json deleted file mode 100644 index d499b299..00000000 --- a/.binder/jupyterlab-workspace.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "data": { - "file-browser-filebrowser:cwd": { - "path": "scipy-tutorial" - }, - "dask-dashboard-launcher:individual-progress": { - "data": { - "route": "individual-progress", - "label": "Progress" - } - }, - "dask-dashboard-launcher:individual-task-stream": { - "data": { - "route": "individual-task-stream", - "label": "Task Stream" - } - }, - "layout-restorer:data": { - "main": { - "dock": { - "type": "split-area", - "orientation": "horizontal", - "sizes": [ - 0.736625105372905, - 0.263374894627095 - ], - "children": [ - { - "type": "tab-area", - "currentIndex": 0, - "widgets": [ - "notebook:scipy-tutorial/00_overview.ipynb" - ] - }, - { - "type": "split-area", - "orientation": "vertical", - "sizes": [ - 0.5, - 0.5 - ], - "children": [ - { - "type": "tab-area", - "currentIndex": 0, - "widgets": [ - "dask-dashboard-launcher:individual-progress" - ] - }, - { - "type": "tab-area", - "currentIndex": 1, - "widgets": [ - "dask-dashboard-launcher:individual-task-stream" - ] - } - ] - } - ] - }, - "mode": "multiple-document", - "current": "notebook:scipy-tutorial/00_overview.ipynb" - }, - "left": { - "collapsed": false, - "current": "filebrowser", - "widgets": [ - "filebrowser", - "running-sessions", - "dask-dashboard-launcher", - "command-palette", - "jp-property-inspector", - "tab-manager", - "extensionmanager.main-view" - ] - }, - "right": { - "collapsed": true, - "widgets": [] - } - }, - "notebook:00_overview.ipynb": { - "data": { - "path": "scipy-tutorial/00_overview.ipynb", - "factory": "Notebook" - } - }, - "notebook:scipy-tutorial/00_overview.ipynb": { - "data": { - "path": "scipy-tutorial/00_overview.ipynb", - "factory": "Notebook" - } - }, - "dask-dashboard-launcher": { - "url": "DASK_DASHBOARD_URL", - "cluster": "" - }, - "@jupyterlab/settingeditor-extension:plugin": { - "sizes": [ - 0.18606224627875506, - 0.8139377537212449 - ], - "container": { - "plugin": "@jupyterlab/terminal-extension:plugin", - "sizes": [ - 0.5, - 0.5 - ] - } - } - }, - "metadata": { - "id": "/lab" - } -} diff --git a/.binder/postBuild b/.binder/postBuild deleted file mode 100755 index f59c00ff..00000000 --- a/.binder/postBuild +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -# Install the JupyterLab dask-labextension -jupyter labextension install dask-labextension -jupyter labextension install @jupyter-widgets/jupyterlab-manager -jupyter labextension install @bokeh/jupyter_bokeh -jupyter labextension install @pyviz/jupyterlab_pyviz - -export DASK_TICK_MAXIMUM_DELAY=5s -export DASK_DISTRIBUTED__DIAGNOSTICS_LINK={JUPYTERHUB_SERVICE_PREFIX}proxy/{port}/status - -#EOF diff --git a/.binder/start b/.binder/start deleted file mode 100644 index 7b1fff22..00000000 --- a/.binder/start +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -# Replace DASK_DASHBOARD_URL with the proxy location -sed -i -e "s|DASK_DASHBOARD_URL|/user/${JUPYTERHUB_USER}/proxy/8787|g" .binder/jupyterlab-workspace.json - -# Import the workspace -jupyter lab workspaces import .binder/jupyterlab-workspace.json - -exec "$@" diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 00000000..78ab0ed4 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,13 @@ +FROM mcr.microsoft.com/devcontainers/base:noble + +ARG PIXI_VERSION=v0.49.0 + +RUN curl -L -o /usr/local/bin/pixi -fsSL --compressed "https://github.com/prefix-dev/pixi/releases/download/${PIXI_VERSION}/pixi-$(uname -m)-unknown-linux-musl" \ + && chmod +x /usr/local/bin/pixi \ + && pixi info + +# set some user and workdir settings to work nicely with vscode +USER vscode +WORKDIR /home/vscode + +RUN echo 'eval "$(pixi completion -s bash)"' >> /home/vscode/.bashrc diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..d90ee6bd --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,42 @@ +// https://pixi.sh/latest/integration/editor/vscode/#devcontainer-extension +{ + "name": "xarray-tutorial", + "build": { + "dockerfile": "Dockerfile", + "context": ".." + }, + "customizations": { + "vscode": { + "settings": {}, + "extensions": [ + "ms-toolsai.jupyter", + "ms-python.python", + "executablebookproject.myst-highlight" + ] + } + }, + "features": { + // ensure GitHub Codespace 'Open with JupyterLab' works + // TODO: figure out why it doesn't work w/ jupyterlab in the pixi environment + "ghcr.io/devcontainers/features/python:1": { + "version": "3.12", + "installTools": false, + // NOTE: not working, so install with pip in postCreateCommand + // "toolsToInstall":"jupyterlab_myst,pixi-kernel", + "installJupyterlab": true + } + }, + "mounts": [ + "source=${localWorkspaceFolderBasename}-pixi,target=${containerWorkspaceFolder}/.pixi,type=volume" + ], + // These should execute in order below + "onCreateCommand": { + "configure_jupyterlab": "pip install jupyterlab_myst pixi-kernel" + }, + "postCreateCommand": { + "set_pixi_permissions": "sudo chown vscode .pixi" + }, + "postStartCommand": { + "configure_jupyterlab": "pixi install" + } +} diff --git a/.devcontainer/scipy2023/devcontainer.json b/.devcontainer/scipy2023/devcontainer.json new file mode 100644 index 00000000..22f85b77 --- /dev/null +++ b/.devcontainer/scipy2023/devcontainer.json @@ -0,0 +1,18 @@ +{ + "image": "quay.io/pangeo/pangeo-notebook:2023.07.05", + "postCreateCommand": { + "jupyterlab": "mkdir /home/jovyan/.jupyter && cp ${containerWorkspaceFolder}/.devcontainer/scipy2023/jupyter_lab_config.py /home/jovyan/.jupyter/jupyter_lab_config.py", + "vscode": "mkdir ${containerWorkspaceFolder}/.vscode && cp ${containerWorkspaceFolder}/.devcontainer/scipy2023/tasks.json ${containerWorkspaceFolder}/.vscode/tasks.json" + }, + "hostRequirements": { + "cpus": 2 + }, + "customizations": { + "codespaces": { + "openFiles": ["workshops/scipy2023/README.md"] + }, + "vscode": { + "extensions": ["ms-toolsai.jupyter", "ms-python.python"] + } + } +} diff --git a/.devcontainer/scipy2023/jupyter_lab_config.py b/.devcontainer/scipy2023/jupyter_lab_config.py new file mode 100644 index 00000000..c8857f0d --- /dev/null +++ b/.devcontainer/scipy2023/jupyter_lab_config.py @@ -0,0 +1,3 @@ +c = get_config() # noqa +c.LabApp.default_url = "/lab/tree/workshops/scipy2023/index.ipynb" +c.ServerApp.allow_origin = "*" diff --git a/.devcontainer/scipy2023/tasks.json b/.devcontainer/scipy2023/tasks.json new file mode 100644 index 00000000..5660e45b --- /dev/null +++ b/.devcontainer/scipy2023/tasks.json @@ -0,0 +1,16 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "jupyterlab", + "type": "shell", + "command": "/srv/conda/envs/notebook/bin/jupyter lab --no-browser", + "presentation": { + "reveal": "always" + }, + "runOptions": { + "runOn": "folderOpen" + } + } + ] +} diff --git a/.devcontainer/scipy2024/devcontainer.json b/.devcontainer/scipy2024/devcontainer.json new file mode 100644 index 00000000..83912331 --- /dev/null +++ b/.devcontainer/scipy2024/devcontainer.json @@ -0,0 +1,18 @@ +{ + "image": "quay.io/pangeo/pangeo-notebook:2024.07.08", + "postCreateCommand": { + "jupyterlab": "mkdir /home/jovyan/.jupyter && cp ${containerWorkspaceFolder}/.devcontainer/scipy2024/jupyter_lab_config.py /home/jovyan/.jupyter/jupyter_lab_config.py", + "vscode": "mkdir ${containerWorkspaceFolder}/.vscode && cp ${containerWorkspaceFolder}/.devcontainer/scipy2024/tasks.json ${containerWorkspaceFolder}/.vscode/tasks.json" + }, + "hostRequirements": { + "cpus": 2 + }, + "customizations": { + "codespaces": { + "openFiles": ["workshops/scipy2024/index.ipynb"] + }, + "vscode": { + "extensions": ["ms-toolsai.jupyter", "ms-python.python"] + } + } +} diff --git a/.devcontainer/scipy2024/jupyter_lab_config.py b/.devcontainer/scipy2024/jupyter_lab_config.py new file mode 100644 index 00000000..441e67d3 --- /dev/null +++ b/.devcontainer/scipy2024/jupyter_lab_config.py @@ -0,0 +1,3 @@ +c = get_config() # noqa +c.LabApp.default_url = "/lab/tree/workshops/scipy2024/index.ipynb" +c.ServerApp.allow_origin = "*" diff --git a/.devcontainer/scipy2024/tasks.json b/.devcontainer/scipy2024/tasks.json new file mode 100644 index 00000000..5660e45b --- /dev/null +++ b/.devcontainer/scipy2024/tasks.json @@ -0,0 +1,16 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "jupyterlab", + "type": "shell", + "command": "/srv/conda/envs/notebook/bin/jupyter lab --no-browser", + "presentation": { + "reveal": "always" + }, + "runOptions": { + "runOn": "folderOpen" + } + } + ] +} diff --git a/.devcontainer/scipy2025/Dockerfile b/.devcontainer/scipy2025/Dockerfile new file mode 100644 index 00000000..78ab0ed4 --- /dev/null +++ b/.devcontainer/scipy2025/Dockerfile @@ -0,0 +1,13 @@ +FROM mcr.microsoft.com/devcontainers/base:noble + +ARG PIXI_VERSION=v0.49.0 + +RUN curl -L -o /usr/local/bin/pixi -fsSL --compressed "https://github.com/prefix-dev/pixi/releases/download/${PIXI_VERSION}/pixi-$(uname -m)-unknown-linux-musl" \ + && chmod +x /usr/local/bin/pixi \ + && pixi info + +# set some user and workdir settings to work nicely with vscode +USER vscode +WORKDIR /home/vscode + +RUN echo 'eval "$(pixi completion -s bash)"' >> /home/vscode/.bashrc diff --git a/.devcontainer/scipy2025/devcontainer.json b/.devcontainer/scipy2025/devcontainer.json new file mode 100644 index 00000000..39fc8725 --- /dev/null +++ b/.devcontainer/scipy2025/devcontainer.json @@ -0,0 +1,42 @@ +// https://pixi.sh/latest/integration/editor/vscode/#devcontainer-extension +{ + "name": "scipy2025-xarray-tutorial", + "build": { + "dockerfile": "Dockerfile", + "context": "../../" + }, + "customizations": { + "vscode": { + "settings": {}, + "extensions": [ + "ms-toolsai.jupyter", + "ms-python.python", + "executablebookproject.myst-highlight" + ] + } + }, + "features": { + // ensure GitHub Codespace 'Open with JupyterLab' works + // TODO: figure out why it doesn't work w/ jupyterlab in the pixi environment + "ghcr.io/devcontainers/features/python:1": { + "version": "3.12", + "installTools": false, + // NOTE: not working, so install with pip in postCreateCommand + // "toolsToInstall":"jupyterlab_myst,pixi-kernel", + "installJupyterlab": true + } + }, + "mounts": [ + "source=${localWorkspaceFolderBasename}-pixi,target=${containerWorkspaceFolder}/.pixi,type=volume" + ], + // These should execute in order below + "onCreateCommand": { + "configure_jupyterlab": "pip install jupyterlab_myst pixi-kernel" + }, + "postCreateCommand": { + "set_pixi_permissions": "sudo chown vscode .pixi" + }, + "postStartCommand": { + "configure_jupyterlab": "pixi install" + } +} diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..997504b4 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# SCM syntax highlighting & preventing 3-way merges +pixi.lock merge=binary linguist-language=YAML linguist-generated=true -diff diff --git a/.github/actions/setup-pixi/action.yml b/.github/actions/setup-pixi/action.yml new file mode 100644 index 00000000..2d7902df --- /dev/null +++ b/.github/actions/setup-pixi/action.yml @@ -0,0 +1,11 @@ +name: 'Setup Pixi' +description: 'Create Python environment for GitHub Action Job' + +runs: + using: 'composite' + steps: + - uses: prefix-dev/setup-pixi@v0.8.10 + with: + manifest-path: pyproject.toml + cache: true + activate-environment: true diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..482483ab --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +# Regularly update Docker tags and Actions steps +version: 2 +updates: + - package-ecosystem: 'github-actions' + directory: '/.github' + schedule: + interval: 'monthly' diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 4eaace1f..915b0cbe 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -1,56 +1,73 @@ -name: CI +name: Deploy Website to GitHub Pages on: push: - branches: "*" - pull_request: - branches: master + branches: main + paths-ignore: + - '.devcontainer/**' + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: write + pages: write + id-token: write + +# Allow one concurrent deployment +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true jobs: - pre-commit: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - uses: actions/setup-python@v1 - - uses: pre-commit/action@v2.0.0 - test: - name: Tutorial Testing + build: runs-on: ubuntu-latest + steps: - - uses: actions/checkout@v2 - - name: Install graphviz - run: | - sudo apt-get update - sudo apt-get install graphviz - - name: Set up Python 3.8 - uses: goanpeca/setup-miniconda@v1 + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup JupyterBook Cache + uses: actions/cache@v4 with: - activate-environment: xarray - environment-file: .binder/environment.yml - python-version: 3.8 - auto-activate-base: false - - name: Update conda environment - shell: bash -l {0} + path: _build + # NOTE: change key to "jupyterbook-DATE" to force rebuilding cache + key: jupyterbook-20250701 + + - uses: ./.github/actions/setup-pixi + + - name: Build JupyterBook run: | - conda env update --file ./ci/environment.yml - - name: Build and test notebooks - shell: bash -l {0} + jupyter-book build ./ --warningiserror --keep-going + + - name: Dump Build Logs + if: always() run: | - conda info - conda list - python .tests/nbrun.py - build: + if (test -a _build/html/reports/*log); then cat _build/html/reports/*log ; fi + + - name: Save Build Folder + if: always() + uses: actions/upload-artifact@v4 + with: + name: build + path: _build/ + + - name: Upload Pages Artifact + uses: actions/upload-pages-artifact@v3 + with: + path: _build/html + + # Publish Website to GitHub Pages if built successfully + deploy: + needs: build + if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Set up Python 3.8 - uses: actions/setup-python@v1 - with: - python-version: 3.8 - - name: Install repo2docker - run: | - python -m pip install --upgrade pip - python -m pip install jupyter-repo2docker - - name: Build xarray-tutorial Docker image - run: jupyter-repo2docker --no-run --debug . + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/nocache.yaml b/.github/workflows/nocache.yaml new file mode 100644 index 00000000..1fbc7ed4 --- /dev/null +++ b/.github/workflows/nocache.yaml @@ -0,0 +1,41 @@ +name: Rebuild Entire Jupyter Book on all Platforms + +on: + workflow_dispatch: + +# Allow one concurrent deployment +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + name: Build on ${{ matrix.runs-on }} + runs-on: ${{ matrix.runs-on }} + strategy: + fail-fast: false + matrix: + runs-on: [ubuntu-latest, macos-latest, windows-latest] + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - uses: ./.github/actions/setup-pixi + + # https://github.com/xarray-contrib/xarray-tutorial/issues/311 + - name: Configure graphviz + if: matrix.runs-on == 'macos-latest' + run: | + dot -c + + - name: Build JupyterBook + id: jb-build + continue-on-error: true + run: | + jupyter-book build ./ --warningiserror --keep-going + + - name: Dump Build Logs + if: steps.jb-build.outcome == 'failure' + run: | + cat _build/html/reports/**/*.log diff --git a/.github/workflows/pull_request.yaml b/.github/workflows/pull_request.yaml new file mode 100644 index 00000000..5cf4a6af --- /dev/null +++ b/.github/workflows/pull_request.yaml @@ -0,0 +1,46 @@ +name: Pull Request Build + +on: + pull_request: + types: [opened, synchronize, reopened, closed] + paths-ignore: + - '.devcontainer/**' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + preview: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + if: github.event.action != 'closed' + uses: actions/checkout@v4 + + - name: Setup JupyterBook Cache + if: github.event.action != 'closed' + uses: actions/cache@v4 + with: + path: _build + # NOTE: change key to "jupyterbook-DATE" to force rebuilding cache + key: jupyterbook-20250701 + + - uses: ./.github/actions/setup-pixi + + - name: Build JupyterBook + if: github.event.action != 'closed' + run: | + jupyter-book build ./ --warningiserror --keep-going + + - name: Dump Build Logs + if: github.event.action != 'closed' + run: | + if (test -a _build/html/reports/*log); then cat _build/html/reports/*log ; fi + + - name: Upload artifact + if: github.event.action != 'closed' + uses: actions/upload-artifact@v4 + with: + name: html + path: _build/html diff --git a/.github/workflows/qaqc.yaml b/.github/workflows/qaqc.yaml new file mode 100644 index 00000000..d29db2de --- /dev/null +++ b/.github/workflows/qaqc.yaml @@ -0,0 +1,42 @@ +name: QualityContol + +on: + workflow_dispatch: + pull_request: + branches: + - main + paths-ignore: + - '.devcontainer/**' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + quality-control: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: ./.github/actions/setup-pixi + + # borrowed from https://github.com/ProjectPythia/pythia-foundations/blob/main/.github/workflows/link-checker.yaml + - name: Disable Notebook Execution Before Linkcheck + if: always() + shell: python + run: | + import yaml + with open('./_config.yml') as f: + data = yaml.safe_load(f) + data['execute']['execute_notebooks'] = 'off' + with open('./_config.yml', 'w') as f: + yaml.dump(data, f) + + # Checking links is flaky, so continue-on-error: true + - name: Check External Links + timeout-minutes: 5 + continue-on-error: true + if: always() + run: | + jupyter-book build ./ --builder linkcheck diff --git a/.github/workflows/surge_preview.yml b/.github/workflows/surge_preview.yml new file mode 100644 index 00000000..e9725198 --- /dev/null +++ b/.github/workflows/surge_preview.yml @@ -0,0 +1,42 @@ +name: Pull Request Preview + +on: + workflow_run: + workflows: ['Pull Request Build'] + types: + - completed + +permissions: + pull-requests: write # allow surge-preview to create/update PR comments + +concurrency: + group: ${{ github.workflow }}-${{ github.event.workflow_run.id }} + cancel-in-progress: true + +jobs: + # NOTE: match job name in pull_request.yaml + preview: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }} + + steps: + # Ensure folder exists for PR 'closed' case + - run: mkdir html + + # Download built HTML from PR Build workflow + - uses: actions/download-artifact@v4 + continue-on-error: true + with: + github-token: ${{ github.token }} + run-id: ${{ github.event.workflow_run.id }} + + - name: Manage Surge.sh Deployment + id: preview_step + uses: afc163/surge-preview@v1 + with: + surge_token: ${{ secrets.SURGE_TOKEN }} + github_token: ${{ secrets.GITHUB_TOKEN }} + build: echo 'Uploading html/ folder contents to Surge.sh...' + dist: html # NOTE: match upload_artifact name in pull_request.yaml + failOnError: true + teardown: true diff --git a/.gitignore b/.gitignore index f06d7f12..5d068dd6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,16 @@ # project/repo specific +conf.py +advanced/backends/*.bin +scipy-tutorial/dask-report-large-chunk.html +mydask.png dask-report.html _build/ -*.nc *.zarr +*.nc +*.tiff +*.tif dask-worker-space/ +.jupyter_cache # Byte-compiled / optimized / DLL files __pycache__/ @@ -109,3 +116,13 @@ venv.bak/ # mypy .mypy_cache/ + +# misc +.DS_Store +.vscode/ + +# pixi environments +.pixi +*.egg-info + +notes/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4bd534be..7f5e07b3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,42 +1,58 @@ +ci: + autoupdate_schedule: monthly + repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v6.0.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-docstring-first + - id: check-json + exclude: ^.devcontainer/ + - id: check-yaml -- repo: https://github.com/pre-commit/pre-commit-hooks - rev: v2.5.0 + - repo: https://github.com/codespell-project/codespell + rev: v2.4.2 hooks: - - id: trailing-whitespace - - id: end-of-file-fixer - - id: check-docstring-first - - id: check-json - - id: check-yaml - - id: pretty-format-json - args: ["--autofix", "--indent=2", "--no-sort-keys"] + - id: codespell -- repo: https://github.com/ambv/black - rev: 19.10b0 + - repo: https://github.com/psf/black-pre-commit-mirror + rev: 26.5.1 hooks: - - id: black - args: ["--line-length", "100"] + - id: black + - id: black-jupyter -- repo: https://gitlab.com/pycqa/flake8 - rev: 3.8.0a2 + - repo: https://github.com/keewis/blackdoc + rev: v0.4.6 hooks: - - id: flake8 + - id: blackdoc + additional_dependencies: ['black==26.5.1'] + - id: blackdoc-autoupdate-black -- repo: https://github.com/asottile/seed-isort-config - rev: v2.1.1 + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.15.20 hooks: - - id: seed-isort-config -- repo: https://github.com/pre-commit/mirrors-isort - rev: v4.3.21 + - id: ruff-check + args: ['--fix', '--show-fixes'] + + - repo: https://github.com/rbubley/mirrors-prettier + rev: v3.9.4 hooks: - - id: isort + - id: prettier + args: ['--cache-location=.prettier_cache/cache'] + exclude: 'pixi.lock' -- repo: https://github.com/deathbeds/prenotebook - rev: master + - repo: https://github.com/ComPWA/taplo-pre-commit + rev: v0.9.3 hooks: - - id: prenotebook + - id: taplo-format + args: ['--option', 'array_auto_collapse=false'] + - id: taplo-lint + args: ['--no-schema'] -- repo: https://github.com/myint/rstcheck - rev: master + - repo: https://github.com/kynan/nbstripout + rev: 0.9.1 hooks: - - id: rstcheck + - id: nbstripout + args: [--extra-keys=metadata.kernelspec metadata.language_info.version] diff --git a/.prettierrc.toml b/.prettierrc.toml new file mode 100644 index 00000000..addd6d36 --- /dev/null +++ b/.prettierrc.toml @@ -0,0 +1,3 @@ +tabWidth = 2 +semi = false +singleQuote = true diff --git a/.tests/nbrun.py b/.tests/nbrun.py deleted file mode 100644 index 70411a3a..00000000 --- a/.tests/nbrun.py +++ /dev/null @@ -1,33 +0,0 @@ -import glob -import sys -from pathlib import Path - -import nbformat -from nbconvert.preprocessors import ExecutePreprocessor - - -def run_notebook(in_filepath): - if not in_filepath.is_file(): - raise IOError('File "%s" not found.' % in_filepath) - in_filepath = in_filepath.resolve() - - run_path = str(in_filepath.parent) - - nb = nbformat.read(in_filepath.open(), as_version=4) - ep = ExecutePreprocessor(timeout=300, kernel_name="python%d" % sys.version_info[0]) - - try: - ep.preprocess(nb, {"metadata": {"path": run_path}}) - except Exception: - msg = 'Error executing the notebook "%s".\n\n' % in_filepath - print(msg) - raise - - -print("Running Notebooks...") - -for filename in glob.glob("**/*.ipynb", recursive=True): - print(filename) - run_notebook(Path(filename)) - -print("Execution Complete!!!") diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 75c2df02..00000000 --- a/.travis.yml +++ /dev/null @@ -1,37 +0,0 @@ -language: python - -python: - - "3.6" -env: - global: - # Doctr deploy key for xarray-contrib/xarray-tutorial - - secure: "LhMSPwCWybgGWTKQwMlTNjuMgR1xhCR8bgTnOeNh1hJIWGC7RTa2af0SzZ7cytEliVfIa9RufvEM5mAKMc6ti6AEOrix4puwrosn/kSIdAQqrR4QqjUV8ta5uukm417f8S/9W9EjBeu3E/paT88iZ7ZoS25H+Dyng+wemovNHfU1yiCLjD6nJml48PFYRHaKhhmRKtMSNCSVXeeANALfv3OWkiF4GUHdBVXLoC9VL6pRAn3wAiTiNALfSEdcZCo9E5LstRN8qzeZ+jipyaf3YCktqCG0EGgX8rEFVf+Jt1F0r3MJVrTPKxiLB7PU0HSW9+8MYhf+jV1T480p9EaIbYDma0kX8HjKKth8EWWAul7hawp5uj2SRpvJ055xZFkeHkWT+namRpsTcpGnVWoh4y03fddpkJdjdpYQ6w8OFuOC9xA27x4DwpdFJ38oS1COWQGlrPW/gRfGDbJsLTXyjHIBB0s/pP4Tp1NDdydT6gVs6M3wKxBHGwKvGjLy8L4D3uSkxBK7IYPhYbXl8VmzexWxC88EqfuCJhAKvj3ZDqT7MNzwyITaPn6Ar7L6uItnJEsW0s8WIyLbnwo1c3lOY77sM7ofN+FQFMsz/lrDRR1U6zESC9ol1R+zOBGU4RGpdFAKMT8Mjl41xoMbRWKiHqXSTSb79waFq3r75A6xp8s=" - -before_install: - - sudo apt-get update - - sudo apt-get install graphviz - -install: - # Install conda - - wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh - - bash miniconda.sh -b -p $HOME/miniconda - - export PATH="$HOME/miniconda/bin:$PATH" - - conda config --set always_yes yes --set changeps1 no - - conda update conda - - # Install dependencies - - conda env create -n xarray -f .binder/environment.yml - - source activate xarray - - # Install testing and documentation dependencies - - conda env update --file ./ci/environment.yml - -script: - - set -e - - source activate xarray - - sphinx-build -M html . _build -v - - pip install doctr - - doctr deploy --built-docs _build/html . - -notifications: - email: false diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..f9940fab --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,108 @@ +# Contributing Guide + +This tutorial repository is a great opportunity to start contributing to Xarray. + +- Report bugs, request features or submit feedback as a [GitHub Issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/about-issues). First check existing [issues](https://github.com/xarray-contrib/xarray-tutorial/issues) ! + +- Make fixes, add content or improvements using [GitHub Pull Requests](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests), the sections below go over this process in more detail: + +```{seealso} +The Project Pythia Foundations material on [Github](https://foundations.projectpythia.org/foundations/getting-started-github.html) and Github workflows is a great place to start if you are new to this. +``` + +## Content Guidelines + +Please note that examples submitted to this repository should follow these +guidelines: + +1. Run top-to-bottom without intervention from the user +1. Not require external data sources that may disappear over time (external data sources that are highly unlikely to disappear are fine). Small datasets for tutorial purposes can be added [here](https://github.com/pydata/xarray-data/) if necessary. +1. Not be resource intensive, and should run within 2GB of memory +1. Be clear and contain enough prose to explain the topic at hand +1. Be concise and limited to one or two topics, such that a reader can get through the example within a few minutes of reading +1. Be of general relevance to Xarray users, and so not too specific on a particular problem or use case. + +## Contribution process + +### Fork this repository + +We recommend first forking this repository and creating a local copy: + +``` +git clone https://github.com/YOURACCOUNT/xarray-tutorial.git +cd xarray-tutorial +``` + +### Create a Python environment + +You'll need `pixi` or `conda` or `mamba`, which can be installed from https://github.com/conda-forge/miniforge + +We also use [pre-commit hooks](https://pre-commit.com) to run styling and other checks before committing code. + +#### Using pixi (recommended) + +``` +pixi install +pixi shell # exit +``` + +#### Using conda + +``` +mamba env create -f .binder/environment.yml -n xarray-tutorial +conda activate xarray-tutorial # conda deactivate +pre-commit install +``` + +### Add content + +Develop your new content on a branch. See [JupyterBook Docs](https://jupyterbook.org/en/stable/intro.html) for guides on adding `.md`, `.ipynb` and other content. + +``` +git checkout -b newcontent +git add . +git commit -m "added pages x,y and improved z" +``` + +### Preview your changes + +Running jupyterbook will execute notebooks and render HTML pages for the website. Be sure to fix any execution errors and preview the website in your web browser to make sure everything looks good! + +``` +jupyter-book build ./ --warningiserror --keep-going +# Or "pixi run build" +``` + +### Open a pull request + +``` +git push +``` + +Follow the link reported in a terminal to open a pull request! + +## Instructions for environment management + +[`pixi`](https://pixi.sh) can be used to create and update a multi-platform lockfile, so a reproducible set of package versions is installed across different operating systems. + +Dependencies (with optional pins) are specified in the `pyproject.toml` file, and specific locked versions for all platforms are kept in `pixi.lock`. + +Install environment from the lockfile + +``` +pixi install +pixi shell # activate environment, "exit" to deactivate +``` + +Upgrade all packages to latest versions: + +``` +pixi upgrade +``` + +## Render conda/mamba environment files + +``` +pixi project export conda-environment -p linux-64 .binder/environment.yml +pixi project export conda-explicit-spec -p linux-64 /tmp +``` diff --git a/LICENSE b/LICENSE index 261eeb9e..20e4bd85 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ Apache License Version 2.0, January 2004 - http://www.apache.org/licenses/ + https://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION @@ -192,7 +192,7 @@ you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 + https://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/README.md b/README.md index ea2478d6..bca652ed 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,72 @@ -Xarray Example Notebooks -======================== +# Xarray Tutorial -This repository includes easy-to-run example notebooks for Xarray. -They are intended to be educational and give users a start on common workflows. +[![Deploy Website to GitHub Pages](https://github.com/xarray-contrib/xarray-tutorial/actions/workflows/main.yaml/badge.svg)](https://github.com/xarray-contrib/xarray-tutorial/actions/workflows/main.yaml) +[![Jupyter Book Badge](https://jupyterbook.org/badge.svg)](https://tutorial.xarray.dev) +[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/xarray-contrib/xarray-tutorial/HEAD?labpath=workshops/scipy2025/index.ipynb) -They should be easy to run locally if you download this repository. -They are also available on the cloud by clicking on the link below: +This is the repository for a Jupyter Book website with tutorial material for [Xarray](https://github.com/pydata/xarray), _an open source project and Python package that makes working with labelled multi-dimensional arrays simple, efficient, and fun!_ -[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/xarray-contrib/xarray-tutorial/master?urlpath=lab) -[![CI](https://github.com/xarray-contrib/xarray-tutorial/workflows/CI/badge.svg?branch=master)](https://github.com/xarray-contrib/xarray-tutorial/actions?query=branch%3Amaster) -[![Build Status](https://travis-ci.org/xarray-contrib/xarray-tutorial.svg?branch=master)](https://travis-ci.org/xarray-contrib/xarray-tutorial) +The website is hosted at https://tutorial.xarray.dev -Contributing ------------- +Tutorials are written as interactive Jupyter Notebooks with executable code examples that you can easily run and modify: -This repository is a great opportunity to start contributing to Xarray. -Please note that examples submitted to this repository should follow these -guidelines: +#### On the Cloud -1. Run top-to-bottom without intervention from the user -2. Not require external data sources that may disappear over time (external data sources that are highly unlikely to disappear are fine) -3. Not be resource intensive, and should run within 2GB of memory -4. Be clear and contain enough prose to explain the topic at hand -5. Be concise and limited to one or two topics, such that a reader can get through the example within a few minutes of reading -6. Be of general relevance to Xarray users, and so not too specific on a particular problem or use case. +All notebooks can be run via the Mybinder.org 'Launch Binder' badge at the top of this page. This will load a pre-configured JupyterLab interface with all tutorial notebooks for you to run. _You have minimal computing resources and any changes you make will not be saved._ -*Note: Some of the content in this repository came from a similar projects: https://github.com/dask/dask-tutorial* +#### Github Codespaces + +This tutorial is available to run within [Github Codespaces](https://github.com/features/codespaces) - "a development environment that's hosted in the cloud" + +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/xarray-contrib/xarray-tutorial/tree/main) + +☝️ Click the button above to go to options window to launch a Github codespace. + +GitHub currently gives every user [120 vCPU hours per month for free](https://docs.github.com/en/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts), beyond that you must pay. **So be sure to explicitly stop or shut down your codespace when you are done by going to this page (https://github.com/codespaces).** + +You can also use the GitHub CLI to launch a codespace + +``` +# This will output a URL to use VSCode in the browser +gh codespace create --repo xarray-contrib/xarray-tutorial +# Optionally launch JupyterLab instead of vscode (after codespace has been created) +gh codespace jupyter +``` + +#### Locally + +You can also run these notebooks on your own computer! We recommend using [`pixi`](https://pixi.sh/latest/#installation) to ensure a fully reproducible Python environment: + +```bash +git clone https://github.com/xarray-contrib/xarray-tutorial.git +cd xarray-tutorial +pixi run tutorial +``` + +### Building the Documentation Locally + +To build and serve the tutorial website locally with live reload: + +```bash +pixi run watch +``` + +This watches for changes, rebuilds, and serves at http://localhost:8000. + +To build without serving: + +```bash +pixi run build +``` + +## Contributing + +Contributions are welcome and greatly appreciated! See our [CONTRIBUTING.md](./CONTRIBUTING.md) document. + +Thanks to our contributors so far! + +[![Contributors](https://contrib.rocks/image?repo=xarray-contrib/xarray-tutorial)](https://github.com/xarray-contrib/xarray-tutorial/graphs/contributors) + +## Acknowledgements + +This website is the result of many contributions from the Xarray community! We're very grateful for everyone's volunteered effort as well as [sponsored development](https://xarray.dev/#sponsors). Funding for SciPy 2022, SciPy 2023 tutorial material development specifically was supported by NASA's Open Source Tools, Frameworks, and Libraries Program (award 80NSSC22K0345). diff --git a/_config.yml b/_config.yml new file mode 100644 index 00000000..6ae842ed --- /dev/null +++ b/_config.yml @@ -0,0 +1,114 @@ +# Learn more at https://jupyterbook.org/customize/config.html +title: '' +author: The Xarray Community +copyright: '2025' +logo: images/logo.png +only_build_toc_files: true +exclude_patterns: [.github, .pixi] + +# See https://jupyterbook.org/customize/config.html#add-a-link-to-your-repository +html: + # NOTE: this announcement shows up on all pages + #announcement: 'The Xarray 2024 User Survey is live. Please take ~5 minutes to fill it out and help us improve Xarray.' + #announcement: 'ℹ️ SciPy 2025 Tutorial Attendees. Click here! .' + home_page_in_navbar: false + use_edit_page_button: true + use_issues_button: true + use_repository_button: true + extra_footer: '

Xarray is a fiscally sponsored project of NumFOCUS, a nonprofit dedicated to supporting the open-source scientific computing community.
Theme by the Executable Book Project.

Content licensed under the terms of the Apache 2.0 License.' + analytics: + google_analytics_id: G-JRQHYVFQR7 + favicon: 'images/favicon.ico' + +parse: + # https://jupyterbook.org/content/content-blocks.html?highlight=myst%20substitution#define-substitutions-for-your-whole-book + # https://jupyterbook.org/content/content-blocks.html#using-substitutions-in-links + myst_substitutions: + xarray_homepage: https://xarray.dev + xarray_docs: https://docs.xarray.dev + xarray_repo: https://github.com/pydata/xarray + xarray_forum: https://github.com/pydata/xarray/discussions + myst_enable_extensions: + # Defaults + - dollarmath + - linkify + - substitution + - colon_fence + # Extras + - html_image + +# Force re-execution of notebooks on each build. +# See https://jupyterbook.org/content/execute.html +execute: + execute_notebooks: 'cache' + allow_errors: false + # Per-cell notebook execution limit (seconds) + timeout: 300 + +# Define the name of the latex output file for PDF builds +latex: + latex_documents: + targetname: book.tex + +# Configure your Binder links, such as the URL of the BinderHub. +launch_buttons: + notebook_interface: jupyterlab + binderhub_url: 'https://mybinder.org' + +# Information about where the book exists on the web +repository: + url: 'https://github.com/xarray-contrib/xarray-tutorial' + branch: main + +# Bibliography +bibtex_bibfiles: + - reference/references.bib + +# Advanced configuration +sphinx: + extra_extensions: + # 404 not found page + - notfound.extension + # maintain old paths and redirect them (so google results dont go to 404) + # https://github.com/wpilibsuite/sphinxext-rediraffe + - sphinxext.rediraffe + - sphinx_codeautolink + - sphinxcontrib.mermaid + + config: + language: en # accessibility + # application/vnd.holoviews_load.v0+json, application/vnd.holoviews_exec.v0+json + suppress_warnings: ['mystnb.unknown_mime_type', 'misc.highlighting_failure'] + codeautolink_concat_default: True + notfound_context: + body: "

Whoops! 404 Page Not Found

\n\n

Sorry, this page doesn't exist. Many sections of this book have been updated recently.

Try the search box 🔎 to find what you're looking for!

" + notfound_urls_prefix: / + rediraffe_redirects: + scipy-tutorial/00_overview.ipynb: overview/get-started.md + workshops/scipy2022/README.md: overview/fundamental-path/README.md + fundamentals/02.1_working_with_labeled_data.ipynb: fundamentals/02.1_indexing_Basic.ipynb + + bibtex_reference_style: author_year # or label, super, \supercite + + intersphinx_mapping: + xarray: + - https://docs.xarray.dev/en/stable + - null + numpy: + - https://numpy.org/doc/stable + - null + pandas: + - https://pandas.pydata.org/docs + - null + scipy: + - https://docs.scipy.org/doc/scipy + - null + python: + - https://docs.python.org/3 + - null + dask: + - https://docs.dask.org/en/stable + - null + matplotlib: + - https://matplotlib.org/stable + - null diff --git a/_static/dataarray.png b/_static/dataarray.png new file mode 100644 index 00000000..b8d6b364 Binary files /dev/null and b/_static/dataarray.png differ diff --git a/_static/dataset.png b/_static/dataset.png new file mode 100644 index 00000000..7e843144 Binary files /dev/null and b/_static/dataset.png differ diff --git a/_static/datatree1.png b/_static/datatree1.png new file mode 100644 index 00000000..0f806eca Binary files /dev/null and b/_static/datatree1.png differ diff --git a/_static/datatree2.png b/_static/datatree2.png new file mode 100644 index 00000000..463c4dd1 Binary files /dev/null and b/_static/datatree2.png differ diff --git a/_static/style.css b/_static/style.css new file mode 100644 index 00000000..842c6d9b --- /dev/null +++ b/_static/style.css @@ -0,0 +1,11 @@ +.bd-header-announcement { + background-color: var(--pst-color-accent); +} + +/* workaround Pydata Sphinx theme using light colors for widget cell outputs in dark-mode */ +/* works for many widgets but not for Xarray html reprs */ +/* https://github.com/pydata/pydata-sphinx-theme/issues/2189 */ +html[data-theme='dark'] div.cell_output .text_html:has(div.xr-wrap) { + background-color: var(--pst-color-on-background) !important; + color: var(--pst-color-text-base) !important; +} diff --git a/_static/variable.png b/_static/variable.png new file mode 100644 index 00000000..b578a473 Binary files /dev/null and b/_static/variable.png differ diff --git a/_toc.yml b/_toc.yml new file mode 100644 index 00000000..dde8c61c --- /dev/null +++ b/_toc.yml @@ -0,0 +1,123 @@ +# Learn more at https://jupyterbook.org/customize/toc.html +root: intro +format: jb-book +parts: + - caption: Overview + chapters: + - file: overview/get-started.md + - file: overview/xarray-in-45-min + - file: overview/learning-paths.md + sections: + - file: overview/fundamental-path/README.md + - file: overview/intermediate-path/README.md + + - caption: Fundamentals + chapters: + - file: fundamentals/01_data_structures.md + sections: + - file: fundamentals/01_datastructures + - file: fundamentals/01.1_creating_data_structures + - file: fundamentals/01.1_io + - file: fundamentals/01_datatree_hierarchical_data.ipynb + - file: fundamentals/02_labeled_data.md + sections: + - file: fundamentals/02.1_indexing_Basic.ipynb + - file: fundamentals/02.2_manipulating_dimensions + - file: fundamentals/03_computation.md + sections: + - file: fundamentals/03.1_computation_with_xarray + - file: fundamentals/02.3_aligning_data_objects + - file: fundamentals/03.2_groupby_with_xarray + - file: fundamentals/03.3_windowed + - file: fundamentals/03.4_weighted + - file: fundamentals/04.0_plotting.md + sections: + - file: fundamentals/04.1_basic_plotting + - file: fundamentals/04.2_faceting + - file: fundamentals/04.3_geographic_plotting + + - caption: Intermediate + chapters: + - file: intermediate/computation/index + sections: + - file: intermediate/computation/01-high-level-computation-patterns.ipynb + - file: intermediate/computation/hierarchical_computation.ipynb + - file: intermediate/indexing/indexing + sections: + - file: intermediate/indexing/advanced-indexing.ipynb + - file: intermediate/indexing/boolean-masking-indexing.ipynb + - file: intermediate/indexing/why-an-index.ipynb + - file: intermediate/xarray_and_dask + - file: intermediate/intro-to-zarr.ipynb + - file: intermediate/storage_formats.ipynb + - file: intermediate/xarray_ecosystem + - file: intermediate/hvplot + - file: intermediate/datastructures-intermediate.ipynb + - file: intermediate/BiologyDataset.ipynb + - file: intermediate/hierarchical_zarr_store.ipynb + - file: intermediate/remote_data/index + sections: + - file: intermediate/remote_data/cmip6-cloud.ipynb + - file: intermediate/remote_data/remote-data.ipynb + - file: intermediate/cataloging.ipynb + - file: intermediate/data_cleaning/05.1_intro.md + sections: + - file: intermediate/data_cleaning/05.2_examples.md + - file: intermediate/data_cleaning/05.3_ice_velocity + - file: intermediate/data_cleaning/05.4_contributing.md + - file: intermediate/data_cleaning/05.5_scipy_talk.md + + - caption: Advanced + chapters: + - file: advanced/indexing/indexing.md + sections: + - file: advanced/indexing/why-trees.md + - file: advanced/parallel-intro.md + - file: advanced/apply_ufunc/apply_ufunc.md + sections: + - file: advanced/apply_ufunc/simple_numpy_apply_ufunc + - file: advanced/apply_ufunc/core-dimensions + - file: advanced/apply_ufunc/complex-output-numpy + - file: advanced/apply_ufunc/automatic-vectorizing-numpy + - file: advanced/apply_ufunc/dask_apply_ufunc + - file: advanced/apply_ufunc/numba-vectorization + - file: advanced/apply_ufunc/example-interp + - file: advanced/map_blocks/map_blocks.md + sections: + - file: advanced/map_blocks/simple_map_blocks + - file: advanced/backends/backends.md + sections: + - file: advanced/backends/intro-backends.ipynb + - file: advanced/backends/create_custom_backend.ipynb + - file: advanced/backends/1.Backend_without_Lazy_Loading.ipynb + - file: advanced/backends/2.Backend_with_Lazy_Loading.ipynb + - file: advanced/backends/rasterio_backend.ipynb + - file: advanced/accessors/accessors.md + sections: + - file: advanced/accessors/01_accessor_examples.ipynb + + - caption: Workshops + chapters: + - file: workshops/scipy2026/index.ipynb + - file: workshops/scipy2025/index.ipynb + - file: workshops/scipy2024/index.ipynb + - file: workshops/scipy2023/README + - file: workshops/thinking-like-xarray/README + sections: + - url: https://tutorial.xarray.dev/intermediate/01-high-level-computation-patterns + title: High-level computation patterns + - file: workshops/oceanhackweek2020/README + sections: + - url: https://tutorial.xarray.dev/overview/xarray-in-45-min + title: Xarray in 45 minutes + - file: workshops/online-tutorial-series/README + sections: + - file: workshops/online-tutorial-series/01_xarray_fundamentals + - file: workshops/online-tutorial-series/02_indexing + - file: workshops/online-tutorial-series/03_computation + + - caption: Reference + chapters: + - file: CONTRIBUTING + - file: reference/resources + - file: reference/glossary diff --git a/advanced/accessors/01_accessor_examples.ipynb b/advanced/accessors/01_accessor_examples.ipynb new file mode 100644 index 00000000..7cc557b2 --- /dev/null +++ b/advanced/accessors/01_accessor_examples.ipynb @@ -0,0 +1,430 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Creating custom accessors" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction\n", + "\n", + "An accessor is a way of attaching a custom function to xarray objects so that it can be called as if it were a method while retaining a clear separation between the \"core\" xarray API and custom API. It enables you to easily *extend* (which is why you'll sometimes see it referred to as an extension) and customize xarray's functionality while limiting naming conflicts and minimizing the chances of your code breaking with xarray upgrades.\n", + "\n", + "If you've used [rioxarray](https://corteva.github.io/rioxarray/stable/) (e.g. `da.rio.crs`) or [hvplot](https://hvplot.holoviz.org/) (e.g. `ds.hvplot()`), you may have already used an xarray accessor without knowing it!\n", + "\n", + "The [Xarray documentation](https://docs.xarray.dev/en/stable/internals/extending-xarray.html) has some more technical details, and this tutorial provides example custom accessors and their uses." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Why create a custom accessor\n", + "\n", + "- You can easily create a custom suite of tools that work on Xarray objects\n", + "- It keeps your workflows cleaner and simpler\n", + "- Your project-specific code is easy to share\n", + "- It's easy to implement: you don't need to integrate any code into Xarray\n", + "- It makes it easier to perform checks and write code documentation because you only have to create them once!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Easy steps to create your own accessor\n", + "\n", + "1. Create your custom class, including the mandatory `__init__` method\n", + "2. Add the `xr.register_dataarray_accessor()` or `xr.register_dataset_accessor()` \n", + "3. Use your custom functions " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example 1: accessing scipy functionality" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For example, imagine you're a statistician who regularly uses a special `skewness` function which acts on dataarrays but is only of interest to people in your specific field.\n", + "\n", + "You can create a method which applies this skewness function to an xarray object and then register the method under a custom `stats` accessor like this:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr\n", + "from scipy.stats import skew\n", + "\n", + "xr.set_options(display_expand_attrs=False, display_expand_coords=False)\n", + "\n", + "\n", + "@xr.register_dataarray_accessor(\"stats\")\n", + "class StatsAccessor:\n", + " def __init__(self, da):\n", + " self._da = da\n", + "\n", + " def skewness(self, dim):\n", + " return self._da.reduce(func=skew, dim=dim)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can conveniently access this functionality via the `stats` accessor" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.load_dataset(\"air_temperature\")\n", + "ds[\"skewair\"] = ds[\"air\"].stats.skewness(dim=\"time\")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice how the presence of `.stats` clearly differentiates our new \"accessor method\" from core xarray methods." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example 2: creating your own workflows\n", + "\n", + "Perhaps you find yourself running similar code for multiple xarray objects or across related projects. By packing your code into an extension, it makes it easy to repeat the same operation while reducing the likelihood of [human introduced] errors.\n", + "\n", + "Here we wrap the reorganization of InSAR ice velocity data illustrated in [this tutorial](https://tutorial.xarray.dev/intermediate/data_cleaning/05.3_ice_velocity.html) into a custom Xarray extension that makes it easy to re-apply each time you begin working with a new InSAR velocity dataset. Please see the linked tutorial for details on the data, applications, and each step in this process." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "import xarray as xr\n", + "\n", + "\n", + "@xr.register_dataset_accessor(\"insar_vel\")\n", + "class InsarReorg:\n", + " \"\"\"\n", + " An extension for an XArray dataset that will prepare InSAR data for analysis.\n", + "\n", + " Re-organize the data from its native structure to have x and y velocity and error along a time dimension.\n", + " \"\"\"\n", + "\n", + " # ----------------------------------------------------------------------\n", + " # Constructors\n", + "\n", + " def __init__(self, xrds):\n", + " self._xrds = xrds\n", + "\n", + " # ----------------------------------------------------------------------\n", + " # Methods\n", + "\n", + " @staticmethod\n", + " def _validate(self, req_dim=None, req_vars=None):\n", + " \"\"\"\n", + " Make sure the xarray dataset has the correct dimensions and variables.\n", + "\n", + " Running this function will check that my dataset has all the needed dimensions and variables\n", + " for a given function, saving time and headache later if they were missing and the computation fails\n", + " partway through.\n", + "\n", + " Parameters\n", + " ----------\n", + " req_dim : list of str\n", + " List of all required dimension names\n", + " req_vars : list of str\n", + " List of all required variable names\n", + " \"\"\"\n", + "\n", + " if req_dim is not None:\n", + " if all([dim not in list(self._xrds.dims) for dim in req_dim]):\n", + " raise AttributeError(\"Required dimensions are missing\")\n", + " if req_vars is not None:\n", + " if all([var not in self._xrds.variables for var in req_vars.keys()]):\n", + " raise AttributeError(\"Required variables are missing\")\n", + " # print(\"successfully validated your dataset\")\n", + "\n", + " # ----------------------------------------------------------------------\n", + " # Functions\n", + "\n", + " def change_vars_to_coords(\n", + " self,\n", + " req_dim=[\"ny\", \"nx\"],\n", + " req_vars={\"xaxis\": [\"nx\"], \"yaxis\": [\"ny\"]},\n", + " ):\n", + " \"\"\"\n", + " Turn the xaxis and y axis variables into coordinates.\n", + "\n", + " Parameters\n", + " ----------\n", + " req_dim : list of str\n", + " List of all required dimension names.\n", + " req_vars : list of str\n", + " List of all required variable names\n", + " \"\"\"\n", + "\n", + " self._validate(self, req_dim, req_vars)\n", + "\n", + " self._xrds = self._xrds.swap_dims({\"ny\": \"yaxis\", \"nx\": \"xaxis\"})\n", + " self._xrds = self._xrds.rename({\"xaxis\": \"x\", \"yaxis\": \"y\"})\n", + "\n", + " return self._xrds\n", + "\n", + " def reorg_dataset(self):\n", + " \"\"\"\n", + " Reorganize the data by time for each of the desired end variables (here vx, vy, err)\n", + "\n", + " \"\"\"\n", + "\n", + " reorged = []\n", + " for reorg_var in [\"vx\", \"vy\", \"err\"]:\n", + " ds = self.reorg_var_time(reorg_var)\n", + " reorged.append(ds)\n", + "\n", + " reorged_ds = xr.merge(reorged)\n", + "\n", + " return reorged_ds\n", + "\n", + " def reorg_var_time(self, reorg_var):\n", + " \"\"\"\n", + " Repeat the process for a given variable.\n", + "\n", + " Figure out which of the original variables are time steps for this variable and turn each one into a dataarray.\n", + " Add a time dimension and update the variable name for each dataarray.\n", + " Combine the modified data arrays back into a single dataset.\n", + " \"\"\"\n", + "\n", + " # create storage list for reorganizing\n", + " var_ls = list(self._xrds)\n", + " to_reorg = [var for var in var_ls if reorg_var in var]\n", + "\n", + " # list the arrays from the original dataset that correspond to the variable\n", + " das_to_reorg = [self._xrds[var] for var in to_reorg]\n", + "\n", + " # add the time dimension\n", + " das_to_reorg = [das_to_reorg[var].expand_dims(\"time\") for var in range(len(das_to_reorg))]\n", + "\n", + " # update variable name to remove time\n", + " das_to_reorg = [das_to_reorg[var].rename(reorg_var) for var in range(len(das_to_reorg))]\n", + "\n", + " ds = xr.concat(das_to_reorg, dim=\"time\")\n", + "\n", + " return ds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.open_dataset(\"ASE_ice_velocity.nc\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = ds.insar_vel.change_vars_to_coords()\n", + "ds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = ds.insar_vel.reorg_dataset()\n", + "ds" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example 3: creating your own workflows with locally stored corrections\n", + "\n", + "Consider someone who frequently converts their elevations to be relative to the geoid (rather than the ellipsoid) using a custom, local conversion (otherwise, we'd recommend using an established conversion library like [pyproj](https://pypi.org/project/pyproj/) to switch between datums).\n", + "\n", + "An accessor provides an elegant way to build (once) and apply (as often as needed!) this custom conversion on top of the existing xarray ecosystem without the need to copy-paste the code into the start of each project. By standardizing our approach and adding a few sanity checks within the accessor, we also eliminate the risk of accidentally applying the correction multiple times." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import rasterio\n", + "import xarray as xr\n", + "\n", + "\n", + "@xr.register_dataset_accessor(\"geoidxr\")\n", + "class GeoidXR:\n", + " \"\"\"\n", + " An extension for an XArray dataset that will calculate geoidal elevations from a local source file.\n", + " \"\"\"\n", + "\n", + " # ----------------------------------------------------------------------\n", + " # Constructors\n", + "\n", + " def __init__(\n", + " self,\n", + " xrds,\n", + " ):\n", + " self._xrds = xrds\n", + " # Running this function on init will check that my dataset has all the needed dimensions and variables\n", + " # as specific to my workflow, saving time and headache later if they were missing and the computation fails\n", + " # partway through.\n", + " self._validate(\n", + " self, req_dim=[\"x\", \"y\", \"dtime\"], req_vars={\"elevation\": [\"x\", \"y\", \"dtime\"]}\n", + " )\n", + "\n", + " # ----------------------------------------------------------------------\n", + " # Methods\n", + "\n", + " @staticmethod\n", + " def _validate(self, req_dim=None, req_vars=None):\n", + " \"\"\"\n", + " Make sure the xarray dataset has the correct dimensions and variables\n", + "\n", + " Parameters\n", + " ----------\n", + " req_dim : list of str\n", + " List of all required dimension names\n", + " req_vars : list of str\n", + " List of all required variable names\n", + " \"\"\"\n", + "\n", + " if req_dim is not None:\n", + " if all([dim not in list(self._xrds.dims) for dim in req_dim]):\n", + " raise AttributeError(\"Required dimensions are missing\")\n", + " if req_vars is not None:\n", + " if all([var not in self._xrds.variables for var in req_vars.keys()]):\n", + " raise AttributeError(\"Required variables are missing\")\n", + "\n", + " # Notice that 'geoid' has been added to the req_vars list\n", + " def to_geoid(\n", + " self,\n", + " req_dim=[\"dtime\", \"x\", \"y\"],\n", + " req_vars={\"elevation\": [\"x\", \"y\", \"dtime\", \"geoid\"]},\n", + " source=None,\n", + " ):\n", + " \"\"\"\n", + " Get geoid layer from your local file, which is provided to the function as \"source\",\n", + " and apply the offset to all elevation values.\n", + " Adds 'geoid_offset' keyword to \"offsets\" attribute so you know the geoid offset was applied.\n", + "\n", + " Parameters\n", + " ----------\n", + " req_dim : list of str\n", + " List of all required dimension names.\n", + " req_vars : list of str\n", + " List of all required variable names\n", + " source : str\n", + " Full path to your source file containing geoid offsets\n", + " \"\"\"\n", + "\n", + " # check to make sure you haven't already run this function (and are thus applying the offset twice)\n", + " try:\n", + " values = self._xrds.attrs[\"offset_names\"]\n", + " assert \"geoid_offset\" not in values, \"You've already applied the geoid offset!\"\n", + " values = list([values]) + [\"geoid_offset\"]\n", + " except KeyError:\n", + " values = [\"geoid_offset\"]\n", + "\n", + " self._validate(self, req_dim, req_vars)\n", + "\n", + " # read in your geoid values\n", + " # WARNING: this implementation assumes your geoid values are in the same CRS and grid as the data you are applying\n", + " # them to. If not, you will need to reproject and/or resample them to match the data to which you are applying them.\n", + " # That step is not included here to emphasize the accessor aspect of the workflow.\n", + " with rasterio.open(source) as src:\n", + " geoid = src[\"geoid_varname\"]\n", + "\n", + " # As noted above, this step will fail or produce unreliable results if your data is not properly gridded\n", + " self._xrds[\"elevation\"] = self._xrds.elevation - geoid\n", + "\n", + " self._xrds.attrs[\"offset_names\"] = values\n", + "\n", + " return self._xrds" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, each time we want to convert our ellipsoid data to the geoid, we only have to run one line of code, and it will also perform a multitude of checks for us to make sure we're performing exactly the operation we expect. Imagine the possibilities (and decrease in frustration)!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "ds = ds.geoidxr.to_geoid(source=\"/Path/to/Custom/source/file.nc\")\n", + "ds" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + }, + "vscode": { + "interpreter": { + "hash": "eeef546aa85c5aee566c457bd2890cafb9e11a3b514b94bbf230bf44d1caf251" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/advanced/accessors/accessors.md b/advanced/accessors/accessors.md new file mode 100644 index 00000000..f49df5d2 --- /dev/null +++ b/advanced/accessors/accessors.md @@ -0,0 +1,3 @@ +```{tableofcontents} + +``` diff --git a/advanced/apply_ufunc/apply_ufunc.md b/advanced/apply_ufunc/apply_ufunc.md new file mode 100644 index 00000000..4fb0811d --- /dev/null +++ b/advanced/apply_ufunc/apply_ufunc.md @@ -0,0 +1,5 @@ +# apply_ufunc + +```{tableofcontents} + +``` diff --git a/advanced/apply_ufunc/automatic-vectorizing-numpy.ipynb b/advanced/apply_ufunc/automatic-vectorizing-numpy.ipynb new file mode 100644 index 00000000..46c4180a --- /dev/null +++ b/advanced/apply_ufunc/automatic-vectorizing-numpy.ipynb @@ -0,0 +1,358 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": { + "tags": [] + }, + "source": [ + "(vectorize)=\n", + "# Automatic Vectorization" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": { + "tags": [] + }, + "source": [ + "Previously we looked at [applying functions](gentle-intro) on numpy arrays, and the concept of [core dimensions](core-dimensions).\n", + "We learned that functions commonly support specifying \"core dimensions\" through the `axis` keyword\n", + "argument. \n", + "\n", + "However many functions exist, that implicitly have core dimensions, but do not provide an `axis` keyword\n", + "argument. Applying such functions to a nD array usually involves one or multiple loops over the other dimensions\n", + "--- termed \"loop dimensions\" or \"broadcast dimensions\".\n", + "\n", + "\n", + "A good example is numpy's 1D interpolate function `numpy.interp`:\n", + "\n", + "```\n", + " Signature: np.interp(x, xp, fp, left=None, right=None, period=None)\n", + " Docstring:\n", + " One-dimensional linear interpolation.\n", + "\n", + " Returns the one-dimensional piecewise linear interpolant to a function\n", + " with given discrete data points (`xp`, `fp`), evaluated at `x`.\n", + "```\n", + "\n", + "This function expects 1D arrays as input, so there is one core dimension and we cannot easily apply \n", + "it to a nD array since there is no `axis` keyword argument. \n", + "\n", + "\n", + "Our goal here is to \n", + "1. Understand the difference between core dimensions and loop dimensions\n", + "1. Understand vectorization\n", + "1. Learn how to apply such functions without loops using `apply_ufunc` by providing the `vectorize` keyword argument.\n", + "\n", + "## Core dimensions and looping\n", + "\n", + "Let's say we want to\n", + "interpolate an array with two dimensions (`space`, `time`) over the `time` dimension, we might \n", + "1. loop over the `space` dimension, \n", + "1. subset the array to a 1D array at that `space` location, \n", + "1. Interpolate the 1D arrays to the new `time` vector, and\n", + "1. Assign that new interpolated 1D array to the appropriate location of a 2D output array\n", + "\n", + "In pseudo-code this might look like\n", + "\n", + "```python\n", + "for index in range(size_of_space_axis):\n", + " out[index, :] = np.interp(..., array[index, :], ...)\n", + "```\n", + "\n", + "::::{admonition} Exercise\n", + ":class: tip\n", + "Consider the example problem of interpolating a 2D array with dimensions `space` and `time` along the `time` dimension.\n", + "Which dimension is the core dimension, and which is the \"loop dimension\"?\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "`time` is the core dimension, and `space` is the loop dimension.\n", + ":::\n", + "::::\n", + "\n", + "## Vectorization\n", + "\n", + "The pattern of looping over any number of \"loop dimensions\" and applying a function along \"core dimensions\" \n", + "is so common that numpy provides wrappers that automate these steps: \n", + "1. [numpy.apply_along_axis](https://numpy.org/doc/stable/reference/generated/numpy.apply_along_axis.html)\n", + "1. [numpy.apply_over_axes](https://numpy.org/doc/stable/reference/generated/numpy.apply_over_axes.html)\n", + "1. [numpy.vectorize](https://numpy.org/doc/stable/reference/generated/numpy.vectorize.html)\n", + "\n", + "\n", + "`apply_ufunc` provides an easy interface to `numpy.vectorize` through the keyword argument `vectorize`. Here we see how to use\n", + "that to automatically apply `np.interp` along a single axis of a nD array\n", + "\n", + "## Load data\n", + "\n", + "First lets load an example dataset\n", + "\n", + "```{tip}\n", + "We'll reduce the length of error messages using `%xmode minimal` See the [ipython documentation](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-xmode) for details.\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%xmode minimal\n", + "\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "xr.set_options(display_expand_data=False)\n", + "\n", + "air = (\n", + " xr.tutorial.load_dataset(\"air_temperature\")\n", + " .air.sortby(\"lat\") # np.interp needs coordinate in ascending order\n", + " .isel(time=slice(4), lon=slice(3)) # choose a small subset for convenience\n", + ")\n", + "air" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": { + "tags": [] + }, + "source": [ + "## Review\n", + "\n", + "\n", + "We'll work with the `apply_ufunc` call from the section on [handling dimensions that change size](complex-output-change-size). See the \"Handling Complex Output\" section for how to get here.\n", + "\n", + "This version only works with 1D vectors. We will expand that to work with inputs of any number of dimensions." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "newlat = np.linspace(15, 75, 100)\n", + "\n", + "xr.apply_ufunc(\n", + " np.interp, # first the function\n", + " newlat,\n", + " air.lat,\n", + " air.isel(lon=0, time=0), # this version only works with 1D vectors\n", + " input_core_dims=[[\"lat\"], [\"lat\"], [\"lat\"]],\n", + " output_core_dims=[[\"lat\"]],\n", + " exclude_dims={\"lat\"},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": { + "tags": [] + }, + "source": [ + "## Try nD input\n", + "\n", + "Our goal is to interpolate latitude at every longitude and time, such that we go from a dataset with dimensions `(time: 4, lat: 25, lon: 3)` to `(time: 4, lat: 100, lon: 3)`. \n", + "\n", + "If we blindly try passing `air` (a 3D DataArray), we get a hard-to-understand error" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "newlat = np.linspace(15, 75, 100)\n", + "\n", + "xr.apply_ufunc(\n", + " np.interp, # first the function\n", + " newlat,\n", + " air.lat,\n", + " air,\n", + " input_core_dims=[[\"lat\"], [\"lat\"], [\"lat\"]],\n", + " output_core_dims=[[\"lat\"]],\n", + " exclude_dims={\"lat\"},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": { + "tags": [] + }, + "source": [ + "We will use a \"wrapper\" function `debug_interp` to examine what gets passed to `numpy.interp`.\n", + "\n", + "```{tip}\n", + "Such wrapper functions are a great way to understand and debug `apply_ufunc` use cases.\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "def debug_interp(xi, x, data):\n", + " print(f\"data: {data.shape} | x: {x.shape} | xi: {xi.shape}\")\n", + " return np.interp(xi, x, data)\n", + "\n", + "\n", + "interped = xr.apply_ufunc(\n", + " debug_interp, # first the function\n", + " newlat,\n", + " air.lat,\n", + " air,\n", + " input_core_dims=[[\"lat\"], [\"lat\"], [\"lat\"]],\n", + " output_core_dims=[[\"lat\"]],\n", + " exclude_dims={\"lat\"}, # dimensions allowed to change size. Must be set!\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": { + "tags": [] + }, + "source": [ + "That's a hard-to-interpret error from NumPy but our `print` call helpfully printed the shapes of the input data: \n", + "\n", + " data: (4, 3, 25) | x: (25,) | xi: (100,)\n", + "\n", + "We see that `apply_ufunc` passes the full 3D array to `interp1d_np` which in turn passes that on to `numpy.interp`. But `numpy.interp` requires a 1D input, and thus the error.\n", + "\n", + "Instead of passing the full 3D array we want loop over all combinations of `lon` and `time`; and apply our function to each corresponding vector of data along `lat`." + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": { + "tags": [] + }, + "source": [ + "## Vectorization with `np.vectorize`\n" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": { + "tags": [] + }, + "source": [ + "`apply_ufunc` makes it easy to loop over the loop dimensions by specifying `vectorize=True`:\n", + "\n", + " vectorize : bool, optional\n", + " If True, then assume ``func`` only takes arrays defined over core\n", + " dimensions as input and vectorize it automatically with\n", + " :py:func:`numpy.vectorize`. This option exists for convenience, but is\n", + " almost always slower than supplying a pre-vectorized function.\n", + " Using this option requires NumPy version 1.12 or newer.\n", + " \n", + "\n", + "```{warning}\n", + "Also see the numpy documentation for [numpy.vectorize](https://numpy.org/doc/stable/reference/generated/numpy.vectorize.html). Most importantly\n", + "\n", + " The vectorize function is provided primarily for convenience, not for performance. \n", + " The implementation is essentially a for loop.\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": { + "tags": [], + "user_expressions": [] + }, + "outputs": [], + "source": [ + "interped = xr.apply_ufunc(\n", + " debug_interp, # first the function\n", + " newlat,\n", + " air.lat,\n", + " air,\n", + " input_core_dims=[[\"lat\"], [\"lat\"], [\"lat\"]],\n", + " output_core_dims=[[\"lat\"]],\n", + " exclude_dims={\"lat\"}, # dimensions allowed to change size. Must be set!\n", + " vectorize=True,\n", + ")\n", + "interped" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": { + "tags": [] + }, + "source": [ + "Wow that worked!\n", + "\n", + "Notice that \n", + "1. the printed input shapes are all 1D and correspond to one vector of size 25 along the `lat` dimension.\n", + "2. `debug_interp` was called 4x3 = 12 times which is the total number `lat` vectors since the size along `time` is 4, and the size along `lon` is 3.\n", + "3. The result `interped` is now an xarray object with coordinate values copied over from `data`. \n", + "\n", + "\n", + "```{note}\n", + "`lat` is now the *last* dimension in `interped`. This is a \"property\" of core dimensions: they are moved to the end before being sent to `interp1d_np` as noted in the docstring for `input_core_dims`\n", + "\n", + " Core dimensions are automatically moved to the last axes of input\n", + " variables before applying ``func``, which facilitates using NumPy style\n", + " generalized ufuncs [2]_.\n", + "```\n", + "\n", + "## Conclusion\n", + "This is why `apply_ufunc` is so convenient; it takes care of a lot of code necessary to apply functions that consume and produce numpy arrays to xarray objects.\n", + "\n", + "The `vectorize` keyword argument, when set to True, will use `numpy.vectorize` to apply the function by looping over the \"loop dimensions\" --- dimensions that are not the core dimensions for the applied function." + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/advanced/apply_ufunc/complex-output-numpy.ipynb b/advanced/apply_ufunc/complex-output-numpy.ipynb new file mode 100644 index 00000000..e9e80fcf --- /dev/null +++ b/advanced/apply_ufunc/complex-output-numpy.ipynb @@ -0,0 +1,376 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": { + "tags": [] + }, + "source": [ + "(complex-output)=\n", + "# Handling complex output\n", + "\n", + "We've seen how to use `apply_ufunc` to handle relatively simple functions that transform every element, or reduce along a single dimension.\n", + "\n", + "This lesson will show you how to handle cases where the output is more complex in two ways:\n", + "1. Handle adding a new dimension by specifying `output_core_dims`\n", + "1. Handling the change in size of an existing dimension by specifying `exclude_dims` in addition to `output_core_dims`\n", + "\n", + "\n", + "## Introduction\n", + "\n", + "A good example of a function that returns relatively complex output is numpy's 1D interpolate function `numpy.interp`:\n", + "\n", + "```\n", + " Signature: np.interp(x, xp, fp, left=None, right=None, period=None)\n", + " Docstring:\n", + " One-dimensional linear interpolation.\n", + "\n", + " Returns the one-dimensional piecewise linear interpolant to a function\n", + " with given discrete data points (`xp`, `fp`), evaluated at `x`.\n", + "```\n", + "\n", + "This function expects a 1D array as input, and returns a 1D array as output. That is, `numpy.interp` has one core dimension.\n", + "\n", + "\n", + "```{tip}\n", + "We'll reduce the length of error messages using `%xmode minimal` See the [ipython documentation](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-xmode) for details.\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%xmode minimal\n", + "\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "np.set_printoptions(threshold=10, edgeitems=2)\n", + "xr.set_options(display_expand_data=False)\n", + "\n", + "air = (\n", + " xr.tutorial.load_dataset(\"air_temperature\")\n", + " .air.sortby(\"lat\") # np.interp needs coordinate in ascending order\n", + " .isel(time=-0, lon=0) # choose a 1D subset\n", + ")\n", + "air" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Our goal is to densify from 25 to 100 coordinate values:s\n", + "newlat = np.linspace(15, 75, 100)\n", + "np.interp(newlat, air.lat.data, air.data)" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": { + "tags": [] + }, + "source": [ + "(interp-add-new-dim)=\n", + "## Adding a new dimension\n", + "\n", + "1D interpolation transforms the size of the input along a single dimension.\n", + "\n", + "Logically, we can think of this as removing the old dimension and adding a new dimension.\n", + "\n", + "We provide this information to `apply_ufunc` using the `output_core_dims` keyword argument\n", + "\n", + "```\n", + " output_core_dims : List[tuple], optional\n", + " List of the same length as the number of output arguments from\n", + " ``func``, giving the list of core dimensions on each output that were\n", + " not broadcast on the inputs. By default, we assume that ``func``\n", + " outputs exactly one array, with axes corresponding to each broadcast\n", + " dimension.\n", + "\n", + " Core dimensions are assumed to appear as the last dimensions of each\n", + " output in the provided order.\n", + "```\n", + "\n", + "For `interp` we expect one returned output with one new core dimension that we will call `\"lat_interp\"`.\n", + "\n", + "Specify this using `output_core_dims=[[\"lat_interp\"]]`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "newlat = np.linspace(15, 75, 100)\n", + "\n", + "xr.apply_ufunc(\n", + " np.interp, # function to apply\n", + " newlat, # 1st input to np.interp\n", + " air.lat, # 2nd input to np.interp\n", + " air, # 3rd input to np.interp\n", + " input_core_dims=[[\"lat_interp\"], [\"lat\"], [\"lat\"]], # one entry per function input, 3 in total!\n", + " output_core_dims=[[\"lat_interp\"]],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": { + "tags": [] + }, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Apply the following function using `apply_ufunc`. It adds a new dimension to the input array, let's call it `newdim`. Specify the new dimension using `output_core_dims`. Do you need any `input_core_dims`?\n", + "\n", + "```python\n", + "def add_new_dim(array):\n", + " return np.expand_dims(array, axis=-1)\n", + "```\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "def add_new_dim(array):\n", + " return np.expand_dims(array, axis=-1)\n", + "\n", + "\n", + "xr.apply_ufunc(\n", + " add_new_dim,\n", + " air,\n", + " output_core_dims=[[\"newdim\"]],\n", + ")\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": { + "tags": [], + "user_expressions": [] + }, + "source": [ + "(complex-output-change-size)=\n", + "## Dimensions that change size\n", + "\n", + "Imagine that you want the output to have the same dimension name `\"lat\"` i.e. applying`np.interp` changes the size of the `\"lat\"` dimension.\n", + "\n", + "We get an a error if we specify `\"lat\"` in `output_core_dims`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "newlat = np.linspace(15, 75, 100)\n", + "\n", + "xr.apply_ufunc(\n", + " np.interp, # first the function\n", + " newlat,\n", + " air.lat,\n", + " air,\n", + " input_core_dims=[[\"lat\"], [\"lat\"], [\"lat\"]],\n", + " output_core_dims=[[\"lat\"]],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": { + "tags": [], + "user_expressions": [] + }, + "source": [ + "As the error message points out,\n", + "```\n", + "Only dimensions specified in ``exclude_dims`` with xarray.apply_ufunc are allowed to change size.\n", + "```\n", + "\n", + "Looking at the docstring we need to specify `exclude_dims` as a \"set\":\n", + "\n", + "```\n", + "exclude_dims : set, optional\n", + " Core dimensions on the inputs to exclude from alignment and\n", + " broadcasting entirely. Any input coordinates along these dimensions\n", + " will be dropped. Each excluded dimension must also appear in\n", + " ``input_core_dims`` for at least one argument. Only dimensions listed\n", + " here are allowed to change size between input and output objects.\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "newlat = np.linspace(15, 75, 100)\n", + "\n", + "xr.apply_ufunc(\n", + " np.interp, # first the function\n", + " newlat,\n", + " air.lat,\n", + " air,\n", + " input_core_dims=[[\"lat\"], [\"lat\"], [\"lat\"]],\n", + " output_core_dims=[[\"lat\"]],\n", + " exclude_dims={\"lat\"},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": { + "tags": [] + }, + "source": [ + "## Returning multiple variables\n", + "\n", + "Another common, but more complex, case is to handle multiple outputs returned by the function.\n", + "\n", + "As an example we will write a function that returns the minimum and maximum value along the last axis of the array.\n", + "\n", + "We will work with a 2D array, and apply the function `minmax` along the `\"lat\"` dimension:\n", + "```python\n", + "def minmax(array):\n", + " return array.min(axis=-1), array.max(axis=-1)\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def minmax(array):\n", + " return array.min(axis=-1), array.max(axis=-1)\n", + "\n", + "\n", + "air2d = xr.tutorial.load_dataset(\"air_temperature\").air.isel(time=0)\n", + "air2d" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": { + "tags": [], + "user_expressions": [] + }, + "source": [ + "By default, Xarray assumes one array is returned by the applied function.\n", + "\n", + "Here we have two returned arrays, and the input core dimension `\"lat\"` is removed (or reduced over).\n", + "\n", + "So we provide `output_core_dims=[[], []]` i.e. an empty list of core dimensions for each of the two returned arrays." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "minda, maxda = xr.apply_ufunc(\n", + " minmax,\n", + " air2d,\n", + " input_core_dims=[[\"lat\"]],\n", + " output_core_dims=[[], []],\n", + ")\n", + "minda" + ] + }, + { + "cell_type": "markdown", + "id": "14", + "metadata": { + "tags": [] + }, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "We presented the concept of \"core dimensions\" as the \"smallest unit of data the function could handle.\" Do you understand how the above use of `apply_ufunc` generalizes to an array with more than one dimension? \n", + "\n", + "Try applying the minmax function to a 3d air temperature dataset \n", + "```python\n", + "air3d = xr.tutorial.load_dataset(\"air_temperature\").air\n", + "``` \n", + "Your goal is to have a minimum and maximum value of temperature across all latitudes for a given time and longitude.\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "We want to use `minmax` to compute the minimum and maximum along the \"lat\" dimension always, regardless of how many dimensions are on the input. So we specify `input_core_dims=[[\"lat\"]]`. The output does not contain the \"lat\" dimension, but we expect two returned variables. So we pass an empty list `[]` for each returned array, so `output_core_dims=[[], []]` just as before.\n", + "\n", + "\n", + "```python\n", + "minda, maxda = xr.apply_ufunc(\n", + " minmax,\n", + " air3d,\n", + " input_core_dims=[[\"lat\"]],\n", + " output_core_dims=[[],[]],\n", + ")\n", + ":::\n", + "::::" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/advanced/apply_ufunc/core-dimensions.ipynb b/advanced/apply_ufunc/core-dimensions.ipynb new file mode 100644 index 00000000..7a009782 --- /dev/null +++ b/advanced/apply_ufunc/core-dimensions.ipynb @@ -0,0 +1,372 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": { + "tags": [] + }, + "source": [ + "# Core dimensions\n", + "\n", + "[Previously](gentle-intro) we learned to use `apply_ufunc` on simple functions that acted element by element. \n", + "\n", + "Here we move on to slightly more complex functions like `np.mean` that can act along a subset of an input array's dimensions.\n", + "\n", + "Such operations involve the concept of \"core dimensions\". \n", + "\n", + "Our learning goals are:\n", + "- Learn how to identify \"core dimensions\" for the function you're applying.\n", + "- Learn that \"core dimensions\" are automatically moved or transposed to the end of the array.\n", + "\n", + "\n", + "## Introduction\n", + "\n", + "For using more complex operations that consider some array values collectively,\n", + "it’s important to understand the idea of **core dimensions**. \n", + "Usually, they correspond to the fundamental dimensions over\n", + "which an operation is defined, e.g., the summed axis in `np.sum`. One way to think about core dimensions \n", + "is to consider the smallest dimensionality of data that the function acts on.\n", + "\n", + "```{important}\n", + "\n", + "A good clue that core dimensions are needed is the presence of an `axis` argument on the\n", + "corresponding NumPy function.\n", + "\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "%xmode minimal\n", + "\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "# limit the amount of information printed to screen\n", + "xr.set_options(display_expand_data=False)\n", + "np.set_printoptions(threshold=10, edgeitems=2)" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "Let's load a dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.load_dataset(\"air_temperature\")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "## Reducing with `np.mean`\n", + "\n", + "Let's write a function that computes the mean along `time` for a provided xarray object. \n", + "\n", + "This function requires one core dimension `time`. For `ds.air` note that `time` is the 0th axis." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ds.air.dims" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": { + "tags": [] + }, + "source": [ + "`get_axis_num` is a useful method." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ds.air.get_axis_num(\"time\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "np.mean(ds.air, axis=ds.air.get_axis_num(\"time\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "np.mean(ds.air.data, axis=0)" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "Let's try to use `apply_ufunc` to replicate `np.mean(ds.air.data, axis=0)`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "xr.apply_ufunc(\n", + " # function to apply\n", + " np.mean,\n", + " # object with data to pass to function\n", + " ds,\n", + " # keyword arguments to pass to np.mean\n", + " kwargs={\"axis\": 0},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": { + "tags": [] + }, + "source": [ + "The error here\n", + "```\n", + "applied function returned data with unexpected number of dimensions. \n", + "Received 2 dimension(s) but expected 3 dimensions with names: ('time', 'lat', 'lon')\n", + "```\n", + "\n", + "means that while `np.mean` did indeed reduce one dimension, we did not tell `apply_ufunc` that this would happen. That is, we need to specify the core dimensions on the input.\n", + "\n", + "Do that by passing a list of dimension names for each input object. For this function we have one input : `ds` and with a single core dimension `\"time\"` so we have `input_core_dims=[[\"time\"]]`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "xr.apply_ufunc(\n", + " np.mean,\n", + " ds,\n", + " # specify core dimensions as a list of lists\n", + " # here 'time' is the core dimension on `ds`\n", + " input_core_dims=[\n", + " [\"time\"], # core dimension for ds\n", + " ],\n", + " kwargs={\"axis\": 0},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "15", + "metadata": { + "tags": [] + }, + "source": [ + "This next error is a little confusing.\n", + "\n", + "```\n", + "size of dimension 'lat' on inputs was unexpectedly changed by applied function from 25 to 53. \n", + "Only dimensions specified in ``exclude_dims`` with xarray.apply_ufunc are allowed to change size.\n", + "```\n", + "\n", + "\n", + "A good trick here is to pass a little wrapper function to `apply_ufunc` instead and inspect the shapes of data received by the wrapper.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "def wrapper(array, **kwargs):\n", + " print(f\"received {type(array)} shape: {array.shape}, kwargs: {kwargs}\")\n", + " result = np.mean(array, **kwargs)\n", + " print(f\"result.shape: {result.shape}\")\n", + " return result\n", + "\n", + "\n", + "xr.apply_ufunc(\n", + " wrapper,\n", + " ds,\n", + " # specify core dimensions as a list of lists\n", + " # here 'time' is the core dimension on `ds`\n", + " input_core_dims=[[\"time\"]],\n", + " kwargs={\"axis\": 0},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "17", + "metadata": {}, + "source": [ + "Now we see the issue:\n", + "\n", + " received shape: (25, 53, 2920), kwargs: {'axis': 0}\n", + " result.shape: (53, 2920)\n", + " \n", + "The `time` dimension is of size `2920` and is now the last axis of the array but was initially the first axis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.get_axis_num(\"time\")" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": { + "tags": [] + }, + "source": [ + "```{important}\n", + "This illustrates an important concept. Arrays are transposed so that core dimensions are at the end.\n", + "```\n", + "\n", + "With `apply_ufunc`, core dimensions are recognized by name, and then moved to\n", + "the last dimension of any input arguments before applying the given function.\n", + "This means that for functions that accept an `axis` argument, you usually need\n", + "to set `axis=-1`\n", + "\n", + "Such behaviour means that our functions (like `wrapper` or `np.mean`) do not need to know the exact order of dimensions. They can rely on the core dimensions being at the end allowing us to write very general code! \n", + "\n", + "We can fix our `apply_ufunc` call by specifying `axis=-1` instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "def wrapper(array, **kwargs):\n", + " print(f\"received {type(array)} shape: {array.shape}, kwargs: {kwargs}\")\n", + " result = np.mean(array, **kwargs)\n", + " print(f\"result.shape: {result.shape}\")\n", + " return result\n", + "\n", + "\n", + "xr.apply_ufunc(\n", + " wrapper,\n", + " ds,\n", + " input_core_dims=[[\"time\"]],\n", + " kwargs={\"axis\": -1},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "21", + "metadata": { + "tags": [] + }, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Use `apply_ufunc` to apply `scipy.integrate.trapezoid` along the `time` axis.\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "import scipy as sp\n", + "import scipy.integrate\n", + "\n", + "xr.apply_ufunc(scipy.integrate.trapezoid, ds, input_core_dims=[[\"time\"]], kwargs={\"axis\": -1})\n", + "```\n", + ":::\n", + "::::" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/advanced/apply_ufunc/dask_apply_ufunc.ipynb b/advanced/apply_ufunc/dask_apply_ufunc.ipynb new file mode 100644 index 00000000..768674c5 --- /dev/null +++ b/advanced/apply_ufunc/dask_apply_ufunc.ipynb @@ -0,0 +1,933 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": { + "tags": [] + }, + "source": [ + "# Handling dask arrays\n", + "\n", + "We have previously worked over applying functions to NumPy arrays contained in Xarray objects.\n", + "`apply_ufunc` also lets you easily perform many of the steps involving in applying \n", + "functions that expect and return Dask arrays.\n", + "\n", + "Learning goals:\n", + "- Learn that `apply_ufunc` can automate aspects of applying computation functions on dask arrays\n", + "- It is possible to automatically parallelize certain operations by providing `dask=\"parallelized\"`\n", + "- In some cases, extra information needs to be provided such as sizes of any new dimensions added, or data types for output variables.\n", + "- Learn that all the concepts from the numpy lessons carry over: like [automatic vectorization](vectorize) and specifying input and\n", + " output core dimensions.\n", + "\n", + "\n", + "```{tip}\n", + "We'll reduce the length of error messages using `%xmode minimal` See the [ipython documentation](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-xmode) for details.\n", + "```\n", + "\n", + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "%xmode minimal\n", + "\n", + "import dask\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "# limit the amount of information printed to screen\n", + "xr.set_options(display_expand_data=False)\n", + "np.set_printoptions(threshold=10, edgeitems=2)" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "First lets set up a `LocalCluster` using [dask.distributed](https://distributed.dask.org/).\n", + "\n", + "You can use any kind of dask cluster. This step is completely independent of\n", + "xarray. While not strictly necessary, the dashboard provides a nice learning\n", + "tool.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "from dask.distributed import Client\n", + "\n", + "client = Client()\n", + "client" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "

👆

Click the Dashboard link above. Or click the \"Search\" button in the dashboard.\n", + "\n", + "Let's test that the dashboard is working..\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "import dask.array\n", + "\n", + "dask.array.ones((1000, 4), chunks=(2, 1)).compute() # should see activity in dashboard" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "Let's open a dataset. We specify `chunks` so that we create a dask arrays for the DataArrays" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.open_dataset(\"air_temperature\", chunks={\"time\": 100})\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": { + "tags": [] + }, + "source": [ + "## A simple example\n", + "\n", + "All the concepts from applying numpy functions carry over.\n", + "\n", + "However the handling of dask arrays needs to be explicitly activated.\n", + "\n", + "There are three options for the `dask` kwarg.\n", + "\n", + "```\n", + " dask : {\"forbidden\", \"allowed\", \"parallelized\"}, default: \"forbidden\"\n", + " How to handle applying to objects containing lazy data in the form of\n", + " dask arrays:\n", + "\n", + " - 'forbidden' (default): raise an error if a dask array is encountered.\n", + " - 'allowed': pass dask arrays directly on to ``func``. Prefer this option if\n", + " ``func`` natively supports dask arrays.\n", + " - 'parallelized': automatically parallelize ``func`` if any of the\n", + " inputs are a dask array by using :py:func:`dask.array.apply_gufunc`. Multiple output\n", + " arguments are supported. Only use this option if ``func`` does not natively\n", + " support dask arrays (e.g. converts them to numpy arrays).\n", + "```\n", + "\n", + "We will work through the following two:\n", + "\n", + "1. `dask=\"allowed\"` Dask arrays are passed to the user function. This is a good\n", + " choice if your function can handle dask arrays and won't compute the result unless \n", + " explicitly requested.\n", + "2. `dask=\"parallelized\"`. This applies the user function over blocks of the dask\n", + " array using `dask.array.apply_gufunc`. This is useful when your function cannot\n", + " handle dask arrays natively (e.g. scipy API)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "# Expect an error here\n", + "def squared_error(x, y):\n", + " return (x - y) ** 2\n", + "\n", + "\n", + "xr.apply_ufunc(squared_error, ds.air, 1)" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": { + "tags": [] + }, + "source": [ + " \n", + "A good thing to check is whether the applied function (here `squared_error`) can handle pure dask arrays. \n", + "To do this call `squared_error(ds.air.data, 1)` and make sure of the following:\n", + "1. That you don't see any activity on the dask dashboard\n", + "2. That the returned result is a dask array." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "squared_error(ds.air.data, 1)" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": { + "tags": [] + }, + "source": [ + "Since `squared_error` can handle dask arrays without computing them, we specify\n", + "`dask=\"allowed\"`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "sqer = xr.apply_ufunc(\n", + " squared_error,\n", + " ds.air,\n", + " 1,\n", + " dask=\"allowed\",\n", + ")\n", + "sqer # dask-backed DataArray! with nice metadata!" + ] + }, + { + "cell_type": "markdown", + "id": "14", + "metadata": { + "tags": [] + }, + "source": [ + "### Understanding what's happening\n", + "\n", + "Let's again use the wrapper trick to understand what `squared_error` receives.\n", + "\n", + "We see that it receives a dask array (analogous to the numpy array in the previous example)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "def wrapper(x, y):\n", + " print(f\"received x of type {type(x)}, shape {x.shape}\")\n", + " print(f\"received y of type {type(y)}\")\n", + " return squared_error(x, y)\n", + "\n", + "\n", + "xr.apply_ufunc(wrapper, ds.air, 1, dask=\"allowed\")" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": { + "tags": [] + }, + "source": [ + "## Core dimensions\n", + "\n", + "`squared_error` operated on a per-element basis. How about a reduction like `np.mean`?\n", + "\n", + "Such functions involve the concept of \"core dimensions\". This concept is independent of the underlying array type, and is a property of the applied function. See the [core dimensions with NumPy](core-dimensions) tutorial for more.\n", + "\n", + "\n", + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Use `dask.array.mean` as an example of a function that can handle dask\n", + "arrays and uses an `axis` kwarg. \n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "def time_mean(da):\n", + " return xr.apply_ufunc(\n", + " dask.array.mean,\n", + " da,\n", + " input_core_dims=[[\"time\"]],\n", + " dask=\"allowed\",\n", + " kwargs={\"axis\": -1}, # core dimensions are moved to the end\n", + " )\n", + " \n", + "time_mean(ds.air)\n", + "```\n", + ":::\n", + "::::\n" + ] + }, + { + "cell_type": "markdown", + "id": "17", + "metadata": { + "tags": [] + }, + "source": [ + "Again, this is identical to the built-in `mean`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "def time_mean(da):\n", + " return xr.apply_ufunc(\n", + " dask.array.mean,\n", + " da,\n", + " input_core_dims=[[\"time\"]],\n", + " dask=\"allowed\",\n", + " kwargs={\"axis\": -1}, # core dimensions are moved to the end\n", + " )\n", + "\n", + "\n", + "ds.air.mean(\"time\").identical(time_mean(ds.air))" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": { + "tags": [] + }, + "source": [ + "## Automatically parallelizing dask-unaware functions\n", + "\n", + "### Basics\n", + "\n", + "Not all functions can handle dask arrays appropriately by default.\n", + "\n", + "A very useful `apply_ufunc` feature is the ability to apply arbitrary functions\n", + "in parallel to each block. This ability can be activated using\n", + "`dask=\"parallelized\"`. \n", + "\n", + "We will use `scipy.integrate.trapezoid` as an example of a function that cannot\n", + "handle dask arrays and requires a core dimension. If we call `trapezoid` with a dask\n", + "array, we get a numpy array back that is, the values have been eagerly computed.\n", + "This is undesirable behaviour\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "import scipy as sp\n", + "import scipy.integrate\n", + "\n", + "sp.integrate.trapezoid(\n", + " ds.air.data, axis=ds.air.get_axis_num(\"lon\")\n", + ") # does NOT return a dask array, you should see activity on the dashboard" + ] + }, + { + "cell_type": "markdown", + "id": "21", + "metadata": { + "tags": [] + }, + "source": [ + "Let's activate automatic parallelization by using `apply_ufunc` with `dask=\"parallelized\"`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": {}, + "outputs": [], + "source": [ + "integrated = xr.apply_ufunc(\n", + " sp.integrate.trapezoid,\n", + " ds,\n", + " input_core_dims=[[\"lon\"]],\n", + " kwargs={\"axis\": -1},\n", + " dask=\"parallelized\",\n", + ")\n", + "integrated" + ] + }, + { + "cell_type": "markdown", + "id": "23", + "metadata": { + "tags": [] + }, + "source": [ + "And make sure the returned data is a dask array" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "integrated.air.data" + ] + }, + { + "cell_type": "markdown", + "id": "25", + "metadata": {}, + "source": [ + "Now you have control over executing this parallel computation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": {}, + "outputs": [], + "source": [ + "# Dask -> Numpy array of integrated values\n", + "parallelized_results = integrated.compute()\n", + "parallelized_results" + ] + }, + { + "cell_type": "markdown", + "id": "27", + "metadata": { + "tags": [] + }, + "source": [ + "### Understanding `dask=\"parallelized\"`\n", + "\n", + "It is very important to understand what `dask=\"parallelized\"` does. To fully understand it, requires understanding some core concepts.\n", + "\n", + "```{seealso}\n", + "For `dask=\"parallelized\"` `apply_ufunc` will call `dask.array.apply_gufunc`. See the dask documentation on [generalized ufuncs](https://docs.dask.org/en/stable/array-gufunc.html) and [`apply_gufunc`](https://docs.dask.org/en/stable/generated/dask.array.gufunc.apply_gufunc.html) for more.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "28", + "metadata": { + "tags": [] + }, + "source": [ + "#### Embarrassingly parallel or blockwise operations\n", + "\n", + "`dask=\"parallelized\"` works well for \"blockwise\" or \"embarrassingly parallel\" operations ([Wikipedia](https://en.wikipedia.org/wiki/Embarrassingly_parallel)).\n", + "\n", + "These are operations where one block or chunk of the output array corresponds to one block or chunk of the input array. Specifically, the blocks or chunks of the _core dimension_ is what matters. Importantly, no communication between blocks is necessary to create the output, which makes parallelization quite simple or \"embarrassing\".\n", + "\n", + "Let's look at the dask repr for `ds` and note chunksizes are (100,25,53) for a array with shape (2920, 25, 53). This means that each block or chunk of the array contains all `lat`, `lon` points and a subset of `time` points." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ds.air.data" + ] + }, + { + "cell_type": "markdown", + "id": "30", + "metadata": { + "tags": [] + }, + "source": [ + "The core dimension for `trapezoid` is `lon`, and there is only one chunk along `lon`. This means that integrating along `lon` is a \"blockwise\" or \"embarrassingly parallel\" operation and `dask=\"parallelized\"` works quite well. \n", + "\n", + "```{caution} Question\n", + "Do you understand why `integrate(ds)` when `ds` has a single chunk along `lon` is a \"embarrassingly parallel\" operation?\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "31", + "metadata": { + "tags": [] + }, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "Apply the integrate function to `ds` after rechunking to have a different chunksize along `lon` using `ds.chunk(lon=4)` (for example). What happens?\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "`apply_ufunc` complains that it cannot automatically parallelize because the dataset `ds` is now chunked along the core dimension `lon`. You should see the following error:\n", + "\n", + " ValueError: dimension lon on 0th function argument to apply_ufunc with dask='parallelized' \n", + " consists of multiple chunks, but is also a core dimension. To fix, either rechunk \n", + " into a single array chunk along this dimension, i.e., \n", + " ``.chunk(dict(lon=-1))``, or pass ``allow_rechunk=True`` in ``dask_gufunc_kwargs`` \n", + " but beware that this may significantly increase memory usage.\n", + "\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "id": "32", + "metadata": { + "tags": [] + }, + "source": [ + "#### Understanding execution\n", + "\n", + "We are layering many concepts together there so it is important to understand how the function is executed, and what input it will receive. Again we will use our wrapper trick." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def integrate_wrapper(array, **kwargs):\n", + " print(f\"received array of type {type(array)}, shape {array.shape}\")\n", + " result = sp.integrate.trapezoid(array, **kwargs)\n", + " print(f\"received array of type {type(result)}, shape {result.shape}\")\n", + " return result\n", + "\n", + "\n", + "integrated = xr.apply_ufunc(\n", + " integrate_wrapper,\n", + " ds,\n", + " input_core_dims=[[\"lon\"]],\n", + " kwargs={\"axis\": -1},\n", + " dask=\"parallelized\",\n", + ")\n", + "integrated" + ] + }, + { + "cell_type": "markdown", + "id": "34", + "metadata": {}, + "source": [ + "Note that we received an Xarray object back (`integrated`) but our wrapper function was called with a numpy array of shape `(1,1,1)`.\n", + "\n", + "```{important}\n", + "the full 3D array has **not yet been** passed to `integrate_wrapper`. Yet dask needs to know the shape and dtype of the result. This is key. \n", + "```\n", + "\n", + "The `integrate_wrapper` function is treated like a black box, and its effect on the inputs has to either be described through additional keyword arguments, or inferred by passing dummy inputs.\n", + "\n", + "To do so, `dask.array.apply_gufunc` calls the user function with dummy inputs (here a numpy array of shape `(1,1,1)`), and inspects the returned value to understand that one dimension was removed (returned a numpy array of shape `(1,1)`.\n", + "\n", + "````{caution}\n", + ":class: dropdown\n", + "\n", + "Some functions can have trouble handling such dummy inputs. Alternatively you can pass `meta = np.ones((1,1))` in `dask_gufunc_kwargs` to prevent dask from providing dummy inputs to the array.\n", + "```python\n", + "xr.apply_ufunc(\n", + " integrate_wrapper,\n", + " ds,\n", + " input_core_dims=[[\"lon\"]],\n", + " kwargs={\"axis\": -1},\n", + " dask=\"parallelized\",\n", + " dask_gufunc_kwargs={\"meta\": np.ones((1,1))},\n", + ")\n", + "```\n", + "````\n", + "\n", + "Since no errors were raised we proceed as-is.\n", + "\n", + "Let's compute the array to get real values." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "35", + "metadata": { + "tags": [ + "output-scroll" + ] + }, + "outputs": [], + "source": [ + "integrated.compute()" + ] + }, + { + "cell_type": "markdown", + "id": "36", + "metadata": {}, + "source": [ + "We see that `integrate_wrapper` is called many times! As many times as there are blocks in the array in fact, which is 30 here (`ds.air.data.numblocks`).\n", + "\n", + "Our function is independently executed on each block of the array, and then the results are concatenated to form the final result.\n", + "\n", + "Conceptually, there is a two-way flow of information between various packages when executing `integrated.compute()`:\n", + "\n", + "`xarray.apply_ufunc` ↔ `dask.array.apply_gufunc` ↔ `integrate_wrapper` ↔ `scipy.integrate.trapezoid` ↔ `ds.air.data`\n", + "\n", + "\n", + "When executed\n", + "\n", + "1. Xarray loops over all data variables.\n", + "1. Xarray unwraps the underlying dask array (e.g. `ds.air`) and passes that to dask's `apply_gufunc`.\n", + "1. `apply_gufunc` calls `integrate_wrapper` on each block of the array.\n", + "1. For each block, `integrate_wrapper` calls `scipy.integrate.trapezoid` and returns one block of the output array.\n", + "1. dask stitches all the output blocks to form the output array.\n", + "1. `xarray.apply_ufunc` wraps the output array with Xarray metadata to give the final result.\n", + "\n", + "Phew!\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "37", + "metadata": { + "tags": [] + }, + "source": [ + "## More complex situations\n", + "\n", + "Here we quickly demonstrate that all the concepts from the numpy material earlier carry over.\n", + "\n", + "Xarray needs a lot of extra metadata, so depending\n", + "on the function, extra arguments such as `output_dtypes` and `output_sizes` may\n", + "be necessary for supporting dask arrays. We demonstrate this below." + ] + }, + { + "cell_type": "markdown", + "id": "38", + "metadata": { + "tags": [] + }, + "source": [ + "### Adding new dimensions\n", + "\n", + "We use the `np.expand_dims` to change the size of the input along a single dimension.\n", + "\n", + "```python\n", + "def add_new_dim(array):\n", + " return np.expand_dims(array, axis=0)\n", + "```\n", + "\n", + "When automatically parallelizing with `dask`, we need to provide some more information about the outputs.\n", + "1. When adding a new dimensions, we need to provide the size in `dask_gufunc_kwargs` using the key `output_sizes`\n", + "2. Usually we need provide the datatype or `dtype` of the returned array. Usually the dtype of the input is a good guess." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39", + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "def add_new_dim(array):\n", + " return np.expand_dims(array, axis=-1)\n", + "\n", + "\n", + "xr.apply_ufunc(\n", + " add_new_dim, # first the function\n", + " ds.air.chunk({\"time\": 2, \"lon\": 2}),\n", + " output_core_dims=[[\"newdim\"]],\n", + " dask=\"parallelized\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "40", + "metadata": {}, + "source": [ + "Provide the size of the newly added dimension `newdim` in `output_sizes` as part of the `dask_gufunc_kwargs` keyword argument:\n", + "\n", + " dask_gufunc_kwargs (dict, optional) – Optional keyword arguments passed to dask.array.apply_gufunc() \n", + " if dask=’parallelized’. Possible keywords are output_sizes, allow_rechunk and meta.\n", + " \n", + "The syntax is \n", + "```python\n", + "dask_gufunc_kwargs={\n", + " \"output_sizes\": {\"newdim\": 1}\n", + "}\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "41", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "xr.apply_ufunc(\n", + " add_new_dim, # first the function\n", + " ds.air.chunk({\"time\": 2, \"lon\": 2}),\n", + " output_core_dims=[[\"newdim\"]],\n", + " dask=\"parallelized\",\n", + " dask_gufunc_kwargs={\"output_sizes\": {\"newdim\": 1}},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "42", + "metadata": {}, + "source": [ + "### Dimensions that change size" + ] + }, + { + "cell_type": "markdown", + "id": "43", + "metadata": {}, + "source": [ + "We will now repeat the [interpolation example from earlier](interp-add-new-dim) with `\"lat\"` as the output core dimension. See the numpy notebook on [complex output](complex-output) for more.\n", + "\n", + "```python\n", + "newlat = np.linspace(15, 75, 100)\n", + "\n", + "xr.apply_ufunc(\n", + " np.interp,\n", + " newlat,\n", + " ds.air.lat,\n", + " ds.air.chunk({\"time\": 2, \"lon\": 2}),\n", + " input_core_dims=[[\"lat\"], [\"lat\"], [\"lat\"]],\n", + " output_core_dims=[[\"lat\"]],\n", + " exclude_dims={\"lat\"},\n", + ")\n", + "```\n", + "\n", + "We will first add `dask=\"parallelized\"` and provide `output_sizes` in `dask_gufunc_kwargs`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44", + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "newlat = np.linspace(15, 75, 100)\n", + "\n", + "xr.apply_ufunc(\n", + " np.interp, # first the function\n", + " newlat,\n", + " ds.air.lat,\n", + " ds.air.chunk({\"time\": 2, \"lon\": 2}),\n", + " input_core_dims=[[\"lat\"], [\"lat\"], [\"lat\"]],\n", + " output_core_dims=[[\"lat\"]],\n", + " exclude_dims={\"lat\"},\n", + " # The following are dask-specific\n", + " dask=\"parallelized\",\n", + " dask_gufunc_kwargs=dict(output_sizes={\"lat\": len(newlat)}),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "45", + "metadata": {}, + "source": [ + "This error means that we need to provide `output_dtypes`\n", + "\n", + " output_dtypes (list of dtype, optional) – Optional list of output dtypes. \n", + " Only used if dask='parallelized' or vectorize=True." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "newlat = np.linspace(15, 75, 100)\n", + "\n", + "xr.apply_ufunc(\n", + " np.interp, # first the function\n", + " newlat,\n", + " ds.air.lat,\n", + " ds.air.chunk({\"time\": 100, \"lon\": -1}),\n", + " input_core_dims=[[\"lat\"], [\"lat\"], [\"lat\"]],\n", + " output_core_dims=[[\"lat\"]],\n", + " exclude_dims={\"lat\"},\n", + " # The following are dask-specific\n", + " dask=\"parallelized\",\n", + " dask_gufunc_kwargs=dict(output_sizes={\"lat\": len(newlat)}),\n", + " output_dtypes=[ds.air.dtype],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "47", + "metadata": {}, + "source": [ + "```{tip}\n", + "Dask can sometimes figure out the output sizes and dtypes. The usual workflow is to read the error messages and iteratively pass more information to `apply_ufunc`.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "48", + "metadata": {}, + "source": [ + "### Automatic Vectorizing\n", + "\n", + "[Automatic vectorizing](vectorize) with `vectorize=True` also carries over!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "49", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "interped = xr.apply_ufunc(\n", + " np.interp, # first the function\n", + " newlat,\n", + " ds.air.lat,\n", + " ds.chunk({\"time\": 100, \"lon\": -1}),\n", + " input_core_dims=[[\"lat\"], [\"lat\"], [\"lat\"]],\n", + " output_core_dims=[[\"lat\"]],\n", + " exclude_dims={\"lat\"}, # dimensions allowed to change size. Must be set!\n", + " dask=\"parallelized\",\n", + " dask_gufunc_kwargs=dict(output_sizes={\"lat\": len(newlat)}),\n", + " output_dtypes=[ds.air.dtype],\n", + " vectorize=True,\n", + ")\n", + "interped" + ] + }, + { + "cell_type": "markdown", + "id": "50", + "metadata": {}, + "source": [ + "Again, it is important to understand the conceptual flow of information between the variuus packages when executing `interped.compute()` which looks ilke\n", + "\n", + "`xarray.apply_ufunc` ↔ `dask.array.apply_gufunc` ↔ `numpy.vectorize` ↔ `numpy.interp`\n", + "\n", + "\n", + "When executed\n", + "\n", + "1. Xarray loops over all data variables.\n", + "1. Xarray unwraps the underlying dask array (e.g. `ds.air`) and passes that to dask's `apply_gufunc`.\n", + "1. `apply_gufunc` calls the vectorized function on each block of the array.\n", + "1. For each block, `numpy.vectorize` handles looping over the loop dimensions \n", + " and passes 1D vectors along the core dimension to `numpy.interp`\n", + "1. The 1D results for each block are concatenated by `numpy.vectorize` to create one output block.\n", + "1. dask stitches all the output blocks to form the output array.\n", + "1. `xarray.apply_ufunc` wraps the output array with Xarray metadata to give the final result.\n", + "\n", + "Phew!\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "51", + "metadata": { + "tags": [] + }, + "source": [ + "## Clean up the cluster" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "52", + "metadata": { + "tags": [ + "remove-output" + ] + }, + "outputs": [], + "source": [ + "client.close();" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/advanced/apply_ufunc/example-interp.ipynb b/advanced/apply_ufunc/example-interp.ipynb new file mode 100644 index 00000000..57318fd1 --- /dev/null +++ b/advanced/apply_ufunc/example-interp.ipynb @@ -0,0 +1,731 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "# np.interp : An end-to-end example\n", + "\n", + "**Author** [Deepak Cherian (NCAR)](https://cherian.net)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "This example will illustrate how to conveniently apply an unvectorized function `func` to xarray objects using `apply_ufunc`. `func` expects 1D numpy arrays and returns a 1D numpy array. Our goal is to conveniently apply this function along a dimension of xarray objects that may or may not wrap dask arrays with a signature.\n", + "\n", + "We will illustrate this using [`np.interp`](https://numpy.org/doc/stable/reference/generated/numpy.interp.html): \n", + "\n", + " Signature: np.interp(x, xp, fp, left=None, right=None, period=None)\n", + " Docstring:\n", + " One-dimensional linear interpolation.\n", + "\n", + " Returns the one-dimensional piecewise linear interpolant to a function\n", + " with given discrete data points (`xp`, `fp`), evaluated at `x`.\n", + "\n", + "and write an `xr_interp` function with signature\n", + "\n", + " xr_interp(xarray_object, dimension_name, new_coordinate_to_interpolate_to)\n", + " \n", + " \n", + "## Learning goals \n", + "\n", + "Our goal is to use `apply_ufunc` with a general function so that we can reuse our code to apply to different xarray datasets or along different dimensions. Specifically, this example will illustrate \n", + "1. Specifying core dimensions with `input_core_dims`\n", + "1. Handling core dimensions of the output with `output_core_dims`\n", + "1. Handling core dimensions that change size using `exclude_dims`\n", + "1. Automatic vectorizing or looping over dimensions that are not core dimensions using `vectorize=True`\n", + "1. Automatically parallelization with dask arrays using `dask=\"parallelized\"`\n", + "1. High-performance vectorization with numba and `vectorize=False`.\n", + "\n", + "It puts together all the concepts covered earlier.\n", + "\n", + "\n", + "```{tip}\n", + "We'll reduce the length of error messages using in this tutorial using `%xmode minimal` See the [ipython documentation](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-xmode) for details.\n", + "```\n", + "\n", + "## Load data\n", + "\n", + "First lets load an example dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%xmode minimal\n", + "\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "# limit the amount of information printed to screen\n", + "xr.set_options(display_expand_data=False)\n", + "np.set_printoptions(threshold=10, edgeitems=2)\n", + "\n", + "air = (\n", + " xr.tutorial.load_dataset(\"air_temperature\")\n", + " .air.sortby(\"lat\") # np.interp needs coordinate in ascending order\n", + " .isel(time=slice(4), lon=slice(3))\n", + ") # choose a small subset for convenience\n", + "air" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "newlat = np.linspace(15, 75, 100)\n", + "air.interp(lat=newlat)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's define a function that works with one vector of data along `lat` at a time." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def interp1d_np(data, x, xi):\n", + " return np.interp(xi, x, data)\n", + "\n", + "\n", + "interped = interp1d_np(air.isel(time=0, lon=0), air.lat, newlat)\n", + "expected = air.interp(lat=newlat)\n", + "\n", + "# no errors are raised if values are equal to within floating point precision\n", + "np.testing.assert_allclose(expected.isel(time=0, lon=0).values, interped)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "No errors are raised so our interpolation is working.\n", + "\n", + "This function consumes and returns numpy arrays, which means we need to do a lot of work to convert the result back to an xarray object with meaningful metadata. This is where `apply_ufunc` is very useful.\n", + "\n", + "## `apply_ufunc`\n", + "\n", + " Apply a vectorized function for unlabeled arrays on xarray objects.\n", + "\n", + " The function will be mapped over the data variable(s) of the input arguments using \n", + " xarray’s standard rules for labeled computation, including alignment, broadcasting, \n", + " looping over GroupBy/Dataset variables, and merging of coordinates.\n", + " \n", + "`apply_ufunc` has many capabilities but for simplicity this example will focus on the common task of vectorizing 1D functions over nD xarray objects. We will iteratively build up the right set of arguments to `apply_ufunc` and read through many error messages in doing so." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "xr.apply_ufunc(\n", + " interp1d_np, # first the function\n", + " air.isel(time=0, lon=0), # now arguments in the order expected by 'interp1_np'\n", + " air.lat,\n", + " newlat,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`apply_ufunc` needs to know a lot of information about what our function does so that it can reconstruct the outputs. In this case, the size of dimension lat has changed and we need to explicitly specify that this will happen. xarray helpfully tells us that we need to specify the kwarg `exclude_dims`." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## `exclude_dims`\n", + "\n", + "\n", + "```\n", + "exclude_dims : set, optional\n", + " Core dimensions on the inputs to exclude from alignment and\n", + " broadcasting entirely. Any input coordinates along these dimensions\n", + " will be dropped. Each excluded dimension must also appear in\n", + " ``input_core_dims`` for at least one argument. Only dimensions listed\n", + " here are allowed to change size between input and output objects.\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "xr.apply_ufunc(\n", + " interp1d_np, # first the function\n", + " air.isel(time=0, lon=0), # now arguments in the order expected by 'interp1_np'\n", + " air.lat,\n", + " newlat,\n", + " exclude_dims=set((\"lat\",)), # dimensions allowed to change size. Must be set!\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Core dimensions\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Core dimensions are central to using `apply_ufunc`. In our case, our function expects to receive a 1D vector along `lat` — this is the dimension that is \"core\" to the function's functionality. Multiple core dimensions are possible. `apply_ufunc` needs to know which dimensions of each variable are core dimensions.\n", + "\n", + " input_core_dims : Sequence[Sequence], optional\n", + " List of the same length as ``args`` giving the list of core dimensions\n", + " on each input argument that should not be broadcast. By default, we\n", + " assume there are no core dimensions on any input arguments.\n", + "\n", + " For example, ``input_core_dims=[[], ['time']]`` indicates that all\n", + " dimensions on the first argument and all dimensions other than 'time'\n", + " on the second argument should be broadcast.\n", + "\n", + " Core dimensions are automatically moved to the last axes of input\n", + " variables before applying ``func``, which facilitates using NumPy style\n", + " generalized ufuncs [2]_.\n", + " \n", + " output_core_dims : List[tuple], optional\n", + " List of the same length as the number of output arguments from\n", + " ``func``, giving the list of core dimensions on each output that were\n", + " not broadcast on the inputs. By default, we assume that ``func``\n", + " outputs exactly one array, with axes corresponding to each broadcast\n", + " dimension.\n", + "\n", + " Core dimensions are assumed to appear as the last dimensions of each\n", + " output in the provided order.\n", + " \n", + "Next we specify `\"lat\"` as `input_core_dims` on both `air` and `air.lat`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "xr.apply_ufunc(\n", + " interp1d_np, # first the function\n", + " air.isel(time=0, lon=0), # now arguments in the order expected by 'interp1_np'\n", + " air.lat,\n", + " newlat,\n", + " input_core_dims=[[\"lat\"], [\"lat\"], []],\n", + " exclude_dims=set((\"lat\",)), # dimensions allowed to change size. Must be set!\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "xarray is telling us that it expected to receive back a numpy array with 0 dimensions but instead received an array with 1 dimension corresponding to `newlat`. We can fix this by specifying `output_core_dims`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "xr.apply_ufunc(\n", + " interp1d_np, # first the function\n", + " air.isel(time=0, lon=0), # now arguments in the order expected by 'interp1_np'\n", + " air.lat,\n", + " newlat,\n", + " input_core_dims=[[\"lat\"], [\"lat\"], []], # list with one entry per arg\n", + " output_core_dims=[[\"lat\"]],\n", + " exclude_dims=set((\"lat\",)), # dimensions allowed to change size. Must be set!\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally we get some output! Let's check that this is right\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "interped = xr.apply_ufunc(\n", + " interp1d_np, # first the function\n", + " air.isel(time=0, lon=0), # now arguments in the order expected by 'interp1_np'\n", + " air.lat,\n", + " newlat,\n", + " input_core_dims=[[\"lat\"], [\"lat\"], []], # list with one entry per arg\n", + " output_core_dims=[[\"lat\"]],\n", + " exclude_dims=set((\"lat\",)), # dimensions allowed to change size. Must be set!\n", + ")\n", + "interped[\"lat\"] = newlat # need to add this manually\n", + "xr.testing.assert_allclose(expected.isel(time=0, lon=0), interped)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "No errors are raised so it is right!" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Automatic vectorization with `np.vectorize`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now our function currently only works on one vector of data which is not so useful given our 3D dataset.\n", + "Let's try passing the whole dataset. We add a `print` statement so we can see what our function receives." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "def interp1d_np(data, x, xi):\n", + " print(f\"data: {data.shape} | x: {x.shape} | xi: {xi.shape}\")\n", + " return np.interp(xi, x, data)\n", + "\n", + "\n", + "interped = xr.apply_ufunc(\n", + " interp1d_np, # first the function\n", + " air.isel(lon=slice(3), time=slice(4)), # now arguments in the order expected by 'interp1_np'\n", + " air.lat,\n", + " newlat,\n", + " input_core_dims=[[\"lat\"], [\"lat\"], []], # list with one entry per arg\n", + " output_core_dims=[[\"lat\"]],\n", + " exclude_dims=set((\"lat\",)), # dimensions allowed to change size. Must be set!\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "That's a hard-to-interpret error but our `print` call helpfully printed the shapes of the input data: \n", + "\n", + " data: (10, 53, 25) | x: (25,) | xi: (100,)\n", + "\n", + "We see that `air` has been passed as a 3D numpy array which is not what `np.interp` expects. Instead we want loop over all combinations of `lon` and `time`; and apply our function to each corresponding vector of data along `lat`.\n", + "\n", + "\n", + "`apply_ufunc` makes this easy by specifying `vectorize=True`:\n", + "\n", + " vectorize : bool, optional\n", + " If True, then assume ``func`` only takes arrays defined over core\n", + " dimensions as input and vectorize it automatically with\n", + " :py:func:`numpy.vectorize`. This option exists for convenience, but is\n", + " almost always slower than supplying a pre-vectorized function.\n", + " Using this option requires NumPy version 1.12 or newer.\n", + " \n", + "```{caution}\n", + "The documentation for [`np.vectorize`](https://numpy.org/doc/stable/reference/generated/numpy.vectorize.html) points out that\n", + "\"The vectorize function is provided primarily for convenience, not for performance. The implementation is essentially a for loop.\"\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "def interp1d_np(data, x, xi):\n", + " print(f\"data: {data.shape} | x: {x.shape} | xi: {xi.shape}\")\n", + " return np.interp(xi, x, data)\n", + "\n", + "\n", + "interped = xr.apply_ufunc(\n", + " interp1d_np, # first the function\n", + " air, # now arguments in the order expected by 'interp1_np'\n", + " air.lat, # as above\n", + " newlat, # as above\n", + " input_core_dims=[[\"lat\"], [\"lat\"], []], # list with one entry per arg\n", + " output_core_dims=[[\"lat\"]], # returned data has one dimension\n", + " exclude_dims=set((\"lat\",)), # dimensions allowed to change size. Must be set!\n", + " vectorize=True, # loop over non-core dims\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This unfortunately is another cryptic error from numpy. \n", + "\n", + "Notice that `newlat` is not an xarray object. Let's add a dimension name `new_lat` and modify the call. Note this cannot be `lat` because xarray expects dimensions to be the same size (or broadcastable) among all inputs. `output_core_dims` needs to be modified appropriately. We'll manually rename `new_lat` back to `lat` for easy checking." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def interp1d_np(data, x, xi):\n", + " print(f\"data: {data.shape} | x: {x.shape} | xi: {xi.shape}\")\n", + " return np.interp(xi, x, data)\n", + "\n", + "\n", + "interped = xr.apply_ufunc(\n", + " interp1d_np, # first the function\n", + " air, # now arguments in the order expected by 'interp1_np'\n", + " air.lat, # as above\n", + " newlat, # as above\n", + " input_core_dims=[[\"lat\"], [\"lat\"], [\"new_lat\"]], # list with one entry per arg\n", + " output_core_dims=[[\"new_lat\"]], # returned data has one dimension\n", + " exclude_dims=set((\"lat\",)), # dimensions allowed to change size. Must be a set!\n", + " vectorize=True, # loop over non-core dims\n", + ")\n", + "interped = interped.rename({\"new_lat\": \"lat\"})\n", + "interped[\"lat\"] = newlat # need to add this manually\n", + "xr.testing.assert_allclose(\n", + " expected.transpose(*interped.dims), interped\n", + ") # order of dims is different\n", + "interped" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice that the printed input shapes are all 1D and correspond to one vector along the `lat` dimension.\n", + "\n", + "The result is now an xarray object with coordinate values copied over from `data`. This is why `apply_ufunc` is so convenient; it takes care of a lot of boilerplate necessary to apply functions that consume and produce numpy arrays to xarray objects.\n", + "\n", + "One final point: `lat` is now the *last* dimension in `interped`. This is a \"property\" of core dimensions: they are moved to the end before being sent to `interp1d_np` as was noted in the docstring for `input_core_dims`\n", + "\n", + " Core dimensions are automatically moved to the last axes of input\n", + " variables before applying ``func``, which facilitates using NumPy style\n", + " generalized ufuncs [2]_." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Parallelization with dask\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "So far our function can only handle numpy arrays. A real benefit of `apply_ufunc` is the ability to easily parallelize over dask chunks _when needed_. \n", + "\n", + "We want to apply this function in a vectorized fashion over each chunk of the dask array. This is possible using dask's `blockwise`, `map_blocks`, or `apply_gufunc`. Xarray's `apply_ufunc` wraps dask's `apply_gufunc` and asking it to map the function over chunks using `apply_gufunc` is as simple as specifying `dask=\"parallelized\"`. With this level of flexibility we need to provide dask with some extra information: \n", + " 1. `output_dtypes`: dtypes of all returned objects, and \n", + " 2. `output_sizes`: lengths of any new dimensions. \n", + " \n", + "Here we need to specify `output_dtypes` since `apply_ufunc` can infer the size of the new dimension `new_lat` from the argument corresponding to the third element in `input_core_dims`. \n", + "\n", + "Here I choose the chunk sizes to illustrate that `np.vectorize` is still applied so that our function receives 1D vectors even though the blocks are 3D." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def interp1d_np(data, x, xi):\n", + " print(f\"data: {data.shape} | x: {x.shape} | xi: {xi.shape}\")\n", + " return np.interp(xi, x, data)\n", + "\n", + "\n", + "interped = xr.apply_ufunc(\n", + " interp1d_np, # first the function\n", + " air.chunk({\"time\": 2, \"lon\": 2}), # now arguments in the order expected by 'interp1_np'\n", + " air.lat, # as above\n", + " newlat, # as above\n", + " input_core_dims=[[\"lat\"], [\"lat\"], [\"new_lat\"]], # list with one entry per arg\n", + " output_core_dims=[[\"new_lat\"]], # returned data has one dimension\n", + " exclude_dims=set((\"lat\",)), # dimensions allowed to change size. Must be a set!\n", + " vectorize=True, # loop over non-core dims\n", + " dask=\"parallelized\",\n", + " output_dtypes=[air.dtype], # one per output\n", + ").rename({\"new_lat\": \"lat\"})\n", + "interped[\"lat\"] = newlat # need to add this manually\n", + "xr.testing.assert_allclose(expected.transpose(*interped.dims), interped)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Yay! our function is receiving 1D vectors, so we've successfully parallelized applying a 1D function over a block. If you have a distributed dashboard up, you should see computes happening as equality is checked.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## High performance vectorization: gufuncs, numba & guvectorize\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "`np.vectorize` is a very convenient function but is unfortunately slow. It is only marginally faster than writing a for loop in Python and looping. A common way to get around this is to write a base interpolation function that can handle nD arrays in a compiled language like Fortran and then pass that to `apply_ufunc`.\n", + "\n", + "Another option is to use the numba package which provides a very [convenient `guvectorize` decorator](https://numba.readthedocs.io/en/stable/user/vectorize.html#the-guvectorize-decorator). Any decorated function gets compiled and will loop over any non-core dimension in parallel when necessary. \n", + "\n", + "We need to specify some extra information:\n", + "\n", + " 1. Our function cannot return a variable any more. Instead it must receive a variable (the last argument) whose contents the function will modify. So we change from `def interp1d_np(data, x, xi)` to `def interp1d_np_gufunc(data, x, xi, out)`. Our computed results must be assigned to `out`. All values of `out` must be assigned explicitly.\n", + " \n", + " 2. `guvectorize` needs to know the dtypes of the input and output. This is specified in string form as the first argument. Each element of the tuple corresponds to each argument of the function. In this case, we specify `float64` for all inputs and outputs: `\"(float64[:], float64[:], float64[:], float64[:])\"` corresponding to `data, x, xi, out`\n", + " \n", + " 3. Now we need to tell numba the size of the dimensions the function takes as inputs and returns as output i.e. _core dimensions_. This is done in symbolic form i.e. `data` and `x` are vectors of the same length, say `n`; `xi` and the output `out` have a different length, say `m`. So the second argument is (again as a string)\n", + " `\"(n), (n), (m) -> (m).\"` corresponding again to `data, x, xi, out`\n", + " \n", + "```{seealso}\n", + "\n", + "Read the [numba documentation](https://numba.readthedocs.io/en/stable/user/vectorize.html#the-guvectorize-decorator) for more details.\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from numba import float64, guvectorize\n", + "\n", + "\n", + "@guvectorize(\"(float64[:], float64[:], float64[:], float64[:])\", \"(n), (n), (m) -> (m)\")\n", + "def interp1d_np_gufunc(data, x, xi, out):\n", + " # numba doesn't really like this.\n", + " print(\"data: \" + str(data.shape) + \" | x:\" + str(x.shape) + \" | xi: \" + str(xi.shape))\n", + " out[:] = np.interp(xi, x, data)\n", + " # gufuncs don't return data\n", + " # instead you assign to a the last arg\n", + " # return np.interp(xi, x, data)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "The warnings are about [object-mode compilation](https://numba.readthedocs.io/en/stable/user/performance-tips.html) relating to the `print` statement. This means we don't get much speed up. We'll keep the `print` statement temporarily to make sure that `guvectorize` acts like we want it to." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "interped = xr.apply_ufunc(\n", + " interp1d_np_gufunc, # first the function\n", + " air.chunk({\"time\": 2, \"lon\": 2}), # now arguments in the order expected by 'interp1_np'\n", + " air.lat, # as above\n", + " newlat, # as above\n", + " input_core_dims=[[\"lat\"], [\"lat\"], [\"new_lat\"]], # list with one entry per arg\n", + " output_core_dims=[[\"new_lat\"]], # returned data has one dimension\n", + " exclude_dims=set((\"lat\",)), # dimensions allowed to change size. Must be a set!\n", + " # vectorize=True, # not needed since numba takes care of vectorizing\n", + " dask=\"parallelized\",\n", + " output_dtypes=[air.dtype], # one per output\n", + ").rename({\"new_lat\": \"lat\"})\n", + "interped[\"lat\"] = newlat # need to add this manually\n", + "xr.testing.assert_allclose(expected.transpose(*interped.dims), interped)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "Yay! Our function is receiving 1D vectors and is working automatically with dask arrays. \n", + "\n", + "Finally let's comment out the print line and wrap everything up in a nice reusable function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from numba import float64, guvectorize\n", + "\n", + "\n", + "@guvectorize(\n", + " \"(float64[:], float64[:], float64[:], float64[:])\",\n", + " \"(n), (n), (m) -> (m)\",\n", + " nopython=True,\n", + ")\n", + "def interp1d_np_gufunc(data, x, xi, out):\n", + " out[:] = np.interp(xi, x, data)\n", + "\n", + "\n", + "def xr_interp(data, dim, newdim):\n", + " interped = xr.apply_ufunc(\n", + " interp1d_np_gufunc, # first the function\n", + " data, # now arguments in the order expected by 'interp1_np'\n", + " data[dim], # as above\n", + " newdim, # as above\n", + " input_core_dims=[[dim], [dim], [\"__newdim__\"]], # list with one entry per arg\n", + " output_core_dims=[[\"__newdim__\"]], # returned data has one dimension\n", + " exclude_dims=set((dim,)), # dimensions allowed to change size. Must be a set!\n", + " # vectorize=True, # not needed since numba takes care of vectorizing\n", + " dask=\"parallelized\",\n", + " output_dtypes=[data.dtype], # one per output; could also be float or np.dtype(\"float64\")\n", + " ).rename({\"__newdim__\": dim})\n", + " interped[dim] = newdim # need to add this manually\n", + "\n", + " return interped\n", + "\n", + "\n", + "xr.testing.assert_allclose(\n", + " expected.transpose(*interped.dims),\n", + " xr_interp(air.chunk({\"time\": 2, \"lon\": 2}), \"lat\", newlat),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Summary\n", + "\n", + "This technique is generalizable to any 1D function that [can be compiled](https://numba.readthedocs.io/en/stable/reference/pysupported.html#pysupported) by Numba." + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + }, + "nbsphinx": { + "allow_errors": true + }, + "org": null, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": false, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/advanced/apply_ufunc/numba-vectorization.ipynb b/advanced/apply_ufunc/numba-vectorization.ipynb new file mode 100644 index 00000000..3da709c5 --- /dev/null +++ b/advanced/apply_ufunc/numba-vectorization.ipynb @@ -0,0 +1,292 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": { + "tags": [] + }, + "source": [ + "# Fast vectorization with Numba\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": { + "tags": [] + }, + "source": [ + "`np.vectorize` is a very convenient function but is unfortunately slow. It is only marginally faster than writing a for loop in Python and looping. \n", + "\n", + "A common way to get around this is to write a base interpolation function that can handle nD arrays in a compiled language like C or Fortran and then pass that to `apply_ufunc`.\n", + "\n", + "Another option is to use the [numba package](https://numba.pydata.org/) which provides two very convenient decorators to build [numpy universal functions or ufuncs](https://numba.readthedocs.io/en/stable/user/vectorize.html):\n", + "1. [`vectorize`](https://numba.readthedocs.io/en/stable/user/vectorize.html#the-vectorize-decorator) for functions that act on scalars, and \n", + "2. [`guvectorize`](https://numba.readthedocs.io/en/stable/user/vectorize.html#the-guvectorize-decorator) for functions that operates on subsets of the array along core-dimensions. Any decorated function gets compiled and will loop over the loop dimensions in parallel when necessary. \n", + "\n", + "For `apply_ufunc` the key concept is that we must provide `vectorize=False` (the default) when using Numba vectorized functions. \n", + "Numba handles the vectorization (or looping) and `apply_ufunc` handles converting Xarray objects to bare arrays and handling metadata." + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "## Load data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%xmode minimal\n", + "\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "da = xr.DataArray(\n", + " np.arange(12).reshape(3, 4),\n", + " dims=(\"x\", \"y\"),\n", + " coords={\"x\": [12, 13, 14]},\n", + " attrs={\"foo\": \"bar\"},\n", + ")\n", + "da" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "## `vectorize`\n", + "\n", + "Our `squared_error` example from earlier works element-by-element, and is a great example for `vectorize`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from numba import float64, vectorize\n", + "\n", + "\n", + "@vectorize([float64(float64, float64)])\n", + "def squared_error(x, y):\n", + " return (x - y) ** 2" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "See the numba documentation to understand `@vectorize([float64(float64, float64)])`\n", + "\n", + "Now use `apply_ufunc` to apply it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "xr.apply_ufunc(squared_error, da, 1)" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "## `guvectorize`\n", + "\n", + "`guvectorize` is for functions that work on small subsets of the data. Quoting the Numba documentation\n", + "> While `vectorize()` allows you to write ufuncs that work on one element at a time, the `guvectorize()` decorator takes the concept one step further and allows you to write ufuncs that will work on an arbitrary number of elements of input arrays, and take and return arrays of differing dimensions. The typical example is a running median or a convolution filter.\n", + "\n", + "This description should remind you of `apply_ufunc`!\n", + "\n", + "We will use the example function `g` from the [numba docs](https://numba.readthedocs.io/en/stable/user/vectorize.html#the-guvectorize-decorator), which adds a scalar `y` to a 1D vector `x`. The `res` argument here will contain the output (this is a Numba detail).\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from numba import guvectorize, int64\n", + "\n", + "\n", + "@guvectorize([(int64[:], int64, int64[:])], \"(n),()->(n)\")\n", + "def g(x, y, res):\n", + " for i in range(x.shape[0]):\n", + " res[i] = x[i] + y\n", + "\n", + "\n", + "a = np.arange(5)\n", + "g(a, 2)" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "Unlike `squared_error` we cannot pass an Xarray object to `g` directly." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "g(da, 1)" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "Now use `apply_ufunc`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "xr.apply_ufunc(\n", + " g,\n", + " da,\n", + " 1,\n", + " input_core_dims=[[\"x\"], []],\n", + " output_core_dims=[[\"x\"]],\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "14", + "metadata": {}, + "source": [ + "Notice the following:\n", + "1. The `guvectorize` decorator includes the concept of \"core dimensions\": `'(n),()->(n)'`. This string means that the `g` takes a 1D vector of size `n`, a scalar, and returns a 1D vector of size `n`. There is one core dimension for the input, and one core dimension for the output. Both core dimensions have the same size.\n", + "2. That string translates to `input_core_dims=[[\"x\"], []], output_core_dims=[[\"x\"]]` in `apply_ufunc`.\n", + "3. We don't provide `vectorize=True` to `apply_ufunc` since `numba` will handle the vectorization in compiled code automatically." + ] + }, + { + "cell_type": "markdown", + "id": "15", + "metadata": {}, + "source": [ + "## With dask\n" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": {}, + "source": [ + "Use the chunked DataArray" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "da_dask = da.chunk({\"y\": 1})\n", + "da_dask" + ] + }, + { + "cell_type": "markdown", + "id": "18", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Apply `g` to `da_dask`\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "xr.apply_ufunc(\n", + " g,\n", + " da_dask, \n", + " 1, \n", + " input_core_dims=[[\"x\"], []], \n", + " output_core_dims=[[\"x\"]],\n", + " dask=\"parallelized\",\n", + ")\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "## Next\n", + "\n", + "For more, see the numpy.interp end-to-end example in the left sidebar." + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/advanced/apply_ufunc/simple_numpy_apply_ufunc.ipynb b/advanced/apply_ufunc/simple_numpy_apply_ufunc.ipynb new file mode 100644 index 00000000..4305f936 --- /dev/null +++ b/advanced/apply_ufunc/simple_numpy_apply_ufunc.ipynb @@ -0,0 +1,432 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": { + "tags": [] + }, + "source": [ + "(gentle-intro)=\n", + "# A gentle introduction\n", + "\n", + "Many, but not all, useful array methods are wrapped by Xarray and accessible\n", + "as methods on Xarray objects. For example `DataArray.mean` calls `numpy.nanmean`.\n", + "A very common use-case is to apply functions that expect and return NumPy \n", + "(or other array types) on Xarray objects. For example, this would include all of SciPy's API. \n", + "Applying many of these functions to Xarray object involves a series of repeated steps.\n", + "`apply_ufunc` provides a convenient wrapper function that generalizes the steps\n", + "involved in applying such functions to Xarray objects.\n", + "\n", + "```{tip}\n", + "Xarray uses `apply_ufunc` internally to implement much of its API, meaning that it is quite powerful!\n", + "```\n", + "\n", + "Our goals are to learn that `apply_ufunc` automates aspects of applying computation functions that are designed for pure arrays (like numpy arrays) on xarray objects including\n", + "- Propagating dimension names, coordinate variables, and (optionally) attributes.\n", + "- Handle Dataset input by looping over data variables.\n", + "- Allow passing arbitrary positional and keyword arguments\n", + "\n", + "\n", + "```{tip}\n", + "We'll reduce the length of error messages using `%xmode minimal` See the [ipython documentation](https://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-xmode) for details.\n", + "```\n", + "\n", + "\n", + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "%xmode minimal\n", + "\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "# limit the amount of information printed to screen\n", + "xr.set_options(display_expand_data=False)\n", + "np.set_printoptions(threshold=10, edgeitems=2)" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "Let's load a dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.load_dataset(\"air_temperature\")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": { + "tags": [] + }, + "source": [ + "## A simple example: pure numpy\n", + "\n", + "Simple functions that act independently on each value should work without any\n", + "additional arguments. \n", + "\n", + "Consider the following `squared_error` function" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "def squared_error(x, y):\n", + " return (x - y) ** 2" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "````{tip}\n", + "\n", + "This function uses only arithmetic operations. For such simple functions, you can pass Xarray objects directly and receive Xarray objects back.\n", + "Try\n", + "```python\n", + "squared_error(ds.air, 1)\n", + "```\n", + "\n", + "We use it here as a very simple example\n", + "````" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "We can apply `squared_error` manually by extracting the underlying numpy array" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "numpy_result = squared_error(ds.air.data, 1)\n", + "numpy_result" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "To convert this result to a DataArray, we could do it manually" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "xr.DataArray(\n", + " data=numpy_result,\n", + " # propagate all the Xarray metadata manually\n", + " dims=ds.air.dims,\n", + " coords=ds.air.coords,\n", + " attrs=ds.air.attrs,\n", + " name=ds.air.name,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "A shorter version uses [DataArray.copy](https://docs.xarray.dev/en/stable/generated/xarray.DataArray.copy.html)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.copy(data=numpy_result)" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": { + "tags": [] + }, + "source": [ + "```{caution}\n", + "Using `DataArray.copy` works for such simple cases but doesn't generalize that well. \n", + "\n", + "For example, consider a function that removed one dimension and added a new dimension.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "14", + "metadata": { + "tags": [] + }, + "source": [ + "## apply_ufunc\n", + "\n", + "`apply_ufunc` can handle more complicated functions. Here's how to use it with `squared_error`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "xr.apply_ufunc(squared_error, ds.air, 1)" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": { + "tags": [] + }, + "source": [ + "## How does apply_ufunc work?\n", + "\n", + "\n", + "This line\n", + "```python\n", + "xr.apply_ufunc(squared_error, ds.air, 1)\n", + "```\n", + "is equivalent to `squared_error(ds.air.data, 1)` with automatic propagation of xarray metadata like dimension names, coordinate values etc.\n", + "\n", + "\n", + "To illustrate how `apply_ufunc` works, let us write a small wrapper function. This will let us examine what data is received and returned from the applied function. \n", + "\n", + "```{tip}\n", + "This trick is very useful for debugging\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "def wrapper(x, y):\n", + " print(f\"received x of type {type(x)}, shape {x.shape}\")\n", + " print(f\"received y of type {type(y)}\")\n", + " return squared_error(x, y)\n", + "\n", + "\n", + "xr.apply_ufunc(wrapper, ds.air, 1)" + ] + }, + { + "cell_type": "markdown", + "id": "18", + "metadata": { + "tags": [] + }, + "source": [ + "We see that `wrapper` receives the underlying numpy array (`ds.air.data`), and the integer `1`. \n", + "\n", + "Essentially, `apply_ufunc` does the following:\n", + "1. extracts the underlying array data (`.data`), \n", + "2. passes it to the user function, \n", + "3. receives the returned values, and \n", + "4. then wraps that back up as a DataArray\n", + "\n", + "```{tip}\n", + "`apply_ufunc` always takes in at least one DataArray or Dataset and returns one DataArray or Dataset\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "## Handling attributes\n", + "\n", + "By default, attributes are omitted since they may now be inaccurate" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "result = xr.apply_ufunc(wrapper, ds.air, 1)\n", + "result.attrs" + ] + }, + { + "cell_type": "markdown", + "id": "21", + "metadata": {}, + "source": [ + "To propagate attributes, pass `keep_attrs=True`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "result = xr.apply_ufunc(wrapper, ds.air, 1, keep_attrs=True)\n", + "result.attrs" + ] + }, + { + "cell_type": "markdown", + "id": "23", + "metadata": { + "tags": [] + }, + "source": [ + "## Handling datasets\n", + "\n", + "`apply_ufunc` easily handles both DataArrays and Datasets. \n", + "\n", + "When passed a Dataset, `apply_ufunc` will loop over the data variables and sequentially pass those to `squared_error`.\n", + "\n", + "So `squared_error` always receives a _single_ numpy array.\n", + "\n", + "To illustrate that lets create a new `Dataset` with two arrays. We'll create a new array `air2` that is 2D `time, lat`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ds2 = ds.copy()\n", + "ds2[\"air2\"] = ds2.air.isel(lon=0) ** 2" + ] + }, + { + "cell_type": "markdown", + "id": "25", + "metadata": {}, + "source": [ + "We see that `wrapper` is called twice" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": {}, + "outputs": [], + "source": [ + "xr.apply_ufunc(wrapper, ds2, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27", + "metadata": {}, + "outputs": [], + "source": [ + "xr.apply_ufunc(squared_error, ds2, 1)" + ] + }, + { + "cell_type": "markdown", + "id": "28", + "metadata": { + "tags": [] + }, + "source": [ + "## Passing positional and keyword arguments\n", + "\n", + "```{seealso}\n", + "See the Python tutorial on [defining functions](https://docs.python.org/3/tutorial/controlflow.html#defining-functions) for more on positional and keyword arguments.\n", + "```\n", + "\n", + "`squared_error` takes two arguments named `x` and `y`.\n", + "\n", + "In `xr.apply_ufunc(squared_error, ds.air, 1)`, the value of `1` for `y` was passed positionally. \n", + "\n", + "to use the keyword argument form, pass it using the `kwargs` keyword argument to `apply_ufunc`\n", + "> kwargs (dict, optional) – Optional keyword arguments passed directly on to call func." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "xr.apply_ufunc(squared_error, ds.air, kwargs={\"y\": 1})" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/advanced/backends/1.Backend_without_Lazy_Loading.ipynb b/advanced/backends/1.Backend_without_Lazy_Loading.ipynb new file mode 100644 index 00000000..e396d869 --- /dev/null +++ b/advanced/backends/1.Backend_without_Lazy_Loading.ipynb @@ -0,0 +1,180 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Binary data without lazy loading\n", + "\n", + "\n", + "**Author**: Aureliana Barghini ([B-Open](https://www.bopen.eu/))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## BackendEntrypoint\n", + "Implement a subclass of `BackendEntrypoint` that expose a method `open_dataset`:\n", + "\n", + "```python\n", + "from xarray.backends import BackendEntrypoint\n", + "\n", + "class MyBackendEntrypoint(BackendEntrypoint):\n", + " def open_dataset(\n", + " self,\n", + " filename_or_obj,\n", + " *,\n", + " drop_variables=None,\n", + " ):\n", + "\n", + " return my_open_dataset(filename_or_obj, drop_variables=drop_variables)\n", + "\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## BackendEntrypoint integration\n", + "Declare this class as an external plugin in your `setup.py`:\n", + "\n", + "```python\n", + "setuptools.setup(\n", + " entry_points={\n", + " 'xarray.backends': ['engine_name=package.module:my_backendentrypoint'],\n", + " },\n", + ")\n", + "```\n", + "or pass it in `xr.open_dataset`:\n", + "\n", + "```python\n", + "xr.open_dataset(filename, engine=MyBackendEntrypoint)\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example backend for binary files" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import xarray as xr" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create sample files" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr = np.arange(30000000, dtype=np.int64)\n", + "with open(\"foo.bin\", \"w\") as f:\n", + " arr.tofile(f)\n", + "\n", + "arr = np.arange(30000000, dtype=np.float64)\n", + "with open(\"foo_float.bin\", \"w\") as f:\n", + " arr.tofile(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define the entrypoint\n", + "Example of backend to open binary files" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class BinaryBackend(xr.backends.BackendEntrypoint):\n", + " def open_dataset(\n", + " self,\n", + " filename_or_obj,\n", + " *,\n", + " drop_variables=None,\n", + " # backend specific parameter\n", + " dtype=np.int64,\n", + " ):\n", + " with open(filename_or_obj) as f:\n", + " arr = np.fromfile(f, dtype)\n", + "\n", + " var = xr.Variable(dims=(\"x\"), data=arr)\n", + " coords = {\"x\": np.arange(arr.size) * 10}\n", + " return xr.Dataset({\"foo\": var}, coords=coords)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### It Works! \n", + "But it may be memory demanding" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr = xr.open_dataarray(\"foo.bin\", engine=BinaryBackend)\n", + "arr" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr = xr.open_dataarray(\"foo_float.bin\", engine=BinaryBackend, dtype=np.float64)\n", + "arr" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr.sel(x=slice(0, 100))" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/advanced/backends/2.Backend_with_Lazy_Loading.ipynb b/advanced/backends/2.Backend_with_Lazy_Loading.ipynb new file mode 100644 index 00000000..ce2fe9f8 --- /dev/null +++ b/advanced/backends/2.Backend_with_Lazy_Loading.ipynb @@ -0,0 +1,235 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Binary data with lazy loading\n", + "\n", + "**Author**: Aureliana Barghini ([B-Open](https://www.bopen.eu/))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you want to make your backend effective with big datasets, then you should\n", + "support lazy loading.
\n", + "For doing that you need:\n", + "- Implement `_raw_indexing_method` for reading blocks form disk

\n", + "- Implement some glue code to make it work with Xarray:

\n", + " - put your `_raw_indexing_method` in a `BackendArray` subclass

\n", + " - replace the `numpy.ndarray` inside your **dataset** with your subclass of `BackendArray`\n", + " \n", + " \n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create sample files" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "import dask\n", + "import numpy as np\n", + "import xarray as xr" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr = np.arange(30000000, dtype=np.int64)\n", + "with open(\"foo.bin\", \"w\") as f:\n", + " arr.tofile(f)\n", + "\n", + "arr = np.arange(30000000, dtype=np.float64)\n", + "with open(\"foo_float.bin\", \"w\") as f:\n", + " arr.tofile(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## BinaryBackendArray" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The BackendArray subclass shall implement the following method and attributes:\n", + "\n", + "- `_raw_indexing_method` method, supporting **item selection** and **slicing**\n", + "\n", + "- `__getitem__` that wraps `_raw_indexing_method` with an xarray helper function `explicit_indexing_adapter` (threadsafe)\n", + "\n", + "- `shape` attribute\n", + "\n", + "- `dtype` attribute.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class BinaryBackendArray(xr.backends.BackendArray):\n", + " def __init__(\n", + " self,\n", + " filename_or_obj,\n", + " shape,\n", + " dtype,\n", + " lock,\n", + " ):\n", + " self.filename_or_obj = filename_or_obj\n", + " self.shape = shape\n", + " self.dtype = dtype\n", + " self.lock = lock\n", + "\n", + " def __getitem__(self, key: tuple):\n", + " return xr.core.indexing.explicit_indexing_adapter(\n", + " key,\n", + " self.shape,\n", + " xr.core.indexing.IndexingSupport.BASIC,\n", + " self._raw_indexing_method,\n", + " )\n", + "\n", + " def _raw_indexing_method(self, key: tuple):\n", + " key0 = key[0]\n", + " size = np.dtype(self.dtype).itemsize\n", + "\n", + " if isinstance(key0, slice):\n", + " start = key0.start or 0\n", + " stop = key0.stop or self.shape[0]\n", + " offset = size * start\n", + " count = stop - start\n", + " else:\n", + " offset = size * key0\n", + " count = 1\n", + "\n", + " with self.lock, open(self.filename_or_obj) as f:\n", + " arr = np.fromfile(f, np.int64, offset=offset, count=count)\n", + "\n", + " if isinstance(key, int):\n", + " arr = arr.squeeze()\n", + "\n", + " return arr" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## BinaryBackend Entrypoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class BinaryBackend(xr.backends.BackendEntrypoint):\n", + " def open_dataset(self, filename_or_obj, *, drop_variables=None, dtype=np.int64):\n", + " size = np.dtype(dtype).itemsize\n", + " shape = os.stat(filename_or_obj).st_size // size\n", + "\n", + " backend_array = BinaryBackendArray(\n", + " filename_or_obj=filename_or_obj,\n", + " shape=(shape,),\n", + " dtype=dtype,\n", + " lock=dask.utils.SerializableLock(),\n", + " )\n", + " data = xr.core.indexing.LazilyIndexedArray(backend_array)\n", + "\n", + " var = xr.Variable(dims=(\"x\"), data=data)\n", + " return xr.Dataset({\"foo\": var})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Reduced memory usage with dask" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr = xr.open_dataarray(\"foo.bin\", engine=BinaryBackend, chunks=10000)\n", + "arr" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr.mean()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr.sel(x=slice(0, 10))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr.sel(x=slice(0, 10)).compute()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr.load()" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/advanced/backends/backends.md b/advanced/backends/backends.md new file mode 100644 index 00000000..d5b28a14 --- /dev/null +++ b/advanced/backends/backends.md @@ -0,0 +1,50 @@ +# Reading data using backends + +## Introduction + +You can [read different types of files](https://docs.xarray.dev/en/stable/user-guide/io.html) in `xr.open_dataset` by specifying the engine to be used: + +```python +import xarray as xr + +xr.open_dataset("my_file.grib", engine="cfgrib") +``` + +Navigating Xarray backends can be confusing, +so we recommend checking out [this flow chart](https://docs.xarray.dev/en/stable/user-guide/io.html) +to help you figure out which engine you need and how to use it. + +You can see what backends are currently available in your working environment +with `xarray.backends.list_engines()`. + +## Why use the Xarray backend API to write your own backend? + +- Your users don't need to learn a new interface; they can use `xr.open_dataset` with the `engine` kwarg. +- With little extra effort you can have lazy loading with Dask. Simply implement a function for reading blocks and Xarray will manage lazy loading with Dask for you. +- It's easy to implement: using the backend API (introduced in v0.18.0), you don't need to integrate any code in Xarray. + +## More Information + +See the [documentation](https://docs.xarray.dev/en/stable/internals/how-to-add-new-backend.html) for more details on adding and registering a new backend. + +Follow the tutorials on creating a new backend for binary files. + +```{tableofcontents} + +``` + +### Links to internal backends + +- [netcdf4](https://pypi.org/project/netCDF4/) - netCDF4 +- [scipy](https://scipy.org/) - netCDF3 +- [zarr](https://pypi.org/project/zarr/) - Zarr +- [pydap](https://pydap.github.io/pydap/) - Data Access Protocol (DAP/DODS/OPeNDAP) +- [h5netcdf](https://h5netcdf.org/) - hdf5 + +### Links to external backends (not comprehensive) + +- [cfgrib](https://github.com/ecmwf/cfgrib) - GRIB +- [tiledb](https://github.com/TileDB-Inc/TileDB-CF-Py) - TileDB +- [rioxarray](https://corteva.github.io/rioxarray/stable/) - GeoTIFF, JPEG-2000, ESRI-hdr, etc (via GDAL) +- [xarray-sentinel](https://github.com/bopen/xarray-sentinel) - Sentinel-1 SAFE +- ... diff --git a/advanced/backends/create_custom_backend.ipynb b/advanced/backends/create_custom_backend.ipynb new file mode 100644 index 00000000..6cf850ec --- /dev/null +++ b/advanced/backends/create_custom_backend.ipynb @@ -0,0 +1,304 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Create your own Xarray Backend\n", + "In this lesson, we will learn about and how to create your own custom xarray backend\n", + "\n", + ":::{admonition} Learning Goals\n", + "- Learn about xarray's support for custom backends\n", + "- Learn how to use a custom `imageio` backend to open and manipulate GIFs\n", + "- Learn how to extend the `imagegio` backend to write out a GIF\n", + ":::\n", + "\n", + "## Why should you create your own Xarray backend?\n", + "\n", + "- Allows you to use xarray's interface\n", + " - Attribute-like syntax, dict-like syntax and label based indexing\n", + "- You don’t need to integrate any code in Xarray\n", + "- Easy and fast!\n" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## Setting up the BackendEntrypoint\n", + "\n", + "To set up a `BackendEntrypoint` we can implement a subclass of `BackendEntrypoint` and expose the `open_dataset` method to it. For this tutorial we have the `ImageIOBackend` already defined but we will extend the functionally to write GIFS." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "image_path = \"io.gif\"" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "We can write a simple image reader function that we can then plug into our `MyBackendEntrypoint` class. For this example we are going to use `imageio` an image reader and writer library. With `imageio` you can read an image file with `iio.imopen`\n", + "\n", + ":::{note}\n", + "The `ImageIOBackend` also defines a `ImageIOBackendArray` with basic indexing.\n", + ":" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "import imageio as iio\n", + "from xarray.backends import BackendEntrypoint\n", + "\n", + "\n", + "def imageio_open(\n", + " filename_or_obj,\n", + "):\n", + " img = iio.imopen(filename_or_obj, io_mode=\"r\")\n", + " return img.read()\n", + "\n", + "\n", + "imageio_open(image_path)\n", + "\n", + "\n", + "class MyImageReader(BackendEntrypoint):\n", + " def open_dataset(\n", + " self,\n", + " filename_or_obj,\n", + " *,\n", + " drop_variables=None,\n", + " ):\n", + " return imageio_open(filename_or_obj)" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "## Reading image data\n", + "\n", + "Lets use our `ImageIOBackend` to open a GIF.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr\n", + "from imageio_ import ImageIOBackend\n", + "\n", + "gif_ds = xr.open_dataset(image_path, engine=ImageIOBackend)\n", + "gif_ds" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "### Examining our image dataset\n", + "\n", + "Since our image is a `Dataset` object we can use xarray's interface for `Dataset` objects.\n", + "\n", + "Let's try listing all of the variables, dimensions and selecting data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "gif_ds.variables" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "We can list our dimensions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "gif_ds.dims" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "Let's try getting our `DataArray`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "gif_ds[\"data\"]" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "## GIF metadata\n", + "We can examine, update and add metadata to our `Dataset` object. \n", + "\n", + "We can examine the attributes in our GIF \"data\" variable with the `.attrs` method" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "gif_ds.data.attrs" + ] + }, + { + "cell_type": "markdown", + "id": "15", + "metadata": {}, + "source": [ + "## Exercise" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Can you add a new attribute to our GIF \"data\" variable called \"fps\". This is the frames per second we can write our GIF to. You can set it to any value.\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "gif_ds.data.attrs['fps'] = 100\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "id": "17", + "metadata": {}, + "source": [ + "### GIF writer\n", + "We can extend our backend with an GIF writer. Here we use `matplotlib`'s animation functions and `PillowWriter`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.animation as animation\n", + "import matplotlib.pyplot as plt\n", + "from imageio_ import ImageIOBackend\n", + "from matplotlib.animation import PillowWriter\n", + "\n", + "\n", + "class SimpleImageWriter(ImageIOBackend):\n", + " def to_giff(\n", + " self,\n", + " dataset,\n", + " variable,\n", + " time_dim,\n", + " out_filename,\n", + " **kwargs,\n", + " ):\n", + " fig, ax = plt.subplots()\n", + "\n", + " frames = []\n", + " variable_da = dataset[variable]\n", + "\n", + " for time in variable_da[time_dim]:\n", + " variable_da = variable_da.transpose(\"time\", \"width\", \"height\", \"color\")\n", + " to_plot = ax.pcolormesh(\n", + " variable_da.height,\n", + " variable_da.width,\n", + " variable_da.sel(time=time),\n", + " animated=True,\n", + " shading=\"auto\",\n", + " **kwargs,\n", + " )\n", + "\n", + " frames.append([to_plot])\n", + "\n", + " try:\n", + " writer = PillowWriter(fps=variable_da.attrs[\"fps\"], **kwargs)\n", + " except KeyError:\n", + " writer = PillowWriter(fps=50, **kwargs)\n", + "\n", + " ani = animation.ArtistAnimation(fig, frames, blit=True, repeat=True)\n", + " ani.save(filename=out_filename, writer=writer)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19", + "metadata": {}, + "outputs": [], + "source": [ + "img_writer = SimpleImageWriter()\n", + "img_writer.to_giff(gif_ds.compute(), \"data\", \"time\", \"io_writer.gif\")" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/advanced/backends/imageio_.py b/advanced/backends/imageio_.py new file mode 100644 index 00000000..95c33e1f --- /dev/null +++ b/advanced/backends/imageio_.py @@ -0,0 +1,119 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING + +import numpy as np +import pandas as pd +import xarray as xr + +if TYPE_CHECKING: + import os + from typing import Any, Literal, Protocol + + import numpy.typing as npt + + class FileLike(Protocol): ... + + class LockType(Protocol): + def __enter__(self) -> Any: ... + + def acquire(self, blocking: bool = True, timeout: int = -1) -> bool: ... + def release(self) -> None: ... + + IndexerType = int | slice | npt.NDArray[np.integer] + FilenameOrObjectType = str | os.PathLike | bytes | FileLike + + +@dataclass +class ImageIOBackendArray(xr.backends.BackendArray): + filename_or_obj: FilenameOrObjectType + + shape: tuple[int] + dtype: npt.DtypeLike + + lock: LockType + + def __getitem__(self, key: tuple[IndexerType]): + return xr.core.indexing.explicit_indexing_adapter( + key, + self.shape, + xr.core.indexing.IndexingSupport.BASIC, + self.basic_indexing, + ) + + def basic_indexing(self, key: tuple[IndexerType]) -> npt.NDArray: + import imageio.v3 as iio + + with self.lock, iio.imopen(self.filename_or_obj, io_mode="r") as f: + if key == (slice(None),) * len(self.shape): + return f.read() + + first_indexer = key[0] + if isinstance(first_indexer, int): + data = f.read(index=first_indexer, mode="P", writable=True) + + remaining_indexers = key[1:] + else: + if isinstance(first_indexer, slice): + indices = range(*first_indexer.indices(self.shape[0])) + else: + indices = first_indexer + + data = np.concatenate([f.read(index=index, mode="P") for index in indices], axis=0) + + remaining_indexers = (..., *key[1:]) + + return data[remaining_indexers] + + +class ImageIOBackend(xr.backends.BackendEntrypoint): + def open_dataset( + self, + filename_or_obj: FilenameOrObjectType, + *, + drop_variables: bool | None = None, + mode: Literal["grayscale", "color"] = "color", + ) -> xr.Dataset: + import imageio.v3 as iio + + with iio.imopen(filename_or_obj, io_mode="r") as f: + properties = f.properties() + metadata = f.metadata() + + dims = ["time", "height", "width", "color"] + + background = metadata["background"] + duration = metadata["duration"] + loop = metadata["loop"] + + shape = properties.shape + dtype = properties.dtype + + if isinstance(duration, (int, float)): + time_values = np.timedelta64(duration, "ms") * np.arange(shape[0]) + else: + time_values = np.array(duration, dtype="timedelta64[ms]") + + time = xr.indexes.PandasIndex(pd.Index(time_values), dim="time") + + backend_array = ImageIOBackendArray( + filename_or_obj=filename_or_obj, + shape=shape, + dtype=dtype, + lock=xr.backends.locks.SerializableLock(), + ) + data = xr.core.indexing.LazilyIndexedArray(backend_array) + + var = xr.Variable( + dims=dims, + data=data, + attrs={"loop": loop}, + encoding={ + "preferred_chunks": dict(zip(dims, (1, *shape[1:]))), + "fill_value": background, + }, + ) + coords = xr.Coordinates.from_xindex(time).assign(color=["red", "green", "blue"]) + + return xr.Dataset({"data": var}, coords=coords) diff --git a/advanced/backends/intro-backends.ipynb b/advanced/backends/intro-backends.ipynb new file mode 100644 index 00000000..d7002d09 --- /dev/null +++ b/advanced/backends/intro-backends.ipynb @@ -0,0 +1,182 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Introduction to Xarray Backends\n", + "In this lesson, we will learn about and how to use xarray's backends\n", + "\n", + ":::{admonition} Learning Goals\n", + "- Learn about xarray's internal and external backends\n", + "- Learn how xarray selects backend engines\n", + "- Learn how to specify backend engines\n", + ":::\n", + "\n", + "## What are Xarray Backends\n", + "\n", + "Xarray supports direct serialization and IO to several file formats, through the use of internal and external backends. Xarray's internal backends cover many common data formats such as \"netCDF4\", \"h5netcdf\", and \"zarr\". These backends provide a set of instructions that tells xarray how read data and store it into a `Dataset`, `DataTree` or `DataTree` model and are stored in the underlying “backend”. \n", + "\n", + "Xarray also supports external backends such as \"rioxarray\" and \"cfgrib\" and even creating your own backend.\n", + "\n", + "\n", + ":::{admonition} See also\n", + "You can learn more about xarray's [internal](https://tutorial.xarray.dev/advanced/backends/backends.html#links-to-internal-backends) and [external](https://tutorial.xarray.dev/advanced/backends/backends.html#links-to-external-backends-not-comprehensive) with our [guide](https://docs.xarray.dev/en/latest/user-guide/io.html) to backends.\n", + "\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## Reading a dataset with the netCDF4 engine\n", + "\n", + "We can read in a dataset by selecting the \"netcdf4\" engine" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr\n", + "\n", + "xr.tutorial.open_dataset(\"air_temperature\", engine=\"netcdf4\")" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "## Internal Backend Selection\n", + "\n", + "When opening a file or URL without explicitly specifying the ``engine`` parameter,\n", + "xarray automatically selects an appropriate backend based on the file path or URL.\n", + "The backends are tried in order: **netcdf4 → h5netcdf → scipy → pydap → zarr**.\n" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "## Check for available backends\n", + "\n", + "We can get a list of our available engines with `list_engines`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr\n", + "\n", + "xr.backends.list_engines()" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "## Reading without specifying engine\n", + "\n", + "When opening a file or URL without explicitly specifying the ``engine`` parameter,\n", + "xarray automatically selects an appropriate backend based on the file path or URL.\n", + "The backends are tried in order: **netcdf4 → h5netcdf → scipy → pydap → zarr**.\n", + "\n", + "In the following example this dataset is read with the \"netcdf4\" engine without explicitly setting the `\"engine=netcdf4\"`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "xr.tutorial.open_dataset(\"air_temperature\")" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "## Setting engine order\n", + "\n", + "You can customize the order in which netcdf4 backends are resolved using `xr.set_options(netcdf_engine_order=)`\n", + "\n", + "Let's update our engine order to have \"h5netcdf\" and the \"netCDF4\" and reopening the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "xr.set_options(netcdf_engine_order=[\"h5netcdf\", \"netcdf4\", \"scipy\"])" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "## Specifying the wrong backend" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "Lets trying specifying a bad engine for opening our dataset\n", + "\n", + ":::{warning}\n", + "This will fail because we cannot use the \"pydap\" engine to read this dataset\n", + ":::" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "xr.tutorial.open_dataset(\"air_temperature\", engine=\"pydap\")" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/advanced/backends/io.gif b/advanced/backends/io.gif new file mode 100644 index 00000000..b404e3e5 Binary files /dev/null and b/advanced/backends/io.gif differ diff --git a/advanced/backends/ocean.gif b/advanced/backends/ocean.gif new file mode 100644 index 00000000..bfbe061a Binary files /dev/null and b/advanced/backends/ocean.gif differ diff --git a/advanced/backends/rasterio_backend.ipynb b/advanced/backends/rasterio_backend.ipynb new file mode 100644 index 00000000..2b3b9d49 --- /dev/null +++ b/advanced/backends/rasterio_backend.ipynb @@ -0,0 +1,289 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Xarray's Rasterio backend\n", + "\n", + "In this lesson, we will learn how to use xarray's rasterio backend engine to open GeoTIFF rasters. By the end of the lesson, we will be able to:\n", + "\n", + ":::{admonition} Learning Goals\n", + "- Learn about the GeoTIFF format\n", + "- Lean about xarray's \"rasterio\" backend and the \"rioxarray\" accessor\n", + "- Learn how to read and plot GeoTIFF files with xarray\n", + "- Explore how to perform reprojection operations on rasters\n", + ":::\n", + "\n", + "## What are GeoTIFFs?\n", + "\n", + "The TIFF (Tagged Image File Format) format is a metadata rich image format for raster data. GeoTIFF (Geographic Tagged Image File Format) files are TIFF files that use georeferencing information (such as map projection and coordinate systems) as metadata. A GeoTIFF file with a single band contains 2D raster data for a single characteristic (i.e., variable) and maps to a geographic region. A GeoTIFF file can have multiple bands that all map to the same geographic region.\n", + "\n", + "![Raster_Image](https://docs.qgis.org/3.44/en/_images/raster_dataset.png)\n", + "\n", + "## Rasterio and Rioxarray Backends\n", + "\n", + "[Rasterio](https://rasterio.readthedocs.io/en/stable/intro.html) is a geospatial raster library that expresses GDAL ([Geospatial Data Abstraction Library](http://gdal.org)) data model with a Python API and CLI. [Rioxarray](https://corteva.github.io/rioxarray/stable/readme.html) is a wrapper around the rasterio library, that also extends the xarray api with the *rio* accessor. When you open a GeoTIFF file with the \"rasterio\" engine it returns the data as an xarray object with access to methods from the *rio* accessor.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## Reading a GeoTIFF\n", + "\n", + "Xarray's \"rasterio\" backend supports reading GeoTIFFs.\n", + "\n", + "Lets read a GeoTIFF file as an `xr.Dataset` by selecting `engine='rasterio'`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "rds = xr.tutorial.open_dataset(\"RGB.byte.tif\", engine=\"rasterio\")" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + ":::{note} We can also read GeoTIFFs with `rioxarray.open_rasterio`.\n", + "\n", + "The following code snippet opens a GeoTIFF and returns a `DataArray` object\n", + "```python\n", + "import rioxarray\n", + "rioxarray.open_rasterio(\"RGB.byte.tif\")\n", + "```\n", + "\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "## Raster bands\n", + "\n", + "GeoTIFFS can have multiple bands each representing a range or band in the electromagnetic spectrum. Arrays stored within bands in xarray are data variables and `DataArray`'s objects in the the Xarray Data Model." + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "Lets get the `DataArray` object (or variable) from our dataset. The variable name is \"band_data\"." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "rda = rds[\"band_data\"]\n", + "rda" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "Lets try getting the total number of bands for this GeoTIFF. Since `rioxarray` extends xarray with the *rio* accessor we can this accessor be able use many of the builtin `rasterio` methods." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "rda.rio.count" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "### Selection by bands\n", + "We can also select by bands. Since there are 3 bands in this dataset we can return raster array for the first band of this `xr.DataArray` by with indexing\n", + "\n", + "Lets get the first band of this dataset and try plotting it" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "rda[0].plot(cmap=\"pink\")" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "## Bounds\n", + "With `.rio.bounds()` we can get the spatial bounding box of our `DataArray`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "rda.rio.bounds()" + ] + }, + { + "cell_type": "markdown", + "id": "14", + "metadata": {}, + "source": [ + "## Transformation\n", + "\n", + "With `.rio.transform()` we can get the affine transformation matrix that maps pixel locations in (col, row) coordinates to (x, y) spatial positions.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "rda.rio.transform()" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": {}, + "source": [ + "### Coordinate Reference System (CRS)\n", + "We `rio.crs` we can get the CRS of our raster and reproject our raster." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "rda.rio.crs" + ] + }, + { + "cell_type": "markdown", + "id": "18", + "metadata": {}, + "source": [ + "### Reprojection\n", + "We can also reproject our raster from one CRS to another.\n", + "\n", + "Lets reproject our raster from \"EPSG:6326\" to \"EPSG:32612\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19", + "metadata": {}, + "outputs": [], + "source": [ + "rda_reproj = rda.rio.reproject(\"EPSG:32612\")" + ] + }, + { + "cell_type": "markdown", + "id": "20", + "metadata": {}, + "source": [ + ":::{note}\n", + "We have to update our CRS system to the new projection with `rio.write_crs`. We set `inplace=True` to write the CRS to the existing dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "rda_reproj.rio.write_crs(\"EPSG:32612\", inplace=True)" + ] + }, + { + "cell_type": "markdown", + "id": "22", + "metadata": {}, + "source": [ + "## Exercise" + ] + }, + { + "cell_type": "markdown", + "id": "23", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Can you reproject and update the CRS of second band of data to 'ESPG:3857' and plot your results?\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "rda[1].rio.reproject(\"EPSG:3857\").rio.write_crs(\"EPSG:3857\", inplace=True).plot()\n", + "```\n", + ":::\n", + "::::\n" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/advanced/indexing/indexing.md b/advanced/indexing/indexing.md new file mode 100644 index 00000000..72dae2a4 --- /dev/null +++ b/advanced/indexing/indexing.md @@ -0,0 +1,5 @@ +# Indexing + +```{tableofcontents} + +``` diff --git a/advanced/indexing/why-trees.md b/advanced/indexing/why-trees.md new file mode 100644 index 00000000..18565713 --- /dev/null +++ b/advanced/indexing/why-trees.md @@ -0,0 +1,628 @@ +--- +jupytext: + formats: ipynb,md:myst + text_representation: + extension: .md + format_name: myst + format_version: 0.13 + jupytext_version: 1.19.1 +kernelspec: + display_name: Python 3 (ipykernel) + language: python + name: python3 +--- + +# Tree-Based Indexing + +```{seealso} +[NDPointIndex](https://xarray-indexes.readthedocs.io/blocks/ndpoint.html) — use KD-trees and Ball trees with xarray's indexing system for efficient nearest-neighbor lookups on real datasets. +``` + +Imagine you have measurements at irregular locations and want to find the **nearest** data point to your query location. + +**In this notebook you'll learn:** + +- Why naive nearest-neighbor search is slow (O(n) comparisons) +- How KD-trees speed this up dramatically (O(log n) comparisons) +- Why KD-trees can give wrong answers for geographic lat/lon data +- When to use a Ball tree instead + ++++ + +## The nearest neighbor problem in 1D + +Let's start with a simple 1D example: + +**The problem:** What temperature is it at 4.7 km? We need to find the nearest measurement. + +```{code-cell} ipython3 +--- +tags: [hide-input] +--- +import numpy as np +import matplotlib.pyplot as plt + +# Temperature measurements at 7 locations along a transect +locations = np.array([1, 3, 4, 7, 8, 9, 12]) +temperatures = np.array([15, 18, 17, 22, 24, 23, 19]) + +# Plot the data +fig, ax = plt.subplots(figsize=(10, 3)) +ax.scatter(locations, np.zeros_like(locations), s=100, c='blue', zorder=5) +for loc, temp in zip(locations, temperatures): + ax.annotate(f'{temp}°', (loc, 0.15), ha='center', fontsize=10) +ax.set_xlim(0, 14) +ax.set_ylim(-0.5, 0.8) +ax.set_xlabel('Location (km)') +ax.set_yticks([]) +ax.set_title('Temperature measurements at 7 irregular locations') +plt.tight_layout() +plt.show() +``` + +The naive approach checks the distance to every point: + +```{code-cell} ipython3 +--- +tags: [hide-input] +--- +# === Configuration: change this to explore different queries === +query = 4.7 + +# Naive approach: check distance to EVERY point +fig, ax = plt.subplots(figsize=(10, 4)) + +# Draw the data points on the number line +ax.scatter(locations, np.zeros_like(locations), s=100, c='blue', zorder=5) +ax.scatter(query, 0, s=150, c='red', marker='x', zorder=10, lw=3) +ax.axhline(0, color='black', lw=0.5, zorder=1) + +# Draw horizontal distance lines - stacked vertically for visibility +for i, loc in enumerate(locations): + y_offset = 0.12 * (i + 1) + # Horizontal line showing the distance + ax.plot([query, loc], [y_offset, y_offset], 'gray', alpha=0.7, lw=2) + # Vertical ticks at endpoints + ax.plot([query, query], [y_offset - 0.03, y_offset + 0.03], 'gray', alpha=0.7, lw=1) + ax.plot([loc, loc], [y_offset - 0.03, y_offset + 0.03], 'gray', alpha=0.7, lw=1) + # Label + ax.annotate(f'{abs(loc - query):.1f} km', ((query + loc)/2, y_offset + 0.04), + ha='center', fontsize=8, color='gray') + +ax.set_xlim(0, 14) +ax.set_ylim(-0.2, 1.1) +ax.set_xlabel('Location (km)') +ax.set_yticks([]) +ax.set_title(f'Naive search: compute distance to ALL {len(locations)} points (query={query})') +plt.tight_layout() +plt.show() + +print(f"Query: {query} km") +print(f"Nearest point: {locations[np.argmin(np.abs(locations - query))]} km (distance = {np.min(np.abs(locations - query)):.1f} km)") +print(f"Comparisons needed: {len(locations)}") +``` + +With 7 points this is fine, but with millions of points this becomes slow. + +**The solution:** Pre-compute a tree structure that partitions the space. In 1D, this is essentially a binary search tree - each split divides the remaining points in half: + +```{code-cell} ipython3 +--- +tags: [hide-input] +--- +from scipy.spatial import KDTree +from matplotlib.patches import Rectangle + +# === Configuration === + +# Build the tree (this is the pre-computation step) +tree = KDTree(locations.reshape(-1, 1)) + +# Query the tree first to get the result +dist, idx = tree.query([[query]]) +nearest = locations[idx[0]] + +# Map from value to node name for finding the result node +value_to_node = {1: 'LL', 3: 'L1', 4: 'LR', 7: 'root', 8: 'RL', 9: 'R1', 12: 'RR'} +found_node = value_to_node[nearest] + +# Determine the search path based on query value +if query < 7: + if query < 3: + path_nodes = ['root', 'L1', 'LL'] + regions = [(0, 14), (0, 7), (0, 3)] + else: + path_nodes = ['root', 'L1', 'LR'] + regions = [(0, 14), (0, 7), (3, 7)] +else: + if query < 9: + path_nodes = ['root', 'R1', 'RL'] + regions = [(0, 14), (7, 14), (7, 9)] + else: + path_nodes = ['root', 'R1', 'RR'] + regions = [(0, 14), (7, 14), (9, 14)] + +# Create visualization: tree on left, 3 narrowing steps on right +fig = plt.figure(figsize=(16, 9)) + +# Left side: Tree diagram with spatial ranges +ax_tree = fig.add_subplot(1, 2, 1) +ax_tree.set_xlim(0, 16) +ax_tree.set_ylim(-0.5, 5.5) +ax_tree.axis('off') +ax_tree.set_title('KD-tree structure\n(each node shows the spatial range it covers)', fontsize=12, fontweight='bold') + +# Tree node positions - now includes spatial range for each node +nodes = { + 'root': {'pos': (8, 4.5), 'value': 7, 'color': 'steelblue', 'label': 'split=7', 'range': '[0, 14]'}, + 'L1': {'pos': (4, 2.6), 'value': 3, 'color': 'coral', 'label': 'split=3', 'range': '[0, 7)'}, + 'R1': {'pos': (12, 2.6), 'value': 9, 'color': 'seagreen', 'label': 'split=9', 'range': '[7, 14]'}, + 'LL': {'pos': (2, 0.8), 'value': 1, 'color': 'gray', 'label': '1', 'range': '[0, 3)'}, + 'LR': {'pos': (6, 0.8), 'value': 4, 'color': 'gray', 'label': '4', 'range': '[3, 7)'}, + 'RL': {'pos': (10, 0.8), 'value': 8, 'color': 'gray', 'label': '8', 'range': '[7, 9)'}, + 'RR': {'pos': (14, 0.8), 'value': 12, 'color': 'gray', 'label': '12', 'range': '[9, 14]'}, +} + +# Draw edges +edges = [('root', 'L1'), ('root', 'R1'), ('L1', 'LL'), ('L1', 'LR'), ('R1', 'RL'), ('R1', 'RR')] +for parent, child in edges: + px, py = nodes[parent]['pos'] + cx, cy = nodes[child]['pos'] + ax_tree.plot([px, cx], [py, cy], 'k-', lw=2, zorder=1) + +# Draw nodes with spatial range labels +for name, node in nodes.items(): + x, y = node['pos'] + is_split = 'split' in node['label'] + size = 2200 if is_split else 1500 + ax_tree.scatter(x, y, s=size, c=node['color'], zorder=5, edgecolors='black', linewidths=2) + ax_tree.annotate(node['label'], (x, y), ha='center', va='center', + fontsize=11 if is_split else 10, fontweight='bold', color='white') + # Add range label below each node + ax_tree.annotate(node['range'], (x, y - 0.55), ha='center', va='top', + fontsize=9, color='black', style='italic', + bbox=dict(boxstyle='round,pad=0.2', facecolor='white', edgecolor='gray', alpha=0.8)) + +# Highlight the path taken +for i in range(len(path_nodes) - 1): + px, py = nodes[path_nodes[i]]['pos'] + cx, cy = nodes[path_nodes[i+1]]['pos'] + ax_tree.plot([px, cx], [py, cy], 'r-', lw=5, alpha=0.4, zorder=2) + +# Add query annotation +ax_tree.annotate(f'query={query}', (8, 4.5), xytext=(11, 5.2), + fontsize=11, color='red', fontweight='bold', + arrowprops=dict(arrowstyle='->', color='red', lw=2)) + +# Mark the found node +found_x, found_y = nodes[found_node]['pos'] +ax_tree.annotate(f'found {nearest}!', (found_x + 1.2, found_y + 0.3), fontsize=11, ha='left', color='red', fontweight='bold') + +# Right side: 3 subplots showing narrowing search space +steps = [ + ("Step 1: Start with all points", regions[0], 'steelblue', f'{query} < 7? → go left' if query < 7 else f'{query} > 7? → go right'), + ("Step 2: After first split", regions[1], 'coral', f'{query} < 3? → go left' if query < 3 else f'{query} > 3? → go right' if query < 7 else f'{query} < 9? → go left' if query < 9 else f'{query} > 9? → go right'), + (f"Step 3: Found nearest = {nearest}", regions[2], 'gold', None), +] + +for i, (title, (region_start, region_end), color, annotation) in enumerate(steps): + ax = fig.add_subplot(3, 2, 2*(i+1)) + + # Draw all data points + for loc in locations: + in_region = region_start <= loc <= region_end + ax.scatter(loc, 0, s=100 if in_region else 60, + c='blue' if in_region else 'lightgray', + zorder=5, edgecolors='black' if in_region else 'gray', linewidths=1) + if in_region: + ax.annotate(f'{loc}', (loc, -0.25), ha='center', fontsize=9, fontweight='bold') + + # Draw query point + ax.scatter(query, 0, s=150, c='red', marker='x', zorder=10, lw=3) + + # Highlight the active region + rect = Rectangle((region_start, -0.15), region_end - region_start, 0.3, + fill=True, facecolor=color, alpha=0.2, edgecolor=color, lw=2, zorder=2) + ax.add_patch(rect) + + # Draw split lines + if i == 0: + ax.axvline(7, color='steelblue', lw=2, ls='--', alpha=0.8) + ax.annotate('split=7', (7, 0.25), ha='center', fontsize=9, color='steelblue', fontweight='bold') + elif i == 1: + if query < 7: + ax.axvline(3, color='coral', lw=2, ls='--', alpha=0.8) + ax.annotate('split=3', (3, 0.25), ha='center', fontsize=9, color='coral', fontweight='bold') + else: + ax.axvline(9, color='seagreen', lw=2, ls='--', alpha=0.8) + ax.annotate('split=9', (9, 0.25), ha='center', fontsize=9, color='seagreen', fontweight='bold') + + # Add decision annotation + if annotation: + ax.annotate(annotation, (0.98, 0.95), xycoords='axes fraction', ha='right', va='top', + fontsize=10, color='darkgreen', fontweight='bold', + bbox=dict(boxstyle='round', facecolor='lightyellow', edgecolor='green', alpha=0.8)) + + ax.set_xlim(-0.5, 14.5) + ax.set_ylim(-0.4, 0.45) + ax.set_title(title, fontsize=11, fontweight='bold') + ax.set_yticks([]) + if i == 2: + ax.set_xlabel('Location (km)', fontsize=10) + +plt.tight_layout() +plt.show() + +print(f"Nearest point: {nearest} km") +print(f"Comparisons needed: ~{len(path_nodes)} (log₂({len(locations)}) ≈ 3)") +``` + +## Extending to 2D + +The same idea works in higher dimensions. Now our measurements are scattered across a 2D area: + +```{code-cell} ipython3 +--- +tags: [hide-input] +--- +# 2D example: temperature measurements scattered across an area +from matplotlib.patches import Rectangle + +np.random.seed(42) +points_2d = np.random.rand(20, 2) * 10 # 20 points in a 10x10 area + +# === Configuration === +query_2d = np.array([6.5, 4.0]) # Change this to query a different location + +# Build tree - using leafsize=2 to demonstrate meaningful subdivision +# (default leafsize=10 would barely split with only 20 points!) +LEAFSIZE = 2 +tree_2d = KDTree(points_2d, leafsize=LEAFSIZE) +dist, idx = tree_2d.query([query_2d]) +nearest_2d = points_2d[idx[0]] + +# With leafsize=2, we get ~4 levels of splits (log2(20/2) ≈ 3-4) +# Let's show the first 2 splits conceptually, then the final leaf comparison + +# Approximate the splits (KD-tree alternates x, y, x, y...) +x_split = np.median(points_2d[:, 0]) # ~4.0 + +# Determine which half based on query x +if query_2d[0] >= x_split: + # Right half + half_points = points_2d[points_2d[:, 0] >= x_split] + x_decision = f"x={query_2d[0]} > {x_split:.1f}? → go right" + x_region = (x_split, 0, 10, 10) # (x_min, y_min, x_max, y_max) +else: + # Left half + half_points = points_2d[points_2d[:, 0] < x_split] + x_decision = f"x={query_2d[0]} < {x_split:.1f}? → go left" + x_region = (0, 0, x_split, 10) + +y_split = np.median(half_points[:, 1]) + +# Determine which quadrant based on query y +if query_2d[1] >= y_split: + # Upper region + y_decision = f"y={query_2d[1]} > {y_split:.1f}? → go up" + if query_2d[0] >= x_split: + final_region = (x_split, y_split, 10, 10) # top-right + else: + final_region = (0, y_split, x_split, 10) # top-left +else: + # Lower region + y_decision = f"y={query_2d[1]} < {y_split:.1f}? → go down" + if query_2d[0] >= x_split: + final_region = (x_split, 0, 10, y_split) # bottom-right + else: + final_region = (0, 0, x_split, y_split) # bottom-left + +# Define regions for visualization +regions = [ + (0, 0, 10, 10), # Step 1: all points + x_region, # Step 2: half based on x + final_region, # Step 3: quadrant based on y +] + +# Get actual points in final region (these are the leaf candidates) +x_min, y_min, x_max, y_max = final_region +final_candidates = [pt for pt in points_2d + if x_min <= pt[0] <= x_max and y_min <= pt[1] <= y_max] + +# Create figure +fig, axes = plt.subplots(2, 2, figsize=(12, 10)) +axes = axes.flatten() + +step_titles = [ + "Step 1: Start with all 20 points", + f"Step 2: Split on x ≈ {x_split:.1f}", + f"Step 3: Split on y ≈ {y_split:.1f}", + f"Step 4: Compare {len(final_candidates)} candidates in leaf" +] +step_colors = ['steelblue', 'coral', 'gold', 'limegreen'] +decisions = [x_decision, y_decision, None, None] + +for i, ax in enumerate(axes): + x_min, y_min, x_max, y_max = regions[min(i, 2)] + + # Get points in current region + points_in_region = [(pt, x_min <= pt[0] <= x_max and y_min <= pt[1] <= y_max) for pt in points_2d] + + # Draw all points + for pt, in_region in points_in_region: + ax.scatter(pt[0], pt[1], s=80 if in_region else 40, + c='blue' if in_region else 'lightgray', + edgecolors='black' if in_region else 'gray', + zorder=5, linewidths=1) + + # Draw query point + ax.scatter(*query_2d, s=150, c='red', marker='x', zorder=10, lw=3) + + # Draw the active region + rect = Rectangle((x_min, y_min), x_max - x_min, y_max - y_min, + fill=True, facecolor=step_colors[i], alpha=0.15, + edgecolor=step_colors[i], lw=2, zorder=2) + ax.add_patch(rect) + + # Draw split lines + if i >= 1: + ax.axvline(x_split, color='steelblue', lw=2, ls='--', alpha=0.8) + ax.annotate(f'x={x_split:.1f}', (x_split, 9.7), ha='center', fontsize=9, + color='steelblue', fontweight='bold') + if i >= 2: + # Only draw y split line in the relevant half + if query_2d[0] >= x_split: + ax.axhline(y_split, xmin=x_split/10, xmax=1, color='coral', lw=2, ls='--', alpha=0.8) + else: + ax.axhline(y_split, xmin=0, xmax=x_split/10, color='coral', lw=2, ls='--', alpha=0.8) + ax.annotate(f'y={y_split:.1f}', (9.7, y_split + 0.2), + ha='right', va='bottom', fontsize=9, color='coral', fontweight='bold') + + # Final step: draw lines to ALL candidates + if i == 3: + for pt, in_region in points_in_region: + if in_region: + is_nearest = np.allclose(pt, nearest_2d) + ax.plot([query_2d[0], pt[0]], [query_2d[1], pt[1]], + color='limegreen' if is_nearest else 'gray', + lw=3 if is_nearest else 1.5, + alpha=1.0 if is_nearest else 0.6, + zorder=6 if is_nearest else 4) + + ax.scatter(*nearest_2d, s=200, facecolors='none', edgecolors='limegreen', lw=3, zorder=15) + ax.annotate('nearest!', (nearest_2d[0] + 0.3, nearest_2d[1] + 0.3), + ha='left', fontsize=10, color='green', fontweight='bold') + + # Add decision annotation + if decisions[i]: + ax.annotate(decisions[i], (0.98, 0.98), xycoords='axes fraction', + ha='right', va='top', fontsize=10, color='darkgreen', fontweight='bold', + bbox=dict(boxstyle='round', facecolor='lightyellow', edgecolor='green', alpha=0.9)) + + ax.set_xlim(-0.5, 10.5) + ax.set_ylim(-0.5, 10.5) + ax.set_aspect('equal') + ax.set_xlabel('x') + ax.set_ylabel('y') + ax.set_title(step_titles[i], fontsize=11, fontweight='bold') + +plt.tight_layout() +plt.show() + +print(f"Query: ({query_2d[0]}, {query_2d[1]})") +print(f"KDTree built with leafsize={LEAFSIZE}") +print(f"Started with {len(points_2d)} points") +print(f"After 2 tree splits: narrowed to {len(final_candidates)} candidates") +print(f"Final step: {len(final_candidates)} distance calculations") +print(f"Total: 2 splits + {len(final_candidates)} comparisons = {2 + len(final_candidates)} operations (vs 20 naive)") +``` + +## How it scales + +The same principle extends to 3D, 4D, and beyond. Here's how the number of comparisons scales: + +```{code-cell} ipython3 +--- +tags: [hide-input] +--- +# How comparisons scale with data size +data_sizes = np.array([10, 100, 1000, 10000, 100000, 1000000]) +naive_comparisons = data_sizes # O(n) +kdtree_comparisons = np.log2(data_sizes).astype(int) + 1 # O(log n) + +fig, ax = plt.subplots(figsize=(10, 5)) + +ax.plot(data_sizes, naive_comparisons, 'o-', color='gray', lw=2, markersize=8, label='Naive: O(n)') +ax.plot(data_sizes, kdtree_comparisons, 's-', color='steelblue', lw=2, markersize=8, label='KD-tree: O(log n)') + +ax.set_xscale('log') +ax.set_yscale('log') +ax.set_xlabel('Number of data points') +ax.set_ylabel('Comparisons per query') +ax.set_title('Finding nearest neighbor: Naive vs KD-tree') +ax.legend(fontsize=11) +ax.grid(True, alpha=0.3) + +# Annotate key points +for n, naive, kd in zip(data_sizes[::2], naive_comparisons[::2], kdtree_comparisons[::2]): + ax.annotate(f'{naive:,}', (n, naive), textcoords="offset points", xytext=(0,10), ha='center', fontsize=9, color='gray') + ax.annotate(f'{kd}', (n, kd), textcoords="offset points", xytext=(0,-15), ha='center', fontsize=9, color='steelblue') + +plt.tight_layout() +plt.show() + +print("With 1 million points: naive needs 1,000,000 comparisons, KD-tree needs ~20") +``` + +(the-problem-with-geographic-coordinates)= + +## The problem with geographic coordinates + +KD-trees use **Euclidean distance**—they measure straight-line distance in whatever coordinate system you give them. This works perfectly for x/y coordinates in meters or kilometers. + +But for **latitude/longitude coordinates**, Euclidean distance over degrees is wrong! Here's why: + +- **Latitude degrees are constant**: 1° latitude ≈ 111 km everywhere on Earth +- **Longitude degrees shrink toward the poles**: 1° longitude ≈ 111 km at the equator, but only ~19 km at 80°N + +This means a KD-tree treating lat/lon as flat coordinates will systematically pick the **wrong** nearest neighbor at high latitudes: + +```{code-cell} ipython3 +--- +tags: [hide-input] +--- +# Visualize haversine vs Euclidean - 2D circle diagram +from sklearn.neighbors import BallTree + +# At 80°N (near Arctic): longitude degrees are MUCH shorter! +lat = 80 +km_per_deg_lon = 111 * np.cos(np.radians(lat)) # ~19 km at 80°N! +km_per_deg_lat = 111 # always ~111 km + +# Query point and two candidates (in lat/lon degrees) +query_latlon = np.array([[lat, 0]]) +point_a_latlon = np.array([[lat, 2.0]]) +point_b_latlon = np.array([[lat + 0.5, 0]]) +points_latlon = np.vstack([point_a_latlon, point_b_latlon]) + +# Test both trees +kd_tree = KDTree(points_latlon) +kd_dist, kd_idx = kd_tree.query(query_latlon) +kd_picked = "A" if kd_idx[0] == 0 else "B" + +ball_tree = BallTree(np.radians(points_latlon), metric='haversine') +ball_dist, ball_idx = ball_tree.query(np.radians(query_latlon)) +ball_picked = "A" if ball_idx[0] == 0 else "B" + +km_to_a = 2.0 * km_per_deg_lon +km_to_b = 0.5 * km_per_deg_lat + +# Create figure +fig = plt.figure(figsize=(14, 10), constrained_layout=True) + +# === Top: Circle diagram showing arc vs chord === +ax_circle = fig.add_subplot(211) +ax_circle.set_aspect('equal') +ax_circle.axis('off') + +# Draw circle +radius = 1 +theta_full = np.linspace(0, 2*np.pi, 100) +ax_circle.plot(radius * np.cos(theta_full), radius * np.sin(theta_full), 'k-', lw=2.5) + +# Two points on the circle +theta_p = np.radians(120) # Point P +theta_q = np.radians(60) # Point Q + +p_x, p_y = radius * np.cos(theta_p), radius * np.sin(theta_p) +q_x, q_y = radius * np.cos(theta_q), radius * np.sin(theta_q) + +# Draw the ARC (haversine distance) - along the circle surface +arc_theta = np.linspace(theta_q, theta_p, 50) +arc_x = radius * np.cos(arc_theta) +arc_y = radius * np.sin(arc_theta) +ax_circle.plot(arc_x, arc_y, 'r-', lw=6, solid_capstyle='round', label='Arc length (haversine)', zorder=5) + +# Draw the CHORD (Euclidean distance) - straight line +ax_circle.plot([p_x, q_x], [p_y, q_y], 'b--', lw=4, label='Chord length (Euclidean)', zorder=4) + +# Draw points +ax_circle.scatter([p_x, q_x], [p_y, q_y], s=250, c='dodgerblue', edgecolors='black', lw=2, zorder=10) + +# Labels +ax_circle.annotate('P', (p_x - 0.18, p_y + 0.08), fontsize=24, fontweight='bold') +ax_circle.annotate('Q', (q_x + 0.1, q_y + 0.08), fontsize=24, fontweight='bold') + +# Distance annotations - positioned to avoid overlap +# Arc annotation (above the arc) +arc_mid_theta = (theta_p + theta_q) / 2 +arc_mid_x = 1.22 * np.cos(arc_mid_theta) +arc_mid_y = 1.22 * np.sin(arc_mid_theta) +ax_circle.annotate('arc length\n(along surface)', (arc_mid_x, arc_mid_y + 0.05), + fontsize=13, color='darkred', fontweight='bold', ha='center', + bbox=dict(boxstyle='round,pad=0.3', facecolor='mistyrose', edgecolor='red', alpha=0.9)) + +# Chord annotation (below the chord) +chord_mid_x = (p_x + q_x) / 2 +chord_mid_y = (p_y + q_y) / 2 +ax_circle.annotate('chord\n(straight line)', (chord_mid_x, chord_mid_y - 0.25), + fontsize=13, color='darkblue', fontweight='bold', ha='center', + bbox=dict(boxstyle='round,pad=0.3', facecolor='lightblue', edgecolor='blue', alpha=0.9)) + +# Calculate actual distances for display +arc_length = radius * abs(theta_p - theta_q) # s = r * theta +chord_length = np.sqrt((q_x - p_x)**2 + (q_y - p_y)**2) + +ax_circle.set_xlim(-1.5, 1.5) +ax_circle.set_ylim(-1.0, 1.7) +ax_circle.set_title('Haversine vs Euclidean: arc length ≠ chord length', + fontsize=16, fontweight='bold', pad=15) + +# Legend on the left side +ax_circle.legend(loc='center left', fontsize=11, bbox_to_anchor=(-0.15, 0.3)) + +# Formula box on the right side +formula_text = f"Arc length > Chord length\n(arc = {arc_length:.2f}, chord = {chord_length:.2f})" +ax_circle.text(1.15, 0.3, formula_text, fontsize=12, ha='center', + bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.9)) + +# === Bottom row: Side-by-side comparison === +# Bottom-left: KD-tree view (flat degrees) +ax_kd = fig.add_subplot(223) +ax_kd.scatter(0, 0, s=200, c='red', marker='x', zorder=10, lw=3, label='Query') +ax_kd.scatter(2.0, 0, s=140, c='green', zorder=5, label='Point A (2° east)') +ax_kd.scatter(0, 0.5, s=140, c='orange', zorder=5, label='Point B (0.5° north)') +ax_kd.plot([0, 2.0], [0, 0], 'g-', lw=2.5, alpha=0.7) +ax_kd.plot([0, 0], [0, 0.5], color='orange', lw=2.5, alpha=0.7) + +circle_kd = plt.Circle((0, 0.5), 0.15, fill=False, color='black', lw=3, linestyle='--', zorder=15) +ax_kd.add_patch(circle_kd) +ax_kd.annotate('KD-tree picks B\n(smaller in degrees)', (0.3, 0.75), fontsize=12, fontweight='bold') + +ax_kd.set_xlabel('Longitude offset (°)', fontsize=13) +ax_kd.set_ylabel('Latitude offset (°)', fontsize=13) +ax_kd.set_title(f'KD-tree: Euclidean on degrees\n(at {lat}°N latitude)', fontsize=13, fontweight='bold') +ax_kd.legend(loc='upper right', fontsize=10) +ax_kd.set_xlim(-0.5, 2.5) +ax_kd.set_ylim(-0.5, 1.2) +ax_kd.set_aspect('equal') +ax_kd.grid(True, alpha=0.3) +ax_kd.annotate('2.0°', (1.0, -0.15), ha='center', fontsize=14, color='green', fontweight='bold') +ax_kd.annotate('0.5°', (-0.25, 0.25), ha='center', fontsize=14, color='orange', fontweight='bold', rotation=90) + +# Bottom-right: Reality in kilometers +ax_real = fig.add_subplot(224) +ax_real.scatter(0, 0, s=200, c='red', marker='x', zorder=10, lw=3, label=f'Query ({lat}°N)') +ax_real.scatter(km_to_a, 0, s=140, c='green', zorder=5, label='Point A') +ax_real.scatter(0, km_to_b, s=140, c='orange', zorder=5, label='Point B') +ax_real.plot([0, km_to_a], [0, 0], 'g-', lw=2.5, alpha=0.7) +ax_real.plot([0, 0], [0, km_to_b], color='orange', lw=2.5, alpha=0.7) + +circle_ball = plt.Circle((km_to_a, 0), 6, fill=False, color='black', lw=3, linestyle='--', zorder=15) +ax_real.add_patch(circle_ball) +ax_real.annotate('Ball tree picks A\n(smaller in km)', (5, 55), fontsize=12, fontweight='bold') + +ax_real.set_xlabel('East-West distance (km)', fontsize=13) +ax_real.set_ylabel('North-South distance (km)', fontsize=13) +ax_real.set_title(f'Ball tree: haversine (true distance)\n1° longitude = only {km_per_deg_lon:.0f} km at {lat}°N!', + fontsize=13, fontweight='bold') +ax_real.legend(loc='upper right', fontsize=10) +ax_real.set_xlim(-10, 70) +ax_real.set_ylim(-10, 70) +ax_real.set_aspect('equal') +ax_real.grid(True, alpha=0.3) +ax_real.annotate(f'{km_to_a:.0f} km', (km_to_a/2, -6), ha='center', fontsize=14, color='green', fontweight='bold') +ax_real.annotate(f'{km_to_b:.0f} km', (-7, km_to_b/2), ha='center', fontsize=14, color='orange', fontweight='bold', rotation=90) + +plt.show() + +print(f"At {lat}°N: 1° longitude = {km_per_deg_lon:.0f} km, 1° latitude = {km_per_deg_lat} km") +print(f"\nPoint A: 2° east = {km_to_a:.0f} km (along surface)") +print(f"Point B: 0.5° north = {km_to_b:.0f} km") +print(f"\nKD-tree picked: Point {kd_picked} {'✗ WRONG!' if kd_picked == 'B' else '✓'}") +print(f"Ball tree picked: Point {ball_picked} {'✓ CORRECT!' if ball_picked == 'A' else '✗'}") +``` + +## Next steps + +Ready to use tree-based indexing with xarray? See [NDPointIndex](https://xarray-indexes.readthedocs.io/blocks/ndpoint.html) for how to integrate KD-trees and Ball trees with xarray's indexing system. diff --git a/advanced/map_blocks/map_blocks.md b/advanced/map_blocks/map_blocks.md new file mode 100644 index 00000000..6ad6d333 --- /dev/null +++ b/advanced/map_blocks/map_blocks.md @@ -0,0 +1,5 @@ +# map_blocks + +```{tableofcontents} + +``` diff --git a/advanced/map_blocks/simple_map_blocks.ipynb b/advanced/map_blocks/simple_map_blocks.ipynb new file mode 100644 index 00000000..af46f405 --- /dev/null +++ b/advanced/map_blocks/simple_map_blocks.ipynb @@ -0,0 +1,269 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": { + "tags": [] + }, + "source": [ + "# A gentle introduction\n", + "\n", + "`map_blocks` is inspired by the `dask.array` function of the same name and lets\n", + "you map a function on blocks of the xarray object (including Datasets!).\n", + "\n", + "At _compute_ time, your function will receive a chunk of an xarray object with concrete\n", + "(computed) values along with appropriate metadata. This function should return\n", + "an xarray object.\n" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "import dask\n", + "import numpy as np\n", + "import xarray as xr" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "First lets set up a `LocalCluster` using [dask.distributed](https://distributed.dask.org/).\n", + "\n", + "You can use any kind of dask cluster. This step is completely independent of\n", + "xarray. While not strictly necessary, the dashboard provides a nice learning\n", + "tool.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "from dask.distributed import Client\n", + "\n", + "client = Client()\n", + "client" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "

👆

Click the Dashboard link above. Or click the \"Search\" button in the dashboard.\n", + "\n", + "Let's test that the dashboard is working..\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "import dask.array\n", + "\n", + "dask.array.ones((1000, 4), chunks=(2, 1)).compute() # should see activity in dashboard" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "Let's open a dataset. We specify `chunks` so that we create a dask arrays for the DataArrays.\n", + "\n", + "Depending on the desired function to be applied on the chunks, it is vital to set the chunks correctly. Our goal is to compute the mean along the time dimension. Therefore we do not chunk the time dimension at all (indicated by `\"time\": -1`). We deliberately set `lat` and `lon` chunks to something smaller then the size of their respective dimension (otherwise we would potentially end up with a single big chunk for the entire `ds`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.open_dataset(\"air_temperature\", chunks={\"time\": -1, \"lat\": 5, \"lon\": 10})\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "## Simple example\n", + "\n", + "Here is an example" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "def time_mean(obj: xr.Dataset):\n", + " # use xarray's convenient API here\n", + " # you could convert to a pandas dataframe and use pandas' extensive API\n", + " # or use .plot() and plt.savefig to save visualizations to disk in parallel.\n", + " return obj.mean(\"time\")\n", + "\n", + "\n", + "ds.map_blocks(time_mean) # this is lazy!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "# this triggers the actual computation\n", + "ds.map_blocks(time_mean).compute()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "# this will calculate values and will return True if the computation works as expected\n", + "ds.map_blocks(time_mean).equals(ds.mean(\"time\"))" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "### Exercises\n" + ] + }, + { + "cell_type": "markdown", + "id": "14", + "metadata": {}, + "source": [ + "::::{admonition} Exercise 1\n", + ":class: tip\n", + "\n", + "When opening the dataset, set the chunks for the dimension to anything smaller than the size of the time dimension (< 2920), e.g., `\"time\": 100`, and keep the size of the other chunks the same:\n", + "\n", + "```python\n", + "ds = xr.tutorial.open_dataset(\n", + " \"air_temperature\",\n", + " chunks={\"time\": 100, \"lat\": 5, \"lon\": 10},\n", + ")\n", + "```\n", + "\n", + "Now run the notebook again. The result of `ds.map_blocks(time_mean)` is no more equivalent to `ds.mean(\"time\")`. Why does `ds.map_blocks(time_mean)` return a different result this time?\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "Quoting from the documentation of `map_blocks`: _The function will receive a subset or ‘block’ of obj (see below), corresponding to one chunk along each chunked dimension._\n", + "\n", + "`ds.mean(\"time\")` computes the mean over the entire time dimension. In our example `ds.map_blocks(time_mean)` passes individual chunks of `ds` to `time_mean`. Once the time dimension is chunked, `time_mean` receives more than a single chunk along the dimension, meaning `time_mean` computes the mean along the time dimension for a single chunk rather than along the entire time dimension. Therefore we do not receive an identical result.\n", + "\n", + "You can also modify the function to show the shape of the chunks passed to `time_mean`. Compare the output of the modified function with `ds.chunks` to find out how they relate to each other!\n", + "\n", + "```python\n", + "def time_mean(obj: xr.Dataset):\n", + " print(f\"received obj of type {type(obj)}\")\n", + " print(\"obj contains the following data variables:\")\n", + " for data_var in obj.data_vars:\n", + " print(f\"'{data_var}' with shape {obj[data_var].shape}\")\n", + "\n", + " return obj.mean(\"time\")\n", + "```\n", + "\n", + ":::\n", + "::::\n" + ] + }, + { + "cell_type": "markdown", + "id": "15", + "metadata": {}, + "source": [ + "::::{admonition} Exercise 2\n", + ":class: tip \n", + "\n", + "Try applying the following function with `map_blocks`. Specify `scale` as an\n", + "argument and `offset` as a kwarg.\n", + "\n", + "The docstring should help:\n", + "https://docs.xarray.dev/en/stable/generated/xarray.map_blocks.html\n", + "\n", + "```python\n", + "def time_mean_scaled(obj, scale, offset):\n", + " return obj.mean(\"lat\") * scale + offset\n", + "```\n", + "\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": {}, + "source": [ + "### More advanced functions\n", + "\n", + "`map_blocks` needs to know what the returned object looks like _exactly_. It\n", + "does so by passing a 0-shaped xarray object to the function and examining the\n", + "result. This approach cannot work in all cases For such advanced use cases,\n", + "`map_blocks` allows a `template` kwarg. See\n", + "https://docs.xarray.dev/en/stable/user-guide/dask.html#map-blocks for more details\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "client.close()" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/advanced/parallel-intro.md b/advanced/parallel-intro.md new file mode 100644 index 00000000..7d20b5c9 --- /dev/null +++ b/advanced/parallel-intro.md @@ -0,0 +1,19 @@ +# Parallelizing custom functions + +Almost all of xarray’s built-in operations work on Dask arrays. + +Sometimes analysis calls for functions that aren't in xarray's API (e.g. scipy). +There are three ways to apply these functions in parallel on each block of your +xarray object: + +1. Extract Dask arrays from xarray objects ([.data](https://docs.xarray.dev/en/stable/generated/xarray.DataArray.data.html)) and use Dask directly e.g. + ([apply_gufunc](https://docs.dask.org/en/latest/generated/dask.array.gufunc.apply_gufunc.html), [map_blocks](https://docs.dask.org/en/latest/generated/dask.array.map_blocks.html), [map_overlap](https://docs.dask.org/en/latest/generated/dask.array.map_overlap.html), [blockwise](https://docs.dask.org/en/latest/generated/dask.array.core.blockwise.html), [reduction](https://docs.dask.org/en/latest/generated/dask.array.reduction.html)). Then wrap the result as an Xarray object. + +2. Use [apply_ufunc](https://docs.xarray.dev/en/stable/generated/xarray.apply_ufunc.html) to apply functions that consume and return duck arrays. This automates extracting the data from Xarray objects, applying a function, and then converting the bare array result back to a Xarray object. + +3. Use [map_blocks](https://docs.xarray.dev/en/stable/generated/xarray.map_blocks.html), [Dataset.map_blocks](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.map_blocks.html) or [DataArray.map_blocks](https://docs.xarray.dev/en/stable/generated/xarray.DataArray.map_blocks.html) + to apply functions that consume and return xarray objects. + +Which method you use ultimately depends on the type of input objects expected by +the function you're wrapping, and the level of performance or convenience you +desire. diff --git a/ci/environment.yml b/ci/environment.yml deleted file mode 100644 index fc3b68a7..00000000 --- a/ci/environment.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: xarray -channels: - - conda-forge - - default -dependencies: - - pathlib - - nbconvert - - nbformat - - jupyter_client - - ipykernel - - nbsphinx - - sphinx_rtd_theme - - sphinx - - doctr - - scipy - - zarr - - dask - - distributed - - netcdf4 - - python-graphviz diff --git a/conf.py b/conf.py deleted file mode 100644 index 5fe5a284..00000000 --- a/conf.py +++ /dev/null @@ -1,177 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Configuration file for the Sphinx documentation builder. -# -# This file does only contain a selection of the most common options. For a -# full list see the documentation: -# http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - - -# -- Project information ----------------------------------------------------- - -project = "Xarray Tutorial" -copyright = "2020, Xarray Developers" -author = "Xarray Developers" - -# The short X.Y version -version = "" -# The full version, including alpha/beta/rc tags -release = "" - - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "sphinx.ext.mathjax", - "nbsphinx", -] - -nbsphinx_timeout = 600 -# nbsphinx_execute = "always" -nbsphinx_allow_errors = True - -nbsphinx_prolog = """ -{% set docname = env.doc2path(env.docname, base=None) %} - -You can run this notebook in a `live session `_ |Binder| or view it `on Github `_. - -.. |Binder| image:: https://mybinder.org/badge_logo.svg - :target: https://mybinder.org/v2/gh/xarray-contrib/xarray-tutorial/master?urlpath=lab/tree/{{ docname }} -""" - - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = ".rst" - -# The master toctree document. -master_doc = "index" - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path . -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "**.ipynb_checkpoints"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -# html_static_path = ['_static'] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - - -# -- Options for HTMLHelp output --------------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = "XarrayTutorialdoc" - - -# -- Options for LaTeX output ------------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - ( - master_doc, - "XarrayTutorial.tex", - "Xarray Tutorial Documentation", - "Xarray Developers", - "manual", - ), -] - - -# -- Options for manual page output ------------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "xarraytutorial", "Xarray Tutorial Documentation", [author], 1,)] - - -# -- Options for Texinfo output ---------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "XarrayTutorial", - "Xarray Tutorial Documentation", - author, - "XarrayTutorial", - "One line description of project.", - "Miscellaneous", - ), -] diff --git a/data/sst.mnmean.nc b/data/sst.mnmean.nc new file mode 100644 index 00000000..8b9be28a Binary files /dev/null and b/data/sst.mnmean.nc differ diff --git a/fundamentals/01.1_creating_data_structures.ipynb b/fundamentals/01.1_creating_data_structures.ipynb new file mode 100644 index 00000000..d820cbd5 --- /dev/null +++ b/fundamentals/01.1_creating_data_structures.ipynb @@ -0,0 +1,641 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Creating Data Structures" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import xarray as xr\n", + "\n", + "xr.set_options(display_expand_data=False)\n", + "\n", + "rng = np.random.default_rng(seed=0) # we'll use this later" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "In the last lecture, we looked at the following example Dataset. In most cases Xarray Datasets are created by reading a file. We'll address this in the next lecture. Here we'll learn how to create Xarray objects from scratch" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.load_dataset(\"air_temperature\")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "## DataArray\n", + "\n", + "The `DataArray` class is used to attach a name, dimension names, labels, and\n", + "attributes to an array.\n", + "\n", + "Our goal will be to recreate the `ds.air` DataArray starting with the underlying numpy data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "ds.air" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "array = ds.air.data" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "We do this using the [DataArray](https://docs.xarray.dev/en/stable/generated/xarray.DataArray.html) _constructor_." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "xr.DataArray(array)" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "This works. Notice that the default dimension names are not so useful: `dim_0`, `dim_1`, `dim_2`\n", + "\n", + "\n", + "### Dimension Names\n", + "\n", + "We can change this by specifying dimension names in the appropriate order using the `dims` kwarg " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "xr.DataArray(array, dims=(\"time\", \"lat\", \"lon\"))" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "Much better! But notice we have no entries under \"Coordinates\".\n", + "\n", + "### Coordinates\n", + "\n", + "While associating names with dimensions (or axes) of an array is quite useful, attaching coordinate labels to DataArrays makes a lot of analysis quite convenient.\n", + "\n", + "First we'll simply add values for `lon` using the `coords` kwarg. For this datasets, longitudes are regularly spaced at 2.5° intervals between 200°E and 330°E.\n", + "\n", + "`coords` takes a dictionary that maps the name of a dimension to one of\n", + "- another `DataArray` object\n", + "- a tuple of the form `(dims, data, attrs)` where `attrs` is optional. This is\n", + " roughly equivalent to creating a new `DataArray` object with\n", + " `DataArray(dims=dims, data=data, attrs=attrs)`\n", + "- a `numpy` array (or anything that can be coerced to one using `numpy.array`).\n", + "\n", + "We'll start with the last one" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "lon_values = np.arange(200, 331, 2.5)\n", + "xr.DataArray(array, dims=(\"time\", \"lat\", \"lon\"), coords={\"lon\": lon_values})" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "Assigning a plain numpy array is equivalent to creating a DataArray with those values and the same dimension name" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "lon_da = xr.DataArray(lon_values, dims=\"lon\")\n", + "da = xr.DataArray(array, dims=(\"time\", \"lat\", \"lon\"), coords={\"lon\": lon_da})\n", + "da" + ] + }, + { + "cell_type": "markdown", + "id": "15", + "metadata": {}, + "source": [ + "We can also assign coordinates after a DataArray has been created." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "da.coords[\"lat\"] = np.arange(75, 14.9, -2.5)\n", + "da" + ] + }, + { + "cell_type": "markdown", + "id": "17", + "metadata": {}, + "source": [ + "### Attributes \n", + "\n", + "Arbitrary attributes can be assigned using the `.attrs` property" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "da.attrs[\"attribute\"] = \"hello\"\n", + "da" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "or specified in the constructor" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "da2 = xr.DataArray(\n", + " array, dims=(\"time\", \"lat\", \"lon\"), coords={\"lon\": lon_da}, attrs={\"attribute\": \"hello\"}\n", + ")\n", + "da2" + ] + }, + { + "cell_type": "markdown", + "id": "21", + "metadata": {}, + "source": [ + "### Non-dimension coordinates\n", + "\n", + "Sometimes we want to attach coordinate variables along an existing dimension. Notice that \n", + "1. `itime` is not bolded and \n", + "2. has a name \"itime\" that is different from the dimension name \"time\"\n", + "\n", + "`itime` is an example of a non-dimension coordinate variable i.e. it is a coordinate variable that does not match a dimension name. Here we demonstrate the \"tuple\" form of assigninment: `(dims, data, attrs)`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": {}, + "outputs": [], + "source": [ + "da.coords[\"itime\"] = (\"time\", np.arange(2920), {\"name\": \"value\"})\n", + "da" + ] + }, + { + "cell_type": "markdown", + "id": "23", + "metadata": {}, + "source": [ + "### Exercises\n", + "\n", + "create a `DataArray` named \"height\" from random data `rng.random((180, 360)) * 400`\n", + "\n", + "1. with dimensions named \"latitude\" and \"longitude\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": { + "tags": [ + "hide-input", + "hide-output" + ] + }, + "outputs": [], + "source": [ + "xr.DataArray(rng.random((180, 360)) * 400, dims=(\"latitude\", \"longitude\"), name=\"height\")" + ] + }, + { + "cell_type": "markdown", + "id": "25", + "metadata": {}, + "source": [ + "2. with dimension coordinates:\n", + "\n", + "- \"latitude\": -90 to 89 with step size 1\n", + "- \"longitude\": -180 to 179 with step size 1\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": { + "tags": [ + "hide-input", + "hide-output" + ] + }, + "outputs": [], + "source": [ + "xr.DataArray(\n", + " rng.random((180, 360)) * 400,\n", + " dims=(\"latitude\", \"longitude\"),\n", + " coords={\"latitude\": np.arange(-90, 90, 1), \"longitude\": np.arange(-180, 180, 1)},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "27", + "metadata": {}, + "source": [ + "3. with metadata for both data and coordinates:\n", + "\n", + "- height: \"type\": \"ellipsoid\"\n", + "- latitude: \"type\": \"geodetic\"\n", + "- longitude: \"prime_meridian\": \"greenwich\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28", + "metadata": {}, + "outputs": [], + "source": [ + "xr.DataArray(\n", + " rng.random((180, 360)) * 400,\n", + " dims=(\"latitude\", \"longitude\"),\n", + " coords={\n", + " \"latitude\": (\"latitude\", np.arange(-90, 90, 1), {\"type\": \"geodetic\"}),\n", + " \"longitude\": (\n", + " \"longitude\",\n", + " np.arange(-180, 180, 1),\n", + " {\"prime_meridian\": \"greenwich\"},\n", + " ),\n", + " },\n", + " attrs={\"type\": \"ellipsoid\"},\n", + " name=\"height\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "29", + "metadata": {}, + "source": [ + "## Dataset\n", + "\n", + "`Dataset` objects collect multiple data variables, each with possibly different\n", + "dimensions.\n", + "\n", + "The constructor of `Dataset` takes three parameters:\n", + "\n", + "- `data_vars`: dict-like mapping names to values. Values are either `DataArray` objects\n", + " or defined with tuples consisting of of dimension names and arrays.\n", + "- `coords`: same as for `DataArray`\n", + "- `attrs`: same as for `Dataset`" + ] + }, + { + "cell_type": "markdown", + "id": "30", + "metadata": {}, + "source": [ + "Creating an empty Dataset is easy!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31", + "metadata": {}, + "outputs": [], + "source": [ + "xr.Dataset()" + ] + }, + { + "cell_type": "markdown", + "id": "32", + "metadata": {}, + "source": [ + "### Data Variables\n", + "\n", + "Let's create a `Dataset` with two data variables: `da` and `da2`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.Dataset({\"air\": da, \"air2\": da2})\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "34", + "metadata": {}, + "source": [ + "You can directly assign a new data variables" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "35", + "metadata": {}, + "outputs": [], + "source": [ + "ds[\"air3\"] = da\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "36", + "metadata": {}, + "source": [ + "### Coordinates\n", + "\n", + "Coordinate variables can be assigned using the `coords` kwarg to `xr.Dataset`. Here we use `date_range` from pandas to create a time vector" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "37", + "metadata": {}, + "outputs": [], + "source": [ + "xr.Dataset(\n", + " {\"air\": da, \"air2\": da2},\n", + " coords={\"time\": pd.date_range(\"2013-01-01\", \"2014-12-31 18:00\", freq=\"6H\")},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "38", + "metadata": {}, + "source": [ + "Again we can assign coordinate variables after a Dataset has been created." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39", + "metadata": {}, + "outputs": [], + "source": [ + "ds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "40", + "metadata": {}, + "outputs": [], + "source": [ + "ds.coords[\"time\"] = pd.date_range(\"2013-01-01\", \"2014-12-31 18:00\", freq=\"6H\")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "41", + "metadata": {}, + "source": [ + "### Attributes" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42", + "metadata": {}, + "outputs": [], + "source": [ + "xr.Dataset(\n", + " {\"air\": da, \"air2\": da2},\n", + " coords={\"time\": pd.date_range(\"2013-01-01\", \"2014-12-31 18:00\", freq=\"6H\")},\n", + " attrs={\"key0\": \"value0\"},\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43", + "metadata": {}, + "outputs": [], + "source": [ + "ds.attrs[\"key\"] = \"value\"" + ] + }, + { + "cell_type": "markdown", + "id": "44", + "metadata": {}, + "source": [ + "### Exercises\n", + "\n", + "1. create a Dataset with two variables along `latitude` and `longitude`:\n", + " `height` and `gravity_anomaly`\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45", + "metadata": {}, + "outputs": [], + "source": [ + "height = rng.random((180, 360)) * 400\n", + "gravity_anomaly = rng.random((180, 360)) * 400 - 200" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46", + "metadata": { + "tags": [ + "hide-input", + "hide-output" + ] + }, + "outputs": [], + "source": [ + "xr.Dataset(\n", + " {\n", + " \"height\": ((\"latitude\", \"longitude\"), height),\n", + " \"gravity_anomaly\": ((\"latitude\", \"longitude\"), gravity_anomaly),\n", + " }\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "47", + "metadata": {}, + "source": [ + "2. add coordinates to `latitude` and `longitude`:\n", + "\n", + "- `latitude`: from -90 to 90 with step size 1\n", + "- `longitude`: from -180 to 180 with step size 1\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48", + "metadata": {}, + "outputs": [], + "source": [ + "xr.Dataset(\n", + " {\n", + " \"height\": ((\"latitude\", \"longitude\"), height),\n", + " \"gravity_anomaly\": ((\"latitude\", \"longitude\"), gravity_anomaly),\n", + " },\n", + " coords={\n", + " \"latitude\": (\"latitude\", np.arange(-90, 90, 1)),\n", + " \"longitude\": (\"longitude\", np.arange(-180, 180, 1)),\n", + " },\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "49", + "metadata": {}, + "source": [ + "3. add metadata to coordinates and variables:\n", + "\n", + "- `latitude`: \"type\": \"geodetic\"\n", + "- `longitude`: \"prime_meridian\": \"greenwich\"\n", + "- `height`: \"ellipsoid\": \"wgs84\"\n", + "- `gravity_anomaly`: \"ellipsoid\": \"grs80\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50", + "metadata": { + "tags": [ + "hide-input", + "hide-output" + ] + }, + "outputs": [], + "source": [ + "xr.Dataset(\n", + " {\n", + " \"height\": ((\"latitude\", \"longitude\"), height, {\"ellipsoid\": \"wgs84\"}),\n", + " \"gravity_anomaly\": ((\"latitude\", \"longitude\"), gravity_anomaly, {\"ellipsoid\": \"grs80\"}),\n", + " },\n", + " coords={\n", + " \"latitude\": (\"latitude\", np.arange(-90, 90, 1), {\"type\": \"geodetic\"}),\n", + " \"longitude\": (\n", + " \"longitude\",\n", + " np.arange(-180, 180, 1),\n", + " {\"prime_meridian\": \"greenwich\"},\n", + " ),\n", + " },\n", + ")" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/fundamentals/01.1_io.ipynb b/fundamentals/01.1_io.ipynb new file mode 100644 index 00000000..0520f976 --- /dev/null +++ b/fundamentals/01.1_io.ipynb @@ -0,0 +1,304 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Reading and writing files\n", + "\n", + "One of Xarray's most widely used features is its ability to [read from and write\n", + "to a variety of data formats](https://docs.xarray.dev/en/stable/user-guide/io.html). \n", + "For example, Xarray can read the following formats using `open_dataset`/`open_mfdataset`:\n", + "\n", + "- [NetCDF](https://www.unidata.ucar.edu/software/netcdf/)\n", + "- [Zarr](https://zarr.readthedocs.io/en/stable/)\n", + "\n", + "Support for additional formats is possible using external packages\n", + "- [GRIB](https://en.wikipedia.org/wiki/GRIB) using the [cfgrib](https://github.com/ecmwf/cfgrib) package\n", + "- [GeoTIFF](https://gdal.org/drivers/raster/gtiff.html) /\n", + " [GDAL rasters](https://svn.osgeo.org/gdal/tags/gdal_1_2_5/frmts/formats_list.html)\n", + " using the [rioxarray package](https://corteva.github.io/rioxarray/stable/)\n", + "\n", + "\n", + "\n", + "## NetCDF\n", + "\n", + "The recommended way to store xarray data structures is NetCDF, which is a binary\n", + "file format for self-described datasets that originated in the geosciences.\n", + "Xarray is based on the netCDF data model, so netCDF files on disk directly\n", + "correspond to Dataset objects.\n", + "\n", + "Xarray reads and writes to NetCDF files using the `open_dataset` /\n", + "`open_dataarray` functions and the `to_netcdf` method.\n", + "\n", + "Let's first create some datasets and write them to disk using `to_netcdf`, which\n", + "takes the path we want to write to:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "# Ensure random arrays are the same each time\n", + "np.random.seed(0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "# Ensure we start with a clean directory for the tutorial\n", + "import pathlib\n", + "import shutil\n", + "\n", + "datadir = pathlib.Path(\"../data/io-tutorial\")\n", + "if datadir.exists():\n", + " shutil.rmtree(datadir)\n", + "else:\n", + " datadir.mkdir()" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "The constructor of `Dataset` takes three parameters:\n", + "\n", + "- `data_vars`: dict-like mapping names to values. Values are either `DataArray` objects\n", + " or defined with tuples consisting of of dimension names and arrays.\n", + "- `coords`: same as for `DataArray`\n", + "- `attrs`: same as for `DataArray`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "ds1 = xr.Dataset(\n", + " data_vars={\n", + " \"a\": ((\"x\", \"y\"), np.random.randn(4, 2)),\n", + " \"b\": ((\"z\", \"x\"), np.random.randn(6, 4)),\n", + " },\n", + " coords={\n", + " \"x\": np.arange(4),\n", + " \"y\": np.arange(-2, 0),\n", + " \"z\": np.arange(-3, 3),\n", + " },\n", + ")\n", + "ds2 = xr.Dataset(\n", + " data_vars={\n", + " \"a\": ((\"x\", \"y\"), np.random.randn(7, 3)),\n", + " \"b\": ((\"z\", \"x\"), np.random.randn(2, 7)),\n", + " },\n", + " coords={\n", + " \"x\": np.arange(6, 13),\n", + " \"y\": np.arange(3),\n", + " \"z\": np.arange(3, 5),\n", + " },\n", + ")\n", + "\n", + "# write datasets\n", + "ds1.to_netcdf(datadir / \"ds1.nc\")\n", + "ds2.to_netcdf(datadir / \"ds2.nc\")\n", + "\n", + "# write dataarray\n", + "ds1.a.to_netcdf(datadir / \"da1.nc\")" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "Reading those files is just as simple:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "xr.open_dataset(datadir / \"ds1.nc\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "xr.open_dataarray(datadir / \"da1.nc\")" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n", + "## Zarr\n", + "\n", + "[Zarr](https://zarr.readthedocs.io/en/stable/) is a Python package and data\n", + "format providing an implementation of chunked, compressed, N-dimensional arrays.\n", + "Zarr has the ability to store arrays in a range of ways, including in memory, in\n", + "files, and in cloud-based object storage such as Amazon S3 and Google Cloud\n", + "Storage. Xarray’s Zarr backend allows xarray to leverage these capabilities.\n", + "\n", + "Zarr files can be written with:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "ds1.to_zarr(datadir / \"ds1.zarr\", mode=\"w\")" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "We can then read the created file with:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "xr.open_zarr(datadir / \"ds1.zarr\", chunks=None)" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "setting the `chunks` parameter to `None` avoids `dask` (more on that in a later\n", + "session)\n" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "**tip:** You can write to any dictionary-like (`MutableMapping`) interface:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "mystore = {}\n", + "\n", + "ds1.to_zarr(store=mystore)" + ] + }, + { + "cell_type": "markdown", + "id": "15", + "metadata": {}, + "source": [ + "## Raster files using rioxarray\n", + "\n", + "[rioxarray](https://corteva.github.io/rioxarray/) is an *Xarray extension* that allows reading and writing a wide variety of geospatial image formats compatible with Geographic Information Systems (GIS), for example GeoTIFF.\n", + "\n", + "If rioxarray is installed your environment it will be automatically detected and give you access to the `.rio` accessor:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "da = xr.DataArray(\n", + " data=ds1.a.data,\n", + " coords={\n", + " \"y\": np.linspace(47.5, 47.8, 4),\n", + " \"x\": np.linspace(-122.9, -122.7, 2),\n", + " },\n", + ")\n", + "\n", + "# Add Geospatial Coordinate Reference https://epsg.io/4326\n", + "# this is stored as a 'spatial_ref' coordinate\n", + "da.rio.write_crs(\"epsg:4326\", inplace=True)\n", + "da" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "da.rio.to_raster(datadir / \"ds1_a.tiff\")" + ] + }, + { + "cell_type": "markdown", + "id": "18", + "metadata": {}, + "source": [ + "NOTE: you can now load this file into GIS tools like [QGIS](https://www.qgis.org)! Or open back into Xarray:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19", + "metadata": {}, + "outputs": [], + "source": [ + "DA = xr.open_dataarray(datadir / \"ds1_a.tiff\", engine=\"rasterio\")\n", + "DA.rio.crs" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/fundamentals/01_data_structures.md b/fundamentals/01_data_structures.md new file mode 100644 index 00000000..389f1f4d --- /dev/null +++ b/fundamentals/01_data_structures.md @@ -0,0 +1,69 @@ +# Data Structures + +Multi-dimensional (a.k.a. N-dimensional, ND) arrays (sometimes called “tensors”) +are an essential part of computational science. They are encountered in a wide +range of fields, including physics, astronomy, geoscience, bioinformatics, +engineering, finance, and deep learning. In Python, [NumPy](https://numpy.org/) +provides the fundamental data structure and API for working with raw ND arrays. +However, real-world datasets are usually more than just raw numbers; they have +labels which encode information about how the array values map to locations in +space, time, etc. + +The N-dimensional nature of Xarray’s data structures makes it suitable for +dealing with multi-dimensional scientific data, and its use of dimension names +instead of axis labels (`dim='time'` instead of `axis=0`) makes such arrays much +more manageable than the raw NumPy ndarray: with Xarray, you don’t need to keep +track of the order of an array’s dimensions or insert dummy dimensions of size 1 +to align arrays (e.g., using np.newaxis). + +The immediate payoff of using Xarray is that you’ll write less code. The +long-term payoff is that you’ll understand what you were thinking when you come +back to look at it weeks or months later. + +## Example: Weather forecast + +Here is an example of how we might structure a dataset for a weather forecast: + + + +You'll notice multiple data variables (temperature, precipitation), coordinate +variables (latitude, longitude), and dimensions (x, y, t). We'll cover how these +fit into Xarray's data structures below. + +Xarray doesn’t just keep track of labels on arrays – it uses them to provide a +powerful and concise interface. For example: + +- Apply operations over dimensions by name: `x.sum('time')`. + +- Select values by label (or logical location) instead of integer location: + `x.loc['2014-01-01']` or `x.sel(time='2014-01-01')`. + +- Mathematical operations (e.g., `x - y`) vectorize across multiple dimensions + (array broadcasting) based on dimension names, not shape. + +- Easily use the split-apply-combine paradigm with groupby: + `x.groupby('time.dayofyear').mean()`. + +- Database-like alignment based on coordinate labels that smoothly handles + missing values: `x, y = xr.align(x, y, join='outer')`. + +- Keep track of arbitrary metadata in the form of a Python dictionary: + `x.attrs`. + +## Example: Mosquito genetics + +Although the Xarray library was originally developed with Earth Science datasets in mind, the datastructures work well across many other domains! For example, below is a side-by-side view of a data schematic on the left and Xarray Dataset representation on the right taken from a mosquito genetics analysis: + +![malaria_dataset](../images/malaria_dataset.png) + +The data can be stored as a 3-dimensional array, where one dimension of the array corresponds to positions (**variants**) within a reference genome, another dimension corresponds to the individual mosquitoes that were sequenced (**samples**), and a third dimension corresponds to the number of genomes within each individual (**ploidy**)." + +You can explore this dataset in detail via the [training course in data analysis for genomic surveillance of African malaria vectors](https://anopheles-genomic-surveillance.github.io/workshop-5/module-1-xarray.html)! + +## Explore on your own + +The following collection of notebooks provide interactive code examples for working with example datasets and constructing Xarray data structures manually. + +```{tableofcontents} + +``` diff --git a/fundamentals/01_datastructures.ipynb b/fundamentals/01_datastructures.ipynb new file mode 100644 index 00000000..f9add737 --- /dev/null +++ b/fundamentals/01_datastructures.ipynb @@ -0,0 +1,426 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Xarray's Data structures\n", + "\n", + "In this lesson, we cover the basics of Xarray data structures. By the end of the lesson, we will be able to:\n", + "\n", + ":::{admonition} Learning Goals\n", + "- Understand the basic Xarray data structures `DataArray` and `Dataset` \n", + "- Customize the display of Xarray data structures\n", + "- The connection between Pandas and Xarray data structures\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data structures\n", + "\n", + "Xarray provides two data structures: the `DataArray` and `Dataset`. The\n", + "`DataArray` class attaches dimension names, coordinates and attributes to\n", + "multi-dimensional arrays while `Dataset` combines multiple DataArrays.\n", + "\n", + "Both classes are most commonly created by reading data.\n", + "To learn how to create a DataArray or Dataset manually, see the [Creating Data Structures](01.1_creating_data_structures.ipynb) tutorial." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import xarray as xr\n", + "\n", + "# When working in a Jupyter Notebook you might want to customize Xarray display settings to your liking\n", + "# The following settings reduce the amount of data displayed out by default\n", + "xr.set_options(display_expand_attrs=False, display_expand_data=False)\n", + "np.set_printoptions(threshold=10, edgeitems=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Dataset\n", + "\n", + "`Dataset` objects are dictionary-like containers of DataArrays, mapping a variable name to each DataArray.\n", + "\n", + "Xarray has a few small real-world tutorial datasets hosted in this GitHub repository https://github.com/pydata/xarray-data.\n", + "We'll use the [xarray.tutorial.load_dataset](https://docs.xarray.dev/en/stable/generated/xarray.tutorial.open_dataset.html#xarray.tutorial.open_dataset) convenience function to download and open the `air_temperature` (National Centers for Environmental Prediction) Dataset by name." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.load_dataset(\"air_temperature\")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can access \"layers\" of the Dataset (individual DataArrays) with dictionary syntax" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds[\"air\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can save some typing by using the \"attribute\" or \"dot\" notation. This won't work for variable names that clash with built-in\n", + "method names (for example, `mean`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.air" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### HTML vs text representations\n", + "\n", + "Xarray has two representation types: `\"html\"` (which is only available in\n", + "notebooks) and `\"text\"`. To choose between them, use the `display_style` option.\n", + "\n", + "So far, our notebook has automatically displayed the `\"html\"` representation (which we will continue using).\n", + "The `\"html\"` representation is interactive, allowing you to collapse sections (▶) and\n", + "view attributes and values for each value (📄 and ≡)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with xr.set_options(display_style=\"html\"):\n", + " display(ds)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "☝️ From top to bottom the output consists of:\n", + "\n", + "- **Dimensions**: summary of all *dimensions* of the `Dataset` `(lat: 25, time: 2920, lon: 53)`: this tells us that the first dimension is named `lat` and has a size of `25`, the second dimension is named `time` and has a size of `2920`, and the third dimension is named `lon` and has a size of `53`. Because we will access the dimensions by name, the order doesn't matter.\n", + "- **Coordinates**: an unordered list of *coordinates* or dimensions with coordinates with one item per line. Each item has a name, one or more dimensions in parentheses, a dtype and a preview of the values. Also, if it is a dimension coordinate, it will be printed in **bold** font. *dimensions without coordinates* appear in plain font (there are none in this example, but you might imagine a 'mask' coordinate that has a value assigned at every point).\n", + "- **Data variables**: names of each nD *measurement* in the dataset, followed by its dimensions `(time, lat, lon)`, dtype, and a preview of values.\n", + "- **Indexes**: Each dimension with coordinates is backed by an \"Index\". In this example, each dimension is backed by a `PandasIndex`\n", + "- **Attributes**: an unordered list of metadata (for example, a paragraph describing the dataset)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Compare that with the string representation, which is very similar except the dimensions are given a `*` prefix instead of bold and you cannot collapse or expand the outputs." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with xr.set_options(display_style=\"text\"):\n", + " display(ds)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To understand each of the components better, we'll explore the \"air\" variable of our Dataset." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### DataArray\n", + "\n", + "The `DataArray` class consists of an array (data) and its associated dimension names, labels, and attributes (metadata).\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da = ds[\"air\"]\n", + "da" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### String representations\n", + "\n", + "We can use the same two representations (`\"html\"`, which is only available in\n", + "notebooks, and `\"text\"`) to display our `DataArray`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with xr.set_options(display_style=\"html\"):\n", + " display(da)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with xr.set_options(display_style=\"text\"):\n", + " display(da)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the string representation of a `DataArray` (versus a `Dataset`), we also see:\n", + "- the `DataArray` name ('air')\n", + "- a preview of the array data (collapsible in the `\"html\"` representation)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also access the data array directly:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.data # (or equivalently, `da.data`)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Named dimensions \n", + "\n", + "`.dims` are the named axes of your data. They may (dimension coordinates) or may not (dimensions without coordinates) have associated values. Names can be anything that fits into a Python `set` (i.e. calling `hash()` on it doesn't raise an error), but to be\n", + "useful they should be strings.\n", + "\n", + "In this case we have 2 spatial dimensions (`latitude` and `longitude` are stored with shorthand names `lat` and `lon`) and one temporal dimension (`time`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.dims" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Coordinates\n", + "\n", + "\n", + "`.coords` is a simple [dict-like](https://docs.python.org/3/glossary.html#term-mapping) [data container](https://docs.xarray.dev/en/stable/user-guide/data-structures.html#coordinates)\n", + "for mapping coordinate names to values. These values can be:\n", + "- another `DataArray` object\n", + "- a tuple of the form `(dims, data, attrs)` where `attrs` is optional. This is\n", + " roughly equivalent to creating a new `DataArray` object with\n", + " `DataArray(dims=dims, data=data, attrs=attrs)`\n", + "- a 1-dimensional `numpy` array (or anything that can be coerced to one using [`numpy.array`](https://numpy.org/doc/stable/reference/generated/numpy.array.html), such as a `list`) containing numbers, datetime objects, strings, etc. to label each point.\n", + "\n", + "Here we see the actual timestamps and spatial positions of our air temperature data:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.coords" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The difference between the dimension labels (dimension coordinates) and normal\n", + "coordinates is that for now it only is possible to use indexing operations\n", + "(`sel`, `reindex`, etc.) with dimension coordinates. Also, while coordinates can\n", + "have arbitrary dimensions, dimension coordinates have to be one-dimensional." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Attributes \n", + "\n", + "`.attrs` is a dictionary that can contain arbitrary Python objects (strings, lists, integers, dictionaries, etc.) containing information about your data. Your only\n", + "limitation is that some attributes may not be writeable to certain file formats." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.attrs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## To Pandas and back\n", + "\n", + "`DataArray` and `Dataset` objects are frequently created by converting from\n", + "other libraries such as [pandas](https://pandas.pydata.org/) or by reading from\n", + "data storage formats such as\n", + "[NetCDF](https://www.unidata.ucar.edu/software/netcdf/) or\n", + "[zarr](https://zarr.readthedocs.io/en/stable/).\n", + "\n", + "To convert from / to `pandas`, we can use the\n", + "[to_xarray](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_xarray.html)\n", + "methods on [pandas](https://zarr.readthedocs.io/en/stable/) objects or the\n", + "[to_pandas](https://docs.xarray.dev/en/stable/generated/xarray.DataArray.to_pandas.html)\n", + "methods on `xarray` objects:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "series = pd.Series(np.ones((10,)), index=list(\"abcdefghij\"))\n", + "series" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr = series.to_xarray()\n", + "arr" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr.to_pandas()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also control what `pandas` object is used by calling `to_series` /\n", + "`to_dataframe`:\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### to_series\n", + "This will always convert `DataArray` objects to `pandas.Series`, using a `MultiIndex` for higher dimensions\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.to_series()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### to_dataframe\n", + "\n", + "This will always convert `DataArray` or `Dataset` objects to a `pandas.DataFrame`. Note that `DataArray` objects have to be named for this. Since columns in a `DataFrame` need to have the same index, they are\n", + "broadcasted." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.to_dataframe()" + ] + } + ], + "metadata": { + "interpreter": { + "hash": "e1fd91e1433c68a24bbc2950cbc84f731f846faaebb12a808b0de0faaa910846" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/fundamentals/01_datatree_hierarchical_data.ipynb b/fundamentals/01_datatree_hierarchical_data.ipynb new file mode 100644 index 00000000..4c4d4142 --- /dev/null +++ b/fundamentals/01_datatree_hierarchical_data.ipynb @@ -0,0 +1,241 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# `xarray.DataTree` and hierarchical data\n", + "\n", + "In this lesson, we will learn how to use `xarray.DataTree` with hierarchical data. By the end of the lesson, we will be able to:\n", + "\n", + ":::{admonition} Learning Goals\n", + "- Understand a basic `DataTree` structure (nodes, parents and children)\n", + "- Selecting `DataTree`\n", + "- Understand coordinate inheritance :::\n", + "\n", + "\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## What is a DataTree\n", + "\n", + "### Example DataTree 1\n", + "\n", + "![image.png](../_static/datatree1.png)\n", + "\n", + "\n", + "\n", + "### Example DataTree 2\n", + "\n", + "![image.png](../_static/datatree2.png)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Opening a dataset with `open_datatree()`\n", + "\n", + "Let's open up a precipitation dataset. This dataset was derived from \"GPM_3IMERGHH_07\" and \"M2T1NXFLX_5.12.4\" products." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "precipitation = xr.tutorial.open_datatree(\"precipitation.nc4\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Nodes\n", + "Groups in a netcdf4 or hdf5 file in the DataTree model are represented as \"nodes\" in the DataTree model.\n", + "We can list all of the groups with `.groups`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "precipitation.groups" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Accessing variables in a nested groups\n", + "Nested variables and groups can be accessed with either dict-like syntax or method based syntax." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "precipitation[\"observed\"]\n", + "\n", + "# Returns a DataTree object, containing the variables, dimensions, and coordinates in the \"observed\" node" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "precipitation[\"/observed/precipitation\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "precipitation.reanalysis.precipitation\n", + "\n", + "# Method based syntax" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Get the parent and child nodes from a group" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "precipitation[\"reanalysis\"].parent" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "precipitation.children" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Inheritance\n", + "DataTree implements a simple inheritance mechanism. Coordinates, dimensions and their associated indices are propagated downward from the root node to all descendent nodes.\n", + "\n", + "Let's take a look at some inherited coordinates with our precipitation dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "precipitation.time" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `\"time\"` dimension is defined at the root node of our dataset and is propagated downward to the \"observed\" and \"reanalysis\" group" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "precipitation.observed" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "precipitation.reanalysis" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Review\n", + "\n", + "\n", + "### Example DataTree 1\n", + "![image.png](../_static/datatree1.png)\n", + "\n", + "\n", + "### Example DataTree 2\n", + "![image.png](../_static/datatree2.png)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "\n", + "1. Make a plot of plot of the Oberserved and Predicted precipitation\n", + "2. Think through if there are datasets from your field" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/fundamentals/02.1_indexing_Basic.ipynb b/fundamentals/02.1_indexing_Basic.ipynb new file mode 100644 index 00000000..217c21ab --- /dev/null +++ b/fundamentals/02.1_indexing_Basic.ipynb @@ -0,0 +1,787 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Indexing and Selecting Data\n", + "\n", + "## Learning Objectives\n", + "\n", + "- Understanding the difference between position and label-based indexing\n", + "- Select data by position using `.isel` with values or slices\n", + "- Select data by label using `.sel` with values or slices\n", + "- Use nearest-neighbor lookups with `.sel`\n", + "- Select timeseries data by date/time with values or slices\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction\n", + "\n", + "Xarray offers extremely flexible indexing routines that combine the best features of NumPy and Pandas for data selection.\n", + "\n", + "The most basic way to access elements of a `DataArray` object is to use Python’s `[]` syntax, such as `array[i, j]`, where `i` and `j` are both integers.\n", + "\n", + "As xarray objects can store coordinates corresponding to each dimension of an array, label-based indexing is also possible (e.g. `.sel(latitude=0)`, similar to `pandas.DataFrame.loc`). In label-based indexing, the element position `i` is automatically looked-up from the coordinate values.\n", + "\n", + "By leveraging the labeled dimensions and coordinates provided by Xarray, users can effortlessly access, subset, and manipulate data along multiple axes, enabling complex operations such as slicing, masking, and aggregating data based on specific criteria. \n", + "\n", + "This indexing and selection capability of Xarray not only enhances data exploration and analysis workflows but also promotes reproducibility and efficiency by providing a convenient interface for working with multi-dimensional data structures.\n", + "\n", + "## Quick Overview \n", + "\n", + "In total, xarray supports four different kinds of indexing, as described below and summarized in this table:\n", + "\n", + "| Dimension lookup | Index lookup | `DataArray` syntax | `Dataset` syntax |\n", + "| ---------------- | ------------ | ---------------------| ---------------------|\n", + "| Positional | By integer | `da[:,0]` | *not available* |\n", + "| Positional | By label | `da.loc[:,'IA']` | *not available* |\n", + "| By name | By integer | `da.isel(space=0)` or `da[dict(space=0)]` | `ds.isel(space=0)` or `ds[dict(space=0)]` |\n", + "| By name | By label | `da.sel(space='IA')` or `da.loc[dict(space='IA')]` | `ds.sel(space='IA')` or `ds.loc[dict(space='IA')]` |\n", + "\n", + "\n", + "----------\n", + "\n", + "In this tutorial, first we cover the positional indexing and label-based indexing, next we will cover more advanced techniques such as nearest neighbor lookups. \n", + "\n", + "First, let's import packages: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import xarray as xr\n", + "\n", + "xr.set_options(display_expand_attrs=False, display_expand_data=False);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we’ll use air temperature tutorial dataset from the [National Center for Environmental Prediction](https://www.weather.gov/ncep/). " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ds = xr.tutorial.load_dataset(\"air_temperature\")\n", + "ds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "da = ds[\"air\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Position-based Indexing\n", + "\n", + "Indexing a `DataArray` directly works (mostly) just like it does for numpy `ndarrays`, except that the returned object is always another `DataArray`:\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### NumPy Positional Indexing\n", + "\n", + "When working with numpy, indexing is done by position (slices/ranges/scalars).\n", + "\n", + "For example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "np_array = ds[\"air\"].data # numpy array\n", + "np_array.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Indexing is 0-based in NumPy:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "np_array[1, 0, 0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similarly, we can select a range in NumPy:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# extract a time-series for one spatial location\n", + "np_array[:, 20, 40]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "### Positional Indexing with Xarray" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Xarray offers extremely flexible indexing routines that combine the best\n", + "features of NumPy and pandas for data selection." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "#### NumPy style indexing with Xarray\n", + "\n", + "NumPy style indexing works exactly the same with Xarray but it also preserves labels and metadata. \n", + "\n", + "This approach however does not take advantage of the dimension names and coordinate location information that is present in a Xarray object." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "da[:, 20, 40]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Positional Indexing Using Dimension Names" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remembering the axis order can be challenging even with 2D arrays:\n", + "- is `np_array[0,3]` the first row and third column or first column and third row? \n", + "- or did I store these samples by row or by column when I saved the data?!. \n", + "\n", + "The difficulty is compounded with added dimensions. \n", + "\n", + "Xarray objects eliminate much of the mental overhead by allowing indexing using dimension names instead of axes numbers:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "da.isel(lat=20, lon=40).plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Slicing is also possible similarly:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "da.isel(time=slice(0, 20), lat=20, lon=40).plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{note}\n", + "Using the `isel` method, the user can choose/slice the specific elements from a Dataset or DataArray.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "Indexing a DataArray directly works (mostly) just like it does for numpy arrays, except that the returned object is always another DataArray; however,when indexing with multiple arrays, positional indexing in Xarray behaves differently compared to NumPy.\n", + "\n", + "```{caution}\n", + "Positional indexing deviates from the NumPy behavior when indexing with multiple arrays. \n", + "```\n", + "We can show this with an example: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "np_array[:, [0, 1], [0, 1]].shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "da[:, [0, 1], [0, 1]].shape" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "Please note how the dimension of the `DataArray()` object is different from the `numpy.ndarray`.\n", + "\n", + "```{tip}\n", + "However, users can still achieve NumPy-like pointwise indexing across multiple labeled dimensions by using Xarray vectorized indexing techniques. We will delve further into this topic in the advanced indexing notebook.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So far, we have explored positional indexing, which relies on knowing the exact indices. But, what if you wanted to select data specifically for a particular latitude? It becomes challenging to determine the corresponding indices in such cases. Xarray reduce this complexity by introducing label-based indexing. \n", + "\n", + "## Label-based Indexing\n", + "\n", + "To select data by coordinate labels instead of integer indices we can use the same syntax, using `sel` instead of `isel`:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For example, let's select all data for Lat 25 °N and Lon 210 °E using `sel` :" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "da.sel(lat=25, lon=210).plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similarly we can do slicing or filter a range using the `.slice` function: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# demonstrate slicing\n", + "da.sel(lon=slice(210, 215))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# demonstrate slicing\n", + "da.sel(lat=slice(50, 25), lon=slice(210, 215))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Dropping using `drop_sel`\n", + "\n", + "If instead of selecting data we want to drop it, we can use `drop_sel` method with syntax similar to `sel`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "da.drop_sel(lat=50.0, lon=200.0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So far, all the above will require us to specify exact coordinate values, but what if we don't have the exact values? We can use nearest neighbor lookups to address this issue:\n", + "\n", + "## Nearest Neighbor Lookups\n", + "\n", + "The label based selection methods `sel()` support `method` and `tolerance` keyword argument. The `method` parameter allows for enabling nearest neighbor (inexact) lookups by use of the methods `pad`, `backfill` or `nearest`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "da.sel(lat=52.25, lon=251.8998, method=\"nearest\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "`tolerance` argument limits the maximum distance for valid matches with an inexact lookup:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "da.sel(lat=52.25, lon=251.8998, method=\"nearest\", tolerance=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{tip}\n", + "All of these indexing methods work on the dataset too!\n", + "```\n", + "\n", + "We can also use these methods to index all variables in a dataset simultaneously, returning a new dataset:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ds.sel(lat=52.25, lon=251.8998, method=\"nearest\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Datetime Indexing\n", + "\n", + "\n", + "Datetime indexing is a critical feature when working with time series data, which is a common occurrence in many fields, including finance, economics, and environmental sciences. Essentially, datetime indexing allows you to select data points or a series of data points that correspond to certain date or time criteria. This becomes essential for time-series analysis where the date or time information associated with each data point can be as critical as the data point itself.\n", + "\n", + "Let's see some of the techniques to perform datetime indexing in Xarray:\n", + "\n", + "### Selecting data based on single datetime\n", + "\n", + "Let's say we have a Dataset ds and we want to select data at a particular date and time, for instance, '2013-01-01' at 6AM. We can do this by using the `sel` (select) method, like so:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ds.sel(time=\"2013-01-01 06:00\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "By default, datetime selection will return a range of values that match the provided string. For e.g. `time=\"2013-01-01\"` will return all timestamps for that day (4 of them here):" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ds.sel(time=\"2013-01-01\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "We can use this feature to select all points in a year:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ds.sel(time=\"2014\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "or a month:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ds.sel(time=\"2014-May\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "### Selecting data for a range of dates\n", + "\n", + "Now, let's say we want to select data between a certain range of dates. We can still use the `sel` method, but this time we will combine it with slice:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# This will return a subset of the dataset corresponding to the entire year of 2013.\n", + "ds.sel(time=slice(\"2013-01-01\", \"2013-12-31\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "```{note}\n", + "\n", + "The slice function takes two arguments, start and stop, to make a slice that includes these endpoints. When we use `slice` with the `sel` method, it provides an efficient way to select a range of dates. The above example shows the usage of slice for datetime indexing.\n", + "\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Indexing with a DatetimeIndex or date string list\n", + "\n", + "Another technique is to use a list of datetime objects or date strings for indexing. For example, you could select data for specific, non-contiguous dates like this:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dates = [\"2013-07-09\", \"2013-10-11\", \"2013-12-24\"]\n", + "ds.sel(time=dates)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Fancy indexing based on year, month, day, or other datetime components\n", + "\n", + "In addition to the basic datetime indexing techniques, Xarray also supports \"fancy\" indexing options, which can provide more flexibility and efficiency in your data analysis tasks. You can directly access datetime components such as year, month, day, hour, etc. using the `.dt` accessor. Here is an example of selecting all data points from July across all years:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ds.sel(time=ds.time.dt.month == 7)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "Or, if you wanted to select data from a specific day of each month, you could use:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ds.sel(time=ds.time.dt.day == 15)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "Practice the syntax you’ve learned so far:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Select the first 30 entries of `latitude` and 30th to 40th entries of `longitude`:\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "```python\n", + "ds.isel(lat=slice(None, 30), lon=slice(30, 40))\n", + "```\n", + "\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Select all data at 75 degree north and between Jan 1, 2013 and Oct 15, 2013\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "```python\n", + "ds.sel(lat=75, time=slice(\"2013-01-01\", \"2013-10-15\"))\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Remove all entries at 260 and 270 degrees\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "```python\n", + "ds.drop_sel(lon=[260, 270])\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "In total, Xarray supports four different kinds of indexing, as described below and summarized in this table:\n", + "\n", + "\n", + "| Dimension lookup | Index lookup | `DataArray` syntax | `Dataset` syntax |\n", + "| ---------------- | ------------ | ---------------------| ---------------------|\n", + "| Positional | By integer | `da[:,0]` | *not available* |\n", + "| Positional | By label | `da.loc[:,'IA']` | *not available* |\n", + "| By name | By integer | `da.isel(space=0)` or `da[dict(space=0)]` | `ds.isel(space=0)` or `ds[dict(space=0)]` |\n", + "| By name | By label | `da.sel(space='IA')` or `da.loc[dict(space='IA')]` | `ds.sel(space='IA')` or `ds.loc[dict(space='IA')]` |\n", + "\n", + "\n", + "For enhanced indexing capabilities across all methods, you can utilize DataArray objects as an indexer. For more detailed information, please see the Advanced Indexing notebook.\n", + "\n", + "\n", + "## More Resources\n", + "\n", + "- [Xarray Docs - Indexing and Selecting Data](https://docs.xarray.dev/en/stable/indexing.html)" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": true, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/fundamentals/02.2_manipulating_dimensions.ipynb b/fundamentals/02.2_manipulating_dimensions.ipynb new file mode 100644 index 00000000..f158badd --- /dev/null +++ b/fundamentals/02.2_manipulating_dimensions.ipynb @@ -0,0 +1,117 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Manipulating Dimensions (Data Resolution)\n", + "\n", + "Sometimes we need to change the resolution of our data. We might need to look at inferred values between dimension (grid) spaces\n", + "or change the dimension spacing completely (for instance to add another variable). Learning goals:\n", + "\n", + "- Interpolate data to new coordinates" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import xarray as xr\n", + "\n", + "np.random.seed(0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr = xr.DataArray(\n", + " np.random.randn(4, 6),\n", + " dims=(\"x\", \"y\"),\n", + " coords={\n", + " \"x\": [-3.2, 2.1, 5.3, 6.5],\n", + " \"y\": pd.date_range(\"2009-01-05\", periods=6, freq=\"ME\"),\n", + " },\n", + ")\n", + "arr" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Interpolation\n", + "\n", + "If we want to look at values between the current grid cells (interpolation), we\n", + "can do that with `interp` (requires `scipy`):\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "arr.interp(\n", + " x=np.linspace(2, 6, 10),\n", + " y=pd.date_range(\"2009-04-01\", \"2009-04-30\", freq=\"D\"),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "when trying to extrapolate, the resulting values will be `nan`.\n", + "\n", + "If we already have a object with the desired coordinates, we can use\n", + "`interp_like`:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "other = xr.DataArray(\n", + " dims=(\"x\", \"y\"),\n", + " coords={\n", + " \"x\": np.linspace(2, 4, 10),\n", + " \"y\": pd.date_range(\"2009-04-01\", \"2009-04-30\", freq=\"D\"),\n", + " },\n", + ")\n", + "arr.interp_like(other)" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/fundamentals/02.3_aligning_data_objects.ipynb b/fundamentals/02.3_aligning_data_objects.ipynb new file mode 100644 index 00000000..490fbc88 --- /dev/null +++ b/fundamentals/02.3_aligning_data_objects.ipynb @@ -0,0 +1,570 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Computing with Multiple Objects\n", + "\n", + "Learning goals:\n", + "\n", + "- Perform operations across multiple datasets\n", + "- Understand two important concepts: broadcasting and alignment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "%config InlineBackend.figure_format='retina'\n", + "\n", + "plt.style.use(\"bmh\")\n", + "\n", + "np.random.seed(0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here is a motivating calculation where we subtract two DataArrays with data available at different locations in the (space, time) plane." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr1 = xr.DataArray(\n", + " np.arange(12).reshape(3, 4),\n", + " dims=(\"space\", \"time\"),\n", + " coords={\"space\": [\"a\", \"b\", \"c\"], \"time\": [0, 1, 2, 3]},\n", + ")\n", + "arr1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr2 = xr.DataArray(\n", + " [0, 1],\n", + " dims=\"space\",\n", + " coords={\"space\": [\"b\", \"d\"]},\n", + ")\n", + "arr2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that `arr1` is 2D; while `arr2` is 1D along `space` and has values at two locations only.\n", + "\n", + "Now subtract the two." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr1 - arr2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To understand this output, we must understand two fundamental concepts underlying computation with Xarray objects\n", + "\n", + "1. Broadcasting: The objects need to have compatible shapes.\n", + "2. Alignment: The objects need to have values at the same coordinate labels\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Broadcasting: adjusting arrays to the same shape\n", + "\n", + "**Broadcasting** allows an operator or a function to act on two or more arrays\n", + "to operate even if these arrays do not have the same shape. That said, not all\n", + "the dimensions can be subjected to broadcasting; they must meet certain rules.\n", + "The image below illustrates how an operation on arrays with\n", + "different coordinates will result in automatic broadcasting\n", + "\n", + "![](../images/broadcasting_schematic.png)\n", + "\n", + "Credit: Stephan Hoyer --\n", + "[xarray ECMWF Python workshop](https://docs.google.com/presentation/d/16CMY3g_OYr6fQplUZIDqVtG-SKZqsG8Ckwoj2oOqepU/)\n", + "\n", + "Numpy's broadcasting rules, based on array shape, can sometimes be\n", + "difficult to understand and remember. Xarray does broadcasting by dimension name,\n", + "rather than array shape. This is a huge convenience.\n", + "\n", + "Here are two 1D arrays" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "array1 = xr.DataArray(\n", + " np.arange(3),\n", + " dims=\"space\",\n", + " coords={\"space\": [\"a\", \"b\", \"c\"]},\n", + " name=\"array1\",\n", + ")\n", + "array2 = xr.DataArray(\n", + " np.arange(4),\n", + " dims=\"time\",\n", + " coords={\"time\": [0, 1, 2, 3]},\n", + " name=\"array2\",\n", + ")\n", + "display(array1)\n", + "display(array2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's subtract the two:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "array1 - array2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We see that the result is a 2D array. \n", + "\n", + "When subtracting, Xarray first realizes that `array1` is missing the dimension `time` and `array2` is missing the dimension `space`. Xarray then broadcasts or \"expands\" both arrays to 2D with dimensions `space`, `time`. Here is an illustration:\n", + "\n", + "![](../images/broadcasting_schematic.png)\n", + "\n", + "While this detail is hidden, we can explicitly broadcast any number of arrays against each other using [xr.broadcast](https://docs.xarray.dev/en/stable/generated/xarray.broadcast.html)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "array1_broadcasted, array2_broadcasted = xr.broadcast(array1, array2)\n", + "display(array1_broadcasted.dims)\n", + "display(array2_broadcasted.dims)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To get the final anomaly, Xarray calculates" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# identical to array1 - array2\n", + "array1_broadcasted - array2_broadcasted" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Broadcasting in numpy\n", + "\n", + "For contrast let us examine the pure numpy version of this calculation. We use [.data](https://docs.xarray.dev/en/stable/generated/xarray.DataArray.data.html) to extract the underlying numpy array object.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "array1.data - array2.data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To get this calculation to work, we need to insert new axes manually using [np.newaxis](https://numpy.org/doc/stable/reference/constants.html?highlight=newaxis)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "array1.data[:, np.newaxis] - array2.data[np.newaxis, :]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "Because xarray knows about dimension names we avoid having to create unnecessary\n", + "size-1 dimensions using `np.newaxis` or `.reshape`. This is yet another example where the _metadata_ (dimension names) reduces the mental overhead associated with coding a calculation\n", + "\n", + "For more, see the [Xarray documentation](https://docs.xarray.dev/en/stable/user-guide/computation.html#broadcasting-by-dimension-name) and the [numpy documentation](https://numpy.org/doc/stable/user/basics.broadcasting.html) on broadcasting.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Consider the following 2D array. What are the dimensions of `array - array.mean(\"time\")`?\n", + "```python\n", + "array = xr.DataArray(\n", + " np.arange(12).reshape(3, 4),\n", + " dims=(\"space\", \"time\"),\n", + " coords={\"space\": [\"a\", \"b\", \"c\"], \"time\": [0, 1, 2, 3]},\n", + " name=\"array\",\n", + ")\n", + "```\n", + "\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "(array - array.mean(\"time\")).dims\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "## Alignment: putting data on the same grid\n", + "\n", + "\n", + "When combining two input arrays using an arithmetic operation, both arrays must first be converted to the same coordinate system. This is \"alignment\".\n", + "\n", + "![](../images/alignment_schematic.png)\n", + "\n", + "\n", + "Here are two 2D DataArrays with different shapes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr1 = xr.DataArray(\n", + " np.arange(12).reshape(3, 4),\n", + " dims=(\"space\", \"time\"),\n", + " coords={\"space\": [\"a\", \"b\", \"c\"], \"time\": [0, 1, 2, 3]},\n", + ")\n", + "arr1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr2 = xr.DataArray(\n", + " np.arange(14).reshape(2, 7),\n", + " dims=(\"space\", \"time\"),\n", + " coords={\"space\": [\"b\", \"d\"], \"time\": [-2, -1, 0, 1, 2, 3, 4]},\n", + ")\n", + "arr2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`arr1` and `arr2` have the same dimensions (space, time) but have values at different locations in the (space, time) plane with some locations in common.\n", + "\n", + ":::{note}\n", + "xarray assumes coordinate labels are in the same coordinate system such that space='b' in arr1 is the same as space='b' in arr2. For more sophisticated handling of coordinate systems see [rioxarray](https://corteva.github.io/rioxarray/stable/)\n", + ":::" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "def visualize_mesh(array, *args, ax=None, **kwargs):\n", + " \"\"\"Visualizes array's mesh ((points at which values are present).\"\"\"\n", + "\n", + " # Use broadcast to generate 2D x_, y_ arrays from the 1D x,y arrays\n", + " space_, time_ = xr.broadcast(array.space, array.time)\n", + " if ax is None:\n", + " ax = plt.gca()\n", + " kwargs.setdefault(\"fillstyle\", \"none\")\n", + " kwargs.setdefault(\"markersize\", 10)\n", + " ax.plot(space_.data.ravel(), time_.data.ravel(), *args, **kwargs)\n", + " ax.set_xlabel(\"space\")\n", + " ax.set_ylabel(\"time\")\n", + "\n", + "\n", + "visualize_mesh(arr1, \"<\")\n", + "visualize_mesh(arr2, \">\")\n", + "plt.ylim([-3, 6])\n", + "plt.legend([\"arr1\", \"arr2\"]);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We see that both arrays only have values in common at `x=\"b\"` and `y=[0, 1, 2, 3]`. Before applying an arithmetic operation we must first modify each DataArray so that they have values at the *same* points. This is \"alignment\".\n", + "\n", + "### Controlling alignment\n", + "\n", + "We can explicitly align objects using [xr.align](https://docs.xarray.dev/en/stable/generated/xarray.align.html). The key decision to make is how to decide which points must be kept. The other way to think of alignment is that objects must be converted to a common grid prior to any operation combining multiiple objects. This decision is controlled by the `\"join\"` keyword argument. Xarray provides 5 ways to convert the coordinate labels of multiple Datasets to a common grid. This [terminology](https://en.wikipedia.org/wiki/Join_(SQL)) originates in the database community.\n", + "\n", + "1. `join=\"inner\"` or reindex to the \"intersection set\" of coordinate labels\n", + "2. `join=\"outer\"` or reindex to the \"union set\" of coordinate labels\n", + "3. `join=\"left\"` or reindex to the coordinate labels of the leftmost object\n", + "4. `join=\"right\"` or reindex to the coordinate labels of the rightmost object\n", + "5. `join=\"exact\"` checks for exact equality of coordinate labels before the operation.\n", + "\n", + "First lets try an inner join. This is the default for arithmetic operations in Xarray. We see that the result has values for locations that `arr1` and `arr2` have in common: `x=\"b\"` and `y=[0, 1, 2, 3]`. Here is an illustration\n", + "\n", + "![](../images/alignment_schematic.png)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a1_aligned, a2_aligned = xr.align(arr1, arr2, join=\"inner\")\n", + "a1_aligned" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a2_aligned" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a visual depiction of all the `join` options" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "def visualize_join(a1, a2, join, ax=None):\n", + " a1_aligned, a2_aligned = xr.align(arr1, arr2, join=join)\n", + "\n", + " visualize_mesh(a1, \"<\", ax=ax)\n", + " visualize_mesh(a2, \">\", ax=ax)\n", + " visualize_mesh(a1_aligned, \".\", markersize=32, color=\"C3\", ax=ax)\n", + "\n", + " ax.set_ylim([-3, 6])\n", + " ax.set_title(f\"join={join!r}\")\n", + "\n", + "\n", + "f, ax = plt.subplots(1, 4, sharex=True, sharey=True)\n", + "for axx, join in zip(ax, [\"inner\", \"outer\", \"left\", \"right\"]):\n", + " visualize_join(arr1, arr2, join, ax=axx)\n", + "ax[-1].legend([\"arr1\", \"arr2\", \"after align\"], bbox_to_anchor=(1, 1))\n", + "f.set_size_inches(10, 4);" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "hide-input" + ] + }, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Consider the following two arrays. Write down the `x` and `y` coordinate locations for `da1 - da2`\n", + "```python\n", + "da1 = xr.DataArray(\n", + " np.arange(12).reshape(3, 4),\n", + " dims=(\"space\", \"time\"),\n", + " coords={\"space\": [\"a\", \"b\", \"c\"], \"time\": [0, 1, 2, 3]},\n", + ")\n", + "da2 = xr.DataArray(\n", + " [0, 1],\n", + " dims=\"space\",\n", + " coords={\"space\": [\"b\", \"d\"]},\n", + ")\n", + "```\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "`x = [\"b\"], y=[0, 1, 2, 3]` . `da2` has been broadcasted to 2D (so dimension \"y\" has been inserted) and the two arrays are aligned using `join=\"inner\"` prior to subtraction.\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Further control over alignment\n", + "\n", + "#### Controlling the fill value\n", + "\n", + "For all join options other than `\"inner\"` Xarray will insert a `fill_value` at locations not present in the original dataset. By default this is NaN" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr1_aligned, _ = xr.align(arr1, arr2, join=\"outer\")\n", + "arr1_aligned" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Control the \"fill value\" by specifying the `fill_value` keyword argument" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "arr1_aligned, _ = xr.align(arr1, arr2, join=\"outer\", fill_value=0)\n", + "arr1_aligned" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Checking that objects are aligned\n", + "\n", + "`join=\"exact\"` is special in that it checks to make sure that the objects _are_ aligned.\n", + "\n", + "For `arr1` and `arr2` this will raise an error since `arr1.x` is not identical to `arr2.x` (and similarly for `y`)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "xr.align(arr1, arr2, join=\"exact\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Controlling automatic alignment\n", + "\n", + "Xarray's default for arithmetic operations is `join=\"inner\"`. This is controllable using the [xr.set_options](https://docs.xarray.dev/en/stable/generated/xarray.set_options.html) context manager" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with xr.set_options(arithmetic_join=\"outer\"):\n", + " result = arr1 - arr2\n", + "result" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/fundamentals/02_labeled_data.md b/fundamentals/02_labeled_data.md new file mode 100644 index 00000000..380cf91c --- /dev/null +++ b/fundamentals/02_labeled_data.md @@ -0,0 +1,5 @@ +# Labeled data + +```{tableofcontents} + +``` diff --git a/fundamentals/03.1_computation_with_xarray.ipynb b/fundamentals/03.1_computation_with_xarray.ipynb new file mode 100644 index 00000000..8ef77a3e --- /dev/null +++ b/fundamentals/03.1_computation_with_xarray.ipynb @@ -0,0 +1,299 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "(fundamentals/basic-computation)=\n", + "# Basic Computation\n", + "\n", + "In this lesson, we discuss how to do scientific computations with xarray\n", + "objects. Our learning goals are as follows. By the end of the lesson, we will be\n", + "able to:\n", + "\n", + "- Apply basic arithmetic and numpy functions to xarray DataArrays / Dataset.\n", + "- Use Xarray's label-aware reduction operations (e.g. `mean`, `sum`) weighted\n", + " reductions.\n", + "- Apply arbitrary functions to Xarray data via `apply_ufunc`.\n", + "- Use Xarray's broadcasting to compute on arrays of different dimensionality." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "# Ask Xarray to not show data values by default\n", + "xr.set_options(display_expand_data=False)\n", + "\n", + "%config InlineBackend.figure_format='retina'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example Dataset\n", + "\n", + "First we load a dataset. We will use the\n", + "[NOAA Extended Reconstructed Sea Surface Temperature (ERSST) v5](https://www.ncei.noaa.gov/products/extended-reconstructed-sst)\n", + "product, a widely used and trusted gridded compilation of of historical data going back to 1854." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.load_dataset(\"ersstv5\")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's do some basic visualizations of the data, just to make sure it looks\n", + "reasonable.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.sst.isel(time=0).plot(vmin=-2, vmax=30);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Arithmetic\n", + "\n", + "Xarray dataarrays and datasets work seamlessly with arithmetic operators and\n", + "numpy array functions.\n", + "\n", + "For example, imagine we want to convert the temperature (given in Celsius) to\n", + "Kelvin:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "sst_kelvin = ds.sst + 273.15\n", + "sst_kelvin" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The dimensions and coordinates were preserved following the operation.\n", + "\n", + "
\n", + " Warning: Although many xarray datasets have a units attribute, which is used in plotting,\n", + " Xarray does not inherently understand units. However, xarray can integrate with pint, which provides full unit-aware operations. See pint-xarray for more.\n", + "
\n", + "\n", + "\n", + "## Applying functions\n", + "\n", + "We can apply more complex functions to Xarray objects.\n", + "Imagine we wanted to compute the following expression as a function of SST\n", + "($\\Theta$) in Kelvin:\n", + "\n", + "$$ f(\\Theta) = 0.5 \\ln(\\Theta^2) $$\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "f = 0.5 * np.log(sst_kelvin**2)\n", + "f" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Applying Arbitrary Functions\n", + "\n", + "It's awesome that we can call `np.log(ds)` and have it \"just work\". However, not\n", + "all third party libraries work this way.\n", + "\n", + "numpy's [nan_to_num](https://numpy.org/devdocs/reference/generated/numpy.nan_to_num.html) for example will return a numpy array" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "output_scroll" + ] + }, + "outputs": [], + "source": [ + "np.nan_to_num(ds.sst, nan=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It would be nice to keep our dimensions and coordinates. \n", + "\n", + "We can accomplish this with [xr.apply_ufunc](https://docs.xarray.dev/en/stable/generated/xarray.apply_ufunc.html#xarray.apply_ufunc)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "xr.apply_ufunc(np.nan_to_num, ds.sst, kwargs={\"nan\": 0})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{tip}\n", + "`apply_ufunc` is a powerful function. It has many options for doing more complicated things. Unfortunately, we don't have time to go into more depth here. See the [`apply_ufunc` tutorial material](https://tutorial.xarray.dev/advanced/apply_ufunc/apply_ufunc.html) for more.\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Reductions\n", + "\n", + "Reductions are functions that reduce the dimensionlity of our dataset. For example taking the mean sea surface temperature along `time` of our 3D data, we \"reduce\" the `time` dimension and are left with a 2D array.\n", + "\n", + "Just like in numpy, we can reduce xarray DataArrays along any number of axes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sst = ds.sst\n", + "sst.mean(axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "However, rather than performing reductions by specifying `axis` (as in numpy), we can instead perform\n", + "them using _dimension names_. This turns out to be a huge convenience, particularly in\n", + "complex calculations it can be hard to remember which axis corresponds to \n", + "which dimension name:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sst.mean(dim=\"time\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can reduce over multiple dimensions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sst.mean([\"lat\", \"time\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If no dimension is specified, the reduction is applied across all dimensions." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sst.mean()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All of the standard numpy reductions (e.g. `min`, `max`, `sum`, `std`, etc.) are\n", + "available on both [Datasets](https://docs.xarray.dev/en/stable/api.html#aggregation) and [DataArrays](https://docs.xarray.dev/en/stable/api.html#id6).\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "Take the mean of `sst` in both longitude and latitude. Make a simple timeseries plot.\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "sst.mean([\"lat\", \"lon\"]).plot();\n", + "```\n", + ":::\n", + "::::\n" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/fundamentals/03.2_groupby_with_xarray.ipynb b/fundamentals/03.2_groupby_with_xarray.ipynb new file mode 100644 index 00000000..5e4cc5cc --- /dev/null +++ b/fundamentals/03.2_groupby_with_xarray.ipynb @@ -0,0 +1,674 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Grouped Computations\n", + "\n", + "In this lesson, we discuss how to do scientific computations with defined \"groups\" of data\n", + "within our xarray objects. Our learning goals are as follows:\n", + "\n", + "- Perform \"split / apply / combine\" workflows in Xarray using `groupby`,\n", + " including\n", + " - reductions within groups\n", + " - transformations on groups\n", + "- Use `resample` to change the time frequency of the data\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "# don't expand data by default\n", + "xr.set_options(display_expand_data=False, display_expand_attrs=False)\n", + "\n", + "%config InlineBackend.figure_format='retina'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example Dataset\n", + "\n", + "First we load a dataset. We will use the\n", + "[NOAA Extended Reconstructed Sea Surface Temperature (ERSST) v5](https://www.ncei.noaa.gov/products/extended-reconstructed-sst)\n", + "product, a widely used and trusted gridded compilation of of historical data\n", + "going back to 1854." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.load_dataset(\"ersstv5\")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Groupby\n", + "\n", + "Xarray copies Pandas' very useful groupby functionality, enabling the \"split /\n", + "apply / combine\" workflow on xarray DataArrays and Datasets.\n", + "\n", + "Let's examine a timeseries of SST at\n", + "a single point.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.sst.sel(lon=300, lat=50).plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see from the plot, the timeseries at any one point is totally\n", + "dominated by the seasonal cycle. We would like to remove this seasonal cycle\n", + "(called the \"climatology\") in order to better see the long-term variaitions in\n", + "temperature. We can accomplish this using **groupby**.\n", + "\n", + "Before moving forward, we note that xarray correctly parsed the time index,\n", + "resulting in a Pandas datetime index on the time dimension.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.time" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The syntax of Xarray's groupby is almost identical to Pandas.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "output_scroll" + ] + }, + "outputs": [], + "source": [ + "?ds.groupby" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Identifying groups" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The most important argument is `group`: this defines the unique values or labels we will\n", + "us to \"split\" the data for grouped analysis. We can pass either a DataArray or a\n", + "name of a variable in the dataset. Let's first use a DataArray. \n", + "\n", + "Just like with\n", + "Pandas, we can use the time index to extract specific components of dates and\n", + "times. Xarray uses a special syntax for this `.dt`, called the\n", + "[DatetimeAccessor](https://docs.xarray.dev/en/stable/generated/xarray.core.accessor_dt.DatetimeAccessor.html?highlight=DatetimeAccessor). See the [documentation](https://docs.xarray.dev/en/stable/user-guide/time-series.html#datetime-components) for more\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.time.dt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.time.dt.month" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.time.dt.year" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Split step" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use these arrays in a groupby operation:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gb = ds.groupby(ds.time.dt.month)\n", + "gb" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Xarray also offers a more concise syntax when the variable you're grouping on is\n", + "already present in the dataset. This is identical to the previous line:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gb = ds.groupby(\"time.month\")\n", + "gb" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`gb` is a DatasetGroupBy object. It represents a GroupBy operation and helpfully tells us the unique \"groups\" or labels found during the split step.\n", + "\n", + "\n", + "```{tip}\n", + "\n", + "Xarrays' computation methods (`groupby`, `groupby_bins`, `rolling`, `coarsen`, `weighted`) all return special objects that represent the basic underlying computation pattern. For e.g. `gb` above is a `DatasetGroupBy` object that represents monthly groupings of the data in `ds` . It is usually helpful to save and reuse these objects for multiple operations (e.g. a mean and standard deviation calculation).\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "### Apply & Combine\n", + "\n", + "Now that we have groups defined, it's time to \"apply\" a calculation to the\n", + "group. Like in Pandas, these calculations can either be:\n", + "\n", + "- _aggregation_ or _reduction_: reduces the size of the group\n", + "- _transformation_: preserves the group's full size\n", + "\n", + "At then end of the apply step, xarray will automatically combine the aggregated\n", + "/ transformed groups back into a single object." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Aggregations or Reductions" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Most commonly, we want to perform a reduction operation like `sum` or `mean` on our groups. Xarray conveniently provides these reduction methods on Groupby objects for both [DataArrays and Datasets](https://docs.xarray.dev/en/stable/api.html#groupby-objects).\n", + "\n", + "Here we calculate the monthly mean." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds_mm = gb.mean()\n", + "ds_mm" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So we did what we wanted to do: calculate the climatology at every point in the\n", + "dataset. Let's look at the data a bit.\n", + "\n", + "_Climatology at a specific point in the North Atlantic_\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds_mm.sst.sel(lon=300, lat=50).plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "_Zonal Mean Climatology_\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds_mm.sst.mean(dim=\"lon\").plot.contourf(x=\"month\", levels=12, vmin=-2, vmax=30);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "_Difference between January and July Climatology_\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "(ds_mm.sst.sel(month=1) - ds_mm.sst.sel(month=7)).plot(vmax=10);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Custom Aggregations\n", + "\n", + "The most fundamental way to apply a function and combine the results together to use the `.map` method." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "output_scroll" + ] + }, + "outputs": [], + "source": [ + "?gb.map" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`.map` accepts as its argument a function that expects and returns xarray\n", + "objects. We define a custom function. This function takes a single argument--the\n", + "group dataset--and returns a new dataset to be combined:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def time_mean(a):\n", + " return a.mean(dim=\"time\")\n", + "\n", + "\n", + "gb.map(time_mean)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is identical to `gb.mean()`" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Apply by iteration\n", + "\n", + "We can manually iterate over the group. The\n", + "iterator returns the key (group name) and the value (the actual dataset\n", + "corresponding to that group) for each group.\n", + "\n", + "\n", + "You could apply any function you want in the loop but you would have to manually [combine](https://docs.xarray.dev/en/stable/user-guide/combining.html) the results together." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for group_name, group_ds in gb:\n", + " # stop iterating after the first loop\n", + " break\n", + "print(group_name)\n", + "group_ds" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Transformations\n", + "\n", + "Now we want to _remove_ this climatology from the dataset, to examine the\n", + "residual, called the _anomaly_, which is the interesting part from a climate\n", + "perspective. Removing the seasonal climatology is a perfect example of a\n", + "transformation: it operates over a group, but doesn't change the size of the\n", + "dataset. Here is one way to code it\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def remove_time_mean(x):\n", + " return x - x.mean(dim=\"time\")\n", + "\n", + "\n", + "ds_anom = ds.groupby(\"time.month\").map(remove_time_mean)\n", + "ds_anom" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Xarray makes these sorts of transformations easy by supporting _groupby\n", + "arithmetic_. This concept is easiest explained with an example:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "gb = ds.groupby(\"time.month\")\n", + "ds_anom = gb - gb.mean()\n", + "ds_anom" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can view the climate signal without the overwhelming influence of the\n", + "seasonal cycle.\n", + "\n", + "_Timeseries at a single point in the North Atlantic_\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds_anom.sst.sel(lon=300, lat=50).plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "_Difference between Jan. 1 2018 and Jan. 1 1970_\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "(ds_anom.sel(time=\"2018-01-01\") - ds_anom.sel(time=\"1970-01-01\")).sst.plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Using `groupby`, plot the annual mean time series of SST at 300°E, 50°N\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "```python\n", + "ds.groupby(\"time.year\").mean().sst.sel(lon=300, lat=50).plot();\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Resample\n", + "\n", + "Resampling means changing the time frequency of data, usually reducing to a coarser frequency: e.g. converting daily frequency data to monthly frequency data using `mean` to reduce the values. This operation can be thought of as a groupby operation where each group is a single month of data. Resampling can be applied only to time-index dimensions. \n", + "\n", + "First note that `ds_anom` has data at monthly frequency (i.e. one point every month)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds_anom.time" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we compute the five-year mean along the `time` dimension by passing `time='5Y'`. `'5Y'` is a special frequency string. Xarray uses pandas to convert such a frequency string to a groupby operation. See the [pandas documentation](https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases) for how to specify a different frequency." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "resample_obj = ds_anom.resample(time=\"5YE\")\n", + "resample_obj" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{note}\n", + "`resample` only works with proper datetime64 coordinate labels. Note the `dtype` of `time` in the repr above.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Resampling objects are exactly like groupby objects and allow reductions, iteration, etc." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds_anom_resample = resample_obj.mean()\n", + "ds_anom_resample" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for label, group in resample_obj:\n", + " break\n", + "print(label, \"\\n\\n\", group)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds_anom.sst.sel(lon=300, lat=50).plot()\n", + "ds_anom_resample.sst.sel(lon=300, lat=50).plot(marker=\"o\");" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Using `resample`, plot the annual mean time series of SST at 300°E, 50°N.\n", + "\n", + "Compare this output to the groupby output. What differences do you see?\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "```python\n", + "resampled = ds.resample(time='YE').mean().sst.sel(lon=300, lat=50)\n", + "resampled.plot();\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "hide-input" + ] + }, + "source": [ + "## GroupBy vs Resample \n", + "\n", + "Let's compare the grouped and resampled outputs.\n", + "\n", + "\n", + "1. Note the different dimension names: when grouped, `time` is renamed to `year`. When resampled, the `time` dimension name is preserved\n", + "2. The values for `year` are integers, while those for `resampled.time` are timestamps, similar to the input dataset\n", + "3. But all values are equal" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from IPython.display import display_html\n", + "\n", + "grouped = ds.groupby(\"time.year\").mean().sst.sel(lon=300, lat=50)\n", + "resampled = ds.resample(time=\"YE\").mean().sst.sel(lon=300, lat=50)\n", + "display_html(grouped)\n", + "display_html(resampled)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "np.array_equal(grouped.data, resampled.data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Going further\n", + "\n", + "1. See the documentation on [groupby](https://docs.xarray.dev/en/stable/user-guide/groupby.html) and [resample](https://docs.xarray.dev/en/stable/user-guide/time-series.html#resampling-and-grouped-operations)\n", + "2. Follow the tutorial on [high-level computation patterns](https://tutorial.xarray.dev/intermediate/01-high-level-computation-patterns.html)" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/fundamentals/03.3_windowed.ipynb b/fundamentals/03.3_windowed.ipynb new file mode 100644 index 00000000..9bdf9644 --- /dev/null +++ b/fundamentals/03.3_windowed.ipynb @@ -0,0 +1,401 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Windowed Computations\n", + "\n", + "Xarray has built-in support for windowed operations:\n", + "1. [rolling](https://docs.xarray.dev/en/stable/user-guide/computation.html#rolling-window-operations) - Sliding windows of fixed length.\n", + "2. [coarsen](https://docs.xarray.dev/en/stable/user-guide/computation.html#coarsen-large-arrays) - block windows of fixed length.\n", + "\n", + "\n", + "In this notebook, we'll learn to \n", + "1. Compute rolling, or sliding window, means along one or more dimensions.\n", + "2. Compute block averages along a dimension.\n", + "3. Use `construct` to reshape arrays so that a new dimension provides windowed views to the data.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "np.set_printoptions(threshold=10, edgeitems=2)\n", + "xr.set_options(display_expand_data=False)\n", + "\n", + "%config InlineBackend.figure_format='retina'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.load_dataset(\"ersstv5\")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "## Rolling or moving windows" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "Rolling window operations \n", + "1. can be applied along any dimension, or along multiple dimensions.\n", + "2. returns object of same shape as input\n", + "3. pads with NaNs to make (2) possible\n", + "\n", + "Again, all common reduction operations are [available](https://docs.xarray.dev/en/stable/api.html#rolling-objects)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "rolling = ds.rolling(time=12, center=True)\n", + "rolling" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "```{tip}\n", + "Xarrays' computation methods (`groupby`, `groupby_bins`, `rolling`, `coarsen`, `weighted`) all return special objects that represent the basic underlying computation pattern. For e.g. `rolling` above is a `DatasetRolling` object that represents 12-point rolling windows of the data in `ds` . It is usually helpful to save and reuse these objects for multiple operations (e.g. a mean and standard deviation calculation).\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "ds_rolling = rolling.mean()\n", + "ds_rolling" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "ds.sst.sel(lon=300, lat=50).plot(label=\"monthly anom\")\n", + "ds_rolling.sst.sel(lon=300, lat=50).plot(label=\"12 month rolling mean\")\n", + "plt.legend()" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "We can apply rolling mean along multiple dimensions as a 2D smoother in (lat, lon). Here is an example of a 5-point running mean applied along both the `lat` and `lon` dimensions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "extract = ds.sst.isel(time=0)\n", + "smoothed = extract.rolling(lon=5, lat=5, center=True).mean()\n", + "\n", + "f, ax = plt.subplots(2, 1, sharex=True, sharey=True)\n", + "extract.plot(ax=ax[0], robust=True)\n", + "smoothed.plot(ax=ax[1], robust=True)\n", + "f.set_size_inches((10, 7))\n", + "plt.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "Note the addition of NaNs at the data boundaries and near continental boundaries." + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "### Custom reductions\n", + "\n", + "While common reductions are implemented by default, sometimes it is useful to apply our own windowed operations. For these uses, Xarray provides the `construct` methods for [DataArray.rolling](https://docs.xarray.dev/en/stable/generated/xarray.computation.rolling.DataArrayRolling.construct.html#xarray.computation.rolling.DataArrayRolling.construct) and [Dataset.rolling](https://docs.xarray.dev/en/stable/generated/xarray.computation.rolling.DatasetRolling.construct.html#xarray.computation.rolling.DatasetRolling.construct).\n", + "\n", + "For rolling over a dimension `time` with a window size `N`, `construct` adds a new dimension (with user-provided name) of size `N`. \n", + "\n", + "We illustrate with a simple example array:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "simple = xr.DataArray(np.arange(10), dims=\"time\", coords={\"time\": np.arange(10)})\n", + "simple" + ] + }, + { + "cell_type": "markdown", + "id": "14", + "metadata": {}, + "source": [ + "We call `construct` and provide a name for the new dimension: `window`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "# adds a new dimension \"window\"\n", + "simple.rolling(time=5, center=True).construct(\"window\")" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": {}, + "source": [ + ":::{admonition} Exercise\n", + ":class: tip\n", + "Illustrate the difference between `center=True` and `center=False` for rolling by looking at the `construct`-ed array.\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "```python\n", + "display(\"center=True\")\n", + "display(simple.rolling(time=5, center=True).construct(\"window\"))\n", + "\n", + "display(\"center=False\")\n", + "display(simple.rolling(time=5, center=False).construct(\"window\"))\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "id": "17", + "metadata": {}, + "source": [ + "## Coarsening\n", + "\n", + "`coarsen` does something similar to `rolling`, but allows us to work with discrete *non-overlapping* blocks of data.\n", + "\n", + "You will need to specify `boundary` if the length of the dimension is not a multiple of the window size (\"block size\"). You can choose to\n", + "1. `trim` the excess values\n", + "2. `pad` with NaNs\n", + "\n", + "Again, all standard reductions are [implemented](https://docs.xarray.dev/en/stable/api.html#coarsen-objects)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "coarse = ds.coarsen(lon=5, lat=5)\n", + "coarse" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "Xarrays' computation methods (groupby, groupby_bins, rolling, coarsen, weighted) all return special objects that represent the basic underlying computation pattern. For e.g. `coarse` above is a `DatasetCoarsen` object that represents 5-point windows along lat, lon of the data in `ds`. It is usually helpful to save and reuse these objects for multiple operations (e.g. a mean and standard deviation calculation)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": { + "tags": [ + "raises-exception", + "output-scroll" + ] + }, + "outputs": [], + "source": [ + "# we expect an error here because lat has size 89, which is not divisible by block size 5\n", + "coarse.mean()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "coarse = ds.coarsen(lat=5, lon=5, boundary=\"trim\").mean()\n", + "coarse" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": {}, + "outputs": [], + "source": [ + "coarse.sst.isel(time=0).plot();" + ] + }, + { + "cell_type": "markdown", + "id": "23", + "metadata": {}, + "source": [ + "### Custom reductions\n", + "\n", + "Like `rolling`, `coarsen` also provides a `construct` method for custom block operations. \n", + "\n", + "```{tip} \n", + "`coarsen.construct` is a handy way to reshape Xarray objects.\n", + "```\n", + "\n", + "Consider a \"monthly\" 1D timeseries. This simple example has one value per month for 2 years" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": {}, + "outputs": [], + "source": [ + "months = xr.DataArray(\n", + " np.tile(np.arange(1, 13), reps=2),\n", + " dims=\"time\",\n", + " coords={\"time\": np.arange(1, 25)},\n", + ")\n", + "months" + ] + }, + { + "cell_type": "markdown", + "id": "25", + "metadata": {}, + "source": [ + "Now we reshape to get one new dimension `year` of size 12." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": {}, + "outputs": [], + "source": [ + "# break \"time\" into two new dimensions: \"year\", \"month\"\n", + "months.coarsen(time=12).construct(time=(\"year\", \"month\"))" + ] + }, + { + "cell_type": "markdown", + "id": "27", + "metadata": {}, + "source": [ + ":::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Imagine the array `months` was one element shorter. Use `boundary=\"pad\"` and the `side` kwarg to reshape `months.isel(time=slice(1, None))` to a 2D DataArray with the following values:\n", + "\n", + "```python\n", + "array([[nan, 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.],\n", + " [ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.]])\n", + "```\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "months.isel(time=slice(1, None)).coarsen({\"time\": 12}, boundary=\"pad\", side=\"right\").construct(\n", + " time=(\"year\", \"month\")\n", + ")\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "id": "28", + "metadata": {}, + "source": [ + "Note that `coarsen` pads with NaNs. For more control over padding, use\n", + "[DataArray.pad](https://docs.xarray.dev/en/stable/generated/xarray.DataArray.pad.html) explicitly." + ] + }, + { + "cell_type": "markdown", + "id": "29", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "## Going further\n", + "\n", + "1. See the documentation on [rolling](https://docs.xarray.dev/en/stable/user-guide/computation.html#rolling-window-operations) and [coarsen](https://docs.xarray.dev/en/stable/user-guide/computation.html#coarsen-large-arrays).\n", + "2. Follow the tutorial on [high-level computational patterns](https://tutorial.xarray.dev/intermediate/01-high-level-computation-patterns.html#)" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/fundamentals/03.4_weighted.ipynb b/fundamentals/03.4_weighted.ipynb new file mode 100644 index 00000000..c6d49756 --- /dev/null +++ b/fundamentals/03.4_weighted.ipynb @@ -0,0 +1,172 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": { + "tags": [] + }, + "source": [ + "# Weighted Reductions\n", + "\n", + "Xarray supports [weighted reductions](https://docs.xarray.dev/en/stable/user-guide/computation.html#weighted-array-reductions).\n", + "\n", + "For demonstration, we will create a “weights” array proportional to cosine of latitude.\n", + "Modulo a normalization, this is the correct area-weighting factor for data on a regular lat-lon grid.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "%config InlineBackend.figure_format='retina'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.load_dataset(\"ersstv5\")\n", + "ds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "weights = np.cos(np.deg2rad(ds.lat))\n", + "display(weights.dims)\n", + "\n", + "weights.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "## Manual weighting\n", + "\n", + "Thanks to the automatic broadcasting and alignment discussed earlier, if we multiply this by SST, it “just works,” and the arrays are broadcasted properly:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "(ds.sst * weights).dims" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "We could imagine computing the weighted spatial mean of SST manually." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "sst_mean = (ds.sst * weights).sum(dim=(\"lon\", \"lat\")) / weights.sum(dim=\"lat\")\n", + "sst_mean.plot()\n", + "plt.title(\"This is wrong!\")" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "That would be wrong, however, because the denominator (`weights.sum(dim='lat')`)\n", + "needs to be expanded to include the `lon` dimension and modified to account for\n", + "the missing values (land points).\n", + "\n", + "\n", + "## The `weighted` method\n", + "In general, weighted reductions on multidimensional arrays are complicated. To\n", + "make it a bit easier, Xarray provides a mechanism for weighted reductions. \n", + "\n", + "It does this by creating a special intermediate `DataArrayWeighted` object, to\n", + "which different reduction operations can applied.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "sst_weighted = ds.sst.weighted(weights)\n", + "sst_weighted" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "\n", + "
\n", + " Xarrays' computation methods (groupby, groupby_bins, rolling, coarsen, weighted) all return special objects that represent the basic underlying computation pattern. For e.g. `sst_weighted` above is a `DatasetWeighted` object that represents the weighting by `weights` of the data in `ds.sst`. It is usually helpful to save and reuse these objects for multiple operations (e.g. a mean and standard deviation calculation).\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "sst_weighted.mean(dim=(\"lon\", \"lat\")).plot()\n", + "plt.title(\"Correct Global Mean SST\");" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "A handful of reductions have been implemented: [mean, sum, std, var](https://docs.xarray.dev/en/stable/api.html#weighted-objects)." + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/fundamentals/03_computation.md b/fundamentals/03_computation.md new file mode 100644 index 00000000..c5dcdc3d --- /dev/null +++ b/fundamentals/03_computation.md @@ -0,0 +1,5 @@ +# Computation + +```{tableofcontents} + +``` diff --git a/fundamentals/04.0_plotting.md b/fundamentals/04.0_plotting.md new file mode 100644 index 00000000..98a76a5b --- /dev/null +++ b/fundamentals/04.0_plotting.md @@ -0,0 +1,5 @@ +# Plotting and Visualization + +```{tableofcontents} + +``` diff --git a/fundamentals/04.1_basic_plotting.ipynb b/fundamentals/04.1_basic_plotting.ipynb new file mode 100644 index 00000000..034a8168 --- /dev/null +++ b/fundamentals/04.1_basic_plotting.ipynb @@ -0,0 +1,377 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "toc": true + }, + "source": [ + "# Basic Visualization\n", + "\n", + "At the end of this lesson you will learn:\n", + "\n", + "1. how to use xarray's convenient [matplotlib-backed](https://matplotlib.org/) plotting interface to\n", + " visualize your datasets.\n", + "2. that `hvplot` provides an equally convenient interface for bokeh-backed plots" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "%config InlineBackend.figure_format='retina'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load data\n", + "\n", + "First let's load up a tutorial dataset to visualize.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.open_dataset(\"air_temperature_gradient\")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This dataset has three \"data variables\", `Tair` is air temperature and `dTdx`\n", + "and `dTdy` are horizontal gradients of this temperature field. All three \"data\n", + "variables\" are three-dimensional with dimensions `(time, lat, lon)`.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "## Basic plotting: .plot()\n", + "\n", + "DataArray objects have a [plot](https://docs.xarray.dev/en/stable/generated/xarray.DataArray.plot.html) method. This method creates plots using\n", + "`matplotlib` so all of your existing matplotlib knowledge carries over!\n", + "\n", + "By default `.plot()` makes\n", + "\n", + "1. a line plot for 1-D arrays using `plt.plot()`\n", + "2. a `pcolormesh` plot for 2-D arrays using `plt.pcolormesh()`\n", + "3. a histogram for everything else using `plt.hist()`\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "## Histograms\n", + "\n", + "`Tair` is three-dimensional, so we got a histogram of temperature values. Notice\n", + "the label on the x-axis. One of xarray's convenient plotting features is that it\n", + "uses the `attrs` of `Tair` to nicely label axes and colorbars.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.Tair.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can pass extra arguments to the underlying `hist()` call. See the [matplotlib\n", + "docs](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.hist.html) for\n", + "all possible keyword arguments.\n", + "\n", + "**Tip:** Note that the returned values are exactly what matplotlib would return\n", + "\n", + "### Exercise\n", + "\n", + "Update the above plot to show 50 bins with unfilled steps instead of filled\n", + "bars.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "## 2D plots\n", + "\n", + "Now we will explore 2D plots. Let's select a single timestep of `Tair` to\n", + "visualize.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.Tair.isel(time=1).plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is identical to `.plot.pcolormesh` which is more explicit" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.Tair.isel(time=1).plot.pcolormesh()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice how much information is on that plot!\n", + "\n", + "1. The x- and y-axes are labeled with full names — \"Latitude\", \"Longitude\" — along with units. \n", + "2. The colorbar has a nice label, again with units. \n", + "3. And the title tells us the timestamp of the data presented.\n", + "\n", + "`plot.pcolormesh` takes many [keyword arguments](https://docs.xarray.dev/en/stable/generated/xarray.plot.pcolormesh.html) and is quite sophisticated.\n", + "\n", + "Here is a more complicated figure that explicitly sets `time` as the x-axis,\n", + "customizes the colorbar, and overlays two contours at specific levels.\n", + "\n", + "**Tip:** Other options for 2D plots include [.plot.contour](https://docs.xarray.dev/en/stable/generated/xarray.plot.contour.html), [.plot.contourf](https://docs.xarray.dev/en/stable/generated/xarray.plot.pcolormesh.html),\n", + "[.plot.imshow](https://docs.xarray.dev/en/stable/generated/xarray.plot.imshow.html)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.Tair.isel(lon=1).plot(\n", + " x=\"time\", # coordinate to plot on the x-axis of the plot\n", + " robust=True, # set colorbar limits to 2nd and 98th percentile of data\n", + " cbar_kwargs={ # passed to plt.colorbar\n", + " \"orientation\": \"horizontal\",\n", + " \"label\": \"custom label\",\n", + " \"pad\": 0.3,\n", + " },\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exercise\n", + "\n", + "Update the above plot to use a different matplotlib colormap.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "ds.Tair.isel(lon=1).plot(\n", + " x=\"time\", # coordinate to plot on the x-axis of the plot\n", + " robust=True, # set colorbar limits to 2nd and 98th percentile of data\n", + " cmap=mpl.cm.RdYlBu_r,\n", + " cbar_kwargs={ # passed to plt.colorbar\n", + " \"orientation\": \"horizontal\",\n", + " \"label\": \"custom label\",\n", + " \"pad\": 0.3,\n", + " },\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exercise\n", + "\n", + "Now overlay a [contour plot](https://docs.xarray.dev/en/stable/generated/xarray.plot.contour.html) on top of the previous plot\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "ds.Tair.isel(lon=1).plot.pcolormesh(\n", + " x=\"time\", # coordinate to plot on the x-axis of the plot\n", + " robust=True, # set colorbar limits to 2nd and 98th percentile of data\n", + " cmap=mpl.cm.RdYlBu_r,\n", + " cbar_kwargs={ # passed to plt.colorbar\n", + " \"orientation\": \"horizontal\",\n", + " \"label\": \"custom label\",\n", + " \"pad\": 0.3,\n", + " },\n", + ")\n", + "ds.Tair.isel(lon=1).plot.contour(\n", + " x=\"time\", # coordinate to plot on the x-axis of the plot\n", + " levels=5, # autoselect 5 levels between max, min\n", + " # The following are passed to plt.contour\n", + " colors=\"k\",\n", + " linewidths=0.5,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "## 1D line plots\n", + "\n", + "xarray is also able to plot lines by wrapping `plt.plot()`. As in the earlier\n", + "examples, the axes are labelled and keyword arguments can be passed to the\n", + "underlying `matplotlib` call.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.Tair.isel(time=1, lon=10).plot(marker=\"o\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Again, this is equivalent to the more explicit [plot.line](https://docs.xarray.dev/en/stable/generated/xarray.plot.line.html)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.Tair.isel(time=1, lon=10).plot.line(marker=\"o\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Multiple lines with `hue` \n", + "\n", + "Lets say we want to compare line plots of temperature at three different\n", + "latitudes. We can use the `hue` kwarg to do this.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.Tair.isel(time=1).sel(lat=[40, 50, 60], method=\"nearest\").plot(x=\"lon\", hue=\"lat\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Customization\n", + "\n", + "All of xarray's plotting functions take an large list kwargs that customize\n", + "behaviour. A full list can be seen [here](https://docs.xarray.dev/en/stable/generated/xarray.plot.pcolormesh.html). That\n", + "said xarray does not wrap all matplotlib functionality.\n", + "\n", + "The general strategy for making plots that are more complicated that the\n", + "examples above is\n", + "\n", + "1. Create a matplotlib axis `ax`\n", + "2. Use xarray to make a close approximation of the final plot specifying\n", + " `ax=ax`.\n", + "3. Use `ax` methods to fully customize the plot\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "## More resources\n", + "\n", + "1. [Xarray's visualization gallery](https://docs.xarray.dev/en/stable/examples/visualization_gallery.html)\n", + "2. [Xarray's plotting documentation](https://docs.xarray.dev/en/stable/plotting.html)\n", + "\n" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": true, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/fundamentals/04.2_faceting.ipynb b/fundamentals/04.2_faceting.ipynb new file mode 100644 index 00000000..9e10f902 --- /dev/null +++ b/fundamentals/04.2_faceting.ipynb @@ -0,0 +1,245 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Faceting\n", + "\n", + "Faceting is the art of presenting \"small multiples\" of the data. It is an\n", + "effective way of visualizing variations of 3D data where 2D slices are\n", + "visualized in a panel (subplot) and the third dimensions is varied between\n", + "panels (subplots).\n", + "\n", + "Here is where xarray really augments matplotlib's functionality. We will use\n", + "monthly means to illustrate\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "%config InlineBackend.figure_format='retina'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.open_dataset(\"air_temperature_gradient\")\n", + "monthly_means = ds.groupby(\"time.month\").mean()\n", + "# xarray's groupby reductions drop attributes. Let's assign them back so we get nice labels.\n", + "monthly_means.Tair.attrs = ds.Tair.attrs" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "Note that the dimensions are now `lat, lon, month`.\n", + "\n", + "## Basic faceting\n", + "\n", + "We want to visualize how the monthly mean air temperature varies with month of\n", + "the year.\n", + "\n", + "The simplest way to facet is to specify the `row` or `col` kwargs which are\n", + "expected to be a dimension name. Here we use `month` so that each panel or\n", + "\"facet\" of the plot presents the mean temperature field in a given month. Since\n", + "a 12 column plot would be too small to interpret, we can \"wrap\" the facets into\n", + "multiple rows using `col_wrap`\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "fg = monthly_means.Tair.plot(\n", + " col=\"month\",\n", + " col_wrap=4, # each row has a maximum of 4 columns\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "## Customizing\n", + "\n", + "All the usual customizations are possible\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "fg = monthly_means.Tair.plot(\n", + " col=\"month\",\n", + " col_wrap=4,\n", + " # The remaining kwargs customize the plot just as for not-faceted plots\n", + " robust=True,\n", + " cmap=mpl.cm.RdYlBu_r,\n", + " cbar_kwargs={\n", + " \"orientation\": \"horizontal\",\n", + " \"shrink\": 0.8,\n", + " \"aspect\": 40,\n", + " \"pad\": 0.1,\n", + " },\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "The returned FacetGrid object `fg` has many useful properties and methods e.g.\n", + "\n", + "1. `fg.fig` provides a handle to the figure\n", + "2. `fg.axes` is a numpy object array with handles to each individual axes\n", + "3. `fg.set_xlabels` and `fg.set_ylabels` can be used to change axes labels.\n", + "\n", + "See the [documentation](https://docs.xarray.dev/en/stable/api.html#faceting) for a full list." + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "### Exercise\n", + "\n", + "Use these methods to set a title for the figure using `suptitle`, as well as\n", + "change the x- and y-labels." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "fg" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "## Modifying all facets\n", + "\n", + "The FacetGrid object has some more advanced methods that let you customize the\n", + "plot further.\n", + "\n", + "Here we illustrate the use of `map` and `map_dataarray` that let you map custom\n", + "plotting functions to an existing `FacetGrid`. The functions passed to `map` and\n", + "`map_dataarray` must have a particular signature. See the docstring for more\n", + "details.\n", + "\n", + "Alternatively one can loop over `fg.axes` and modify each individual subplot as\n", + "needed\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "fg = monthly_means.Tair.plot(col=\"month\", col_wrap=4)\n", + "\n", + "# Use this to plot contours on each panel\n", + "# Note that this plotting call uses the original DataArray gradients\n", + "fg.map_dataarray(xr.plot.contour, x=\"lon\", y=\"lat\", colors=\"k\", levels=13, add_colorbar=False)\n", + "\n", + "# Add a point (or anything else!)\n", + "fg.map(lambda: plt.plot(250, 40, markersize=20, marker=\".\", color=\"w\"))" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "## Faceting multiple DataArrays\n", + "\n", + "Faceting can be used to plot multiple DataArrays in a Dataset. The trick is to\n", + "use `to_array()` to convert a Dataset to a DataArray and then facet that.\n", + "\n", + "This trick only works when it is sensible to use the same colormap and color\n", + "scale for all DataArrays like with `dTdx` and `dTdy`\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "gradients = monthly_means[[\"dTdx\", \"dTdy\"]].to_array(\"gradient\")\n", + "gradients" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "fg = gradients.isel(month=slice(None, None, 3)).plot.contourf(\n", + " levels=13,\n", + " col=\"month\",\n", + " row=\"gradient\",\n", + " robust=True,\n", + " cmap=mpl.cm.coolwarm,\n", + " cbar_kwargs={\n", + " \"orientation\": \"horizontal\",\n", + " \"shrink\": 0.8,\n", + " \"aspect\": 40,\n", + " \"label\": \"Gradient [°C/m]\",\n", + " },\n", + ")" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/fundamentals/04.3_geographic_plotting.ipynb b/fundamentals/04.3_geographic_plotting.ipynb new file mode 100644 index 00000000..fc3620cd --- /dev/null +++ b/fundamentals/04.3_geographic_plotting.ipynb @@ -0,0 +1,123 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Geography with Cartopy\n", + "\n", + "Since xarray's default plotting functionality builds on matplotlib, we can\n", + "seamlessly use cartopy to make nice maps:\n", + "\n", + "1. Specify a `projection` for the plot when creating a new figure `fig` with\n", + " axis `axis`.\n", + "2. Explicitly ask xarray to plot to axis `axis` by passing the kwarg `ax=axis`.\n", + "3. Specify the projection of the data using `transform` (`PlateCarree` here) in\n", + " `.plot()`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import cartopy.crs as ccrs\n", + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt\n", + "import xarray as xr\n", + "\n", + "%config InlineBackend.figure_format='retina'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.open_dataset(\"air_temperature_gradient\")\n", + "monthly_means = ds.groupby(\"time.month\").mean()\n", + "# xarray's groupby reductions drop attributes. Let's assign them back so we get nice labels.\n", + "monthly_means.Tair.attrs = ds.Tair.attrs" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "## Basic plot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "fig, axis = plt.subplots(1, 1, subplot_kw=dict(projection=ccrs.Orthographic(-90, 30)))\n", + "\n", + "ds.Tair.isel(time=1).plot(\n", + " ax=axis,\n", + " transform=ccrs.PlateCarree(), # this is important!\n", + " # usual xarray stuff\n", + " cbar_kwargs={\"orientation\": \"horizontal\", \"shrink\": 0.7},\n", + " robust=True,\n", + ")\n", + "axis.coastlines() # cartopy function" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "## Faceting maps\n", + "\n", + "We can make faceted maps. Since `FacetGrid` creates the axes it plots to, we\n", + "need to pass the `projection` kwarg in `subplot_kws`. This makes sure that the\n", + "subplots are set up properly for cartopy.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "fg = monthly_means.Tair.isel(month=[1, 2, 3]).plot(\n", + " col=\"month\",\n", + " transform=ccrs.PlateCarree(), # remember to provide this!\n", + " subplot_kws={\"projection\": ccrs.LambertConformal(central_longitude=-95, central_latitude=45)},\n", + " cbar_kwargs={\"orientation\": \"horizontal\", \"shrink\": 0.8, \"aspect\": 40},\n", + " robust=True,\n", + ")\n", + "\n", + "# lets add a coastline to each axis\n", + "# great reason to use FacetGrid.map\n", + "fg.map(lambda: plt.gca().coastlines())" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/scipy-tutorial/05_intro_to_dask.ipynb b/fundamentals/05_intro_to_dask.ipynb similarity index 95% rename from scipy-tutorial/05_intro_to_dask.ipynb rename to fundamentals/05_intro_to_dask.ipynb index c073fe9e..cf7065d5 100644 --- a/scipy-tutorial/05_intro_to_dask.ipynb +++ b/fundamentals/05_intro_to_dask.ipynb @@ -4,8 +4,6 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n", - "\n", "# Introduction to Dask\n", "\n", "In this lesson, we discuss cover the basics of Dask. Our learning goals are as\n", @@ -13,7 +11,7 @@ "\n", "- Identify and describe Dask Collections (Array, DataFrame) and Schedulers\n", "- Work with Dask Array's in much the same way you would work with a NumPy array\n", - "- Understand some of the tradeoffs surounding chunk size, chunk shape, and\n", + "- Understand some of the tradeoffs surrounding chunk size, chunk shape, and\n", " computational overhead\n", "- Deploy a local Dask Distributed Cluster and access the diagnostics dashboard\n", "\n", @@ -162,12 +160,12 @@ "A crucal difference with Dask is that we must specify the `chunks` argument.\n", "\"Chunks\" describes how the array is split up over many sub-arrays.\n", "\n", - "![Dask Arrays](http://dask.pydata.org/en/latest/_images/dask-array-black-text.svg)\n", + "![Dask Arrays](https://docs.dask.org/en/latest/_images/dask-array.svg)\n", "_source:\n", - "[Dask Array Documentation](http://dask.pydata.org/en/latest/array-overview.html)_\n", + "[Dask Array Documentation](http://docs.dask.org/en/latest/array-overview.html)_\n", "\n", "There are\n", - "[several ways to specify chunks](http://dask.pydata.org/en/latest/array-creation.html#chunks).\n", + "[several ways to specify chunks](http://docs.dask.org/en/latest/array-creation.html#chunks).\n", "In this lecture, we will use a block shape.\n" ] }, @@ -504,7 +502,7 @@ "\n", "Dask can be deployed on distributed infrastructure, such as a an HPC system or a\n", "cloud computing system. There is a growing ecosystem of Dask deployment projects\n", - "that faciliate easy deployment and scaling of Dask clusters on a wide variety of\n", + "that facilitate easy deployment and scaling of Dask clusters on a wide variety of\n", "computing systems.\n", "\n", "### HPC\n", @@ -552,11 +550,6 @@ } ], "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, "language_info": { "codemirror_mode": { "name": "ipython", @@ -566,8 +559,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.2" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/scipy-tutorial/README.md b/fundamentals/README.md similarity index 100% rename from scipy-tutorial/README.md rename to fundamentals/README.md diff --git a/github_deploy_key_xarray_contrib_xarray_tutorial.enc b/github_deploy_key_xarray_contrib_xarray_tutorial.enc deleted file mode 100644 index 4c411c7c..00000000 --- a/github_deploy_key_xarray_contrib_xarray_tutorial.enc +++ /dev/null @@ -1 +0,0 @@ -gAAAAABeqhVemMaqVeehp-Tcws78ihEd_VSyqMkBqVCF3C__8Hw1nMURiPP8-fMdl0UzMwMymxTJrRnsXjI5WbASFHr9F_Nn64k4uee6O8-DPqRMp4e2XNeQ767xGJPSSb8JXAV2rc5I-RzPI1yL-2KD2TjJrEog7W23YSKZpjb9CMt0Mit2aBR9pUj1B-aBqvNQ4E2CN8hNTJ0Ld_80Xic8Xo5-84QSVKvGLApkvRdl-aL6rh2uT0Q5xpAVgzTCYyWykj-ekbIoiwUXhzHU5N3A6rdx1hNmCemBBZt4LYUzte0iif_NptWpUfhAh6T-mNhHoPXf-LPGQ41AYNs4mpmGryPZ5kvAppchg-B-qq8jjh8AN3LcijShQsgzpzpyI0R8KTsjZI2EZXtPtPw15uUNvNBcILN0VN1A9H99MWGK5V0l3teMexiUxfX4jqTqIekOt0uLBorQG2zhrJFgRXNdgJm48Duk74zpdsN_fnDRupnS3Um2eamA-fN22QMjFtVfm6FMqBuzDZ7RS1vN6tCd0ecdq2KkbUTU74zjOTRrjvRMUb7uMoEVOEJl9Iv1DZWsZfF1QLfEqWllbhiETWznAKM35TOeGCvMhrmtY5HruDaJdSsCIImvRP-k1xNKLY-sWh7ca58iHmo2p9vepd0kFrLSHZDeQa7GK1lbVGuZZ4UcnYH6hhLgX-9GpksD7DBJlC5gXnit4HRkdobf5avGGH4II-yHR1eZjMo8dcHI9lR1-d-BRRTew691SZP1sPUhospYb8xMdlyVgg-7NmIJzmyHkujv-KGnS4pj-tuVo_pEimx6vYEDrntr4r7qACrzxmvrxYZqLiK1vcD-E2WrJvPlpxNdAv92hdg7isaJkq99r4BB-xcMYlAbdG7yMl5WcK4QOv16qMyXSjf0f235hZJCUYu5Mw65b-UQt6cHNchXksLdRaqtGc1ShJVR3O5FQ89vp0B9MF8mALeTd27cV04zkVoaTuPY6ylxHIAkw3emq5K15oYlkSlQASTDTdWzOeR7FHq-UChhyHvR3QXMNI_Qn737H0RT64xztRX49_3V2TzRlPZhx27_ezZ_pvTj1R0Y20K5_II2fQlxCB721p2gsbu2q2DE1sF4U_MOxd5-pUSjKSu8HO7flaxsb5VkcpaO6KLvN097-osV3D29ahJQ7WNP02WLXgJrL7d8b0jlsWkkCn0SpOZ-iVj5olnMhmTEqwyAyk69EGRggadoL3R2zrpVyjmz2h9Zl1ziaRvGHggpBUu5omQBzDst7zzoSlKPmYigyrm-VAHEV-k2hnESyny_h9Wyvup6Ao9uTAPvCKYJDL9m0unoJsaRHx1ZM31ipr_3LnUNkT2Kw8cNqgAXTv82vmb7qyprjBWbtEgkXcy_ya1fFREchX3dYroLyWI2OWWYAKBJBouSVy4K0BPV9CqkVz4obajGTegn0lWx_Os7AB5bYYEsTWQzg9s6xcldODCLkzj25njZ_8-XHSHZOh0VryqHJGbOoamrvBKYBbfbGdh2A5KzFlAssNFTDk6aCyZFLrD5rrNs79wYwzGrlP-TS1bgbJY81UqgiRmMLqj6iRGin4nhLBgWQvVmPJKQnRdzF5Q7spvJD9duZuSwhrIvzGt2nkCmd9sqcRxojZa4VdYsErwPatJkXOO5ANBJJVU9ZGtTDbc85rg0qPR6_zu-wzNx9_J7sDumDu5PEqDjxogTMTO_nQVx8BONGu6F-I2L_nblyABeZHDJTBsutKB3yBG1Px04uCMHupLKFyCQw3m4nGO_8by7IqMv_rPFLEW__WFkG-7CZpsqvFpv16Yxm9ppXDXglhvhR14ooD6AO3O0BhirbKxBEJI2601qQv8CPVR9WtYtANfX8dRLJ7DHqSkAcmLgfhw59N-OjqLo9vtWzd8eeJ75iiKSkQGW3-4Qz_ZecsWwh8caI5qfsl8EyGARHpRetz8LDK3UbcZiK1CKGMlmeMcekG60gIGCOLuwNSbQvk-a66rXmneN6PYGsUcdalb_bGsVsIWfdKju7KUGFP_oTjHP5K3LJNnpWP8OQDwIg-xK5-Sd97NgGzx5qjQGIKr4-KEqZsEcbPdCvVyE4MmItd_gN5cL9zf-Z1F_jE3NvuJIZRV5TgK6nugWmuQfpqH1S5DVGGE4tmOY1neasGf9zuQXuYO0mELFVnmjQJv99N72WyT4G88JsA-m-uyJ-oDdTMTUIpQTYnTr8aansXt77WDTeIuvQu2ZuPemtcZZrTE_dcpp2sr04Vy4A95lhYXQaxB2xSKq5NF_GLvdsKhJj_6C3h4tbNJk3cJbSnlzE_tAu3jX2NfQYluE4a2q3f5ItJMlQSYCWcLSQuHvpzocMUWGAUfD6b0082W6OrwlDvAZ6skP2A8fpWCnPnH-nzJMhzErFLA0cKUCqG_Z-cvp8cCfQa9ClFiYaHW6ZeHpmqc4WsLd1DQ_zDCABEEXGIke9I6-uLrzqcxXVOW-9f7Pat8FBKUSGLGfcLC4jq1MWHfL7acg3iP2fggpy2TRJIP1mBJC9IfRlvy4ijDbm-funwt_Wta4AGK9q8rwjHOB9NBVxdjlsES4rJfhQeeF3o0VHkLNdns3Jz-JX1wmdDpQnvKiytpBsmNFk9-uLTO9nCNygmxkZAynuNcSnUq-uOLl81njfGVt-vytCIAsxmtpWoACTdd5zy_Q-lw5ldb-VvW2c-sO95s3DThum5yTKECRm_MiELwe7E1NQwfu8NgZb4tXSHn_QHwEdNjDPhcuzVoKMozHnqzrurQzx2fR3LcXSnf2-XZQcVIFiDf-dis0VPuWR5wklcRPk39Nck12lUwTovkN7ujGPxRw7LL1WtoYFTQjXZAGW3t63aAUG2F68C0hFn94_l_khkBfs1Um7MyMij1WuGLsl-2UXXijxfvgbZa49-1NWUQTuIPWmkC4f0t8a3lLltuQF9zLD3tFtNIF7zXaZiIFE4AAPMs2Yppd5Tj_d2cmencJK8ldkyHjhCbV39RRxFs2kmucdZu-OvVjacxHPrE9tQO23G_OJzboP-PyETWaHMw7LdEbW5OAvsDTgC9DLhBXtZjIHFfG1b8sFR4_Qb59mz2OLgxIJG3nBy4iHcRkxF-OeLPfa2nX5R6DdD2Pqw0l4Mg8Tmhevjd9260weuzF0RAzDYNBYrUh6qZzNQgLP88qtgUQqtnm16pCvy-q2DS-g5poA48KPrG7SsFPANsrf-GbkiT-09rVimdM-EtzaDw8Q4cjGVTrpTZk1eKjxED5Hub_e1nB-dDFTe2XLzYjdaRDcxzTE05uBlPHglu4et6rl1KQnP7_2qWk3uA4ZF3nYXq_KweuFCOY84WpRwqxjHUz5ajS0oA2w-m6dbzraXv25C3QoeJGjh1M1Rm0Bnkk_XqERcxHnyrJ74yR8MShBSrTTV7K9mCoSG88IUZIcQIMKPh_XcPeowzQRQH7_48kalu3p_bS4rjmMzKkrUnsikjkxSiE2zFEu7T6ktD1p1lJCwNFJY-6dXPvdxd94kYwrURFK8Z_gjMc0N0l41QEQ2367TLzvoNmaIuo7HYwz5Rq2fLgoHlNCIPWKNw8eBB4t7a39V-jVuy2QC0RIYN0D4Qcxa2z4LgqiDqA02gzX1_KSCJmIzB-zZKgCF4PEh2YES1cn8QNBf9BbrVdUMkSr2MgyTTmYaLrxbRWMOXk2fTKw4ttICBCZgBGA68oQ6Zb_7xux5dGRAMhnR0PYqtYcBxdbXMdnP-6pN8xiEBXQ8Idz6Kr8J21_oExcU7Py3cqLlwIxe7p-_AE0hcHlviWVpu6n_LfxQdBzZBCtDZYcfxSwzB7YGb2_A8YgKWWPGH4YYy4ik2vJkN2IG1WXJlNhP-DU467tmCyrReP7fvGTlfWVd5cf5VM7BydiXxXogMKbWDUJzDk7RHjOoErBNgECXeldcw-wJ8i2Qpm3y9Re2WtLQ8PP-DgFnRtYgDpJk8SwO_JEIICY8vcIXqQ9iarOYWkrqgNMs3XbC8daO41hsvpue-rmUvez7QvrCrbYrBipCeDJRZa-eZ43dFwsymd1SgfqWIfb8gVBsb7MkyFSHyp56wiLMP1REdQR6RVEfND0pudKBEFEkJipFoYpYarqTZzYkdJtfX7bc6QpnY7ae6XWuA2zpM_1qpo1ZCRn-t2noFkzLKFcy5-QB9KvawMbsepqlK0xcZfHEpt7UxE_5SrrLrcAjeJ9rS6zcp5LytOdBrEFZMqxmQ4XBszKy8pTTsFjbdP3qpRIy06rBMA5uGEE_uuDLr6RvcvmjnQJGrwmD029qyrTH-qFHPrSLFFAJqkOFikO5KLrPGnWykBZIIdbT-X3HpqLNd3WqcNI823UDUMlD21Xqv8liZsQhf3ISrurjCGnz6RnumhVkSax8lQLGutBCvGEdydEzdtyt-A3hrzghEqmpSS23Tn6DGqJv9UsQ== diff --git a/images/alignment_schematic.png b/images/alignment_schematic.png new file mode 100644 index 00000000..b9c91245 Binary files /dev/null and b/images/alignment_schematic.png differ diff --git a/images/broadcasting.png b/images/broadcasting.png new file mode 100644 index 00000000..4bdd88ad Binary files /dev/null and b/images/broadcasting.png differ diff --git a/images/broadcasting_schematic.png b/images/broadcasting_schematic.png new file mode 100644 index 00000000..034950ab Binary files /dev/null and b/images/broadcasting_schematic.png differ diff --git a/images/favicon.ico b/images/favicon.ico new file mode 100644 index 00000000..127feadc Binary files /dev/null and b/images/favicon.ico differ diff --git a/images/logo.png b/images/logo.png new file mode 100644 index 00000000..8fa32d2a Binary files /dev/null and b/images/logo.png differ diff --git a/images/malaria_dataset.png b/images/malaria_dataset.png new file mode 100644 index 00000000..b360a198 Binary files /dev/null and b/images/malaria_dataset.png differ diff --git a/images/orthogonal_vs_vectorized.png b/images/orthogonal_vs_vectorized.png new file mode 100644 index 00000000..e2033b87 Binary files /dev/null and b/images/orthogonal_vs_vectorized.png differ diff --git a/images/scipy2024.png b/images/scipy2024.png new file mode 100644 index 00000000..b9fdb87c Binary files /dev/null and b/images/scipy2024.png differ diff --git a/images/scipylogo.png b/images/scipylogo.png new file mode 100644 index 00000000..59c34332 Binary files /dev/null and b/images/scipylogo.png differ diff --git a/images/scipylogo2023.png b/images/scipylogo2023.png new file mode 100644 index 00000000..78791383 Binary files /dev/null and b/images/scipylogo2023.png differ diff --git a/images/xarray-data-structures.png b/images/xarray-data-structures.png new file mode 100644 index 00000000..8f4d4ae7 Binary files /dev/null and b/images/xarray-data-structures.png differ diff --git a/index.rst b/index.rst deleted file mode 100644 index 6abd1989..00000000 --- a/index.rst +++ /dev/null @@ -1,28 +0,0 @@ -Xarray Tutorial -=============== - -You can run this tutorial in a live session here: |Binder| - -.. -.. |Binder| image:: https://mybinder.org/badge_logo.svg - :target: https://mybinder.org/v2/gh/pydata/xarray-tutorial/master?urlpath=lab - - -.. toctree:: - :maxdepth: 1 - :caption: OceanHackWeek 2020 - - oceanhackweek-2020/xarray-oceanhackweek20.ipynb - - -.. toctree:: - :maxdepth: 1 - :caption: SciPy 2020 - - scipy-tutorial/00_overview.ipynb - scipy-tutorial/01_datastructures_and_io.ipynb - scipy-tutorial/02_working_with_labeled_data.ipynb - scipy-tutorial/03_computation_with_xarray.ipynb - scipy-tutorial/04_plotting_and_visualization.ipynb - scipy-tutorial/05_intro_to_dask.ipynb - scipy-tutorial/06_xarray_and_dask.ipynb diff --git a/intermediate/BiologyDataset.ipynb b/intermediate/BiologyDataset.ipynb new file mode 100644 index 00000000..7d4d6ced --- /dev/null +++ b/intermediate/BiologyDataset.ipynb @@ -0,0 +1,120 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Datasets in other fields\n", + "\n", + "\n", + "While there are many Xarray examples from geosciences the Xarray data model is not constrained to that field. Our examples so far solve problems that are highly analogous to the problems faced in biology. In this notebook we will load a dataset based on the [cells3d](https://scikit-image.org/docs/0.25.x/api/skimage.data.html#skimage.data.cells3d) dataset from scikit-image." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "## Loading the Dataset\n", + "\n", + "This dataset follows a classic pattern in microscopy where we have a stack of images, with two fluoresence channels. In addition to that we have a mask (or labels layer) that identifies individual cells " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.load_dataset(\"cells3d\")\n", + "ds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "ds[\"images\"].max(\"z\").sel(c=\"nuclei\").plot()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "ds[\"images\"].sel(z=9, method=\"nearest\").sel(c=\"membrane\").plot()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "ds[\"images\"].max(\"z\").sel(c=\"nuclei\").plot()\n", + "ds[\"mask\"].plot.contour(colors=\"Red\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "ds[\"mask\"].plot()" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "## Allows high level computations.\n", + "\n", + "We won't get into here - but this structuring data allows you to leverage Xarray to do powerful operations such as computing per cell properties. See the [Computational Patterns Notebook](./computation/01-high-level-computation-patterns.ipynb) for more." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/intermediate/cataloging.ipynb b/intermediate/cataloging.ipynb new file mode 100644 index 00000000..60c4a3af --- /dev/null +++ b/intermediate/cataloging.ipynb @@ -0,0 +1,203 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "source": [ + "# Data cataloguing for Xarray\n", + "\n", + "**Goals:** At the end of this tutorial, you'll have an overview of what data cataloging is, why it is done, what tools are available. You'll also know how to open and browse some data catalogues.\n", + "\n", + "> A data catalog is a detailed inventory of data assets within an organization. It helps users easily discover, understand, manage, curate and access data. -[IBM](https://www.ibm.com/think/topics/data-catalog)\n", + "\n", + "Within an organisation, you may work with a lot of different datasets. As someone managing this data, you might want the following things:\n", + "\n", + "- **An organized, easily browsable collection**: By easing discovery and loading of your datasets you can reduce the friction for those analysing the data. Users can eaily get an overview of available datasets, discover datasets of interest, and load them for analysis.\n", + "- **Access control and logging**: You can limit who is able to access these datasets, and track when datasets are being accessed - keeping the data private, and providing metrics that can inform data management (e.g., by removing little-used datasets).\n", + "- **Combine individual data assets**: Combine individual data assets that are similar into a larger object (e.g., combining individual time snapshots into a larger data cube)\n", + "\n", + "There are a bunch of solutions available in Xarray that meet some of these needs - we'll broadly call these \"data catalogs\". These solutions differ in functionality, and the correct data cataloguing solution depends on your needs as an institute.\n", + "\n", + "If you feel there are data cataloguing tools missing from this page, please submit a PR.\n", + "\n", + "## intake v2\n", + "\n", + "Intake is a lightweight Python package which allows one to specify data catalogues (or a hierarchy of catalogues) via YAML files. These YAML files describe:\n", + "\n", + "- how to load the dataset. This is done via \"readers\", which support different file formats, and support lazily defining additional transformations to the dataset using Dask\n", + "- additional metadata for the dataset\n", + "\n", + "Uploading the catalogue file to a Git forge like GitHub allows for versioning of this file.\n", + "\n", + "This catalogue can be browsed in Python, or via third-party tools which parse the datalog, allowing the user to select and open a dataset. This tool has been adopted in the geosciences community for working with Xarray datasets, but is also flexible to work with other dataset types.\n", + "\n", + "There is no separate authentication layer in Intake, hence access control and logging depends entirely on the way the data is accessed. If the dataset is loaded from a file location on a mounted drive, then you need to have access to that mounted drive. If the dataset is located in an S3 bucket, you need to have the appropriate access credentials for the resource.\n", + "\n", + "Intake was originally developed within Anaconda by the team behind Dask.\n", + "\n", + "### Resources\n", + "\n", + "Project Pythia has a [cookbook on Intake](https://projectpythia.org/intake-cookbook/notebooks/creating-catalogs/).\n", + "\n", + "### Example code\n", + "\n", + "Here we work based off [an Intake tutorial on easy.gems!](https://easy.gems.dkrz.de/Processing/intake.html) from the DKRZ (German Climate Supercomputing Center). Note that the tutorial is based on v1 of Intake (which also uses `intake-xarray`).\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "# Browse an existing catalogue\n", + "\n", + "import intake\n", + "\n", + "cat = intake.open_catalog(\"https://data.nextgems-h2020.eu/online.yaml\")\n", + "# TIP: Its just a YAML file - open it in your browser and you'll see!\n", + "\n", + "# view the available subcatalogues or datasets\n", + "list(cat)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "# Access catalogue elements using `[\"attr\"]` or `.attr` notation\n", + "# NOTE: The `.attr` notation only works if the entry is a valid Python attribute name - which the entry might not be\n", + "\n", + "# Let's see what the `tutorial` item is...\n", + "cat[\"tutorial\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "# it's a subcatalogue!\n", + "\n", + "print(list(cat[\"tutorial\"]))\n", + "\n", + "# Let's look at an entry within...\n", + "cat[\"tutorial\"][\"ICON.native.2d_PT6H_inst\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "# Let's open it as an xarray dataset\n", + "\n", + "ds = cat[\"tutorial\"][\"ICON.native.2d_PT6H_inst\"].to_dask()\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "That's it for the example! Feel free to poke around further to see what other datasets are available in this catalogue, or to see which other catalogues are available online." + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "## STAC\n", + "\n", + "> SpatioTemporal Asset Catalogs\n", + "> The STAC specification is a common language to describe geospatial information, so it can more easily be worked with, indexed, and discovered.\n", + "> -stacspec.org\n", + "\n", + "Let's set the scene a bit: During satellite data processing, many image files (predominantly TIFF) get generated. Each of these files can have different spatial and temporal extents, and over time these individual files can number in the millions, containing terrabytes of data in total. When doing analyses on these files, the first thing one needs to know is whether the file is even relevant to the analysis at hand (i.e., at least \"what is the spatial and temporal extent of the file?\"), however downloading the file just to check this metadata within is very wasteful. This is the context from which the STAC project was born.\n", + "\n", + "The goal of the STAC project is to make geospatial data more accessible by providing a specification to describe assets and their metadata. Adding this metadata alongside the asset (or lifting it out above the asset itself) allows:\n", + "\n", + "- The efficient querying of assets based on properties of interest without downloading the entire asset.\n", + "- The combining of these assets into a datacube object (i.e., Xarray dataset) by reprojecting or interpolating the data to a common grid.\n", + "\n", + "\n", + "Within the STAC project is:\n", + "\n", + "- **The STAC Specification**: A set of specifications describing (from most atomic to least) STAC Items, STAC Catalogs, and STAC collections. There is also a spec for the STAC API.\n", + "- **Tooling for working with STAC**: More on this just now\n", + "- **The community**\n", + "\n", + "There are various tools in the STAC ecosystem. There are online STAC browsers such as the [Radiant Earth STAC browser](https://radiantearth.github.io/stac-browser/#/). There are Python packages for the creating of STAC items and searching of STAC catalogues (e.g., [`rustac-py`](https://stac-utils.github.io/rustac/) and [`pystac`](https://github.com/stac-utils/pystac)). There are also Python packages for combining STAC objects into larger datacubes (e.g., [`odc-stac`](https://github.com/opendatacube/odc-stac), [`stacstac`](https://github.com/gjoseph92/stackstac) and [`xpystac`](https://github.com/stac-utils/xpystac)).\n", + "\n", + "There are many packages with some overlapping functionality. An example workflow you might follow would be using an online STAC browser to get a better understanding of the STAC assets you're working with, and what properties are available to query on, using `rustac-py` to generate and run the query, and then (once you're happy with the result) using `stackstac` or `odc-stac` to open the result as an Xarray Dataset.\n", + "\n", + "### Resources\n", + "\n", + "- https://stacspec.org/en\n", + "- https://stacindex.org/\n", + "- Example using odc-stac: See example notebook from `odc-stac`docs [\"Access Sentinel 2 Data from AWS\"](https://odc-stac.readthedocs.io/en/latest/notebooks/stac-load-e84-aws.html).\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "## Commercial offering - Arraylake\n", + "\n", + "There are also commercial offerings available that have data cataloguing functionality.\n", + "\n", + "Arraylake is Earthmover's managed cloud platform built on top of the open-source Icechunk data format\n", + "(where Icechunk is a project offering versioning of Zarr-like datasets).\n", + "\n", + "See [here](https://icechunk.io/en/latest/arraylake/) for a full comparison between Icechunk and Arraylake.\n", + "\n", + "A notable feature is that Arraylake integrates with [Earthmover's data marketplace](https://www.earthmover.io/marketplace/),\n", + "powering data discovery and allowing for the dissemination of datasets (or subsets of datasets) to other interested users.\n", + "\n", + "\n", + "\n", + "## More resources\n", + "\n", + "https://guide.cloudnativegeo.org/cookbooks/zarr-stac-report/data-consumers/" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/intermediate/computation/01-high-level-computation-patterns.ipynb b/intermediate/computation/01-high-level-computation-patterns.ipynb new file mode 100644 index 00000000..517fb604 --- /dev/null +++ b/intermediate/computation/01-high-level-computation-patterns.ipynb @@ -0,0 +1,1484 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "# Computational Patterns\n", + "\n", + "Often when writing code we repeat certain patterns, whether we realize it or not.\n", + "If you have learned to write list comprehensions, you are taking advantage of a \"control pattern\".\n", + "Often, these patterns are so common that many packages have built in functions to implement them.\n", + "\n", + "Quoting the [toolz documentation](https://toolz.readthedocs.io/en/latest/control.html):\n", + "\n", + "> The Toolz library contains dozens of patterns like map and groupby. Learning a\n", + "> core set (maybe a dozen) covers the vast majority of common programming tasks\n", + "> often done by hand. A rich vocabulary of core control functions conveys the\n", + "> following benefits:\n", + ">\n", + "> - You identify new patterns\n", + "> - You make fewer errors in rote coding\n", + "> - You can depend on well tested and benchmarked implementations\n", + "\n", + "The same is true for xarray.\n", + "\n", + "\n", + "```{seealso}\n", + "\n", + "The concepts covered here, particularly the emphasis on deleting for loops and focusing on large elements of the computation, are very related to the [array programming style](https://en.wikipedia.org/wiki/Array_programming) or paradigm. See this SciPy 2023 tutorial on [\"Thinking Like Arrays\"](https://github.com/jpivarski-talks/2023-07-11-scipy2023-tutorial-thinking-in-arrays) by Jim Pivarski if you are interested in these ideas.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "## Motivation / Learning goals\n", + "\n", + "- Learn what high-level computational patterns are available in Xarray.\n", + "- Learn that these patterns replace common uses of the `for` loop.\n", + "- Identify when you are re-implementing an existing computational pattern.\n", + "- Implement that pattern using built-in Xarray functionality.\n", + "- Understand the difference between `map` and `reduce`." + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": { + "slideshow": { + "slide_type": "subslide" + }, + "tags": [] + }, + "source": [ + "## Xarray's high-level patterns\n", + "\n", + "Xarray allows you to leverage dataset metadata to write more readable analysis\n", + "code. The metadata is stored with the data; not in your head.\n", + "\n", + "1. Dimension names: `dim=\"latitude\"` instead of `axis=0`\n", + "2. Coordinate \"labels\": or axis tick labels. `data.sel(latitude=45)` instead of\n", + " `data[10]`\n", + "\n", + "Xarray also provides computational patterns that cover many data\n", + "analysis tasks.\n", + "\n", + "Xarray provides methods for high-level analysis patterns:\n", + "\n", + "1. [`rolling`]() :\n", + " Operate on rolling or sliding (fixed length, overlapping) windows of your data e.g. running mean.\n", + "1. [`coarsen`]() :\n", + " Operate on blocks (fixed length) of your data (downsample).\n", + "1. [`groupby`]() :\n", + " Parse data into groups (using an exact value) and operate on each one (reduce data).\n", + "1. [`groupby_bins`](): GroupBy after discretizing a numeric (non-exact, e.g. float) variable.\n", + "1. [`resample`]() :\n", + " [Groupby specialized for time axes. Either downsample or upsample your data.]\n", + "1. [`weighted`](): Weight your data before reducing.\n", + "\n", + "\n", + "```{note}\n", + "The documentation links in this tutorial point to the DataArray implementations of each function, but they are also available for DataSet objects.\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "### Load example dataset\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "# reduce figure size\n", + "plt.rcParams[\"figure.dpi\"] = 90\n", + "xr.set_options(keep_attrs=True, display_expand_data=False)\n", + "\n", + "da = xr.tutorial.load_dataset(\"air_temperature\", engine=\"netcdf4\").air\n", + "monthly = da.resample(time=\"ME\").mean()\n", + "data = da.isel(time=0)\n", + "data.plot();" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "da" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "***\n", + "\n", + "### Identifying high-level computation patterns\n", + "\n", + "*or, when should I use these functions?*\n", + "\n", + "Consider a common use case. We want to complete some \"task\" for each of \"something\". The \"task\" might be a computation (e.g. mean, median, plot). The \"something\" could be a group of array values (e.g. pixels) or segments of time (e.g. monthly or seasonally).\n", + "\n", + "Often, our solution to this type of problem is to write a for loop. Say we want the average air temperature for each month across the entire domain (all lat and lon values):" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]\n", + "avg_temps = []\n", + "\n", + "# for loop\n", + "for mon in months:\n", + " # filter data, split out in to groups\n", + " subset = da[da[\"time.month\"] == mon]\n", + " # do some computation\n", + " avg = subset.mean()\n", + " # append to existing results\n", + " avg_temps.append(avg.item())\n", + "\n", + "print(avg_temps)" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "This pattern is the GroupBy pattern.\n", + "\n", + "\n", + "An easy conceptual next step for this example (but still using our for loop) would be to use Xarray's `groupby` function to create an iterator that does the work of grouping our data by month and looping over each month." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "avg_temps = []\n", + "\n", + "for label, group in da.groupby(\"time.month\"):\n", + " avg_temps.append(float(group.mean().data))\n", + "\n", + "print(avg_temps)" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "Writing a for-loop here is not wrong, but it can quickly become cumbersome if you have a complex function to apply and it will take a while to compute on a large dataset (you may even run out of memory). Parallelizing the computation would take a lot of additional work.\n", + "\n", + "Xarray's functionality instead allows us to do the same computation in one line of code (plus, the computation is optimized and ready to take advantage of parallel compute resources)!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "# note the use of the ellipses here\n", + "# for easy comparison to the for loop above\n", + "avg_temps = da.groupby(\"time.month\").mean(...)\n", + "print(avg_temps.data)" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "```{note}\n", + ":class: dropdown\n", + "By default, `da.mean()` (and `df.mean()`) will calculate the mean by reducing your data over all dimensions (unless you specify otherwise using the `dim` kwarg). The default behavior of `.mean()` on a groupby is to calculate the mean over all dimensions of the variable you are grouping by - but not all the dimensions of the object you are operating on. To compute the mean across all dimensions of a groupby, we must specify `...` for all dimensions (or use the `dim` kwarg to specify which dimensions to reduce by).\n", + "\n", + "```\n", + "\n", + "Here we showed an example for computing a mean over a certain period of time (months), which ultimately uses the `GroupBy` function to group together observations with similar characteristics that are scattered through the dataset. The transition from loops to a built-in function is similar for `rolling` and `coarsen` over sequential windows of values (e.g. pixels) instead of \"groups\" of time.\n", + "\n", + "Read on through this tutorial to learn some of the incredible ways to use Xarray to avoid writing long for-loops and efficiently complete computational analyses on your data.\n", + "\n", + "```{seealso}\n", + ":class: dropdown\n", + "For a more complex example (identifying flood events - including their start and end date - from rainfall data) illustrating the transition from for loops to high level computation tools, see [this discussion](https://github.com/pydata/xarray/discussions/7641). The [original 40 lines of code](https://github.com/pydata/xarray/discussions/7641#discussion-4976005), including nested for loops, was streamlined into a ~15 line workflow without any loops.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "***\n", + "\n", + "### Concept refresher: \"index space\" vs \"label space\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# index space\n", + "data[10, :] # 10th element along the first axis; ¯\\_(ツ)_/¯" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# slightly better index space\n", + "data.isel(lat=10) # slightly better, 10th element in latitude" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# \"label\" space\n", + "data.sel(lat=50) # much better! lat=50°N" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": { + "slideshow": { + "slide_type": "subslide" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# What I wanted to do\n", + "data.sel(lat=50)\n", + "\n", + "# What I had to do (if I wasn't using xarray)\n", + "data[10, :]" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "***\n", + "\n", + "## Xarray provides patterns in both \"index space\" and \"label space\"\n", + "\n", + "### Index space\n", + "\n", + "These are sequential windowed operations with a window of a fixed size.\n", + "\n", + "1. [`rolling`]() :\n", + " Operate on rolling or sliding (fixed length, overlapping) windows of your data e.g. running mean.\n", + "1. [`coarsen`]() :\n", + " Operate on blocks (fixed length) of your data (downsample).\n", + "\n", + "\n", + "### Label space\n", + "\n", + "These are windowed operations with irregular windows based on your data. Members of a single group may be non-sequential and scattered through the dataset.\n", + "\n", + "1. [`groupby`]() :\n", + " Parse data into groups (using an exact value) and operate on each one (reduce data).\n", + "1. [`groupby_bins`]( ): GroupBy after discretizing a numeric (non-exact, e.g. float) variable.\n", + "1. [`resample`]() :\n", + " Groupby specialized for time axes. Either downsample or upsample your data.\n" + ] + }, + { + "cell_type": "markdown", + "id": "20", + "metadata": { + "slideshow": { + "slide_type": "subslide" + }, + "tags": [] + }, + "source": [ + "add some \"loop\" versions to show what a user might come up with that could be turned into one of these pattern operations\n", + "\n", + "---\n", + "\n", + "## Index space: windows of fixed width\n", + "\n", + "### Sliding windows of fixed length: [`rolling`]()\n", + "\n", + "- Supports common reductions : `sum`, `mean`, `count`, `std`, `var` etc.\n", + "- Returns object of same shape as input\n", + "- Pads with NaNs to make this happen\n", + "- Supports multiple dimensions\n", + "\n", + "Here's the dataset\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "data.plot();" + ] + }, + { + "cell_type": "markdown", + "id": "22", + "metadata": {}, + "source": [ + "And now smoothed 5 point running mean in lat and lon\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [ + "data.rolling(lat=5, lon=5, center=True).mean().plot();" + ] + }, + { + "cell_type": "markdown", + "id": "24", + "metadata": { + "slideshow": { + "slide_type": "subslide" + }, + "tags": [] + }, + "source": [ + "#### Apply an existing numpy-only function with `reduce`\n", + "\n", + "In some cases, we may want to apply a sliding window function using rolling that is not built in to Xarray. In these cases we can still leverage the sliding windows of rolling and apply our own function with [`reduce`]().\n", + "\n", + "The `reduce` method on Xarray objects (e.g. DataArray, Dataset) expects a function that can *receive and return plain arrays (e.g. numpy)*, as in each of the \"windows\" provided by the rolling iterator. This is in contrast to the `map` method on DataArray and Dataset objects, which expects a function that can receive and return Xarray objects.\n", + "\n", + "Here's an example function: [`np.ptp`]().\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25", + "metadata": {}, + "outputs": [], + "source": [ + "data.rolling(lat=5, lon=5, center=True).reduce(np.ptp).plot();" + ] + }, + { + "cell_type": "markdown", + "id": "26", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Calculate the rolling mean in 5 point bins along both latitude and longitude using\n", + "[`rolling(...).reduce`]()\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "# exactly equivalent to data.rolling(...).mean()\n", + "data.rolling(lat=5, lon=5, center=True).reduce(np.mean).plot();\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "id": "27", + "metadata": { + "slideshow": { + "slide_type": "subslide" + }, + "tags": [] + }, + "source": [ + "#### View the `rolling` operation as a Xarray object with `construct`\n", + "\n", + "In the above examples, we plotted the outputs of our rolling operations. Xarray makes it easy to integrate the outputs from `rolling` directly into the DataArray using the method.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28", + "metadata": {}, + "outputs": [], + "source": [ + "simple = xr.DataArray(np.arange(10), dims=\"time\", coords={\"time\": np.arange(10)})\n", + "simple" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29", + "metadata": {}, + "outputs": [], + "source": [ + "# adds a new dimension \"window\"\n", + "simple.rolling(time=5, center=True).construct(\"window\")" + ] + }, + { + "cell_type": "markdown", + "id": "30", + "metadata": {}, + "source": [ + "```{note}\n", + "Because `.construct()` only returns a \"view\" (not a copy) of the original data object (i.e. it is not operating \"in-place\"), in order to \"save\" the results you would need to rewrite the original object: `simple = simple.rolling(time=5, center=True).construct(\"window\")`.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "31", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "Calculate the 5 point running mean in time using `rolling.construct`\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "simple.rolling(time=5, center=True).construct(\"window\").mean(\"window\")\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "id": "32", + "metadata": {}, + "source": [ + "`construct` is clever.\n", + "\n", + "1. It constructs a [**view**](https://numpy.org/doc/stable/user/basics.copies.html) of the original array, so it is memory-efficient.\n", + "1. It does something sensible for dask arrays (though generally you want big chunksizes for the dimension you're sliding along).\n", + "1. It also works with rolling along multiple dimensions!\n" + ] + }, + { + "cell_type": "markdown", + "id": "33", + "metadata": { + "tags": [] + }, + "source": [ + "#### Advanced: Another `construct` example\n", + "\n", + "This is a 2D rolling example; we need to provide two new dimension names.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34", + "metadata": {}, + "outputs": [], + "source": [ + "data.rolling(lat=5, lon=5, center=True).construct(lat=\"lat_roll\", lon=\"lon_roll\")" + ] + }, + { + "cell_type": "markdown", + "id": "35", + "metadata": { + "slideshow": { + "slide_type": "subslide" + }, + "tags": [] + }, + "source": [ + "***\n", + "\n", + "### Block windows of fixed length: `coarsen`\n", + "\n", + "For non-overlapping windows or \"blocks\" use [`coarsen`](). The syntax is very similar to `rolling`. You will need to specify how you want Xarray to handle the `boundary` if the length of the dimension is not a multiple of the block size.\n", + "\n", + "\n", + "- Supports common reductions : `sum`, `mean`, `count`, `std`, `var` etc.\n", + "- Does **not** return an object of same shape as input\n", + "- Allows controls over behaviour at boundaries\n", + "- Supports multiple dimensions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36", + "metadata": {}, + "outputs": [], + "source": [ + "data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "37", + "metadata": {}, + "outputs": [], + "source": [ + "data.plot();" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38", + "metadata": {}, + "outputs": [], + "source": [ + "data.coarsen(lat=5, lon=5, boundary=\"trim\").mean()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39", + "metadata": {}, + "outputs": [], + "source": [ + "(data.coarsen(lat=5, lon=5, boundary=\"trim\").mean().plot())" + ] + }, + { + "cell_type": "markdown", + "id": "40", + "metadata": { + "slideshow": { + "slide_type": "subslide" + }, + "tags": [] + }, + "source": [ + "#### Coarsen supports `reduce` for custom reductions\n", + "\n", + "::::{admonition} Exercise\n", + ":class: tip\n", + "Use `coarsen.reduce` to apply `np.ptp` in 5x5 (lat x lon) point blocks to `data`\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "data.coarsen(lat=5, lon=5, boundary=\"trim\").reduce(np.ptp).plot();\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "id": "41", + "metadata": { + "slideshow": { + "slide_type": "subslide" + }, + "tags": [] + }, + "source": [ + "#### Coarsen supports `construct` for block reshaping and storing outputs\n", + "\n", + "```{tip}\n", + "`coarsen.construct` is usually a good alternative to `np.reshape`\n", + "```\n", + "\n", + "A simple example splits a 2-year long monthly 1D time series into a 2D array shaped (year x month)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42", + "metadata": {}, + "outputs": [], + "source": [ + "months = xr.DataArray(\n", + " np.tile(np.arange(1, 13), reps=2),\n", + " dims=\"time\",\n", + " coords={\"time\": np.arange(1, 25)},\n", + ")\n", + "months" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43", + "metadata": {}, + "outputs": [], + "source": [ + "# break \"time\" into two new dimensions: \"year\", \"month\"\n", + "months.coarsen(time=12).construct(time=(\"year\", \"month\"))" + ] + }, + { + "cell_type": "markdown", + "id": "44", + "metadata": {}, + "source": [ + "Note two things:\n", + "\n", + "1. The `time` dimension was also reshaped.\n", + "1. The new dimensions `year` and `month` don't have any coordinate labels\n", + " associated with them.\n", + "\n", + "What if the data had say 23 instead of 24 values (`months.isel(time=slice(1, None)`)? In that case we specify a different `boundary` (the default `boundary=\"exact\"` worked above); here we pad to 24 values.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45", + "metadata": {}, + "outputs": [], + "source": [ + "months.isel(time=slice(1, None)).coarsen(time=12, boundary=\"pad\").construct(time=(\"year\", \"month\"))" + ] + }, + { + "cell_type": "markdown", + "id": "46", + "metadata": {}, + "source": [ + "This adds values at the end of the array (see the 'nan' at the end of the time coordinate?), which is not so sensible for this\n", + "problem. We have some control of the padding through the `side` kwarg to `coarsen`. For `side=\"right\"` we get more sensible output." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "47", + "metadata": {}, + "outputs": [], + "source": [ + "months.isel(time=slice(1, None)).coarsen(time=12, boundary=\"pad\", side=\"right\").construct(\n", + " time=(\"year\", \"month\")\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "48", + "metadata": {}, + "source": [ + "Note that `coarsen` pads with NaNs. For more control over padding, use\n", + "[DataArray.pad]() explicitly." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "49", + "metadata": {}, + "outputs": [], + "source": [ + "(\n", + " months.isel(time=slice(1, None))\n", + " .pad(time=(1, 0), constant_values=-1)\n", + " .coarsen(time=12)\n", + " .construct(time=(\"year\", \"month\"))\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "50", + "metadata": {}, + "source": [ + "```{note}\n", + "The value specified in `.pad` only applies the `fill_value` to the array, not to coordinate variables.\n", + "This is why the first value of time in the above example is NaN and not -1.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "51", + "metadata": {}, + "source": [ + ":::{admonition} Exercise\n", + ":class: tip\n", + "Reshape the `time` dimension of the DataArray `monthly` to year x\n", + "month and visualize the seasonal cycle for two years at 250°E\n", + "\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "# splits time dimension into year x month\n", + "year_month = monthly.coarsen(time=12).construct(time=(\"year\", \"month\"))\n", + "\n", + "# assign a nice coordinate value for month\n", + "year_month[\"month\"] = [\n", + " \"jan\",\n", + " \"feb\",\n", + " \"mar\",\n", + " \"apr\",\n", + " \"may\",\n", + " \"jun\",\n", + " \"jul\",\n", + " \"aug\",\n", + " \"sep\",\n", + " \"oct\",\n", + " \"nov\",\n", + " \"dec\",\n", + "]\n", + "\n", + "# assign a nice coordinate value for year\n", + "year_month[\"year\"] = [2013, 2014]\n", + "\n", + "# seasonal cycle for two years\n", + "year_month.sel(lon=250).plot.contourf(col=\"year\", x=\"month\", y=\"lat\")\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "id": "52", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "Calculate the rolling 4 month average, averaged across years. (This exercise came up during a live lecture).\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "1. We first reshape using `coarsen.construct` to add `year` as a new dimension.\n", + "2. Apply `rolling` on the month dimension.\n", + "3. It turns out that `roll.mean([\"year\", \"month\"])` doesn't work. So we use `roll.construct` to get a DataArray with a new dimension `window` and then take the mean over `window` and `year`\n", + "\n", + "```python\n", + "reshaped = months.coarsen(time=12).construct(time=(\"year\", \"month\"))\n", + "roll = reshaped.rolling(month=4, center=True)\n", + "roll.construct(\"window\").mean([\"window\", \"year\"])\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "id": "53", + "metadata": {}, + "source": [ + "### Summary\n", + "\n", + "Delete your `for` loops. Use `rolling` and `coarsen` for fixed size windowing operations.\n", + "\n", + "1. `rolling` for overlapping windows\n", + "1. `coarsen` for non-overlapping windows.\n", + "\n", + "Both provide the usual reductions as methods (`.mean()` and friends), and also\n", + "`reduce` and `construct` for custom operations.\n" + ] + }, + { + "cell_type": "markdown", + "id": "54", + "metadata": { + "slideshow": { + "slide_type": "slide" + }, + "tags": [] + }, + "source": [ + "***\n", + "\n", + "## Label space \"windows\" or bins : GroupBy\n", + "\n", + "Sometimes the windows you want are not regularly spaced or even defined by a grid.\n", + "For instance, grouping data by month (which have varying numbers of days) or the results of an image classification.\n", + "The GroupBy functions are essentially a generalization of `coarsen`: \n", + "\n", + "- `groupby`: divide data into distinct groups, e.g. climatologies, composites. Works best when the \"group identifiers\" or \"labels\" are exact and can be determined using equality (`==`), e.g. characters or integers. Remember that floats are not exact values.\n", + "- `groupby_bins`: Use binning operations, e.g. histograms, to group your data.\n", + "- `resample`: Specialized implementation of GroupBy specifically for time grouping (so far), allows you to change sampling frequency of dataset.\n", + "\n", + "\n", + "```{note}\n", + " Both `groupby_bins` and `resample` are implemented as `groupby` with a specific way of constructing group labels. The GroupBy pattern is very flexible!\n", + "```\n", + "\n", + "\n", + "### Deconstructing GroupBy\n", + "\n", + "The GroupBy workflow is commonly called \"split-apply-combine\".\n", + "\n", + "1. *Split* : break dataset into groups\n", + "1. *Apply* : apply an operation, for instance a reduction like `mean`\n", + "1. *Combine* : concatenate results from apply step along a new \"group\" dimension\n", + "\n", + "illustrated in this neat schematic from [Project Pythia](https://foundations.projectpythia.org/core/xarray/computation-masking.html#groupby-split-apply-combine):\n", + "\n", + "\n", + "But really there is a \"hidden\" first step: *identifying* groups (also called \"factorization\" or sometimes \"binning\"). Usually this is the hard part.\n", + "\n", + "In reality the workflow is: \"identify groups\" → \"split into groups\" → \"apply function\" → \"combine results\".\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "55", + "metadata": {}, + "outputs": [], + "source": [ + "# recall our earlier DataArray\n", + "da" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56", + "metadata": {}, + "outputs": [], + "source": [ + "# GroupBy returns an iterator that traverses the specified groups, here by month.\n", + "# Notice that groupby is clever enough for us to leave out the `.dt` before `.month`\n", + "# we would need to specify to access the month data directly, as in `da.time.dt.month`.\n", + "da.groupby(\"time.month\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "57", + "metadata": {}, + "outputs": [], + "source": [ + "# for each group (e.g. the air temperature in a given month for all the years),\n", + "# compute the mean\n", + "da.groupby(\"time.month\").mean()" + ] + }, + { + "cell_type": "markdown", + "id": "58", + "metadata": {}, + "source": [ + "Notice that since we have averaged over all the years for each month, our resulting DataArray no longer has a \"year\" coordinate.\n", + "\n", + "If we want to see how Xarray identifies \"groups\" for the monthly climatology computation, we can plot our input to `groupby`. GroupBy is clever enough to figure out how many values there are an thus how many groups to make.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "59", + "metadata": {}, + "outputs": [], + "source": [ + "da[\"time.month\"].plot();" + ] + }, + { + "cell_type": "markdown", + "id": "60", + "metadata": {}, + "source": [ + "Similarly for binning (remember this is useful when the parameter you are binning over is not \"exact\", like a float),\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61", + "metadata": {}, + "outputs": [], + "source": [ + "data.groupby_bins(\"lat\", bins=[20, 35, 40, 45, 50])" + ] + }, + { + "cell_type": "markdown", + "id": "62", + "metadata": {}, + "source": [ + "and resampling...\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63", + "metadata": {}, + "outputs": [], + "source": [ + "da.resample(time=\"ME\")" + ] + }, + { + "cell_type": "markdown", + "id": "64", + "metadata": {}, + "source": [ + "```{note}\n", + "\n", + "Resampling is changing the frequency of our data to monthly (for two years), so we have 24 bins. GroupBy is taking the average across all data in the same month for two years, so we have 12 bins.\n", + "\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "65", + "metadata": { + "slideshow": { + "slide_type": "subslide" + }, + "tags": [] + }, + "source": [ + "### Constructing group labels\n", + "\n", + "If the automatic group detection doesn't work for your problem then these functions are useful for constructing specific \"group labels\" in many cases\n", + "\n", + "1. [numpy.digitize]()\n", + " for binning\n", + "1. [numpy.searchsorted]()\n", + " supports many other data types\n", + "1. [pandas.factorize]()\n", + " supports characters, strings etc.\n", + "1. [pandas.cut]()\n", + " for binning\n", + "1. [\"Datetime components\"]() of Xarray DataArrays\n", + "1. [DataArray.isin]()\n", + "1. [scipy.ndimage.label]()\n", + "1. Do you know of any more? (Send in a pull request to update this list!)\n", + "\n", + "\n", + "```{tip}\n", + "Xarray uses `pandas.factorize` for `groupby` and `pandas.cut` for `groupby_bins`.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "66", + "metadata": { + "slideshow": { + "slide_type": "subslide" + }, + "tags": [] + }, + "source": [ + "#### \"Datetime components\" for creating groups\n", + "\n", + "See a full list [here]()\n", + "\n", + "These can be accessed in a few different ways as illustrated below.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "67", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "da.time" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "68", + "metadata": {}, + "outputs": [], + "source": [ + "da.time.dt.day" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "69", + "metadata": {}, + "outputs": [], + "source": [ + "da[\"time.day\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "70", + "metadata": {}, + "outputs": [], + "source": [ + "da.time.dt.season" + ] + }, + { + "cell_type": "markdown", + "id": "71", + "metadata": {}, + "source": [ + "#### Construct and use custom labels\n", + "\n", + "##### Custom seasons with `numpy.isin`.\n", + "\n", + "We want to group over four seasons: `DJF`, `MAM`, `JJAS`, `ON` - this makes physical sense in the Indian Ocean basin.\n", + "\n", + "Start by extracting months.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "72", + "metadata": {}, + "outputs": [], + "source": [ + "month = da.time.dt.month.data\n", + "month" + ] + }, + { + "cell_type": "markdown", + "id": "73", + "metadata": {}, + "source": [ + "Create a new empty array\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "74", + "metadata": {}, + "outputs": [], + "source": [ + "myseason = np.full(month.shape, \" \")\n", + "myseason" + ] + }, + { + "cell_type": "markdown", + "id": "75", + "metadata": {}, + "source": [ + "Use `isin` to assign custom seasons,\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "76", + "metadata": {}, + "outputs": [], + "source": [ + "myseason[np.isin(month, [12, 1, 2])] = \"DJF\"\n", + "myseason[np.isin(month, [3, 4, 5])] = \"MAM\"\n", + "myseason[np.isin(month, [6, 7, 8, 9])] = \"JJAS\"\n", + "myseason[np.isin(month, [10, 11])] = \"ON\"" + ] + }, + { + "cell_type": "markdown", + "id": "77", + "metadata": {}, + "source": [ + "Turn our new seasonal group array into a DataArray." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "78", + "metadata": {}, + "outputs": [], + "source": [ + "myseason_da = da.time.copy(data=myseason)\n", + "myseason_da" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "79", + "metadata": {}, + "outputs": [], + "source": [ + "(\n", + " # Calculate climatology\n", + " da.groupby(myseason_da)\n", + " .mean()\n", + " # reindex to get seasons in logical order (not alphabetical order)\n", + " .reindex(time=[\"DJF\", \"MAM\", \"JJAS\", \"ON\"])\n", + " .plot(col=\"time\")\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "80", + "metadata": { + "slideshow": { + "slide_type": "subslide" + }, + "tags": [] + }, + "source": [ + "##### `floor`, `ceil` and `round` on time\n", + "\n", + "Additional functionality in the [datetime accessor]() allows us to effectively \"resample\" our time data to remove roundoff errors in timestamps.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "81", + "metadata": {}, + "outputs": [], + "source": [ + "da.time" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82", + "metadata": {}, + "outputs": [], + "source": [ + "# remove roundoff error in timestamps\n", + "# floor to daily frequency\n", + "da.time.dt.floor(\"D\")" + ] + }, + { + "cell_type": "markdown", + "id": "83", + "metadata": { + "slideshow": { + "slide_type": "subslide" + }, + "tags": [] + }, + "source": [ + "##### `strftime` is another powerful option\n", + "\n", + "So useful and so unintuitive that it has its own website: https://strftime.org/\n", + "\n", + "This is useful to avoid merging \"Feb-29\" and \"Mar-01\" for a daily climatology\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "84", + "metadata": {}, + "outputs": [], + "source": [ + "da.time.dt.strftime(\"%b-%d\")" + ] + }, + { + "cell_type": "markdown", + "id": "85", + "metadata": { + "tags": [] + }, + "source": [ + "### Custom reductions with `GroupBy.reduce`\n", + "\n", + "Analogous to `rolling`, `reduce` and `map` apply custom reductions to `groupby_bins` and `resample`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "86", + "metadata": {}, + "outputs": [], + "source": [ + "(da.groupby(\"time.month\").reduce(np.ptp).plot(col=\"month\", col_wrap=4))" + ] + }, + { + "cell_type": "markdown", + "id": "87", + "metadata": {}, + "source": [ + "```{tip}\n", + " `map` is for functions that expect and return xarray objects (see also [`Dataset.map`](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.map.html)). `reduce` is for functions that expect and return plain arrays (like Numpy or SciPy functions).\n", + "```\n" + ] + }, + { + "cell_type": "markdown", + "id": "88", + "metadata": { + "tags": [] + }, + "source": [ + "### Viewing the GroupBy operation on your DataArray or DataSet\n", + "\n", + "GroupBy does *not* provide a `construct` method, because all the groups need not be the same \"length\" (e.g. months can have 28, 29, 30, or 31 days).\n", + "\n", + "#### Instead looping over groupby objects is possible\n", + "\n", + "Because `groupby` returns an iterator that loops over each group, it is easy to loop over groupby objects. You can also iterate over `rolling` and `coarsen` objects, however this approach is usually quite slow.\n", + "\n", + "Maybe you want to plot data in each group separately:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89", + "metadata": {}, + "outputs": [], + "source": [ + "for label, group in da.groupby(\"time.month\"):\n", + " print(label)" + ] + }, + { + "cell_type": "markdown", + "id": "90", + "metadata": {}, + "source": [ + "`group` is a DataArray containing data for all December days (because the last printed `label` value is `12`, so the last `group` value is for December)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "91", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "group" + ] + }, + { + "cell_type": "markdown", + "id": "92", + "metadata": {}, + "source": [ + "Maybe you want a histogram of December temperatures?\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "93", + "metadata": {}, + "outputs": [], + "source": [ + "group.plot.hist()" + ] + }, + { + "cell_type": "markdown", + "id": "94", + "metadata": {}, + "source": [ + "Remember, this example is just to show how you could operate on each group object in a groupby operation. If we wanted to just explore the December (or March) data, we should just filter for it directly:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "95", + "metadata": {}, + "outputs": [], + "source": [ + "da[da[\"time.month\"] == 12].plot.hist()" + ] + }, + { + "cell_type": "markdown", + "id": "96", + "metadata": { + "tags": [] + }, + "source": [ + "#### In most cases, avoid a for loop using `map`\n", + "\n", + "`map` enables us to apply functions that expect xarray Datasets or DataArrays. This makes it easy to perform calculations on the grouped data, add the results from each group back to the original object, and avoid having to manually combine results (using concat).\n", + "\n", + "\n", + "```{tip}\n", + "The implementation of `map` *is* a `for` loop. We like `map` because it's cleaner.\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def iqr(gb_da, dim):\n", + " \"\"\"Calculates interquartile range\"\"\"\n", + " return (gb_da.quantile(q=0.75, dim=dim) - gb_da.quantile(q=0.25, dim=dim)).rename(\"iqr\")\n", + "\n", + "\n", + "da.groupby(\"time.month\").map(iqr, dim=\"time\")" + ] + }, + { + "cell_type": "markdown", + "id": "98", + "metadata": {}, + "source": [ + "***" + ] + }, + { + "cell_type": "markdown", + "id": "99", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "Xarray provides methods for high-level analysis patterns:\n", + "\n", + "1. [`rolling`]() :\n", + " Operate on rolling or sliding (fixed length, overlapping) windows of your data e.g. running mean.\n", + "1. [`coarsen`]() :\n", + " Operate on blocks (fixed length) of your data (downsample).\n", + "1. [`groupby`]() :\n", + " Parse data into groups (using an exact value) and operate on each one (reduce data).\n", + "1. [`groupby_bins`](): GroupBy after discretizing a numeric (non-exact, e.g. float) variable.\n", + "1. [`resample`]() :\n", + " [Groupby specialized for time axes. Either downsample or upsample your data.]\n", + "1. [`weighted`](): Weight your data before reducing.\n", + "\n", + "Xarray also provides a consistent interface to make using those patterns easy:\n", + "\n", + "1. Iterate over the operators (`rolling`, `coarsen`, `groupby`, `groupby_bins`, `resample`).\n", + "1. Apply functions that accept numpy-like arrays with `reduce`.\n", + "1. Reshape to a new xarray object with `.construct` (`rolling`, `coarsen` only).\n", + "1. Apply functions that accept xarray objects with `map` (`groupby`, `groupby_bins`, `resample` only).\n" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/intermediate/computation/hierarchical_computation.ipynb b/intermediate/computation/hierarchical_computation.ipynb new file mode 100644 index 00000000..1338be88 --- /dev/null +++ b/intermediate/computation/hierarchical_computation.ipynb @@ -0,0 +1,328 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Hierarchical computations\n", + "\n", + "In this lesson, we extend what we learned about to hierarchical datasets. By the end of the lesson, we will be able to:\n", + "\n", + "- Apply basic arithmetic and label-aware reductions to xarray DataTree objects\n", + "- Apply arbitrary functions across all nodes across a tree" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "xr.set_options(keep_attrs=True, display_expand_attrs=False, display_expand_data=False)" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "## Example dataset\n", + "\n", + "First we load the NMC reanalysis air temperature dataset and arrange it to form a hierarchy of temporal resolutions:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.open_dataset(\"air_temperature\")\n", + "\n", + "ds_daily = ds.resample(time=\"D\").mean(\"time\")\n", + "ds_weekly = ds.resample(time=\"W\").mean(\"time\")\n", + "ds_monthly = ds.resample(time=\"ME\").mean(\"time\")\n", + "\n", + "tree = xr.DataTree.from_dict(\n", + " {\n", + " \"daily\": ds_daily,\n", + " \"weekly\": ds_weekly,\n", + " \"monthly\": ds_monthly,\n", + " \"\": xr.Dataset(attrs={\"name\": \"NMC reanalysis temporal pyramid\"}),\n", + " }\n", + ")\n", + "tree" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "## Arithmetic\n", + "\n", + "As an extension to `Dataset`, `DataTree` objects automatically apply arithmetic to all variables within all nodes:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "tree - 273.15" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "## Indexing\n", + "\n", + "Just like arithmetic, indexing is simply forwarded to the node datasets. The only difference is that nodes that don't have a certain coordinate / dimension are skipped instead of raising an error:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "tree.isel(lat=slice(None, 10))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "tree.sel(time=\"2013-11\")" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "## Reductions\n", + "\n", + "In a similar way, we can reduce all nodes in the datatree at once:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "tree.mean(dim=[\"lat\", \"lon\"])" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "## Applying functions designed for `Dataset` with `map_over_datasets`\n", + "\n", + "What if we wanted to apply a element-wise function, for example to convert the data to log-space? For a `DataArray` we could just use {py:func}`numpy.log`, but this is not supported for `DataTree` objects:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "np.log(tree)" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "To map a function to all nodes, we can use {py:func}`xarray.map_over_datasets` and {py:meth}`xarray.DataTree.map_over_datasets`: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "tree.map_over_datasets(xr.ufuncs.log)" + ] + }, + { + "cell_type": "markdown", + "id": "15", + "metadata": {}, + "source": [ + "We can also use a custom function to perform more complex operations, like subtracting a group mean:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "def demean(ds):\n", + " return ds.groupby(\"time.day\") - ds.groupby(\"time.day\").mean()" + ] + }, + { + "cell_type": "markdown", + "id": "17", + "metadata": {}, + "source": [ + "Applying that to the dataset raises an error, though:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "tree.map_over_datasets(demean)" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "The reason for this error is that the root node does not have any variables, and thus in particular no `\"time\"` coordinate. To avoid the error, we have to skip computing the function for that node:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "def demean(ds):\n", + " if \"time\" not in ds.coords:\n", + " return ds\n", + " return ds.groupby(\"time.day\") - ds.groupby(\"time.day\").mean()\n", + "\n", + "\n", + "tree.map_over_datasets(demean)" + ] + }, + { + "cell_type": "markdown", + "id": "21", + "metadata": {}, + "source": [ + "## Escape hatches\n", + "\n", + "For some more complex operations, it might make sense to work on {py:class}`xarray.Dataset` or {py:class}`xarray.DataArray` objects and reassemble the tree afterwards.\n", + "\n", + "Let's look at a new dataset:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": {}, + "outputs": [], + "source": [ + "precipitation = xr.tutorial.open_datatree(\"precipitation.nc4\").load()\n", + "precipitation" + ] + }, + { + "cell_type": "markdown", + "id": "23", + "metadata": {}, + "source": [ + "Suppose we wanted to interpolate the observed precipitation to the modelled precipitation. We could use `map_over_datasets` for this, but we can also have a bit more control:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": {}, + "outputs": [], + "source": [ + "interpolated = xr.DataTree.from_dict(\n", + " {\n", + " \"/\": precipitation.ds,\n", + " \"/observed\": precipitation[\"/observed\"].ds.interp(\n", + " lat=precipitation[\"/reanalysis/lat\"],\n", + " lon=precipitation[\"/reanalysis/lon\"],\n", + " ),\n", + " \"/reanalysis\": precipitation[\"/reanalysis\"],\n", + " }\n", + ")\n", + "interpolated" + ] + }, + { + "cell_type": "markdown", + "id": "25", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "Compute the difference between total observed and modelled precipitation, and plot the result.\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "total = precipitation.sum(dim=[\"lon\", \"lat\"])\n", + "difference = total[\"/observed/precipitation\"] - total[\"/reanalysis/precipitation\"]\n", + "difference.plot()\n", + "```\n", + ":::\n", + "::::\n" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/intermediate/computation/index.md b/intermediate/computation/index.md new file mode 100644 index 00000000..2774c4ee --- /dev/null +++ b/intermediate/computation/index.md @@ -0,0 +1,5 @@ +# Computations + +```{tableofcontents} + +``` diff --git a/intermediate/data_cleaning/05.1_intro.md b/intermediate/data_cleaning/05.1_intro.md new file mode 100644 index 00000000..c3ccfd43 --- /dev/null +++ b/intermediate/data_cleaning/05.1_intro.md @@ -0,0 +1,83 @@ +# Data Tidying + +Array data that are represented by Xarray objects are often multivariate, multi-dimensional, and very complex. Part of the beauty of Xarray is that it is adaptable and scalable to represent a large number of data structures. However, this can also introduce difficulty (especially for learning users) in arriving at a workable structure that will best suit one's analytical needs. + +```{seealso} +Look for examples [here](05.2_examples.md) +``` + +This project is motivated by community sentiment and experiences that often, the hardest part of learning and teaching Xarray is teaching users how best to use Xarray conceptually. We hope to leverage the experiences of Xarray and geospatial data users to arrive at a unifying definition of 'tidy' data in this context and best practices for 'tidying' geospatial raster data represented by Xarray objects. + +This page discusses common data ‘tidying’ steps and presents principles to keep in mind when organizing data in Xarray. We also point out helpful extensions to simplify and automate this process for specific dataset types like satellite imagery. + +A great first step is familiarizing yourself with the [terminology](https://docs.xarray.dev/en/stable/user-guide/terminology.html) used in the Xarray ecosystem. + +## A brief primer on tidy data + +Tidy data was developed by Hadley Wickham for tabular datasets in the R programming language. Many resources comprehensively explain this concept and the ecosystem of tools built upon it. Below is a very brief explanation: + +**Data tidying** is the process of structuring datasets to facilitate analysis. Wickham writes: "...tidy datasets are all alike, but every messy dataset is messy in its own way. Tidy datasets provide a standardized way to link the structure of a dataset (its physical layout) with its semantics (its meaning)" (Wickham, 2014). + +### Tidy data principles for tabular datasets + +The concept of [tidy data](https://vita.had.co.nz/papers/tidy-data.pdf) was developed by Hadley Wickham in the R programming language, and is a set of principles to guide facilitating tabular data for analysis. + +{attribution="Wickham, 2014"} + +> "Tidy datasets are all alike, but every messy dataset is messy in its own way." + +Wickham defines three core principles of tidy data for tabular principles. They are: + +1. Each variable forms an observation +2. Each observation forms a row +3. Each type of observational unit forms a table + +## Imagining a 'tidy data' framework for gridded datasets + +### Common use-case: Manipulating individual observations to an x-y-time datacube + +Data downloaded or accessed from DAACs and other providers is often (for good reason) separated into temporal observations or spatial subsets. This minimizes the services that must be provided for different datasets and allows the user to access just the material that they need. However, most workflows will involve some sort of spatial and/or temporal investigation of an observable, which will usually require the analyst to arrange individual files into spatial mosaics and/or temporal cubes. In addition to being a source of duplicated effort and work, these steps also introduce decision-points that can be stumbling blocks for newer users. We hope a tidy framework for xarray will streamline the process of preparing data for analysis by providing specific expectations of what 'tidied' datasets look like as well as common patterns and tools to use to arrive at a tidy state. + +## Tidy data principles for Xarray data structures + +These are guidelines to keep in mind while you are organizing your data. For detailed definitions of the terms mentioned below (and more), check out Xarray's [Terminology page](https://docs.xarray.dev/en/stable/user-guide/terminology.html). + +**1. Dimensions** + +- Minimize the number of dimensional coordinates + +**2. Coordinates** + +- Non-dimensional coordinates can be numerous. Each should exist along one or multiple dimensions + +**3. Data Variables** + +- Data variables should be observables rather than contextual. Each should exist along one or multiple dimensions. + +**4. Contextual information (metadata)** + +- Metadata should only be stored as an attribute if it is static along the dimensions to which it is applied. +- If metadata is dynamic, it should be stored as a coordinate variable. +- Metadata `attrs` should be added such that dataset is self-describing (following CF-conventions) + +**5. Variable, attribute naming** + +- **Wherever possible, use cf-conventions for naming** +- Variable names should be descriptive +- Variable names should not contain information that belongs in a dimension or coordinate (ie. information stored in a variable name should be reduced to only the observable the variable describes. + +**6. Make us of & work within the framework of other tools** + +- Specification systems such as [CF](https://cfconventions.org/) and [STAC](https://stacspec.org/en), and related tools such as [Open Data Cube](https://www.opendatacube.org/), [PySTAC](https://pystac.readthedocs.io/en/stable/), [cf_xarray](https://cf-xarray.readthedocs.io/en/latest/),[stackstac](https://stackstac.readthedocs.io/en/latest/) and more make tidying possible and smoother, especially with large, cloud-optimized datasets. +- + +## Other guidelines and rules of thumb + +- Avoid storing important data in filenames +- Non-descriptive variable names can create + perpetuate confusion +- Missing coordinate information makes datasets harder to use +- Elements of a dataset's 'shape'/structure can sometimes be embedded in variable names; this will complicate subsequent analysis + +## Contributing + +We would love your help and engagement on this project! If you have a dataset that you've worked with that felt particularly messy, or one with steps you find yourself thinking back to as you work with new datasets, consider submitting it as an example! If you have input on tidy principles, please feel free to raise an issue. diff --git a/intermediate/data_cleaning/05.2_examples.md b/intermediate/data_cleaning/05.2_examples.md new file mode 100644 index 00000000..3abdb943 --- /dev/null +++ b/intermediate/data_cleaning/05.2_examples.md @@ -0,0 +1,16 @@ +# Examples + +This page contains examples of 'tidying' datasets. If you have an example you'd like to submit, or an example of an anti-pattern, please raise an issue ! + +## 1. Aquarius + +This is an example of tidying a dataset comprised of locally downloaded files. Aquarius is a sea surface salinity dataset produced by NASA and accessed as network Common Data Form (NetCDF) files. +You can find this example [here](https://gist.github.com/dcherian/66269bc2b36c2bc427897590d08472d7). This example focuses on data access steps and organizing data into a workable data cube. + +## 2. ASE Ice Velocity + +Already integrated into the Xarray tutorial, this examples uses an ice velocity dataset derived from synthetic aperture radar imagery. You can find it [here](05.3_ice_velocity.ipynb). This example focuses on data access steps and organizing data into a workable data cube. + +## 3. Harmonized Landsat-Sentinel + +This [example](https://nbviewer.org/gist/scottyhq/efd583d66999ce8f6e8bcefa81545b8d) features cloud-optimized data that does not need to be downloaded locally. Here, package such as [`odc-stac`](https://github.com/opendatacube/odc-stac) are used to accomplish much of the initial tidying (assembling an x,y,time cube). However, this example shows that there is frequently additional formatting required to make a dataset analysis ready. diff --git a/intermediate/data_cleaning/05.3_ice_velocity.ipynb b/intermediate/data_cleaning/05.3_ice_velocity.ipynb new file mode 100644 index 00000000..ca29fc3d --- /dev/null +++ b/intermediate/data_cleaning/05.3_ice_velocity.ipynb @@ -0,0 +1,491 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Re-organize InSAR ice velocity data\n", + "\n", + "This is an example of cleaning data accessed in netcdf format and preparing it for analysis. \n", + "\n", + "The dataset we will use contains InSAR-derived ice velocity for 10 years over the Amundsen Sea Embayment in Antarctica. The data is downloaded from: https://nsidc.org/data/NSIDC-0545/versions/1 but this example uses only a subset of the full dataset.\n", + "\n", + "Downloaded data is `.hdr` and `.dat` files for each year, and a `.nc` for all of the years together. \n", + "\n", + "The `.nc` object is a dataset with dimensions x,y and data vars for each year. So for each year there are `vx`,`vy`,`err` vars. We'd like to re-organize this so that there are 3 variables (`vx`, `vy` and `err`) that exist along a time dimension.\n", + "\n", + "```{note}\n", + "These steps were turned into a accessor/extension example, which can be viewed [here](/advanced/accessors/01_accessor_examples).\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "import xarray as xr" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.open_dataset(\"ASE_ice_velocity.nc\")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "Take a look at the dataset:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "Check the projection:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "ds.attrs[\"Projection\"]" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "Currently the dimensions on the object are `ny` and `nx` but the object has no coordinates. If we look in the `data_vars` we can see there are two variables named `xaxis` and `yaxis`. It seems like these are the coordinate values that should exist along the `nx` and `ny` dimensions, respectively. Let's confirm that they match the dimensions `nx` and `ny` in length and then assign them as coordinates:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "print(ds.dims[\"ny\"])\n", + "print(ds.dims[\"nx\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "print(len(ds.yaxis.data))\n", + "print(len(ds.xaxis.data))" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "We'll assign the `xaxis` and `yaxis` vars to be coordinates, and drop them from the `data_vars`. We'll first use `swap_dims()` to swap `ny` for `yaxis` and `nx` for `xaxis`. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "ds = ds.swap_dims({\"ny\": \"yaxis\", \"nx\": \"xaxis\"})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "Rename `yaxis` and `xaxis` and drop the `nx` and `ny` coordinates: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "ds = ds.rename({\"xaxis\": \"x\", \"yaxis\": \"y\"})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": {}, + "source": [ + "Now we have x and y coordinates and 30 data variables. However, the `data_vars` are really only 3 unique variables that exist along a time dimension (with a length of 10). \n", + "We want to add a time dimension to the dataset and concatenate the data variables in each of the three groups together." + ] + }, + { + "cell_type": "markdown", + "id": "17", + "metadata": {}, + "source": [ + "Start by making a few objects that we'll use while we're re-organizing. These are: a list of all the variables in the dataset (`var_ls`), a list of the years covered by the dataset that are currently stored in variable names (`yr_ls`) and then finally lists for each variable (`vx_ls`,`vy_ls` and `err_ls`). These are all of the variables in the original dataset that correspond with that main variable group (`vx`, `vy` or `err`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "var_ls = list(ds)\n", + "\n", + "vx_ls = [var for var in var_ls if \"vx\" in var]\n", + "vy_ls = [var for var in var_ls if \"vy\" in var]\n", + "err_ls = [var for var in var_ls if \"err\" in var]\n", + "\n", + "yr_ls = [int(var[-4:]) for var in vx_ls]" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "Now we are going to group the `dataset.data_vars` into `vx`,`vy`, and `err` and prepare to concatenate them along the time dimension. We will perform the same operations for all three variables but we will demonstrate the process for the first variable in several steps, before showing the operation wrapped into one command for the other two variables. There is a great explanation of this kind of step [here](https://towardsdatascience.com/pythonic-way-to-perform-statistics-across-multiple-variables-with-xarray-d0221c78e34a). At the end of this step, for `vx`, `vy` and `err` we will have a list of `xr.DataArrays` that all have a time dimension on the 0-axis. \n", + "\n", + "In the cell below, we make a list of the `xr.DataArrays` in the original `xr.Dataset` that correspond to that variable. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "da_vx_ls = [ds[var] for var in vx_ls]" + ] + }, + { + "cell_type": "markdown", + "id": "21", + "metadata": {}, + "source": [ + "You can see that `da_vx_ls` is a `list` object with a length of 10, and each element of the list is a `xr.DataArray` corresponding to `vx` vars in the original `xr.Dataset`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Object type: \", type(da_vx_ls))\n", + "print(\"Object length: \", len(da_vx_ls))\n", + "da_vx_ls[0]" + ] + }, + { + "cell_type": "markdown", + "id": "23", + "metadata": {}, + "source": [ + "next, we will add a time dimension to every element of `da_vx_ls`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": {}, + "outputs": [], + "source": [ + "da_vx_ls = [da_vx_ls[var].expand_dims(\"time\") for var in range(len(da_vx_ls))]" + ] + }, + { + "cell_type": "markdown", + "id": "25", + "metadata": {}, + "source": [ + "Now you can see that each list element is an `xr.DataArray` as before, but that there is now a time dimension." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": {}, + "outputs": [], + "source": [ + "da_vx_ls[0]" + ] + }, + { + "cell_type": "markdown", + "id": "27", + "metadata": {}, + "source": [ + "Assign time as a coordinate to each `xr.DataArray` in the list: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28", + "metadata": {}, + "outputs": [], + "source": [ + "da_vx_ls = [da_vx_ls[var].assign_coords(time=[yr_ls[var]]) for var in range(len(da_vx_ls))]\n", + "da_vx_ls[0]" + ] + }, + { + "cell_type": "markdown", + "id": "29", + "metadata": {}, + "source": [ + "Time is now a coordinate as well as a dimension and the coordinate value corresponds to the element-order of the list, ie. the first (0-place) element of `da_vx_ls_test` is the `xr.DataArray` containing the `vx1996` variable, and the `time` coord is 0. In the second (1-place) element, the `xr.DataArray` is called `vx2000` and the `time` coord is 1. \n", + "\n", + "Finally, we will rename the `xr.DataArrays` to reflect just the variable name, rather than the year, because that is now referenced in the time coordinate. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "30", + "metadata": {}, + "outputs": [], + "source": [ + "da_vx_ls = [da_vx_ls[var].rename(\"vx\") for var in range(len(da_vx_ls))]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31", + "metadata": {}, + "outputs": [], + "source": [ + "da_vx_ls[2]" + ] + }, + { + "cell_type": "markdown", + "id": "32", + "metadata": {}, + "source": [ + "Now we have a list of `xr.DataArrays` for the `vx` data variable where each `xr.DataArray` has a time dimension and coordinates along the time dimension. This list is ready to be concatenated along the time dimension. \n", + "\n", + "First, we will perform the same steps for the other two data variables (`vy` and `err`) before concatenating all three along the time dimension and merging into one `xr.Dataset`. For `vy` and `err`, we will combine the steps followed for `vx` into one operation. Note one other difference between the workflow for `vx` and the workflow for `vy` and `err`: rather than assigning coordinate values using the `assign_coords()` function, we do this within the `expand_dims()` function, where a `time` dimension is added as well as coordinate values for the dimension (`[int(var[-4:])]`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33", + "metadata": {}, + "outputs": [], + "source": [ + "da_vy_ls = [ds[var].expand_dims(time=[int(var[-4:])]).rename(\"vy\") for var in vy_ls]\n", + "\n", + "da_err_ls = [ds[var].expand_dims(time=[int(var[-4:])]).rename(\"err\") for var in err_ls]" + ] + }, + { + "cell_type": "markdown", + "id": "34", + "metadata": {}, + "source": [ + "Once we have these lists, we will concatenate them together to a single `xr.DataArray` with `x`,`y` and `time` dimensions. In the above step, when we create the time dimension we assign a stand-in for the time coordinate. In the cell below, we'll use the `yr_ls` object that we created that is a list whose elements are time-aware objects corresponding to the time coordinates (originally in the variable names). The final line in the cell below merges the three `xr.DataArray`s on the common `time` dimension that they now share, so we have a `xr.Dataset` with `x`,`y` and `time` dimensions and `vx`, `vy` and `err` variables." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "35", + "metadata": {}, + "outputs": [], + "source": [ + "vx_concat = xr.concat(da_vx_ls, dim=\"time\")\n", + "vy_concat = xr.concat(da_vy_ls, dim=\"time\")\n", + "err_concat = xr.concat(da_err_ls, dim=\"time\")\n", + "\n", + "ds_merge = xr.merge([vx_concat, vy_concat, err_concat])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36", + "metadata": {}, + "outputs": [], + "source": [ + "ds_merge" + ] + }, + { + "cell_type": "markdown", + "id": "37", + "metadata": {}, + "source": [ + "We'll add a variable that is magnitude of velocity as well" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38", + "metadata": {}, + "outputs": [], + "source": [ + "ds_merge[\"vv\"] = np.sqrt((ds_merge.vx**2) + (ds_merge.vy**2))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39", + "metadata": {}, + "outputs": [], + "source": [ + "ds_merge.vv.isel(time=0).plot(vmax=1000)" + ] + }, + { + "cell_type": "markdown", + "id": "40", + "metadata": {}, + "source": [ + "and add the `attrs` of the original object to our new object, `ds_full`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "41", + "metadata": {}, + "outputs": [], + "source": [ + "ds_merge.attrs = ds.attrs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42", + "metadata": {}, + "outputs": [], + "source": [ + "ds_merge" + ] + }, + { + "cell_type": "markdown", + "id": "43", + "metadata": {}, + "source": [ + "Checking against original version to make sure it's the same:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44", + "metadata": {}, + "outputs": [], + "source": [ + "np.sqrt((ds.vx1996**2) + (ds.vy1996**2)).plot(vmax=1000)" + ] + }, + { + "cell_type": "markdown", + "id": "45", + "metadata": {}, + "source": [ + "We can also use `xr.DataArray.equals` function to test if two `xr.DataArrays` are identical to one another. More information [here](https://docs.xarray.dev/en/stable/generated/xarray.DataArray.equals.html). " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46", + "metadata": {}, + "outputs": [], + "source": [ + "ds_merge[\"vx\"].sel(time=1996, drop=True).equals(ds.vx1996)" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/intermediate/data_cleaning/05.4_contributing.md b/intermediate/data_cleaning/05.4_contributing.md new file mode 100644 index 00000000..aa47b7d9 --- /dev/null +++ b/intermediate/data_cleaning/05.4_contributing.md @@ -0,0 +1,5 @@ +# Contributing + +This project is an evolving community effort. **We want to hear from you!**. Many workflows involve some version of the examples discussed here. The solutions you've developed in your work could help future users and help the community move toward more established norms around tidy data. Please consider submitting any examples you may have. You can create an issue [here](https://github.com/e-marshall/tidy-xarray/issues/new?assignees=&labels=&projects=&template=data-tidying-example-template.md&title=).If you have any questions or topics you'd like to discuss, please don't hesitate to create an issue on github. + +_note: issue template has some errors currently, need to fix_ diff --git a/intermediate/data_cleaning/05.5_scipy_talk.md b/intermediate/data_cleaning/05.5_scipy_talk.md new file mode 100644 index 00000000..d1cfb076 --- /dev/null +++ b/intermediate/data_cleaning/05.5_scipy_talk.md @@ -0,0 +1,13 @@ +# Presentations + +## SciPy 2023 + +This project was initially presented at the 2023 SciPy conference in Austin, TX. You can check out the slides and a recording of the presentation below. + +### Slides + +The presentation slides are available through the [2023 SciPy Conference Proceedings](https://conference.scipy.org/proceedings/scipy2023/slides.html) and can be downloaded [here](https://zenodo.org/records/8221167). + +### Recording + +A recording of the presentation is available [here](https://www.youtube.com/watch?v=KZlG1im088s). diff --git a/intermediate/data_cleaning/05_data_cleaning.md b/intermediate/data_cleaning/05_data_cleaning.md new file mode 100644 index 00000000..154064a1 --- /dev/null +++ b/intermediate/data_cleaning/05_data_cleaning.md @@ -0,0 +1,5 @@ +# Data Tidying + +```{tableofcontents} + +``` diff --git a/intermediate/datastructures-intermediate.ipynb b/intermediate/datastructures-intermediate.ipynb new file mode 100644 index 00000000..bf58ee3b --- /dev/null +++ b/intermediate/datastructures-intermediate.ipynb @@ -0,0 +1,680 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Intermediate Xarray DataStructures\n", + "\n", + "\n", + "\n", + "In this lesson, we cover the basics of Xarray data structures. By the\n", + "end of the lesson, we will be able to:\n", + "\n", + "- Understand the basic data structures in Xarray\n", + "- Inspect `DataArray` and `Dataset` objects.\n", + "- Select Data using Dataset Coordinates\n", + "- Understand that these Datastructures generalize across fields\n", + "\n", + "\n", + "We'll start by reviewing the various components of the Xarray data model, represented here visually:\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "## Variable\n", + "\n", + "At the the core of everything Xarray works with Variables:\n", + "\n", + "Variables hold arbitrary metadata, dimension names, and an Array of data\n", + "\n", + "![image.png](../_static/variable.png)\n", + "\n", + "## DataArray\n", + "\n", + "A DataArray is lowest level object you will regularly interact with. It is a collection of 1 variable containing the data, and optionally Variables associated with the dimensions (coords)\n", + "\n", + "![image.png](../_static/dataarray.png)\n", + "\n", + "\n", + "## Dataset\n", + "\n", + "A Dataset is also a collection of Variables. However it can contain multiple data variables. All dimensions MUST be compatible. When we access one of the data variables a DataArray will automatically created for us.\n", + "\n", + "![image.png](../_static/dataset.png)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import xarray as xr" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Xarray has a few small real-world tutorial datasets hosted in the [xarray-data](https://github.com/pydata/xarray-data) GitHub repository.\n", + "\n", + "[xarray.tutorial.load_dataset](https://docs.xarray.dev/en/stable/generated/xarray.tutorial.open_dataset.html#xarray.tutorial.open_dataset) is a convenience function to download and open DataSets by name (listed at that link).\n", + "\n", + "Here we'll use `air temperature` from the [National Center for Environmental Prediction](https://www.weather.gov/ncep/). Xarray objects have convenient HTML representations to give an overview of what we're working with:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.load_dataset(\"air_temperature\")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that behind the scenes the `tutorial.open_dataset` downloads a file. It then uses [`xarray.open_dataset`](https://docs.xarray.dev/en/stable/generated/xarray.open_dataset.html#xarray-open-dataset) function to open that file (which for this datasets is a [netCDF](https://www.unidata.ucar.edu/software/netcdf/) file). \n", + "\n", + "\n", + "As a preview of the power of Xarray, using this data structure allows us to make very readable and powerful statements such as:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.mean(dim=\"time\").plot(x=\"lon\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What's in a Dataset? \n", + "\n", + "*Many DataArrays!* \n", + "\n", + "Datasets are dictionary-like containers of \"DataArray\"s. They are a mapping of\n", + "variable name to DataArray:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# pull out \"air\" dataarray with dictionary syntax\n", + "ds[\"air\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can save some typing by using the \"attribute\" or \"dot\" notation. This won't\n", + "work for variable names that clash with a built-in method name (like `mean` for\n", + "example).\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# pull out dataarray using dot notation\n", + "ds.air" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What's in a DataArray? \n", + "\n", + "*data + (a lot of) metadata*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Name (optional)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da = ds.air\n", + "\n", + "da.name" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Named dimensions \n", + "\n", + "`.dims` correspond to the axes of your data. \n", + "\n", + "In this case we have 2 spatial dimensions (`latitude` and `longitude` are stored with shorthand names `lat` and `lon`) and one temporal dimension (`time`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da.dims" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Coordinate variables \n", + "\n", + "`.coords` is a simple [data container](https://docs.xarray.dev/en/stable/user-guide/data-structures.html#coordinates)\n", + "for coordinate variables.\n", + "\n", + "Here we see the actual timestamps and spatial positions of our air temperature data:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da.coords" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Coordinates objects support similar indexing notation\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# extracting coordinate variables\n", + "da.lon" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# extracting coordinate variables from .coords\n", + "da.coords[\"lon\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is useful to think of the values in these coordinate variables as axis\n", + "\"labels\" such as \"tick labels\" in a figure. These are coordinate locations on a\n", + "grid at which you have data.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Arbitrary attributes \n", + "\n", + "`.attrs` is a dictionary that can contain arbitrary Python objects (strings, lists, integers, dictionaries, etc.) Your only\n", + "limitation is that some attributes may not be writeable to certain file formats." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da.attrs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# assign your own attributes!\n", + "da.attrs[\"who_is_awesome\"] = \"xarray\"\n", + "da.attrs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Underlying data \n", + "\n", + "`.data` contains the [numpy array](https://numpy.org) storing air temperature values.\n", + "\n", + "\n", + "\n", + "Xarray structures wrap underlying simpler array-like data structures. This part of Xarray is quite extensible allowing for distributed array, GPU arrays, sparse arrays, arrays with units etc. We'll briefly look at this later in this tutorial." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da.data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# what is the type of the underlying data\n", + "type(da.data)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Review\n", + "\n", + "Two of Xarray's main data structures are:\n", + "\n", + "1. [`DataArrays`](https://docs.xarray.dev/en/stable/user-guide/data-structures.html#dataarray) that wrap underlying data containers (e.g. numpy arrays) and contain associated metadata\n", + "1. [`Datasets`](https://docs.xarray.dev/en/stable/user-guide/data-structures.html#dataset) that are dictionary-like containers of DataArrays\n", + "\n", + "DataArrays contain underlying arrays and associated metadata:\n", + "1. Name\n", + "2. Dimension names\n", + "3. Coordinate variables\n", + "4. and arbitrary attributes.\n", + "\n", + "![image.png](../_static/variable.png)\n", + "\n", + "![image.png](../_static/dataarray.png)\n", + "\n", + "![image.png](../_static/dataset.png)\n", + "\n", + "\n", + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercise\n", + "\n", + "In this exercise the air dataset has been deconstructed into a dictionary of NumPy arrays. Please\n", + "\n", + "- Build a Dataset from scratch from this dictionary of NumPy arrays.\n", + "\n", + "\n", + "Hint: You will want to start by building DataArrays, then combining them into a Dataset.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def air_as_dictionary():\n", + " ds = xr.tutorial.open_dataset(\"air_temperature\")\n", + " return {\n", + " \"lat\": ds[\"lat\"].values,\n", + " \"lon\": ds[\"lon\"].values,\n", + " \"attrs\": ds.attrs,\n", + " \"time\": ds[\"time\"].values,\n", + " \"air-temp\": ds[\"air\"].values,\n", + " }\n", + "\n", + "\n", + "data = air_as_dictionary()\n", + "\n", + "\n", + "# Your code here" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Why Xarray? \n", + "\n", + "Metadata provides context and provides code that is more legible. This reduces the likelihood of errors from typos and makes analysis more intuitive and fun!\n", + "\n", + "### Analysis without xarray: `X(`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot the first timestep\n", + "lat = ds.air.lat.data # numpy array\n", + "lon = ds.air.lon.data # numpy array\n", + "temp = ds.air.data # numpy array" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure()\n", + "plt.pcolormesh(lon, lat, temp[0, :, :]);" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "temp.mean(axis=1) ## what did I just do? I can't tell by looking at this line." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Analysis with xarray `=)`\n", + "\n", + "How readable is this code?\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.isel(time=0).plot(x=\"lon\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use dimension names instead of axis numbers\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.mean(dim=\"time\").plot(x=\"lon\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "## Extracting data or \"indexing\" \n", + "\n", + "Xarray supports\n", + "\n", + "- label-based indexing using `.sel`\n", + "- position-based indexing using `.isel`\n", + "\n", + "See the [user guide](https://docs.xarray.dev/en/stable/indexing.html) for more." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Label-based indexing\n", + "\n", + "Xarray inherits its label-based indexing rules from pandas; this means great\n", + "support for dates and times!\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# here's what ds looks like\n", + "ds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# pull out data for all of 2013-May\n", + "ds.sel(time=\"2013-05\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate slicing\n", + "ds.sel(time=slice(\"2013-05\", \"2013-07\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.sel(time=\"2013\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate \"nearest\" indexing\n", + "ds.sel(lon=240.2, method=\"nearest\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# \"nearest indexing at multiple points\"\n", + "ds.sel(lon=[240.125, 234], lat=[40.3, 50.3], method=\"nearest\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Position-based indexing\n", + "\n", + "This is similar to your usual numpy `array[0, 2, 3]` but with the power of named\n", + "dimensions!\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.data[0, 2, 3]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# pull out time index 0, lat index 2, and lon index 3\n", + "ds.air.isel(time=0, lat=2, lon=3) # much better than ds.air[0, 2, 3]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate slicing\n", + "ds.air.isel(lat=slice(10))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Other field DataStructures\n", + "\n", + "\n", + "Link to next notebook: [Data structures In Biology](./BiologyDataset.ipynb)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercise\n", + "\n", + "Dataset of non-alignable data.\n", + "\n", + "For this exercise we will be using the `\"precipitation\"` example data. This data has two parts observed rainfall (`observed`), and predicted rainfall, on a different lat-lon grid. The next cell calls a function that will give you two different Datasets. Try to combine them using the tools we've discussed thus far and observe what goes wrong.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "tree = xr.tutorial.open_datatree(\"precipitation.nc4\")\n", + "reanalysis = xr.Dataset(tree[\"observed\"])\n", + "observed = xr.Dataset(tree[\"reanalysis\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For more see the [user guide](https://docs.xarray.dev/en/stable/plotting.html), the [gallery](https://docs.xarray.dev/en/stable/examples/visualization_gallery.html), and [the tutorial material](https://tutorial.xarray.dev/fundamentals/04.0_plotting.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": true, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/intermediate/hierarchical_zarr_store.ipynb b/intermediate/hierarchical_zarr_store.ipynb new file mode 100644 index 00000000..6288cc03 --- /dev/null +++ b/intermediate/hierarchical_zarr_store.ipynb @@ -0,0 +1,341 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Zarr Stores with Xarray\n", + "\n", + "## Learning Objectives:\n", + "- Learn about the Zarr data format and xarray's \"zarr\" backend engine\n", + "- Learn how to read a Zarr store with a hierarchical structure with `xr.DataTree`\n", + "- Learn how to select dask arrays from a Zarr store\n", + "- Explore how to use Zarr stores with xarray for computations and visualizations\n", + "\n", + "## What is Zarr?\n", + "\n", + "The Zarr data format is an open, community-maintained format designed for efficient, scalable storage of large N-dimensional arrays. It stores data as compressed and chunked arrays in a format well-suited to parallel processing and cloud-native workflows. Xarray’s Zarr backend allows xarray to leverage these capabilities, including the ability to store and analyze datasets far too large fit onto disk (particularly in combination with [dask](https://docs.xarray.dev/en/latest/user-guide/dask.html#dask)).\n", + "\n", + "### Zarr Data Organization:\n", + "- **Arrays**: N-dimensional arrays that can be chunked and compressed.\n", + "- **Groups**: A container for organizing multiple arrays and other groups with a hierarchical structure.\n", + "- **Metadata**: JSON-like metadata describing the arrays and groups, including information about data types, dimensions, chunking, compression, and user-defined key-value fields. \n", + "- **Dimensions and Shape**: Arrays can have any number of dimensions, and their shape is defined by the number of elements in each dimension.\n", + "- **Coordinates & Indexing**: Zarr supports coordinate arrays for each dimension, allowing for efficient indexing and slicing.\n", + "\n", + "The diagram below from [the Zarr v3 specification](https://wiki.earthdata.nasa.gov/display/ESO/Zarr+Format) showing the structure of a Zarr store:\n", + "\n", + "![ZarrSpec](https://zarr-specs.readthedocs.io/en/latest/_images/terminology-hierarchy.excalidraw.png)\n", + "\n", + "\n", + "NetCDF and Zarr share similar terminology and functionality, but the key difference is that NetCDF is a single file, while Zarr is a directory-based “store” composed of many chunked files, making it better suited for distributed and cloud-based workflows." + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## Reading a zarr store\n", + "With xarray's \"zarr\" backend, we can read data remotely from cloud storage buckets. Since Zarr is a cloud-optimized format, our dataset is lazily-loaded as dask arrays.\n", + "The Zarr store in this tutorial is in a public storage bucket and is a precipitation dataset with a group hierarchical structure. The groups: \"observed\" and \"reanalysis\", each contain a \"precipitation\" data variable derived from *[GPM_3IMERGHH_07](https://disc.gsfc.nasa.gov/datasets/GPM_3IMERGHH_07/summary)* and *[M2T1NXFLX_5.12.4](https://disc.gsfc.nasa.gov/datasets/M2T1NXFLX_5.12.4/summary)* products, respectively. The precipitation data variables in each group have different spatial resolutions that cannot be represented in a single group, so we need to read them as `DataTree` objects.\n", + "\n", + "Let's read in our zarr store with `xr.open_datatree`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr\n", + "\n", + "precipitation_store = \"https://pub-45a1d62ac8d94c4c89f4dc63681a98ed.r2.dev/precipitation.zarr\"\n", + "\n", + "precip_dt = xr.open_datatree(precipitation_store, engine=\"zarr\", chunks={}, consolidated=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "precip_dt.observed.precipitation" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + ":::{note} We selected `\"zarr\"` backend engine, which tells xarray to load and decode a dataset from a Zarr store. The `chunks={}` parameter is used to load the data into a dask array. And `consolidated=True` enables zarr’s consolidated metadata capability. This lets us read all of the metadata from a single file which can improve performance.\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "## Variable selection\n", + "With our `DataTree` object, we can select variables from our Zarr store with either dictionary and or attribute like syntax." + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "### Dictionary-like interface" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "precip_dt[\"observed/precipitation\"]" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "### Attribute-like access" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "precip_dt.observed.precipitation" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "### Dictionary and Attribute like access" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "precip_dt.observed[\"precipitation\"]" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + ":::{note} All of these variable selection options return the same \"precipitation\" `xr.DataArray` object, as a chunked `dask.Array`, from the \"observed\" group of our Zarr store.\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "## Time slicing\n", + "\n", + "We can index and subset by time on our `xr.DataTree` object. Each time slice in our Zarr store represents one hour of data with a total of 10 hours of data.\n", + "\n", + "Let's explore the different ways we can get the first 5 hours of data. " + ] + }, + { + "cell_type": "markdown", + "id": "14", + "metadata": {}, + "source": [ + "### Label-based indexing" + ] + }, + { + "cell_type": "markdown", + "id": "15", + "metadata": {}, + "source": [ + "Let's try getting the first 5 hours of data with `.sel(time=)`. \n", + "\n", + "Since the time slices are ordered we can get a subset of the array of our time coordinate and pass it to the `.sel` method." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "time_index = precip_dt.time[0:5]\n", + "precip_dt.sel(time=time_index)" + ] + }, + { + "cell_type": "markdown", + "id": "17", + "metadata": {}, + "source": [ + "### Datetime indexing\n", + "We can also subset by time with a `datetime` string." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "precip_dt.sel(time=slice(\"2021-08-29T07:30:00\", \"2021-08-29T16:30:00\"))" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "### Positional Indexing\n", + "Or by the index of our time dimension `.isel(time=slice())`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "precip_dt.isel(time=slice(0, 5))" + ] + }, + { + "cell_type": "markdown", + "id": "21", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "source": [ + "## Chunking\n", + "Chunking is the process of dividing arrays into smaller pieces, which allows for parallel processing and efficient storage.\n", + "\n", + "To examine the chunks in our Zarr store, with `xarray` you can use the `chunks` attribute on the `xr.DataArray` object." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": {}, + "outputs": [], + "source": [ + "precip_dt.observed[\"precipitation\"].data.chunks" + ] + }, + { + "cell_type": "markdown", + "id": "23", + "metadata": {}, + "source": [ + "### Selecting by chunks\n", + "\n", + "Since we loaded our data as a `dask.Array`, we can access data from each chunked array in our Zarr store. \n", + "\n", + "Let's get the first chunk of the \"observed/precipitation\" variable in our zarr store." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": {}, + "outputs": [], + "source": [ + "precip_dt.observed[\"precipitation\"].data.blocks[0, 0, 0].compute()" + ] + }, + { + "cell_type": "markdown", + "id": "25", + "metadata": {}, + "source": [ + ":::{note}\n", + "We added `.data` to our `xr.DataArray` to access the `dask.Array`. The `.blocks[]` method allows you to index by chunk and `.compute()` returns the `np.ndarray`. \n", + ":::" + ] + }, + { + "cell_type": "markdown", + "id": "26", + "metadata": {}, + "source": [ + "## Exercise" + ] + }, + { + "cell_type": "markdown", + "id": "27", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Can you calculate and plot the mean precipitation, starting at 09:55 for the reanalysis group in this zarr store?\n", + "\n", + ":::{admonition} Hint\n", + ":class: dropdown\n", + "This is how you could calculate mean \"precipitation\"\n", + "\n", + "```python\n", + "precip_dt.reanalysis['precipitation'].mean(dim='time')\n", + "```\n", + ":::\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "precip_dt.reanalysis['precipitation'].sel(time=slice('2021-08-29T09:55:00', '2021-08-29T16:30:00')).mean(dim='time').plot()\n", + "```\n", + ":::\n", + "::::" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/intermediate/hvplot.ipynb b/intermediate/hvplot.ipynb new file mode 100644 index 00000000..fa458c7c --- /dev/null +++ b/intermediate/hvplot.ipynb @@ -0,0 +1,175 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Interactive plots using hvplot\n", + "\n", + "Xarray's builtin plotting functionality wraps matplotlib.\n", + "\n", + "The `holoviews` [ecosystem](https://hvplot.holoviz.org/) provides the `hvplot` package to allow easy\n", + "visualization of xarray (and other) objects. These\n", + "plots build on [Bokeh](https://bokeh.org/).\n", + "\n", + "`hvplot` makes uses of xarray's [accessor interface](https://docs.xarray.dev/en/stable/internals/extending-xarray.html). This means that all xarray\n", + "objects gain a `.hvplot` attribute that lets you access `.hvplot` functionality\n", + "as easily as you would use `.plot`. All you need to do is `import hvplot.xarray`\n", + "\n", + "For more, see hvplot's [documentation](https://hvplot.holoviz.org/user_guide/Gridded_Data.html)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import cartopy.crs as ccrs\n", + "import hvplot.xarray\n", + "import xarray as xr" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.open_dataset(\"air_temperature.nc\").rename({\"air\": \"Tair\"})" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "## Basics\n", + "\n", + "`hvplot` makes the same default choices as `DataArray.plot`\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "ds.Tair.hvplot()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "# 2D array yields a quadmesh plot\n", + "ds.Tair.isel(time=1).hvplot(cmap=\"fire\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "# 1D array yields a line plot\n", + "ds.Tair.isel(time=1, lon=1).hvplot()" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "## Interactivity\n", + "\n", + "But `hvplot` shines when interactivity is used. Here we can give it _all_ the\n", + "data and ask it to create a nice slider to control the time slice using the\n", + "`groupby` kwarg.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "ds.Tair.hvplot(\n", + " groupby=\"time\",\n", + " clim=(250, 295), # adds a widget for time # sets colorbar limits\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "## Animations\n", + "\n", + "are easy.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "# set constant colorbar limits\n", + "ds.Tair.hvplot(\n", + " groupby=\"time\", # adds a widget for time\n", + " clim=(250, 295), # sets colormap limits\n", + " widget_type=\"scrubber\",\n", + " widget_location=\"bottom\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "## Geography\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "ds.Tair.isel(time=1).hvplot(\n", + " projection=ccrs.Orthographic(-90, 30),\n", + " coastline=True,\n", + ")" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/intermediate/indexing/advanced-indexing.ipynb b/intermediate/indexing/advanced-indexing.ipynb new file mode 100644 index 00000000..b6ea47cb --- /dev/null +++ b/intermediate/indexing/advanced-indexing.ipynb @@ -0,0 +1,432 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Advanced Indexing\n", + "\n", + "## Learning Objectives\n", + "\n", + "* Orthogonal vs. Pointwise (Vectorized) Indexing.\n", + "* Pointwise indexing in Xarray to extract data at a collection of points.\n", + "* Understand the difference between NumPy and Xarray indexing behavior." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "In the previous notebooks, we learned basic forms of indexing with Xarray, including positional and label-based indexing, datetime indexing, and nearest neighbor lookups. We also learned that indexing an Xarray DataArray directly works (mostly) like it does for NumPy arrays; however, Xarray indexing behavior deviates from NumPy when using multiple arrays for indexing, like `arr[[0, 1], [0, 1]]`.\n", + "\n", + "To better understand this difference, let's take a look at an example of 2D 5x5 array:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Create a 5x5 array with values from 1 to 25\n", + "np_array = np.arange(1, 26).reshape(5, 5)\n", + "np_array" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now create a Xarray DataArray from this NumPy array: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr\n", + "\n", + "da = xr.DataArray(np_array, dims=[\"x\", \"y\"])\n", + "da" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's see how the indexing behavior is different between NumPy array and Xarray DataArray when indexing with multiple arrays:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "np_array[[0, 2, 4], [0, 2, 4]]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da[[0, 2, 4], [0, 2, 4]]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The image below summarizes the difference between vectorized and orthogonal indexing for a 2D 5x5 NumPy array and Xarray DataArray:\n", + "\n", + "\n", + "\n", + "![Orthogonal vs. Vectorized Indexing](../../images/orthogonal_vs_vectorized.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Pointwise** or **Vectorized indexing**, shown on the left, selects specific elements at given coordinates, resulting in an array of those individual elements. In the example shown, the indices `[0, 2, 4]`, `[0, 2, 4]` select the elements at positions `(0, 0)`, `(2, 2)`, and `(4, 4)`, resulting in the values `[1, 13, 25]`. This is the default behavior of NumPy arrays.\n", + " \n", + "In contrast, **orthogonal indexing** uses the same indices to select entire rows and columns, forming the Cartesian product of the specified indices. This method results in sub-arrays that include all combinations of the selected rows and columns. The example demonstrates this by selecting rows 0, 2, and 4 and columns 0, 2, and 4, resulting in a subarray containing `[[1, 3, 5], [11, 13, 15], [21, 23, 25]]`. This is Xarray DataArray's default behavior.\n", + " \n", + "The output of vectorized indexing is a `1D array`, while the output of orthogonal indexing is a `3x3` array. \n", + "\n", + "\n", + ":::{tip} To Summarize: \n", + "\n", + "- *Pointwise* or *vectorized* indexing is a more general form of indexing that allows for arbitrary combinations of indexing arrays. This method of indexing is analogous to the broadcasting rules in NumPy, where the dimensions of the indexers are aligned and the result is determined by the shape of the indexers. This is the default behavior in NumPy.\n", + "\n", + "- *Orthogonal* or *outer* indexing allows for indexing along each dimension independently, treating the indexers as one-dimensional arrays. The principle of outer or orthogonal indexing is that the result mirrors the effect of independently indexing along each dimension with integer or boolean arrays, treating both the indexed and indexing arrays as one-dimensional. This method of indexing is analogous to vector indexing in programming languages like MATLAB, Fortran, and R, where each indexer component independently selects along its corresponding dimension. This is the default behavior in Xarray.\n", + "\n", + "\n", + ":::\n", + "\n", + ":::{admonition} Orthogonal indexing with NumPy\n", + ":class: note dropdown\n", + "\n", + "While pointwise indexing is the default behavior in NumPy, you can achieve orthogonal indexing by using the [`np.ix_` function](https://numpy.org/doc/stable/reference/generated/numpy.ix_.html). This function constructs an open mesh from multiple arrays, allowing you to index along each dimension independently similar to Xarray indexing behavior. For example: \n", + "\n", + "```python\n", + "ixgrid = np.ix_([0, 2, 4], [0, 2, 4])\n", + "np_array[ixgrid]\n", + "```\n", + "\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Orthogonal Indexing in Xarray\n", + "\n", + "As explained earlier, when you use only integers, slices, or unlabeled arrays (arrays without dimension names, such as `np.ndarray` or `list`, but not `DataArray`) to index an `Xarray DataArray`, Xarray interprets these indexers orthogonally. This means it indexes along independent axes, rather than using NumPy's broadcasting rules to vectorize the indexers. \n", + "\n", + "In the example above we saw this behavior, but let's see this behavior in action with a real dataset. Here we’ll use `air temperature` data from the National Center for Environmental Prediction:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "xr.set_options(display_expand_attrs=False)\n", + "np.set_printoptions(threshold=10, edgeitems=2)\n", + "%config InlineBackend.figure_format='retina'\n", + "\n", + "ds = xr.tutorial.load_dataset(\"air_temperature\")\n", + "da_air = ds.air\n", + "da_air" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "selected_da = da_air.isel(time=0, lat=[2, 4, 10, 13], lon=[1, 6, 7]) # -- orthogonal indexing\n", + "selected_da" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "👆 Please note that the output shape in the example above is `4x3` because the latitude indexer selects 4 rows, and the longitude indexer selects 3 columns." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For more flexibility, you can supply `DataArray()` objects as indexers. Dimensions on resultant arrays are given by the ordered union of the indexers’ dimensions.\n", + "\n", + "For example, in the example below we do orthogonal indexing using `DataArray()` objects. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "target_lat = xr.DataArray([31, 41, 42, 42], dims=\"degrees_north\")\n", + "target_lon = xr.DataArray([200, 201, 202, 205], dims=\"degrees_east\")\n", + "\n", + "da_air.sel(lat=target_lat, lon=target_lon, method=\"nearest\") # -- orthogonal indexing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the above example, you can see how the output shape is `time` x `lats` x `lons`. Please note that there are no shared dimensions between the indexers, so the output shape is the union of the dimensions of the indexers.\n", + "\n", + "```{attention}\n", + "Please note that slices or sequences/arrays without named-dimensions are treated as if they have the same dimension which is indexed along.\n", + "```\n", + "\n", + "For example:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da_air.sel(lat=[20, 30, 40], lon=target_lon, method=\"nearest\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "\n", + "But what if we'd like to find the nearest climate model grid cell to a collection of specified points (for example observation sites, or weather stations)?\n", + "\n", + "## Vectorized or Pointwise Indexing in Xarray\n", + "\n", + "Like NumPy and pandas, Xarray supports indexing many array elements at once in a *vectorized* manner. \n", + "\n", + "**Vectorized indexing** or **Pointwise Indexing** using `DataArrays()` can be used to extract information from the nearest grid cells of interest, for example, the nearest climate model grid cells to a collection of specified observation tower data latitudes and longitudes.\n", + "\n", + "```{hint}\n", + "To trigger vectorized indexing behavior, you will need to provide the selection dimensions with a new **shared** output dimension name. This means that the dimensions of both indexers must be the same, and the output will have the same dimension name as the indexers.\n", + "```\n", + "\n", + "Let's see how this works with an example:\n", + "\n", + "A researcher wants to find the nearest climate model grid cell to a collection of observation sites. They have the latitude and longitude of the observation sites as following:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "obs_lats = [31.81, 41.26, 22.59, 44.47, 28.57]\n", + "\n", + "obs_lons = [200.16, 201.57, 305.54, 210.56, 226.59]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If the researcher use the lists to index the DataArray, they will get the orthogonal indexing behavior, which is not what they want." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da_air.sel(lat=obs_lats, lon=obs_lons, method=\"nearest\") # -- orthogonal indexing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To trigger the pointwise indexing, they need to create DataArray objects with the same dimension name, and then use them to index the DataArray. \n", + "For example, the code below first create DataArray objects for the latitude and longitude of the observation sites using a shared dimension name `points`, and then use them to index the DataArray `air_temperature`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "## latitudes of weather stations with a dimension of \"points\"\n", + "lat_points = xr.DataArray(obs_lats, dims=\"points\")\n", + "lat_points" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "## longitudes of weather stations with a dimension of \"points\"\n", + "lon_points = xr.DataArray(obs_lons, dims=\"points\")\n", + "lon_points" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, retrieve data at the grid cells nearest to the target latitudes and longitudes (weather stations):" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "da_air.sel(lat=lat_points, lon=lon_points, method=\"nearest\") # -- pointwise indexing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "👆 Please notice how the shape of our `DataArray` is `time` x `points`, extracting time series for each weather stations. \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "da_air.sel(lat=lat_points, lon=lon_points, method=\"nearest\").dims" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, let's plot the data for all stations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da_air.sel(lat=lat_points, lon=lon_points, method=\"nearest\").plot(x=\"time\", hue=\"points\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "In the simple 2D 5x5 Xarray data array above, select the sub-array containing (0,4),(2,2),(4,0):\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "```python\n", + "\n", + "x_indices = np.array([0, 2, 4])\n", + "y_indices = np.array([4, 2, 0])\n", + "\n", + "da_x = xr.DataArray(x_indices, dims=\"points\")\n", + "da_y = xr.DataArray(y_indices, dims=\"points\")\n", + "\n", + "subset_da = da.sel(x=da_x, y=da_y)\n", + "subset_da\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Additional Resources\n", + "\n", + "- [Xarray Docs - Indexing and Selecting Data](https://docs.xarray.dev/en/stable/indexing.html)\n", + "\n", + "\n", + ":::{seealso}\n", + "- [Introductions to Fancy Indexing](https://jakevdp.github.io/PythonDataScienceHandbook/02.07-fancy-indexing.html)\n", + "- [NumPy Docs - Advanced Indexing](https://numpy.org/doc/stable/user/basics.indexing.html#advanced-indexing)\n", + "\n", + ":::\n" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": true, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/intermediate/indexing/boolean-masking-indexing.ipynb b/intermediate/indexing/boolean-masking-indexing.ipynb new file mode 100644 index 00000000..6432b86a --- /dev/null +++ b/intermediate/indexing/boolean-masking-indexing.ipynb @@ -0,0 +1,496 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Boolean Indexing & Masking\n", + "\n", + "## Learning Objectives\n", + "\n", + "* The concept of boolean masks\n", + "* Dropping/Masking data using `where`\n", + "* Using `isin` for creating a boolean mask" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Overview\n", + "\n", + "*Boolean masking*, known as *boolean indexing*, is a functionality in Python that enables the filtering of values based on a specific condition.\n", + "\n", + "A boolean mask refers to a binary array or a boolean-valued (`True`/`False`) array that is used as a *filter* to select specific elements from another array. The boolean mask acts as a criterion or condition, where each element in the mask corresponds to an element in the target array. An element in the target array is selected when the corresponding `mask` value is `True`. \n", + "\n", + "Xarray provides different capabilities to allow filtering and boolean indexing. In this notebook, we will learn more about it.\n", + "\n", + "First, let's import the packages needed for this notebook: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import cartopy.crs as ccrs\n", + "import matplotlib as mpl\n", + "import numpy as np\n", + "import xarray as xr\n", + "from matplotlib import pyplot as plt\n", + "\n", + "xr.set_options(display_expand_attrs=False)\n", + "np.set_printoptions(threshold=10, edgeitems=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this tutorial, we’ll use the Regional Arctic System Mode (RASM) example dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.load_dataset(\"rasm\").isel(time=0)\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this dataset, the logical coordinates are `x` and `y`, while the physical coordinates are `xc` and `yc`, which represent the latitudes and longitude of the data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(ds.xc.attrs)\n", + "print(ds.yc.attrs)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da = ds.Tair\n", + "da" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Masking with `where()`\n", + "\n", + "Indexing methods on Xarray objects generally return a subset of the original data. However, it is sometimes useful to select an object with the same shape as the original data, but with some elements masked. \n", + "\n", + "By applying `.where()`, the original data's shape is maintained, with values masked based on a Boolean condition. Values that satisfy the condition (`True`) are returned unchanged, while values that do not meet the condition (`False`) are replaced with a predefined value.\n", + "\n", + "In the example below, we replace all `nan` values with `-9999`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Let's replace the missing values (nan) with some placeholder\n", + "ds.Tair.where(ds.Tair.notnull(), -9999)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, in the example above `.where()` preserved the **shape** of the original data by masking the values with a boolean condition. \n", + "\n", + "Most uses of `.where()` check whether or not specific data values are less than or greater than a constant value. \n", + "\n", + "The data values specified in the boolean condition of `.where()` can be any of the following:\n", + "\n", + "* a `DataArray`\n", + "* a `Dataset`\n", + "* a function\n", + "\n", + "In the following example, we make use of `.where()` to mask all temperature below 0°C.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da_masked = da.where(da >= 0)\n", + "\n", + "# -- making both plots for comparison:\n", + "fig, axes = plt.subplots(ncols=2, figsize=(15, 5))\n", + "\n", + "# -- for reference (without masking):\n", + "da.plot(ax=axes[0], vmin=-30, vmax=30, cmap=mpl.cm.RdBu_r)\n", + "\n", + "# -- masked DataArray\n", + "da_masked.plot(ax=axes[1], vmin=-30, vmax=30, cmap=mpl.cm.RdBu_r);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{tip}\n", + "By default Xarray set the masked values to `nan`. But as we saw in the first example, we can set it to other values too. \n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Using the syntax you’ve learned so far, mask all the points with latitudes above 60° N.\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "da_masked = da.where(da.yc >= 60)\n", + "da_masked[:, :].plot();\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# write your answer here!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As mentioned above, by default `where` maintains the original size of the data. You can use the option `drop=True` to clip coordinate elements that are fully masked:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da_masked = da.where(da.yc > 60, drop=True)\n", + "da_masked.plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Please note that in this dataset, the variables `xc` (longitude) and `yc` (latitude) are two-dimensional scalar fields.\n", + "\n", + "When we plotted the data variable `Tair`, by default we get the logical coordinates (i.e. `x` and `y`) as we show in the example above. \n", + "\n", + "In order to visualize the data on a conventional latitude-longitude grid, we can take advantage of Xarray’s ability to apply `cartopy` map projections." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(14, 6))\n", + "ax = plt.axes(projection=ccrs.PlateCarree())\n", + "ax.set_global()\n", + "ds.Tair.plot.pcolormesh(ax=ax, transform=ccrs.PlateCarree(), x=\"xc\", y=\"yc\", add_colorbar=False)\n", + "ax.coastlines()\n", + "ax.set_ylim([20, 90]);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using `where` with Multiple Conditions\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In Xarray's `.where()` function, boolean conditions can be combined using logical operators. The bitwise `and` operator (`&`) and the bitwise `or` operator (`|`) are relevant in this case. This allows for specifying multiple masking conditions within a single `.where()` statement.\n", + "\n", + "We can select data for one specific region using bound boxes. For example, here we want to access data over a region over Alaska :" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# -- define a region\n", + "min_lon = 190\n", + "min_lat = 55\n", + "max_lon = 230\n", + "max_lat = 85" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we have to create our boolean masks:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mask_lon = (ds.xc >= min_lon) & (ds.xc <= max_lon)\n", + "mask_lat = (ds.yc >= min_lat) & (ds.yc <= max_lat)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we can use the boolean masks for filtering data for that region: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da_masked = da.where(mask_lon & mask_lat, drop=True)\n", + "\n", + "da_masked.plot();" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(5, 5))\n", + "ax = plt.axes(projection=ccrs.PlateCarree())\n", + "ax.set_global()\n", + "da_masked.plot.pcolormesh(ax=ax, transform=ccrs.PlateCarree(), x=\"xc\", y=\"yc\", add_colorbar=False)\n", + "ax.coastlines()\n", + "ax.set_ylim([50, 80])\n", + "ax.set_xlim([-180, -120]);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exercise\n", + "\n", + "If we load air temperature dataset from NCEP, we could use `sel` method for selecting a region:\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "If we load air temperature dataset from NCEP, we could use `sel` method for selecting a region:\n", + "\n", + "```python\n", + "ds = xr.tutorial.open_dataset(\"air_temperature\")\n", + "ds_region = ds.sel(lat=slice(75,50), lon=slice(250,300))\n", + "\n", + "ds_region.air.plot();\n", + "```\n", + "Can you use a similar method as above using `sel` to crop a region using the RASM dataset? Why?\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "This method will not work here as the dimensions are different from coordinates here. Specifically, the variables xc (longitude) and yc (latitude) are two-dimensional scalar fields, which differ from the logical coordinates represented by x and y.\n", + "\n", + "So the code below will not give the correct answer!\n", + "```python\n", + "cropped_ds = ds.sel(x=slice(min_lat,max_lat), y=slice(min_lon,max_lon))\n", + "cropped_ds.Tair.plot()\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using `xr.where` with a Function\n", + "\n", + "We can use `xr.where` with a function as a condition too. For example, here we want to convert temperature to Kelvin and find if temperature is greater than 280 K:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Define a function to use as a condition\n", + "def is_greater_than_threshold(x, threshold=300):\n", + " # function to convert temp to K\n", + " # and compare with threshold\n", + " x = x + 273.15\n", + " return x > threshold\n", + "\n", + "\n", + "# Apply the condition using xarray.where()\n", + "masked_data = xr.where(is_greater_than_threshold(da, 280), da, 0)\n", + "\n", + "masked_data.plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Selecting Values with `isin`\n", + "\n", + "To check whether elements of an xarray object contain a single object, you can compare with the equality operator `==` (e.g., `arr == 3`). \n", + "\n", + "To check multiple values, we use `isin()`:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here is a simple example: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x_da = xr.DataArray([1, 2, 3, 4, 5], dims=[\"x\"])\n", + "\n", + "# -- select points with values equal to 2 and 4:\n", + "x_da.isin([2, 4])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{tip}\n", + "`isin()` works particularly well with `where()` to support indexing by arrays that are not already labels of an array. \n", + "```\n", + "\n", + "For example, we have another `DataArray` that displays the status flags of the data-collecting device for our data. \n", + "\n", + "Here, flags with value 0 and -1 signifies the device was functioning correctly, while 0 indicates a malfunction, implying that the resulting data collected may not be accurate." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "flags = xr.DataArray(np.random.randint(-1, 5, da.shape), dims=da.dims, coords=da.coords)\n", + "flags" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we want to only see the data for points where out measurement device is working correctly: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da_masked = da.where(flags.isin([1, 2, 3, 4, 5]), drop=True)\n", + "da_masked.plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{warning}\n", + "Please note that when done repeatedly, this type of indexing is significantly slower than using `sel()`. \n", + "\n", + "Use `sel` instead of `where` as much as possible.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Additional Resources\n", + "\n", + "- [Xarray Docs - Indexing and Selecting Data](https://docs.xarray.dev/en/stable/indexing.html)\n" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": true, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/intermediate/indexing/indexing.md b/intermediate/indexing/indexing.md new file mode 100644 index 00000000..72dae2a4 --- /dev/null +++ b/intermediate/indexing/indexing.md @@ -0,0 +1,5 @@ +# Indexing + +```{tableofcontents} + +``` diff --git a/intermediate/indexing/why-an-index.ipynb b/intermediate/indexing/why-an-index.ipynb new file mode 100644 index 00000000..3123f3d1 --- /dev/null +++ b/intermediate/indexing/why-an-index.ipynb @@ -0,0 +1,1009 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Why does xarray need an *index*? \n", + "\n", + "and when do you need **custom** one?\n", + "\n", + "Xarray `coordinates` allow you to `sel`. For simple 1D cases this is equivalent to calling `argmin` on your array. But that is just the start of what indexes allow you to do. In general an index lets you tell xarray about the *structure* in your coordinates. Such as\n", + "\n", + " - Complex Geographic Coordinate System\n", + " - Periodic Boundaries\n", + " - Lens Distortion\n", + "\n", + "And allows you to make ergonomic and efficient data selections by exploiting that knowledge of the structure\n", + "\n", + "## Learning objectives\n", + "\n", + "- See what a built-in `Index` lets you do\n", + "- Recognize when the *structure* of your coordinates outgrows the default index.\n", + "- Understand the basics of writing a custom `Index`\n", + "\n", + "## Outline\n", + "\n", + "**Built-in indexes** carry you a long way\n", + " - A video's **time axis** (`PandasIndex`)\n", + " - A **too-big-to-store** regular axis (`RangeIndex`)\n", + "\n", + "**A Simple Custom Index**\n", + " - Periodic on a ring\n", + "\n", + "**Non-linear coordinate transformations**\n", + "\n", + "\n", + "*See also: the [Xarray Indexes Gallery](https://xarray-indexes.readthedocs.io/) · [how to create a custom index](https://docs.xarray.dev/en/stable/internals/how-to-create-custom-index.html) · [indexing user guide](https://docs.xarray.dev/en/stable/user-guide/indexing.html).*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "os.environ.setdefault(\"KMP_WARNINGS\", \"0\") # silence a benign OpenMP info line in some envs\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import xarray as xr\n", + "from xarray import Coordinates\n", + "from xarray.indexes import (\n", + " CoordinateTransform,\n", + " CoordinateTransformIndex,\n", + " NDPointIndex,\n", + " RangeIndex,\n", + ")\n", + "\n", + "\n", + "# helper reused later, when we get to the metal ring\n", + "def draw_circle(ax, r=1, lim=1.4):\n", + " circ = plt.Circle((0, 0), r, fill=False, ls=\":\", color=\"0.7\")\n", + " ax.add_patch(circ)\n", + " ax.set_aspect(\"equal\")\n", + " ax.set_xlim(-lim, lim)\n", + " ax.set_ylim(-lim, lim)\n", + " ax.set_xlabel(\"x\")\n", + " ax.set_ylabel(\"y\")" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "## 1. Built-in indexes \n", + "\n", + "For 1-D coordinates built in Indexes are excellent. Here we will \n", + "- `PandasIndex`\n", + "- `RangeIndex`\n" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "## 1.1 A coordinate is just an array of labels\n", + "\n", + "The most familiar index hides in plain sight. A video is just a **stack of frames**, and each frame happens at a **time**. That `time` axis is a coordinate — literally *an array of labels* — and it has exactly the structure the built-in [`PandasIndex`](https://docs.xarray.dev/en/stable/generated/xarray.indexes.PandasIndex.html) is built for: 1‑D and monotonic.\n", + "\n", + "We'll open a short clip with a tiny xarray backend that reads image formats (`ocean.gif`), so the whole video arrives as an ordinary `Dataset` with dims `(time, height, width, color)`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "# A little xarray backend (from the \"Backends\" tutorial) that reads image formats via imageio.\n", + "# It turns a gif/mp4 into a Dataset with dims (time, height, width, color).\n", + "import sys\n", + "\n", + "sys.path.insert(0, \"../../advanced/backends\")\n", + "from imageio_ import ImageIOBackend\n", + "\n", + "# .load() pulls the whole (small) clip into memory up front\n", + "ocean = xr.open_dataset(\"../../advanced/backends/ocean.gif\", engine=ImageIOBackend).load()\n", + "ocean" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "ocean.time" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "\n", + "### Finding a time point the naive way: `argmin`\n", + "\n", + "If we want the frame closest to 0.825 s we could write it using `np.argmin`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "target = np.timedelta64(825, \"ms\")\n", + "pos = np.abs(ocean.time.values - target).argmin() # a full O(n) scan\n", + "print(f\"nearest frame is index {pos}, at {ocean.time.values[pos] / np.timedelta64(1, 's'):g} s\")" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "### Let the index do it" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "# select by timestamp (not by frame number!) — the index finds the nearest frame\n", + "frame = ocean.sel(time=\"0.825s\", method=\"nearest\")\n", + "\n", + "# Or a range of times\n", + "clip = ocean.sel(time=slice(\"0.5s\", \"1.2s\"))\n", + "\n", + "seconds = frame.time.values / np.timedelta64(1, \"s\")\n", + "fig, ax = plt.subplots(figsize=(5, 3))\n", + "ax.imshow(frame[\"data\"].values)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "# 📝 Play with it: change these timestamps (in seconds) and re-run — .sel picks the nearest frame each time\n", + "times = [\"0s\", \"0.4s\", \"0.8s\", \"1.2s\", \"1.6s\"]\n", + "\n", + "montage = ocean[\"data\"].sel(time=times, method=\"nearest\")\n", + "fig, axes = plt.subplots(1, len(times), figsize=(3 * len(times), 2))\n", + "for ax, t in zip(axes, montage.time.values):\n", + " ax.imshow(montage.sel(time=t).values)\n", + " ax.set(title=f\"{t / np.timedelta64(1, 's'):g} s\", xticks=[], yticks=[])\n", + "fig.suptitle(\"select frames by time — one .sel, no frame numbers\", y=1.05)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "### Recap: the 1‑D index\n", + "\n", + "On a 1‑D, monotonic coordinate, the default [`PandasIndex`](https://docs.xarray.dev/en/stable/generated/xarray.indexes.PandasIndex.html) gives you:\n", + "\n", + "- **ergonomics:** `nearest`, `tolerance`, and label `slice` as one-liners\n", + "- **alignment:** automatic label joins in `+`, `concat`, `merge`\n", + "- **performance:** a hash table for exact matches, binary search over the sorted labels for ranges and `nearest`\n", + "\n", + "The structure that this relies on is the index being monotonic, so it can create a precomputed look up structure, which lets use beat the performance of `argmin`." + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "## 1.2 Generated, not stored: `RangeIndex`\n", + "\n", + "- A regular 1‑D axis can get *huge*:\n", + " - At 60 fps hour of video is ~216k frames\n", + " - A brain slice stack can be enormous (exabyte scale is the goal)\n", + "\n", + "Xarray coordinates are eagerly loaded into memory. So if we had an axis with 2 billion entries and we recorded a `float64` entry for each one we would use a ton of memory!\n", + "\n", + "\n", + "If we have regular spacing on the coordinate (structure!) we can encode that in the index and avoid the memory issues.\n", + "\n", + "[`RangeIndex`](https://docs.xarray.dev/en/stable/generated/xarray.indexes.RangeIndex.html) keeps three numbers (`start`, `stop`, `step`).\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "n_z = 2_000_000_000\n", + "z = Coordinates.from_xindex(RangeIndex.arange(0.0, n_z * 4.0, 4.0, dim=\"z\"))[\"z\"]\n", + "z" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "type(z.variable._data).__name__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "# select by physical position (nm); only the requested points are ever computed\n", + "depth_nm = xr.DataArray([1e6, 5e6], dims=\"probe\") # 1 mm and 5 mm deep\n", + "z.sel(z=depth_nm, method=\"nearest\")" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": {}, + "source": [ + "The labels never materialize unless we request them, so we didn't run out of memory." + ] + }, + { + "cell_type": "markdown", + "id": "17", + "metadata": {}, + "source": [ + "## 1.3 Slicing in space *and* time\n", + "\n", + "- One `.sel` selects across *several* dimensions at once\n", + " - a time window\n", + " - a spatial crop.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "# give the pixel axes coordinates so BOTH space and time can be sliced by label\n", + "frames = ocean.assign_coords(\n", + " height=(\"height\", np.linspace(0, 1, ocean.sizes[\"height\"])),\n", + " width=(\"width\", np.linspace(0, 1, ocean.sizes[\"width\"])),\n", + ")\n", + "\n", + "# one .sel across time AND space: a temporal window + a spatial box\n", + "clip = frames.sel(time=slice(\"0.2s\", \"0.7s\"), height=slice(0.25, 0.75), width=slice(0.3, 0.7))\n", + "print(\"full:\", dict(frames.sizes))\n", + "print(\"clip:\", dict(clip.sizes))\n", + "\n", + "fig, axes = plt.subplots(1, 2, figsize=(7, 3))\n", + "axes[0].imshow(frames[\"data\"].isel(time=0).values)\n", + "axes[0].set(title=\"full frame\", xticks=[], yticks=[])\n", + "axes[1].imshow(clip[\"data\"].isel(time=0).values)\n", + "axes[1].set(title=\"sel(time, height, width)\", xticks=[], yticks=[])\n", + "plt.show()" + ] + }, + { + "attachments": { + "cccdc7e2-3388-44f0-8822-d62a07849acb.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "## 2. A metal ring: when the axis wraps around\n", + "\n", + "Not every 1-D coordinate lies on a straight line. Position around a **metal ring** is a *periodic* coordinate: `345°` and `0°` are neighbours, and `0°` **is** `360°`. Our hot spot sits at `0°`, right where the labels wrap — exactly where a linear index gets confused. The default `PandasIndex` treats `angle` as a straight axis `[0, 345]` and has no idea the ends meet.\n", + "\n", + "![Heating a metal ring with a torch, thermometers spaced around it — Fourier's experiment](attachment:cccdc7e2-3388-44f0-8822-d62a07849acb.png)\n", + "\n", + "```{admonition} This is a real physical problem\n", + ":class: note\n", + "Heat flow around a ring is the classic *periodic boundary* problem — the one Fourier introduced Fourier series to solve. Temperature at `360°` **is** the temperature at `0°`, so the model has to know the axis wraps.\n", + "\n", + "- 📺 [Fourier's experiments on the heating of a metal ring (video)](https://www.youtube.com/watch?v=O-zNVW7tFPQ&list=PLTGvK6jMx5QBhFJ27J4n7JGxHCnZ0USMf&index=6)\n", + "- 📄 [Reconstructing the early history of the theory of heat through Fourier's experiments (Eur. J. Phys.)](https://iopscience.iop.org/article/10.1088/1361-6404/acdf2e)\n", + "```\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "def ring_temperature(angle, hot_at=0.0, sigma=45.0):\n", + " d = (angle - hot_at + 180) % 360 - 180 # circular distance to the hot spot\n", + " return 15 + 20 * np.exp(-(d**2) / (2 * sigma**2))\n", + "\n", + "\n", + "angle = np.arange(0, 360, 15)\n", + "metal_ring = xr.DataArray(\n", + " ring_temperature(angle, hot_at=0),\n", + " dims=\"angle\",\n", + " coords={\n", + " \"angle\": angle,\n", + " \"x\": (\"angle\", np.cos(np.deg2rad(angle))),\n", + " \"y\": (\"angle\", np.sin(np.deg2rad(angle))),\n", + " },\n", + " name=\"temperature\",\n", + ")\n", + "metal_ring" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(figsize=(5.2, 5.2))\n", + "\n", + "# the angle is the coordinate, so we drop the cartesian x/y frame\n", + "circ = plt.Circle((0, 0), 1, fill=False, ls=\":\", color=\"0.7\")\n", + "ax.add_patch(circ)\n", + "sc = ax.scatter(metal_ring.x, metal_ring.y, c=metal_ring, cmap=\"coolwarm\", s=140, zorder=3)\n", + "\n", + "# label the angle around the ring\n", + "for a in range(0, 360, 45):\n", + " t = np.deg2rad(a)\n", + " ax.text(\n", + " 1.28 * np.cos(t),\n", + " 1.28 * np.sin(t),\n", + " f\"{a}°\",\n", + " ha=\"center\",\n", + " va=\"center\",\n", + " color=\"0.4\",\n", + " fontsize=9,\n", + " )\n", + "\n", + "ax.set_aspect(\"equal\")\n", + "ax.set_xlim(-1.5, 1.5)\n", + "ax.set_ylim(-1.5, 1.6)\n", + "ax.axis(\"off\")\n", + "fig.colorbar(sc, ax=ax, label=\"temperature (°C)\", shrink=0.8)\n", + "ax.set_title(\"A metal ring: a hot spot at 0°, where the labels wrap\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "22", + "metadata": {}, + "source": [ + "### The problem! \n", + "\n", + "What if we try to plot based on another valid way of describing the angles? (-180, 180) instead of (0, 360)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "q = np.linspace(-180, 180, 721)\n", + "default_only = metal_ring.sel(angle=q, method=\"nearest\")\n", + "\n", + "sensor_fold = ((metal_ring.angle.values + 180) % 360) - 180\n", + "\n", + "fig, ax = plt.subplots(figsize=(9, 4))\n", + "ax.scatter(sensor_fold, metal_ring.values, color=\"0.3\", s=45, zorder=5, label=\"the sensors\")\n", + "ax.plot(q, default_only, color=\"tab:red\", lw=2, label=\"default index: .sel(nearest)\")\n", + "ax.axvline(0, color=\"0.6\", ls=\":\", lw=1)\n", + "ax.set_xlabel(\"query angle (°)\")\n", + "ax.set_ylabel(\"temperature (°C)\")\n", + "ax.legend(loc=\"lower center\")\n", + "ax.set_xticks(np.arange(-180, 181, 45))\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "24", + "metadata": {}, + "source": [ + "## 2.1 📝 Write your own: a `PeriodicIndex`\n", + "\n", + "\n", + "For this we need an index that knows about the periodicity of the ring. \n", + "\n", + "A full custom `Index` can be tiny — the only method that carries the idea is **`sel`**. We've filled in the boilerplate: `__init__` wraps a plain `PandasIndex` (which holds the labels) plus the `period`, and `from_variables` is how `set_xindex` builds it.\n", + "\n", + "::::{admonition} Exercise — implement `sel`\n", + ":class: tip\n", + "\n", + "Selection should **wrap around** the period. \n", + "\n", + "```python\n", + "def sel(self, labels, method=None, tolerance=None):\n", + " # labels : {coord_name: query} e.g. .sel(angle=370) -> {\"angle\": 370} (one scalar)\n", + " # return : IndexSelResult({dim_name: positions}) positions = list of int rows, e.g. [3]\n", + " (name, label), = labels.items()\n", + " base = self._index.index.to_numpy() # the stored labels (one period)\n", + " q = float(label)\n", + " ... # circular distance -> nearest position -> pos\n", + " return IndexSelResult({self._index.dim: [pos]})\n", + "```\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "```python\n", + "def sel(self, labels, method=None, tolerance=None):\n", + " # labels : {coord_name: query} e.g. .sel(angle=370) -> {\"angle\": 370} (one scalar)\n", + " # return : IndexSelResult({dim_name: positions}) positions = list of int rows, e.g. [3]\n", + " (name, label), = labels.items()\n", + " base = self._index.index.to_numpy()\n", + " q = float(label)\n", + " d = np.abs((q - base + self.period / 2) % self.period - self.period / 2)\n", + " pos = int(d.argmin())\n", + " return IndexSelResult({self._index.dim: [pos]})\n", + "```\n", + ":::\n", + "::::\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25", + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "from xarray import Index\n", + "from xarray.core.indexing import IndexSelResult\n", + "from xarray.indexes import PandasIndex\n", + "\n", + "\n", + "class PeriodicIndex(Index):\n", + " \"\"\"A 1-D index whose axis wraps every ``period`` (e.g. angle, period=360).\"\"\"\n", + "\n", + " def __init__(self, pandas_index, period):\n", + " self._index = pandas_index # a plain PandasIndex holding the labels\n", + " self.period = period\n", + "\n", + " @classmethod\n", + " def from_variables(cls, variables, *, options):\n", + " # boilerplate: how set_xindex builds us from the coordinate\n", + " return cls(PandasIndex.from_variables(variables, options={}), options[\"period\"])\n", + "\n", + " def sel(self, labels, method=None, tolerance=None):\n", + " # labels : {coord_name: query} e.g. .sel(angle=370) -> {\"angle\": 370}\n", + " # return : IndexSelResult({dim_name: [position]}) position = int row into the axis\n", + " print(\"sel received:\", labels)\n", + " # the stored labels (one period) are self._index.index.to_numpy()\n", + " pos = 0 # <- replace: circular distance -> nearest position\n", + " return IndexSelResult({self._index.dim: [pos]})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": {}, + "outputs": [], + "source": [ + "# attach OUR (unfinished) index to the metal ring, then select by angle\n", + "periodic = metal_ring.drop_indexes(\"angle\").set_xindex(\"angle\", PeriodicIndex, period=360.0)\n", + "\n", + "# .sel routes the query into PeriodicIndex.sel — run it to see what the index receives:\n", + "periodic.sel(angle=370)" + ] + }, + { + "cell_type": "markdown", + "id": "27", + "metadata": {}, + "source": [ + "### Does your index fix the -180, 180 issue?\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28", + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "# the same query, now resolved by BOTH indexes — the periodic one wraps\n", + "default_temp = metal_ring.sel(angle=q, method=\"nearest\")\n", + "periodic_temp = periodic.sel(angle=q)\n", + "\n", + "fig, ax = plt.subplots(figsize=(9, 4))\n", + "ax.scatter(sensor_fold, metal_ring.values, color=\"0.3\", s=45, zorder=5, label=\"the sensors\")\n", + "ax.plot(q, periodic_temp, color=\"tab:green\", lw=2.5, label=\"PeriodicIndex .sel\")\n", + "ax.plot(q, default_temp, color=\"tab:red\", lw=2, label=\"default index\")\n", + "ax.axvline(0, color=\"0.6\", ls=\":\", lw=1)\n", + "ax.set_xlabel(\"query angle (°)\")\n", + "ax.set_ylabel(\"temperature (°C)\")\n", + "ax.legend(loc=\"lower center\")\n", + "ax.set_xticks(np.arange(-180, 181, 45))\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "29", + "metadata": {}, + "source": [ + "## 3. Build your own: a `CoordinateTransform` (step 1 of 2 — a 1-D ruler)\n", + "\n", + "We just subclassed `Index` and wrote `sel` by hand. A **`CoordinateTransform`** makes this much easier for many common cases. You just write **`forward`/`reverse`** and xarray does the rest.\n", + "\n", + "We'll build two, increasing in power:\n", + "\n", + "1. A **RangeIndex** (here)\n", + "2. A nonlinear **warp** — a fisheye lens\n", + "\n", + "\n", + "\n", + "A `CoordinateTransform` needs just two methods:\n", + "\n", + "- `forward` — dimension positions → coordinate labels\n", + "- `reverse` — coordinate labels → dimension positions\n", + "\n", + "::::{admonition} Exercise — implement the ruler\n", + ":class: tip\n", + "\n", + "Fill in `forward` and `reverse` so the transform maps slice index ↔ depth (`depth = index · thickness`). Each is handed a **dict** and returns a **dict** — run the cell after it to see what.\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "```python\n", + " def forward(self, dim_positions): # slice index -> depth\n", + " return {\"depth\": dim_positions[\"slice\"] * self.thickness}\n", + "\n", + " def reverse(self, coord_labels): # depth -> slice index\n", + " return {\"slice\": coord_labels[\"depth\"] / self.thickness}\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "30", + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "class DIYRangeIndex(CoordinateTransform):\n", + " def __init__(self, n, thickness):\n", + " super().__init__((\"depth\",), {\"slice\": n})\n", + " self.n, self.thickness = n, thickness\n", + "\n", + " def forward(self, dim_positions): # index space -> world space\n", + " # given : {dim_name: positions} e.g. {\"slice\": array([0, 1, 2, ...])}\n", + " # return : {coord_name: labels} e.g. {\"depth\": }\n", + " print(\"forward received:\", dim_positions)\n", + " depth = dim_positions[\"slice\"] # <- replace: slice index -> depth\n", + " return {\"depth\": depth}\n", + "\n", + " def reverse(self, coord_labels): # world space -> index space\n", + " # given : {coord_name: labels} e.g. {\"depth\": array([10.0, 50.0])}\n", + " # return : {dim_name: positions} e.g. {\"slice\": }\n", + " print(\"reverse received:\", coord_labels)\n", + " slice_index = coord_labels[\"depth\"] # <- replace: depth -> slice index\n", + " return {\"slice\": slice_index}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31", + "metadata": {}, + "outputs": [], + "source": [ + "demo = xr.DataArray(\n", + " np.zeros((5, 2, 2)),\n", + " dims=(\"slice\", \"y\", \"x\"),\n", + " coords=Coordinates.from_xindex(CoordinateTransformIndex(DIYRangeIndex(5, 0.5))),\n", + ")\n", + "_ = demo.depth.values # forward runs: slice index -> depth\n", + "demo.sel(\n", + " depth=xr.DataArray([1.0], dims=\"q\"), method=\"nearest\"\n", + ") # reverse runs: depth -> slice index" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32", + "metadata": {}, + "outputs": [], + "source": [ + "# an imaging stack: 200 slices, 0.5 µm apart.\n", + "\n", + "n_slices, thickness = 200, 0.5 # µm\n", + "depth_true = np.arange(n_slices) * thickness\n", + "structure = np.exp(-((depth_true - 50.0) ** 2) / (2 * 8.0**2)) # a bright band ~50 µm deep\n", + "rng = np.random.default_rng(0)\n", + "volume = xr.DataArray(\n", + " structure[:, None, None] * rng.random((n_slices, 32, 32)), # stand-in for the image data\n", + " dims=(\"slice\", \"y\", \"x\"),\n", + " coords=Coordinates.from_xindex(CoordinateTransformIndex(DIYRangeIndex(n_slices, thickness))),\n", + " name=\"intensity\",\n", + ")\n", + "volume # 'depth' is a lazy coordinate, generated by the rule" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33", + "metadata": {}, + "outputs": [], + "source": [ + "# grab the slices nearest given physical depths (µm) in one call — only the rule (n, thickness) is stored\n", + "picked = volume.sel(depth=xr.DataArray([10.0, 50.0, 73.3], dims=\"d\"), method=\"nearest\")\n", + "picked" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34", + "metadata": {}, + "outputs": [], + "source": [ + "# mean intensity vs depth — the x-axis is the 'depth' coordinate, generated on demand by the rule\n", + "# xr.set_options(use_flox=False)\n", + "# volume.mean([\"y\", \"x\"]).plot(x=\"depth\")\n", + "# plt.gca().set(xlabel=\"depth (µm)\", title=\"brightness vs depth (structure ~50 µm deep)\")\n", + "# plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "35", + "metadata": {}, + "source": [ + "## 4. A nonlinear warp (a fisheye lens) 🔍\n", + "\n", + "\n", + "Here we will build an index that lets us select in world coordinates when our data is warped (e.g. by a fish eye lens). This sort of lens distortion is very common in science. Our data is on arranged on a regular pixel grid, but due to distortion selections in pixel space won't be \n", + "\n", + "https://www.microscopyu.com/tutorials/distortion\n", + "\n", + "\n", + "$$(x_\\text{world},\\, y_\\text{world}) = (x,\\, y)\\;\\cdot\\;\\frac{1}{1 - k\\,r^2}, \\qquad r = \\sqrt{x^2 + y^2}$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36", + "metadata": {}, + "outputs": [], + "source": [ + "SQUARES = (\n", + " 1.5 # checkerboard squares per world unit (shared by the checker + the world-grid overlay)\n", + ")\n", + "\n", + "\n", + "def checker(x, y, squares=SQUARES):\n", + " return ((np.floor(x * squares) + np.floor(y * squares)) % 2).astype(float)\n", + "\n", + "\n", + "nx = ny = 1024\n", + "k = 0.35 # lens distortion strength\n", + "\n", + "# each sensor pixel looks out at a world point through the lens (radial model)\n", + "y_pixel, x_pixel = np.meshgrid(np.arange(ny), np.arange(nx), indexing=\"ij\")\n", + "x_norm = (x_pixel - (nx - 1) / 2) / ((nx - 1) / 2) # centered, normalized pixel coords\n", + "y_norm = (y_pixel - (ny - 1) / 2) / ((ny - 1) / 2)\n", + "factor = 1 / (1 - k * np.hypot(x_norm, y_norm) ** 2) # fisheye: the periphery expands (barrel)\n", + "x_world, y_world = x_norm * factor, y_norm * factor # the world position each pixel sees\n", + "\n", + "photo = checker(x_world, y_world) # a flat checkerboard, seen through the lens\n", + "photo_da = xr.DataArray(\n", + " photo,\n", + " dims=(\"y_pixel\", \"x_pixel\"),\n", + " coords={\"x_pixel\": np.arange(nx), \"y_pixel\": np.arange(ny)},\n", + " name=\"brightness\",\n", + ")\n", + "photo_da # our data: a plain, pixel-indexed image" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "37", + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "# the flat world (the scene) vs the distorted photo (our data)\n", + "world_grid = np.linspace(-1.6, 1.6, 400)\n", + "flat = checker(*np.meshgrid(world_grid, world_grid))\n", + "\n", + "fig, (ax_world, ax_photo) = plt.subplots(1, 2, figsize=(10.5, 5.2))\n", + "ax_world.imshow(flat, cmap=\"gray\", origin=\"lower\", extent=[-1.6, 1.6, -1.6, 1.6])\n", + "ax_world.set_title(\"REAL WORLD — flat checkerboard\")\n", + "ax_world.set_xlabel(\"x_world\")\n", + "ax_world.set_ylabel(\"y_world\")\n", + "ax_photo.imshow(photo, cmap=\"gray\", origin=\"lower\")\n", + "ax_photo.set_title(\"STORED fisheye photo — DISTORTED (our data)\")\n", + "ax_photo.set_xlabel(\"x_pixel\")\n", + "ax_photo.set_ylabel(\"y_pixel\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "38", + "metadata": {}, + "source": [ + "### Can xarray handle the undistorted coordinates\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39", + "metadata": {}, + "outputs": [], + "source": [ + "distorted = xr.DataArray(\n", + " photo,\n", + " dims=(\"y_pixel\", \"x_pixel\"),\n", + " coords={\n", + " \"x_world\": ((\"y_pixel\", \"x_pixel\"), x_world),\n", + " \"y_world\": ((\"y_pixel\", \"x_pixel\"), y_world),\n", + " },\n", + " name=\"brightness\",\n", + ")\n", + "distorted" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "40", + "metadata": {}, + "outputs": [], + "source": [ + "distorted.sel(x_world=0.3, y_world=0.15, method=\"nearest\")" + ] + }, + { + "cell_type": "markdown", + "id": "41", + "metadata": {}, + "source": [ + "**It breaks.** The standard index can't handle a 2-D coordinate.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "42", + "metadata": {}, + "source": [ + "### The better fix: A custom Index!\n", + "\n", + "\n", + "$$\\text{world } r = \\frac{\\text{pixel } r}{1 - k\\,(\\text{pixel } r)^2} \\qquad\\Longleftrightarrow\\qquad \\text{pixel } r = \\frac{-1 + \\sqrt{1 + 4k\\,(\\text{world } r)^2}}{2k\\,(\\text{world } r)}$$\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43", + "metadata": {}, + "outputs": [], + "source": [ + "class FisheyeTransform(CoordinateTransform):\n", + " \"\"\"Radial fisheye lens: pixel (x_pixel, y_pixel) <-> world (x_world, y_world).\n", + " world_r = pixel_r / (1 - k * pixel_r**2) — barrel, with a closed-form inverse.\"\"\"\n", + "\n", + " def __init__(self, nx, ny, k):\n", + " super().__init__((\"x_world\", \"y_world\"), {\"y_pixel\": ny, \"x_pixel\": nx})\n", + " self.nx, self.ny, self.k = nx, ny, k\n", + "\n", + " def _normalize(self, x_pixel, y_pixel): # pixel indices -> centered, normalized\n", + " return (\n", + " (np.asarray(x_pixel) - (self.nx - 1) / 2) / ((self.nx - 1) / 2),\n", + " (np.asarray(y_pixel) - (self.ny - 1) / 2) / ((self.ny - 1) / 2),\n", + " )\n", + "\n", + " def forward(self, dim_positions): # pixel -> world (undistort)\n", + " x_norm, y_norm = self._normalize(dim_positions[\"x_pixel\"], dim_positions[\"y_pixel\"])\n", + " factor = 1 / (1 - self.k * np.hypot(x_norm, y_norm) ** 2)\n", + " return {\"x_world\": x_norm * factor, \"y_world\": y_norm * factor}\n", + "\n", + " def reverse(self, coord_labels): # world -> pixel (distort, closed form)\n", + " x_world = np.asarray(coord_labels[\"x_world\"])\n", + " y_world = np.asarray(coord_labels[\"y_world\"])\n", + " world_r = np.hypot(x_world, y_world)\n", + " with np.errstate(divide=\"ignore\", invalid=\"ignore\"):\n", + " pixel_r = (-1 + np.sqrt(1 + 4 * self.k * world_r**2)) / (2 * self.k * world_r)\n", + " scale = np.where(world_r > 0, pixel_r / world_r, 1.0)\n", + " return {\n", + " \"x_pixel\": (x_world * scale) * ((self.nx - 1) / 2) + (self.nx - 1) / 2,\n", + " \"y_pixel\": (y_world * scale) * ((self.ny - 1) / 2) + (self.ny - 1) / 2,\n", + " }\n", + "\n", + "\n", + "lens = FisheyeTransform(nx, ny, k)\n", + "\n", + "fish = xr.DataArray(\n", + " photo,\n", + " dims=(\"y_pixel\", \"x_pixel\"),\n", + " coords=Coordinates.from_xindex(CoordinateTransformIndex(lens)),\n", + " name=\"brightness\",\n", + ")\n", + "fish" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44", + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "fig, ax = plt.subplots(figsize=(6, 6))\n", + "for c in np.arange(-4, 4.01, 1 / SQUARES): # spacing = one checkerboard square in world\n", + " ax.axhline(c, color=\"tab:red\", lw=0.6, alpha=0.7)\n", + " ax.axvline(c, color=\"tab:red\", lw=0.6, alpha=0.7)\n", + "fish.plot(x=\"x_world\", y=\"y_world\", ax=ax, cmap=\"gray\", add_colorbar=False)\n", + "ax.set_xlim(-4, 4)\n", + "ax.set_ylim(-4, 4)\n", + "ax.set_aspect(\"equal\")\n", + "ax.set_title(\"the fisheye captures a star-shaped patch of the regular world grid\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45", + "metadata": { + "tags": [ + "hide-input" + ] + }, + "outputs": [], + "source": [ + "# that same straight world line traces a CURVE across the pixels\n", + "# (by hand, via the lens' reverse() — exactly the work .sel just did for us)\n", + "line_x = np.linspace(-1.4, 1.4, 400) # a straight world line at y_world = 0.2\n", + "path = lens.reverse({\"x_world\": line_x, \"y_world\": np.full_like(line_x, 0.2)})\n", + "point = lens.reverse({\"x_world\": np.array([0.3]), \"y_world\": np.array([0.2])})\n", + "flat = checker(*np.meshgrid(np.linspace(-1.6, 1.6, 400), np.linspace(-1.6, 1.6, 400)))\n", + "\n", + "fig, (ax_world, ax_photo) = plt.subplots(1, 2, figsize=(11, 5.2))\n", + "ax_world.imshow(flat, cmap=\"gray\", origin=\"lower\", extent=[-1.6, 1.6, -1.6, 1.6])\n", + "ax_world.plot(line_x, np.full_like(line_x, 0.2), c=\"tab:red\", lw=2.5)\n", + "ax_world.set_title(\"WORLD — straight line: sel(x_world=.., y_world=0.2)\")\n", + "ax_photo.imshow(photo, cmap=\"gray\", origin=\"lower\")\n", + "ax_photo.plot(path[\"x_pixel\"], path[\"y_pixel\"], c=\"tab:red\", lw=2.5)\n", + "ax_photo.scatter(point[\"x_pixel\"], point[\"y_pixel\"], c=\"tab:orange\", s=160, marker=\"*\", zorder=5)\n", + "ax_photo.set_title(\"PHOTO — the same selection is a curved path\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46", + "metadata": {}, + "outputs": [], + "source": [ + "# read the brightness ALONG the line: world selection is a clean square wave; a raw pixel row is warped\n", + "world_line = fish.sel(\n", + " x_world=xr.DataArray(np.linspace(-1.4, 1.4, 400), dims=\"s\"),\n", + " y_world=xr.DataArray(np.zeros(400), dims=\"s\"),\n", + " method=\"nearest\",\n", + ")\n", + "pixel_row = fish.isel(y_pixel=ny // 2)\n", + "\n", + "fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 4.2), sharex=True)\n", + "ax1.step(np.linspace(0, 1, world_line.sizes[\"s\"]), world_line.values, where=\"mid\", c=\"tab:red\")\n", + "ax1.set_title(\"along the WORLD line (.sel by x_world) — even bands\")\n", + "ax2.step(np.linspace(0, 1, pixel_row.sizes[\"x_pixel\"]), pixel_row.values, where=\"mid\", c=\"tab:blue\")\n", + "ax2.set_title(\"along a raw PIXEL row (.isel) — bands warp with the lens\")\n", + "for ax in (ax1, ax2):\n", + " ax.set_yticks([0, 1])\n", + " ax.set_yticklabels([\"black\", \"white\"])\n", + "ax2.set_xlabel(\"fraction along the line\")\n", + "fig.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "47", + "metadata": {}, + "source": [ + "https://xarray-indexes.readthedocs.io/" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/intermediate/intro-to-zarr.ipynb b/intermediate/intro-to-zarr.ipynb new file mode 100644 index 00000000..911ba391 --- /dev/null +++ b/intermediate/intro-to-zarr.ipynb @@ -0,0 +1,687 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Introduction to Zarr\n", + "\n", + "## Learning Objectives:\n", + "\n", + "- Understand the principles of the Zarr data format\n", + "- Learn how to read and write Zarr stores using the `zarr-python` library\n", + "- Explore how to use Zarr stores with `xarray` for data analysis and visualization\n", + "\n", + "This notebook provides a brief introduction to Zarr and how to\n", + "use it in cloud environments for scalable, chunked, and compressed data storage.\n", + "\n", + "Zarr is a data format with implementations in different languages. In this tutorial, we will look at an example of how to use the Zarr format by looking at some features of the `zarr-python` library and how Zarr files can be opened with `xarray`.\n", + "\n", + "## What is Zarr?\n", + "\n", + "The Zarr data format is an open, community-maintained format designed for efficient, scalable storage of large N-dimensional arrays. It stores data as compressed and chunked arrays in a format well-suited to parallel processing and cloud-native workflows. \n", + "\n", + "### Zarr Data Organization:\n", + "- **Arrays**: N-dimensional arrays that can be chunked and compressed.\n", + "- **Groups**: A container for organizing multiple arrays and other groups with a hierarchical structure.\n", + "- **Metadata**: JSON-like metadata describing the arrays and groups, including information about data types, dimensions, chunking, compression, and user-defined key-value fields. \n", + "- **Dimensions and Shape**: Arrays can have any number of dimensions, and their shape is defined by the number of elements in each dimension.\n", + "- **Coordinates & Indexing**: Zarr supports coordinate arrays for each dimension, allowing for efficient indexing and slicing.\n", + "\n", + "The diagram below from [the Zarr v3 specification](https://wiki.earthdata.nasa.gov/display/ESO/Zarr+Format) showing the structure of a Zarr store:\n", + "\n", + "![ZarrSpec](https://zarr-specs.readthedocs.io/en/latest/_images/terminology-hierarchy.excalidraw.png)\n", + "\n", + "\n", + "NetCDF and Zarr share similar terminology and functionality, but the key difference is that NetCDF is a single file, while Zarr is a directory-based “store” composed of many chunked files, making it better suited for distributed and cloud-based workflows." + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "source": [ + "### Zarr Fundamenals\n", + "A Zarr array has the following important properties:\n", + "- **Shape**: The dimensions of the array.\n", + "- **Dtype**: The data type of each element (e.g., float32).\n", + "- **Attributes**: Metadata stored as key-value pairs (e.g., units, description.\n", + "- **Compressors**: Algorithms used to compress each chunk (e.g., Zstd, Blosc, Zlib).\n", + "\n", + "\n", + "#### Example: Creating and Inspecting a Zarr Array\n", + "\n", + "Here we create a simple 2D array of shape `(40, 50)` with chunks of size `(10, 10)` ,write to the `LocalStore` in the `test.zarr` directory. \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "import pathlib\n", + "import shutil\n", + "\n", + "import zarr\n", + "\n", + "# Ensure we start with a clean directory for the tutorial\n", + "datadir = pathlib.Path(\"../data/zarr-tutorial\")\n", + "if datadir.exists():\n", + " shutil.rmtree(datadir)\n", + "\n", + "output = datadir / \"test.zarr\"\n", + "z = zarr.create_array(shape=(40, 50), chunks=(10, 10), dtype=\"f8\", store=output)\n", + "z" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "`.info` provides a summary of the array's properties, including shape, data type, and compression settings.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "z.info" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "z.fill_value" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "No data has been written to the array yet. If we try to access the data, we will get a fill value: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "z[0, 0]" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "This is how we assign data to the array. When we do this it gets written immediately." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "z[:] = 1\n", + "z[0, :] = np.arange(50)\n", + "z[:]" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "#### Attributes\n", + "\n", + "We can attach arbitrary metadata to our Array via attributes:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "z.attrs[\"units\"] = \"m/s\"\n", + "z.attrs[\"standard_name\"] = \"wind_speed\"\n", + "print(dict(z.attrs))" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "### Zarr Data Storage\n", + "\n", + "Zarr can be stored in memory, on disk, or in cloud storage systems like Amazon S3.\n", + "\n", + "Let's look under the hood. _The ability to look inside a Zarr store and understand what is there is a deliberate design decision._" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "z.store" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "!tree -a {output}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "!cat {output}/zarr.json" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": {}, + "source": [ + "### Hierarchical Groups" + ] + }, + { + "cell_type": "markdown", + "id": "17", + "metadata": {}, + "source": [ + "Zarr allows you to create hierarchical groups, similar to directories. To create groups in your store, use the `create_group` method after creating a root group. Here, we’ll create two groups, `temp` and `precip`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "store = zarr.storage.MemoryStore()\n", + "root = zarr.create_group(store=store)\n", + "temp = root.create_group(\"temp\")\n", + "precip = root.create_group(\"precip\")\n", + "t2m = temp.create_array(\"t2m\", shape=(100, 100), chunks=(10, 10), dtype=\"i4\")\n", + "prcp = precip.create_array(\"prcp\", shape=(1000, 1000), chunks=(10, 10), dtype=\"i4\")\n", + "root.tree()" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "Groups can easily be accessed by name and index.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "display(root[\"temp\"])\n", + "root[\"temp/t2m\"][:, 3]" + ] + }, + { + "cell_type": "markdown", + "id": "21", + "metadata": {}, + "source": [ + "To get a look at your overall dataset, the `tree` and `info` methods are helpful.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": {}, + "outputs": [], + "source": [ + "root.info" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [ + "root.tree()" + ] + }, + { + "cell_type": "markdown", + "id": "24", + "metadata": {}, + "source": [ + "#### Chunking\n", + "Chunking is the process of dividing Zarr arrays into smaller pieces. This allows for parallel processing and efficient storage.\n", + "\n", + "One of the important parameters in Zarr is the chunk shape, which determines how the data is divided into smaller, manageable pieces. This is crucial for performance, especially when working with large datasets.\n", + "\n", + "To examine the chunk shape of a Zarr array, you can use the `chunks` attribute. This will show you the size of each chunk in each dimension." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25", + "metadata": {}, + "outputs": [], + "source": [ + "z.chunks" + ] + }, + { + "cell_type": "markdown", + "id": "26", + "metadata": {}, + "source": [ + "When selecting chunk shapes, we need to keep in mind two constraints:\n", + "\n", + "- Concurrent writes are possible as long as different processes write to separate chunks, enabling highly parallel data writing. \n", + "- When reading data, if any piece of the chunk is needed, the entire chunk has to be loaded. \n", + "\n", + "The optimal chunk shape will depend on how you want to access the data. E.g., for a 2-dimensional array, if you only ever take slices along the first dimension, then chunk across the second dimension.\n", + "\n", + "Here we will compare two different chunking strategies.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27", + "metadata": {}, + "outputs": [], + "source": [ + "output = datadir / \"c.zarr\"\n", + "c = zarr.create_array(shape=(200, 200, 200), chunks=(1, 200, 200), dtype=\"f8\", store=output)\n", + "c[:] = np.random.randn(*c.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28", + "metadata": {}, + "outputs": [], + "source": [ + "%time _ = c[:, 0, 0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29", + "metadata": {}, + "outputs": [], + "source": [ + "output = datadir / \"d.zarr\"\n", + "d = zarr.create_array(shape=(200, 200, 200), chunks=(200, 200, 1), dtype=\"f8\", store=output)\n", + "d[:] = np.random.randn(*d.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "30", + "metadata": {}, + "outputs": [], + "source": [ + "%time _ = d[:, 0, 0]" + ] + }, + { + "cell_type": "markdown", + "id": "31", + "metadata": {}, + "source": [ + "### Sharding\n", + "When working with large arrays and small chunks, Zarr’s sharding feature can improve storage efficiency and performance. Instead of writing each chunk to a separate file—which can overwhelm file systems and cloud object stores—sharding groups multiple chunks into a single storage object.\n", + "\n", + "Why Use Sharding?\n", + "\n", + "- File systems struggle with too many small files.\n", + "- Small files (e.g., 1 MB or less) may waste space due to filesystem block size.\n", + "- Object storage systems (e.g., S3) can slow down with a high number of objects.\n", + "\n", + "With sharding, you choose:\n", + "- Shard size: the logical shape of each shard, which is expected to include one or more chunks\n", + "- Chunk size: the shape of each compressed chunk\n", + "\n", + "It is important to remember that the shard is the minimum unit of writing. This means that writers must be able to fit the entire shard (including all of the compressed chunks) in memory before writing a shard to a store.\n" + ] + }, + { + "cell_type": "markdown", + "id": "32", + "metadata": {}, + "source": [ + "This example shows how to create a sharded Zarr array with a chunk size of `(100, 100, 100)` and a shard size of `(1000, 1000, 1000)`. This means that each shard will contain 10 chunks, and each chunk will be of size `(100, 100, 100)`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33", + "metadata": {}, + "outputs": [], + "source": [ + "z6 = zarr.create_array(\n", + " store={},\n", + " shape=(10000, 10000, 1000),\n", + " chunks=(100, 100, 100),\n", + " shards=(1000, 1000, 1000),\n", + " dtype=\"uint8\",\n", + ")\n", + "\n", + "z6.info" + ] + }, + { + "cell_type": "markdown", + "id": "34", + "metadata": {}, + "source": [ + "\n", + "```{tip}\n", + "Choose shard and chunk sizes that balance I/O performance and manageability for your filesystem or cloud backend.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "35", + "metadata": {}, + "source": [ + "#### Compressors\n", + "A number of different compressors can be used with Zarr. The built-in options include Blosc, Zstandard, and Gzip. Additional compressors are available through the [NumCodecs](https://numcodecs.readthedocs.io) package, which supports LZ4, Zlib, BZ2, and LZMA. \n", + "\n", + "Let's check the compressor we used when creating the array:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36", + "metadata": {}, + "outputs": [], + "source": [ + "z.compressors" + ] + }, + { + "cell_type": "markdown", + "id": "37", + "metadata": {}, + "source": [ + "If you don’t specify a compressor, by default Zarr uses the Zstandard compressor." + ] + }, + { + "cell_type": "markdown", + "id": "38", + "metadata": {}, + "source": [ + "How much space was saved by compression?\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39", + "metadata": {}, + "outputs": [], + "source": [ + "z.info_complete()" + ] + }, + { + "cell_type": "markdown", + "id": "40", + "metadata": {}, + "source": [ + "You can set `compression=None` when creating a Zarr array to turn off compression. This is useful for debugging or when you want to store data without compression." + ] + }, + { + "cell_type": "markdown", + "id": "41", + "metadata": {}, + "source": [ + "```{note}\n", + "`.info_complete()` provides a more detailed view of the Zarr array, including metadata about the chunks, compressors, and attributes, but will be slower for larger arrays. \n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "42", + "metadata": {}, + "source": [ + "#### Consolidated Metadata\n", + "Zarr supports consolidated metadata, which allows you to store all metadata in a single file. This can improve performance when reading metadata, especially for large datasets.\n", + "\n", + "So far we have only been dealing in single array Zarr data stores. In this next example, we will create a zarr store with multiple arrays and then consolidate metadata. The speed up is significant when dealing in remote storage options, which we will see in the following example on accessing cloud storage." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43", + "metadata": {}, + "outputs": [], + "source": [ + "store = zarr.storage.MemoryStore()\n", + "group = zarr.create_group(store=store)\n", + "group.create_array(shape=(1,), name=\"a\", dtype=\"float64\")\n", + "group.create_array(shape=(2, 2), name=\"b\", dtype=\"float64\")\n", + "group.create_array(shape=(3, 3, 3), name=\"c\", dtype=\"float64\")\n", + "zarr.consolidate_metadata(store)" + ] + }, + { + "cell_type": "markdown", + "id": "44", + "metadata": {}, + "source": [ + "Now, if we open that group, the Group’s metadata has a zarr.core.group.ConsolidatedMetadata that can be used:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45", + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "from pprint import pprint\n", + "\n", + "consolidated = zarr.open_group(store=store)\n", + "consolidated_metadata = consolidated.metadata.consolidated_metadata.metadata\n", + "\n", + "pprint(dict(sorted(consolidated_metadata.items())))" + ] + }, + { + "cell_type": "markdown", + "id": "46", + "metadata": {}, + "source": [ + "Note that while Zarr-Python supports consolidated metadata for v2 and v3 formatted Zarr stores, it is not technically part of the specification (hence the warning above). \n", + "\n", + "⚠️ Use Caution When ⚠️\n", + "- **Stale or incomplete consolidated metadata**: If the dataset is updated but the consolidated metadata entrypoint isn't re-consolidated, readers may miss chunks or metadata. Always run zarr.consolidate_metadata() after changes.\n", + "- **Concurrent writes or multi-writer pipelines**: Consolidated metadata can lead to inconsistent reads if multiple processes write without coordination. Use with caution in dynamic or shared write environments.\n", + "- **Local filesystems or mixed toolchains**: On local storage, consolidation offers little benefit as hierarchy discovery is generally quite cheap. " + ] + }, + { + "cell_type": "markdown", + "id": "47", + "metadata": {}, + "source": [ + "### Object Storage as a Zarr Store\n", + "\n", + "Zarr’s layout (many files/chunks per array) maps perfectly onto object storage, such as Amazon S3, Google Cloud Storage, or Azure Blob Storage. Each chunk is stored as a separate object, enabling distributed reads/writes.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "48", + "metadata": {}, + "source": [ + "Here are some examples of Zarr stores on the cloud:\n", + "\n", + "* [Zarr data in Microsoft's Planetary Computer](https://planetarycomputer.microsoft.com/catalog?filter=zarr)\n", + "* [Zarr data from Google](https://console.cloud.google.com/marketplace/browse?filter=solution-type:dataset&_ga=2.226354714.1000882083.1692116148-1788942020.1692116148&pli=1&q=zarr)\n", + "* [Amazon Sustainability Data Initiative available from Registry of Open Data on AWS](https://registry.opendata.aws/collab/asdi/) - Enter \"Zarr\" in the Search input box.\n", + "* [Pangeo-Forge Data Catalog](https://pangeo-forge.org/catalog)\n" + ] + }, + { + "cell_type": "markdown", + "id": "49", + "metadata": {}, + "source": [ + "### Xarray and Zarr\n", + "\n", + "Xarray has built-in support for reading and writing Zarr data. You can use the `xarray.open_zarr()` function to open a Zarr store as an Xarray dataset.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50", + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr\n", + "\n", + "store = \"https://ncsa.osn.xsede.org/Pangeo/pangeo-forge/gpcp-feedstock/gpcp.zarr\"\n", + "\n", + "ds = xr.open_dataset(store, engine=\"zarr\", chunks={}, consolidated=True)\n", + "ds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "51", + "metadata": {}, + "outputs": [], + "source": [ + "ds.precip" + ] + }, + { + "cell_type": "markdown", + "id": "52", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Can you calculate the mean precipitation for January 2020 in the GPCP dataset and plot it?\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "ds.precip.sel(time=slice('2020-01-01', '2020-01-31')).mean(dim='time').plot()\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "id": "53", + "metadata": {}, + "source": [ + "Check out our other [tutorial notebook]() that highlights the CMIP6 Zarr dataset stored in the Cloud\n", + "\n", + "## Additional Resources\n", + "\n", + "- [Zarr Documentation](https://zarr.readthedocs.io/en/stable/)\n", + "- [Cloud Optimized Geospatial Formats](https://guide.cloudnativegeo.org/zarr/zarr-in-practice.html)\n", + "- [Scalable and Computationally Reproducible Approaches to Arctic Research](https://learning.nceas.ucsb.edu/2025-04-arctic/sections/zarr.html)\n", + "- [Zarr Cloud Native Geospatial Tutorial](https://github.com/zarr-developers/tutorials/blob/main/zarr_cloud_native_geospatial_2022.ipynb)" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/intermediate/remote_data/cmip6-cloud.ipynb b/intermediate/remote_data/cmip6-cloud.ipynb new file mode 100644 index 00000000..fa27ff7f --- /dev/null +++ b/intermediate/remote_data/cmip6-cloud.ipynb @@ -0,0 +1,291 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "(cmip6-cloud)=\n", + "# Zarr in Cloud Object Storage\n", + "\n", + "In this tutorial, we'll cover the following:\n", + "- Finding a cloud hosted Zarr archive of CMIP6 dataset(s)\n", + "- Remote data access to a single CMIP6 dataset (sea surface height)\n", + "- Calculate future predicted sea level change in 2100 compared to 2015" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import xarray as xr" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "## Finding cloud native data\n", + "\n", + "Cloud-native data means data that is structured for efficient querying across the network.\n", + "Typically, this means having metadata that describes the entire file in the header of the\n", + "file, or having a a separate pointer file (so that there is no need to download everything first).\n", + "\n", + "Quite commonly, you'll see cloud-native datasets stored on these\n", + "three object storage providers, though there are many other ones too.\n", + "\n", + "- [Amazon Simple Storage Service (S3)](https://aws.amazon.com/s3)\n", + "- [Azure Blob Storage](https://azure.microsoft.com/en-us/services/storage/blobs)\n", + "- [Google Cloud Storage](https://cloud.google.com/storage)" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "### Getting cloud hosted CMIP6 data\n", + "\n", + "The [Coupled Model Intercomparison Project Phase 6 (CMIP6)](https://en.wikipedia.org/wiki/CMIP6#CMIP_Phase_6)\n", + "dataset is a rich archive of modelling experiments carried out to predict the climate change impacts.\n", + "The datasets are stored using the [Zarr](https://zarr.dev) format, and we'll go over how to access it.\n", + "\n", + "Sources:\n", + "- https://esgf-node.llnl.gov/search/cmip6/\n", + "- CMIP6 data hosted on Google Cloud - https://console.cloud.google.com/marketplace/details/noaa-public/cmip6\n", + "- Pangeo/ESGF Cloud Data Access tutorial - https://pangeo-data.github.io/pangeo-cmip6-cloud/accessing_data.html" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "First, let's open a CSV containing the list of CMIP6 datasets available" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv(\"https://cmip6.storage.googleapis.com/pangeo-cmip6.csv\")\n", + "print(f\"Number of rows: {len(df)}\")\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "Over 5 million rows! Let's filter it down to the variable and experiment\n", + "we're interested in, e.g. sea surface height.\n", + "\n", + "For the `variable_id`, you can look it up given some keyword at\n", + "https://docs.google.com/spreadsheets/d/1UUtoz6Ofyjlpx5LdqhKcwHFz2SGoTQV2_yekHyMfL9Y\n", + "\n", + "For the `experiment_id`, download the spreadsheet from\n", + "https://github.com/ES-DOC/esdoc-docs/blob/master/cmip6/experiments/spreadsheet/experiments.xlsx,\n", + "go to the 'experiment' tab, and find the one you're interested in.\n", + "\n", + "Another good place to find the right model runs is https://esgf-node.llnl.gov/search/cmip6\n", + "(once you get your head around the acronyms and short names)." + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "Below, we'll filter to CMIP6 experiments matching:\n", + "- Sea Surface Height Above Geoid [m] (variable_id: `zos`)\n", + "- Shared Socioeconomic Pathway 5 (experiment_id: `ssp585`)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "df_zos = df.query(\"variable_id == 'zos' & experiment_id == 'ssp585'\")\n", + "df_zos" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "There's 272 modelled scenarios for SSP5.\n", + "Let's just get the URL to the first one in the list for now." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "print(df_zos.zstore.iloc[0])" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "## Reading from the remote Zarr storage" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "If Zarr-python is version 3 or greater, we can simply pass URIs to Zarr Stores to `xr.open_zarr`. Note that anonymous access is used by default." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.open_zarr(\n", + " \"gs://cmip6/CMIP6/ScenarioMIP/NOAA-GFDL/GFDL-ESM4/ssp585/r1i1p1f1/Omon/zos/gn/v20180701/\",\n", + " consolidated=True,\n", + ")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "14", + "metadata": {}, + "source": [ + "### Selecting time slices\n", + "\n", + "Let's say we want to calculate sea level change between\n", + "2015 and 2100. We can access just the specific time points\n", + "needed using [`xr.Dataset.sel`](https://docs.xarray.dev/en/stable/generated/xarray.Dataset.sel.html)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "zos_2015jan = ds.zos.sel(time=\"2015-01-16\").squeeze()\n", + "zos_2100dec = ds.zos.sel(time=\"2100-12-16\").squeeze()" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": {}, + "source": [ + "Sea level change would just be 2100 minus 2015." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "sealevelchange = zos_2100dec - zos_2015jan" + ] + }, + { + "cell_type": "markdown", + "id": "18", + "metadata": {}, + "source": [ + "Note that up to this point, we have not actually downloaded any\n", + "(big) data yet from the cloud. This is all working based on\n", + "metadata only.\n", + "\n", + "To bring the data from the cloud to your local computer, call `.compute`.\n", + "This will take a while depending on your connection speed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19", + "metadata": {}, + "outputs": [], + "source": [ + "sealevelchange = sealevelchange.compute()" + ] + }, + { + "cell_type": "markdown", + "id": "20", + "metadata": {}, + "source": [ + "We can do a quick plot to show how Sea Level is predicted to change\n", + "between 2015-2100 (from one modelled experiment)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "sealevelchange.plot.imshow()" + ] + }, + { + "cell_type": "markdown", + "id": "22", + "metadata": {}, + "source": [ + "Notice the blue parts between -40 and -60 South where sea level has dropped?\n", + "That's to do with the Antarctic ice sheet losing mass and resulting in a lower\n", + "gravitational pull, resulting in a relative decrease in sea level. Over most\n", + "of the Northern Hemisphere though, sea level rise has increased between 2015 and 2100." + ] + }, + { + "cell_type": "markdown", + "id": "23", + "metadata": {}, + "source": [ + "That's all! Hopefully this will get you started on accessing more cloud-native datasets!" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/intermediate/remote_data/index.md b/intermediate/remote_data/index.md new file mode 100644 index 00000000..a6110848 --- /dev/null +++ b/intermediate/remote_data/index.md @@ -0,0 +1,5 @@ +# Remote Data + +```{tableofcontents} + +``` diff --git a/intermediate/remote_data/remote-data.ipynb b/intermediate/remote_data/remote-data.ipynb new file mode 100644 index 00000000..df1f0952 --- /dev/null +++ b/intermediate/remote_data/remote-data.ipynb @@ -0,0 +1,377 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Access Patterns to Remote Data with *fsspec*\n", + "\n", + "Accessing remote data with xarray usually means working with cloud-optimized formats like Zarr or COGs, the [CMIP6 tutorial](remote-data.ipynb) shows this pattern in detail. These formats were designed to be efficiently accessed over the internet, however in many cases we might need to access data that is not available in such formats.\n", + "\n", + "This notebook will explore how we can leverage xarray's backends to access remote files. For this we will make use of [`fsspec`](https://github.com/fsspec/filesystem_spec), a powerful Python library that abstracts the internal implementation of remote storage systems into a uniform API that can be used by many file-format specific libraries.\n", + "\n", + "Before starting with remote data, it may be helpful to understand how xarray handles local files and how xarray backends work. The following diagram shows the different components involved in accessing data either locally or remote using the `h5netcdf` backend which uses a format specific library to access HDF5 files.\n", + "\n", + "![xarray-access(3)](https://gist.github.com/assets/717735/3c3c6801-11ed-43a4-98ea-636b7dd612d8)\n", + "\n", + "Let's consider a scenario where we have a local NetCDF4 file containing gridded data. NetCDF is a common file format used in scientific research for storing array-like data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr\n", + "\n", + "localPath = \"../../data/sst.mnmean.nc\"\n", + "\n", + "ds = xr.open_dataset(localPath)\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "## xarray backends under the hood\n", + "\n", + "* What happened when we ran `xr.open_dataset(\"path-to-file\")`?\n", + "\n", + "As we know xarray is a very flexible and modular library. When we open a file, we are asking xarray to use one of its format specific engines to get the actual array data from the file into memory. File formats come in different flavors, from general purpose HDF5 to the very domain-specific ones like GRIB2. When we call `open_dataset()` the first thing xarray does is try to guess which of the preinstalled backends can handle this file, in this case we pass a string with a valid local path.\n", + "\n", + "We'll use a helper function to print a simplified call stack and see what's going on under the hood.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "\n", + "from IPython.display import Code\n", + "\n", + "tracing_output = []\n", + "_match_pattern = \"xarray\"\n", + "\n", + "\n", + "def trace_calls(frame, event, arg):\n", + " if event == \"call\":\n", + " code = frame.f_code\n", + " func_name = code.co_name\n", + " func_file = code.co_filename.split(\"/site-packages/\")[-1]\n", + " func_line = code.co_firstlineno\n", + " if not func_name.startswith(\"_\") and _match_pattern in func_file:\n", + " tracing_output.append(f\"def {func_name}() at {func_file}:{func_line}\")\n", + " return trace_calls\n", + "\n", + "\n", + "# we enable tracing and call open_dataset()\n", + "sys.settrace(trace_calls)\n", + "ds = xr.open_dataset(localPath)\n", + "sys.settrace(None)\n", + "\n", + "# Print the trace with some syntax highlighting\n", + "Code(\" \\n\".join(tracing_output[0:10]), language=\"python\")" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "### **What are we seeing?** \n", + "\n", + "* xarray uses `guess_engine()` to identify which backend can open the file.\n", + "* `guess_engine()` will loop through the preinstalled backends and will run `guess_can_open()`.\n", + "* if an engine can handle the file type it will verify that we are working with a local file.\n", + "* Once that we know which backend we'll use we invoke that backend implementation of `open_dataset()`.\n", + "\n", + "Let's tell xarray which backend we need for our local file. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "tracing_output = []\n", + "\n", + "sys.settrace(trace_calls)\n", + "ds = xr.open_dataset(localPath, engine=\"h5netcdf\")\n", + "sys.settrace(None)\n", + "\n", + "# Print the top 10 calls to public methods\n", + "Code(\" \\n\".join(tracing_output[0:10]), language=\"python\")" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "> It is important to note that there are overlaps between the pre-installed backends in xarray. Many of these backends support the same formats (e.g., NetCDF-4), and xarray uses them in a specific order unless a particular backend is specified. For example, when we request the h5netcdf engine, xarray will not attempt to guess the backend. However, it will still check if the URI is remote, which will involve some calls to a context manager. By examining the call stack, we can observe the use of a file handler and a cache, which are crucial for efficiently accessing remote files." + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "### Supported file formats by backend\n", + "\n", + "The `open_dataset()` method is our entry point to n-dimensional data with xarray, the first argument we pass indicates what we want to open and is used by xarray to get the right backend and in turn is used by the backend to open the file locally or remote. The accepted types by xarray are:\n", + "\n", + "\n", + "* **str**: `my-file.nc` or `s3:://my-zarr-store/data.zarr`\n", + "* **os.PathLike**: Posix compatible path, most of the times is a Pathlib cross-OS compatible path.\n", + "* **BufferedIOBase**: some xarray backends can read data from a buffer, this is key for remote access.\n", + "* **AbstractDataStore**: This one is the generic store and backends should subclass it, if we do we can pass a \"store\" to xarray like in the case of Opendap/Pydap\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "# Listing which backends we have available, if we install more they should show up here.\n", + "xr.backends.list_engines()" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "### Trying to access a file on cloud storage (AWS S3)\n", + "\n", + "Now let's try to open a file on a remote file system, this will fail and we'll take a look into why it failed and how we'll use fsspec to overcome this." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " ds = xr.open_dataset(\"s3://its-live-data/test-space/sample-data/sst.mnmean.nc\")\n", + "except Exception as e:\n", + " print(e)" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "xarray iterated through the registered backends and netcdf4 returned a `\"yes, I can open that extension\"` see: [netCDF4_.py#L618](https://github.com/pydata/xarray/blob/6c2d8c3389afe049ccbfd1393e9a81dd5c759f78/xarray/backends/netCDF4_.py#L618). However, **the backend doesn't know how to \"talk\" to a remote store** and thus it fails to open our file.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "## Supported format + Read from Buffers = Remote access \n", + "\n", + "Some of xarray's backends can read and write data to memory, this coupled with fsspec's ability to abstract remote files allows us to **access remote files as if they were local**. The following table helps us to identify if a backend can be used to access remote files with fsspec.\n", + "\n", + "\n", + "| Backend | HDF/NetCDF Support | Can Read from Buffer | Handles Own I/O |\n", + "|-----------------|--------------------|----------------------|-----------------|\n", + "| netCDF4 | Yes | No | Yes |\n", + "| scipy | Limited | Yes | Yes |\n", + "| pydap | Yes | No | No |\n", + "| h5netcdf | Yes | Yes | Yes |\n", + "| zarr | No | Yes | Yes |\n", + "| cfgrib | Yes | No | Yes |\n", + "| rasterio | Partial | Yes | No |\n", + "\n", + "\n", + "\n", + "**Can Read from Buffer**: Libraries that can read from buffers do not need to open a file using the operating system machinery and they allow the use of memory to open our files in whatever way we want as long as we have a seekable buffer (random access). \n", + "\n", + "**Handles Own I/O**: Some libraries have self contained code that can handle I/O, compression, codecs and data access. Some engines task their I/O to lower level libraries. This is the case with rasterio that uses GDAL to access raster files. If a Library is in control of its own I/O operations can be easily adapted to read from buffers.\n", + "\n", + "```{mermaid}\n", + "graph TD\n", + " A[\"netCDF-4 (.nc, .nc4) and most HDF5 files\"] -->|netcdf4| B[\"Remote Access: No\"]\n", + " A -->|h5netcdf| C[\"Remote Access: Yes\"]\n", + " \n", + " D[\"netCDF files (.nc, .cdf, .gz)\"] -->|scipy| E[\"Remote Access: Yes\"]\n", + " \n", + " F[\"zarr files (.zarr)\"] -->|zarr| G[\"Remote Access: Yes\"]\n", + "\n", + " H[\"OpenDAP\"] -->|pydap| I[\"Remote Access: Yes\"]\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "## Remote Access and File Caching\n", + "\n", + "When we use fsspec to abstract a remote file we are in essence translating byte requests to HTTP range requests over the internet. An HTTP request is a costly I/O operation compared to accessing a local file. Because of this, it's common that libraries that handle over the network data transfers implement a cache to avoid requesting the same data over and over. In the case of fsspec there are different ways to ask the library to handle this **caching and this is one of the most relevant performance considerations** when we work with xarray and remote data.\n", + "\n", + "fsspec default cache is called `read-ahead` and as its name suggests it will read ahead of our request a fixed amount of bytes, this is good when we are working with text or tabular data but it's really an anti pattern when we work with scientific data formats. Benchmarks show that any of the caching schemas will perform better than using the default `read-ahead`.\n", + "\n", + "### fsspec caching implementations.\n", + "\n", + "#### simple cache + `open_local()`\n", + "\n", + "The simplest way to use fsspec is to cache remote files locally. Since we are using a local storage for our cache, backends like `netcdf4` will be reading from disk avoiding the issue of not being able to read directly from buffers. This pattern can be applied to different backends that don't support buffers with the disadvantage that we'll be caching whole files and using disk space.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "import fsspec\n", + "\n", + "uri = \"https://its-live-data.s3-us-west-2.amazonaws.com/test-space/sample-data/sst.mnmean.nc\"\n", + "# we prepend the cache type to the URI, this is called protocol chaining in fsspec-speak\n", + "file = fsspec.open_local(f\"simplecache::{uri}\", simplecache={\"cache_storage\": \"/tmp/fsspec_cache\"})\n", + "\n", + "ds = xr.open_dataset(file, engine=\"netcdf4\")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "15", + "metadata": {}, + "source": [ + "#### block cache + `open()`\n", + "\n", + "If our backend support reading from a buffer we can cache only the parts of the file that we are reading, this is useful but tricky. As we mentioned before fsspec default cache will request an overhead of 5MB ahead of the byte offset we request, and if we are reading small chunks from our file it will be really slow and incur in unnecessary transfers.\n", + "\n", + "Let's open the same file but using the `h5netcdf` engine and we'll use a block cache strategy that stores predefined block sizes from our remote file.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "uri = \"https://its-live-data.s3-us-west-2.amazonaws.com/test-space/sample-data/sst.mnmean.nc\"\n", + "\n", + "fs = fsspec.filesystem(\"http\")\n", + "\n", + "fsspec_caching = {\n", + " \"cache_type\": \"blockcache\", # block cache stores blocks of fixed size and uses eviction using a LRU strategy.\n", + " \"block_size\": 8\n", + " * 1024\n", + " * 1024, # size in bytes per block, adjust depends on the file size but the recommended size is in the MB\n", + "}\n", + "\n", + "# Note that if we use a context, we'll close the file after the block so operations on xarray may fail if we don't load our data arrays.\n", + "with fs.open(uri, **fsspec_caching) as file:\n", + " ds = xr.open_dataset(file, engine=\"h5netcdf\")\n", + " mean = ds.sst.mean()\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "17", + "metadata": {}, + "source": [ + "### Reading data from cloud storage\n", + "\n", + "So far we have only used HTTP to access a remote file, however the commercial cloud has their own implementations with specific features. fsspec allows us to talk to different cloud storage implementations hiding these details from us and the libraries we use. Now we are going to access the same file using the S3 protocol. \n", + "\n", + "> Note: S3, Azure blob, etc all have their names and prefixes but under the hood they still work with the HTTP protocol.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "uri = \"s3://its-live-data/test-space/sample-data/sst.mnmean.nc\"\n", + "\n", + "# If we need to pass credentials to our remote storage we can do it here, in this case this is a public bucket\n", + "fs = fsspec.filesystem(\"s3\", anon=True)\n", + "\n", + "fsspec_caching = {\n", + " \"cache_type\": \"blockcache\", # block cache stores blocks of fixed size and uses eviction using a LRU strategy.\n", + " \"block_size\": 8\n", + " * 1024\n", + " * 1024, # size in bytes per block, adjust depends on the file size but the recommended size is in the MB\n", + "}\n", + "\n", + "# we are not using a context, we can use ds until we manually close it.\n", + "ds = xr.open_dataset(fs.open(uri, **fsspec_caching), engine=\"h5netcdf\")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "## Key Takeaways\n", + "\n", + "1. **fsspec and remote access.**\n", + "\n", + ">fsspec is a Python library that provides a unified interface to various filesystems, enabling access to local, remote, and cloud storage systems.\n", + "It supports a wide range of protocols such as http, https, s3, gcs, ftp, and many more.\n", + "One of the key features of fsspec is its ability to cache remote files locally, improving performance by reducing latency and bandwidth usage.\n", + "\n", + "2. **xarray Backends.**\n", + "\n", + ">xarray backends offers flexible support for opening datasets stored in different formats and locations.\n", + "By leveraging various backends along with fsspec we can open, read, and analyze complex datasets efficiently, without worrying about the underlying file format or storage mechanism.\n", + "\n", + "3. **Combining fsspec with xarray**\n", + "\n", + "> xarray can work with fsspec filesystems to open and cache remote files and use caching strategies to optimize its data transfer.\n", + "\n", + "\n", + "\n", + "By leveraging these tools and techniques, you can efficiently manage and process large, remote datasets in a way that optimizes performance and accessibility." + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/intermediate/storage_formats.ipynb b/intermediate/storage_formats.ipynb new file mode 100644 index 00000000..33b556c4 --- /dev/null +++ b/intermediate/storage_formats.ipynb @@ -0,0 +1,243 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Hierarchical storage formats\n", + "\n", + "In the fundamentals section we saw that xarray can read and write to a variety of storage formats. We have also seen that xarray's data model can include a hierarchy of groups as part of an `xarray.DataTree` object.\n", + "\n", + "The design of each format makes certain choices, and here we will compare the structure of common data formats to xarray's full data model, concentrating on subtle differences." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Xarray is not a file format\n", + "\n", + "You sometimes hear people say things like \"save it as an xarray\". This does not make sense, because xarray is not a file-format, it is an in-memory data structure. It's analogous to the difference between a CSV file and a `pandas.DataFrame`.\n", + "\n", + "Xarray data structures were inspired by scientific file formats (particularly netCDF), but are not intended to be identical to any of them. This helps xarray be a completely domain-agnostic tool. \n", + "\n", + "Xarray supports reading from and writing to a range of file formats, but as common file formats have differences in their design, xarray data structures cannot be exactly equivalent to all of them.\n", + "\n", + "Overall though this makes sense because the use case is different: in-memory data is for analysis, on-disk data is for persistent storage." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Groups everywhere\n", + "\n", + "Many storage formats for scientific data include some notion of \"groups\". \n", + "\n", + "The exact meaning of \"group\" differs between formats but are all ultimately motivated by a common recognition: that real scientific datasets often include related but otherwise heterogeneous data." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Zarr" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We'll start with Zarr, because it has the most simple type of hierarchical structure." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* **Tree of groups** – Tree of arbitrary groups.\n", + "\n", + "* **Separate groups** – No relationship enforced between groups, and no references from one group to another.\n", + "\n", + "* **Separate arrays** – No relationship enforced between arrays within a group.\n", + "\n", + "* **Arbitrary JSON metadata** – Each holds arbitrary data in the form of arrays + metadata." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![ZarrSpec](https://zarr-specs.readthedocs.io/en/latest/_images/terminology-hierarchy.excalidraw.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### How does zarr relate to `xarray`?\n", + "\n", + "* **Arrays <-> `Variables`** - zarr arrays map well to `xarray.Variables`\n", + " - Especially as zarr v3 includes (optional) `dimension_names`\n", + "\n", + "* **Groups <-> `Datasets`** - zarr groups map reasonably well to `xarray.Dataset` objects\n", + " - Open a single zarr group in xarray via `xr.open_dataset(store, group='/path', engine='zarr')`\n", + "\n", + "* **Groups must be alignable** - But `xarray.Dataset`s require that all arrays in the Dataset have aligned dimensions\n", + " - so it is possible to create a zarr group that is not a valid `xarray.Dataset`, if the group contains arrays with non-aligning dimensions\n", + "\n", + "* **No \"coordinates\"** – No arrays are special, so Zarr has no intrinsic concept of \"coordinate\" vs \"data\" variables.\n", + " - So xarray has to save this piece of information as an additional piece of zarr metadata.\n", + "\n", + "* **Tree of groups <-> `DataTree`** - zarr store has a tree of groups\n", + " - maps to either a set of independent `xarray.Datasets`\n", + " - `xr.open_groups(store)`\n", + " - or to a single `xarray.DataTree`\n", + " - `xr.open_datatree(store)`\n", + " - `xarray.DataTree` enforces alignment between coordinates in parents and child groups\n", + " - means that you could write two `xarray.Datasets` as separate zarr groups that cannot be opened as one `xarray.DataTree`\n", + " - coordinate inheritance also means that inherited coordinates are implicitly present on child groups in the `DataTree`, but not saved explicitly into each zarr group." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## HDF5\n", + "\n", + "HDF5 (Hierarchical Data Format, version 5) is a **general-purpose container** for large, heterogeneous, hierarchical data. It includes these core components:\n", + "\n", + "* **Groups** \n", + "\n", + " *Nodes* in a directed graph that starts at the root /. \n", + "\n", + " They behave like folders in a UNIX filesystem (absolute paths, /sub/group/dataset), and *may* form cycles or self-links—although most scientific tools avoid that complexity.\n", + "\n", + "\n", + "* **Datasets** \n", + "\n", + " Rectangular N-dimensional arrays stored inside groups. \n", + "\n", + " Each dimension can optionally carry a **dimension scale**, an auxiliary dataset that describes the coordinate values along that axis.\n", + "\n", + "* **Attributes** \n", + "\n", + " Small pieces of metadata (strings, scalars, short arrays) attached to the file, any group, or any dataset.\n", + "\n", + "* **Storage features** \n", + "\n", + " Chunking, compression, checksums, parallel I/O via MPI-IO, and more. \n", + "\n", + " These are orthogonal to the logical data model.\n", + "\n", + "## NetCDF4" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "NetCDF4 builds upon HDF5 - it is really an opinionated subset of HDF5. From the [netCDF documentation](https://docs.unidata.ucar.edu/nug/current/file_structure_and_performance.html#:~:text=(Note%20that%20modifying%20these%20files%20with%20HDF5%20will%20almost%20certainly%20make%20them%20unreadable%20to%20netCDF%2D4.)):\n", + "\n", + "> (Note that modifying these files with HDF5 will almost certainly make them unreadable to netCDF-4.)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### How does HDF5/netCDF4 relate to xarray?\n", + "\n", + "Generally very similar - not surprising as netCDF4 was the inspiration for xarray\n", + "\n", + "#### Similarities\n", + "- HDF groups can often be represented by groups in a `DataTree`\n", + "- Netcdf4 `Datasets` correspond to xarray `Datasets` (or to groups in the `DataTree`)\n", + "- NetCDF4 requires that every HDF5 dataset must have a dimension scale attached to each dimension.\n", + " - These end up working quite similarly to xarray's dimension coordinates\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Differences\n", + "- The group structure is not technically a tree - cycles and self-references are allowed in HDF5, unlike in `xarray.DataTree`.\n", + "HDF5 supports links between groups, but xarray does not\n", + " - (Note that this is consistent with UNIX filesystems, which support symbolic links between directories)\n", + "- NetCDF has an explicit concept of a dimension as a first-class object, which neither HDF5 nor xarray have\n", + " - means that e.g. a scalar variable can have a dimension in netCDF, but not in xarray" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## TIFF" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "TIFF (Tag Image File Format) is a raster container widely used in biosciences, remote sensing and GIS. \n", + "\n", + "A **GeoTIFF** is simply a TIFF that stores additional additional georeferencing information tags (CRS, affine transform, etc.) so geospatial software knows where each pixel sits on Earth. \n", + "\n", + "* **Images (“IFDs”)** – each “page” in a TIFF holds a 2-D array of pixels. \n", + "\n", + " Multi-band rasters (e.g. RGB, multi-spectral) appear as *separate* IFDs or as extra samples within one IFD.\n", + "\n", + "* **Tags** – key–value metadata pairs (datatype, compression, nodata value, CRS, resolution, etc.). \n", + " \n", + " GeoTIFF adds standardised tags like ModelPixelScaleTag, ModelTiepointTag, GeoKeyDirectoryTag.\n", + "\n", + "* **Compression / tiling** – DEFLATE, LZW, etc. Tiling lets software fetch small windows efficiently.\n", + "\n", + "* **Cloud-optimized GeoTIFF (COG)** – same format, arranged so HTTP range requests can stream windows efficiently; xarray handles it transparently when rasterio is compiled with libcurl." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### How does TIFF relate to xarray?\n", + "\n", + "* **Dimensionality** – Each raster image maps well to a single `xarray.Variable`, but TIFF is inherently 2-D per band; no native time or vertical axis. If you need 4-D data, NetCDF or Zarr is usually a better fit.\n", + "\n", + "* **No named dimensions** - TIFFs don't have named dimensions for the two axes of the raster.\n", + "\n", + "* **IFDs as groups** - IFDs can be mapped to groups, which may be useful for multi-resolution TIFFs (also known as \"overviews\") and multi-page TIFFs.\n", + "\n", + "* **Metadata depth** – single-level tags only (no nested groups). For rich hierarchies, stick to HDF5 / NetCDF-4.\n", + "\n", + "* **Read** – use `rioxarray.open_rasterio()` (wraps rasterio) to get an immediate, Dask-chunked DataArray. However `rioxarray` is for interacting with GeoTIFFs, not general TIFFs.\n", + "\n", + "* **Write** – `DataArray.rio.to_raster(\"out.tif\")`; choose compression + tiling via driver_kwargs." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Mapping storage formats to one another\n", + "\n", + "Note that while we have discussed mapping various file formats to the xarray data model, it is also possible to map different file formats to one another.\n", + "\n", + "For example, the [VirtualiZarr](https://github.com/zarr-developers/VirtualiZarr) library maps a range of file formats (including HDF5 and TIFF) to the Zarr data model, to allow reading data from those formats via the zarr-python API." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/intermediate/xarray_and_dask.ipynb b/intermediate/xarray_and_dask.ipynb new file mode 100644 index 00000000..aff1c790 --- /dev/null +++ b/intermediate/xarray_and_dask.ipynb @@ -0,0 +1,616 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Parallel computing with Dask\n", + "\n", + "This notebook demonstrates one of Xarray's most powerful features: the ability\n", + "to wrap [dask arrays](https://docs.dask.org/en/stable/array.html) and allow users to seamlessly execute analysis code in\n", + "parallel.\n", + "\n", + "By the end of this notebook, you will:\n", + "\n", + "1. Xarray DataArrays and Datasets are \"dask collections\" i.e. you can execute\n", + " top-level dask functions such as `dask.visualize(xarray_object)`\n", + "2. Learn that all xarray built-in operations can transparently use dask\n", + "\n", + "\n", + "```{important}\n", + "Using Dask does not always make your computations run faster!* \n", + "```\n", + "\n", + "Performance will depend on the computational infrastructure you're using (for example, how many CPU cores), how the data you're working with is structured and stored, and the algorithms and code you're running. Be sure to review the [Dask best-practices](https://docs.dask.org/en/stable/best-practices.html) if you're new to Dask!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What is Dask\n", + "\n", + "When we talk about Xarray + Dask, we are *usually* talking about two things:\n", + "1. `dask.array` as a drop-in replacement for numpy arrays\n", + "2. A \"scheduler\" that actually runs computations on dask arrays (commonly [distributed](https://docs.dask.org/en/stable/deploying.html))\n", + "\n", + "## Introduction to dask.array\n", + "\n", + "> Dask Array implements a subset of the NumPy ndarray interface using blocked algorithms, cutting up the large array into many small arrays (*blocks* or *chunks*). This lets us compute on arrays larger than memory using all of our cores. We coordinate these blocked algorithms using Dask graphs.\n", + "\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import dask\n", + "import dask.array\n", + "\n", + "dasky = dask.array.ones((10, 5), chunks=(2, 2))\n", + "dasky" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Why dask.array\n", + "\n", + "1. Use parallel resources to speed up computation\n", + "2. Work with datasets bigger than RAM (\"out-of-core\")\n", + " > \"dask lets you scale from memory-sized datasets to disk-sized datasets\"\n", + "\n", + "### dask is lazy\n", + "\n", + "Operations are not computed until you explicitly request them. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dasky.mean(axis=-1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So what did dask do when you called `.mean`? It added that operation to the \"graph\" or a blueprint of operations to execute later." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dask.visualize(dasky.mean(axis=-1))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dasky.mean(axis=-1).compute()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### More\n", + "\n", + "See the [dask.array tutorial](https://tutorial.dask.org/02_array.html)\n", + "\n", + "\n", + "### Dask + Xarray\n", + "\n", + "Remember that Xarray can wrap many different array types. So Xarray can wrap dask arrays too. \n", + "\n", + "We use Xarray to enable using our metadata to express our analysis." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "\n", + "## Creating dask-backed Xarray objects\n", + "\n", + "The `chunks` argument to both `open_dataset` and `open_mfdataset` allow you to\n", + "read datasets as dask arrays. \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%xmode minimal\n", + "\n", + "import numpy as np\n", + "import xarray as xr\n", + "\n", + "# limit the amount of information printed to screen\n", + "xr.set_options(display_expand_data=False)\n", + "np.set_printoptions(threshold=10, edgeitems=2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.open_dataset(\"air_temperature\")\n", + "ds.air" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.open_dataset(\n", + " \"air_temperature\",\n", + " chunks={ # this tells xarray to open the dataset as a dask array\n", + " \"lat\": \"auto\",\n", + " \"lon\": 25,\n", + " \"time\": -1,\n", + " },\n", + ")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The representation (\"repr\" in Python parlance) for the `air` DataArray shows the very nice HTML dask array repr. You can access the underlying chunk sizes using `.chunks`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.chunks" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{tip}\n", + "All variables in a `Dataset` need _not_ have the same chunk size along\n", + "common dimensions.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extracting underlying data\n", + "\n", + "There are two ways to pull out the underlying array object in an xarray object.\n", + "\n", + "1. `.to_numpy` or `.values` will always return a NumPy array. For dask-backed xarray objects,\n", + " this means that compute will always be called\n", + "2. `.data` will return a Dask array\n", + "\n", + "```{tip}\n", + "Use `to_numpy` or `as_numpy` instead of `.values` so that your code generalizes to other array types (like CuPy arrays, sparse arrays)\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.data # dask array, not numpy" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ds.air.as_numpy().data ## numpy array" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "Try calling `ds.air.values` and `ds.air.data`. Do you understand the difference?\n", + "::::" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# use this cell for the exercise" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ds.air.to_numpy()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "\n", + "\n", + "## Lazy computation \n", + "\n", + "Xarray seamlessly wraps dask so all computation is deferred until explicitly\n", + "requested." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mean = ds.air.mean(\"time\")\n", + "mean" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Dask actually constructs a graph of the required computation. Here it's pretty simple: The full array is subdivided into 3 arrays. Dask will load each of these subarrays in a separate thread using the default [single-machine scheduling](https://docs.dask.org/en/stable/scheduling.html). You can visualize dask 'task graphs' which represent the requested computation:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "mean.data # dask array" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# visualize the graph for the underlying dask array\n", + "# we ask it to visualize the graph from left to right because it looks nicer\n", + "dask.visualize(mean.data, rankdir=\"LR\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [], + "toc-hr-collapsed": true + }, + "source": [ + "## Getting concrete values\n", + "\n", + "At some point, you will want to actually get concrete values (_usually_ a numpy array) from dask.\n", + "\n", + "There are two ways to compute values on dask arrays.\n", + "\n", + "1. `.compute()` returns an xarray object *just like a dask array*\n", + "2. `.load()` replaces the dask array in the xarray object with a numpy array.\n", + " This is equivalent to `ds = ds.compute()`\n", + " \n", + "```{tip}\n", + "There is a third option : \"persisting\". `.persist()` loads the values into distributed RAM. The values are computed but remain distributed across workers. So `ds.air.persist()` still returns a dask array. This is useful if you will be repeatedly using a dataset for computation but it is too large to load into local memory. You will see a persistent task on the dashboard. See the [dask user guide](https://docs.dask.org/en/latest/api.html#dask.persist) for more on persisting\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Try running `mean.compute` and then examine `mean` after that. Is it still a dask array?\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "Computing returns a numpy array but does not modify in-place. So `mean` still contains a dask array.\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "\n", + "Now repeat that exercise with `mean.load`.\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "`load` modifies an Xarray object in-place so `mean` now contains a numpy array.\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Distributed Clusters" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As your data volumes grow and algorithms get more complex it can be hard to print out task graph representations and understand what Dask is doing behind the scenes. Luckily, you can use Dask's 'Distributed' scheduler to get very useful diagnotisic information.\n", + "\n", + "First let's set up a `LocalCluster` using [dask.distributed](https://distributed.dask.org/).\n", + "\n", + "You can use any kind of Dask cluster. This step is completely independent of\n", + "xarray. While not strictly necessary, the dashboard provides a nice learning\n", + "tool.\n", + "\n", + "By default, Dask uses the current working directory for writing temporary files.\n", + "We choose to use a temporary scratch folder `local_directory='/tmp'` in the example below instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "# This piece of code is just for a correct dashboard link mybinder.org or other JupyterHub demos\n", + "import dask\n", + "from dask.distributed import Client\n", + "\n", + "# if os.environ.get('JUPYTERHUB_USER'):\n", + "# dask.config.set(**{\"distributed.dashboard.link\": \"/user/{JUPYTERHUB_USER}/proxy/{port}/status\"})\n", + "\n", + "client = Client()\n", + "client" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "☝️ Click the Dashboard link above. \n", + "\n", + "👈 Or click the \"Search\" 🔍 button in the [dask-labextension](https://github.com/dask/dask-labextension) dashboard.\n", + "\n", + "```{note}\n", + "if using the dask-labextension, you should disable the 'Simple' JupyterLab interface (`View -> Simple Interface`), so that you can drag and rearrange whichever dashboards you want. The `Workers` and `Task Stream` are good to make sure the dashboard is working!\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import dask.array\n", + "\n", + "dask.array.ones((1000, 4), chunks=(2, 1)).compute() # should see activity in dashboard" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Computation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's go back to our xarray DataSet, in addition to computing the mean, other operations such as indexing will automatically use whichever Dask Cluster we are connected to!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.isel(lon=1, lat=20)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "and more complicated operations...\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rolling_mean = ds.air.rolling(time=5).mean() # no activity on dashboard\n", + "rolling_mean # contains dask array" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "timeseries = rolling_mean.isel(lon=1, lat=20) # no activity on dashboard\n", + "timeseries # contains dask array" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "computed = rolling_mean.compute() # activity on dashboard\n", + "computed # has real numpy values" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that `mean` still contains a dask array\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "rolling_mean" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{tip}\n", + "While these operations all work, not all of them are necessarily the optimal implementation for parallelism. Usually analysis pipelines need some tinkering and tweaking to get things to work. In particular read the user guidie recommendations for [chunking](https://docs.xarray.dev/en/stable/user-guide/dask.html#chunking-and-performance).\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Xarray data structures are first-class dask collections.\n", + "\n", + "This means you can do things like `dask.compute(xarray_object)`,\n", + "`dask.visualize(xarray_object)`, `dask.persist(xarray_object)`. This works for\n", + "both DataArrays and Datasets" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "jp-MarkdownHeadingCollapsed": true, + "tags": [] + }, + "source": [ + "::::{admonition} Exercise\n", + "Visualize the task graph for a few different computations on `ds.air`!\n", + "::::" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Use this cell for the exercise" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Finish up\n", + "Gracefully shutdown our connection to the Dask cluster. This becomes more important when you are running on large HPC or Cloud servers rather than a laptop!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "client.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Next\n", + "\n", + "\n", + "See the [Xarray user guide on dask](https://docs.xarray.dev/en/stable/user-guide/dask.html). " + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/intermediate/xarray_ecosystem.ipynb b/intermediate/xarray_ecosystem.ipynb new file mode 100644 index 00000000..d455b486 --- /dev/null +++ b/intermediate/xarray_ecosystem.ipynb @@ -0,0 +1,684 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# A Tour of Xarray Customizations\n", + "\n", + "Xarray is easily extensible.\n", + "This means it is easy to add on to to build custom packages that tackle particular computational problems or supply domain specific functionality.\n", + "\n", + "These packages can plug in to xarray in various different ways. They may build directly on top of xarray, or they may take advantage of some of xarray's dedicated interfacing features:\n", + "- Accessors (extensions)\n", + "- Backend (filetype) entrypoint\n", + "- Metadata attributes\n", + "- Duck-array wrapping interface\n", + "- Flexible indexes (coming soon!)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we introduce several popular or interesting extensions that are installable as their own packages (via conda and pip). These packages integrate with xarray using one or more of the features mentioned above.\n", + "\n", + "- [hvplot](https://hvplot.holoviz.org/), a powerful interactive plotting library\n", + "- [rioxarray](https://corteva.github.io/rioxarray/stable/index.html), for working with geospatial raster data using rasterio\n", + "- [cf-xarray](https://cf-xarray.readthedocs.io/en/latest/), for interpreting CF-compliant data\n", + "- [pint-xarray](https://pint-xarray.readthedocs.io/en/latest/), for unit-aware computations using pint." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Specific examples for implementing your own xarray customizations using these interfacing features are available in the ADVANCED section of this book." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import xarray as xr" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Quick note on accessors" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "Before we look at the packages we need to briefly introduce a feature they commonly use: [\"xarray accessors\"](https://docs.xarray.dev/en/stable/internals/extending-xarray.html).\n", + "\n", + "The accessor-style syntax is used heavily by the other libraries we are about to cover.\n", + "\n", + "For users, accessors just allow us to have a familiar dot (method-like) syntax on xarray objects, for example `da.hvplot()`, `da.pint.quantify()`, or `da.cf.describe()`.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## hvplot via accessors" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The [HoloViews library](https://holoviews.org/) makes great use of accessors to allow seamless plotting of xarray data using a completely different plotting backend (by default, xarray uses [matplotlib](https://matplotlib.org/))." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We first need to import the code that registers the hvplot accessor" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import hvplot.xarray" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And now we can call the `.hvplot` method to plot using holoviews in the same way that we would have used `.plot` to plot using matplotlib." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.tutorial.load_dataset(\"air_temperature\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds[\"air\"].isel(time=1).hvplot(cmap=\"fire\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For some more examples of how powerful HoloViews is [see here](https://tutorial.xarray.dev/intermediate/hvplot.html)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Rioxarray via the backend entrypoint\n", + "\n", + "[Rioxarray](https://corteva.github.io/rioxarray/stable/index.html) is a Python library that enhances Xarray's ability to work with geospatial data and coordinate reference systems. Geographic information systems use GeoTIFF and [many other formats](https://gdal.org/drivers/raster/index.html) to organize and store gridded, or *raster*, datasets. \n", + "\n", + "The Geospatial Data Abstraction Library ([GDAL](https://gdal.org)) provides foundational drivers and geospatial algorithms, and the [rasterio](https://rasterio.readthedocs.io/en/latest) library provides a Pythonic interface to GDAL. `Rioxarray` brings key features of rasterio to Xarray:\n", + "\n", + "1. A backend *engine* to read any format recognized by *GDAL*\n", + "1. A `.rio` *accessor* for *rasterio's* geospatial algorithms such as reprojection\n", + "\n", + "Below a couple brief examples to illustrate these features:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import rioxarray # ensure you have rioxarray installed in your environment" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can explicitly use rioxarray's 'rasterio' engine to load myriad geospatial raster formats. Below is a [Cloud-Optimized Geotiff](https://www.cogeo.org) from an AWS [public dataset](https://registry.opendata.aws/sentinel-1-rtc-indigo/) of synthetic aperture radar data over Washington, State, USA. `overview_level=4` is an argument specific to the `rasterio` engine that allows opening a pre-computed lower resolution \"overview\" of the data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "url = \"https://sentinel-s1-rtc-indigo.s3.us-west-2.amazonaws.com/tiles/RTC/1/IW/10/U/CU/2017/S1A_20170101_10UCU_ASC/Gamma0_VV.tif\"\n", + "da = xr.open_dataarray(url, engine=\"rasterio\", open_kwargs={\"overview_level\": 2})\n", + "da" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `spatial_ref` coordinate is added by rioxarray to store standardized geospatial Coordinate Reference System (CRS) information. We can access that information and additional methods via the `.rio` accessor:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da.rio.crs" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "EPSG refers to 'European Petroleum Survey Group', a database of the many CRS definitions for our Planet used over the years! EPSG=32610 is the [\"UTM 10N\" CRS](https://epsg.io/32610), with coordinate units in meters. Let's say you want longitude,latitude coordinate points in degrees instead. You'd have to *reproject* this data:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da_lonlat = da.rio.reproject(\"epsg:4326\")\n", + "da_lonlat" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that that the size of the data has changed as well as the coordinate values. This is typical of reprojection, as your data must be resampled and often interpolated to match the new CRS grid! A quick plot will compare the results of our reprojected data:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import panel as pn\n", + "\n", + "img1 = da.sel(band=1).hvplot.image(\n", + " x=\"x\", y=\"y\", rasterize=True, cmap=\"gray\", clim=(0, 0.5), title=\"UTM\"\n", + ")\n", + "img2 = da_lonlat.sel(band=1).hvplot.image(\n", + " rasterize=True, cmap=\"gray\", clim=(0, 0.5), title=\"LON/LAT\"\n", + ")\n", + "\n", + "pn.Column(img1, img2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## cf-xarray via metadata attributes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Xarray objects can store [arbitrary metadata](https://docs.xarray.dev/en/stable/get-help/faq.html#what-is-your-approach-to-metadata) in the form of a `dict` attached to each `DataArray` and `Dataset` object, accessible via the `.attrs` property." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "xr.DataArray(name=\"Hitchhiker\", data=0, attrs={\"life\": 42, \"name\": \"Arthur Dent\"})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Normally xarray operations ignore this metadata, simply carting it around until you explicitly choose to use it. However sometimes we might want to write custom code which makes use of the metadata." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[cf_xarray](https://cf-xarray.readthedocs.io/) is a project that tries to\n", + "let you make use of other [Climate and Forecast metadata convention attributes](http://cfconventions.org/) (or \"CF attributes\") that xarray ignores. It attaches itself\n", + "to all xarray objects under the `.cf` namespace.\n", + "\n", + "Where xarray allows you to specify dimension names for analysis, `cf_xarray`\n", + "lets you specify logical names like `\"latitude\"` or `\"longitude\"` instead as\n", + "long as the appropriate CF attributes are set.\n", + "\n", + "For example, the `\"longitude\"` dimension in different files might be labelled as: (lon, LON, long, x…), but cf_xarray let's you always refer to the logical name `\"longitude\"` in your code:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import cf_xarray" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# describe cf attributes in dataset\n", + "ds.air.cf.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following `mean` operation will work with any dataset that has appropriate\n", + "attributes set that allow detection of the \"latitude\" variable (e.g.\n", + "`units: \"degress_north\"` or `standard_name: \"latitude\"`)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate equivalent of .mean(\"lat\")\n", + "ds.air.cf.mean(\"latitude\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate indexing\n", + "ds.air.cf.sel(longitude=242.5, method=\"nearest\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pint via duck array wrapping" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Why use pint" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Pint](https://pint.readthedocs.io/en/stable/) defines physical units, allowing you to work with numpy-like arrays which track the units of your values through computations." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pint defines a numpy-like array class called `pint.Quantity`, which is made up of a numpy array and a `pint.Unit` instance." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from pint import Unit\n", + "\n", + "# you can create a pint.Quantity by multiplying a value by a pint.Unit\n", + "d = np.array(10) * Unit(\"metres\")\n", + "d" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "These units are automatically propagated through operations" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t = 1 * Unit(\"seconds\")\n", + "v = d / t\n", + "v" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or if the operation involves inconsistent units, a `pint.DimensionalityError` is raised." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "d + t" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### pint inside xarray objects" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We have already seen that xarray can wrap numpy arrays or dask arrays, but in fact xarray can wrap any type of array that behaves similarly to a numpy array.\n", + "Using this feature we can store a `pint.Quantity` array inside an xarray DataArray" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da = xr.DataArray(d)\n", + "da" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the data type stored within the DataArray is a `Quantity` object, rather than just a `np.ndarray` object, and the units of the data are displayed in the repr." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The reason this works is that a `pint.Quantity` array is what we call a \"duck array\", in that it behaves so similarly to a `numpy.ndarray` that xarray can treat them the same way. (See [python duck typing](https://realpython.com/duck-typing-python/))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### pint-xarray" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The convenience package [pint-xarray](https://pint-xarray.readthedocs.io/en/latest/index.html) makes it easier to get the benefits of pint whilst working with xarray objects.\n", + "\n", + "It provides utility accessor methods for promoting xarray data to pint quantities (which we call \"quantifying\") in various ways and for manipulating the resulting objects." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# to be able to read unit attributes following the CF conventions\n", + "import cf_xarray.units\n", + "import pint_xarray\n", + "\n", + "xr.set_options(display_expand_data=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "pint-xarray provides the `.pint` accessor, which firstly allows us to easily extract the units of our data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da.pint.units" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `.pint.quantify()` accessor gives us various ways to convert normal xarray data to be unit-aware." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{note}\n", + "It is preferred to use `.pint.quantify()` to convert xarray data to use pint rather than explicitly creating a `pint.Quantity` array and placing it inside the xarray object, because pint-xarray will handle various subtleties involving dask etc.\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can explicitly specify the units we want" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da = xr.DataArray([4.5, 6.7, 3.8], dims=\"time\")\n", + "da.pint.quantify(\"V\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or if the data has a \"units\" entry in its `.attrs` metadata dictionary, we can automatically use that to convert each variable.\n", + "\n", + "For example, the xarray tutorial dataset we opened earlier has units in its attributes" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.attrs[\"units\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "which we can automatically read with `.pint.quantify()`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "quantified_air = ds.pint.quantify()\n", + "quantified_air" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we have actually gone even further, and used cf-xarray to automatically interpret cf-compliant units in the `.attrs` to valid pint units.\n", + "This automatically happened just as a result of importing cf-xarray above." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "When we plot quantified data with xarray the correct units will automatically appear on the plot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "quantified_air[\"air\"].isel(time=500).plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we want to cast the pint arrays back to numpy arrays, we can use `.pint.dequantify()`, which will also write the current units back out to the `.attrs[\"units\"]` field" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "quantified_air.pint.dequantify()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + ":class: tip\n", + "Write a function which will raise a `pint.DimensionalityError` if supplied with Xarray DataArray with the wrong units.\n", + "\n", + "\n", + ":::{admonition} Solution\n", + ":class: dropdown\n", + "\n", + "```python\n", + "from pint import DimensionalityError\n", + "\n", + "\n", + "def special_science_function(distance):\n", + " if distance.pint.units != \"miles\":\n", + " raise DimensionalityError(\n", + " \"this function will only give the correct answer if the input is in units of miles\"\n", + " )\n", + "```\n", + ":::\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "::::{admonition} Exercise\n", + "Try this on some of your data!\n", + "\n", + "After you have imported pint-xarray (and maybe cf-xarray) as above, start with something like\n", + "\n", + "`ds = xr.open_dataset(my_data).pint.quantify()`\n", + "::::" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Take a look at the [pint-xarray documentation](https://pint-xarray.readthedocs.io/en/latest/) or the [pint documentation](https://pint.readthedocs.io/en/stable/) if you get stuck." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The wider world..." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There are many other libraries in the wider xarray ecosystem. For a list of a few packages we particularly like for geoscience work [see here](https://tutorial.xarray.dev/overview/xarray-in-45-min.html#other-cool-packages), and for a [more exhaustive list see here](https://docs.xarray.dev/en/stable/user-guide/ecosystem.html)." + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/intro.md b/intro.md new file mode 100644 index 00000000..3ca09db0 --- /dev/null +++ b/intro.md @@ -0,0 +1,47 @@ +# Welcome to the Xarray Tutorial! + +**[`Xarray`](https://xarray.dev) is an open source project and Python package that makes working with labelled multi-dimensional arrays simple, efficient, and fun!** + +📖 On this Jupyter Book website you'll find easy-to-run tutorial notebooks for Xarray. Whether you're new to Xarray or a seasoned user we hope you'll learn something new and get a head start on your own projects by exploring this material! + +````{grid} +:class-container: text-center +:gutter: 3 + +```{grid-item-card} +:link: overview/get-started +:link-type: doc +Get started! 🚀 +^^^ +Learn how to navigate the tutorials and run code examples interactively +``` + +```{grid-item-card} +:link: https://www.youtube.com/channel/UCBlxVSA6xQXeb-i4GgTlO7g +Watch videos 🎬 +^^^ +Live walk-throughs of this material and more on Xarray's YouTube Channel +``` + +```{grid-item-card} +:link: https://docs.xarray.dev/en/stable/get-help/help-diagram.html#help-flowchart +Get involved 🙋 +^^^ +Ask questions and participate in the Xarray community! +``` + +```` + +## Citation + +✏️ To cite this material, you can use the recommended [Xarray citation](https://docs.xarray.dev/en/stable/get-help/faq.html#how-should-i-cite-xarray): {cite:p}`hoyerhamman2017`, {cite:p}`xarray_v202230`. + +## Acknowledgements + +This website is the result of many contributions from the Xarray community! We're very grateful for everyone's volunteered effort as well as [sponsored development](https://xarray.dev/#sponsors). Funding for SciPy 2022, SciPy 2023 tutorial material development specifically was supported by NASA's Open Source Tools, Frameworks, and Libraries Program (award 80NSSC22K0345). + +## Bibliography + +```{bibliography} +:style: plain +``` diff --git a/overview/fundamental-path/README.md b/overview/fundamental-path/README.md new file mode 100644 index 00000000..c5435f9e --- /dev/null +++ b/overview/fundamental-path/README.md @@ -0,0 +1,57 @@ +(fundamental-path)= + +# Fundamental Path + +This syllabus comes from Scipy 2022 tutorial workshop. +This path covers fundamental Xarray concepts with +increasingly complex real-world data analysis tasks. + +The tutorial was organized by: + +- Scott Henderson (Univ. Washington) +- Deepak Cherian (National Center for Atmospheric Research) +- Jessica Scheick (Univ. New Hampshire) +- Emma Marshall (Univ. Utah) +- Anderson Banihirwe (CarbonPlan) +- Tom Nicholas (Lamont-Doherty Earth Observatory) + +Launch cloud-hosted Jupyter Lab environment: +[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/xarray-contrib/xarray-tutorial/HEAD?labpath=overview/fundamental-path/index.ipynb) + +## Topics + +_Below are links to sections of this website that are part of this journey_: + +```{dropdown} Introduction +{doc}`../../overview/get-started` +``` + +```{dropdown} Introduction to Xarray +{doc}`../../fundamentals/01_datastructures` + +{doc}`../../fundamentals/01.1_io` +``` + +```{dropdown} Working with Labeled Data +{doc}`../../fundamentals/02.1_indexing_Basic` +``` + +```{dropdown} Computation +{doc}`../../fundamentals/03.1_computation_with_xarray` + +{doc}`../../fundamentals/02.3_aligning_data_objects` + +{doc}`../../fundamentals/03.2_groupby_with_xarray` +``` + +```{dropdown} Plotting and Visualization +{doc}`../../fundamentals/04.1_basic_plotting` + +{doc}`../../fundamentals/04.2_faceting` + +{doc}`../../fundamentals/04.3_geographic_plotting` +``` + +```{dropdown} Xarray Ecosystem +{doc}`../../intermediate/xarray_ecosystem` +``` diff --git a/overview/fundamental-path/index.ipynb b/overview/fundamental-path/index.ipynb new file mode 100644 index 00000000..48c3f5fb --- /dev/null +++ b/overview/fundamental-path/index.ipynb @@ -0,0 +1,62 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "\n", + "\n", + "# Welcome to the Xarray SciPy 2022 Tutorial! \n", + "\n", + "**Xarray**: *Friendly, Interactive, and Scalable Scientific Data Analysis*\n", + "\n", + "Learning goals:\n", + "- understand the Xarray data model\n", + "- effectively use Xarray’s multidimensional labeled indexing\n", + "- utilize Xarray’s powerful built-in computational methods\n", + "- learn about the ecosystem of software extending Xarray\n", + "\n", + "This *4-hour* workshop will explore content from https://tutorial.xarray.dev, which contains a comprehensive collection of hands-on tutorial Jupyter Notebooks. We won't cover it all today, but instead will review a curated set of examples that will prepare you for increasingly complex real-world data analysis tasks!\n", + "\n", + "\n", + "## Schedule \n", + "*Times in Central Daylight (Austin, TX)\n", + "\n", + "| Topic | Time | Notebook Links | \n", + "| :- | - | - | \n", + "| Introduction | 1:30 (20 min) | [getting started](../../overview/get-started.md) | \n", + "| Data Structures | 1:50 (30 min) | [datastructures](../../fundamentals/01_datastructures.ipynb)
[input/output](../../fundamentals/01.1_io.ipynb) | \n", + "| *Break* \n", + "| Labeled Data | 2:30 (20 min) | [working_with_labeled_data](../../fundamentals/02.1_working_with_labeled_data.ipynb) | \n", + "| Visualizations | 2:50 (30 min) | [basic_plotting](../../fundamentals/04.1_basic_plotting.ipynb)
[facet plots](../../fundamentals/04.2_faceting.ipynb) | \n", + "| *Break* | \n", + "| Computation | 3:30 (50 min) | [computation with xarray](../../fundamentals/03.1_computation_with_xarray.ipynb)
[aligning data objects](../../fundamentals/02.3_aligning_data_objects.ipynb)
[groupby with xarray](../../fundamentals/03.2_groupby_with_xarray.ipynb) | \n", + "| *Break* | \n", + "| Xarray ecosystem | 4:30 (30 min) | [xarray ecosystem](../../intermediate/xarray_ecosystem.ipynb) | \n", + "| Scaling Xarray | 5:00 (20 min) | | \n", + "| | **End 5:30** | |\n", + "\n", + "**Thanks for attending!**\n", + "\n", + "Please continue to explore the subfolders in the JupyterLab File Browser for additional tutorial notebooks to run, or read the rendered notebooks at https://tutorial.xarray.dev" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/overview/get-started.md b/overview/get-started.md new file mode 100644 index 00000000..b4e0192c --- /dev/null +++ b/overview/get-started.md @@ -0,0 +1,75 @@ + + +(get-started)= + +# Get Started + +## Organization + +Tutorials are approximately divided into sections with increasing levels of complexity: `Fundamentals`, `Intermediate`, `Advanced`. You'll also find content specific to various `Workshops` hosted over the years, often with accompanying video recordings of instructors going over content and answering questions that come up. + +Most of the tutorial content is written as Jupyter Notebooks that mix +code, text, visualization, and exercises. You can either browse rendered versions of these notebooks on this website, or _execute_ the code examples interactively. + +Many notebooks use special formatting ([Myst Markdown](https://mystmd.org/guide/quickstart-jupyter-lab-myst)) that renders best in a JupyterLab web interface. If you are new to JupyterLab, spend some time reviewing the [documentation and videos](https://jupyterlab.readthedocs.io/en/stable/getting_started/overview.html). + +## Run code interactively + +### On the Cloud + +The easiest way to start modifying and experimenting with tutorial content is to launch a pre-configured server on the Cloud. This is easy thanks to several free resources which offer ephemeral computing instances (be aware you may loose your connection or work at any time) + +```{warning} +Be patient, it can take a few minutes for a server to become available on the Cloud! +``` + +#### Mybinder.org + +Clicking [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/xarray-contrib/xarray-tutorial/HEAD) will load a pre-configured Jupyter Lab interface with _all_ tutorial notebooks for you to run. _You have minimal computing resources and any changes you make will not be saved._ Any page with executable content also has a {octicon}`rocket;2em` icon in the upper right that will launch an interactive session for that particular page. + +#### GitHub Codespaces + +This tutorial is available to run within [GitHub Codespaces](https://github.com/features/codespaces) - a preconfigured development environment running in Microsoft Azure. + +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/xarray-contrib/xarray-tutorial) + +☝️ Click the button above to go to options window to launch a GitHub codespace. + +You can choose from a selection of virtual machine types: 2 cores - 8 GB RAM should be sufficient for all code examples in this repository. +Additionally, you are able to chose from various configurations for specific workshops (such as Scipy2024). +GitHub currently gives every user [120 vCPU hours per month for free](https://docs.github.com/en/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts), beyond that you must pay. **So be sure to explicitly stop your codespace when you are done by going to this page (https://github.com/codespaces).** You can also chose to fully delete your codespace when you're done exploring tutorial content. + +```{tip} +By default Codespaces open VSCode in a browser window. But you can also launch a JupyterLab interface. Once you've launched a codespace, use the auto-generated name in the following URL: `https://github.com/codespaces/CODESPACE-NAME?editor=jupyter` +``` + +Using the GitHub CLI is another very convenient way to start a codespace: + +```bash +gh codespace create -R xarray-contrib/xarray-tutorial +``` + +```bash +# Wait a few minutes for `gh codespace create` to finish, then run: +gh codespace jupyter +``` + +### On your computer + +Running tutorials on your computer requires some setup: + +We recommend using [`pixi`](https://pixi.sh/latest/) to ensure a fully reproducible Python environment + +```bash +git clone https://github.com/xarray-contrib/xarray-tutorial.git +cd xarray-tutorial +pixi run tutorial +``` + +If you prefer to use conda/mamba: + +``` +mamba env create -f .binder/environment.yml -n xarray-tutorial +conda activate xarray-tutorial +jupyter lab +``` diff --git a/overview/intermediate-path/README.md b/overview/intermediate-path/README.md new file mode 100644 index 00000000..10e50f51 --- /dev/null +++ b/overview/intermediate-path/README.md @@ -0,0 +1,42 @@ +# Intermediate Path + +This learning path was presented at SciPy 2023. It covers intermediate +and more advanced topics and is a good follow-on from the [Fundamental Path](fundamental-path) + +The tutorial was organized by: + +- Deepak Cherian (National Center for Atmospheric Research) +- Scott Henderson (Univ. Washington) +- Jessica Scheick (Univ. New Hampshire) +- Negin Sobhani (National Center for Atmospheric Research) +- Tom Nicholas (Lamont-Doherty Earth Observatory) +- Anderson Banihirwe (CarbonPlan) +- Don Setiawan (Univ. Washington) + +## Outline + +```{dropdown} Introduction +{doc}`../../overview/get-started` +``` + +```{dropdown} Indexing +{doc}`../../intermediate/indexing/advanced-indexing` +``` + +```{dropdown} Computational Patterns +{doc}`../../intermediate/computation/01-high-level-computation-patterns` +``` + +```{dropdown} Wrapping other arrays: dask +{doc}`../../intermediate/xarray_and_dask` +``` + +```{dropdown} Wrapping custom computation +{doc}`../../advanced/apply_ufunc/simple_numpy_apply_ufunc` + +{doc}`../../advanced/apply_ufunc/core-dimensions` + +{doc}`../../advanced/apply_ufunc/complex-output-numpy` + +{doc}`Explore the remaining material <../../advanced/apply_ufunc/apply_ufunc>` +``` diff --git a/overview/intermediate-path/index.ipynb b/overview/intermediate-path/index.ipynb new file mode 100644 index 00000000..33a6bcd9 --- /dev/null +++ b/overview/intermediate-path/index.ipynb @@ -0,0 +1,61 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n", + "# Welcome to the Xarray SciPy 2023 Tutorial! \n", + "\n", + "**Xarray**: *Friendly, Interactive, and Scalable Scientific Data Analysis*\n", + "\n", + "\n", + "This *4-hour* workshop will explore content from [the Xarray tutorial](https://tutorial.xarray.dev), which contains a comprehensive collection of hands-on tutorial Jupyter Notebooks. We won't cover it all today, but instead will review a curated set of examples that will prepare you for increasingly complex real-world data analysis tasks!\n", + "\n", + "\n", + "## Schedule \n", + "*Times in Central Daylight (Austin, TX)\n", + "\n", + "Use the links to navigate to the right notebooks.\n", + "\n", + "**Remember to select `global-global-xarray environment` for the notebooks when prompted.**\n", + "\n", + "| Topic | Time | Notebook Links | \n", + "| :- | - | - | \n", + "| Introduction and Setup | 1:30 (20 min) | --- | \n", + "| Indexing | 1:50 (30 min) | [Advanced and Vectorized Indexing](../../intermediate/indexing/advanced-indexing.ipynb) | \n", + "| *10 minute Break* \n", + "| Computational Patterns | 2:30 (50 min) | [Computation Patterns](../../intermediate/01-high-level-computation-patterns.ipynb) | \n", + "| *10 minute Break* | \n", + "| Wrapping other arrays | 3:30 (50 min) | [Xarray and Dask](../../intermediate/xarray_and_dask.ipynb) | \n", + "| *10 minute Break* | \n", + "| Wrapping custom computation (apply_ufunc) | 4:30 (30 min)


5:00 (30 min) | [A gentle introduction](../../advanced/apply_ufunc/simple_numpy_apply_ufunc.ipynb)
[Core dimensions](../../advanced/apply_ufunc/core-dimensions.ipynb)
[Handling complex output](../../advanced/apply_ufunc/complex-output-numpy.ipynb)
Explore the rest of the material |\n", + "| | **End 5:30** | |\n", + "\n", + "\n", + "\n", + "## Thanks for attending!\n", + "\n", + "Please continue to explore the subfolders in the JupyterLab File Browser for additional tutorial notebooks to run, or read the rendered notebooks at [https://tutorial.xarray.dev](https://tutorial.xarray.dev)" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/overview/learning-paths.md b/overview/learning-paths.md new file mode 100644 index 00000000..9e7922e4 --- /dev/null +++ b/overview/learning-paths.md @@ -0,0 +1,11 @@ +# Learning Paths + +Learning Paths are guided tours through the material on the site. +These paths were originally built for in-person tutorials at the SciPy conference. +They are useful if you would like to work through the material in an organized manner. + +Follow the links below to try out each path. + +```{tableofcontents} + +``` diff --git a/oceanhackweek-2020/xarray-oceanhackweek20.ipynb b/overview/xarray-in-45-min.ipynb similarity index 50% rename from oceanhackweek-2020/xarray-oceanhackweek20.ipynb rename to overview/xarray-in-45-min.ipynb index b479e838..2566262d 100644 --- a/oceanhackweek-2020/xarray-oceanhackweek20.ipynb +++ b/overview/xarray-in-45-min.ipynb @@ -4,78 +4,60 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n", + "\n", "\n", "# Xarray in 45 minutes\n", "\n", - "In this lesson, we discuss cover the basics of Xarray data structures. By the\n", + "In this lesson, we cover the basics of Xarray data structures. By the\n", "end of the lesson, we will be able to:\n", "\n", "- Understand the basic data structures in Xarray\n", "- Inspect `DataArray` and `Dataset` objects.\n", "- Read and write netCDF files using Xarray.\n", - "- Understand that there are many packages that build on top of xarray\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## A practical example\n" + "- Understand that there are many packages that build on top of xarray\n", + "\n", + "\n", + "We'll start by reviewing the various components of the Xarray data model, represented here visually:\n", + "\n", + "" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:07:17.256417Z", - "start_time": "2020-08-19T16:07:15.713910Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import xarray as xr\n", "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:07:18.118460Z", - "start_time": "2020-08-19T16:07:18.017413Z" - } - }, - "outputs": [], - "source": [ - "# load tutorial dataset\n", - "ds = xr.tutorial.load_dataset(\"air_temperature\")" + "xr.set_options(keep_attrs=True, display_expand_data=False)\n", + "np.set_printoptions(threshold=10, edgeitems=2)\n", + "\n", + "%xmode minimal\n", + "%matplotlib inline\n", + "%config InlineBackend.figure_format='retina'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## What's in a dataset? many DataArrays\n" + "Xarray has a few small real-world tutorial datasets hosted in the [xarray-data](https://github.com/pydata/xarray-data) GitHub repository.\n", + "\n", + "[xarray.tutorial.load_dataset](https://docs.xarray.dev/en/stable/generated/xarray.tutorial.open_dataset.html#xarray.tutorial.open_dataset) is a convenience function to download and open DataSets by name (listed at that link).\n", + "\n", + "Here we'll use `air temperature` from the [National Center for Environmental Prediction](https://www.weather.gov/ncep/). Xarray objects have convenient HTML representations to give an overview of what we're working with:" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:07:19.783476Z", - "start_time": "2020-08-19T16:07:19.719819Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "# dataset repr\n", + "ds = xr.tutorial.load_dataset(\"air_temperature\")\n", "ds" ] }, @@ -83,19 +65,27 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Datasets are dict-like containers of DataArrays i.e. they are a mapping of\n", - "variable name to DataArray.\n" + "Note that behind the scenes the `tutorial.open_dataset` downloads a file. It then uses [`xarray.open_dataset`](https://docs.xarray.dev/en/stable/generated/xarray.open_dataset.html#xarray-open-dataset) function to open that file (which for this datasets is a [netCDF](https://www.unidata.ucar.edu/software/netcdf/) file). \n", + "\n", + "A few things are done automatically upon opening, but controlled by keyword arguments. For example, try passing the keyword argument `mask_and_scale=False`... what happens?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What's in a Dataset? \n", + "\n", + "*Many DataArrays!* \n", + "\n", + "Datasets are dictionary-like containers of \"DataArray\"s. They are a mapping of\n", + "variable name to DataArray:" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:07:23.486767Z", - "start_time": "2020-08-19T16:07:23.452957Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# pull out \"air\" dataarray with dictionary syntax\n", @@ -118,65 +108,80 @@ "outputs": [], "source": [ "# pull out dataarray using dot notation\n", - "ds.air ## same as ds[\"air\"]" + "ds.air" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## What's in a DataArray? data + (a lot of) metadata\n", + "## What's in a DataArray? \n", "\n", - "### Named dimensions `.dims`\n" + "*data + (a lot of) metadata*" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Name (optional)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:08:27.758670Z", - "start_time": "2020-08-19T16:08:27.727504Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "ds.air.dims" + "da = ds.air\n", + "\n", + "da.name" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Coordinate variables or \"tick labels\" (`.coords`)\n", + "### Named dimensions \n", "\n", - "`.coords` is a simple\n", - "[data container](https://xarray.pydata.org/en/stable/data-structures.html#coordinates)\n", - "for coordinate variables.\n" + "`.dims` correspond to the axes of your data. \n", + "\n", + "In this case we have 2 spatial dimensions (`latitude` and `longitude` are stored with shorthand names `lat` and `lon`) and one temporal dimension (`time`)." ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:08:29.769909Z", - "start_time": "2020-08-19T16:08:29.749571Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "ds.air.coords" + "da.dims" ] }, { "cell_type": "markdown", - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:09:26.528972Z", - "start_time": "2020-08-19T16:09:26.512791Z" - } - }, + "metadata": {}, + "source": [ + "### Coordinate variables \n", + "\n", + "`.coords` is a simple [data container](https://docs.xarray.dev/en/stable/user-guide/data-structures.html#coordinates)\n", + "for coordinate variables.\n", + "\n", + "Here we see the actual timestamps and spatial positions of our air temperature data:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da.coords" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ "Coordinates objects support similar indexing notation\n" ] @@ -188,7 +193,7 @@ "outputs": [], "source": [ "# extracting coordinate variables\n", - "ds.air.lon" + "da.lon" ] }, { @@ -197,8 +202,8 @@ "metadata": {}, "outputs": [], "source": [ - "# extracting coorindate variables from .coords\n", - "ds.coords[\"lon\"]" + "# extracting coordinate variables from .coords\n", + "da.coords[\"lon\"]" ] }, { @@ -214,67 +219,61 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Arbitrary attributes (`.attrs`)\n", + "### Arbitrary attributes \n", "\n", - "`.attrs` is a dictionary that can contain arbitrary python objects. Your only\n", - "limitation is that some attributes may not be writeable to a netCDF file\n" + "`.attrs` is a dictionary that can contain arbitrary Python objects (strings, lists, integers, dictionaries, etc.) Your only\n", + "limitation is that some attributes may not be writeable to certain file formats." ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:09:43.977690Z", - "start_time": "2020-08-19T16:09:43.951688Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "ds.air.attrs" + "da.attrs" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:09:45.395462Z", - "start_time": "2020-08-19T16:09:45.373786Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "# assign your own attribute\n", - "ds.air.attrs[\"who_is_awesome\"] = \"xarray\"\n", - "ds.air.attrs" + "# assign your own attributes!\n", + "da.attrs[\"who_is_awesome\"] = \"xarray\"\n", + "da.attrs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Underlying data (`.data`)\n", + "### Underlying data \n", + "\n", + "`.data` contains the [numpy array](https://numpy.org) storing air temperature values.\n", "\n", - "Xarray structures wrap underlying simpler data structures. In this case, the\n", - "underlying data is a numpy array which you may be familiar with.\n", + "\n", "\n", - "This part of xarray is quite extensible allowing for GPU arrays, sparse arrays,\n", - "arrays with units etc. See the demo at the end.\n" + "Xarray structures wrap underlying simpler array-like data structures. This part of Xarray is quite extensible allowing for distributed array, GPU arrays, sparse arrays, arrays with units etc. We'll briefly look at this later in this tutorial." ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:09:47.536691Z", - "start_time": "2020-08-19T16:09:47.501968Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "ds.air.data" + "da.data" ] }, { @@ -284,75 +283,71 @@ "outputs": [], "source": [ "# what is the type of the underlying data\n", - "type(ds.air.data)" + "type(da.data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "A numpy array!\n", + "### Review\n", "\n", - "\n" + "Xarray provides two main data structures:\n", + "\n", + "1. [`DataArrays`](https://docs.xarray.dev/en/stable/user-guide/data-structures.html#dataarray) that wrap underlying data containers (e.g. numpy arrays) and contain associated metadata\n", + "1. [`Datasets`](https://docs.xarray.dev/en/stable/user-guide/data-structures.html#dataset) that are dictionary-like containers of DataArrays\n", + "\n", + "DataArrays contain underlying arrays and associated metadata:\n", + "1. Name\n", + "2. Dimension names\n", + "3. Coordinate variables\n", + "4. and arbitrary attributes." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Review\n", - "\n", - "Xarray provides two main data structures\n", - "\n", - "- DataArrays that wrap underlying data containers (e.g. numpy arrays) and\n", - " contain associated metadata\n", - "- Datasets that are dict-like containers of DataArrays\n", - "\n", - "For more see\n", - "\n", - "- https://xarray.pydata.org/en/stable/data-structures.html#dataset\n", - "- https://xarray.pydata.org/en/stable/data-structures.html#dataarray\n" + "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "---\n", + "## Why Xarray? \n", "\n", - "## Why xarray? Use metadata for fun and ~profit~ papers!\n", + "Metadata provides context and provides code that is more legible. This reduces the likelihood of errors from typos and makes analysis more intuitive and fun!\n", "\n", - "### Analysis without xarray: `X(`\n" + "### Analysis without xarray: `X(`" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:10:25.379707Z", - "start_time": "2020-08-19T16:10:25.192751Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# plot the first timestep\n", "lat = ds.air.lat.data # numpy array\n", "lon = ds.air.lon.data # numpy array\n", - "temp = ds.air.data # numpy array\n", + "temp = ds.air.data # numpy array" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ "plt.figure()\n", - "plt.pcolormesh(lon, lat, temp[0, :, :])" + "plt.pcolormesh(lon, lat, temp[0, :, :]);" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:10:28.631492Z", - "start_time": "2020-08-19T16:10:28.594725Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "temp.mean(axis=1) ## what did I just do? I can't tell by looking at this line." @@ -370,15 +365,10 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:10:53.391181Z", - "start_time": "2020-08-19T16:10:53.151292Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "ds.air.isel(time=1).plot(x=\"lon\")" + "ds.air.isel(time=0).plot(x=\"lon\");" ] }, { @@ -391,15 +381,10 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:10:49.711769Z", - "start_time": "2020-08-19T16:10:49.668537Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "ds.air.mean(\"time\")" + "ds.air.mean(dim=\"time\").plot(x=\"lon\")" ] }, { @@ -408,14 +393,14 @@ "source": [ "---\n", "\n", - "## Extracting data or \"indexing\" : `.sel`, `.isel`\n", + "## Extracting data or \"indexing\" \n", "\n", "Xarray supports\n", "\n", "- label-based indexing using `.sel`\n", "- position-based indexing using `.isel`\n", "\n", - "For more see https://xarray.pydata.org/en/stable/indexing.html\n" + "See the [user guide](https://docs.xarray.dev/en/stable/indexing.html) for more." ] }, { @@ -428,6 +413,16 @@ "support for dates and times!\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# here's what ds looks like\n", + "ds" + ] + }, { "cell_type": "code", "execution_count": null, @@ -448,6 +443,15 @@ "ds.sel(time=slice(\"2013-05\", \"2013-07\"))" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.sel(time=\"2013\")" + ] + }, { "cell_type": "code", "execution_count": null, @@ -484,8 +488,17 @@ "metadata": {}, "outputs": [], "source": [ - "# pull out time index 0 and lat index 0\n", - "ds.air.isel(time=0, lat=0) # much better than ds.air[0, 0, :]" + "ds.air.data[0, 2, 3]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# pull out time index 0, lat index 2, and lon index 3\n", + "ds.air.isel(time=0, lat=2, lon=3) # much better than ds.air[0, 2, 3]" ] }, { @@ -504,23 +517,44 @@ "source": [ "---\n", "\n", - "## Concepts for computation\n" + "## Concepts for computation\n", + "\n", + "Consider calculating the *mean air temperature per unit surface area* for this dataset. Because latitude and longitude correspond to spherical coordinates for Earth's surface, each 2.5x2.5 degree grid cell actually has a different surface area as you move away from the equator! This is because *latitudinal length* is fixed ($ \\delta Lat = R \\delta \\phi $), but *longitudinal length varies with latitude* ($ \\delta Lon = R \\delta \\lambda \\cos(\\phi) $)\n", + "\n", + "So the [area element for lat-lon coordinates](https://en.wikipedia.org/wiki/Spherical_coordinate_system#Integration_and_differentiation_in_spherical_coordinates) is\n", + "\n", + "\n", + "$$ \\delta A = R^2 \\delta\\phi \\, \\delta\\lambda \\cos(\\phi) $$\n", + "\n", + "where $\\phi$ is latitude, $\\delta \\phi$ is the spacing of the points in latitude, $\\delta \\lambda$ is the spacing of the points in longitude, and $R$ is Earth's radius. (In this formula, $\\phi$ and $\\lambda$ are measured in radians)" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], "source": [ - "### Broadcasting: expanding data\n", + "# Earth's average radius in meters\n", + "R = 6.371e6\n", "\n", - "Let's try to calculate grid cell area associated with the air temperature data.\n", - "We may want this to make a proper area-weighted domain-average for example\n", + "# Coordinate spacing for this dataset is 2.5 x 2.5 degrees\n", + "dϕ = np.deg2rad(2.5)\n", + "dλ = np.deg2rad(2.5)\n", "\n", - "A very approximate formula is\n", - "\n", - "\\begin{equation} Δlat \\times Δlon \\times \\cos(\\text{latitude}) \\end{equation}\n", - "\n", - "assuming that $Δlon$ = 111km and $Δlat$ = 111km\n" + "dlat = R * dϕ * xr.ones_like(ds.air.lon)\n", + "dlon = R * dλ * np.cos(np.deg2rad(ds.air.lat))\n", + "dlon.name = \"dlon\"\n", + "dlat.name = \"dlat\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There are two concepts here:\n", + "1. you can call functions like `np.cos` and `np.deg2rad` ([\"numpy ufuncs\"](https://numpy.org/doc/stable/reference/ufuncs.html)) on Xarray objects and receive an Xarray object back.\n", + "2. We used [ones_like](https://docs.xarray.dev/en/stable/generated/xarray.ones_like.html) to create a DataArray that looks like `ds.air.lon` in all respects, except that the data are all ones" ] }, { @@ -529,8 +563,8 @@ "metadata": {}, "outputs": [], "source": [ - "dlon = np.cos(ds.air.lat * np.pi / 180) * 111e3\n", - "dlon" + "# returns an xarray DataArray!\n", + "np.cos(np.deg2rad(ds.lat))" ] }, { @@ -539,10 +573,29 @@ "metadata": {}, "outputs": [], "source": [ - "dlat = 111e3 * xr.ones_like(ds.air.lon)\n", + "# cell latitude length is constant with longitude\n", "dlat" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# cell longitude length changes with latitude\n", + "dlon" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Broadcasting: expanding data\n", + "\n", + "Our longitude and latitude length DataArrays are both 1D with different dimension names. If we multiply these DataArrays together the dimensionality is expanded to 2D by _broadcasting_:" + ] + }, { "cell_type": "code", "execution_count": null, @@ -561,11 +614,10 @@ "`lat` are different so it automatically \"broadcasts\" to get a 2D result. See the\n", "last row in this image from _Jake VanderPlas Python Data Science Handbook_\n", "\n", - "\n", + "\n", "\n", "Because xarray knows about dimension names we avoid having to create unnecessary\n", - "size-1 dimensions using `np.newaxis` or `.reshape`. For more, see\n", - "https://xarray.pydata.org/en/stable/computation.html#broadcasting-by-dimension-name\n" + "size-1 dimensions using `np.newaxis` or `.reshape`. For more, see the [user guide](https://docs.xarray.dev/en/stable/user-guide/computation.html#broadcasting-by-dimension-name)\n" ] }, { @@ -578,7 +630,7 @@ "\n", "When doing arithmetic operations xarray automatically \"aligns\" i.e. puts the\n", "data on the same grid. In this case `cell_area` and `ds.air` are at the same\n", - "lat, lon points so things are multiplied as you would expect\n" + "lat, lon points we end up with a result with the same shape (25x53):\n" ] }, { @@ -587,7 +639,7 @@ "metadata": {}, "outputs": [], "source": [ - "(cell_area * ds.air.isel(time=1))" + "ds.air.isel(time=1) / cell_area" ] }, { @@ -604,9 +656,9 @@ "outputs": [], "source": [ "# make a copy of cell_area\n", - "# then add 1e-5 to lat\n", + "# then add 1e-5 degrees to latitude\n", "cell_area_bad = cell_area.copy(deep=True)\n", - "cell_area_bad[\"lat\"] = cell_area.lat + 1e-5\n", + "cell_area_bad[\"lat\"] = cell_area.lat + 1e-5 # latitudes are off by 1e-5 degrees!\n", "cell_area_bad" ] }, @@ -623,11 +675,44 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Tip:** If you notice extra NaNs or missing points after xarray computation, it\n", + "The result is an empty array with no latitude coordinates because none of them were aligned!\n", + "\n", + "```{tip}\n", + "If you notice extra NaNs or missing points after xarray computation, it\n", "means that your xarray coordinates were not aligned _exactly_.\n", + "```\n", "\n", + "To make sure variables are aligned as you think they are, do the following:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "raises-exception" + ] + }, + "outputs": [], + "source": [ + "xr.align(cell_area_bad, ds.air, join=\"exact\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above statement raises an error since the two are not aligned." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{seealso}\n", "For more, see\n", - "https://xarray.pydata.org/en/stable/computation.html#automatic-alignment\n" + "[the Xarray documentation](https://docs.xarray.dev/en/stable/user-guide/computation.html#automatic-alignment). [This tutorial notebook](https://tutorial.xarray.dev/fundamentals/02.3_aligning_data_objects.html) also covers alignment and broadcasting (*highly recommended*)\n", + "```" ] }, { @@ -636,21 +721,26 @@ "source": [ "---\n", "\n", - "## High level computation: `groupby`, `resample`, `rolling`, `coarsen`, `weighted`\n", + "## High level computation \n", + "\n", + "(`groupby`, `resample`, `rolling`, `coarsen`, `weighted`)\n", "\n", "Xarray has some very useful high level objects that let you do common\n", "computations:\n", "\n", "1. `groupby` :\n", - " [Bin data in to groups and reduce](https://xarray.pydata.org/en/stable/groupby.html)\n", + " [Bin data in to groups and reduce](https://docs.xarray.dev/en/stable/groupby.html)\n", "1. `resample` :\n", - " [Groupby specialized for time axes. Either downsample or upsample your data.](https://xarray.pydata.org/en/stable/time-series.html#resampling-and-grouped-operations)\n", + " [Groupby specialized for time axes. Either downsample or upsample your data.](https://docs.xarray.dev/en/stable/user-guide/time-series.html#resampling-and-grouped-operations)\n", "1. `rolling` :\n", - " [Operate on rolling windows of your data e.g. running mean](https://xarray.pydata.org/en/stable/computation.html#rolling-window-operations)\n", + " [Operate on rolling windows of your data e.g. running mean](https://docs.xarray.dev/en/stable/user-guide/computation.html#rolling-window-operations)\n", "1. `coarsen` :\n", - " [Downsample your data](https://xarray.pydata.org/en/stable/computation.html#coarsen-large-arrays)\n", + " [Downsample your data](https://docs.xarray.dev/en/stable/user-guide/computation.html#coarsen-large-arrays)\n", "1. `weighted` :\n", - " [Weight your data before reducing](https://xarray.pydata.org/en/stable/computation.html#weighted-array-reductions)\n" + " [Weight your data before reducing](https://docs.xarray.dev/en/stable/user-guide/computation.html#weighted-array-reductions)\n", + "\n", + "\n", + "Below we quickly demonstrate these patterns. See the user guide links above and [the tutorial](https://tutorial.xarray.dev/intermediate/01-high-level-computation-patterns.html) for more." ] }, { @@ -660,6 +750,16 @@ "### groupby\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# here's ds\n", + "ds" + ] + }, { "cell_type": "code", "execution_count": null, @@ -673,12 +773,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:14:03.590082Z", - "start_time": "2020-08-19T16:14:03.507391Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# make a seasonal mean\n", @@ -691,24 +786,28 @@ "metadata": {}, "source": [ "The seasons are out of order (they are alphabetically sorted). This is a common\n", - "annoyance. The solution is to use `.reindex`\n" + "annoyance. The solution is to use `.sel` to change the order of labels\n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:15:07.345540Z", - "start_time": "2020-08-19T16:15:07.304690Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "seasonal_mean = seasonal_mean.reindex(season=[\"DJF\", \"MAM\", \"JJA\", \"SON\"])\n", + "seasonal_mean = seasonal_mean.sel(season=[\"DJF\", \"MAM\", \"JJA\", \"SON\"])\n", "seasonal_mean" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "seasonal_mean.air.plot(col=\"season\")" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -723,7 +822,7 @@ "outputs": [], "source": [ "# resample to monthly frequency\n", - "ds.resample(time=\"M\").mean()" + "ds.resample(time=\"ME\").mean()" ] }, { @@ -740,7 +839,7 @@ "outputs": [], "source": [ "# weight by cell_area and take mean over (time, lon)\n", - "ds.weighted(cell_area).mean([\"lon\", \"time\"]).air.plot()" + "ds.weighted(cell_area).mean([\"lon\", \"time\"]).air.plot(y=\"lat\");" ] }, { @@ -749,60 +848,51 @@ "source": [ "---\n", "\n", - "## Visualization: `.plot`\n", + "## Visualization\n", + "\n", + "(`.plot`)\n", "\n", - "For more see https://xarray.pydata.org/en/stable/plotting.html and\n", - "https://xarray.pydata.org/en/stable/examples/visualization_gallery.html\n", "\n", - "We have seen very simple plots earlier. Xarray has some support for visualizing\n", + "We have seen very simple plots earlier. Xarray also lets you easily visualize\n", "3D and 4D datasets by presenting multiple facets (or panels or subplots) showing\n", - "variations across rows and/or columns.\n" + "variations across rows and/or columns." ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:14:06.090565Z", - "start_time": "2020-08-19T16:14:05.580534Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# facet the seasonal_mean\n", - "seasonal_mean.air.plot(col=\"season\")" + "seasonal_mean.air.plot(col=\"season\", col_wrap=2);" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:15:13.777572Z", - "start_time": "2020-08-19T16:15:13.136044Z" - }, - "scrolled": true - }, + "metadata": {}, "outputs": [], "source": [ "# contours\n", - "seasonal_mean.air.plot.contour(col=\"season\", levels=20, add_colorbar=True)" + "seasonal_mean.air.plot.contour(col=\"season\", levels=20, add_colorbar=True);" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:15:15.998115Z", - "start_time": "2020-08-19T16:15:15.805569Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# line plots too? wut\n", - "seasonal_mean.air.mean(\"lon\").plot.line(hue=\"season\", y=\"lat\")" + "seasonal_mean.air.mean(\"lon\").plot.line(hue=\"season\", y=\"lat\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For more see the [user guide](https://docs.xarray.dev/en/stable/plotting.html), the [gallery](https://docs.xarray.dev/en/stable/examples/visualization_gallery.html), and [the tutorial material](https://tutorial.xarray.dev/fundamentals/04.0_plotting.html)." ] }, { @@ -811,10 +901,10 @@ "source": [ "---\n", "\n", - "## Reading and writing to disk\n", + "## Reading and writing files\n", "\n", "Xarray supports many disk formats. Below is a small example using netCDF. For\n", - "more see https://xarray.pydata.org/en/stable/io.html\n" + "more see the [documentation](https://docs.xarray.dev/en/stable/user-guide/io.html)\n" ] }, { @@ -823,10 +913,19 @@ "metadata": {}, "outputs": [], "source": [ - "# write ds to netCDF\n", + "# write to netCDF\n", "ds.to_netcdf(\"my-example-dataset.nc\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```{note}\n", + "To avoid the `SerializationWarning` you can assign a _FillValue for any NaNs in 'air' array by adding the keyword argument `encoding=dict(air=dict(_FillValue=-9999))`\n", + "```" + ] + }, { "cell_type": "code", "execution_count": null, @@ -852,30 +951,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Tip:** A common use case to read datasets that are a collection of many netCDF\n", - "files. See\n", - "https://xarray.pydata.org/en/stable/io.html#reading-multi-file-datasets for how\n", - "to handle that\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", + "```{tip}\n", + "A common use case to read datasets that are a collection of many netCDF\n", + "files. See the [documentation](https://docs.xarray.dev/en/stable/user-guide/io.html#reading-multi-file-datasets) for how\n", + "to handle that.\n", + "```\n", "\n", - "## More information\n", - "\n", - "1. A description of common terms used in the xarray documentation:\n", - " https://xarray.pydata.org/en/stable/terminology.html\n", - "1. For information on how to create a DataArray from an existing numpy array:\n", - " https://xarray.pydata.org/en/stable/data-structures.html#creating-a-dataarray\n", - "1. Answers to common questions on \"how to do X\" are here:\n", - " https://xarray.pydata.org/en/stable/howdoi.html\n", - "1. Our more extensive Scipy 2020 tutorial material:\n", - " https://xarray-contrib.github.io/xarray-tutorial/\n", - "1. Ryan Abernathey has a book on data analysis with a chapter on Xarray:\n", - " https://earth-env-data-science.github.io/lectures/xarray/xarray_intro.html\n" + "Finally to read other file formats, you might find yourself reading in the data using a different library and then creating a DataArray([docs](https://docs.xarray.dev/en/stable/user-guide/data-structures.html#creating-a-dataarray), [tutorial](https://tutorial.xarray.dev/fundamentals/01.1_creating_data_structures.html)) from scratch. For example, you might use `h5py` to open an HDF5 file and then create a Dataset from that.\n", + "For MATLAB files you might use `scipy.io.loadmat` or `h5py` depending on the version of MATLAB file you're opening and then construct a Dataset." ] }, { @@ -884,11 +967,11 @@ "source": [ "---\n", "\n", - "## The scientific python / pangeo ecosystem: demo\n", + "## The scientific python ecosystem\n", "\n", "Xarray ties in to the larger scientific python ecosystem and in turn many\n", "packages build on top of xarray. A long list of such packages is here:\n", - "https://xarray.pydata.org/en/stable/related-projects.html.\n", + ".\n", "\n", "Now we will demonstrate some cool features.\n" ] @@ -899,24 +982,14 @@ "source": [ "### Pandas: tabular data structures\n", "\n", - "You can easily convert between xarray and pandas structures:\n", - "https://pandas.pydata.org/\n", - "\n", - "This allows you to conveniently use the extensive pandas ecosystem of packages\n", - "(like seaborn) for your work.\n", - "\n", - "See https://xarray.pydata.org/en/stable/pandas.html\n" + "You can easily [convert](https://docs.xarray.dev/en/stable/pandas.html) between xarray and [pandas](https://pandas.pydata.org/) structures. This allows you to conveniently use the extensive pandas \n", + "ecosystem of packages (like [seaborn](https://seaborn.pydata.org/)) for your work.\n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:16:19.439068Z", - "start_time": "2020-08-19T16:16:19.371165Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# convert to pandas dataframe\n", @@ -927,12 +1000,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:16:20.986334Z", - "start_time": "2020-08-19T16:16:20.942823Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# convert dataframe to xarray\n", @@ -943,86 +1011,41 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### xarray can wrap other array types, not just numpy\n", - "\n", - "\n", + "### Alternative array types\n", "\n", - "**dask** : parallel arrays https://xarray.pydata.org/en/stable/dask.html &\n", - "https://docs.dask.org/en/latest/array.html\n", + "This notebook has focused on Numpy arrays. Xarray can wrap [other array](https://docs.xarray.dev/en/stable/user-guide/duckarrays.html) types! For example:\n", "\n", - "\n", + " [distributed parallel arrays](https://docs.dask.org/en/latest/array.html) & [Xarray user guide on Dask](https://docs.xarray.dev/en/stable/user-guide/dask.html)\n", "\n", - "**pydata/sparse** : sparse arrays http://sparse.pydata.org\n", + " **pydata/sparse** : [sparse arrays](https://sparse.pydata.org)\n", "\n", - "\n", + " [GPU arrays](https://cupy.dev) & [cupy-xarray](https://cupy-xarray.readthedocs.io/)\n", "\n", - "**cupy** : GPU arrays http://cupy.chainer.org\n", - "\n", - "\n", - "\n", - "**pint** : unit-aware computations https://pint.readthedocs.org &\n", - "https://github.com/xarray-contrib/pint-xarray\n" + " **pint** : [unit-aware arrays](https://pint.readthedocs.io) & [pint-xarray](https://github.com/xarray-contrib/pint-xarray)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Xarray + dask\n", + "### Dask\n", "\n", "Dask cuts up NumPy arrays into blocks and parallelizes your analysis code across\n", "these blocks\n", "\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:16:28.269631Z", - "start_time": "2020-08-19T16:16:27.141306Z" - } - }, - "outputs": [], - "source": [ - "# make dask cluster; this is for demo purposes\n", - "import dask\n", - "import distributed\n", - "\n", - "cluster = distributed.LocalCluster()" + "\n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:16:28.912370Z", - "start_time": "2020-08-19T16:16:28.843239Z" - } - }, - "outputs": [], - "source": [ - "client = distributed.Client(cluster)\n", - "client" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:16:30.205686Z", - "start_time": "2020-08-19T16:16:30.140967Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# demonstrate dask dataset\n", "dasky = xr.tutorial.open_dataset(\n", - " \"air_temperature\", chunks={\"time\": 10}, # 10 time steps in each block\n", + " \"air_temperature\",\n", + " chunks={\"time\": 10}, # 10 time steps in each block\n", ")\n", "\n", "dasky.air" @@ -1039,12 +1062,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:16:32.606881Z", - "start_time": "2020-08-19T16:16:32.561338Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# demonstrate lazy mean\n", @@ -1061,12 +1079,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:16:38.409452Z", - "start_time": "2020-08-19T16:16:36.914676Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# \"compute\" the mean\n", @@ -1077,61 +1090,62 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### holoviews: javascript interactive plots\n", + "### HoloViz\n", + "\n", + "Quickly generate interactive plots from your data!\n", "\n", - "the `hvplot` package is a nice easy way to access\n", - "[holoviews](http://holoviews.org/) functionality. It attaches itself to all\n", - "xarray objects under the `.hvplot` namespace. So instead of using `.plot` use\n", - "`.hvplot`\n" + "The [`hvplot` package](https://hvplot.holoviz.org/user_guide/Gridded_Data.html) attaches itself to all\n", + "xarray objects under the `.hvplot` namespace. So instead of using `.plot` use `.hvplot`" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:17:26.384153Z", - "start_time": "2020-08-19T16:17:24.365996Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "import hvplot.xarray\n", - "\n", - "ds.air.hvplot(groupby=\"time\", clim=(270, 300))" + "import hvplot.xarray" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.air.hvplot(groupby=\"time\", clim=(270, 300), widget_location=\"bottom\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Try the slider!\n" + "```{note}\n", + "The time slider will only work if you're executing the notebook, rather than viewing the website\n", + "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### cf_xarray : use even more metadata for even more fun and ~profit~ papers\n", + "### cf_xarray \n", "\n", - "[cf_xarray](https://cf-xarray.readthedocs.io/) is a new project that tries to\n", + "[cf_xarray](https://cf-xarray.readthedocs.io/) is a project that tries to\n", "let you make use of other CF attributes that xarray ignores. It attaches itself\n", "to all xarray objects under the `.cf` namespace.\n", "\n", "Where xarray allows you to specify dimension names for analysis, `cf_xarray`\n", "lets you specify logical names like `\"latitude\"` or `\"longitude\"` instead as\n", - "long as the appropriate CF attributes are set.\n" + "long as the appropriate CF attributes are set.\n", + "\n", + "For example, the `\"longitude\"` dimension in different files might be labelled as: (lon, LON, long, x…), but cf_xarray let's you always refer to the logical name `\"longitude\"` in your code:" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:17:43.015284Z", - "start_time": "2020-08-19T16:17:42.981131Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "import cf_xarray" @@ -1140,16 +1154,11 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:18:31.279888Z", - "start_time": "2020-08-19T16:18:31.245785Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# describe cf attributes in dataset\n", - "ds.air.cf.describe()" + "ds.air.cf" ] }, { @@ -1164,12 +1173,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:18:33.806279Z", - "start_time": "2020-08-19T16:18:33.738629Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# demonstrate equivalent of .mean(\"lat\")\n", @@ -1179,12 +1183,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-08-19T16:19:27.628895Z", - "start_time": "2020-08-19T16:19:27.580971Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# demonstrate indexing\n", @@ -1199,7 +1198,7 @@ "\n", "- [xgcm](https://xgcm.readthedocs.io/) : grid-aware operations with xarray\n", " objects\n", - "- [xrft](https://xgcm.readthedocs.io/) : fourier transforms with xarray\n", + "- [xrft](https://xrft.readthedocs.io/) : fourier transforms with xarray\n", "- [xclim](https://xclim.readthedocs.io/) : calculating climate indices with\n", " xarray objects\n", "- [intake-xarray](https://intake-xarray.readthedocs.io/) : forget about file\n", @@ -1210,16 +1209,31 @@ "- [MetPy](https://unidata.github.io/MetPy/latest/index.html) : tools for working\n", " with weather data\n", "\n", - "More here: https://xarray.pydata.org/en/stable/related-projects.html\n" + "Check the Xarray [Ecosystem](https://docs.xarray.dev/en/stable/user-guide/ecosystem.html) page and [this tutorial](https://tutorial.xarray.dev/intermediate/xarray_ecosystem.html) for even more packages and demonstrations." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Next\n", + "\n", + "1. Read the [tutorial](https://tutorial.xarray.dev) material and [user guide](https://docs.xarray.dev/en/stable/user-guide/index.html)\n", + "1. See the description of [common terms](https://docs.xarray.dev/en/stable/terminology.html) used in the xarray documentation: \n", + "1. Answers to common questions on \"how to do X\" with Xarray are [here](https://docs.xarray.dev/en/stable/get-help/howdoi.html)\n", + "1. Ryan Abernathey has a book on data analysis with a [chapter on Xarray](https://earth-env-data-science.github.io/lectures/xarray/xarray_intro.html)\n", + "1. [Project Pythia](https://projectpythia.org/) has [foundational](https://foundations.projectpythia.org) and more [advanced](https://cookbooks.projectpythia.org/) material on Xarray. Pythia also aggregates other [Python learning resources](https://projectpythia.org/resource-gallery).\n", + "1. The [Xarray Github Discussions](https://github.com/pydata/xarray/discussions) and [Pangeo Discourse](https://discourse.pangeo.io/) are good places to ask questions.\n", + "1. Tell your friends! Tweet!\n", + "\n", + "\n", + "## Welcome!\n", + "\n", + "Xarray is an open-source project and gladly welcomes all kinds of contributions. This could include reporting bugs, discussing new enhancements, contributing code, helping answer user questions, contributing documentation (even small edits like fixing spelling mistakes or rewording to make the text clearer). Welcome!" ] } ], "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, "language_info": { "codemirror_mode": { "name": "ipython", @@ -1229,8 +1243,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.8" + "pygments_lexer": "ipython3" }, "toc": { "base_numbering": 1, @@ -1244,13 +1257,6 @@ "toc_position": {}, "toc_section_display": true, "toc_window_display": true - }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "state": {}, - "version_major": 2, - "version_minor": 0 - } } }, "nbformat": 4, diff --git a/pixi.lock b/pixi.lock new file mode 100644 index 00000000..ce4b217d --- /dev/null +++ b/pixi.lock @@ -0,0 +1,15980 @@ +version: 7 +platforms: +- name: linux-64 +- name: osx-arm64 +- name: win-64 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-core-2.40.3-h0630a04_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.3-hdc83ae9_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h6e18c7b_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-haaf8e00_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h31346e9_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h434eaf2_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-ha0b0e19_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h4976820_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.6-hd767fb6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-haaf8e00_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-haaf8e00_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h085388a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-h799c9a6_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py314ha0b5721_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.0-py314h4a8dc5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py314hc02f841_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-49.0.0-py314h7fe84b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.1.0-py314h5bd0f2a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.21-py314h42812f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.1-h27c8c51_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h9dce30a_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.7-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.2-h8094192_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/google-crc32c-1.8.0-py314hd6bf2bd_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.5.3-py314h42812f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.78.1-py314h5885658_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gsw-3.6.23-h7c397b8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.1-ha770c72_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hc8ae080_109.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/json-c-0.18-h6688a6e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbde042b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.8-gpl_hc2c16d8_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-h3e48024_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-hae6b9f4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.127-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-core-3.12.3-he63569f_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.2-h0d30a3d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.6.0-h8d2ee43_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.6.0-hdbdcf42_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.2.1-h17a8019_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-devel-14.2.1-h17a8019_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.4.0-h10be129_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.2-h174a0a3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-haa4a5bd_1023.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.1-nompi_he3e3c8e_200.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h9692893_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.19-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h538a264_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.22.0-h49b2146_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.10.5-h6406941_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.3-h4c96295_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h46dd2a8_20.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.22-h280c20c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-gpl_h2abfd87_119.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.2-hca5e8e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-devel-2.15.3-h49c6c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.47.0-py314h946fb2a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-6.1.1-py314hae3bed6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py314hd4c109c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.0-py314had63eae_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/minizip-4.2.2-hb71707f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.2.1-py314h97ea11e_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/muparser-2.3.5-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311hb115678_109.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.6-py310hd8a072f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.65.1-py314h8169c2f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.16.5-py314ha0b5721_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.3-py314hb4ffadd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py314h8ec4b1a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-6.33.5-py314h61e7c5f_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-24.0.0-py314hdafbbf9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-24.0.0-py314h969be7f_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py314h68799e9_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.5.0-py314ha1f92a4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-2026.6.3-py314h1bee95f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.9.0-np2py314hf09ca88_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py314hf07bd8e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py314hbe3edd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.51-py314h0f05182_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.3-hbc0de68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.7-py314h5bd0f2a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ujson-5.13.0-py314h42812f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.2.0-py314h1bee95f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-16.1-py314h518bba1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-2.2.2-py314h5bd0f2a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.3.0-hd9031aa_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.48-h280c20c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.3-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxinerama-1.1.6-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h09e67af_11.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiobotocore-3.7.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohttp-3.14.1-pyhf64b827_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aioitertools-0.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-timeout-5.0.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.6.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.4.0-hac0b51c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/botocore-1.43.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cattrs-26.1.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.11.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorcet-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.7.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.7.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-labextension-7.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datashader-0.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.7.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docopt-ng-0.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/donfig-0.8.1.post1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flexcache-0.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flexparser-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flox-0.11.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.63.0-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/frozenlist-1.8.0-pyhf298e5d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gcsfs-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-core-1.15.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.31.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.55.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-oauthlib-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.6.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-3.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-control-1.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-resumable-media-2.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.75.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-grpc-1.75.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/grpc-google-iam-v1-0.14.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.78.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/holoviews-1.23.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hvplot-0.12.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.18-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imageio-2.37.0-pyhfb79c49_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/intake-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/intake-xarray-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.3.0-pyha191276_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.15.0-pyh53cf698_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jmespath-1.1.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.15.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.1.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-book-1.0.4.post1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-builder-1.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-cache-1.0.1-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-server-proxy-4.5.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_bokeh-4.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-myst-2.7.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.16-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/legacy-cgi-2.6.4-pyh742d864_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multidict-6.7.1-pyh62beb40_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.24.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio2-1.7.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/numbagg-0.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/numpy_groupies-0.11.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/panel-1.9.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/panel-core-1.9.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/panel-material-ui-0.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/param-2.4.1-pyhc455866_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pint-0.25.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pint-xarray-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/propcache-0.5.2-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.28.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.26.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-docutils-1.0.3-pyhcf101f3_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyct-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydap-3.5.10-pyhc455866_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.13.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-3.1.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.4.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyu2f-0.1.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyviz_comms-3.0.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.3.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/s3fs-2026.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/simpervisor-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-autobuild-2025.8.25-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-book-theme-1.2.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-codeautolink-0.18.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-comments-0.0.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-external-toc-1.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-jupyterbook-latex-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-multitoc-numbering-0.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-notfound-page-1.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-thebe-0.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-togglebutton-0.3.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxext-rediraffe-0.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-1.3.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.68.4-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/url-normalize-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.51.0-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webob-1.8.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.15-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.7.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yarl-1.24.2-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.2.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiobotocore-3.7.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohttp-3.14.1-pyhf64b827_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aioitertools-0.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-timeout-5.0.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.6.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.4.0-hac0b51c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/botocore-1.43.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cattrs-26.1.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.11.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorcet-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.7.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.7.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-labextension-7.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datashader-0.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.7.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docopt-ng-0.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/donfig-0.8.1.post1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flexcache-0.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flexparser-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flox-0.11.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.63.0-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/frozenlist-1.8.0-pyhf298e5d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gcsfs-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-core-1.15.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.31.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.55.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-oauthlib-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.6.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-3.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-control-1.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-resumable-media-2.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.75.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-grpc-1.75.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/grpc-google-iam-v1-0.14.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.78.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/holoviews-1.23.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hvplot-0.12.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.18-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imageio-2.37.0-pyhfb79c49_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/intake-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/intake-xarray-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.3.0-pyh01cf8df_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.15.0-pyh53cf698_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jmespath-1.1.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.15.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.1.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-book-1.0.4.post1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-builder-1.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-cache-1.0.1-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-server-proxy-4.5.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_bokeh-4.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-myst-2.7.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.16-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/legacy-cgi-2.6.4-pyh742d864_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multidict-6.7.1-pyh62beb40_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.24.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio2-1.7.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/numbagg-0.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/numpy_groupies-0.11.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/panel-1.9.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/panel-core-1.9.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/panel-material-ui-0.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/param-2.4.1-pyhc455866_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pint-0.25.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pint-xarray-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/propcache-0.5.2-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.28.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.26.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-docutils-1.0.3-pyhcf101f3_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyct-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydap-3.5.10-pyhc455866_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.13.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-3.1.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.4.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyu2f-0.1.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyviz_comms-3.0.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.3.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/s3fs-2026.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh5552912_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/simpervisor-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-autobuild-2025.8.25-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-book-theme-1.2.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-codeautolink-0.18.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-comments-0.0.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-external-toc-1.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-jupyterbook-latex-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-multitoc-numbering-0.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-notfound-page-1.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-thebe-0.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-togglebutton-0.3.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxext-rediraffe-0.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-1.3.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.68.4-pyh8f84b5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/url-normalize-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.51.0-pyhc90fa1f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webob-1.8.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.15-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.7.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yarl-1.24.2-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.2.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-25.1.0-py314h0612a62_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hd03087b_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.3-hc187ab6_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.14-h3623c0d_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.14.1-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h35327cf_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.1-h1e7fc79_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.11.0-he9547b6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h63484d5_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.16.0-h73b2f1b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.6-hc78c590_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.7-h35327cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h35327cf_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.40.1-h9ead58b_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.833-h918993c_8.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.3-he5ae378_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h05177fb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.18.0-h409340b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.14.0-h7cba3ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.16.0-h16bb3af_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/blosc-1.21.6-h7dd00d9_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cartopy-0.25.0-py314ha3d490a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.1.0-py314h7bede21_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cftime-1.6.5-py314h2115a04_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py314hf8a3a22_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-49.0.0-py314h0d331bb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cytoolz-1.1.0-py314h6c2aa35_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.21-py314he609de1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.18.1-h2b252f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freexl-2.0.0-h3ab3353_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.7-h4e57454_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/geos-3.14.1-h5afe852_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.2-h246a70f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/google-crc32c-1.8.0-py314h8744745_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.15-hf6b4638_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/greenlet-3.5.3-py314he609de1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.78.1-py314h63f87bf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gsw-3.6.23-h92ab4e6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py314hb49d8aa_102.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.1-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf4-4.2.15-h2ee6834_7.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_had3affe_110.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/json-c-0.18-he4178ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py314hf8a3a22_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-hfd3d5f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.8.8-gpl_h6fbacd7_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h30967a1_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-ha4f4840_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h8d10c55_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-ha4f4840_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.21.0-h1359186_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-core-3.12.3-haccf57a_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.2-ha08bb59_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.6.0-h688a705_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.6.0-ha114238_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libharfbuzz-14.2.1-h5a65909_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libharfbuzz-devel-14.2.1-h5a65909_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwy-1.4.0-ha332bbd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.2.0-h84a0fba_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjxl-0.11.2-h934fa54_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libkml-1.3.0-hb833057_1023.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnetcdf-4.10.1-nompi_h12274ac_200.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.27.0-h08d5cc3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.27.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h840b369_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-hb82ec63_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpsl-0.22.0-h92480b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libraqm-0.10.5-h45af499_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.3-he8aa2a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librttopo-1.1.0-ha909e78_20.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.22-h1a92334_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libspatialite-5.1.0-gpl_ha239c29_119.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.3-h1b79a29_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.2-h282da08_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-devel-2.15.3-h5654f7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxslt-1.1.43-hb2570ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzip-1.11.2-h1336266_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.8-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.47.0-py314hc7e35b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lxml-6.1.1-py314h264e108_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-4.4.5-py314h24f3bdd_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lzo-2.10-h925e9cb_1002.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.11.0-py314hf6804ef_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/minizip-4.2.2-hdb7fadc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.2.1-py314hf8a3a22_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/muparser-2.3.5-h11e0b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/netcdf4-1.7.4-nompi_py311hb912870_109.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.6-py310h3b8a9b8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.65.1-py314hb38061f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numcodecs-0.16.5-py314ha3d490a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.6-py314hb79c6fa_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.3-py314he609de1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.3.0-py314hab283cf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/proj-9.7.1-hfb14a63_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-6.33.5-py314he407d35_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-24.0.0-py314he55896b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-24.0.0-py314h109bba2_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-12.2.1-py314h6590101_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-12.2.1-py314ha06c032_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyproj-3.7.2-py314hb2113e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.6-h156bc91_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rasterio-1.5.0-py314h5002e4e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-2026.6.3-py314he1d1ac0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.9.0-np2py314h15f0f0f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.18.0-py314h18e1515_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.1.2-py314h277790e_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hada39a4_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlalchemy-2.0.51-py314ha14b1ff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.53.3-h85ec8f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.7-py314h6c2aa35_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ujson-5.13.0-py314he609de1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py314h6cfcd04_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py314h6c2aa35_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uriparser-0.9.8-h00cdb27_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.2.0-py314he1d1ac0_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-16.1-py314h2fbedac_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-2.2.2-py314h6c2aa35_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xerces-c-3.3.0-h25f632f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h10816f8_11.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiobotocore-3.7.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiohttp-3.14.1-pyhf64b827_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aioitertools-0.13.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/async-timeout-5.0.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.6.0-py314h680f03e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.4.0-hac0b51c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/botocore-1.43.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-h4c7d964_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cattrs-26.1.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.11.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyh6dadd2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorcet-3.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.7.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.7.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dask-labextension-7.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datashader-0.19.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.7.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docopt-ng-0.9.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/donfig-0.8.1.post1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flexcache-0.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flexparser-0.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/flox-0.11.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.63.0-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/frozenlist-1.8.0-pyhf298e5d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/gcsfs-2026.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-core-1.15.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.31.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.55.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-oauthlib-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.6.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-3.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-control-1.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/google-resumable-media-2.8.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.75.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-grpc-1.75.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/grpc-google-iam-v1-0.14.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.78.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/holoviews-1.23.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hvplot-0.12.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.18-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imageio-2.37.0-pyhfb79c49_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/intake-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/intake-xarray-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.3.0-pyh6dadd2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.15.0-pyhe2676ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.8-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jmespath-1.1.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.15.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.1.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-book-1.0.4.post1-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-builder-1.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-cache-1.0.1-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-server-proxy-4.5.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_bokeh-4.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.9.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.20.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-myst-2.7.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.16-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/legacy-cgi-2.6.4-pyh742d864_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.3.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multidict-6.7.1-pyh62beb40_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.4.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.24.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.11.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio2-1.7.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/numbagg-0.9.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/numpy_groupies-0.11.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/panel-1.9.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/panel-core-1.9.3-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/panel-material-ui-0.14.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/param-2.4.1-pyhc455866_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pint-0.25.3-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pint-xarray-0.6.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/propcache-0.5.2-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.28.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.26.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-docutils-1.0.3-pyhcf101f3_4.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyct-0.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydap-3.5.10-pyhc455866_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.13.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-3.1.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.4.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_100.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-4.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyu2f-0.1.5-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyviz_comms-3.0.6-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.3.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/s3fs-2026.6.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/simpervisor-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-autobuild-2025.8.25-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-book-theme-1.2.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-codeautolink-0.18.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-comments-0.0.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-external-toc-1.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-jupyterbook-latex-1.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-multitoc-numbering-0.1.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-notfound-page-1.1.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-thebe-0.3.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-togglebutton-0.3.2-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxext-rediraffe-0.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-1.3.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.68.4-pyha7b4d00_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/url-normalize-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.51.0-pyh6dadd2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.8.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/webob-1.8.10-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.15-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.7.0-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/yarl-1.24.2-pyh7db6752_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.2.1-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py314h5a2d7ad_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.3-h0a1c2aa_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.14-h92e57be_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.14.1-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-h4c63076_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.7.1-h3c50fbe_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.11.0-h2c07012_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-hf70332f_6.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.16.0-h2dc7e49_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.12.6-hcb9225d_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.7-h4c63076_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-h4c63076_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.40.1-h5dbc166_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.833-h583dddf_8.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-core-cpp-1.16.3-h49e36cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-identity-cpp-1.13.3-hf9fdf8e_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.18.0-h4fb3251_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.14.0-hf9fdf8e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.16.0-heb2e695_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/blosc-1.21.6-hfd34d9b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.6-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h477c42c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cartopy-0.25.0-py314hd8fd7ce_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.1.0-py314h5a2d7ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cftime-1.6.5-py314h2dcd201_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py314hf309875_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-49.0.0-py314he884d78_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/cytoolz-1.1.0-py314h5a2d7ad_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.21-py314hb98de8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.18.1-hd47e2ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.3-h57928b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/freexl-2.0.0-hf297d47_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/fribidi-1.0.16-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.14.1-hdade9fe_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/getopt-win32-0.1-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/glib-2.88.2-h395db07_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.88.2-h74ecf4c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/google-crc32c-1.8.0-py314h720154c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.15-hac47afa_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/greenlet-3.5.3-py314hb98de8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/grpcio-1.78.1-py314h8eb4245_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gsw-3.6.23-h308a848_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/h5py-3.16.0-nompi_py314hc249e69_102.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.1-h57928b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/hdf4-4.2.15-h5557f11_7.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-1.14.6-nompi_hae35d4c_110.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py314hf309875_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h719d79b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.19.1-hf2c6c5f_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.8-gpl_he24518a_100.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-24.0.0-hcc6a8f1_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-24.0.0-h7d8d6a5_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-24.0.0-h081cd8e_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-24.0.0-h7d8d6a5_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-24.0.0-h524e9bd_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.21.0-h51a1c48_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.12.3-h9aca766_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.2-h7ce1215_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-3.6.0-he22669a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-3.6.0-he04ea4c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.78.1-h9ff2b3e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libharfbuzz-14.2.1-h03b5201_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libharfbuzz-devel-14.2.1-h03b5201_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libhwy-1.4.0-h172a326_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libintl-devel-0.22.5-h5728263_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.2.0-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libjxl-0.11.2-h932607e_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libkml-1.3.0-h68a222c_1023.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libnetcdf-4.10.1-nompi_he1c4404_200.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-1.27.0-hc88f397_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-headers-1.27.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-24.0.0-h7051d1f_9_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.33.5-h637c107_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpsl-0.22.0-h25e0afd_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libraqm-0.10.5-h50d6d30_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h04e5de1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/librttopo-1.1.0-haa95264_20.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.22-h6a83c73_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libspatialite-5.1.0-gpl_h0cd62ae_119.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.3-hf5d6505_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h2e43b2f_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.2-h8f73337_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h3cfd58e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-h8ef44ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.3-h8ef44ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.43-h0fbe4c1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzip-1.11.2-h3135430_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.8-h4fa8253_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvmlite-0.47.0-py314hb492ee6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lxml-6.1.1-py314hcdb55d9_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-4.4.5-py314hfc2a91f_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h2466b09_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/lzo-2.10-h6a83c73_1002.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.11.0-py314hd0c49b1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/minizip-4.2.2-h0ffbb96_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2026.1.0-hac47afa_233.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/msgpack-python-1.2.1-py314hf309875_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/muparser-2.3.5-he0c23c2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/netcdf4-1.7.4-nompi_py311h4277b3b_109.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nh3-0.3.6-py310ha413424_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.12.0-h5112557_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numba-0.65.1-py314h36f8cf2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numcodecs-0.16.5-py314hd8fd7ce_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.6-py314h02f10f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/onemkl-license-2026.1.0-h57928b3_233.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-3.0.3-py314hf700ef7_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.3.0-py314h61b30b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.7.1-hd30e2cd_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/prometheus-cpp-1.3.0-hcea2f5d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/protobuf-6.33.5-py314h6a447be_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-24.0.0-py314h86ab7b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-24.0.0-py314h159fc0c_0_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyproj-3.7.2-py314h839d035_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_100_cp314.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-312-py314hcaaf0b2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rasterio-1.5.0-py314h807bb43_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-2026.6.3-py314hc980628_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.9.0-np2py314h1b5b07a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.18.0-py314h221f224_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/shapely-2.1.2-py314h76f3c27_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/snappy-1.2.2-h7fa0ca8_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/sqlalchemy-2.0.51-py314hc5dbbe4_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.53.3-hdb435a2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.7-py314h5a2d7ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ujson-5.13.0-py314hb98de8c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.1.0-py314h909e829_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.1-py314h5a2d7ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uriparser-0.9.8-h5a68840_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-h1b7c187_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.51.36231-h84cd919_39.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/watchfiles-1.2.0-py314hc980628_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/websockets-16.1-py314h13f4da2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-2.2.2-py314h5a2d7ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-hac47afa_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libice-1.1.2-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libsm-1.2.6-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libx11-1.8.13-hfa52320_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h3a581c9_11.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda +packages: +- conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda + build_number: 20 + sha256: 1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9 + md5: a9f577daf3de00bca7c3c76c0ecbd1de + depends: + - __glibc >=2.17,<3.0.a0 + - libgomp >=7.5.0 + constrains: + - openmp_impl <0.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + strong: + - _openmp_mutex >=4.5 + size: 28948 + timestamp: 1770939786096 +- conda: https://conda.anaconda.org/conda-forge/linux-64/argon2-cffi-bindings-25.1.0-py314h5bd0f2a_2.conda + sha256: 39234a99df3d2e3065383808ed8bfda36760de5ef590c54c3692bb53571ef02b + md5: 3cca1b74b2752917b5b65b81f61f0553 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=2.0.0b1 + - libgcc >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 35598 + timestamp: 1762509505285 +- conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 + sha256: 26ab9386e80bf196e51ebe005da77d57decf6d989b4f34d96130560bc133479c + md5: 6b889f174df1e0f816276ae69281af4d + depends: + - at-spi2-core >=2.40.0,<2.41.0a0 + - atk-1.0 >=2.36.0 + - dbus >=1.13.6,<2.0a0 + - libgcc-ng >=9.3.0 + - libglib >=2.68.1,<3.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + run_exports: + weak: + - at-spi2-atk >=2.38.0,<3.0a0 + size: 339899 + timestamp: 1619122953439 +- conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-core-2.40.3-h0630a04_0.tar.bz2 + sha256: c4f9b66bd94c40d8f1ce1fad2d8b46534bdefda0c86e3337b28f6c25779f258d + md5: 8cb2fc4cd6cc63f1369cfa318f581cc3 + depends: + - dbus >=1.13.6,<2.0a0 + - libgcc-ng >=9.3.0 + - libglib >=2.68.3,<3.0a0 + - xorg-libx11 + - xorg-libxi + - xorg-libxtst + license: LGPL-2.1-or-later + license_family: LGPL + run_exports: + weak: + - at-spi2-core >=2.40.3,<2.41.0a0 + size: 658390 + timestamp: 1625848454791 +- conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda + sha256: df682395d05050cd1222740a42a551281210726a67447e5258968dd55854302e + md5: f730d54ba9cd543666d7220c9f7ed563 + depends: + - libgcc-ng >=12 + - libglib >=2.80.0,<3.0a0 + - libstdcxx-ng >=12 + constrains: + - atk-1.0 2.38.0 + license: LGPL-2.0-or-later + license_family: LGPL + run_exports: + weak: + - atk-1.0 >=2.38.0 + size: 355900 + timestamp: 1713896169874 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.3-hdc83ae9_4.conda + sha256: d7746767f17d3bf12cef8e69b7d6fa1ba975a25d4a1c3250bc7031020f0eb94d + md5: 00840a04f8ec0033ed380f150fcd1c93 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-auth >=0.10.3,<0.10.4.0a0 + size: 134896 + timestamp: 1783461441420 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.14-h6e18c7b_3.conda + sha256: 594d8c27ea57997863499a8e55ac8fb6587cdd62639445da91e1a88756488a88 + md5: d1b68989381f8cbf582ba7a5e3bb5b02 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - libgcc >=14 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - aws-c-cal >=0.9.14,<0.9.15.0a0 + size: 56631 + timestamp: 1783165003471 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.14.1-hb03c661_0.conda + sha256: a83c1a18754fe0f466d3a230106d6a52847c915c625b0be6b9f4677f46024a6c + md5: 4faa1e8d0cbc9137e8b0109c78931234 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - aws-c-common >=0.14.1,<0.14.2.0a0 + size: 244798 + timestamp: 1782343578152 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-haaf8e00_3.conda + sha256: 5f40faa0c3661a231e1a01e4abf287621509ae60fb95c92fdafdf7a2dd3d0da7 + md5: 953cf7d978432cc1703395b3e97b2776 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-compression >=0.3.2,<0.3.3.0a0 + size: 22288 + timestamp: 1783166720432 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.7.1-h31346e9_3.conda + sha256: 557075a0f86f5aabde49be012bd6bba3af2c4c567a8ed3c1e5d5dd571eb41eca + md5: 52e4dca958c1ea325a8a839a42fb2538 + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + size: 59588 + timestamp: 1783192975741 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.11.0-h434eaf2_3.conda + sha256: 8a21457233210ca69bae462d932d0513ccf6329a0914b2f454b42aa936ddf819 + md5: 5d0c1e7ef42363ed72969ed488703644 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-compression >=0.3.2,<0.3.3.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-http >=0.11.0,<0.11.1.0a0 + size: 231263 + timestamp: 1783192866041 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-ha0b0e19_6.conda + sha256: 5406c95965698b7998f9288a05a5aa138d7cc6af82e4a823d3afaca09170e06c + md5: bec59731db9cc0965f270a6e33a8db73 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - s2n >=1.7.5,<1.7.6.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-io >=0.26.3,<0.26.4.0a0 + size: 182092 + timestamp: 1783180025608 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.16.0-h4976820_1.conda + sha256: fa938630cc8ff9d1d29496f05bfe1afdfedb0c1c8ad895b009dc384e2e877c1a + md5: ee72798a2101d2849eb3e2e6f2a5410c + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-mqtt >=0.16.0,<0.16.1.0a0 + size: 224932 + timestamp: 1783205864451 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.12.6-hd767fb6_1.conda + sha256: 81abe7f421c630b168454f40d4daf58d73b09aab78f8d99b5d6c8e2d132bcfc7 + md5: aa4756841efe742938984663ef2397ef + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - openssl >=3.5.7,<4.0a0 + - aws-c-auth >=0.10.3,<0.10.4.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-s3 >=0.12.6,<0.12.7.0a0 + size: 154344 + timestamp: 1783471978484 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.7-haaf8e00_1.conda + sha256: e2653b11b1b222c9189cdf0362be5e2d347589d9ad5dfad25509860852e3ba85 + md5: 2eb431d738f8e5ee90aff8ac5d255456 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-common >=0.14.1,<0.14.2.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + size: 68604 + timestamp: 1783172608400 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-haaf8e00_3.conda + sha256: 90c4d073871f309cc35bc66da55eb169c9ac27790c51670963fd0a36a6e46f0d + md5: 394a24d9d451020541ba28c27fc6ef16 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-checksums >=0.2.10,<0.2.11.0a0 + size: 101925 + timestamp: 1783166893505 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.40.1-h085388a_2.conda + sha256: aef7545f1b8b9913be6500b093d9c48f2f213847ebad650241eb5f3ae457cda8 + md5: b486f1ffd023a845fd8966cd828eefd3 + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.12.6,<0.12.7.0a0 + - aws-c-auth >=0.10.3,<0.10.4.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-mqtt >=0.16.0,<0.16.1.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + size: 416431 + timestamp: 1783483029313 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.833-h799c9a6_8.conda + sha256: 2608dbc63fdb18feecff50dbdbde1f2331ef9bd4058c80a7bade5f48eca980de + md5: a2102f9d40aad9453580dec56e481c1b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + - libzlib >=1.3.2,<2.0a0 + - libcurl >=8.21.0,<9.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 + size: 3394406 + timestamp: 1783536782931 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.3-h206d751_0.conda + sha256: fffc66e9be8806a92b314e27129c42b1298ea7065028c9e5d175dacb07829261 + md5: 0cabc152dc8896c3a4c4aebf2b308627 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.19.0,<9.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + size: 349147 + timestamp: 1775238757304 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-h71f81a8_2.conda + sha256: ebca774f1ebaa24c150730603b418b33fc7862811a16d097716b1a29f34798c5 + md5: f4fc754ec17176046988c46a54962a8c + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + size: 250737 + timestamp: 1781268163278 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.18.0-h74b55db_1.conda + sha256: 04bb27dbf1d426b4447b28c3dc92ec01c807fa784eea86ffa1f8c2bd9b9e8076 + md5: 43151a3b0a8e037747d79a82dff9f967 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + size: 589716 + timestamp: 1781283775801 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.14.0-hf596fc9_1.conda + sha256: 8a806f9852d280926d7613df548889b49e2a1c5d836385bcb2cedb24e7b08c64 + md5: 7896f4a6ee78538e2d0261e3b36dfa69 + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + size: 159394 + timestamp: 1781268171097 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.16.0-h1f05bef_1.conda + sha256: 13e2e6eb942f65bf81e9089bf6b5926534d9245c781288c5270beb3a25c9156b + md5: 70972c9cb0893d6499dd4118415a966b + depends: + - __glibc >=2.17,<3.0.a0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 + size: 308699 + timestamp: 1781538835962 +- conda: https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-he440d0b_1.conda + sha256: e7af5d1183b06a206192ff440e08db1c4e8b2ca1f8376ee45fb2f3a85d4ee45d + md5: 2c2fae981fd2afd00812c92ac47d023d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - blosc >=1.21.6,<2.0a0 + size: 48427 + timestamp: 1733513201413 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-1.2.0-hed03a55_1.conda + sha256: e511644d691f05eb12ebe1e971fd6dc3ae55a4df5c253b4e1788b789bdf2dfa6 + md5: 8ccf913aaba749a5496c17629d859ed1 + depends: + - __glibc >=2.17,<3.0.a0 + - brotli-bin 1.2.0 hb03c661_1 + - libbrotlidec 1.2.0 hb03c661_1 + - libbrotlienc 1.2.0 hb03c661_1 + - libgcc >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + size: 20103 + timestamp: 1764017231353 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.2.0-hb03c661_1.conda + sha256: 64b137f30b83b1dd61db6c946ae7511657eead59fdf74e84ef0ded219605aa94 + md5: af39b9a8711d4a8d437b52c1d78eb6a1 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlidec 1.2.0 hb03c661_1 + - libbrotlienc 1.2.0 hb03c661_1 + - libgcc >=14 + license: MIT + license_family: MIT + run_exports: {} + size: 21021 + timestamp: 1764017221344 +- conda: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314h3de4e8d_1.conda + sha256: 3ad3500bff54a781c29f16ce1b288b36606e2189d0b0ef2f67036554f47f12b0 + md5: 8910d2c46f7e7b519129f486e0fe927a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + constrains: + - libbrotlicommon 1.2.0 hb03c661_1 + license: MIT + license_family: MIT + run_exports: {} + size: 367376 + timestamp: 1764017265553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda + sha256: 0b75d45f0bba3e95dc693336fa51f40ea28c980131fec438afb7ce6118ed05f6 + md5: d2ffd7602c02f2b316fd921d39876885 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: bzip2-1.0.6 + license_family: BSD + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 260182 + timestamp: 1771350215188 +- conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda + sha256: cc9accf72fa028d31c2a038460787751127317dcfa991f8d1f1babf216bb454e + md5: 920bb03579f15389b9e512095ad995b7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - c-ares >=1.34.6,<2.0a0 + size: 207882 + timestamp: 1765214722852 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda + sha256: 06525fa0c4e4f56e771a3b986d0fdf0f0fc5a3270830ee47e127a5105bde1b9a + md5: bb6c4808bfa69d6f7f6b07e5846ced37 + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.1,<79.0a0 + - libexpat >=2.7.3,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libgcc >=14 + - libglib >=2.86.3,<3.0a0 + - libpng >=1.6.53,<1.7.0a0 + - libstdcxx >=14 + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.46.4,<1.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.6,<2.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + license: LGPL-2.1-only or MPL-1.1 + run_exports: + weak: + - cairo >=1.18.4,<2.0a0 + size: 989514 + timestamp: 1766415934926 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py314ha0b5721_1.conda + sha256: 700d462314bc9d76ab5df7307829f700e1ee72230c660ab9147fb7721822e983 + md5: fe89c5fa422f215b0d75046ecd4667de + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - matplotlib-base >=3.6 + - numpy >=1.23,<3 + - packaging >=21 + - pyproj >=3.3.1 + - pyshp >=2.3 + - python >=3.14.0rc2,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - shapely >=2.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 1557508 + timestamp: 1756883731412 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.1.0-py314h4a8dc5f_0.conda + sha256: 39d0d45c4c73162c0aadd0b1bce6ce42ca354da65979f49d6084ff00ed5c26b4 + md5: 26f3b9c52441a170b2008cbc227f740a + depends: + - __glibc >=2.17,<3.0.a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - pycparser + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 306297 + timestamp: 1783424159025 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py314hc02f841_1.conda + sha256: 5889371679ebd4cc4d7a1b9a4a6f5ca7146527b9c6da14ba83f2edadbc45ac82 + md5: 552b5d9d8a2a4be882e1c638953e7281 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - numpy >=1.21.2 + - numpy >=1.23,<3 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 438385 + timestamp: 1768510929901 +- conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py314h97ea11e_4.conda + sha256: b0314a7f1fb4a294b1a8bcf5481d4a8d9412a9fee23b7e3f93fb10e4d504f2cc + md5: 95bede9cdb7a30a4b611223d52a01aa4 + depends: + - numpy >=1.25 + - python + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 324013 + timestamp: 1769155968691 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-49.0.0-py314h7fe84b3_0.conda + sha256: 1c8128f2ba8fccf627729968de7fe7504dbb775c829e533439c9ee52134800fd + md5: b1dd101231d277ad724c40c788f6fdd8 + depends: + - __glibc >=2.17,<3.0.a0 + - cffi >=2.0 + - libgcc >=14 + - openssl >=3.5.7,<4.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + constrains: + - __glibc >=2.17 + license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT + license_family: BSD + run_exports: {} + size: 1930691 + timestamp: 1781385496617 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.1.0-py314h5bd0f2a_2.conda + sha256: 5edb3c0fbf5c39b66f71fef0264d4fbab561f6adbdd7ef88188b725a82fcd6da + md5: a6a32cab83d59c7812ddbb03220057e3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - toolz >=0.10.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 641304 + timestamp: 1771855845410 +- conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda + sha256: 8bb557af1b2b7983cf56292336a1a1853f26555d9c6cecf1e5b2b96838c9da87 + md5: ce96f2f470d39bd96ce03945af92e280 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - libglib >=2.86.2,<3.0a0 + - libexpat >=2.7.3,<3.0a0 + license: AFL-2.1 OR GPL-2.0-or-later + run_exports: + weak: + - dbus >=1.16.2,<2.0a0 + size: 447649 + timestamp: 1764536047944 +- conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.21-py314h42812f9_0.conda + sha256: c16696b23e1d75b6eea7d0c8b9c31c03d1987eeb61852f09b6d4042ca015acd3 + md5: a7eb8029c4fe320c0179085707017c2d + depends: + - python + - libgcc >=14 + - libstdcxx >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 2842115 + timestamp: 1780390153580 +- conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda + sha256: a5b51e491fec22bcc1765f5b2c8fff8a97428e9a5a7ee6730095fb9d091b0747 + md5: 057083b06ccf1c2778344b6dabace38b + depends: + - __glibc >=2.17,<3.0.a0 + - libdrm >=2.4.125,<2.5.0a0 + - libegl >=1.7.0,<2.0a0 + - libegl-devel + - libgcc >=14 + - libgl >=1.7.0,<2.0a0 + - libgl-devel + - libglx >=1.7.0,<2.0a0 + - libglx-devel + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxxf86vm >=1.1.6,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - epoxy >=1.5.10,<1.6.0a0 + size: 411735 + timestamp: 1758743520805 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.18.1-h27c8c51_0.conda + sha256: 2e50bdcebdf70a865b81f2456bbc586386451ec601c60f2b6cd22b8c40a2d384 + md5: e0e050cfa9fa85fe39632ab11cb7f3e0 + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=14 + - libuuid >=2.42.1,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - fontconfig >=2.18.1,<3.0a0 + - fonts-conda-ecosystem + size: 281880 + timestamp: 1780450077431 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda + sha256: c934c385889c7836f034039b43b05ccfa98f53c900db03d8411189892ced090b + md5: 8462b5322567212beeb025f3519fb3e2 + depends: + - libfreetype 2.14.3 ha770c72_0 + - libfreetype6 2.14.3 h73754d4_0 + license: GPL-2.0-only OR FTL + run_exports: + weak: + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + size: 173839 + timestamp: 1774298173462 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h9dce30a_2.conda + sha256: c8960e00a6db69b85c16c693ce05484facf20f1a80430552145f652a880e0d2a + md5: ecb5d11305b8ba1801543002e69d2f2f + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.6.4,<3.0a0 + - libgcc >=13 + - libiconv >=1.17,<2.0a0 + - minizip >=4.0.7,<5.0a0 + license: MPL-1.1 + license_family: MOZILLA + run_exports: + weak: + - freexl >=2.0.0,<3.0a0 + size: 59299 + timestamp: 1734014884486 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda + sha256: 858283ff33d4c033f4971bf440cebff217d5552a5222ba994c49be990dacd40d + md5: f9f81ea472684d75b9dd8d0b328cf655 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-or-later + run_exports: + weak: + - fribidi >=1.0.16,<2.0a0 + size: 61244 + timestamp: 1757438574066 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.7-h2b0a6b4_0.conda + sha256: 1c22e37f9d7e06e9e0582ee5a55c2ddd19ea75f71f44eb13b56f504ef5c37aa5 + md5: 5d355db3e937086e22cf4cb5fe19787c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libglib >=2.88.2,<3.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - liblzma >=5.8.3,<6.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libtiff >=4.7.1,<4.8.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + run_exports: + weak: + - gdk-pixbuf >=2.44.7,<3.0a0 + size: 581631 + timestamp: 1782591374199 +- conda: https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda + sha256: 08896dcd94e14a83f247e91748444e610f344ab42d80cbf2b6082b481c3f8f4b + md5: 4d4efd0645cd556fab54617c4ad477ef + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: LGPL-2.1-only + run_exports: + weak: + - geos >=3.14.1,<3.14.2.0a0 + size: 1974942 + timestamp: 1761593471198 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda + sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a + md5: d411fc29e338efb48c5fd4576d71d881 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - gflags >=2.2.2,<2.3.0a0 + size: 119654 + timestamp: 1726600001928 +- conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda + sha256: aac402a8298f0c0cc528664249170372ef6b37ac39fdc92b40601a6aed1e32ff + md5: 3bf7b9fd5a7136126e0234db4b87c8b6 + depends: + - libgcc-ng >=12 + license: MIT + license_family: MIT + run_exports: + weak: + - giflib >=5.2.2,<5.3.0a0 + size: 77248 + timestamp: 1712692454246 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.88.2-h8094192_0.conda + sha256: 079757e4e0497d67505b52062668e4cc0d2a86ec065ae2c0c57487a178206061 + md5: cfe66c21ae651b84a3d25a1dbb641a54 + depends: + - libglib ==2.88.2 h0d30a3d_0 + - libffi + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: LGPL-2.1-or-later + run_exports: {} + size: 238517 + timestamp: 1782463895250 +- conda: https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda + sha256: dc824dc1d0aa358e28da2ecbbb9f03d932d976c8dca11214aa1dcdfcbd054ba2 + md5: ff862eebdfeb2fd048ae9dc92510baca + depends: + - gflags >=2.2.2,<2.3.0a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - glog >=0.7.1,<0.8.0a0 + size: 143452 + timestamp: 1718284177264 +- conda: https://conda.anaconda.org/conda-forge/linux-64/google-crc32c-1.8.0-py314hd6bf2bd_1.conda + sha256: b076f8b488c981f1c14149f5678f1de0f72f754eee9b2901e85c4dd97f71fc02 + md5: 9878f356d87ec8e4d2cd3c44561128be + depends: + - __glibc >=2.17,<3.0.a0 + - libcrc32c >=1.1.2,<1.2.0a0 + - libgcc >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 26245 + timestamp: 1768549199538 +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.15-hecca717_0.conda + sha256: 885fa7d1d7e2ad9ed0a700ee0d81ceb49de278253082d517959b22d6336eecce + md5: cf09e9fc938518e91d0706572cadf17a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: LGPL-2.0-or-later + license_family: LGPL + run_exports: + weak: + - graphite2 >=1.3.15,<2.0a0 + size: 100054 + timestamp: 1780454302233 +- conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda + sha256: 48d4aae8d2f7dd038b8c2b6a1b68b7bca13fa6b374b78c09fcc0757fa21234a1 + md5: 341fc61cfe8efa5c72d24db56c776f44 + depends: + - __glibc >=2.17,<3.0.a0 + - adwaita-icon-theme + - cairo >=1.18.4,<2.0a0 + - fonts-conda-ecosystem + - gdk-pixbuf >=2.44.4,<3.0a0 + - gtk3 >=3.24.43,<4.0a0 + - gts >=0.7.6,<0.8.0a0 + - libexpat >=2.7.3,<3.0a0 + - libgcc >=14 + - libgd >=2.3.3,<2.4.0a0 + - libglib >=2.86.3,<3.0a0 + - librsvg >=2.60.0,<3.0a0 + - libstdcxx >=14 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pango >=1.56.4,<2.0a0 + license: EPL-1.0 + license_family: Other + run_exports: + weak: + - graphviz >=14.1.2,<15.0a0 + size: 2426455 + timestamp: 1769427102743 +- conda: https://conda.anaconda.org/conda-forge/linux-64/greenlet-3.5.3-py314h42812f9_0.conda + sha256: 5560dd553d53751f70d7a64a4b9474799045d56ee8b4396c44f09e602babf551 + md5: 82a0491c0457c046b0da5d34cdd617cd + depends: + - python + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 268323 + timestamp: 1782524630562 +- conda: https://conda.anaconda.org/conda-forge/linux-64/grpcio-1.78.1-py314h5885658_0.conda + sha256: b788fe890209ad6da16aff17684a080055ebea0014e004299e5311e3894fd1c6 + md5: 6715c7d2b0e20d0e59fa72997ed759c5 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libgcc >=14 + - libgrpc 1.78.1 h1d1128b_0 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - typing-extensions >=4.12,<5 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 900313 + timestamp: 1774020522415 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gsw-3.6.23-h7c397b8_0.conda + noarch: python + sha256: cc968f6564f338ffc6e4febb318c037c664a3169abcff15509a67730b84a3839 + md5: 18d99b1b9aa3926069bd9197ef0bed24 + depends: + - python + - numpy + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - numpy >=1.23,<3 + - _python_abi3_support 1.* + - cpython >=3.11 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 2110677 + timestamp: 1782065447204 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda + sha256: c6bb4f06331bcb0a566d84e0f0fad7af4b9035a03b13e2d5ecfaf13be57e6e10 + md5: bcaea22d85999a4f17918acfab877e61 + depends: + - __glibc >=2.17,<3.0.a0 + - at-spi2-atk >=2.38.0,<3.0a0 + - atk-1.0 >=2.38.0 + - cairo >=1.18.4,<2.0a0 + - epoxy >=1.5.10,<1.6.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - fribidi >=1.0.16,<2.0a0 + - gdk-pixbuf >=2.44.5,<3.0a0 + - glib-tools + - harfbuzz >=13.2.1 + - hicolor-icon-theme + - libcups >=2.3.3,<2.4.0a0 + - libcups >=2.3.3,<3.0a0 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 + - libgcc >=14 + - libglib >=2.86.4,<3.0a0 + - liblzma >=5.8.2,<6.0a0 + - libxkbcommon >=1.13.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - pango >=1.56.4,<2.0a0 + - wayland >=1.25.0,<2.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 + - xorg-libxcomposite >=0.4.7,<1.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xorg-libxext >=1.3.7,<2.0a0 + - xorg-libxfixes >=6.0.2,<7.0a0 + - xorg-libxi >=1.8.2,<2.0a0 + - xorg-libxinerama >=1.1.6,<1.2.0a0 + - xorg-libxrandr >=1.5.5,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + run_exports: + weak: + - gtk3 >=3.24.52,<4.0a0 + - adwaita-icon-theme + size: 5939083 + timestamp: 1774288645605 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda + sha256: b5cd16262fefb836f69dc26d879b6508d29f8a5c5948a966c47fe99e2e19c99b + md5: 4d8df0b0db060d33c9a702ada998a8fe + depends: + - libgcc-ng >=12 + - libglib >=2.76.3,<3.0a0 + - libstdcxx-ng >=12 + license: LGPL-2.0-or-later + license_family: LGPL + run_exports: + weak: + - gts >=0.7.6,<0.8.0a0 + size: 318312 + timestamp: 1686545244763 +- conda: https://conda.anaconda.org/conda-forge/linux-64/h5py-3.16.0-nompi_py314hddf7a69_102.conda + sha256: 48e18f20bc1ff15433299dd77c20a4160eb29572eea799ae5a73632c6c3d7dfd + md5: d93afa30018997705dd04513eeb5ac0f + depends: + - __glibc >=2.17,<3.0.a0 + - cached-property + - hdf5 >=2.1.0,<3.0a0 + - libgcc >=14 + - numpy >=1.23,<3 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 1345557 + timestamp: 1775581268685 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.1-ha770c72_1.conda + sha256: 853beec89ff91cbbf630f1d305b69153eb28a3cb78af95ddc1fb4d30e524c6f4 + md5: 72e956a71241633d8c80aa198fd08784 + depends: + - libharfbuzz-devel 14.2.1 h17a8019_1 + license: MIT + license_family: MIT + run_exports: + weak: + - libharfbuzz >=14.2.1 + size: 11039 + timestamp: 1782800611635 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda + sha256: 0d09b6dc1ce5c4005ae1c6a19dc10767932ef9a5e9c755cfdbb5189ac8fb0684 + md5: bd77f8da987968ec3927990495dc22e4 + depends: + - libgcc-ng >=12 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libstdcxx-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - hdf4 >=4.2.15,<4.2.16.0a0 + size: 756742 + timestamp: 1695661547874 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hc8ae080_109.conda + sha256: 6aa4790c0cdaf5bda8fdd7049c6645e6e456b368acccc8dc1c08336f9f75868f + md5: 85e9d531a6f215a5002fd2174e2dcb35 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-c-auth >=0.10.3,<0.10.4.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-s3 >=0.12.6,<0.12.7.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.21.0,<9.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - hdf5 >=2.1.0,<3.0a0 + size: 4453138 + timestamp: 1783500273307 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda + sha256: 6d7e6e1286cb521059fe69696705100a03b006efb914ffe82a2ae97ecbae66b7 + md5: 129e404c5b001f3ef5581316971e3ea0 + license: GPL-2.0-or-later + license_family: GPL + run_exports: {} + size: 17625 + timestamp: 1771539597968 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a + md5: c80d8a3b84358cb967fa81e7075fbc8a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - icu >=78.3,<79.0a0 + size: 12723451 + timestamp: 1773822285671 +- conda: https://conda.anaconda.org/conda-forge/linux-64/json-c-0.18-h6688a6e_0.conda + sha256: 09e706cb388d3ea977fabcee8e28384bdaad8ce1fc49340df5f868a2bd95a7da + md5: 38f5dbc9ac808e31c00650f7be1db93f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + run_exports: + weak: + - json-c >=0.18,<0.19.0a0 + size: 82709 + timestamp: 1726487116178 +- conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + sha256: 0960d06048a7185d3542d850986d807c6e37ca2e644342dd0c72feefcf26c2a4 + md5: b38117a3c920364aff79f870c984b4a3 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-or-later + run_exports: + weak: + - keyutils >=1.6.3,<2.0a0 + size: 134088 + timestamp: 1754905959823 +- conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py314h97ea11e_0.conda + sha256: e3488ea4a336f29e57de8f282bf40c0505cfc482e03004615e694b48e7d9c79f + md5: 7397e418cab519b8d789936cf2dde6f6 + depends: + - python + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 77363 + timestamp: 1773067048780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-hbde042b_1.conda + sha256: 9b07046870772f28740e3f6149f09ff222843733087a33c5540b169c6289652d + md5: 54157a1c8c0bb70f62dd0b17fba7e7f2 + depends: + - __glibc >=2.17,<3.0.a0 + - keyutils >=1.6.3,<2.0a0 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - krb5 >=1.22.2,<1.23.0a0 + size: 1388990 + timestamp: 1781859420533 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.19.1-h0c24ade_1.conda + sha256: 112b5b9462572d970f4abd2912f76a25ee7db158b1e7260163d91dd8a630db84 + md5: 8b3ce45e929cd8e8e5f4d18586b56d8b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - lcms2 >=2.19.1,<3.0a0 + size: 251971 + timestamp: 1780211695895 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c + md5: 18335a698559cdbcd86150a48bf54ba6 + depends: + - __glibc >=2.17,<3.0.a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - binutils_impl_linux-64 2.45.1 + license: GPL-3.0-only + license_family: GPL + run_exports: {} + size: 728002 + timestamp: 1774197446916 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda + sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1 + md5: a752488c68f2e7c456bcbd8f16eec275 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - lerc >=4.1.0,<5.0a0 + size: 261513 + timestamp: 1773113328888 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda + sha256: a7a4481a4d217a3eadea0ec489826a69070fcc3153f00443aa491ed21527d239 + md5: 6f7b4302263347698fd24565fbf11310 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + constrains: + - libabseil-static =20260107.1=cxx17* + - abseil-cpp =20260107.1 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - libabseil >=20260107.1,<20260108.0a0 + - libabseil =*=cxx17* + size: 1384817 + timestamp: 1770863194876 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + sha256: 822e4ae421a7e9c04e841323526321185f6659222325e1a9aedec811c686e688 + md5: 86f7414544ae606282352fa1e116b41f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - libaec >=1.1.5,<2.0a0 + size: 36544 + timestamp: 1769221884824 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.8-gpl_hc2c16d8_100.conda + sha256: f916b51f55f51a9bb2d902e0a5f029490f7b745aee549c349751c1787ddc26b8 + md5: 44652e646cb623f486ea72e7e7479222 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - liblzma >=5.8.3,<6.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - lzo >=2.10,<3.0a0 + - openssl >=3.5.7,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - libarchive >=3.8.8,<3.9.0a0 + size: 867280 + timestamp: 1782289011634 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-24.0.0-h3e48024_9_cpu.conda + build_number: 9 + sha256: 92e0fe06d39351ecf8f2c1ce7ad47c552c34f2ebb692c145fa506bbe13bf109d + md5: 4cac0ddbb76d5294d0a5649633a0dc35 + depends: + - __glibc >=2.17,<3.0.a0 + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libgcc >=14 + - libgoogle-cloud >=3.6.0,<3.7.0a0 + - libgoogle-cloud-storage >=3.6.0,<3.7.0a0 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.3.0,<2.3.1.0a0 + - snappy >=1.2.2,<1.3.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - parquet-cpp <0.0a0 + - arrow-cpp <0.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libarrow >=24.0.0,<24.1.0a0 + size: 6514282 + timestamp: 1782267971657 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-24.0.0-h635bf11_9_cpu.conda + build_number: 9 + sha256: cddd787fb799a3f9d9a6a0c5110f7aa468fcc9d71aff213856876c36e694b279 + md5: cceb8bc7191b5916df504800e3e98056 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 24.0.0 h3e48024_9_cpu + - libarrow-compute 24.0.0 h53684a4_9_cpu + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libarrow-acero >=24.0.0,<24.1.0a0 + size: 590917 + timestamp: 1782268212749 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-24.0.0-h53684a4_9_cpu.conda + build_number: 9 + sha256: 465ab2256f9c9fcdd41e3a7ef28600bb34287f0fb58a970f7046c53b7e6cc51c + md5: d2162528bc0d112cac9be3b03f879164 + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 24.0.0 h3e48024_9_cpu + - libgcc >=14 + - libre2-11 >=2025.11.5 + - libstdcxx >=14 + - libutf8proc >=2.11.3,<2.12.0a0 + - re2 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libarrow-compute >=24.0.0,<24.1.0a0 + size: 2992308 + timestamp: 1782268094918 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-24.0.0-h635bf11_9_cpu.conda + build_number: 9 + sha256: 26add89d034b1fdf91334b63e9892af3087ae70c6c6605ad82a9f47ac7ae0eec + md5: f94da761b5d8029a07c2a8fcac021e4f + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 24.0.0 h3e48024_9_cpu + - libarrow-acero 24.0.0 h635bf11_9_cpu + - libarrow-compute 24.0.0 h53684a4_9_cpu + - libgcc >=14 + - libparquet 24.0.0 h7376487_9_cpu + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libarrow-dataset >=24.0.0,<24.1.0a0 + size: 590646 + timestamp: 1782268293863 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-24.0.0-hb4dd7c2_9_cpu.conda + build_number: 9 + sha256: dcdb718ef114704005210551b72e3be9d12e95134afe42629a1c14a28b59064e + md5: 71d9d232dad9b517b3b0f2112ab6dd8d + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 24.0.0 h3e48024_9_cpu + - libarrow-acero 24.0.0 h635bf11_9_cpu + - libarrow-dataset 24.0.0 h635bf11_9_cpu + - libgcc >=14 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libstdcxx >=14 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libarrow-substrait >=24.0.0,<24.1.0a0 + size: 501060 + timestamp: 1782268320794 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda + build_number: 8 + sha256: b2da6bfd72a1c9cb143ccf64bf5b28790cb4eb58bd1cb978f6537b2322f7d48b + md5: 00fc660ab1b2f5ca07e92b4900d10c79 + depends: + - libopenblas >=0.3.33,<0.3.34.0a0 + - libopenblas >=0.3.33,<1.0a0 + constrains: + - blas 2.308 openblas + - mkl <2027 + - libcblas 3.11.0 8*_openblas + - liblapack 3.11.0 8*_openblas + - liblapacke 3.11.0 8*_openblas + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libblas >=3.11.0,<4.0a0 + size: 18804 + timestamp: 1779859100675 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda + sha256: 318f36bd49ca8ad85e6478bd8506c88d82454cc008c1ac1c6bf00a3c42fa610e + md5: 72c8fd1af66bd67bf580645b426513ed + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - libbrotlicommon >=1.2.0,<1.3.0a0 + size: 79965 + timestamp: 1764017188531 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda + sha256: 12fff21d38f98bc446d82baa890e01fd82e3b750378fedc720ff93522ffb752b + md5: 366b40a69f0ad6072561c1d09301c886 + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.2.0 hb03c661_1 + - libgcc >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - libbrotlidec >=1.2.0,<1.3.0a0 + size: 34632 + timestamp: 1764017199083 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda + sha256: a0c15c79997820bbd3fbc8ecf146f4fe0eca36cc60b62b63ac6cf78857f1dd0d + md5: 4ffbb341c8b616aa2494b6afb26a0c5f + depends: + - __glibc >=2.17,<3.0.a0 + - libbrotlicommon 1.2.0 hb03c661_1 + - libgcc >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - libbrotlienc >=1.2.0,<1.3.0a0 + size: 298378 + timestamp: 1764017210931 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda + build_number: 8 + sha256: 1a2bc77bb26520255904a3d9b1f40e6bf0bf9d8d3405c7709dd162282820915a + md5: 33a413f1095f8325e5c30fde3b0d2445 + depends: + - libblas 3.11.0 8_h4a7cf45_openblas + constrains: + - blas 2.308 openblas + - liblapacke 3.11.0 8*_openblas + - liblapack 3.11.0 8*_openblas + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libcblas >=3.11.0,<4.0a0 + size: 18778 + timestamp: 1779859107964 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 + sha256: fd1d153962764433fe6233f34a72cdeed5dcf8a883a85769e8295ce940b5b0c5 + md5: c965a5aa0d5c1c37ffc62dff36e28400 + depends: + - libgcc-ng >=9.4.0 + - libstdcxx-ng >=9.4.0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libcrc32c >=1.1.2,<1.2.0a0 + size: 20440 + timestamp: 1633683576494 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + sha256: 205c4f19550f3647832ec44e35e6d93c8c206782bdd620c1d7cf66237580ff9c + md5: 49c553b47ff679a6a1e9fc80b9c5a2d4 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - libcups >=2.3.3,<2.4.0a0 + size: 4518030 + timestamp: 1770902209173 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.21.0-hae6b9f4_2.conda + sha256: ba8354084b34fce56d5697982fce4a384c148e972e15c0ab891187617fe7ec29 + md5: f9c59d277a16ec8f272b2d5dd2ec3335 + depends: + - __glibc >=2.17,<3.0.a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libnghttp2 >=1.68.1,<2.0a0 + - libpsl >=0.22.0,<0.23.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + run_exports: + weak: + - libcurl >=8.21.0,<9.0a0 + size: 480327 + timestamp: 1782911787190 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda + sha256: aa8e8c4be9a2e81610ddf574e05b64ee131fab5e0e3693210c9d6d2fba32c680 + md5: 6c77a605a7a689d17d4819c0f8ac9a00 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - libdeflate >=1.25,<1.26.0a0 + size: 73490 + timestamp: 1761979956660 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.127-hb03c661_0.conda + sha256: 7d3187c11b7ae66c5595a8afd5a7ce352a490527fdf6614cab129bc7f2c16ba3 + md5: d8d16b9b32a3c5df7e5b3350e2cbe058 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpciaccess >=0.19,<0.20.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libdrm >=2.4.127,<2.5.0a0 + size: 311505 + timestamp: 1778975798004 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + sha256: d789471216e7aba3c184cd054ed61ce3f6dac6f87a50ec69291b9297f8c18724 + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + depends: + - ncurses + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - libedit >=3.1.20250104,<3.2.0a0 + size: 134676 + timestamp: 1738479519902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_3.conda + sha256: 9a25ea93e8272785405a21d30f84e620befb1d545f6dfaae18f06103b5df0443 + md5: 75e9f795be506c96dd43cb09c7c8d557 + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_3 + license: LicenseRef-libglvnd + run_exports: {} + size: 46500 + timestamp: 1779728188901 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_3.conda + sha256: e4b46919c9bb65930bce238bd2736110ed7b8c30e5cd5394e4e1edb48de54843 + md5: 5bc6d55503483aabe8a90c5e7f49a2a4 + depends: + - __glibc >=2.17,<3.0.a0 + - libegl 1.7.0 ha4b6fd6_3 + - libgl-devel 1.7.0 ha4b6fd6_3 + - xorg-libx11 + license: LicenseRef-libglvnd + run_exports: + weak: + - libegl >=1.7.0,<2.0a0 + size: 31718 + timestamp: 1779728222280 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + md5: 172bf1cd1ff8629f2b1179945ed45055 + depends: + - libgcc-ng >=12 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - libev >=4.33,<4.34.0a0 + size: 112766 + timestamp: 1702146165126 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda + sha256: 2e14399d81fb348e9d231a82ca4d816bf855206923759b69ad006ba482764131 + md5: a1cfcc585f0c42bf8d5546bb1dfb668d + depends: + - libgcc-ng >=12 + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libevent >=2.1.12,<2.1.13.0a0 + size: 427426 + timestamp: 1685725977222 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda + sha256: 16feffd9ddbbe5b718515d38ee376c685ba95491cd901244e24671d20b952a77 + md5: b24d3c612f71e7aa74158d92106318b2 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - expat 2.8.1.* + license: MIT + license_family: MIT + run_exports: {} + size: 77856 + timestamp: 1781203599810 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda + sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 + md5: a360c33a5abe61c07959e449fa1453eb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - libffi >=3.5.2,<3.6.0a0 + size: 58592 + timestamp: 1769456073053 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + sha256: 38f014a7129e644636e46064ecd6b1945e729c2140e21d75bb476af39e692db2 + md5: e289f3d17880e44b633ba911d57a321b + depends: + - libfreetype6 >=2.14.3 + license: GPL-2.0-only OR FTL + run_exports: {} + size: 8049 + timestamp: 1774298163029 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda + sha256: 16f020f96da79db1863fcdd8f2b8f4f7d52f177dd4c58601e38e9182e91adf1d + md5: fb16b4b69e3f1dcfe79d80db8fd0c55d + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpng >=1.6.55,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - freetype >=2.14.3 + license: GPL-2.0-only OR FTL + run_exports: {} + size: 384575 + timestamp: 1774298162622 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda + sha256: 8e0a3b5e41272e5678499b5dfc4cddb673f9e935de01eb0767ce857001229f46 + md5: 57736f29cc2b0ec0b6c2952d3f101b6a + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + constrains: + - libgcc-ng ==15.2.0=*_19 + - libgomp 15.2.0 he0feb66_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 1041084 + timestamp: 1778269013026 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda + sha256: 9dcf54adfaa5e861123c2da4f2f0451a685464ea7e5a41ad91cf67b31d658d98 + md5: 331ee9b72b9dff570d56b1302c5ab37d + depends: + - libgcc 15.2.0 he0feb66_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: + strong: + - libgcc + size: 27694 + timestamp: 1778269016987 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5fbf134_12.conda + sha256: 245be793e831170504f36213134f4c24eedaf39e634679809fd5391ad214480b + md5: 88c1c66987cd52a712eea89c27104be6 + depends: + - __glibc >=2.17,<3.0.a0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.1,<79.0a0 + - libexpat >=2.7.3,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libgcc >=14 + - libjpeg-turbo >=3.1.2,<4.0a0 + - libpng >=1.6.53,<1.7.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: GD + license_family: BSD + run_exports: + weak: + - libgd >=2.3.3,<2.4.0a0 + size: 177306 + timestamp: 1766331805898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-core-3.12.3-he63569f_3.conda + sha256: 298497351f4a7dc94938a1ad8dc3df545a07efdc5f1b91b9256d04e65959a430 + md5: 83666e2c330f47ee6268396ee4467b63 + depends: + - __glibc >=2.17,<3.0.a0 + - blosc >=1.21.6,<2.0a0 + - geos >=3.14.1,<3.14.2.0a0 + - giflib >=5.2.2,<5.3.0a0 + - json-c >=0.18,<0.19.0a0 + - lerc >=4.1.0,<5.0a0 + - libarchive >=3.8.6,<3.9.0a0 + - libcurl >=8.19.0,<9.0a0 + - libdeflate >=1.25,<1.26.0a0 + - libexpat >=2.7.5,<3.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - libjxl >=0.11,<0.12.0a0 + - libkml >=1.3.0,<1.4.0a0 + - liblzma >=5.8.2,<6.0a0 + - libpng >=1.6.57,<1.7.0a0 + - libspatialite >=5.1.0,<5.2.0a0 + - libsqlite >=3.52.0,<4.0a0 + - libstdcxx >=14 + - libwebp-base >=1.6.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - muparser >=2.3.5,<2.4.0a0 + - openssl >=3.5.6,<4.0a0 + - pcre2 >=10.47,<10.48.0a0 + - proj >=9.7.1,<9.8.0a0 + - xerces-c >=3.3.0,<3.4.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - libgdal 3.12.3.* + license: MIT + license_family: MIT + run_exports: + weak: + - libgdal-core >=3.12.3,<3.13.0a0 + size: 12920201 + timestamp: 1775712965350 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda + sha256: 561a42758ef25b9ce308c4e2cf56daee4f06138385a17e29a492cd928e00be6f + md5: 42bf7eca1a951735fa06c0e3c0d5c8e6 + depends: + - libgfortran5 15.2.0 h68bc16d_19 + constrains: + - libgfortran-ng ==15.2.0=*_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 27655 + timestamp: 1778269042954 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda + sha256: 057978bb69fea29ed715a9b98adf71015c31baecc4aeb2bfc20d4fd5d83579d4 + md5: 85072b0ad177c966294f129b7c04a2d5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 2483673 + timestamp: 1778269025089 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_3.conda + sha256: ec353b3076ed8e357ed961d0e9ff6997491cade0e603de5bd18a2e301ac78ebd + md5: f25206d7322c0e9648e8b83694d143ab + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_3 + - libglx 1.7.0 ha4b6fd6_3 + license: LicenseRef-libglvnd + run_exports: {} + size: 133469 + timestamp: 1779728207669 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_3.conda + sha256: 41d7d864ad1f199bdb06ff6cc3931455c8af62f1d2071a08c6fa08affbcb678f + md5: 63e43d278ee5084813fe3c2edf4834ce + depends: + - __glibc >=2.17,<3.0.a0 + - libgl 1.7.0 ha4b6fd6_3 + - libglx-devel 1.7.0 ha4b6fd6_3 + license: LicenseRef-libglvnd + run_exports: + weak: + - libgl >=1.7.0,<2.0a0 + size: 115664 + timestamp: 1779728218325 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.88.2-h0d30a3d_0.conda + sha256: 4bee10e62796f01e4fa2b5849135b1cc061337fe9cf5eb9bd79e9664922ae0e4 + md5: 889febc66cd9e4190f80ef9718fa239b + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libiconv >=1.18,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - libffi >=3.5.2,<3.6.0a0 + - pcre2 >=10.47,<10.48.0a0 + constrains: + - glib >2.66 + license: LGPL-2.1-or-later + run_exports: + weak: + - libglib >=2.88.2,<3.0a0 + size: 4754220 + timestamp: 1782463895250 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_3.conda + sha256: e019ebe4e3f5cdf23e2f5e58ddf7ade27988c53820115b17b98f218ebcc87748 + md5: eb83f3f8cecc3e9bff9e250817fc69b6 + depends: + - __glibc >=2.17,<3.0.a0 + license: LicenseRef-libglvnd + run_exports: {} + size: 133586 + timestamp: 1779728183422 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_3.conda + sha256: 2f74713c9ca408ea84e88a30a9028153e7b553e8bb42e06139eac9a753c27da9 + md5: ec3c4350aa0261bf7f87b8ca15c8e80e + depends: + - __glibc >=2.17,<3.0.a0 + - libglvnd 1.7.0 ha4b6fd6_3 + - xorg-libx11 >=1.8.13,<2.0a0 + license: LicenseRef-libglvnd + run_exports: {} + size: 76586 + timestamp: 1779728199059 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_3.conda + sha256: a17ae2d4cb2de04a20882ae14ec3cc1958e868a4dec81e3d7eca30115ee50e94 + md5: 16b6330783ce0d1ae8d22782173b32c9 + depends: + - __glibc >=2.17,<3.0.a0 + - libglx 1.7.0 ha4b6fd6_3 + - xorg-libx11 >=1.8.13,<2.0a0 + - xorg-xorgproto + license: LicenseRef-libglvnd + run_exports: + weak: + - libglx >=1.7.0,<2.0a0 + size: 27363 + timestamp: 1779728211402 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + sha256: 5abe4ab9d93f6c9757d654f1969ae2267d4505315c1f2f8fe705fd60af084f1b + md5: faac990cb7aedc7f3a2224f2c9b0c26c + depends: + - __glibc >=2.17,<3.0.a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: + strong: + - _openmp_mutex >=4.5 + size: 603817 + timestamp: 1778268942614 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.6.0-h8d2ee43_0.conda + sha256: eb6fe89a6e2ffa6b485c437022e15d2173c2da3ada86690cf250bcfe6f6382d5 + md5: 50a88a9c7d89d854336c633966b67e56 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.20.0,<9.0a0 + - libgcc >=14 + - libgrpc >=1.78.1,<1.79.0a0 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libstdcxx >=14 + - openssl >=3.5.7,<4.0a0 + constrains: + - libgoogle-cloud 3.6.0 *_0 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - libgoogle-cloud >=3.6.0,<3.7.0a0 + size: 2680630 + timestamp: 1781922536584 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.6.0-hdbdcf42_0.conda + sha256: 2d94ab8302408d34894024a80604e85936bb208a487841a222cafdb15c143f23 + md5: a5001567e3c2758834d63129ecb89bb1 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgcc >=14 + - libgoogle-cloud 3.6.0 h8d2ee43_0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - libgoogle-cloud-storage >=3.6.0,<3.7.0a0 + size: 785866 + timestamp: 1781922659639 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda + sha256: 5bb935188999fd70f67996746fd2dca85ec6204289e11695c316772e19451eb8 + md5: b5fb6d6c83f63d83ef2721dca6ff7091 + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.6,<2.0a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libgcc >=14 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libre2-11 >=2025.11.5 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.78.1 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libgrpc >=1.78.1,<1.79.0a0 + size: 7021360 + timestamp: 1774020290672 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-14.2.1-h17a8019_1.conda + sha256: 821c315f6b5171aa89e735be2ad84e74eb3f898fc7610ee36cfecd95dfa789e8 + md5: fb4669c3990b94ea32fbb81f433e9aa6 + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.15,<2.0a0 + - icu >=78.3,<79.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=14 + - libglib >=2.88.2,<3.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + run_exports: {} + size: 1297668 + timestamp: 1782800580119 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libharfbuzz-devel-14.2.1-h17a8019_1.conda + sha256: 6d8e793042affd18ca1784b7794fab14d16f54f984777ce6ab86bacaa465ab0d + md5: 99cf21100441e51272f1cd6fe0632a20 + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - freetype + - graphite2 >=1.3.15,<2.0a0 + - icu >=78.3,<79.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=14 + - libglib >=2.88.2,<3.0a0 + - libharfbuzz 14.2.1 h17a8019_1 + - libpng >=1.6.58,<1.7.0a0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libharfbuzz >=14.2.1 + size: 1970690 + timestamp: 1782800603897 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.4.0-h10be129_0.conda + sha256: 8b70955d5e9a49d08945d4f8e2eab855b2efa5fce9cb9bc5e75d86764e6f2f38 + md5: 3a9428b74c403c71048104d38437b48c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: Apache-2.0 OR BSD-3-Clause + run_exports: + weak: + - libhwy >=1.4.0,<1.5.0a0 + size: 1435782 + timestamp: 1776989559668 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f + md5: 915f5995e94f60e9a4826e0b0920ee88 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-only + run_exports: + weak: + - libiconv >=1.18,<2.0a0 + size: 790176 + timestamp: 1754908768807 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.2.0-hb03c661_0.conda + sha256: 716332fd31b3808da7a4235a05212a9e9da05e854864c3def2dea0b5d2bf7610 + md5: 466badda5536d85ddc63ee9404f29735 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + run_exports: + weak: + - libjpeg-turbo >=3.2.0,<4.0a0 + size: 652868 + timestamp: 1783731886811 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.2-h174a0a3_1.conda + sha256: 0c8a78c6a42a6e4c6de3a5e82d692f60400d43f4cc80591745f28b37daad9c70 + md5: 850f48943d6b4589800a303f0de6a816 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libhwy >=1.4.0,<1.5.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libjxl >=0.11,<1.0a0 + size: 1846962 + timestamp: 1777065125966 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-haa4a5bd_1023.conda + sha256: f6348ac9cebbc03f765ea6d2da88d57d19531585c8f3a963b98635b208e8bef1 + md5: 953b7cca897e21215302dbfe2af5cd0c + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.7.5,<3.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - uriparser >=0.9.8,<1.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 412514 + timestamp: 1777026799177 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda + build_number: 8 + sha256: 168e327d737059553e15cc6ec36d76b9bbb3931c2a7721555fd68b4c9348b247 + md5: 809be8ba8712c77bc7d44c2d99390dc4 + depends: + - libblas 3.11.0 8_h4a7cf45_openblas + constrains: + - blas 2.308 openblas + - libcblas 3.11.0 8*_openblas + - liblapacke 3.11.0 8*_openblas + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - liblapack >=3.11.0,<3.12.0a0 + size: 18790 + timestamp: 1779859115086 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda + sha256: ec30e52a3c1bf7d0425380a189d209a52baa03f22fb66dd3eb587acaa765bd6d + md5: b88d90cad08e6bc8ad540cb310a761fb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - xz 5.8.3.* + license: 0BSD + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 113478 + timestamp: 1775825492909 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb03c661_1.conda + sha256: fe171ed5cf5959993d43ff72de7596e8ac2853e9021dec0344e583734f1e0843 + md5: 2c21e66f50753a083cbe6b80f38268fa + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 92400 + timestamp: 1769482286018 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.1-nompi_he3e3c8e_200.conda + build_number: 100 + sha256: 4dae1dcf200bb832febf235f8fdc3c3535a7cf327cd9c8bf892f7d687146b592 + md5: 2f5600a2c7cd25b8af58f2a193a51c42 + depends: + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - hdf5 >=2.1.0,<3.0a0 + - zstd >=1.5.7,<1.6.0a0 + - libzip >=1.11.2,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libcurl >=8.21.0,<9.0a0 + - bzip2 >=1.0.8,<2.0a0 + - hdf4 >=4.2.15,<4.2.16.0a0 + - libzlib >=1.3.2,<2.0a0 + - blosc >=1.21.6,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - libaec >=1.1.5,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libnetcdf >=4.10.1,<4.10.2.0a0 + size: 985282 + timestamp: 1783810904506 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda + sha256: 663444d77a42f2265f54fb8b48c5450bfff4388d9c0f8253dd7855f0d993153f + md5: 2a45e7f8af083626f009645a6481f12d + depends: + - __glibc >=2.17,<3.0.a0 + - c-ares >=1.34.6,<2.0a0 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libnghttp2 >=1.68.1,<2.0a0 + size: 663344 + timestamp: 1773854035739 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda + sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 + md5: d864d34357c3b65a4b731f78c0801dc4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.1-only + license_family: GPL + run_exports: + weak: + - libnsl >=2.0.1,<2.1.0a0 + size: 33731 + timestamp: 1750274110928 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda + sha256: 3d9aa85648e5e18a6d66db98b8c4317cc426721ad7a220aa86330d1ccedc8903 + md5: 2d3278b721e40468295ca755c3b84070 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + constrains: + - openblas >=0.3.33,<0.3.34.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libopenblas >=0.3.33,<1.0a0 + size: 5931919 + timestamp: 1776993658641 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.27.0-h9692893_0.conda + sha256: 247b99f5dd32363d7231c9c5a6ad113e0b58ad3e85d68227999b5933d5005a6d + md5: 2a44700a9857b49a3fe72aca643d0921 + depends: + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.20.0,<9.0a0 + - libgrpc >=1.78.1,<1.79.0a0 + - libopentelemetry-cpp-headers 1.27.0 ha770c72_0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.2,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.27.0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + size: 943253 + timestamp: 1778721388532 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.27.0-ha770c72_0.conda + sha256: 4a55bd84d166395a117592bb6139cf645eb402416987b856b41f96ba7b9d15d6 + md5: f8dcb0cff8f84f428bf76f1169bf50a7 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 392177 + timestamp: 1778721367721 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-24.0.0-h7376487_9_cpu.conda + build_number: 9 + sha256: 6c0635c86d7987fa89b07e0ce6664e8b2fcf0b6f0a0055a16a97d07b2c7af4e5 + md5: f86267ec3072c21c2c632e3a4f5e64cc + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 24.0.0 h3e48024_9_cpu + - libgcc >=14 + - libstdcxx >=14 + - libthrift >=0.22.0,<0.22.1.0a0 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libparquet >=24.0.0,<24.1.0a0 + size: 1427336 + timestamp: 1782268184558 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.19-hb03c661_0.conda + sha256: f41721636a7c2e51bc2c642e1127955ab9c81145470714fdaac44d4d09e4af41 + md5: 33082e13b4769b48cfeb648e15bfe3fc + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - libpciaccess >=0.19,<0.20.0a0 + size: 29147 + timestamp: 1773533027610 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + sha256: 377cfe037f3eeb3b1bf3ad333f724a64d32f315ee1958581fc671891d63d3f89 + md5: eba48a68a1a2b9d3c0d9511548db85db + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.2,<2.0a0 + license: zlib-acknowledgement + run_exports: + weak: + - libpng >=1.6.58,<1.7.0a0 + size: 317729 + timestamp: 1776315175087 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h538a264_2.conda + sha256: eb296398f05e3c1d0df2b616e7dd58b1d764540b5241ecf796480cdf82b29d2a + md5: 0f310965b9db4ef4ed9cd8a1672d9404 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libprotobuf >=6.33.5,<6.33.6.0a0 + size: 3668552 + timestamp: 1783168697169 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpsl-0.22.0-h49b2146_1.conda + sha256: 71118885feab91c61bea4e9532ec46e0653b24f02e563681f822915aee8435bb + md5: af5ddfb52ad25d833c70c7511478d4eb + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.3,<79.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - libpsl >=0.22.0,<0.23.0a0 + size: 70092 + timestamp: 1783936855082 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libraqm-0.10.5-h6406941_1.conda + sha256: 7c9e562842f193f772ef0ba681f238a2d9e5ef637588b6e46eb30cc6aa1940c8 + md5: fa63517815747363c41b439ff9301db1 + depends: + - __glibc >=2.28,<3.0.a0 + - libgcc >=14 + - libharfbuzz >=14.2.1 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - fribidi >=1.0.16,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libraqm >=0.10.5,<0.11.0a0 + size: 29441 + timestamp: 1782807076031 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda + sha256: 138fc85321a8c0731c1715688b38e2be4fb71db349c9ab25f685315095ae70ff + md5: ced7f10b6cfb4389385556f47c0ad949 + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.0,<20260108.0a0 + - libgcc >=14 + - libstdcxx >=14 + constrains: + - re2 2025.11.05.* + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libre2-11 >=2025.11.5 + size: 213122 + timestamp: 1768190028309 +- conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.3-h4c96295_0.conda + sha256: 5571bd8239d71961d4e3ce972f865b3ea95a91ce0b53d5749fe2dd24254ddbda + md5: 492c8d9b1c564c2e948b6cb4ba0f8261 + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - fontconfig >=2.18.0,<3.0a0 + - fonts-conda-ecosystem + - gdk-pixbuf >=2.44.6,<3.0a0 + - harfbuzz >=14.2.0 + - libgcc >=14 + - libglib >=2.88.1,<3.0a0 + - libxml2-16 >=2.14.6 + - pango >=1.56.4,<2.0a0 + constrains: + - __glibc >=2.17 + license: LGPL-2.1-or-later + run_exports: + weak: + - librsvg >=2.62.3,<3.0a0 + size: 3476570 + timestamp: 1780450632624 +- conda: https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h46dd2a8_20.conda + sha256: eb4082a5135102f5ba9c302da13164d4ed1181d5f0db9d49e5e11a815a7b526f + md5: df81fd57eacf341588d728c97920e86d + depends: + - __glibc >=2.17,<3.0.a0 + - geos >=3.14.1,<3.14.2.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: GPL-2.0-or-later + license_family: GPL + run_exports: + weak: + - librttopo >=1.1.0,<1.2.0a0 + size: 231670 + timestamp: 1761670395043 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.22-h280c20c_1.conda + sha256: b677bbf1c339d894757c3dcfbb2f88649e499e4991d70ae09a1466da9a6c92d6 + md5: 965e4d531b588b2e42f66fd8e48b056c + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: ISC + run_exports: + weak: + - libsodium >=1.0.22,<1.0.23.0a0 + size: 269272 + timestamp: 1779163468406 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-gpl_h2abfd87_119.conda + sha256: 403c1ad74ee70caaac02216a233ef9ec4531497ee14e7fea93a254a005ece88d + md5: 887245164c408c289d0cb45bd508ce5f + depends: + - __glibc >=2.17,<3.0.a0 + - freexl >=2 + - freexl >=2.0.0,<3.0a0 + - geos >=3.14.1,<3.14.2.0a0 + - libgcc >=14 + - librttopo >=1.1.0,<1.2.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libstdcxx >=14 + - libxml2 + - libxml2-16 >=2.14.6 + - libxml2-devel + - libzlib >=1.3.1,<2.0a0 + - proj >=9.7.0,<9.8.0a0 + - sqlite + - zlib + license: MPL-1.1 + license_family: MOZILLA + run_exports: + weak: + - libspatialite >=5.1.0,<5.2.0a0 + size: 4097449 + timestamp: 1761681679109 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.3-h0c1763c_0.conda + sha256: 365376f4815e5e80def2b3462a2419708b7c292da0da85278386c2618621fff4 + md5: 4aed8e657e9ff156bdbe849b4df44389 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.2,<2.0a0 + license: blessing + run_exports: + weak: + - libsqlite >=3.53.3,<4.0a0 + size: 962119 + timestamp: 1782519076616 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 + md5: eecce068c7e4eddeb169591baac20ac4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libssh2 >=1.11.1,<2.0a0 + size: 304790 + timestamp: 1745608545575 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + sha256: dff1058c76ec6b8759e41cefa2508162d00e4a5e6721aa68ec3fd10094e702dc + md5: 5794b3bdc38177caf969dabd3af08549 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc 15.2.0 he0feb66_19 + constrains: + - libstdcxx-ng ==15.2.0=*_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 5852044 + timestamp: 1778269036376 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_19.conda + sha256: 0672b6b6e1791c92e8eccad58081a99d614fcf82bca5841f9dfa3c3e658f83b9 + md5: e5ce228e579726c07255dbf90dc62101 + depends: + - libstdcxx 15.2.0 h934c35e_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: + strong: + - libstdcxx + size: 27776 + timestamp: 1778269074600 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h7d032f7_2.conda + sha256: af6025aa4a4fc3f4e71334000d2739d927e2f678607b109ec630cc17d716918a + md5: b6e326fbe1e3948da50ec29cee0380db + depends: + - __glibc >=2.17,<3.0.a0 + - libevent >=2.1.12,<2.1.13.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libthrift >=0.22.0,<0.22.1.0a0 + size: 423861 + timestamp: 1777018957474 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.2-h9d88235_0.conda + sha256: b31346e1c01ab40a170e91147092ee8fd92b1dee3c66ee47ef025571c879b159 + md5: c1fcb4a88bc15a9f77ad8d27d7af1df9 + depends: + - __glibc >=2.17,<3.0.a0 + - lerc >=4.1.0,<5.0a0 + - libdeflate >=1.25,<1.26.0a0 + - libgcc >=14 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - liblzma >=5.8.3,<6.0a0 + - libstdcxx >=14 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + run_exports: + weak: + - libtiff >=4.7.2,<4.8.0a0 + size: 452337 + timestamp: 1783084902636 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + sha256: ecbf4b7520296ed580498dc66a72508b8a79da5126e1d6dc650a7087171288f9 + md5: 1247168fe4a0b8912e3336bccdbf98a5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - libutf8proc >=2.11.3,<2.12.0a0 + size: 85969 + timestamp: 1768735071295 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda + sha256: 9b1bdce27a7e31f7d241aeecff67a1f3101d52a2b1e33ccc2cdf2613072bf81f + md5: 01bb81d12c957de066ea7362007df642 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libuuid >=2.42.2,<3.0a0 + size: 40017 + timestamp: 1781625522462 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda + sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b + md5: aea31d2e5b1091feca96fcfe945c3cf9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libwebp-base >=1.6.0,<2.0a0 + size: 429011 + timestamp: 1752159441324 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda + sha256: 666c0c431b23c6cec6e492840b176dde533d48b7e6fb8883f5071223433776aa + md5: 92ed62436b625154323d40d5f2f11dd7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + run_exports: + weak: + - libxcb >=1.17.0,<2.0a0 + size: 395888 + timestamp: 1727278577118 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.13.2-hca5e8e5_0.conda + sha256: 046f2ff4acebd8729fac03e99c8c307dfb48b6a32894ba8c11576e78f6e76e43 + md5: dc8b067e22b414172bedd8e3f03f3c95 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libxcb >=1.17.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - xkeyboard-config + - xorg-libxau >=1.0.12,<2.0a0 + license: MIT/X11 Derivative + license_family: MIT + run_exports: + weak: + - libxkbcommon >=1.13.2,<2.0a0 + size: 851166 + timestamp: 1780213397575 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_0.conda + sha256: 3d44f737c5ae52d5af32682cc1530df433f401f8e58a7533926536244127572a + md5: e79d2c2f24b027aa8d5ab1b1ba3061e7 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.3,<79.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - libxml2 2.15.3 + license: MIT + license_family: MIT + run_exports: {} + size: 559775 + timestamp: 1776376739004 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_0.conda + sha256: 3bc5551720c58591f6ea1146f7d1539c734ed1c40e7b9f5cb8cb7e900c509aba + md5: 995d8c8bad2a3cc8db14675a153dec2b + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.3,<79.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.3 hca6bf5a_0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libxml2 + - libxml2-16 >=2.15.3 + size: 46810 + timestamp: 1776376751152 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-devel-2.15.3-h49c6c72_0.conda + sha256: adada9c781ea51faea3e3adcd6883dc294ff2fa044c7f4e199430a11862dfa40 + md5: be70cb50dd0ecc1531c58034d38f72e0 + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.3,<79.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2 2.15.3 h49c6c72_0 + - libxml2-16 2.15.3 hca6bf5a_0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libxml2 + - libxml2-16 >=2.15.3 + size: 80529 + timestamp: 1776376762779 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda + sha256: 0694760a3e62bdc659d90a14ae9c6e132b525a7900e59785b18a08bb52a5d7e5 + md5: 87e6096ec6d542d1c1f8b33245fe8300 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libxml2 + - libxml2-16 >=2.14.6 + license: MIT + license_family: MIT + run_exports: + weak: + - libxslt >=1.1.43,<2.0a0 + size: 245434 + timestamp: 1757963724977 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda + sha256: 991e7348b0f650d495fb6d8aa9f8c727bdf52dabf5853c0cc671439b160dce48 + md5: a7b27c075c9b7f459f1c022090697cba + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=13 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libzip >=1.11.2,<2.0a0 + size: 109043 + timestamp: 1730442108429 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 + md5: d87ff7921124eccd67248aa483c23fec + depends: + - __glibc >=2.17,<3.0.a0 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 63629 + timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.47.0-py314h946fb2a_1.conda + sha256: e77292afb920e8b46f75c98a370d79aa4a922ff1ebed38c54381ad5d613c834e + md5: 22feb934c64b2d62b3b2b278eb40629e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 34134565 + timestamp: 1776076748673 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-6.1.1-py314hae3bed6_0.conda + sha256: 7238bd901bc6efe5d568c74a32d67f4135abbbdebfd6954a2e48b3aa399835cd + md5: d541b0e73ecc183f9062a1aa95acbd1b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libxml2 + - libxml2-16 >=2.14.6 + - libxslt >=1.1.43,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause and MIT-CMU + run_exports: {} + size: 1583195 + timestamp: 1779194870520 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py314hd4c109c_1.conda + sha256: 7f3083018be486b73c82e5e2421ab882d5231fcd424843c96058b01ce5f3cbaf + md5: 2f6295571ea5e9278046efc3ef377a98 + depends: + - python + - lz4-c + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.14.* *_cp314 + - lz4-c >=1.10.0,<1.11.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 45224 + timestamp: 1765026391393 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + md5: 9de5350a85c4a20c685259b889aa6393 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - lz4-c >=1.10.0,<1.11.0a0 + size: 167055 + timestamp: 1733741040117 +- conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda + sha256: 5c6bbeec116e29f08e3dad3d0524e9bc5527098e12fc432c0e5ca53ea16337d4 + md5: 45161d96307e3a447cc3eb5896cf6f8c + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: GPL-2.0-or-later + license_family: GPL + run_exports: + weak: + - lzo >=2.10,<3.0a0 + size: 191060 + timestamp: 1753889274283 +- conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-3.0.3-py314h67df5f8_1.conda + sha256: c279be85b59a62d5c52f5dd9a4cd43ebd08933809a8416c22c3131595607d4cf + md5: 9a17c4307d23318476d7fbf0fedc0cde + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 27424 + timestamp: 1772445227915 +- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.11.0-py314had63eae_1.conda + sha256: 666a19f61a40c5936bd0f07965b159ced727256fa7e2a4ff9dd5f0146aad86f1 + md5: 5866f3034ce42e8d512e7640f43270fd + depends: + - __glibc >=2.17,<3.0.a0 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype + - kiwisolver >=1.3.1 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libgcc >=14 + - libraqm >=0.10.5,<0.11.0a0 + - libstdcxx >=14 + - numpy >=1.23 + - numpy >=1.25,<3 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.14,<3.15.0a0 + - python-dateutil >=2.7 + - python_abi 3.14.* *_cp314 + - qhull >=2020.2,<2020.3.0a0 + - tk >=8.6.13,<8.7.0a0 + license: PSF-2.0 + license_family: PSF + run_exports: {} + size: 9004007 + timestamp: 1782829533688 +- conda: https://conda.anaconda.org/conda-forge/linux-64/minizip-4.2.2-hb71707f_0.conda + sha256: 80398daac34dfe10d88c92ef64f6ff85f52950cab8b2bdfc2d00cc176ed7edff + md5: 88450ba743694055e218d03a2fdd561e + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Zlib + license_family: Other + run_exports: + weak: + - minizip >=4.2.2,<5.0a0 + size: 521106 + timestamp: 1782851456704 +- conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.2.1-py314h97ea11e_1.conda + sha256: f33032ef3dcb8759309e8a55b0cb989e377ce315122bb86b00c0adbcf6665abf + md5: 1c8698b2012012806ec17a062bb9f339 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 113343 + timestamp: 1782460776477 +- conda: https://conda.anaconda.org/conda-forge/linux-64/muparser-2.3.5-h5888daf_0.conda + sha256: 320dfc59a94cb9e3635bda71b9e62278b34aa2fdaea0caa6832ddb9b37e9ccd5 + md5: ab3e3db511033340e75e7002e80ce8c0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libstdcxx >=13 + license: MIT + license_family: MIT + run_exports: + weak: + - muparser >=2.3.5,<2.4.0a0 + size: 203174 + timestamp: 1747116762269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda + sha256: fc89f74bbe362fb29fa3c037697a89bec140b346a2469a90f7936d1d7ea4d8a3 + md5: fc21868a1a5aacc937e7a18747acb8a5 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: X11 AND BSD-3-Clause + run_exports: + weak: + - ncurses >=6.6,<7.0a0 + size: 918956 + timestamp: 1777422145199 +- conda: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311hb115678_109.conda + noarch: python + sha256: 987ab2873d5d176f37f006687979c2900a6a536caf6ca6dceb84df2c8079962c + md5: d1f58fad9a5369f80109b81122a1af0d + depends: + - python + - certifi + - cftime + - numpy + - packaging + - hdf5 + - libnetcdf + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - _python_abi3_support 1.* + - cpython >=3.11 + - libnetcdf >=4.10.1,<4.10.2.0a0 + - hdf5 >=2.1.0,<3.0a0 + - numpy >=1.23,<3 + - libzlib >=1.3.2,<2.0a0 + license: MIT + run_exports: {} + size: 1095076 + timestamp: 1783865828524 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.6-py310hd8a072f_0.conda + noarch: python + sha256: 9c651938be7eef8a3d10387a555ad07feea9345750ef0eb09cf5ac70c3a827b0 + md5: 406e98fd1fba273c9fc83bbc83d12033 + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - _python_abi3_support 1.* + - cpython >=3.10 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + run_exports: {} + size: 672346 + timestamp: 1782129862714 +- conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda + sha256: fd2cbd8dfc006c72f45843672664a8e4b99b2f8137654eaae8c3d46dca776f63 + md5: 16c2a0e9c4a166e53632cfca4f68d020 + constrains: + - nlohmann_json-abi ==3.12.0 + license: MIT + license_family: MIT + run_exports: {} + size: 136216 + timestamp: 1758194284857 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.65.1-py314h8169c2f_1.conda + sha256: 750f8893a16721394969c030e7778212b99c54aab137a9744cafdb70a6fd513d + md5: d74691e038386bb543a574122c72d834 + depends: + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - libgcc >=14 + - libstdcxx >=14 + - llvmlite >=0.47.0,<0.48.0a0 + - numpy >=1.22.3,<2.5 + - numpy >=1.23,<3 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + constrains: + - scipy >=1.0 + - tbb >=2021.6.0 + - cudatoolkit >=11.2 + - libopenblas !=0.3.6 + - cuda-python >=11.6 + - cuda-version >=11.2 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 5793221 + timestamp: 1778390483212 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.16.5-py314ha0b5721_0.conda + sha256: d420e372ef39890bce10727892dcc7336716a3417d17bf0c47958645e20303d5 + md5: 780127fd34cd3b3c320c8e8d22ff4b0e + depends: + - __glibc >=2.17,<3.0.a0 + - deprecated + - libgcc >=14 + - libstdcxx >=14 + - msgpack-python + - numpy >=1.23,<3 + - numpy >=1.24 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - typing_extensions + license: MIT + license_family: MIT + run_exports: {} + size: 809777 + timestamp: 1764782495559 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.6-py314h2b28147_0.conda + sha256: bc61ae892973751a6b0e6ecea57ed6d7053224bddcb007165d6ceb1d7344ad47 + md5: f49b5f950379e0b97c35ca97682f7c6a + depends: + - python + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - liblapack >=3.9.0,<4.0a0 + - python_abi 3.14.* *_cp314 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - numpy >=1.23,<3 + size: 8928909 + timestamp: 1779169198391 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda + sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d + md5: 11b3379b191f63139e29c0d19dee24cd + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libpng >=1.6.50,<1.7.0a0 + - libstdcxx >=14 + - libtiff >=4.7.1,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - openjpeg >=2.5.4,<3.0a0 + size: 355400 + timestamp: 1758489294972 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.3-h35e630c_0.conda + sha256: d48f5c22b9897c01e4dff3680f1f57ceb02711ab9c62f74339b080419dfad34b + md5: 79dd2074b5cd5c5c6b2930514a11e22d + depends: + - __glibc >=2.17,<3.0.a0 + - ca-certificates + - libgcc >=14 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - openssl >=3.6.3,<4.0a0 + size: 3159683 + timestamp: 1781069855778 +- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda + sha256: a60c2578c8422e0c67206d269767feb4d3e627511558b6866e5daf2231d5214d + md5: 8027fce94fdfdf2e54f9d18cbae496df + depends: + - tzdata + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.2,<1.3.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - libprotobuf >=6.33.5,<6.33.6.0a0 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.1,<2.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - orc >=2.3.0,<2.3.1.0a0 + size: 1468651 + timestamp: 1773230208923 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-3.0.3-py314hb4ffadd_0.conda + sha256: 8e4b161f3f7fbdf17f842b518ff3794b6af9378a90d095719d7153360d126dc1 + md5: bc2e1390314b1269e66fb1966fbcae5d + depends: + - python + - numpy >=1.26.0 + - python-dateutil >=2.8.2 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.23,<3 + - python_abi 3.14.* *_cp314 + constrains: + - adbc-driver-postgresql >=1.2.0 + - adbc-driver-sqlite >=1.2.0 + - beautifulsoup4 >=4.12.3 + - blosc >=1.21.3 + - bottleneck >=1.4.2 + - fastparquet >=2024.11.0 + - fsspec >=2024.10.0 + - gcsfs >=2024.10.0 + - html5lib >=1.1 + - hypothesis >=6.116.0 + - jinja2 >=3.1.5 + - lxml >=5.3.0 + - matplotlib >=3.9.3 + - numba >=0.60.0 + - numexpr >=2.10.2 + - odfpy >=1.4.1 + - openpyxl >=3.1.5 + - psycopg2 >=2.9.10 + - pyarrow >=13.0.0 + - pyiceberg >=0.8.1 + - pymysql >=1.1.1 + - pyqt5 >=5.15.9 + - pyreadstat >=1.2.8 + - pytables >=3.10.1 + - pytest >=8.3.4 + - pytest-xdist >=3.6.1 + - python-calamine >=0.3.0 + - pytz >=2024.2 + - pyxlsb >=1.0.10 + - qtpy >=2.4.2 + - scipy >=1.14.1 + - s3fs >=2024.10.0 + - sqlalchemy >=2.0.36 + - tabulate >=0.9.0 + - xarray >=2024.10.0 + - xlrd >=2.0.1 + - xlsxwriter >=3.2.0 + - zstandard >=0.23.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 15303815 + timestamp: 1778602611222 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda + sha256: 315b52bfa6d1a820f4806f6490d472581438a28e21df175290477caec18972b0 + md5: d53ffc0edc8eabf4253508008493c5bc + depends: + - __glibc >=2.17,<3.0.a0 + - cairo >=1.18.4,<2.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - fribidi >=1.0.16,<2.0a0 + - harfbuzz >=13.2.1 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 + - libgcc >=14 + - libglib >=2.86.4,<3.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + license: LGPL-2.1-or-later + run_exports: + weak: + - pango >=1.56.4,<2.0a0 + size: 458036 + timestamp: 1774281947855 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda + sha256: 5e6f7d161356fefd981948bea5139c5aa0436767751a6930cb1ca801ebb113ff + md5: 7a3bff861a6583f1889021facefc08b1 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - pcre2 >=10.47,<10.48.0a0 + size: 1222481 + timestamp: 1763655398280 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.3.0-py314h8ec4b1a_0.conda + sha256: bcab128df8980514061a78b9c67f5004954048f584da20df8c5a78de9e3f5abb + md5: 233e62a8eb894b79b5c93f4f8dec4dcd + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libtiff >=4.7.1,<4.8.0a0 + - openjpeg >=2.5.4,<3.0a0 + - libxcb >=1.17.0,<2.0a0 + - zlib-ng >=2.3.3,<2.4.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - python_abi 3.14.* *_cp314 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - lcms2 >=2.19.1,<3.0a0 + - tk >=8.6.13,<8.7.0a0 + license: HPND + run_exports: {} + size: 1108174 + timestamp: 1782912080163 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda + sha256: 43d37bc9ca3b257c5dd7bf76a8426addbdec381f6786ff441dc90b1a49143b6a + md5: c01af13bdc553d1a8fbfff6e8db075f0 + depends: + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + run_exports: + weak: + - pixman >=0.46.4,<1.0a0 + size: 450960 + timestamp: 1754665235234 +- conda: https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_3.conda + sha256: c94d3d8ef40d1ea018860d66c416003bc03adede7d212efc9218bb64041fe2f7 + md5: 031e33ae075b336c0ce92b14efa886c5 + depends: + - sqlite + - libtiff + - libcurl + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libtiff >=4.7.1,<4.8.0a0 + - libcurl >=8.18.0,<9.0a0 + - libsqlite >=3.51.2,<4.0a0 + constrains: + - proj4 ==999999999999 + license: MIT + license_family: MIT + run_exports: + weak: + - proj >=9.7.1,<9.8.0a0 + size: 3593669 + timestamp: 1770890751115 +- conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda + sha256: 013669433eb447548f21c3c6b16b2ed64356f726b5f77c1b39d5ba17a8a4b8bc + md5: a83f6a2fdc079e643237887a37460668 + depends: + - __glibc >=2.17,<3.0.a0 + - libcurl >=8.10.1,<9.0a0 + - libgcc >=13 + - libstdcxx >=13 + - libzlib >=1.3.1,<2.0a0 + - zlib + license: MIT + license_family: MIT + run_exports: + weak: + - prometheus-cpp >=1.3.0,<1.4.0a0 + size: 199544 + timestamp: 1730769112346 +- conda: https://conda.anaconda.org/conda-forge/linux-64/protobuf-6.33.5-py314h61e7c5f_2.conda + sha256: ceed4e3b1d13b0f200afbf01f7e314111cce85e116b8db512ff940571ba64104 + md5: 418826d23f3fa6354700b4f31c5b87ba + depends: + - __glibc >=2.17,<3.0.a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.1,<2.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + constrains: + - libprotobuf 6.33.5 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 491842 + timestamp: 1773265994654 +- conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.2.2-py314h0f05182_0.conda + sha256: f15574ed6c8c8ed8c15a0c5a00102b1efe8b867c0bd286b498cd98d95bd69ae5 + md5: 4f225a966cfee267a79c5cb6382bd121 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 231303 + timestamp: 1769678156552 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda + sha256: 9c88f8c64590e9567c6c80823f0328e58d3b1efb0e1c539c0315ceca764e0973 + md5: b3c17d95b5a10c6e64a21fa17573e70e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + run_exports: {} + size: 8252 + timestamp: 1726802366959 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-24.0.0-py314hdafbbf9_0.conda + sha256: 03c421256cc31c4487b225f6a560d25fbf6102fc304b4d31fe955168ef14f630 + md5: 6629041b133a9d65d68c4f2269432378 + depends: + - libarrow-acero 24.0.0.* + - libarrow-dataset 24.0.0.* + - libarrow-substrait 24.0.0.* + - libparquet 24.0.0.* + - pyarrow-core 24.0.0 *_0_* + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 26828 + timestamp: 1776927974177 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-24.0.0-py314h969be7f_0_cpu.conda + sha256: 772d3c847811d1dbfd7d4431092be95f36996281eb8348e36b2cfba88106aed1 + md5: b066370d80ec7fca3c1d4028dc09164f + depends: + - __glibc >=2.17,<3.0.a0 + - libarrow 24.0.0.* *cpu + - libarrow-compute 24.0.0.* *cpu + - libgcc >=14 + - libstdcxx >=14 + - libzlib >=1.3.2,<2.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + constrains: + - apache-arrow-proc * cpu + - numpy >=1.23,<3 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 4818190 + timestamp: 1776927934653 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py314h68799e9_3.conda + sha256: 134f5d548348d3beaf4f55011c39d36b6e8753141f3bfa0d6594cc69a751cdd9 + md5: a9d01aa73920bd1fc6186e991161349a + depends: + - python + - proj + - certifi + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - proj >=9.7.1,<9.8.0a0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 565644 + timestamp: 1772623254178 +- conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.6-habeac84_100_cp314.conda + build_number: 100 + sha256: 6d28ac2b061179deb434d3d57afa98ffd20ec3c5d44ab8048a1ca33424b22d38 + md5: 0b9b2f83b5b600e1ac38becde8d0dd44 + depends: + - __glibc >=2.17,<3.0.a0 + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - liblzma >=5.8.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.53.2,<4.0a0 + - libuuid >=2.42.1,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - openssl >=3.5.7,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + run_exports: + weak: + - python_abi 3.14.* *_cp314 + noarch: + - python + size: 36717183 + timestamp: 1781255094700 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py314h67df5f8_1.conda + sha256: b318fb070c7a1f89980ef124b80a0b5ccf3928143708a85e0053cde0169c699d + md5: 2035f68f96be30dc60a5dfd7452c7941 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + run_exports: {} + size: 202391 + timestamp: 1770223462836 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hda471dd_3.conda + noarch: python + sha256: 970b2a1d12983d8d1cc05d914ad88a0b6ef1fa14038c9649aa834dd6ebee65d7 + md5: acd216255e1370e9aeab5351b831f07c + depends: + - python + - libgcc >=14 + - libstdcxx >=14 + - __glibc >=2.17,<3.0.a0 + - _python_abi3_support 1.* + - cpython >=3.12 + - zeromq >=4.3.5,<4.4.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 210896 + timestamp: 1779483879367 +- conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda + sha256: 776363493bad83308ba30bcb88c2552632581b143e8ee25b1982c8c743e73abc + md5: 353823361b1d27eb3960efb076dfcaf6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: LicenseRef-Qhull + run_exports: + weak: + - qhull >=2020.2,<2020.3.0a0 + size: 552937 + timestamp: 1720813982144 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.5.0-py314ha1f92a4_0.conda + sha256: 399feb6f2fd60f54e4d7cb2351a7fb6dfb3f64d1e02457b6e396ba29f97cd9dd + md5: 15b1e205270451c078c79d0480438e8e + depends: + - __glibc >=2.17,<3.0.a0 + - affine + - attrs + - certifi + - click >=4,!=8.2.* + - click-plugins + - cligj >=0.5 + - libgcc >=14 + - libgdal-core >=3.12.1,<3.13.0a0 + - libstdcxx >=14 + - numpy >=1.23,<3 + - proj >=9.7.1,<9.8.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - setuptools >=0.9.8 + - snuggs >=1.4.1 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 8233787 + timestamp: 1767632660362 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda + sha256: 3fc684b81631348540e9a42f6768b871dfeab532d3f47d5c341f1f83e2a2b2b2 + md5: 66a715bc01c77d43aca1f9fcb13dde3c + depends: + - libre2-11 2025.11.05 h0dc7533_1 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libre2-11 >=2025.11.5 + - re2 + size: 27469 + timestamp: 1768190052132 +- conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda + sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 + md5: d7d95fc8287ea7bf33e0e7116d2b95ec + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + run_exports: + weak: + - readline >=8.3,<9.0a0 + size: 345073 + timestamp: 1765813471974 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-2026.6.3-py314h1bee95f_0.conda + sha256: 064e56d6c233cbcfac5b0183c0dd10b732668ff27aa1ea3580459acceae95473 + md5: add3cbcc5eb677f6c1720e01cd82aac5 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.14.* *_cp314 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + run_exports: {} + size: 300129 + timestamp: 1782831350283 +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.5-h7e3ee7f_1.conda + sha256: 7369ac21f3561e2203f5b1600ef0671270057380783ca4b9e15f679ba25db575 + md5: fa1c00d999e83ec20173c9775f71a1f1 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - s2n >=1.7.5,<1.7.6.0a0 + size: 392607 + timestamp: 1783164766248 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.9.0-np2py314hf09ca88_0.conda + sha256: 6a01f4403db746acd676e34e80e3a14d041f2261d658402ca13dae6407c35d44 + md5: 30883954413aad9e3ac42134bef91ffe + depends: + - python + - numpy >=1.24.1 + - scipy >=1.10.0 + - joblib >=1.4.0 + - threadpoolctl >=3.5.0 + - narwhals >=2.0.1 + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - _openmp_mutex >=4.5 + - numpy >=1.23,<3 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 10311253 + timestamp: 1780401051520 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.18.0-py314hf07bd8e_0.conda + sha256: 85503102237f8515ab92319fc14609e894ac9e95e3a1398b0c49db1f9ee50877 + md5: 62c390c1f8f51240f1ebc7ba782669ad + depends: + - __glibc >=2.17,<3.0.a0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - liblapack >=3.9.0,<4.0a0 + - libstdcxx >=14 + - numpy <2.7 + - numpy >=1.23,<3 + - numpy >=2.0.0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 17260022 + timestamp: 1781912924009 +- conda: https://conda.anaconda.org/conda-forge/linux-64/shapely-2.1.2-py314hbe3edd8_2.conda + sha256: 17cb5cec9283f993072e8b6f5e1417d8d892cc5efa27029eae954ab06b33c7e2 + md5: 5963e6ee81772d450a35e6bc95522761 + depends: + - __glibc >=2.17,<3.0.a0 + - geos >=3.14.1,<3.14.2.0a0 + - libgcc >=14 + - numpy >=1.23,<3 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 652785 + timestamp: 1762523657698 +- conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda + sha256: 48f3f6a76c34b2cfe80de9ce7f2283ecb55d5ed47367ba91e8bb8104e12b8f11 + md5: 98b6c9dc80eb87b2519b97bcf7e578dd + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - snappy >=1.2.2,<1.3.0a0 + size: 45829 + timestamp: 1762948049098 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlalchemy-2.0.51-py314h0f05182_0.conda + sha256: 3c46e9af535a376c7269b61563f84c601235b00d50fc97f87ffbf3b68a51fe17 + md5: aeb7447f3ea37b2bb32167267dcf0bfe + depends: + - python + - greenlet !=0.4.17 + - typing-extensions >=4.6.0 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 4034632 + timestamp: 1781547880247 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.3-hbc0de68_0.conda + sha256: ef17725138fa72aa5a0f8ccace9727831c4b333e39575f78fb5ad1755826b687 + md5: b345ea7f13e4cae9809c69b1d1af2c99 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libsqlite 3.53.3 h0c1763c_0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - readline >=8.3,<9.0a0 + license: blessing + run_exports: + weak: + - libsqlite >=3.53.3,<4.0a0 + size: 206481 + timestamp: 1782519082269 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda + sha256: cafeec44494f842ffeca27e9c8b0c27ed714f93ac77ddadc6aaf726b5554ebac + md5: cffd3bdd58090148f4cfcd831f4b26ab + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libzlib >=1.3.1,<2.0a0 + constrains: + - xorg-libx11 >=1.8.12,<2.0a0 + license: TCL + license_family: BSD + run_exports: + weak: + - tk >=8.6.13,<8.7.0a0 + size: 3301196 + timestamp: 1769460227866 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.7-py314h5bd0f2a_0.conda + sha256: bbb7056f7c5fd606df16ed73ee68687050de2c02fd69a3f69a1cb533a7ed2ae8 + md5: 4a8e5889712641aabdf6695e292857fe + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 918368 + timestamp: 1781006801436 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ujson-5.13.0-py314h42812f9_0.conda + sha256: d8419b0fef8d14a37deb0f0049aff1774322f76783e1f259868c612dd18d39e9 + md5: 38a5fe5d0c791a129d69b7d98b1f5e4f + depends: + - python + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 59899 + timestamp: 1781561593186 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py314h9891dd4_0.conda + sha256: c84034056dc938c853e4f61e72e5bd37e2ec91927a661fb9762f678cbea52d43 + md5: 5d3c008e54c7f49592fca9c32896a76f + depends: + - __glibc >=2.17,<3.0.a0 + - cffi + - libgcc >=14 + - libstdcxx >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 15004 + timestamp: 1769438727085 +- conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py314h5bd0f2a_0.conda + sha256: ff1c1d7c23b91c9b0eb93a3e1380f4e2ac6c37ea2bba4f932a5484e9a55bba30 + md5: 494fdf358c152f9fdd0673c128c2f3dd + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 409562 + timestamp: 1770909102180 +- conda: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda + sha256: 2aad2aeff7c69a2d7eecd7b662eef756b27d6a6b96f3e2c2a7071340ce14543e + md5: d71d3a66528853c0a1ac2c02d79a0284 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - uriparser >=0.9.8,<1.0a0 + size: 48270 + timestamp: 1715010035325 +- conda: https://conda.anaconda.org/conda-forge/linux-64/watchfiles-1.2.0-py314h1bee95f_1.conda + sha256: 608e2de2bc61b3f271da82c30948074517c624c508ba5a7921ba742c0a4a013e + md5: 18dce090a0773324393c07048fdd6866 + depends: + - python + - anyio >=3.0.0 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python_abi 3.14.* *_cp314 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + run_exports: {} + size: 393293 + timestamp: 1781180266552 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda + sha256: ea374d57a8fcda281a0a89af0ee49a2c2e99cc4ac97cf2e2db7064e74e764bdb + md5: 996583ea9c796e5b915f7d7580b51ea6 + depends: + - __glibc >=2.17,<3.0.a0 + - libexpat >=2.7.4,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - wayland >=1.25.0,<2.0a0 + size: 334139 + timestamp: 1773959575393 +- conda: https://conda.anaconda.org/conda-forge/linux-64/websockets-16.1-py314h518bba1_0.conda + sha256: 1adb3a13a48e09533c3b171bd70050d4606e3e971e325cc8251c64dcdc47b67c + md5: 5e08a948181f7ab03e3eb3fc705005f3 + depends: + - python + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 388222 + timestamp: 1783694714082 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-2.2.2-py314h5bd0f2a_0.conda + sha256: f2789ff73f60f3b740629146a64f778bbf40e26900978cb632180878a496423c + md5: e1e275654a6c998b7357606f5da46af7 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 118096 + timestamp: 1782133651496 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.3.0-hd9031aa_1.conda + sha256: 605980121ad3ee9393a9b53fb0996929c9732f8fc6b9f796d25244ca6fa23032 + md5: 66a1db55ecdb7377d2b91f54cd56eafa + depends: + - __glibc >=2.17,<3.0.a0 + - icu >=78.1,<79.0a0 + - libgcc >=14 + - libnsl >=2.0.1,<2.1.0a0 + - libstdcxx >=14 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - xerces-c >=3.3.0,<3.4.0a0 + size: 1660075 + timestamp: 1766327494699 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.48-h280c20c_0.conda + sha256: 3b04afd5d1a65d2d27ac2d49a63b01ab8bcd875776779ec63e337370ed38afdc + md5: b233b41be0bf210989d57160ed39b394 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - xorg-libx11 >=1.8.13,<2.0a0 + license: MIT + license_family: MIT + run_exports: {} + size: 441670 + timestamp: 1782027360439 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda + sha256: c12396aabb21244c212e488bbdc4abcdef0b7404b15761d9329f5a4a39113c4b + md5: fb901ff28063514abb6046c9ec2c4a45 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libice >=1.1.2,<2.0a0 + size: 58628 + timestamp: 1734227592886 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda + sha256: 277841c43a39f738927145930ff963c5ce4c4dacf66637a3d95d802a64173250 + md5: 1c74ff8c35dcadf952a16f752ca5aa49 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libuuid >=2.38.1,<3.0a0 + - xorg-libice >=1.1.2,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libsm >=1.2.6,<2.0a0 + size: 27590 + timestamp: 1741896361728 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda + sha256: 516d4060139dbb4de49a4dcdc6317a9353fb39ebd47789c14e6fe52de0deee42 + md5: 861fb6ccbc677bb9a9fb2468430b9c6a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libxcb >=1.17.0,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libx11 >=1.8.13,<2.0a0 + size: 839652 + timestamp: 1770819209719 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda + sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b + md5: b2895afaf55bf96a8c8282a2e47a5de0 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxau >=1.0.12,<2.0a0 + size: 15321 + timestamp: 1762976464266 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.conda + sha256: 048c103000af9541c919deef03ae7c5e9c570ffb4024b42ecb58dbde402e373a + md5: f2ba4192d38b6cef2bb2c25029071d90 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxfixes >=6.0.2,<7.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxcomposite >=0.4.7,<1.0a0 + size: 14415 + timestamp: 1770044404696 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda + sha256: 832f538ade441b1eee863c8c91af9e69b356cd3e9e1350fff4fe36cc573fc91a + md5: 2ccd714aa2242315acaf0a67faea780b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + - xorg-libxrender >=0.9.11,<0.10.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxcursor >=1.2.3,<2.0a0 + size: 32533 + timestamp: 1730908305254 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda + sha256: 43b9772fd6582bf401846642c4635c47a9b0e36ca08116b3ec3df36ab96e0ec0 + md5: b5fcc7172d22516e1f965490e65e33a4 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxfixes >=6.0.1,<7.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxdamage >=1.1.6,<2.0a0 + size: 13217 + timestamp: 1727891438799 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda + sha256: 25d255fb2eef929d21ff660a0c687d38a6d2ccfbcbf0cc6aa738b12af6e9d142 + md5: 1dafce8548e38671bea82e3f5c6ce22f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxdmcp >=1.1.5,<2.0a0 + size: 20591 + timestamp: 1762976546182 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda + sha256: 79c60fc6acfd3d713d6340d3b4e296836a0f8c51602327b32794625826bd052f + md5: 34e54f03dfea3e7a2dcf1453a85f1085 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxext >=1.3.7,<2.0a0 + size: 50326 + timestamp: 1769445253162 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda + sha256: 83c4c99d60b8784a611351220452a0a85b080668188dce5dfa394b723d7b64f4 + md5: ba231da7fccf9ea1e768caf5c7099b84 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxfixes >=6.0.2,<7.0a0 + size: 20071 + timestamp: 1759282564045 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.3-hb03c661_0.conda + sha256: 495f99c8eacfa4ae2d8fed2a7f2105777af89acdc204df145d2bbbc380ac631b + md5: adba2e334082bb218db806d4c12277c9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.13,<2.0a0 + - xorg-libxext >=1.3.7,<2.0a0 + - xorg-libxfixes >=6.0.2,<7.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxi >=1.8.3,<2.0a0 + size: 47717 + timestamp: 1779111857071 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxinerama-1.1.6-hecca717_0.conda + sha256: 3a9da41aac6dca9d3ff1b53ee18b9d314de88add76bafad9ca2287a494abcd86 + md5: 93f5d4b5c17c8540479ad65f206fea51 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxinerama >=1.1.6,<1.2.0a0 + size: 14818 + timestamp: 1769432261050 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda + sha256: 80ed047a5cb30632c3dc5804c7716131d767089f65877813d4ae855ee5c9d343 + md5: e192019153591938acf7322b6459d36e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxrandr >=1.5.5,<2.0a0 + size: 30456 + timestamp: 1769445263457 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda + sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 + md5: 96d57aba173e878a2089d5638016dc5e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxrender >=0.9.12,<0.10.0a0 + size: 33005 + timestamp: 1734229037766 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda + sha256: 752fdaac5d58ed863bbf685bb6f98092fe1a488ea8ebb7ed7b606ccfce08637a + md5: 7bbe9a0cc0df0ac5f5a8ad6d6a11af2f + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + - xorg-libxi >=1.7.10,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxtst >=1.2.5,<2.0a0 + size: 32808 + timestamp: 1727964811275 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda + sha256: 64db17baaf36fa03ed8fae105e2e671a7383e22df4077486646f7dbf12842c9f + md5: 665d152b9c6e78da404086088077c844 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxext >=1.3.6,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxxf86vm >=1.1.7,<2.0a0 + size: 18701 + timestamp: 1769434732453 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda + sha256: 7a8c64938428c2bfd016359f9cb3c44f94acc256c6167dbdade9f2a1f5ca7a36 + md5: aa8d21be4b461ce612d8f5fb791decae + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + run_exports: {} + size: 570010 + timestamp: 1766154256151 +- conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad + md5: a77f85f77be52ff59391544bfe73390a + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + license: MIT + license_family: MIT + run_exports: + weak: + - yaml >=0.2.5,<0.3.0a0 + size: 85189 + timestamp: 1753484064210 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h09e67af_11.conda + sha256: dc9f28dedcb5f35a127fad2d847674d2833369dd616d294e423b8997df31d8a8 + md5: 96b08867e21d4694fa5c2c226e6581b0 + depends: + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - krb5 >=1.22.2,<1.23.0a0 + - libsodium >=1.0.22,<1.0.23.0a0 + license: MPL-2.0 + license_family: MOZILLA + run_exports: + weak: + - zeromq >=4.3.5,<4.4.0a0 + size: 311184 + timestamp: 1779123989774 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda + sha256: 245c9ee8d688e23661b95e3c6dd7272ca936fabc03d423cdb3cdee1bbcf9f2f2 + md5: c2a01a08fc991620a74b32420e97868a + depends: + - __glibc >=2.17,<3.0.a0 + - libzlib 1.3.2 h25fd6f3_2 + license: Zlib + license_family: Other + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 95931 + timestamp: 1774072620848 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.3-hceb46e0_1.conda + sha256: ea4e50c465d70236408cb0bfe0115609fd14db1adcd8bd30d8918e0291f8a75f + md5: 2aadb0d17215603a82a2a6b0afd9a4cb + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: Zlib + license_family: Other + run_exports: + weak: + - zlib-ng >=2.3.3,<2.4.0a0 + size: 122618 + timestamp: 1770167931827 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda + sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 + md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 + depends: + - __glibc >=2.17,<3.0.a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - zstd >=1.5.7,<1.6.0a0 + size: 601375 + timestamp: 1764777111296 +- conda: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 + md5: aaa2a381ccc56eac91d63b6c1240312f + depends: + - cpython + - python-gil + license: MIT + license_family: MIT + run_exports: {} + size: 8191 + timestamp: 1744137672556 +- conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda + sha256: 1307719f0d8ee694fc923579a39c0621c23fdaa14ccdf9278a5aac5665ac58e9 + md5: 74ac5069774cdbc53910ec4d631a3999 + depends: + - pygments + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 1326096 + timestamp: 1734956217254 +- conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda + sha256: a362b4f5c96a0bf4def96be1a77317e2730af38915eb9bec85e2a92836501ed7 + md5: b3f0179590f3c0637b7eb5309898f79e + depends: + - __unix + - hicolor-icon-theme + - librsvg + license: LGPL-3.0-or-later OR CC-BY-SA-3.0 + license_family: LGPL + run_exports: {} + size: 631452 + timestamp: 1758743294412 +- conda: https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_1.conda + sha256: 0deeaf0c001d5543719db9b2686bc1920c86c7e142f9bec74f35e1ce611b1fc2 + md5: 8c4061f499edec6b8ac7000f6d586829 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 19164 + timestamp: 1733762153202 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiobotocore-3.7.0-pyhcf101f3_0.conda + sha256: 062726d1240acd307ff7e0e4f754c39a0e0c673c8bb4666a32496fec75499a6b + md5: 39f70aca52f1497a72eb9d81baf4d237 + depends: + - python >=3.10 + - aiohttp >=3.12.0,<4.0.0 + - aioitertools >=0.5.1,<1.0.0 + - botocore >=1.42.90,<1.43.1 + - python-dateutil >=2.1,<3.0.0 + - jmespath >=0.7.1,<2.0.0 + - multidict >=6.0.0,<7.0.0 + - wrapt >=1.10.10,<3.0.0 + - typing_extensions >=4.14.0,<5.0.0 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 83703 + timestamp: 1778325796521 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.7.1-pyhd8ed1ab_0.conda + sha256: 5ef589e5fd3736439781a9d48e68ce1e723b7081a471c02169908198eba4f448 + md5: e51e09bf3b91c62b7461a9f94e92c2c9 + depends: + - python >=3.10 + license: PSF-2.0 + license_family: PSF + run_exports: {} + size: 24690 + timestamp: 1782986823268 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiohttp-3.14.1-pyhf64b827_0.conda + sha256: 1ddfd04d7304becd30251933f6a21316a2b1d980e4d4b7398aa6650ce41e5ca4 + md5: fc49257102291bf3724c550e7ce4b188 + depends: + - aiohappyeyeballs >=2.5.0 + - aiosignal >=1.4.0 + - async-timeout >=4.0,<6.0 + - attrs >=17.3.0 + - frozenlist >=1.1.1 + - multidict >=4.5,<7.0 + - propcache >=0.2.0 + - python >=3.10 + - typing_extensions >=4.4 + - yarl >=1.17.0,<2.0 + track_features: + - aiohttp_no_compile + license: MIT AND Apache-2.0 + license_family: Apache + run_exports: {} + size: 517238 + timestamp: 1780913385603 +- conda: https://conda.anaconda.org/conda-forge/noarch/aioitertools-0.13.0-pyhd8ed1ab_0.conda + sha256: 41bc8d85274c5badabe6c333cdd2e77e9c6bc0fb64251211988a71e1fd83486b + md5: 65d5134ff98cb3727022a4f23993a2e6 + depends: + - python >=3.10 + - typing_extensions >=4.0 + license: MIT + license_family: MIT + run_exports: {} + size: 25450 + timestamp: 1768757675539 +- conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda + sha256: 8dc149a6828d19bf104ea96382a9d04dae185d4a03cc6beb1bc7b84c428e3ca2 + md5: 421a865222cd0c9d83ff08bc78bf3a61 + depends: + - frozenlist >=1.1.0 + - python >=3.9 + - typing_extensions >=4.2 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 13688 + timestamp: 1751626573984 +- conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda + sha256: fd39ad2fabec1569bbb0dfdae34ab6ce7de6ec09dcec8638f83dad0373594069 + md5: def531a3ac77b7fb8c21d17bb5d0badb + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 18365 + timestamp: 1704848898483 +- conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.14.2-pyhcf101f3_0.conda + sha256: e36998c5e860e26b22e5dbcd5726dd0c4eabad949c84d383cad8512757bbf6a1 + md5: fb568fbae6908ba86a090a85a089d11f + depends: + - exceptiongroup >=1.0.2 + - idna >=2.8 + - python >=3.10 + - typing_extensions >=4.5 + - python + constrains: + - trio >=0.32.0 + - uvloop >=0.22.1 + - winloop >=0.2.3 + license: MIT + run_exports: {} + size: 164465 + timestamp: 1783889660383 +- conda: https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda + sha256: 5b9ef6d338525b332e17c3ed089ca2f53a5d74b7a7b432747d29c6466e39346d + md5: f4e90937bbfc3a4a92539545a37bb448 + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 14835 + timestamp: 1733754069532 +- conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda + sha256: 8f032b140ea4159806e4969a68b4a3c0a7cab1ad936eb958a2b5ffe5335e19bf + md5: 54898d0f524c9dee622d44bbb081a8ab + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 10076 + timestamp: 1733332433806 +- conda: https://conda.anaconda.org/conda-forge/noarch/argon2-cffi-25.1.0-pyhd8ed1ab_0.conda + sha256: bea62005badcb98b1ae1796ec5d70ea0fc9539e7d59708ac4e7d41e2f4bb0bad + md5: 8ac12aff0860280ee0cff7fa2cf63f3b + depends: + - argon2-cffi-bindings + - python >=3.9 + - typing-extensions + constrains: + - argon2_cffi ==999 + license: MIT + license_family: MIT + run_exports: {} + size: 18715 + timestamp: 1749017288144 +- conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda + sha256: 792da8131b1b53ff667bd6fc617ea9087b570305ccb9913deb36b8e12b3b5141 + md5: 85c4f19f377424eafc4ed7911b291642 + depends: + - python >=3.10 + - python-dateutil >=2.7.0 + - python-tzdata + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 113854 + timestamp: 1760831179410 +- conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda + sha256: ee4da0f3fe9d59439798ee399ef3e482791e48784873d546e706d0935f9ff010 + md5: 9673a61a297b00016442e022d689faa6 + depends: + - python >=3.10 + constrains: + - astroid >=2,<5 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 28797 + timestamp: 1763410017955 +- conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.3.0-pyhcf101f3_0.conda + sha256: ea8486637cfb89dc26dc9559921640cd1d5fd37e5e02c33d85c94572139f2efe + md5: b85e84cb64c762569cc1a760c2327e0a + depends: + - python >=3.10 + - typing_extensions >=4.0.0 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 22949 + timestamp: 1773926359134 +- conda: https://conda.anaconda.org/conda-forge/noarch/async-timeout-5.0.1-pyhcf101f3_2.conda + sha256: 6638b68ab2675d0bed1f73562a4e75a61863b903be1538282cddb56c8e8f75bd + md5: 0d0ef7e4a0996b2c4ac2175a12b3bf69 + depends: + - python >=3.10 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 13559 + timestamp: 1767290444597 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda + sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab + md5: c6b0543676ecb1fb2d7643941fe375f2 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 64927 + timestamp: 1773935801332 +- conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda + sha256: a14a9ad02101aab25570543a59c5193043b73dc311a25650134ed9e6cb691770 + md5: f1976ce927373500cc19d3c0b2c85177 + depends: + - python >=3.10 + - python + constrains: + - pytz >=2015.7 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 7684321 + timestamp: 1772555330347 +- conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.6.0-py314h680f03e_0.conda + noarch: generic + sha256: 709cac7434d1c5a8828105036212a2a36022a07d807e89e2e99cac939c2d2526 + md5: 40d89d8546ad6e139e73ec8f6d56068b + depends: + - python >=3.14 + license: BSD-3-Clause AND MIT AND EPL-2.0 + run_exports: {} + size: 7526 + timestamp: 1781450817767 +- conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.15.0-pyha770c72_0.conda + sha256: aed4b9dcf68ec2a75e5645fed14d77fd884d38d2e52bfa6ef4b278d90cd88781 + md5: 3b261da3fe9b4168738712832410b022 + depends: + - python >=3.10 + - soupsieve >=1.2 + - typing-extensions + license: MIT + license_family: MIT + run_exports: {} + size: 92704 + timestamp: 1780853175566 +- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-6.4.0-pyhcf101f3_0.conda + sha256: 0c786f3e571bd58ac73d730d06314716663884d848ae320de0b438fae5e0bea9 + md5: 93009c29cdd6f2500468f2502fff9209 + depends: + - python >=3.10 + - webencodings + - python + constrains: + - tinycss2 >=1.1.0,<1.5 + license: Apache-2.0 AND MIT + run_exports: {} + size: 142246 + timestamp: 1780675823953 +- conda: https://conda.anaconda.org/conda-forge/noarch/bleach-with-css-6.4.0-hac0b51c_0.conda + sha256: ede77e412304cd080e23967352a7904932207d0167ecdccd6a9e210530942be6 + md5: 5f710eab1f3c4e773c75686f5e8e6481 + depends: + - bleach ==6.4.0 pyhcf101f3_0 + - tinycss2 + license: Apache-2.0 AND MIT + run_exports: {} + size: 4406 + timestamp: 1780675823953 +- conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda + sha256: f7efd22b5c15b400ed84a996d777b6327e5c402e79e3c534a7e086236f1eb2dc + md5: 42834439227a4551b939beeeb8a4b085 + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 13934 + timestamp: 1731096548765 +- conda: https://conda.anaconda.org/conda-forge/noarch/bokeh-3.9.1-pyhd8ed1ab_0.conda + sha256: b3d3b93a17fa678e81cd5ff5309fe64c7feb65c71cb134f14e4fe2113dc0c8d5 + md5: 123fcfe0df4b6fc21804538e59cdaafe + depends: + - contourpy >=1.2 + - jinja2 >=2.9 + - narwhals >=1.13 + - numpy >=1.16 + - packaging >=16.8 + - pillow >=7.1.0 + - python >=3.10 + - pyyaml >=3.10 + - tornado >=6.2 + - xyzservices >=2021.09.1 + constrains: + - panel >=1.8.10 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 4526315 + timestamp: 1781002115296 +- conda: https://conda.anaconda.org/conda-forge/noarch/botocore-1.43.0-pyhd8ed1ab_0.conda + sha256: 27a202f3937b14812f5c8ba8304a5e2d0b2e1056e468cd7086721c2376bfea43 + md5: f47ed05030a1bed50f5fc9cea874ad1a + depends: + - jmespath >=0.7.1,<2.0.0 + - python >=3.10 + - python-dateutil >=2.1,<3.0.0 + - urllib3 >=1.25.4,!=2.2.0,<3 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 8647283 + timestamp: 1777577830442 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-h4c7d964_0.conda + sha256: 7f458e4a82514d7bebbfef23d92817794a16aaf1c748a15f04870d4fb49aeab2 + md5: b9696b2cf00dfeec138c70cee38ed192 + depends: + - __win + license: ISC + run_exports: {} + size: 129352 + timestamp: 1781709016515 +- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda + sha256: f8e3c730fa14ee3f170493779f06522c4acf89169f43db4f039727709b6419cf + md5: a9965dd99f683c5f444428f896635716 + depends: + - __unix + license: ISC + run_exports: {} + size: 128866 + timestamp: 1781708962055 +- conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_2.conda + noarch: python + sha256: 0d00dd61cb91b1bd1536600c64c9db4f94f3c699fec42864d0a2f4bc2ad8c3e8 + md5: 1990eb3f49022846fbc7fc9624a0ee43 + depends: + - cached_property >=1.5.2,<1.5.3.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 6836 + timestamp: 1783242914545 +- conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_2.conda + sha256: b1808a7811b5688d045b204425bb7ee824b340b40025b4ad0a39b4db1f4f1c98 + md5: f71e6840332854fd2eac6c3229768a9c + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 14752 + timestamp: 1783242913845 +- conda: https://conda.anaconda.org/conda-forge/noarch/cattrs-26.1.0-pyhcf101f3_1.conda + sha256: c3c5772e8f3c9080b3b89765bb9e9d88972792b54d96d546c29672965bbb8d6c + md5: eb57a77657c275d8d0b3542b070f484c + depends: + - python >=3.10 + - attrs >=25.4.0 + - typing_extensions >=4.14.0 + - exceptiongroup >=1.1.1 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 59678 + timestamp: 1771485958517 +- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.6.17-pyhd8ed1ab_0.conda + sha256: 6c13620e458ba43278379d0cdacc30c497336bddfda81681fd50d114a65c702f + md5: c13824fedced67005d3832c152fe9c2f + depends: + - python >=3.10 + license: ISC + run_exports: {} + size: 133877 + timestamp: 1781719949728 +- conda: https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.11.3-pyhd8ed1ab_0.conda + sha256: 1254310e81d8f681a1ab5f26a305724a2d9d8ea278343f9ef89ac22c15785b69 + md5: 036952903adb4c07a58ff46a88740d71 + depends: + - python >=3.11 + - xarray >=2024.7.0 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 76049 + timestamp: 1781358901047 +- conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda + sha256: aa589352e61bb221351a79e5946d56916e3c595783994884accdb3b97fe9d449 + md5: 381bd45fb7aa032691f3063aff47e3a1 + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 13589 + timestamp: 1763607964133 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.9-pyhd8ed1ab_0.conda + sha256: 8d8813ef655b4e75e4fb897abd83ad548882efad7b4e836b021b797f42780799 + md5: d154b40b109e503430979e8a8d099eaf + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 61418 + timestamp: 1783505332569 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyh6dadd2b_0.conda + sha256: 5b5c96afdd801dd9c3b78ebc2cd9a9f3ce34186257415d394dde1aa8468aa3c0 + md5: 8a0d65027e25e367f9f1754f0604e8de + depends: + - __win + - colorama + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 106227 + timestamp: 1783085395110 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-8.4.2-pyhc90fa1f_0.conda + sha256: ccc4787f511964f9a1f2d2d2859c91c5d571fb60f7f09d4c4e092c9b7a94e671 + md5: 2c4bd6aeb90bb157456841c3270a0d92 + depends: + - __unix + - python + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 107155 + timestamp: 1783085363526 +- conda: https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1.2-pyhd8ed1ab_0.conda + sha256: ba1ee6e2b2be3da41d70d0d51d1159010de900aa3f33fceaea8c52e9bd30a26e + md5: e9b05deb91c013e5224672a4ba9cf8d1 + depends: + - click >=4.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 12683 + timestamp: 1750848314962 +- conda: https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_2.conda + sha256: 1a52ae1febfcfb8f56211d1483a1ac4419b0028b7c3e9e61960a298978a42396 + md5: 55c7804f428719241a90b152016085a1 + depends: + - click >=4.0 + - python >=3.9,<4.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 12521 + timestamp: 1733750069604 +- conda: https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.1.2-pyhcf101f3_1.conda + sha256: 4c287c2721d8a34c94928be8fe0e9a85754e90189dd4384a31b1806856b50a67 + md5: 61b8078a0905b12529abc622406cb62c + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 27353 + timestamp: 1765303462831 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 27011 + timestamp: 1733218222191 +- conda: https://conda.anaconda.org/conda-forge/noarch/colorcet-3.2.1-pyhd8ed1ab_0.conda + sha256: f863dd6ab7302a40bf7e1e98bc963a1de1530d1277e609865f84c53907af4b13 + md5: 0b6419b9a27c540bd96e66e12a44c379 + depends: + - python >=3.10 + license: CC-BY-4.0 + run_exports: {} + size: 174387 + timestamp: 1777396861701 +- conda: https://conda.anaconda.org/conda-forge/noarch/comm-0.2.3-pyhe01879c_0.conda + sha256: 576a44729314ad9e4e5ebe055fbf48beb8116b60e58f9070278985b2b634f212 + md5: 2da13f2b299d8e1995bafbbe9689a2f7 + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 14690 + timestamp: 1753453984907 +- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.6-py314hd8ed1ab_100.conda + noarch: generic + sha256: 7a548856ef5307890a8cadfc196655117658f8c24589ce175caa4c1c2ded9d13 + md5: b28fe35fd43d5f425c0dccbe5b5039fd + depends: + - python >=3.14,<3.15.0a0 + - python_abi * *_cp314 + license: Python-2.0 + run_exports: {} + size: 49333 + timestamp: 1781254618863 +- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda + sha256: bb47aec5338695ff8efbddbc669064a3b10fe34ad881fb8ad5d64fbfa6910ed1 + md5: 4c2a8fef270f6c69591889b93f9f55c1 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 14778 + timestamp: 1764466758386 +- conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.7.0-pyhc364b38_0.conda + sha256: f188b9fcb30fa422f4fa81baa7540a9e9c677bdd274a7bd513ef347e6c4f4926 + md5: 8763ed8bb5b9b2d184d7e7f7a670550b + depends: + - python >=3.10 + - dask-core >=2026.7.0,<2026.7.1.0a0 + - distributed >=2026.7.0,<2026.7.1.0a0 + - cytoolz >=0.11.2 + - lz4 >=4.3.2 + - numpy >=1.26 + - pandas >=2.0 + - bokeh >=3.1.0 + - jinja2 >=2.10.3 + - pyarrow >=16.0 + - python + constrains: + - openssl !=1.1.1e + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 10392 + timestamp: 1783521976911 +- conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.7.0-pyhc364b38_0.conda + sha256: 8d400881cb6251bb3fe47888a0348740e639031b7deef323a4559fa3072433bd + md5: ca2ed20c7b3102d617bf5eef25fc9ee9 + depends: + - python >=3.10 + - click >=8.1 + - cloudpickle >=3.0.0 + - fsspec >=2021.9.0 + - packaging >=20.0 + - partd >=1.4.0 + - pyyaml >=5.4.1 + - toolz >=0.12.0 + - importlib-metadata >=4.13.0 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 1074754 + timestamp: 1783370469246 +- conda: https://conda.anaconda.org/conda-forge/noarch/dask-labextension-7.0.0-pyhd8ed1ab_1.conda + sha256: a157787c6c524686d200d35f77ffc12e22d2bcd13e2de3d25c70842d9d3e0ac2 + md5: 9aef5e5bebe4a054efd88c298beaeae8 + depends: + - bokeh >=1.0.0,!=2.0.0 + - distributed >=1.24.1 + - jupyter-server-proxy >=1.3.2 + - jupyterlab >=4.0.0,<5 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 39682 + timestamp: 1735227027456 +- conda: https://conda.anaconda.org/conda-forge/noarch/datashader-0.19.1-pyhd8ed1ab_0.conda + sha256: a440eb220a07eb7517334396f0f783a356bf43ffb22b1441e61f394640ccfbe2 + md5: 51ec314f84fd5215980646e84f6f54dc + depends: + - colorcet + - multipledispatch + - numba + - numpy + - packaging + - pandas + - param + - pyct + - python >=3.10 + - requests + - scipy + - toolz + - xarray + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 9604478 + timestamp: 1779195887051 +- conda: https://conda.anaconda.org/conda-forge/noarch/decorator-5.3.1-pyhd8ed1ab_0.conda + sha256: 430bd9d731b265f0bedb3183ac3ecfaa1656390c092b6e864ff8cc1229843c8c + md5: 61dcf784d59ef0bd62c57d982b154ace + depends: + - python >=3.10 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 16102 + timestamp: 1779115228886 +- conda: https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2 + sha256: 9717a059677553562a8f38ff07f3b9f61727bd614f505658b0a5ecbcf8df89be + md5: 961b3a227b437d82ad7054484cfa71b2 + depends: + - python >=3.6 + license: PSF-2.0 + license_family: PSF + run_exports: {} + size: 24062 + timestamp: 1615232388757 +- conda: https://conda.anaconda.org/conda-forge/noarch/deprecated-1.3.1-pyhd8ed1ab_1.conda + sha256: 7d57a7b8266043ffb99d092ebc25e89a0a2490bed4146b9432c83c2c476fa94d + md5: 5498feb783ab29db6ca8845f68fa0f03 + depends: + - python >=3.10 + - wrapt <3,>=1.10 + license: MIT + license_family: MIT + run_exports: {} + size: 15896 + timestamp: 1768934186726 +- conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.3-pyhcf101f3_0.conda + sha256: e2753997b8bd34205f42be01b8bab8037423dc30c02a1ec12de23e5b4c0b0a2e + md5: 58638f77697c4f6726753eb8be34818b + depends: + - python >=3.10 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 303705 + timestamp: 1781320269259 +- conda: https://conda.anaconda.org/conda-forge/noarch/distributed-2026.7.0-pyhc364b38_0.conda + sha256: a41e2f18f8e76652e1e78ffdc10dc3e33c8ac1a38f76c9e3b02a3fd480169cb6 + md5: 603c2c6baa27a6734cb960123766baaf + depends: + - python >=3.10 + - click >=8.0 + - cloudpickle >=3.0.0 + - cytoolz >=0.12.0 + - dask-core >=2026.7.0,<2026.7.1.0a0 + - jinja2 >=2.10.3 + - locket >=1.0.0 + - msgpack-python >=1.0.2 + - packaging >=20.0 + - psutil >=5.8.0 + - pyyaml >=5.4.1 + - sortedcontainers >=2.0.5 + - tblib >=1.6.0 + - toolz >=0.12.0 + - tornado >=6.2.0 + - zict >=3.0.0 + - python + constrains: + - openssl !=1.1.1e + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 843030 + timestamp: 1783433971453 +- conda: https://conda.anaconda.org/conda-forge/noarch/docopt-ng-0.9.0-pyhd8ed1ab_1.conda + sha256: fb8c1b918b3c28ff9cdf21279aad9a50a659dd3bcbdb95d687044fb35b58b2df + md5: 7635e4907164a088d932f7d8965db7ab + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 21886 + timestamp: 1734684011188 +- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda + sha256: fa5966bb1718bbf6967a85075e30e4547901410cc7cb7b16daf68942e9a94823 + md5: 24c1ca34138ee57de72a943237cde4cc + depends: + - python >=3.9 + license: CC-PDDC AND BSD-3-Clause AND BSD-2-Clause AND ZPL-2.1 + run_exports: {} + size: 402700 + timestamp: 1733217860944 +- conda: https://conda.anaconda.org/conda-forge/noarch/donfig-0.8.1.post1-pyhd8ed1ab_1.conda + sha256: d58e97d418f71703e822c422af5b9c431e3621a0ecdc8b0334c1ca33e076dfe7 + md5: c56a7fa5597ad78b62e1f5d21f7f8b8f + depends: + - python >=3.9 + - pyyaml + license: MIT + license_family: MIT + run_exports: {} + size: 22491 + timestamp: 1734368817583 +- conda: https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_1.conda + sha256: 80f579bfc71b3dab5bef74114b89e26c85cb0df8caf4c27ab5ffc16363d57ee7 + md5: 3366592d3c219f2731721f11bc93755c + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 11259 + timestamp: 1733327239578 +- conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda + sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 + md5: 8e662bd460bda79b1ea39194e3c4c9ab + depends: + - python >=3.10 + - typing_extensions >=4.6.0 + license: MIT and PSF-2.0 + run_exports: {} + size: 21333 + timestamp: 1763918099466 +- conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda + sha256: 210c8165a58fdbf16e626aac93cc4c14dbd551a01d1516be5ecad795d2422cad + md5: ff9efb7f7469aed3c4a8106ffa29593c + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 30753 + timestamp: 1756729456476 +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.7-pyhd8ed1ab_0.conda + sha256: ad1596682d1c7c562d6f02ca7aad9ef8e47c333a253c402d81ba51a9ff4fd454 + md5: ee29c64d6fc4ab42e47c4a59b756d958 + depends: + - python >=3.10 + license: Unlicense + run_exports: {} + size: 39652 + timestamp: 1783505066242 +- conda: https://conda.anaconda.org/conda-forge/noarch/flexcache-0.3-pyhd8ed1ab_1.conda + sha256: acdb7b73d84268773fcc8192965994554411edc488ec3447925a62154e9d3baa + md5: f1e618f2f783427019071b14a111b30d + depends: + - python >=3.9 + - typing-extensions + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 16674 + timestamp: 1733663669958 +- conda: https://conda.anaconda.org/conda-forge/noarch/flexparser-0.4-pyhd8ed1ab_1.conda + sha256: 9bdad0cd9fb6d67e48798c03930d634ea2d33a894d30439d3d7bdffd3c21af7b + md5: 6dc4e43174cd552452fdb8c423e90e69 + depends: + - python >=3.9 + - typing-extensions + - typing_extensions + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 28686 + timestamp: 1733663636245 +- conda: https://conda.anaconda.org/conda-forge/noarch/flox-0.11.2-pyhd8ed1ab_0.conda + sha256: 27b110a72d05d4a2287fbb96f04139ad3a6663405de743701863efc77042be1e + md5: 6638eee762bdf0cb437202ac55d3e9c9 + depends: + - numpy >=1.26 + - numpy_groupies >=0.9.19 + - packaging >=21.3 + - pandas >=2.1 + - python >=3.11 + - scipy >=1.12 + - toolz + constrains: + - numbagg >=0.6 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 74511 + timestamp: 1772121806252 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 + sha256: 58d7f40d2940dd0a8aa28651239adbf5613254df0f75789919c4e6762054403b + md5: 0c96522c6bdaed4b1566d11387caaf45 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 397370 + timestamp: 1566932522327 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 + sha256: c52a29fdac682c20d252facc50f01e7c2e7ceac52aa9817aaf0bb83f7559ec5c + md5: 34893075a5c9e55cdafac56607368fc6 + license: OFL-1.1 + license_family: Other + run_exports: {} + size: 96530 + timestamp: 1620479909603 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 + sha256: 00925c8c055a2275614b4d983e1df637245e19058d79fc7dd1a93b8d9fb4b139 + md5: 4d59c254e01d9cde7957100457e2d5fb + license: OFL-1.1 + license_family: Other + run_exports: {} + size: 700814 + timestamp: 1620479612257 +- conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda + sha256: 2821ec1dc454bd8b9a31d0ed22a7ce22422c0aef163c59f49dfdf915d0f0ca14 + md5: 49023d73832ef61042f6a237cb2687e7 + license: LicenseRef-Ubuntu-Font-Licence-Version-1.0 + license_family: Other + run_exports: {} + size: 1620504 + timestamp: 1727511233259 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 + sha256: a997f2f1921bb9c9d76e6fa2f6b408b7fa549edd349a77639c9fe7a23ea93e61 + md5: fee5683a3f04bd15cbd8318b096a27ab + depends: + - fonts-conda-forge + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 3667 + timestamp: 1566974674465 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda + sha256: 54eea8469786bc2291cc40bca5f46438d3e062a399e8f53f013b6a9f50e98333 + md5: a7970cd949a077b7cb9696379d338681 + depends: + - font-ttf-ubuntu + - font-ttf-inconsolata + - font-ttf-dejavu-sans-mono + - font-ttf-source-code-pro + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 4059 + timestamp: 1762351264405 +- conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.63.0-pyh7db6752_0.conda + sha256: c9752235f1ff7061d834e5e4a3d0adf71ebeeff2b3fad82dab607edce7f70c91 + md5: 0509ee74d95e5b98eb6fe2a47760e399 + depends: + - brotli + - munkres + - python >=3.10 + - unicodedata2 >=15.1.0 + track_features: + - fonttools_no_compile + license: MIT + license_family: MIT + run_exports: {} + size: 846038 + timestamp: 1778770337113 +- conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda + sha256: 2509992ec2fd38ab27c7cdb42cf6cadc566a1cc0d1021a2673475d9fa87c6276 + md5: d3549fd50d450b6d9e7dddff25dd2110 + depends: + - cached-property >=1.3.0 + - python >=3.9,<4 + license: MPL-2.0 + license_family: MOZILLA + run_exports: {} + size: 16705 + timestamp: 1733327494780 +- conda: https://conda.anaconda.org/conda-forge/noarch/frozenlist-1.8.0-pyhf298e5d_0.conda + sha256: 5f5a4e502981700b40ffbce6e3601ff5f95305839b5d5c49d1ef1c4ed33aadde + md5: 7a2d9f4d9f57da47251b2050b149bdf8 + depends: + - python >=3.10 + track_features: + - frozenlist_no_compile + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 19878 + timestamp: 1779999782801 +- conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2026.6.0-pyhd8ed1ab_0.conda + sha256: fe0156e6d658be3531aad2a99e42e8ad1ee23c69837d469c44c1b6010373913d + md5: 7d7e6c826ba0743fc491ebee0e7b899c + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 149709 + timestamp: 1781615868173 +- conda: https://conda.anaconda.org/conda-forge/noarch/gcsfs-2026.7.0-pyhd8ed1ab_0.conda + sha256: 9cb63a36cba8dbba244ace82b38e6e2de2a7c22c6362414af420f10801ff1329 + md5: 235f907a6b15e6b27c3e8c0101400900 + depends: + - aiohttp >=3.9.0 + - decorator >4.1.2 + - fsspec >=2026.6.0,<2026.6.1 + - google-auth >=1.2 + - google-auth-oauthlib + - google-cloud-storage >=3.9.0 + - google-cloud-storage-control + - python >=3.10 + - requests + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 80633 + timestamp: 1783370847676 +- conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-core-1.15.1-pyha770c72_0.conda + sha256: f02b166089a5fbb11d81db73ac8150835e1c10e9f8d2ec3c0e503656c12325b4 + md5: 44d1dcb11f7136ddb356b4b9eb0f6a6d + depends: + - bokeh >=3.8.0 + - cartopy >=0.18.0 + - holoviews >=1.16.0 + - numpy >=1.0 + - packaging + - panel >=1.0.0 + - param >=1.9.3,<3.0 + - pyproj + - python >=3.10 + - shapely >=1.8.0 + - xyzservices + constrains: + - geoviews 1.15.1 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 418482 + timestamp: 1768375420333 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-api-core-2.31.0-pyhcf101f3_0.conda + sha256: 7e3cfd82fccdd59061d032badc888f41f9a084356ba384e133892de4ae8121b4 + md5: 5fc3d86518a050fe18719eb49cd0e6ad + depends: + - python >=3.10 + - googleapis-common-protos >=1.63.2,<2.0.0 + - protobuf >=5.29.6,<8.0.0 + - proto-plus >=1.25.0,<2.0.0 + - google-auth >=2.14.1,<3.0.0 + - requests >=2.33.0,<3.0.0 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 104917 + timestamp: 1780524584750 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-2.55.2-pyhcf101f3_0.conda + sha256: 3875d924db8f931b4d25fe6cf55e2184c09d8ab8de2f4412298d4bfdd4daf64b + md5: 657ecbe614da947c3a189ba0cbcc8c8a + depends: + - python >=3.10 + - pyasn1-modules >=0.2.1 + - cryptography >=41.0.5 + - aiohttp >=3.9.0,<4.0.0 + - requests >=2.30.0,<3.0.0 + - pyu2f >=0.1.5 + - rsa >=4.0.0,<5 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 153812 + timestamp: 1783785176970 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-auth-oauthlib-1.4.0-pyhd8ed1ab_0.conda + sha256: cdc2bf4aba1416b339b95d5eee7bdcadb92de35a9f3e3546471942d03519258b + md5: 6e998cbb5c02e7aecdab93dd6b289ede + depends: + - click >=6.0.0 + - google-auth >=2.15.0,<3.0.0,!=2.43.0,!=2.44.0,!=2.45.0 + - python >=3.10 + - requests-oauthlib >=0.7.0 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 22604 + timestamp: 1778145194842 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-core-2.6.0-pyhcf101f3_1.conda + sha256: 33ce240b20edcfab78d29931bdcdaea6159c41e1247a6b68a539676fb2655c75 + md5: 4717a98a7a939cc6695f801a2eb64f7c + depends: + - python >=3.10 + - google-api-core >=2.11.0,<3.0.0 + - google-auth >=2.14.1,<3.0.0,!=2.24.0,!=2.25.0 + - grpcio >=1.75.1,<2.0.0 + - grpcio-status >=1.47.0,<2.0.0 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 33255 + timestamp: 1780580616158 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-3.12.1-pyhcf101f3_0.conda + sha256: 60a136639bcc52ceffe89918286454316351383e42b86fc9bf335054f1ee857b + md5: d52fadfcd23dab58265ad82ad441d850 + depends: + - python >=3.10 + - google-auth >=2.26.1,<3.0.0 + - google-api-core >=2.27.0,<3.0.0 + - google-cloud-core >=2.4.2,<3.0.0 + - google-resumable-media >=2.7.2,<3.0.0 + - requests >=2.22.0,<3.0.0 + - google-crc32c >=1.6.0,<2.0.0 + - protobuf >=3.20.2,<7.0.0 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 212685 + timestamp: 1783788184283 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-cloud-storage-control-1.10.0-pyhcf101f3_0.conda + sha256: 13c747e6c4a2352c9673a3127300205c80dfa33ce1826f3551851cca972b72d2 + md5: 941c328972a5d6fd2248ab6b31076d15 + depends: + - python >=3.10 + - google-api-core >=1.34.1,<3.0.0,!=2.0.*,!=2.1.*,!=2.2.*,!=2.3.*,!=2.4.*,!=2.5.*,!=2.6.*,!=2.7.*,!=2.8.*,!=2.9.*,!=2.10.* + - google-auth >=2.14.1,<3.0.0,!=2.24.0,!=2.25.0 + - grpcio >=1.33.2,<2.0.0 + - proto-plus >=1.22.3,<2.0.0 + - protobuf >=3.20.2,<7.0.0,!=4.21.0,!=4.21.1,!=4.21.2,!=4.21.3,!=4.21.4,!=4.21.5 + - grpc-google-iam-v1 >=0.14.0,<1.0.0 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 62482 + timestamp: 1773043535736 +- conda: https://conda.anaconda.org/conda-forge/noarch/google-resumable-media-2.8.0-pyhd8ed1ab_0.conda + sha256: 23d825ed0664a8089c7958bffd819d26e1aba7579695c40dfbdb25a4864d8be6 + md5: ba7f04ba62be69f9c9fef0c4487c210b + depends: + - google-crc32c >=1.0.0,<2.0.0 + - python >=3.10 + constrains: + - aiohttp >=3.6.2,<4.0.0 + - requests >=2.18.0,<3.0.0 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 46929 + timestamp: 1763404726218 +- conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-1.75.0-pyhcf101f3_0.conda + sha256: 987087369159875c17b9686bc22e53a9fbf1a5bdca0078fd92cecd434db367d5 + md5: d0f51913131d5b1ce26abaa7ff83a246 + depends: + - python >=3.10 + - protobuf >=4.25.8,<8.0.0 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 149671 + timestamp: 1778157259200 +- conda: https://conda.anaconda.org/conda-forge/noarch/googleapis-common-protos-grpc-1.75.0-pyhcf101f3_0.conda + sha256: e643cdc23fa833874e55a1a782684af82de6377434479a0223ec481a73f72927 + md5: 6dd8d1b2eb6676600cef70ec021bba3c + depends: + - python >=3.10 + - googleapis-common-protos >=1.75,<1.76.0a0 + - grpcio >=1.44.0,<2.0.0 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 11719 + timestamp: 1778157259200 +- conda: https://conda.anaconda.org/conda-forge/noarch/grpc-google-iam-v1-0.14.4-pyhcf101f3_0.conda + sha256: 75488b4e061bc8dc699d1914522b38a8404acdc50f41142d82b9202cefa62315 + md5: c9b3353d4a2afc6496363ea5580cef2e + depends: + - python >=3.10 + - grpcio >=1.44.0,<2.0.0 + - googleapis-common-protos >=1.63.2,<2.0.0 + - googleapis-common-protos-grpc + - protobuf >=4.25.8,<8.0.0 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 31388 + timestamp: 1775030462661 +- conda: https://conda.anaconda.org/conda-forge/noarch/grpcio-status-1.78.1-pyhcf101f3_0.conda + sha256: 89a893163e8273ee307273e78f3e8b1e5d00b73d0631b65c7ffbec8a2385118d + md5: 829271a8ea9d8024e99e43939ebb114f + depends: + - python >=3.10 + - protobuf >=6.31.1,<7.0.0 + - grpcio >=1.78.1 + - googleapis-common-protos >=1.5.5 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 28097 + timestamp: 1774879207958 +- conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda + sha256: 96cac6573fd35ae151f4d6979bab6fbc90cb6b1fb99054ba19eb075da9822fcb + md5: b8993c19b0c32a2f7b66cbb58ca27069 + depends: + - python >=3.10 + - typing_extensions + - python + license: MIT + license_family: MIT + run_exports: {} + size: 39069 + timestamp: 1767729720872 +- conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 + md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 + depends: + - python >=3.10 + - hyperframe >=6.1,<7 + - hpack >=4.1,<5 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 95967 + timestamp: 1756364871835 +- conda: https://conda.anaconda.org/conda-forge/noarch/h5netcdf-1.8.1-pyhd8ed1ab_0.conda + sha256: 5bf081c0f21a57fc84b5000d53f043d63638b77dcc2137f87511a4581838c9f6 + md5: ca7f9ba8762d3e360e47917a10e23760 + depends: + - h5py + - numpy + - packaging + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 57732 + timestamp: 1769241877548 +- conda: https://conda.anaconda.org/conda-forge/noarch/holoviews-1.23.1-pyhd8ed1ab_0.conda + sha256: dfa09e6ed29819578dae1ad3bc7fadbb4f1cb49aed0d1b8f3db1703b4073cd4f + md5: 3e866f297283b6213384abf00c2e315f + depends: + - bokeh >=3.1 + - colorcet + - matplotlib-base >=3.0 + - narwhals >=2 + - numpy >=1.21 + - pandas >=1.3 + - panel >=1.0 + - param >=2.0,<3.0 + - python >=3.10 + - python-dateutil >=2.8.2 + - pyviz_comms >=2.1 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 4937226 + timestamp: 1783019063272 +- conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.2.0-pyhd8ed1ab_0.conda + sha256: fdcea5d7cb314485d3907192ef024c704311548c5b0cbeb390cd1951051e29d2 + md5: b395909221b9bd1df066e5930e18855b + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 32884 + timestamp: 1782283986153 +- conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda + sha256: 04d49cb3c42714ce533a8553986e1642d0549a05dc5cc48e0d43ff5be6679a5b + md5: 4f14640d58e2cc0aa0819d9d8ba125bb + depends: + - python >=3.9 + - h11 >=0.16 + - h2 >=3,<5 + - sniffio 1.* + - anyio >=4.0,<5.0 + - certifi + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 49483 + timestamp: 1745602916758 +- conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda + sha256: cd0f1de3697b252df95f98383e9edb1d00386bfdd03fdf607fa42fe5fcb09950 + md5: d6989ead454181f4f9bc987d3dc4e285 + depends: + - anyio + - certifi + - httpcore 1.* + - idna + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 63082 + timestamp: 1733663449209 +- conda: https://conda.anaconda.org/conda-forge/noarch/hvplot-0.12.2-pyhd8ed1ab_0.conda + sha256: 2b1b67462c87b1252733b8d45d88a68de513ba9852d210c77f64f0d20a558603 + md5: a3ebf00cb037e464061fcf68a5a75d83 + depends: + - bokeh >=3.1 + - colorcet >=2 + - holoviews >=1.19.0 + - numpy >=1.21 + - packaging + - pandas >=1.3 + - panel >=1.0 + - param >=1.12.0,<3.0 + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 275723 + timestamp: 1766071789882 +- conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 17397 + timestamp: 1737618427549 +- conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.19-pyhd8ed1ab_0.conda + sha256: 381cedccf0866babfc135d65ee40b778bd20e927d2a5ec810f750c5860a7c5b8 + md5: 84a3233b709a289a4ddd7a2fd27dd988 + depends: + - python >=3.10 + - ukkonen + license: MIT + license_family: MIT + run_exports: {} + size: 79757 + timestamp: 1776455344188 +- conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.18-pyhcf101f3_0.conda + sha256: c75632ea624aa450a394f570749420c5a2e0997d0216bc29d5d45b0f39df0426 + md5: 577b04680ae422adb86fc60d7b940659 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 163869 + timestamp: 1781620148226 +- conda: https://conda.anaconda.org/conda-forge/noarch/imageio-2.37.0-pyhfb79c49_0.conda + sha256: 8ef69fa00c68fad34a3b7b260ea774fda9bd9274fd706d3baffb9519fd0063fe + md5: b5577bc2212219566578fd5af9993af6 + depends: + - numpy + - pillow >=8.3.2 + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 293226 + timestamp: 1738273949742 +- conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda + sha256: 5a047f9eac290e679b4e6f6f4cbfcc5acdfbf031a4f06824d4ddb590cdbb850b + md5: 92617c2ba2847cca7a6ed813b6f4ab79 + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 15729 + timestamp: 1773752188889 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-9.0.0-pyhcf101f3_0.conda + sha256: 43e2a5497cad1598ff88a3e69f69bc88b7b8f141fa63c60eab5db296317318b8 + md5: ffc17e785d64e12fc311af9184221839 + depends: + - python >=3.10 + - zipp >=3.20 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 34766 + timestamp: 1779714582554 +- conda: https://conda.anaconda.org/conda-forge/noarch/intake-0.7.0-pyhd8ed1ab_0.conda + sha256: 8dba632e81a11347d959bb11367f6b0184e2dcc9aeab550de156beac5fa6091b + md5: 310f0fdaec6eecd9cc7833a788bafb1f + depends: + - appdirs + - cloudpickle >=0.2.2 + - dask >=1.0 + - entrypoints + - fsspec >=0.7.4 + - jinja2 + - msgpack-python + - numpy + - partd >=0.3.10 + - python >=3.6 + - pyyaml + - requests + - toolz >=0.8.2 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 193092 + timestamp: 1685391772164 +- conda: https://conda.anaconda.org/conda-forge/noarch/intake-xarray-0.7.0-pyhd8ed1ab_0.conda + sha256: ceb8cf5761c29467684cb860f1c73fce396ed412a3b54f69cdd314b96ef736b6 + md5: d6471673fac9fa8f13a2517315ffcf6b + depends: + - dask >=2.2 + - fsspec >=2022 + - intake >=0.6.6 + - msgpack-python + - netcdf4 + - python >=3.5 + - requests + - xarray >=2022 + - zarr + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 27517 + timestamp: 1685414168477 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.3.0-pyh01cf8df_0.conda + sha256: 994d3cb6b9b88a6533f567c50d20f2f6edc40ae3540ce2ee9629492182ab3403 + md5: a1ddab91145f7f06eee769d2f3ac69cd + depends: + - appnope + - __osx + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=8.9.0 + - jupyter_core >=5.1,!=6.0.* + - matplotlib-inline >=0.1 + - nest-asyncio2 >=1.7.0 + - packaging >=22 + - psutil >=5.7 + - python >=3.10 + - pyzmq >=25 + - tornado >=6.4.1 + - traitlets >=5.4.0 + - python + constrains: + - appnope >=0.1.2 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 137725 + timestamp: 1781101860049 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.3.0-pyh6dadd2b_0.conda + sha256: e3ff0b3d5db5c31830030406f50ac2c9a5c31b86f1c2cef87a6042f0a4c77eb7 + md5: dd5c51d5c42381ba4a2e0ce32e02ba17 + depends: + - __win + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=8.9.0 + - jupyter_core >=5.1,!=6.0.* + - matplotlib-inline >=0.1 + - nest-asyncio2 >=1.7.0 + - packaging >=22 + - psutil >=5.7 + - python >=3.10 + - pyzmq >=25 + - tornado >=6.4.1 + - traitlets >=5.4.0 + - python + constrains: + - appnope >=0.1.2 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 138046 + timestamp: 1781101760172 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.3.0-pyha191276_0.conda + sha256: 305ad9226363ff5f259c404dd9a7508183a2e150739b2adc43db7d817234da66 + md5: 2b47a10e4d98334f8171ff60aea05ff3 + depends: + - __linux + - comm >=0.1.1 + - debugpy >=1.6.5 + - ipython >=7.23.1 + - jupyter_client >=8.9.0 + - jupyter_core >=5.1,!=6.0.* + - matplotlib-inline >=0.1 + - nest-asyncio2 >=1.7.0 + - packaging >=22 + - psutil >=5.7 + - python >=3.10 + - pyzmq >=25 + - tornado >=6.4.1 + - traitlets >=5.4.0 + - python + constrains: + - appnope >=0.1.2 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 138635 + timestamp: 1781101665847 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.15.0-pyh53cf698_0.conda + sha256: d9fa14ec35119901bf702a9a3e8a5570daef2aada7d03878e4c24d9de912302b + md5: 2f4ea7f616b30363d8dde5cc15e7af2e + depends: + - __unix + - decorator >=5.1.0 + - ipython_pygments_lexers >=1.0.0 + - jedi >=0.18.2 + - matplotlib-inline >=0.1.6 + - prompt-toolkit >=3.0.41,<3.1.0 + - psutil >=7 + - pygments >=2.14.0 + - python >=3.11 + - stack_data >=0.6.0 + - traitlets >=5.13.0 + - typing_extensions >=4.6 + - pexpect >4.6 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 658801 + timestamp: 1782482716877 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.15.0-pyhe2676ad_0.conda + sha256: c3df12e766572060be653933aae5f6a09ccebfa86cff3b10b9b880ace29088d9 + md5: a4c278221ad4da75ba1637f8d230e658 + depends: + - __win + - decorator >=5.1.0 + - ipython_pygments_lexers >=1.0.0 + - jedi >=0.18.2 + - matplotlib-inline >=0.1.6 + - prompt-toolkit >=3.0.41,<3.1.0 + - psutil >=7 + - pygments >=2.14.0 + - python >=3.11 + - stack_data >=0.6.0 + - traitlets >=5.13.0 + - typing_extensions >=4.6 + - colorama >=0.4.4 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 657739 + timestamp: 1782482745122 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda + sha256: 894682a42a7d659ae12878dbcb274516a7031bbea9104e92f8e88c1f2765a104 + md5: bd80ba060603cc228d9d81c257093119 + depends: + - pygments + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 13993 + timestamp: 1737123723464 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.8-pyhd8ed1ab_0.conda + sha256: 6bb58afb7eabc8b4ac0c7e92707fb498313cc0164cf04e7ba1090dbf49af514b + md5: d68e3f70d1f068f1b66d94822fdc644e + depends: + - comm >=0.1.3 + - ipython >=6.1.0 + - jupyterlab_widgets >=3.0.15,<3.1.0 + - python >=3.10 + - traitlets >=4.3.1 + - widgetsnbextension >=4.0.14,<4.1.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 114376 + timestamp: 1762040524661 +- conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda + sha256: 08e838d29c134a7684bca0468401d26840f41c92267c4126d7b43a6b533b0aed + md5: 0b0154421989637d424ccf0f104be51a + depends: + - arrow >=0.15.0 + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 19832 + timestamp: 1733493720346 +- conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.conda + sha256: 1684b7b16eec08efef5302ce298c606b163c18272b69a62b666fbaa61516f170 + md5: 7ac5f795c15f288984e32add616cdc59 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 19180 + timestamp: 1733308353037 +- conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.20.0-pyhcf101f3_0.conda + sha256: 744143551c1c7b528b82533fb641b9d7db20b2203abc4c2635c387fa6c089fc3 + md5: c2b3d37aa1411031126036ee76a8a861 + depends: + - python >=3.10 + - parso >=0.8.6,<0.9.0 + - python + license: Apache-2.0 AND MIT + run_exports: {} + size: 2715215 + timestamp: 1782251948616 +- conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda + sha256: fc9ca7348a4f25fed2079f2153ecdcf5f9cf2a0bc36c4172420ca09e1849df7b + md5: 04558c96691bed63104678757beb4f8d + depends: + - markupsafe >=2.0 + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 120685 + timestamp: 1764517220861 +- conda: https://conda.anaconda.org/conda-forge/noarch/jmespath-1.1.0-pyhcf101f3_1.conda + sha256: 904d43d5210584004cf8b38f9657c717661ae55b0fb3f60573be974e50653fa1 + md5: cc73a9bd315659dc5307a5270f44786f + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 25946 + timestamp: 1769161799923 +- conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda + sha256: 301539229d7be6420c084490b8145583291123f0ce6b92f56be5948a2c83a379 + md5: 615de2a4d97af50c350e5cf160149e77 + depends: + - python >=3.10 + - setuptools + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 226448 + timestamp: 1765794135253 +- conda: https://conda.anaconda.org/conda-forge/noarch/json5-0.15.0-pyhd8ed1ab_0.conda + sha256: 637400a4174880463985c7a5b6e3e0bea0aa9d0892a6c06a3a8aa2cf1208c35a + md5: 761a4a6b9cba303c66a97ca642447171 + depends: + - python >=3.10 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 39373 + timestamp: 1781926894833 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonpointer-3.1.1-pyhcf101f3_0.conda + sha256: a3d10301b6ff399ba1f3d39e443664804a3d28315a4fb81e745b6817845f70ae + md5: 89bf346df77603055d3c8fe5811691e6 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 14190 + timestamp: 1774311356147 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.26.0-pyhcf101f3_0.conda + sha256: db973a37d75db8e19b5f44bbbdaead0c68dde745407f281e2a7fe4db74ec51d7 + md5: ada41c863af263cc4c5fcbaff7c3e4dc + depends: + - attrs >=22.2.0 + - jsonschema-specifications >=2023.3.6 + - python >=3.10 + - referencing >=0.28.4 + - rpds-py >=0.25.0 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 82356 + timestamp: 1767839954256 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2025.9.1-pyhcf101f3_0.conda + sha256: 0a4f3b132f0faca10c89fdf3b60e15abb62ded6fa80aebfc007d05965192aa04 + md5: 439cd0f567d697b20a8f45cb70a1005a + depends: + - python >=3.10 + - referencing >=0.31.0 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 19236 + timestamp: 1757335715225 +- conda: https://conda.anaconda.org/conda-forge/noarch/jsonschema-with-format-nongpl-4.26.0-hcf101f3_0.conda + sha256: 6886fc61e4e4edd38fd38729976b134e8bd2143f7fce56cc80d7ac7bac99bce1 + md5: 8368d58342d0825f0843dc6acdd0c483 + depends: + - jsonschema >=4.26.0,<4.26.1.0a0 + - fqdn + - idna + - isoduration + - jsonpointer >1.13 + - rfc3339-validator + - rfc3986-validator >0.1.0 + - rfc3987-syntax >=1.1.0 + - uri-template + - webcolors >=24.6.0 + license: MIT + license_family: MIT + run_exports: {} + size: 4740 + timestamp: 1767839954258 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-book-1.0.4.post1-pyh29332c3_0.conda + sha256: 0ef2582aeba805abd92090bcd7f04213806c629f8be0712f1c62d12406e7b28e + md5: b5ca0ebe1794ac80769af8394e3f14cf + depends: + - click >=7.1,<9 + - jinja2 + - jsonschema <5 + - linkify-it-py >=2,<3 + - myst-nb >=1.0,<2.0 + - myst-parser >=3.0,<4.0 + - python >=3.9 + - pyyaml + - sphinx >=7,<8 + - sphinx-book-theme >=1.1,<2.0 + - sphinx-comments >=0.0,<1.0 + - sphinx-copybutton >=0.5,<1.0 + - sphinx-design >=0.6,<1.0 + - sphinx-external-toc >=1.0,<2.0 + - sphinx-jupyterbook-latex >=1.0,<2.0 + - sphinx-multitoc-numbering >=0.1,<1.0 + - sphinx-thebe >=0.3,<1.0 + - sphinx-togglebutton >=0.3,<1.0 + - sphinxcontrib-bibtex >=2.5,<3.0 + - importlib-metadata >=4.8.3 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 47401 + timestamp: 1740838295859 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-builder-1.1.0-pyhcf101f3_0.conda + sha256: 743f6ae17a6f6e37860958fa00db96bdec5c011bcef8b166bb8c84f3c957f7dc + md5: 67e33322de030b8b1852ee883002ec5b + depends: + - jupyter_core + - python >=3.10 + - tomli + - traitlets + - python + constrains: + - nodejs >=22 + license: BSD-3-Clause AND MIT AND ISC + run_exports: {} + size: 860552 + timestamp: 1783865596860 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-cache-1.0.1-pyhff2d567_0.conda + sha256: 054d397dd45ed08bffb0976702e553dfb0d0b0a477da9cff36e2ea702e928f48 + md5: b0ee650829b8974202a7abe7f8b81e5a + depends: + - attrs + - click + - importlib-metadata + - nbclient >=0.2 + - nbformat + - python >=3.9 + - pyyaml + - sqlalchemy >=1.3.12,<3 + - tabulate + license: MIT + license_family: MIT + run_exports: {} + size: 31236 + timestamp: 1731777189586 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-lsp-2.3.1-pyhcf101f3_0.conda + sha256: 3766e2ae59641c172cec8a821528bfa6bf9543ffaaeb8b358bfd5259dcf18e4e + md5: 0c3b465ceee138b9c39279cc02e5c4a0 + depends: + - importlib-metadata >=4.8.3 + - jupyter_server >=1.1.2 + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 61633 + timestamp: 1775136333147 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-resource-usage-1.2.1-pyhd8ed1ab_0.conda + sha256: 7935959298800fa60fce96b71e1747c27af3eacd061feff0bb92f400f763bd80 + md5: f6ea980ad873115c6ee41edf7b9db436 + depends: + - jupyter_server >=2.0.0,<3 + - psutil >=5.6.0 + - python >=3.10 + - pyzmq >=19 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 43736 + timestamp: 1774986387013 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter-server-proxy-4.5.0-pyhcf101f3_1.conda + sha256: 9831fbd1266aaf6e87ebdc3acda74411a3816b0e4a0617f25f54c708f4fd7795 + md5: 6a79adce0515be9ee586631937b3b7e4 + depends: + - aiohttp + - jupyter_server >=1.24.0 + - simpervisor >=1.0.0 + - tornado >=6.1.0 + - traitlets >=5.1.1 + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 57173 + timestamp: 1775748597567 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_bokeh-4.1.0-pyhcf101f3_0.conda + sha256: 7a8e9b6db42bf7346937fe9c0cde3fd2877464d0319d1b790cd3025a454c019c + md5: 0a3bb47a31618cd52ae135767a7b77bb + depends: + - bokeh 3.* + - ipywidgets 8.* + - python >=3.10 + - python + constrains: + - jupyterlab 4.* + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 565572 + timestamp: 1781030154362 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.9.1-pyhcf101f3_0.conda + sha256: 48b18974cc93b2c0d2681563237034e521f51d1878f0bbc6a5a67ca31b1608a6 + md5: 49440e66df843bee2273937e8032ec43 + depends: + - jupyter_core >=5.1 + - python >=3.10 + - python-dateutil >=2.8.2 + - pyzmq >=25.0 + - tornado >=6.4.1 + - traitlets >=5.3 + - typing_extensions >=4.13.0 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 117954 + timestamp: 1781019994076 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyh6dadd2b_0.conda + sha256: ed709a6c25b731e01563521ef338b93986cd14b5bc17f35e9382000864872ccc + md5: a8db462b01221e9f5135be466faeb3e0 + depends: + - __win + - pywin32 + - platformdirs >=2.5 + - python >=3.10 + - traitlets >=5.3 + - python + constrains: + - pywin32 >=300 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 64679 + timestamp: 1760643889625 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_core-5.9.1-pyhc90fa1f_0.conda + sha256: 1d34b80e5bfcd5323f104dbf99a2aafc0e5d823019d626d0dce5d3d356a2a52a + md5: b38fe4e78ee75def7e599843ef4c1ab0 + depends: + - __unix + - python + - platformdirs >=2.5 + - python >=3.10 + - traitlets >=5.3 + - python + constrains: + - pywin32 >=300 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 65503 + timestamp: 1760643864586 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_events-0.12.1-pyhcf101f3_0.conda + sha256: c7edb5682c6316a95ad781dccb1b6589cd2ec0bf94f23c21152974eb0363b5d7 + md5: bf42ee94c750c0b2e7e998b79ac299ea + depends: + - jsonschema-with-format-nongpl >=4.18.0 + - packaging + - python >=3.10 + - python-json-logger >=2.0.4 + - pyyaml >=5.3 + - referencing + - rfc3339-validator + - rfc3986-validator >=0.1.1 + - traitlets >=5.3 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 24002 + timestamp: 1776861872237 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server-2.20.0-pyhcf101f3_0.conda + sha256: 3e8759fdc404f149e7e722e0af472044a0ef9e70d0a3a7690ddcfe1232a0e868 + md5: b2ddb0e13b5600070c4019c4db8a78e6 + depends: + - anyio >=3.1.0 + - argon2-cffi >=21.1 + - jinja2 >=3.0.3 + - jupyter_client >=7.4.4 + - jupyter_core >=4.12,!=5.0.* + - jupyter_events >=0.11.0 + - jupyter_server_terminals >=0.4.4 + - nbconvert-core >=6.4.4 + - nbformat >=5.3.0 + - overrides >=5.0 + - packaging >=22.0 + - prometheus_client >=0.9 + - python >=3.10 + - pyzmq >=24 + - send2trash >=1.8.2 + - terminado >=0.8.3 + - tornado >=6.2.0 + - traitlets >=5.6.0 + - websocket-client >=1.7 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 363068 + timestamp: 1781713810089 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyter_server_terminals-0.5.4-pyhcf101f3_0.conda + sha256: 5eda79ed9f53f590031d29346abd183051263227dd9ee667b5ca1133ce297654 + md5: 7b8bace4943e0dc345fc45938826f2b8 + depends: + - python >=3.10 + - terminado >=0.8.3 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 22052 + timestamp: 1768574057200 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-4.6.1-pyhd8ed1ab_0.conda + sha256: ad4a462da846fb8e9feebe39170553fc6a94252f4d4cca8efaf0dfeefa907099 + md5: 7ba07211c94d434f3223a4418f8b1ff8 + depends: + - async-lru >=1.0.0 + - httpx >=0.25.0,<1 + - ipykernel >=6.5.0,!=6.30.0 + - jinja2 >=3.0.3 + - jupyter-builder >=1.0.2 + - jupyter-lsp >=2.0.0 + - jupyter_core + - jupyter_server >=2.19.0,<3 + - jupyterlab_server >=2.28.0,<3 + - notebook-shim >=0.2 + - packaging >=23.2 + - python >=3.10 + - tomli >=1.2.2 + - tornado >=6.2.0 + - traitlets + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 13793940 + timestamp: 1782739437310 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab-myst-2.7.0-pyhcf101f3_0.conda + sha256: 6c5db055bf4d1c286e32c33fd7ea98499f4fd14d815c91b4d24a2b8ed5138a61 + md5: 7d93154252c7ce0f9ac7ce5600cec5c4 + depends: + - jupyter_server >=2.0.1,<3 + - python >=3.10 + - python + constrains: + - jupyterlab >=4.0.0,<5.0.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 2294548 + timestamp: 1781790321277 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1ab_2.conda + sha256: dc24b900742fdaf1e077d9a3458fd865711de80bca95fe3c6d46610c532c6ef0 + md5: fd312693df06da3578383232528c468d + depends: + - pygments >=2.4.1,<3 + - python >=3.9 + constrains: + - jupyterlab >=4.0.8,<5.0.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 18711 + timestamp: 1733328194037 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_server-2.28.0-pyhcf101f3_0.conda + sha256: 381d2d6a259a3be5f38a69463e0f6c5dcf1844ae113058007b51c3bef13a7cee + md5: a63877cb23de826b1620d3adfccc4014 + depends: + - babel >=2.10 + - jinja2 >=3.0.3 + - json5 >=0.9.0 + - jsonschema >=4.18 + - jupyter_server >=1.21,<3 + - packaging >=21.3 + - python >=3.10 + - requests >=2.31 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 51621 + timestamp: 1761145478692 +- conda: https://conda.anaconda.org/conda-forge/noarch/jupyterlab_widgets-3.0.16-pyhcf101f3_1.conda + sha256: 5c03de243d7ae6247f39a402f4785d95e61c3be79ef18738e8f17155585d31a8 + md5: dbf8b81974504fa51d34e436ca7ef389 + depends: + - python >=3.10 + - python + constrains: + - jupyterlab >=3,<5 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 216779 + timestamp: 1762267481404 +- conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda + sha256: 49570840fb15f5df5d4b4464db8ee43a6d643031a2bc70ef52120a52e3809699 + md5: 9b965c999135d43a3d0f7bd7d024e26a + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 94312 + timestamp: 1761596921009 +- conda: https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2 + sha256: 5210d31c8f2402dd1ad1b3edcf7a53292b9da5de20cd14d9c243dbf9278b1c4f + md5: 8d67904973263afd2985ba56aa2d6bb4 + depends: + - python + - six + license: MIT + license_family: MIT + run_exports: {} + size: 18212 + timestamp: 1592937373647 +- conda: https://conda.anaconda.org/conda-forge/noarch/legacy-cgi-2.6.4-pyh742d864_0.conda + sha256: acc3fb5f377468bacc94181a7c4466f1e37754a08e4df31979614c7c6ea20888 + md5: 9d2a54ab80a5cc8138b8adb1e146ac20 + depends: + - python >=3.13,<4 + - python + license: PSF-2.0 + license_family: PSF + run_exports: {} + size: 31856 + timestamp: 1761574456615 +- conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.1.0-pyhcf101f3_0.conda + sha256: 991a82fbb64aba6d10719a017ce354e28df02ea5df1d9c7b0221da573c168d27 + md5: 1005e1f39083adad2384772e8e384e43 + depends: + - python >=3.10 + - uc-micro-py + license: MIT + license_family: MIT + run_exports: {} + size: 26062 + timestamp: 1772476821244 +- conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 + sha256: 9afe0b5cfa418e8bdb30d8917c5a6cec10372b037924916f1f85b9f4899a67a6 + md5: 91e27ef3d05cc772ce627e51cff111c4 + depends: + - python >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 8250 + timestamp: 1650660473123 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10.2-pyhcf101f3_0.conda + sha256: 20e0892592a3e7c683e3d66df704a9425d731486a97c34fc56af4da1106b2b6b + md5: ba0a9221ce1063f31692c07370d062f3 + depends: + - importlib-metadata >=4.4 + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 85893 + timestamp: 1770694658918 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + sha256: 0fbacdfb31e55964152b24d5567e9a9996e1e7902fb08eb7d91b5fd6ce60803a + md5: fee3164ac23dfca50cfcc8b85ddefb81 + depends: + - mdurl >=0.1,<1 + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 64430 + timestamp: 1733250550053 +- conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.2-pyhd8ed1ab_0.conda + sha256: 35b43d7343f74452307fd018a1cca92b8f68961ff8e2ab6a81ce0a703c9a3764 + md5: 9acc1c385be401d533ff70ef5b50dae6 + depends: + - python >=3.10 + - traitlets + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 15725 + timestamp: 1778264403247 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.6.1-pyhd8ed1ab_0.conda + sha256: 49db23cbfb1c1d414a14d7540195208b994ebd747beba0f15c903f3a0a2dc446 + md5: ad6821df7a98510117db06e9a833281f + depends: + - markdown-it-py >=2.0.0,<5.0.0 + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 50460 + timestamp: 1778692223625 +- conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + md5: 592132998493b3ff25fd7479396e8351 + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 14465 + timestamp: 1733255681319 +- conda: https://conda.anaconda.org/conda-forge/noarch/mistune-3.3.3-pyhcf101f3_0.conda + sha256: 2e16a4297761697ed97f4c9974f5c350c7dbca8877a582c7793f4295db6c00a2 + md5: 6bda0cbb7b7608101bc2c49ee6f38de7 + depends: + - python >=3.10 + - typing_extensions + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 90547 + timestamp: 1783600905451 +- conda: https://conda.anaconda.org/conda-forge/noarch/multidict-6.7.1-pyh62beb40_0.conda + sha256: e9933d2526345a4a1c08b76f2322dd482122b683369b0536605353b5b153d755 + md5: ad92dba7ca0af0e3dca083a0fa6a3423 + depends: + - python >=3.10 + - typing-extensions >=4.1.0 + track_features: + - multidict_no_compile + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 37745 + timestamp: 1771610804457 +- conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda + sha256: c6216a21154373b340c64f321f22fec51db4ee6156c2e642fa58368103ac5d09 + md5: 121a57fce7fff0857ec70fa03200962f + depends: + - python >=3.6 + - six + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 17254 + timestamp: 1721907640382 +- conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda + sha256: d09c47c2cf456de5c09fa66d2c3c5035aa1fa228a1983a433c47b876aa16ce90 + md5: 37293a85a0f4f77bbd9cf7aaefc62609 + depends: + - python >=3.9 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 15851 + timestamp: 1749895533014 +- conda: https://conda.anaconda.org/conda-forge/noarch/myst-nb-1.4.0-pyhcf101f3_0.conda + sha256: c81d0c8c74c3da66808f8da09d8e48f2af2d173d357d45239defaf466838edba + md5: da07c7b1588ad0a44118d28aeb31b6a6 + depends: + - importlib-metadata + - ipykernel + - ipython + - jupyter-cache >=0.5 + - myst-parser >=1.0.0 + - nbclient + - nbformat >=5.0 + - python >=3.10 + - pyyaml + - sphinx >=5 + - typing_extensions + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 68766 + timestamp: 1772587444587 +- conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-3.0.1-pyhd8ed1ab_0.conda + sha256: bfce74342cd22b2201102565a15a2cb0e23ad28023b0f8a0d0e93e3fb19020df + md5: 7a1ab67ee32e0d58ce55134d7a56b8fe + depends: + - docutils >=0.18,<0.22 + - jinja2 + - markdown-it-py >=3.0.0,<4.0.0 + - mdit-py-plugins >=0.4,<1 + - python >=3.8 + - pyyaml + - sphinx >=6,<8 + license: MIT + license_family: MIT + run_exports: {} + size: 72235 + timestamp: 1714413912964 +- conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.24.0-pyhcf101f3_0.conda + sha256: 57f525a1c55b08c3204fab05d2c74a3e9c2172d7f08f1ecaa07e19865cc1d7cf + md5: 42ef6cbb3e1d0e6689b9dd160f560eae + depends: + - python >=3.10 + - python + license: MIT + run_exports: {} + size: 289946 + timestamp: 1783943716915 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.11.0-pyhd8ed1ab_0.conda + sha256: eceb424236fbbb9b337a857fe5448307b57a2a3fb2db389ae37e7a8b8cdca2ab + md5: cf01a81d7960ad9c829bf2e794fcee9a + depends: + - jupyter_client >=7.0.0 + - jupyter_core >=5.4 + - nbformat >=5.2.0 + - python >=3.10 + - traitlets >=5.13 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 29138 + timestamp: 1780661039538 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.17.1-pyhcf101f3_0.conda + sha256: ab2ac79c5892c5434d50b3542d96645bdaa06d025b6e03734be29200de248ac2 + md5: 2bce0d047658a91b99441390b9b27045 + depends: + - beautifulsoup4 + - bleach-with-css !=5.0.0 + - defusedxml + - importlib-metadata >=3.6 + - jinja2 >=3.0 + - jupyter_core >=4.7 + - jupyterlab_pygments + - markupsafe >=2.0 + - mistune >=2.0.3,<4 + - nbclient >=0.5.0 + - nbformat >=5.7 + - packaging + - pandocfilters >=1.4.1 + - pygments >=2.4.1 + - python >=3.10 + - traitlets >=5.1 + - python + constrains: + - pandoc >=2.9.2,<4.0.0 + - nbconvert ==7.17.1 *_0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 202229 + timestamp: 1775615493260 +- conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda + sha256: 7a5bd30a2e7ddd7b85031a5e2e14f290898098dc85bea5b3a5bf147c25122838 + md5: bbe1963f1e47f594070ffe87cdf612ea + depends: + - jsonschema >=2.6 + - jupyter_core >=4.12,!=5.0.* + - python >=3.9 + - python-fastjsonschema >=2.15 + - traitlets >=5.1 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 100945 + timestamp: 1733402844974 +- conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio2-1.7.2-pyhcf101f3_0.conda + sha256: e6768ceef038f4d7e083de7e393f5dd7d672b937e2bda570b740f6399b686689 + md5: fcd832bfd4749e9b246112b6894f97fc + depends: + - python >=3.10 + - python + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 15903 + timestamp: 1770973502283 +- conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda + sha256: 4fa40e3e13fc6ea0a93f67dfc76c96190afd7ea4ffc1bac2612d954b42cdc3ee + md5: eb52d14a901e23c39e9e7b4a1a5c015f + depends: + - python >=3.10 + - setuptools + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 40866 + timestamp: 1766261270149 +- conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda + sha256: 7b920e46b9f7a2d2aa6434222e5c8d739021dbc5cc75f32d124a8191d86f9056 + md5: e7f89ea5f7ea9401642758ff50a2d9c1 + depends: + - jupyter_server >=1.8,<3 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 16817 + timestamp: 1733408419340 +- conda: https://conda.anaconda.org/conda-forge/noarch/numbagg-0.9.4-pyhd8ed1ab_0.conda + sha256: 0496db848c95563750da3471416e1b6bd7332578ce6a45178ee2bb4876bac4fc + md5: 078660cdbcee458147218d681a363706 + depends: + - numba + - numpy + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 66889 + timestamp: 1765783672993 +- conda: https://conda.anaconda.org/conda-forge/noarch/numpy_groupies-0.11.3-pyhd8ed1ab_0.conda + sha256: 94c148b8d4687c839a37c4a68b1674fa548b065e833b9b4701865d548995239f + md5: 5402c2b046432ceb2d192a82802e7854 + depends: + - numpy + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 38384 + timestamp: 1747937493897 +- conda: https://conda.anaconda.org/conda-forge/noarch/oauthlib-3.3.1-pyhd8ed1ab_0.conda + sha256: dfa8222df90736fa13f8896f5a573a50273af8347542d412c3bd1230058e56a5 + md5: d4f3f31ee39db3efecb96c0728d4bdbf + depends: + - blinker + - cryptography + - pyjwt >=1.0.0 + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 102059 + timestamp: 1750415349440 +- conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda + sha256: 1840bd90d25d4930d60f57b4f38d4e0ae3f5b8db2819638709c36098c6ba770c + md5: e51f1e4089cad105b6cac64bd8166587 + depends: + - python >=3.9 + - typing_utils + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 30139 + timestamp: 1734587755455 +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda + sha256: 3906abfb6511a3bb309e39b9b1b7bc38f50a723971de2395489fd1f379255890 + md5: 4c06a92e74452cfa53623a81592e8934 + depends: + - python >=3.8 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 91574 + timestamp: 1777103621679 +- conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 + sha256: 2bb9ba9857f4774b85900c2562f7e711d08dd48e2add9bee4e1612fbee27e16f + md5: 457c2c8c08e54905d6954e79cb5b5db9 + depends: + - python !=3.0,!=3.1,!=3.2,!=3.3 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 11627 + timestamp: 1631603397334 +- conda: https://conda.anaconda.org/conda-forge/noarch/panel-1.9.3-pyhd8ed1ab_0.conda + sha256: 060f8bce74385c50f682f69dfb9c6f0b340d78bc2a85154889c5698498195f33 + md5: e9e5f439e2c9a5cc4f0edcfaeff89f22 + depends: + - panel-core 1.9.3 pyha770c72_0 + - panel-material-ui >=0.10.0 + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 8115 + timestamp: 1780383158234 +- conda: https://conda.anaconda.org/conda-forge/noarch/panel-core-1.9.3-pyha770c72_0.conda + sha256: 55e5d084a413c84bb3558ba8f83f7b0899845859f10dd86d3f1a45f68d65d947 + md5: 7285b1299900255923435890ef95855b + depends: + - bokeh >=3.7.0,<3.10.0 + - linkify-it-py + - markdown + - markdown-it-py + - mdit-py-plugins + - narwhals >=2 + - nh3 + - packaging + - pandas >=1.2 + - param >=2.1.0,<3.0 + - python >=3.10 + - pyviz_comms >=2.0.0 + - requests + - tqdm + - typing_extensions + constrains: + - holoviews >=1.18.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 23014831 + timestamp: 1780383113204 +- conda: https://conda.anaconda.org/conda-forge/noarch/panel-material-ui-0.14.0-pyhd8ed1ab_0.conda + sha256: edf1e5ba2398fae16785ff701259cbe3f11402d9ecbd7f63ee9519227038f9a8 + md5: 204ef81985d1aaa73c7add64de34cc00 + depends: + - bokeh >=3.8.0 + - packaging + - panel-core >=1.8.0 + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 1574979 + timestamp: 1783685059711 +- conda: https://conda.anaconda.org/conda-forge/noarch/param-2.4.1-pyhc455866_0.conda + sha256: c4c7e11678c4615d7b06d35e41b94169c2dda6a74306ac091420a66ae65aeace + md5: a57cdb52c22ef5d737a8ebf67440e5b0 + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 193829 + timestamp: 1781621758980 +- conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.7-pyhcf101f3_0.conda + sha256: 611882f7944b467281c46644ffde6c5145d1a7730388bcde26e7e86819b0998e + md5: 39894c952938276405a1bd30e4ce2caf + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 82472 + timestamp: 1777722955579 +- conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda + sha256: 472fc587c63ec4f6eba0cc0b06008a6371e0a08a5986de3cf4e8024a47b4fe6c + md5: 0badf9c54e24cecfb0ad2f99d680c163 + depends: + - locket + - python >=3.9 + - toolz + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 20884 + timestamp: 1715026639309 +- conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda + sha256: 202af1de83b585d36445dc1fda94266697341994d1a3328fabde4989e1b3d07a + md5: d0d408b1f18883a944376da5cf8101ea + depends: + - ptyprocess >=0.5 + - python >=3.9 + license: ISC + run_exports: {} + size: 53561 + timestamp: 1733302019362 +- conda: https://conda.anaconda.org/conda-forge/noarch/pint-0.25.3-pyhc364b38_0.conda + sha256: f58a03dd2908c15dc65fab7e03a0212c69043466f7f85a4e345470492841782f + md5: 293c4719f6d62778ffecd18e024a8fcd + depends: + - python >=3.11 + - platformdirs >=2.1.0 + - flexcache >=0.3 + - flexparser >=0.4 + - typing_extensions >=4.0.0 + - python + constrains: + - numpy >=1.23 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 245230 + timestamp: 1773969991837 +- conda: https://conda.anaconda.org/conda-forge/noarch/pint-xarray-0.6.1-pyhd8ed1ab_0.conda + sha256: c020a7dce38efe1c88b39985fa793d0c8241a48e4588ea129e52fee8719e037c + md5: 4315c8d39fd8b0541d7ff73c4cf91a8a + depends: + - numpy >=1.26 + - pint >=0.24 + - python >=3.11 + - xarray >=2023.07.0 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 43278 + timestamp: 1774347521180 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.10.0-pyhcf101f3_0.conda + sha256: 9e5e1fd3506ccfc4d444fc4d2d39b0ed097d5d0e3bd3d4bdf6bcc81aaf66860d + md5: 2c5ef45db85d34799771629bd5860fd7 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 26308 + timestamp: 1779972894916 +- conda: https://conda.anaconda.org/conda-forge/noarch/pooch-1.9.0-pyhd8ed1ab_0.conda + sha256: 081e52c4612830bf1fd4a9c78eebaf335d1385d74ddfd328b1b2f26b983848eb + md5: dd4b6337bf8886855db6905b336db3c8 + depends: + - packaging >=20.0 + - platformdirs >=2.5.0 + - python >=3.10 + - requests >=2.19.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 56833 + timestamp: 1769816568869 +- conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.6.0-pyha770c72_0.conda + sha256: 716960bf0a9eb334458a26b3bdcb17b8d0786062138a4f48c7f335c8418c5d0b + md5: 7859736b4f8ebe6c8481bf48d91c9a1e + depends: + - cfgv >=2.0.0 + - identify >=1.0.0 + - nodeenv >=0.11.1 + - python >=3.10 + - pyyaml >=5.1 + - virtualenv >=20.10.0 + license: MIT + license_family: MIT + run_exports: {} + size: 201606 + timestamp: 1776858157327 +- conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.25.0-pyhd8ed1ab_0.conda + sha256: 4d7ec90d4f9c1f3b4a50623fefe4ebba69f651b102b373f7c0e9dbbfa43d495c + md5: a11ab1f31af799dd93c3a39881528884 + depends: + - python >=3.10 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 57113 + timestamp: 1775771465170 +- conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda + sha256: 4817651a276016f3838957bfdf963386438c70761e9faec7749d411635979bae + md5: edb16f14d920fb3faf17f5ce582942d6 + depends: + - python >=3.10 + - wcwidth + constrains: + - prompt_toolkit 3.0.52 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 273927 + timestamp: 1756321848365 +- conda: https://conda.anaconda.org/conda-forge/noarch/propcache-0.5.2-pyh7db6752_0.conda + sha256: c9be65d8dd0b34a795be877359468f2a5cb521c63f264de8c4e5a6141e19df30 + md5: e3cbba0c0ab42143adeefd1d09866695 + depends: + - python >=3.10 + track_features: + - propcache_no_compile + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 19936 + timestamp: 1780037707071 +- conda: https://conda.anaconda.org/conda-forge/noarch/proto-plus-1.28.1-pyhcf101f3_0.conda + sha256: 6e86e0f7697b16663b567d99ecd31ea9be241798215d56bba1254a612446f9e1 + md5: 63fac42071fec8205bb239cf704e0cb0 + depends: + - python >=3.10 + - protobuf >=4.25.8,<8.0.0 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 43664 + timestamp: 1783786622043 +- conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda + sha256: a7713dfe30faf17508ec359e0bc7e0983f5d94682492469bd462cdaae9c64d83 + md5: 7d9daffbb8d8e0af0f769dbbcd173a54 + depends: + - python >=3.9 + license: ISC + run_exports: {} + size: 19457 + timestamp: 1733302371990 +- conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda + sha256: 71bd24600d14bb171a6321d523486f6a06f855e75e547fa0cb2a0953b02047f0 + md5: 3bfdfb8dbcdc4af1ae3f9a8eb3948f04 + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 16668 + timestamp: 1733569518868 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-0.6.4-pyhcf101f3_0.conda + sha256: 3b85c117363f823749d3f9cc9ce178f5580580f0b65a7ee021b2d08dc25d37fe + md5: 9c1d3582aa39e47e263c46e5026fed0b + depends: + - python >=3.10 + - python + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 66722 + timestamp: 1783572312166 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyasn1-modules-0.4.2-pyhd8ed1ab_0.conda + sha256: 5495061f5d3d6b82b74d400273c586e7c1f1700183de1d2d1688e900071687cb + md5: c689b62552f6b63f32f3322e463f3805 + depends: + - pyasn1 >=0.6.1,<0.7.0 + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 95990 + timestamp: 1743436137965 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-0.26.1-pyhcf101f3_0.conda + sha256: fd9b0a389b21dc2ccb11925db83a5e9e32652e87971f93c23358d51c3632d96d + md5: b0969b1326b5b9d6094dd1831eb48919 + depends: + - python >=3.10 + - pyyaml >=3.1 + - latexcodec >=1.0.4 + - importlib-metadata + - python + license: MIT + license_family: MIT + run_exports: {} + size: 78091 + timestamp: 1775231969598 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybtex-docutils-1.0.3-pyhcf101f3_4.conda + sha256: a0397b8fc65eabd773fe33affb726fe9d16c8f0a8ab7c3493d80c412ef2539a6 + md5: 75f19dd4b0b95ce928286e18c561cb13 + depends: + - python >=3.10 + - setuptools + - docutils >=0.14 + - pybtex >=0.16 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 14980 + timestamp: 1765317730499 +- conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-3.0-pyhcf101f3_0.conda + sha256: e27e0473fc6723311a0bd48b89b616fa1b996a2f7a2b555338cbbcfb9c640568 + md5: 9c5491066224083c41b6d5635ed7107b + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 55886 + timestamp: 1779293633166 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyct-0.6.0-pyhd8ed1ab_0.conda + sha256: 2857170af7e0a0604bbaa305caaedf117ff59a5aa88553530544e1374509be93 + md5: 9d19c7ea78d067fbbaa2317a85f844e7 + depends: + - param >=1.7.0 + - python >=3.8 + - pyyaml + - requests + constrains: + - pyct-core <0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 22142 + timestamp: 1759062813077 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydap-3.5.10-pyhc455866_0.conda + sha256: 483210b5e8e99d3c6e2bc7b89e8d6343af0d276e3ed10b14b5bda57d606c867a + md5: f98ab0673be88ce763d949bde6a85382 + depends: + - beautifulsoup4 + - docopt-ng + - jinja2 + - lxml + - numpy + - python >=3.12 + - requests + - requests-cache + - scipy + - webob >=1.8.10 + license: MIT + license_family: MIT + run_exports: {} + size: 792789 + timestamp: 1782747976184 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + sha256: 073473ba9c0cc3946026dde9112d2edb0ac52f6cc35d2126f4bff8bad1cc74a6 + md5: 837aaf71ddf3b27acae0e7e9015eebc6 + depends: + - accessible-pygments + - babel + - beautifulsoup4 + - docutils !=0.17.0 + - pygments >=2.7 + - python >=3.9 + - sphinx >=6.1 + - typing_extensions + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 1547597 + timestamp: 1734446468767 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda + sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 + md5: 16c18772b340887160c79a6acc022db0 + depends: + - python >=3.10 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 893031 + timestamp: 1774796815820 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyjwt-2.13.0-pyhcf101f3_0.conda + sha256: 58cda7489477fecb859ec95bf73cba7e4634db1a517e29e0d3086d7ec71733ae + md5: edb808d7f7396478ab6e457e697b8ec5 + depends: + - python >=3.10 + - typing_extensions >=4.0 + - python + constrains: + - cryptography >=3.4.0 + license: MIT + license_family: MIT + run_exports: {} + size: 33417 + timestamp: 1779400286454 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda + sha256: 417fba4783e528ee732afa82999300859b065dc59927344b4859c64aae7182de + md5: 3687cc0b82a8b4c17e1f0eb7e47163d5 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 110893 + timestamp: 1769003998136 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-3.1.4-pyhcf101f3_0.conda + sha256: dde0c9ec13ce07edcb6fb7f68a4595f031f5de58bacd23f950f42548763a0687 + md5: 45d60067e867abbcd271189506da5749 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 510534 + timestamp: 1782820117625 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda + sha256: d016e04b0e12063fbee4a2d5fbb9b39a8d191b5a0042f0b8459188aedeabb0ca + md5: e2fd202833c4a981ce8a65974fe4abd1 + depends: + - __win + - python >=3.9 + - win_inet_pton + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 21784 + timestamp: 1733217448189 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + md5: 461219d1a5bd61342293efa2c0c90eac + depends: + - __unix + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 21085 + timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 + md5: 5b8d21249ff20967101ffa321cab24e8 + depends: + - python >=3.9 + - six >=1.5 + - python + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 233310 + timestamp: 1751104122689 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.4.4-pyhcf101f3_0.conda + sha256: 9384ca69570af20fd91f2b0b659cdcbcba4ce5ced2a08c6dd234b13a6cd80411 + md5: 1b77c69c18f649eb348bafedb277fecb + depends: + - python >=3.10 + - filelock >=3.15.4 + - platformdirs <5,>=4.3.6 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 35789 + timestamp: 1783599318259 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda + sha256: df9aa74e9e28e8d1309274648aac08ec447a92512c33f61a8de0afa9ce32ebe8 + md5: 23029aae904a2ba587daba708208012f + depends: + - python >=3.9 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 244628 + timestamp: 1755304154927 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.6-h4df99d1_100.conda + sha256: 84c129bdd6abcecac42a948f2670d17fe735d02d3a5a483a9b1f1bc33ba38c28 + md5: 224f69f177eb5aae6c9a6052846bf609 + depends: + - cpython 3.14.6.* + - python_abi * *_cp314 + license: Python-2.0 + run_exports: {} + size: 49315 + timestamp: 1781254664376 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-graphviz-0.21-pyhbacfb6d_0.conda + sha256: b0139f80dea17136451975e4c0fefb5c86893d8b7bc6360626e8b025b8d8003a + md5: 606d94da4566aa177df7615d68b29176 + depends: + - graphviz >=2.46.1 + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 38837 + timestamp: 1749998558249 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-4.1.0-pyhd8ed1ab_0.conda + sha256: a0dfe07d0bc1d8c47a38b79ad4a8eb1bc7b86fb33ee5293ebb45dfdc46191f4e + md5: 982ed0cbfc0fe09f25861e3d111e9717 + depends: + - python >=3.10 + - typing_extensions + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 19249 + timestamp: 1781036004580 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2026.3-pyhd8ed1ab_0.conda + sha256: 3f05db78cf8be33cf6dbc469664b8e3a01f3980d61d6d6bef48669b171896d8a + md5: eefc8d916bd2e708d76d40398ef9a1ee + depends: + - python >=3.10 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 146862 + timestamp: 1783704822814 +- conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + build_number: 8 + sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 + md5: 0539938c55b6b1a59b560e843ad864a4 + constrains: + - python 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 6989 + timestamp: 1752805904792 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyu2f-0.1.5-pyhd8ed1ab_1.conda + sha256: 991caa5408aea018488a2c94e915c11792b9321b0ef64401f4829ebd0abfb3c0 + md5: 644bd4ca9f68ef536b902685d773d697 + depends: + - python >=3.9 + - six + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 36786 + timestamp: 1733738704089 +- conda: https://conda.anaconda.org/conda-forge/noarch/pyviz_comms-3.0.6-pyhd8ed1ab_0.conda + sha256: 4095768d06ffbe31aa98f1d4a982c1f483de088749f30e990673fcae94f1d8d1 + md5: e0f2c3ecb4dc40d031bbe88869a2a7a1 + depends: + - param + - python >=3.9 + constrains: + - jupyterlab >=4.0,<5 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 49425 + timestamp: 1750669964512 +- conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda + sha256: 0577eedfb347ff94d0f2fa6c052c502989b028216996b45c7f21236f25864414 + md5: 870293df500ca7e18bedefa5838a22ab + depends: + - attrs >=22.2.0 + - python >=3.10 + - rpds-py >=0.7.0 + - typing_extensions >=4.4.0 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 51788 + timestamp: 1760379115194 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.34.2-pyhcf101f3_0.conda + sha256: 1715246b19c9f85ee022933b4845f2fc14ac9184981b7b7d9b728bec8e9588da + md5: 4a85203c1d80c1059086ae860836ffb9 + depends: + - python >=3.10 + - certifi >=2023.5.7 + - charset-normalizer >=2,<4 + - idna >=2.5,<4 + - urllib3 >=1.26,<3 + - python + constrains: + - chardet >=3.0.2,<8 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 68709 + timestamp: 1778851103479 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.3.3-pyhd8ed1ab_0.conda + sha256: 433c8b2031617370f7eb4a929610ab50e371417c1a6799e687d8dd8ec532b056 + md5: bd700484ad926f231fad14fd16136854 + depends: + - attrs >=21.2 + - cattrs >=22.2 + - itsdangerous >=2.0 + - platformdirs >=2.5 + - python >=3.10 + - pyyaml >=6.0.1 + - requests >=2.22 + - ujson >=5.4 + - url-normalize >=1.4 + - urllib3 >=1.25.5 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 56613 + timestamp: 1783124032728 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-oauthlib-2.0.0-pyhd8ed1ab_1.conda + sha256: 75ef0072ae6691f5ca9709fe6a2570b98177b49d0231a6749ac4e610da934cab + md5: a283b764d8b155f81e904675ef5e1f4b + depends: + - oauthlib >=3.0.0 + - python >=3.9 + - requests >=2.0.0 + license: ISC + run_exports: {} + size: 25875 + timestamp: 1733772348802 +- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3339-validator-0.1.4-pyhd8ed1ab_1.conda + sha256: 2e4372f600490a6e0b3bac60717278448e323cab1c0fecd5f43f7c56535a99c5 + md5: 36de09a8d3e5d5e6f4ee63af49e59706 + depends: + - python >=3.9 + - six + license: MIT + license_family: MIT + run_exports: {} + size: 10209 + timestamp: 1733600040800 +- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 + sha256: 2a5b495a1de0f60f24d8a74578ebc23b24aa53279b1ad583755f223097c41c37 + md5: 912a71cc01012ee38e6b90ddd561e36f + depends: + - python + license: MIT + license_family: MIT + run_exports: {} + size: 7818 + timestamp: 1598024297745 +- conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda + sha256: 70001ac24ee62058557783d9c5a7bbcfd97bd4911ef5440e3f7a576f9e43bc92 + md5: 7234f99325263a5af6d4cd195035e8f2 + depends: + - python >=3.9 + - lark >=1.2.2 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 22913 + timestamp: 1752876729969 +- conda: https://conda.anaconda.org/conda-forge/noarch/rich-15.0.0-pyhcf101f3_0.conda + sha256: 3d6ba2c0fcdac3196ba2f0615b4104e532525ffa1335b50a2878be5ff488814a + md5: 0242025a3c804966bf71aa04eee82f66 + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.10 + - typing_extensions >=4.0.0,<5.0.0 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 208577 + timestamp: 1775991661559 +- conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda + sha256: a95c313b27b440368be0bf16e0a30d8413f1722a74b99147e406317d5d7968fa + md5: 3b15f93fcd0f02b829596ade8b8f0d5a + depends: + - python >=3.12 + - packaging + - rasterio >=1.4.3 + - xarray >=2026.2 + - pyproj >=3.3 + - numpy >=2 + - python + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 65348 + timestamp: 1772826126034 +- conda: https://conda.anaconda.org/conda-forge/noarch/rsa-4.9.1-pyhd8ed1ab_0.conda + sha256: e32e94e7693d4bc9305b36b8a4ef61034e0428f58850ebee4675978e3c2e5acf + md5: 58958bb50f986ac0c46f73b6e290d5fe + depends: + - pyasn1 >=0.1.3 + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 31709 + timestamp: 1744825527634 +- conda: https://conda.anaconda.org/conda-forge/noarch/s3fs-2026.6.0-pyhd8ed1ab_0.conda + sha256: 24b60ce176c21de548239a7b256c5d0a39190108edbc53b10229d46bd74b2ddd + md5: a472598199c08f010f2e90b8e7886ef0 + depends: + - aiobotocore >=2.19.0,<4.0.0 + - aiohttp + - fsspec >=2026.6.0,<2026.6.1 + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 36232 + timestamp: 1781621673975 +- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh5552912_1.conda + sha256: 8fc024bf1a7b99fc833b131ceef4bef8c235ad61ecb95a71a6108be2ccda63e8 + md5: b70e2d44e6aa2beb69ba64206a16e4c6 + depends: + - __osx + - pyobjc-framework-cocoa + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 22519 + timestamp: 1770937603551 +- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyh6dadd2b_1.conda + sha256: 305446a0b018f285351300463653d3d3457687270e20eda37417b12ee386ef76 + md5: 6ac53f3fff2c416d63511843a04646fa + depends: + - __win + - pywin32 + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 22864 + timestamp: 1770937641143 +- conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.1.0-pyha191276_1.conda + sha256: 59656f6b2db07229351dfb3a859c35e57cc8e8bcbc86d4e501bff881a6f771f1 + md5: 28eb91468df04f655a57bcfbb35fc5c5 + depends: + - __linux + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 24108 + timestamp: 1770937597662 +- conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-83.0.0-pyh332efcf_0.conda + sha256: 48a9f96016505debadfc67f06de7ac548decbc38d327409b24b0432ef6f16335 + md5: 6bf6acbab2499830180ec88c3aff2fa4 + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 642081 + timestamp: 1783619174976 +- conda: https://conda.anaconda.org/conda-forge/noarch/simpervisor-1.0.0-pyhd8ed1ab_1.conda + sha256: 9c53a1dc8c7fd2c881b98f3a9e50fa8c5d67e3ca52de12338f0d94b40da6881e + md5: b12cd36c9eea3f4d2f77daef432bdc00 + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 13639 + timestamp: 1734339920707 +- conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d + md5: 3339e3b65d58accf4ca4fb8748ab16b3 + depends: + - python >=3.9 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 18455 + timestamp: 1753199211006 +- conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda + sha256: dce518f45e24cd03f401cb0616917773159a210c19d601c5f2d4e0e5879d30ad + md5: 03fe290994c5e4ec17293cfb6bdce520 + depends: + - python >=3.10 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 15698 + timestamp: 1762941572482 +- conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.1.1-pyhd8ed1ab_0.conda + sha256: ad89284ea94821c20ff87e64b948e4afc690cf5202d14c009355b0594cf23aea + md5: 46b6abe31482f6bca064b965696ae807 + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 74456 + timestamp: 1780468201547 +- conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda + sha256: 61f9373709e7d9009e3a062b135dbe44b16e684a4fcfe2dd624143bc0f80d402 + md5: 9aa358575bbd4be126eaa5e0039f835c + depends: + - numpy + - pyparsing >=2.1.6 + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 11313 + timestamp: 1733818738919 +- conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda + sha256: d1e3e06b5cf26093047e63c8cc77b70d970411c5cbc0cb1fad461a8a8df599f7 + md5: 0401a17ae845fa72c7210e206ec5647d + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 28657 + timestamp: 1738440459037 +- conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.4-pyhd8ed1ab_0.conda + sha256: 2afa5fe9331c09b4c4689ddf6ace8fc16c837eae547c57dab325b844072fdd77 + md5: 9e21f087f087f805debe877d88e00a14 + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 38802 + timestamp: 1779635534390 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda + sha256: 0de25d561b20dd06982df45a2c3cef490e45b0d4bae8d2c290030721bdadecd6 + md5: c568e260463da2528ecfd7c5a0b41bbd + depends: + - alabaster >=0.7.14,<0.8.dev0 + - babel >=2.13 + - colorama >=0.4.6 + - docutils >=0.20,<0.22 + - imagesize >=1.3 + - importlib-metadata >=6.0 + - jinja2 >=3.1 + - packaging >=23.0 + - pygments >=2.17 + - python >=3.9 + - requests >=2.30.0 + - snowballstemmer >=2.2 + - sphinxcontrib-applehelp + - sphinxcontrib-devhelp + - sphinxcontrib-htmlhelp >=2.0.0 + - sphinxcontrib-jsmath + - sphinxcontrib-qthelp + - sphinxcontrib-serializinghtml >=1.1.9 + - tomli >=2.0 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 1358660 + timestamp: 1721487658869 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-autobuild-2025.8.25-pyhcf101f3_0.conda + sha256: ad56a36c575f4ccec429e070dd36538cb6cb25f8d8b174a94bb9622858d9e4a4 + md5: 26d9d9a48ff32bca94581d7c91684ab8 + depends: + - colorama >=0.4.6 + - python >=3.11 + - sphinx + - starlette >=0.35 + - uvicorn >=0.25 + - watchfiles >=0.20 + - websockets >=11 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 19892 + timestamp: 1762270046787 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-book-theme-1.2.0-pyhc364b38_0.conda + sha256: f8b004690f721c9c6633e597f93c0072851244f930c3b04ca135852c4c02b72a + md5: e1695652b3b371d33a03042caa7c3e21 + depends: + - pydata-sphinx-theme ==0.16.1 + - python >=3.11 + - sphinx >=7.0 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 259486 + timestamp: 1773112131378 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-codeautolink-0.18.1-pyhd8ed1ab_0.conda + sha256: 434ea90ec8d173d1d79678dff652808bae44abf3d650cdbadcc9fb78c4f16644 + md5: 68d94f97be6a7faae493d1c76671861b + depends: + - beautifulsoup4 >=4.8.1 + - python >=3.10 + - sphinx >=3.2.0 + constrains: + - ipython !=8.7.0 + license: MIT + license_family: MIT + run_exports: {} + size: 49327 + timestamp: 1777559259495 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-comments-0.0.3-pyhd8ed1ab_1.conda + sha256: 00129f91b905441a9e27c46ef32c22617743eb4a4f7207e1dd84bc19505d4381 + md5: 30e02fa8e40287da066e348c95ff5609 + depends: + - python >=3.9 + - sphinx >=1.8 + license: MIT + license_family: MIT + run_exports: {} + size: 11014 + timestamp: 1736273059036 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda + sha256: 8cd892e49cb4d00501bc4439fb0c73ca44905f01a65b2b7fa05ba0e8f3924f19 + md5: bf22cb9c439572760316ce0748af3713 + depends: + - python >=3.9 + - sphinx >=1.8 + license: MIT + license_family: MIT + run_exports: {} + size: 17893 + timestamp: 1734573117732 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.7.0-pyhd8ed1ab_0.conda + sha256: 7f8437a97e6311bebf230cfd2ae3c5bdb2230e681c41daebdb894280bf8b4ab6 + md5: 28eddfb8b9ecdd044a6f609f985398a7 + depends: + - python >=3.11 + - sphinx >=7,<10 + license: MIT + license_family: MIT + run_exports: {} + size: 931118 + timestamp: 1769032711360 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-external-toc-1.1.0-pyhd8ed1ab_0.conda + sha256: a269440bb86a4daf5a41639436d78619948db5685219b0a8c61fa729e1d795cd + md5: dd9a2afeb6b7015ec7e8746e9c31481a + depends: + - click >=7.1 + - python >=3.10 + - pyyaml + - sphinx >=5 + - sphinx-multitoc-numbering >=0.1.3 + license: MIT + license_family: MIT + run_exports: {} + size: 32742 + timestamp: 1768600316642 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-jupyterbook-latex-1.0.0-pyhd8ed1ab_1.conda + sha256: b64c031795918f26ddeb5148ede2d3a4944cd9f5461cf72bde3f28acdc71d2f3 + md5: 9261bc5d987013f5d8dc58061c34f1a3 + depends: + - packaging + - python >=3.9 + - sphinx >=5 + constrains: + - myst-nb >=1.0.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 17727 + timestamp: 1735227211614 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-multitoc-numbering-0.1.3-pyhd8ed1ab_1.conda + sha256: 9fa48b33334c3a9971c96dd3d921950e8350cfa88a8e8ebaec6d8261071ea2ac + md5: cc5fc0988f0fedab436361b9b5906a58 + depends: + - python >=3.9 + - sphinx >=3 + license: MIT + license_family: MIT + run_exports: {} + size: 10541 + timestamp: 1735142015381 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-notfound-page-1.1.0-pyhd8ed1ab_0.conda + sha256: 227e87c72ff1e20833009f6ee6f9c1067534a92a14d8484619953d50f3c90f13 + md5: 08f13b15791e1b82ad8ad7d5b373ab54 + depends: + - docutils + - python >=3.9 + - sphinx + license: MIT + license_family: MIT + run_exports: {} + size: 14204 + timestamp: 1749276617752 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-thebe-0.3.1-pyhd8ed1ab_1.conda + sha256: 9d0cd52edcb2274bf7c8e9327317d9bb48e1d092afeaed093e0242876ad3c008 + md5: f6627ce09745a0f822cc6e7de8cf4f99 + depends: + - python >=3.9 + - sphinx >=4 + license: MIT + license_family: MIT + run_exports: {} + size: 14713 + timestamp: 1734702587800 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-togglebutton-0.3.2-pyhd8ed1ab_0.tar.bz2 + sha256: 0dcee238aae6337fae5eaf1f9a29b0c51ed9834ae501fccb2cde0fed8dae1a88 + md5: 382738101934261ea7931d1460e64868 + depends: + - docutils + - python >=3.6 + - sphinx + license: MIT + license_family: MIT + run_exports: {} + size: 12268 + timestamp: 1664390298824 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda + sha256: d7433a344a9ad32a680b881c81b0034bc61618d12c39dd6e3309abeffa9577ba + md5: 16e3f039c0aa6446513e94ab18a8784b + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 29752 + timestamp: 1733754216334 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-bibtex-2.7.0-pyhd8ed1ab_0.conda + sha256: 3b9c6273f95302df966a48a267b33ddf78ed6e662c7d578d3e129e259e049314 + md5: 7f562e153eedbdc92f1c3adb019a8792 + depends: + - docutils >=0.20 + - pybtex >=0.25 + - pybtex-docutils >=1.0.2 + - python >=3.10 + - sphinx >=7.4 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 33489 + timestamp: 1778364472446 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda + sha256: 55d5076005d20b84b20bee7844e686b7e60eb9f683af04492e598a622b12d53d + md5: 910f28a05c178feba832f842155cbfff + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 24536 + timestamp: 1733754232002 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda + sha256: c1492c0262ccf16694bdcd3bb62aa4627878ea8782d5cd3876614ffeb62b3996 + md5: e9fb3fe8a5b758b4aff187d434f94f03 + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 32895 + timestamp: 1733754385092 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda + sha256: 578bef5ec630e5b2b8810d898bbbf79b9ae66d49b7938bcc3efc364e679f2a62 + md5: fa839b5ff59e192f411ccc7dae6588bb + depends: + - python >=3.9 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 10462 + timestamp: 1733753857224 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.3-pyhd8ed1ab_0.conda + sha256: 7872cd83d55a548670633d4c0b30c367aa4a1c4ab6bf7a0816af42d893fb489a + md5: 2b710922bf78cb3e336575a0d5bdef02 + depends: + - python >=3.10 + - pyyaml + - sphinx + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 21620 + timestamp: 1783487883912 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda + sha256: c664fefae4acdb5fae973bdde25836faf451f41d04342b64a358f9a7753c92ca + md5: 00534ebcc0375929b45c3039b5ba7636 + depends: + - python >=3.9 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 26959 + timestamp: 1733753505008 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-2.0.0-pyhd8ed1ab_0.conda + sha256: 20b49741065fd7d3fabf98caf6d19b6436badb06b6d41f66b58f1fc2b52f37a1 + md5: f77df1fcf9af03b7287342638befca77 + depends: + - python >=3.10 + - sphinx >=5 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 30640 + timestamp: 1781260357443 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxext-rediraffe-0.3.0-pyhcf101f3_0.conda + sha256: e49060b75d53e8267677aee98f94b189352a4788054e25616d94b5c9c357d46c + md5: 2ac922fd138b8a52b471ec305dd81212 + depends: + - python >=3.10 + - sphinx >=6.0 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 14989 + timestamp: 1759152036011 +- conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda + sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41 + md5: b1b505328da7a6b246787df4b5a49fbc + depends: + - asttokens + - executing + - pure_eval + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 26988 + timestamp: 1733569565672 +- conda: https://conda.anaconda.org/conda-forge/noarch/starlette-1.3.1-pyhcf101f3_0.conda + sha256: 17e3dc37c0ac9754b782e49285a3d8d223d372f7012d64a4f6ae371466cef143 + md5: bb8e15a6ef1a475545720fa2c29f19c4 + depends: + - anyio >=3.6.2,<5 + - python >=3.10 + - typing_extensions >=4.10.0 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 64264 + timestamp: 1781447071524 +- conda: https://conda.anaconda.org/conda-forge/noarch/tabulate-0.10.0-pyhcf101f3_0.conda + sha256: 3f661e98a09f976775a494488beb3d35ebb00f535b169c6bd891f2e280d55783 + md5: 3b887b7b3468b0f494b4fad40178b043 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 43964 + timestamp: 1772732795746 +- conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda + sha256: 6b549360f687ee4d11bf85a6d6a276a30f9333df1857adb0fe785f0f8e9bcd60 + md5: f88bb644823094f436792f80fba3207e + depends: + - python >=3.10 + - python + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 19397 + timestamp: 1762956379123 +- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyh6dadd2b_1.conda + sha256: b375e8df0d5710717c31e7c8e93c025c37fa3504aea325c7a55509f64e5d4340 + md5: e43ca10d61e55d0a8ec5d8c62474ec9e + depends: + - __win + - pywinpty >=1.1.0 + - python >=3.10 + - tornado >=6.1.0 + - python + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 23665 + timestamp: 1766513806974 +- conda: https://conda.anaconda.org/conda-forge/noarch/terminado-0.18.1-pyhc90fa1f_1.conda + sha256: 6b6727a13d1ca6a23de5e6686500d0669081a117736a87c8abf444d60c1e40eb + md5: 17b43cee5cc84969529d5d0b0309b2cb + depends: + - __unix + - ptyprocess + - python >=3.10 + - tornado >=6.1.0 + - python + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 24749 + timestamp: 1766513766867 +- conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda + sha256: 6016672e0e72c4cf23c0cf7b1986283bd86a9c17e8d319212d78d8e9ae42fdfd + md5: 9d64911b31d57ca443e9f1e36b04385f + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 23869 + timestamp: 1741878358548 +- conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.4.0-pyhd8ed1ab_0.conda + sha256: cad582d6f978276522f84bd209a5ddac824742fe2d452af6acf900f8650a73a2 + md5: f1acf5fdefa8300de697982bcb1761c9 + depends: + - python >=3.5 + - webencodings >=0.4 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 28285 + timestamp: 1729802975370 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + sha256: 91cafdb64268e43e0e10d30bd1bef5af392e69f00edd34dfaf909f69ab2da6bd + md5: b5325cf06a000c5b14970462ff5e4d58 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 21561 + timestamp: 1774492402955 +- conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda + sha256: 4e379e1c18befb134247f56021fdf18e112fb35e64dd1691858b0a0f3bea9a45 + md5: c07a6153f8306e45794774cf9b13bd32 + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 53978 + timestamp: 1760707830681 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.68.4-pyh8f84b5b_0.conda + sha256: 1964320e89c00a531705449187f4b8ed85f935c73f13ba55de3a6b35b05443fa + md5: 54772f97dc361b1659ef0b34d71d39b4 + depends: + - python >=3.10 + - __unix + - python + constrains: + - envwrap >=0.2 + - ipywidgets >=6.0 + license: MPL-2.0 and MIT + run_exports: {} + size: 681697 + timestamp: 1783440211093 +- conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.68.4-pyha7b4d00_0.conda + sha256: fc8b4e3ec4e8d8f0b0bd399514e70141e0b1726f2ec58b6439158f6a20c02a23 + md5: a4708e48840dbcca9cb9c4344226080c + depends: + - python >=3.10 + - colorama + - __win + - python + constrains: + - envwrap >=0.2 + - ipywidgets >=6.0 + license: MPL-2.0 and MIT + run_exports: {} + size: 681392 + timestamp: 1783440259840 +- conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.15.1-pyhcf101f3_0.conda + sha256: b89a823edf524956b94a2a4db974866e4501f05c68976eff458c5dcf07f88431 + md5: 37e3be7b6e2977d37b8fa5da229f5dc0 + depends: + - python >=3.10 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 115158 + timestamp: 1780507822178 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.16.0-h69aa097_0.conda + sha256: b141933ece3518f6d7b75dfb59451e2f26b405a44c18e2518a83e9a02e09315c + md5: c680b5747e8c4c8f23dca0bb7042a8fc + depends: + - typing_extensions ==4.16.0 pyhcf101f3_0 + license: PSF-2.0 + license_family: PSF + run_exports: {} + size: 94080 + timestamp: 1783002732887 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + sha256: 2d888f90af0686044882c74193ec80a90ec1943145d94a7b1b048958acda1848 + md5: c70ad746c22219b9700931707482992c + depends: + - python >=3.10 + - python + license: PSF-2.0 + license_family: PSF + run_exports: {} + size: 52631 + timestamp: 1783002732887 +- conda: https://conda.anaconda.org/conda-forge/noarch/typing_utils-0.1.0-pyhd8ed1ab_1.conda + sha256: 3088d5d873411a56bf988eee774559335749aed6f6c28e07bf933256afb9eb6c + md5: f6d7aa696c67756a650e91e15e88223c + depends: + - python >=3.9 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 15183 + timestamp: 1733331395943 +- conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + sha256: 1d30098909076af33a35017eed6f2953af1c769e273a0626a04722ac4acaba3c + md5: ad659d0a2b3e47e38d829aa8cad2d610 + license: LicenseRef-Public-Domain + run_exports: {} + size: 119135 + timestamp: 1767016325805 +- conda: https://conda.anaconda.org/conda-forge/noarch/uc-micro-py-2.0.0-pyhcf101f3_0.conda + sha256: 9e5a0e70e876fca50de075b1cc6641cdc009a16c18f4d52ab03edb777729a1bc + md5: 4fdd327852ffefc83173a7c029690d0c + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 13378 + timestamp: 1772479008776 +- conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda + sha256: e0eb6c8daf892b3056f08416a96d68b0a358b7c46b99c8a50481b22631a4dfc0 + md5: e7cb0f5745e4c5035a460248334af7eb + depends: + - python >=3.9 + license: MIT + license_family: MIT + run_exports: {} + size: 23990 + timestamp: 1733323714454 +- conda: https://conda.anaconda.org/conda-forge/noarch/url-normalize-3.0.0-pyhd8ed1ab_0.conda + sha256: b479c71846946cf17225a2a85a0ca8a621b9deda2f88dd16838dc90a4b6d96ee + md5: 49b01263c5348a30838ba148a30126cf + depends: + - idna + - python >=3.10 + - six + license: MIT + license_family: MIT + run_exports: {} + size: 20754 + timestamp: 1777117020600 +- conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.7.0-pyhd8ed1ab_0.conda + sha256: feff959a816f7988a0893201aa9727bbb7ee1e9cec2c4f0428269b489eb93fb4 + md5: cbb88288f74dbe6ada1c6c7d0a97223e + depends: + - backports.zstd >=1.0.0 + - brotli-python >=1.2.0 + - h2 >=4,<5 + - pysocks >=1.5.6,<2.0,!=1.5.7 + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 103560 + timestamp: 1778188657149 +- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.51.0-pyh6dadd2b_0.conda + sha256: b7e023d9a24627c37096aee6664efcf3cbf7b721026c2ef89c712435ba955e20 + md5: 5341031d2050e1d62085b8ff3acb84dd + depends: + - __win + - click >=7.0 + - h11 >=0.8 + - python >=3.10 + - typing_extensions >=4.0 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 56796 + timestamp: 1783518931535 +- conda: https://conda.anaconda.org/conda-forge/noarch/uvicorn-0.51.0-pyhc90fa1f_0.conda + sha256: e9ca2188416b40eb79e50031649ec669dfbceea5cc5895c6f94f342612159974 + md5: fa008b61010236d744eae4ef867c63ce + depends: + - __unix + - click >=7.0 + - h11 >=0.8 + - python >=3.10 + - typing_extensions >=4.0 + - python + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 57699 + timestamp: 1783518883165 +- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.6.1-pyhcf101f3_0.conda + sha256: a3a78b98b620dde6908361318e8b8c25541c51078beb3aa8c98b3b9c51e530bb + md5: d88ad67ad6d55077bd1751736f3e84c1 + depends: + - python >=3.10 + - distlib >=0.3.7,<1 + - filelock <4,>=3.24.2 + - importlib-metadata >=6.6 + - platformdirs >=3.9.1,<5 + - python-discovery >=1.4.2 + - typing_extensions >=4.13.2 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 3271213 + timestamp: 1783721909186 +- conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.8.2-pyhd8ed1ab_0.conda + sha256: 4acf845da404e84cef1acccc66cc0156af1b83a5b5d7077b2ca19b705c561e57 + md5: 99f7755ec8648a042b0dbe906234f888 + depends: + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 132415 + timestamp: 1782771807703 +- conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda + sha256: 21f6c8a20fe050d09bfda3fb0a9c3493936ce7d6e1b3b5f8b01319ee46d6c6f6 + md5: 6639b6b0d8b5a284f027a2003669aa65 + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 18987 + timestamp: 1761899393153 +- conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda + sha256: 19ff205e138bb056a46f9e3839935a2e60bd1cf01c8241a5e172a422fed4f9c6 + md5: 2841eb5bfc75ce15e9a0054b98dcd64d + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 15496 + timestamp: 1733236131358 +- conda: https://conda.anaconda.org/conda-forge/noarch/webob-1.8.10-pyhd8ed1ab_0.conda + sha256: 36cef60f6b09f426b7a5ee8151612c0f92d4cbf2f0db96983ebbdb9a72ebae0e + md5: d3e18ba8195b8d1c8ceaadec669b9b72 + depends: + - legacy-cgi >=2.6 + - python >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 94294 + timestamp: 1780765779698 +- conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + sha256: 42a2b61e393e61cdf75ced1f5f324a64af25f347d16c60b14117393a98656397 + md5: 2f1ed718fcd829c184a6d4f0f2e07409 + depends: + - python >=3.10 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 61391 + timestamp: 1759928175142 +- conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.15-pyhd8ed1ab_0.conda + sha256: 826af5e2c09e5e45361fa19168f46ff524e7a766022615678c3a670c45895d9a + md5: dc257b7e7cad9b79c1dfba194e92297b + depends: + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 889195 + timestamp: 1762040404362 +- conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda + sha256: 93807369ab91f230cf9e6e2a237eaa812492fe00face5b38068735858fba954f + md5: 46e441ba871f524e2b067929da3051c2 + depends: + - __win + - python >=3.9 + license: LicenseRef-Public-Domain + run_exports: {} + size: 9555 + timestamp: 1733130678956 +- conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.7.0-pyhc364b38_0.conda + sha256: 47244c233aeb55de993fe79eebbbb2adc14b388bb0bf2f9dfbaa8aa6610b6345 + md5: f72531e6cf99c98d47306ec917f5e6b9 + depends: + - python >=3.11 + - numpy >=1.26 + - packaging >=24.2 + - pandas >=2.2 + - python + constrains: + - bottleneck >=1.4 + - cartopy >=0.23 + - cftime >=1.6 + - dask-core >=2024.6 + - distributed >=2024.6 + - flox >=0.9 + - h5netcdf >=1.3 + - h5py >=3.11 + - hdf5 >=1.14 + - iris >=3.9 + - matplotlib-base >=3.8 + - nc-time-axis >=1.4 + - netcdf4 >=1.6.0 + - numba >=0.60 + - numbagg >=0.8 + - pint >=0.24 + - pydap >=3.5.0 + - scipy >=1.13 + - seaborn-base >=0.13 + - sparse >=0.15 + - toolz >=0.12 + - zarr >=2.18 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 1027069 + timestamp: 1783633473025 +- conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2026.3.0-pyhd8ed1ab_0.conda + sha256: 663ea9b00d68c2da309114923924686ab6d3f59ef1b196c5029ba16799e7bb07 + md5: 4487b9c371d0161d54b5c7bbd890c0fc + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 51732 + timestamp: 1774900074457 +- conda: https://conda.anaconda.org/conda-forge/noarch/yarl-1.24.2-pyh7db6752_0.conda + sha256: 360b1a9367e076fdb7889d6fc902a57041e6c190ecfd4d3660f84bd3c91a36b5 + md5: 517da2b90b0910492f03ae3b297efff9 + depends: + - idna >=2.0 + - multidict >=4.0 + - propcache >=0.2.1 + - python >=3.10 + track_features: + - yarl_no_compile + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 81559 + timestamp: 1779246114561 +- conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.2.1-pyhc364b38_0.conda + sha256: 88716d633ac7fdc896ce7aa00efdfc91df6363d51bebabfb60d34399c023a3d0 + md5: b787cd1f01e24b161261438a5589df51 + depends: + - python >=3.12 + - packaging >=22.0 + - numpy >=2 + - numcodecs >=0.14 + - typing_extensions >=4.13 + - donfig >=0.8 + - google-crc32c >=1.5 + - python + constrains: + - fsspec >=2023.10.0 + - obstore >=0.5.1 + license: MIT + license_family: MIT + run_exports: {} + size: 367721 + timestamp: 1777989189792 +- conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda + sha256: 5488542dceeb9f2874e726646548ecc5608060934d6f9ceaa7c6a48c61f9cc8d + md5: e52c2ef711ccf31bb7f70ca87d144b9e + depends: + - python >=3.9 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 36341 + timestamp: 1733261642963 +- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-4.1.0-pyhcf101f3_0.conda + sha256: 210bd31c22bb88f5e2a167df24c95bb5f152b2ada7502f9b8c49d1f5366db423 + md5: ba3dcdc8584155c97c648ae9c044b7a3 + depends: + - python >=3.10 + - python + license: MIT + license_family: MIT + run_exports: {} + size: 24190 + timestamp: 1779159948016 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda + build_number: 7 + sha256: 7acaa2e0782cad032bdaf756b536874346ac1375745fb250e9bdd6a48a7ab3cd + md5: a44032f282e7d2acdeb1c240308052dd + depends: + - llvm-openmp >=9.0.1 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - _openmp_mutex >=4.5 + size: 8325 + timestamp: 1764092507920 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/argon2-cffi-bindings-25.1.0-py314h0612a62_2.conda + sha256: aab60bbaea5cc49dff37438d1ad469d64025cda2ce58103cf68da61701ed2075 + md5: a240a79a49a95b388ef81ccda27a5e51 + depends: + - __osx >=11.0 + - cffi >=2.0.0b1 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 34218 + timestamp: 1762509977830 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/atk-1.0-2.38.0-hd03087b_2.conda + sha256: b0747f9b1bc03d1932b4d8c586f39a35ac97e7e72fe6e63f2b2a2472d466f3c1 + md5: 57301986d02d30d6805fdce6c99074ee + depends: + - __osx >=11.0 + - libcxx >=16 + - libglib >=2.80.0,<3.0a0 + - libintl >=0.22.5,<1.0a0 + constrains: + - atk-1.0 2.38.0 + license: LGPL-2.0-or-later + license_family: LGPL + run_exports: + weak: + - atk-1.0 >=2.38.0 + size: 347530 + timestamp: 1713896411580 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.3-hc187ab6_4.conda + sha256: 78cd60168af96031b90994847956df311956b1c0b81dfabe630aae044bd1984d + md5: f64b4da8a239636e185fff25d7c797bb + depends: + - __osx >=11.0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-auth >=0.10.3,<0.10.4.0a0 + size: 116992 + timestamp: 1783461498328 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.14-h3623c0d_3.conda + sha256: a8bb9264c3ee5b05da987b81559b7312915febc0094fd5c4254caf6997b2bad0 + md5: d0312c791fa1ab9c81d15ea4d1a9ffbe + depends: + - __osx >=11.0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - aws-c-cal >=0.9.14,<0.9.15.0a0 + size: 45877 + timestamp: 1783165675964 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.14.1-h84a0fba_0.conda + sha256: 328ab8b74fac2b043d7eda06f74386212c2a30ee782dbcf5a4552289872fcb6d + md5: 8369bbde066237e9d9fbcf2092f6032d + depends: + - __osx >=11.0 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - aws-c-common >=0.14.1,<0.14.2.0a0 + size: 227180 + timestamp: 1782344247239 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h35327cf_3.conda + sha256: 072644d0d1a5d68dab7c2d3a0ebf6e5014fd2b9de1bd850a0346a911a4649948 + md5: 40ec5893de3b45201d78154aa1c38a5d + depends: + - __osx >=11.0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-compression >=0.3.2,<0.3.3.0a0 + size: 21753 + timestamp: 1783166800084 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.7.1-h1e7fc79_3.conda + sha256: 60f4829c92c504153a4362b115a8b91bff76e79ccb4299df84a42d50b1d76874 + md5: 2f3e740464071503809847ca7c6773f5 + depends: + - __osx >=11.0 + - libcxx >=19 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + size: 54064 + timestamp: 1783193034353 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.11.0-he9547b6_3.conda + sha256: 984ac8de143c7bb5f4927f2e3d553774fcf87b4cb54b3f4e2bfbc1f771544ce7 + md5: 1a1e9d8298322cf45abd50e9971d1194 + depends: + - __osx >=11.0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-compression >=0.3.2,<0.3.3.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-http >=0.11.0,<0.11.1.0a0 + size: 177541 + timestamp: 1783192927726 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h63484d5_6.conda + sha256: 18e4430614994afb1928813c95c101c0a6ec036a69ea7a95f858889a70d41feb + md5: 2315fe089cc47268f15504588be66d17 + depends: + - __osx >=11.0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-io >=0.26.3,<0.26.4.0a0 + size: 177252 + timestamp: 1783180129459 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.16.0-h73b2f1b_1.conda + sha256: 3e3f4a6148e5ab30fcb513eaad03913be29d1b5d449e17caf6bb3ad1b5f268ce + md5: 6fa39f3ef470a015d28e15d45849ff96 + depends: + - __osx >=11.0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-mqtt >=0.16.0,<0.16.1.0a0 + size: 158238 + timestamp: 1783205920117 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.12.6-hc78c590_1.conda + sha256: 3a497361048424e79d00945869ad43faad2cc1fa3dd6ca007fd1d7ad8797209f + md5: 2ea7c11aa22eb42074ec0b6ab3b20a6b + depends: + - __osx >=11.0 + - aws-c-auth >=0.10.3,<0.10.4.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-s3 >=0.12.6,<0.12.7.0a0 + size: 132874 + timestamp: 1783472097405 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.7-h35327cf_1.conda + sha256: 5af8ed494a989e9a4c8672ef9d8ce32723a189f346265dd920c9c853be96d66d + md5: de8a6ba9bbcc4476afeeee39bdcaff70 + depends: + - __osx >=11.0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + size: 60782 + timestamp: 1783172649358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h35327cf_3.conda + sha256: ad993afb36281fa302d8c6af2ff167b1c250c251a41fa5498b6c21d812a70f8a + md5: 9f07664ca02c9c86a5774a4511f29123 + depends: + - __osx >=11.0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-checksums >=0.2.10,<0.2.11.0a0 + size: 92209 + timestamp: 1783166982759 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.40.1-h9ead58b_2.conda + sha256: 48b27a74da15b452c36ad8dd4ad9e513489b2f85b31cc0e17cc7b4ed660530f2 + md5: 19115c36cfc244d4300ee047115e3dce + depends: + - libcxx >=19 + - __osx >=11.0 + - aws-c-s3 >=0.12.6,<0.12.7.0a0 + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-mqtt >=0.16.0,<0.16.1.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-auth >=0.10.3,<0.10.4.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + size: 275502 + timestamp: 1783483139609 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.833-h918993c_8.conda + sha256: e3fc94f14817503e5017c3c951ce1ea8a33119f741cd08318332efa51b67fdc5 + md5: 6351c229da097a9a5f537197c2b90278 + depends: + - libcxx >=19 + - __osx >=11.0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + - libzlib >=1.3.2,<2.0a0 + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + - libcurl >=8.21.0,<9.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 + size: 2834501 + timestamp: 1783536859562 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.3-he5ae378_0.conda + sha256: 9645073c4682ad3a334a2b06c5fc0ddc57fc9f0f537cc3123053634c92c28625 + md5: 4f42d997f42a8d34ff74cb677cf0c828 + depends: + - __osx >=11.0 + - libcurl >=8.19.0,<9.0a0 + - libcxx >=19 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + size: 290309 + timestamp: 1775239330289 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h05177fb_2.conda + sha256: d950fb513311a15cd4ae663cdacb2c035122f609a9c790973661b38e0882e40e + md5: e1701f6b2ce6f47aeb6cbfab132403d8 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - libcxx >=19 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + size: 168032 + timestamp: 1781268747743 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.18.0-h409340b_1.conda + sha256: 3f096d7cd6fd7788d57887c3d3e48be1ebc5c3a971666ddc0dd8a3493a5b7cb5 + md5: 0948246cb8e514e4ae1cfe7dbb4046c7 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + - libcxx >=19 + license: MIT + license_family: MIT + run_exports: + weak: + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + size: 436462 + timestamp: 1781284116423 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.14.0-h7cba3ab_1.conda + sha256: 9a1b6e5284f1f242330dfa1e21408ffd823a76df424108d8c319c2a46df61dba + md5: 2af5d1b5365c4a3de8ed8ec8438fe6ec + depends: + - __osx >=11.0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - libcxx >=19 + - libxml2 + - libxml2-16 >=2.14.6 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + size: 128710 + timestamp: 1781268693348 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.16.0-h16bb3af_1.conda + sha256: fb210d8d068df72a68c5fa655cf1f816792e278da3041c485478e7924d6e80eb + md5: 06ba52b8a66fd041f4910b547e3f3da1 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + - libcxx >=19 + license: MIT + license_family: MIT + run_exports: + weak: + - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 + size: 206698 + timestamp: 1781541197750 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/blosc-1.21.6-h7dd00d9_1.conda + sha256: c3fe902114b9a3ac837e1a32408cc2142c147ec054c1038d37aec6814343f48a + md5: 925acfb50a750aa178f7a0aced77f351 + depends: + - __osx >=11.0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - blosc >=1.21.6,<2.0a0 + size: 33602 + timestamp: 1733513285902 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.2.0-h7d5ae5b_1.conda + sha256: 422ac5c91f8ef07017c594d9135b7ae068157393d2a119b1908c7e350938579d + md5: 48ece20aa479be6ac9a284772827d00c + depends: + - __osx >=11.0 + - brotli-bin 1.2.0 hc919400_1 + - libbrotlidec 1.2.0 hc919400_1 + - libbrotlienc 1.2.0 hc919400_1 + license: MIT + license_family: MIT + run_exports: + weak: + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + size: 20237 + timestamp: 1764018058424 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-bin-1.2.0-hc919400_1.conda + sha256: e2d142052a83ff2e8eab3fe68b9079cad80d109696dc063a3f92275802341640 + md5: 377d015c103ad7f3371be1777f8b584c + depends: + - __osx >=11.0 + - libbrotlidec 1.2.0 hc919400_1 + - libbrotlienc 1.2.0 hc919400_1 + license: MIT + license_family: MIT + run_exports: {} + size: 18628 + timestamp: 1764018033635 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-python-1.2.0-py314h3daef5d_1.conda + sha256: 5c2e471fd262fcc3c5a9d5ea4dae5917b885e0e9b02763dbd0f0d9635ed4cb99 + md5: f9501812fe7c66b6548c7fcaa1c1f252 + depends: + - __osx >=11.0 + - libcxx >=19 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + constrains: + - libbrotlicommon 1.2.0 hc919400_1 + license: MIT + license_family: MIT + run_exports: {} + size: 359854 + timestamp: 1764018178608 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda + sha256: 540fe54be35fac0c17feefbdc3e29725cce05d7367ffedfaaa1bdda234b019df + md5: 620b85a3f45526a8bc4d23fd78fc22f0 + depends: + - __osx >=11.0 + license: bzip2-1.0.6 + license_family: BSD + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 124834 + timestamp: 1771350416561 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda + sha256: 2995f2aed4e53725e5efbc28199b46bf311c3cab2648fc4f10c2227d6d5fa196 + md5: bcb3cba70cf1eec964a03b4ba7775f01 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: + weak: + - c-ares >=1.34.6,<2.0a0 + size: 180327 + timestamp: 1765215064054 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cairo-1.18.4-he0f2337_1.conda + sha256: cde9b79ee206fe3ba6ca2dc5906593fb7a1350515f85b2a1135a4ce8ec1539e3 + md5: 36200ecfbbfbcb82063c87725434161f + depends: + - __osx >=11.0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.1,<79.0a0 + - libcxx >=19 + - libexpat >=2.7.3,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libglib >=2.86.3,<3.0a0 + - libpng >=1.6.53,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.46.4,<1.0a0 + license: LGPL-2.1-only or MPL-1.1 + run_exports: + weak: + - cairo >=1.18.4,<2.0a0 + size: 900035 + timestamp: 1766416416791 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cartopy-0.25.0-py314ha3d490a_1.conda + sha256: 9f7ff06062d29b7096121478515e75afd02246b7c98fead6f0dac2f011eea4b0 + md5: 5def62152c68e2343228e1b27a9338c0 + depends: + - __osx >=11.0 + - libcxx >=19 + - matplotlib-base >=3.6 + - numpy >=1.23,<3 + - packaging >=21 + - pyproj >=3.3.1 + - pyshp >=2.3 + - python >=3.14.0rc2,<3.15.0a0 + - python >=3.14.0rc2,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + - shapely >=2.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 1533650 + timestamp: 1756884104765 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.1.0-py314h7bede21_0.conda + sha256: c462e172e72e04621dc5fe20380abf0d948ab6d93d0cb74af3da9585a511057c + md5: 36650f9cd6984ca90ec2807fc4354635 + depends: + - __osx >=11.0 + - libffi >=3.5.2,<3.6.0a0 + - pycparser + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 297959 + timestamp: 1783425112331 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cftime-1.6.5-py314h2115a04_1.conda + sha256: 266ee94a54887cbe8c05ae4ea6d5ea575fafb9d7f64c0ce0859af0fc5a416e59 + md5: a03f98abd72452e57a6667a58a5a2fdf + depends: + - __osx >=11.0 + - numpy >=1.21.2 + - numpy >=1.23,<3 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 397425 + timestamp: 1768511349471 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/contourpy-1.3.3-py314hf8a3a22_4.conda + sha256: 754ab72f1c1ae99ef7c57995f59224dc9632cbd6731fe7e6277437fd01d43156 + md5: cddc851000ce131d757678c2f329eaad + depends: + - numpy >=1.25 + - python + - python 3.14.* *_cp314 + - __osx >=11.0 + - libcxx >=19 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 290405 + timestamp: 1769156069514 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cryptography-49.0.0-py314h0d331bb_0.conda + sha256: 095f69075f4b54bf4d3674f7a529926a4e9bc9c1452093135d3fdbef233a4783 + md5: 8eb2d079cb2d42f28bc85c73977d05de + depends: + - __osx >=11.0 + - cffi >=2.0 + - openssl >=3.5.7,<4.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + constrains: + - __osx >=11.0 + license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT + license_family: BSD + run_exports: {} + size: 1871987 + timestamp: 1781385445880 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/cytoolz-1.1.0-py314h6c2aa35_2.conda + sha256: 8deb1f8ef80525cccc68c73cdcd690cb8614035f6e1d0eb6880c0c9b377d29ac + md5: aae872d4d6847677924de8e023e00457 + depends: + - __osx >=11.0 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + - toolz >=0.10.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 615096 + timestamp: 1771856205834 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.21-py314he609de1_0.conda + sha256: fd6df772cdb30d01fa0d405ed637f420a9f2194fe931f967e8c67d95b504f8b4 + md5: da29307f59fb7a63f686ec20724fecf9 + depends: + - python + - libcxx >=19 + - __osx >=11.0 + - python 3.14.* *_cp314 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 2776045 + timestamp: 1780390212997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/epoxy-1.5.10-hc919400_2.conda + sha256: ba685b87529c95a4bf9de140a33d703d57dc46b036e9586ed26890de65c1c0d5 + md5: 3b87dabebe54c6d66a07b97b53ac5874 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: + weak: + - epoxy >=1.5.10,<1.6.0a0 + size: 296347 + timestamp: 1758743805063 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fontconfig-2.18.1-h2b252f5_0.conda + sha256: 8607d8d0b32f9f6fc61ea8c06b537486b78428a04516658222fa4d1d521af765 + md5: 9d928e6a62192141fb6540a3125b1345 + depends: + - __osx >=11.0 + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libintl >=0.25.1,<1.0a0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - fontconfig >=2.18.1,<3.0a0 + - fonts-conda-ecosystem + size: 248677 + timestamp: 1780450500773 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.3-hce30654_1.conda + sha256: 96b33f1e2a32c602b167f43719e3acf89ec742b4a1e25e99ffd0e6f99b38d277 + md5: 7bd06ab4ed807154c2d9031eb5ebf025 + depends: + - libfreetype 2.14.3 hce30654_1 + - libfreetype6 2.14.3 hdfa99f5_1 + license: GPL-2.0-only OR FTL + run_exports: + weak: + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + size: 173518 + timestamp: 1780933616544 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/freexl-2.0.0-h3ab3353_2.conda + sha256: b4146ac9ba1676494e3d812ca39664dd7dd454e4d0984f3665fd6feec318c71c + md5: dd655a29b40fe0d1bf95c64cf3cb348d + depends: + - __osx >=11.0 + - libexpat >=2.6.4,<3.0a0 + - libiconv >=1.17,<2.0a0 + - minizip >=4.0.7,<5.0a0 + license: MPL-1.1 + license_family: MOZILLA + run_exports: + weak: + - freexl >=2.0.0,<3.0a0 + size: 53378 + timestamp: 1734014980768 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/fribidi-1.0.16-hc919400_0.conda + sha256: d856dc6744ecfba78c5f7df3378f03a75c911aadac803fa2b41a583667b4b600 + md5: 04bdce8d93a4ed181d1d726163c2d447 + depends: + - __osx >=11.0 + license: LGPL-2.1-or-later + run_exports: + weak: + - fribidi >=1.0.16,<2.0a0 + size: 59391 + timestamp: 1757438897523 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gdk-pixbuf-2.44.7-h4e57454_0.conda + sha256: 69bb2e62a93f6407c9e9ccd4d21fe4d4e5373d64eecd6c5df318144ca4c80953 + md5: f717a22e13a1499c9552ffff02d22d64 + depends: + - __osx >=11.0 + - libglib >=2.88.2,<3.0a0 + - libintl >=0.25.1,<1.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - liblzma >=5.8.3,<6.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libtiff >=4.7.1,<4.8.0a0 + license: LGPL-2.1-or-later + license_family: LGPL + run_exports: + weak: + - gdk-pixbuf >=2.44.7,<3.0a0 + size: 553902 + timestamp: 1782591436963 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/geos-3.14.1-h5afe852_0.conda + sha256: 1ac5f5a3a35f2e4778025043c87993208d336e30539406e380e0952bb7ffd188 + md5: 4238412c29eff0bb2bb5c60a720c035a + depends: + - __osx >=11.0 + - libcxx >=19 + license: LGPL-2.1-only + run_exports: + weak: + - geos >=3.14.1,<3.14.2.0a0 + size: 1530844 + timestamp: 1761594597236 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + sha256: fd56ed8a1dab72ab90d8a8929b6f916a6d9220ca297ff077f8f04c5ed3408e20 + md5: 57a511a5905caa37540eb914dfcbf1fb + depends: + - __osx >=11.0 + - libcxx >=17 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - gflags >=2.2.2,<2.3.0a0 + size: 82090 + timestamp: 1726600145480 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda + sha256: 843b3f364ff844137e37d5c0a181f11f6d51adcedd216f019d074e5aa5d7e09c + md5: 95fa1486c77505330c20f7202492b913 + license: MIT + license_family: MIT + run_exports: + weak: + - giflib >=5.2.2,<5.3.0a0 + size: 71613 + timestamp: 1712692611426 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glib-tools-2.88.2-h246a70f_0.conda + sha256: 6a98eabd4d5bb902c391e9f7c9e655ce61292ff6f1bb0c592da42fd66e6c89f9 + md5: 973a5ef252899cd0916418c75a864169 + depends: + - libglib ==2.88.2 ha08bb59_0 + - libffi + - __osx >=11.0 + - libintl >=0.25.1,<1.0a0 + license: LGPL-2.1-or-later + run_exports: {} + size: 205101 + timestamp: 1782463971075 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + sha256: 9fc77de416953aa959039db72bc41bfa4600ae3ff84acad04a7d0c1ab9552602 + md5: fef68d0a95aa5b84b5c1a4f6f3bf40e1 + depends: + - __osx >=11.0 + - gflags >=2.2.2,<2.3.0a0 + - libcxx >=16 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - glog >=0.7.1,<0.8.0a0 + size: 112215 + timestamp: 1718284365403 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/google-crc32c-1.8.0-py314h8744745_1.conda + sha256: a0d261ae01e0e6302a6300eb379c27795311d63047248bd4b60133694fa42d46 + md5: b63f8d58f71157e6ffdcac373fa5e8ab + depends: + - __osx >=11.0 + - libcrc32c >=1.1.2,<1.2.0a0 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 26132 + timestamp: 1768549424382 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphite2-1.3.15-hf6b4638_0.conda + sha256: c0a060d7b7a05669043ef3f68c7a1025c8594e1ab73735afb64c35e8baa41da5 + md5: 0d576cff278a2e60456d5b2c0a1ffda3 + depends: + - __osx >=11.0 + - libcxx >=19 + license: LGPL-2.0-or-later + license_family: LGPL + run_exports: + weak: + - graphite2 >=1.3.15,<2.0a0 + size: 82245 + timestamp: 1780454628763 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/graphviz-14.1.2-hec8c438_0.conda + sha256: 755c72d469330265f80a615912a3b522aef6f26cbc52763862b6a3c492fbf97c + md5: 1f3d859de3ca2bcaa845e92e87d73660 + depends: + - __osx >=11.0 + - adwaita-icon-theme + - cairo >=1.18.4,<2.0a0 + - fonts-conda-ecosystem + - gdk-pixbuf >=2.44.4,<3.0a0 + - gtk3 >=3.24.43,<4.0a0 + - gts >=0.7.6,<0.8.0a0 + - libcxx >=19 + - libexpat >=2.7.3,<3.0a0 + - libgd >=2.3.3,<2.4.0a0 + - libglib >=2.86.3,<3.0a0 + - librsvg >=2.60.0,<3.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pango >=1.56.4,<2.0a0 + license: EPL-1.0 + license_family: Other + run_exports: + weak: + - graphviz >=14.1.2,<15.0a0 + size: 2218284 + timestamp: 1769427599940 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/greenlet-3.5.3-py314he609de1_0.conda + sha256: fb11b611380cdb005580a5300bf1e622ab91d4700077f6c66ee43379b8bae356 + md5: 26f3dd379df3a3b29a1f1906bc7f0794 + depends: + - python + - libcxx >=19 + - __osx >=11.0 + - python 3.14.* *_cp314 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 264520 + timestamp: 1782524787029 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/grpcio-1.78.1-py314h63f87bf_0.conda + sha256: 1a93667a727c80f991fc246bfffa2b1251eedb6352af51936acc98931d20327d + md5: 254ed802b3dbb276a748c9839b82f5df + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcxx >=19 + - libgrpc 1.78.1 h3e3f78d_0 + - libzlib >=1.3.1,<2.0a0 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + - typing-extensions >=4.12,<5 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 784062 + timestamp: 1774013533665 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gsw-3.6.23-h92ab4e6_0.conda + noarch: python + sha256: 3a369ace53dd9c7b30071e2853d2773c03a8d63e397424e20bc93f010bb28325 + md5: 495a82aa2e0434405e63998de52a63e2 + depends: + - python + - numpy + - __osx >=11.0 + - numpy >=1.23,<3 + - _python_abi3_support 1.* + - cpython >=3.11 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 2156281 + timestamp: 1782065501688 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gtk3-3.24.52-hc0f3e19_0.conda + sha256: 26862a9898054b8552e55e609e5ce73c7ef1eb28bbe6fb87f0b9109d73cd09df + md5: 5557a2433b1339b8e536c264afea41ef + depends: + - __osx >=11.0 + - atk-1.0 >=2.38.0 + - cairo >=1.18.4,<2.0a0 + - epoxy >=1.5.10,<1.6.0a0 + - fribidi >=1.0.16,<2.0a0 + - gdk-pixbuf >=2.44.5,<3.0a0 + - glib-tools + - harfbuzz >=13.2.1 + - hicolor-icon-theme + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 + - libglib >=2.86.4,<3.0a0 + - libintl >=0.25.1,<1.0a0 + - liblzma >=5.8.2,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + - pango >=1.56.4,<2.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + run_exports: + weak: + - gtk3 >=3.24.52,<4.0a0 + - adwaita-icon-theme + size: 9385734 + timestamp: 1774288504338 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gts-0.7.6-he42f4ea_4.conda + sha256: e0f8c7bc1b9ea62ded78ffa848e37771eeaaaf55b3146580513c7266862043ba + md5: 21b4dd3098f63a74cf2aa9159cbef57d + depends: + - libcxx >=15.0.7 + - libglib >=2.76.3,<3.0a0 + license: LGPL-2.0-or-later + license_family: LGPL + run_exports: + weak: + - gts >=0.7.6,<0.8.0a0 + size: 304331 + timestamp: 1686545503242 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/h5py-3.16.0-nompi_py314hb49d8aa_102.conda + sha256: 6f27b623cc51dca62a1094d4be5cf53eaffb61f97e6a6f159c780aceedd7b991 + md5: 89abd846fe2692170eaed00842486ce1 + depends: + - __osx >=11.0 + - cached-property + - hdf5 >=1.14.6,<1.14.7.0a0 + - numpy >=1.23,<3 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 1200170 + timestamp: 1775582717308 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/harfbuzz-14.2.1-hce30654_1.conda + sha256: 8922ec1cd17f558ca38c513d4880b7fadbfa08b38a563880c8c2ceddfcc1fba2 + md5: 95896299aa1012c7410629b2ee360f87 + depends: + - libharfbuzz-devel 14.2.1 h5a65909_1 + license: MIT + license_family: MIT + run_exports: + weak: + - libharfbuzz >=14.2.1 + size: 10974 + timestamp: 1782800588874 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf4-4.2.15-h2ee6834_7.conda + sha256: c3b01e3c3fe4ca1c4d28c287eaa5168a4f2fd3ffd76690082ac919244c22fa90 + md5: ff5d749fd711dc7759e127db38005924 + depends: + - libcxx >=15.0.7 + - libjpeg-turbo >=3.0.0,<4.0a0 + - libzlib >=1.2.13,<2.0.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - hdf4 >=4.2.15,<4.2.16.0a0 + size: 762257 + timestamp: 1695661864625 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_had3affe_110.conda + sha256: 6964fee3d3a4a59c85d2589eb5e8c8bff7dde9721854f493cc7b9aca5cd7d4be + md5: 65797138355b90a8e219afcf7e77b273 + depends: + - __osx >=11.0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.20.0,<9.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - hdf5 >=1.14.6,<1.14.7.0a0 + size: 3290207 + timestamp: 1780581564967 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hicolor-icon-theme-0.17-hce30654_3.conda + sha256: 46a4958f2f916c5938f2a6dc0709f78b175ece42f601d79a04e0276d55d25d07 + md5: cfb39109ac5fa8601eb595d66d5bf156 + license: GPL-2.0-or-later + license_family: GPL + run_exports: {} + size: 17616 + timestamp: 1771539622983 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + sha256: 3a7907a17e9937d3a46dfd41cffaf815abad59a569440d1e25177c15fd0684e5 + md5: f1182c91c0de31a7abd40cedf6a5ebef + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: + weak: + - icu >=78.3,<79.0a0 + size: 12361647 + timestamp: 1773822915649 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/json-c-0.18-he4178ee_0.conda + sha256: 73179a1cd0b45c09d4f631cb359d9e755e6e573c5d908df42006728e0bf8297c + md5: 94f14ef6157687c30feb44e1abecd577 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: + weak: + - json-c >=0.18,<0.19.0a0 + size: 73715 + timestamp: 1726487214495 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.5.0-py314hf8a3a22_0.conda + sha256: 840de1b0ba2fa646475bc53ba0f723c8a13e66139633a070831b8279deaa7c64 + md5: eb1465d8a644ef290d18fb86af6e9bc4 + depends: + - python + - python 3.14.* *_cp314 + - libcxx >=19 + - __osx >=11.0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 69284 + timestamp: 1773067285911 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-hfd3d5f3_1.conda + sha256: c740e4a2e7247776a9883158fdab50ae0732c8f67f96d8f1db8ad9da5e0b5222 + md5: 8780f41b013d19219faef9c82260744b + depends: + - __osx >=11.0 + - libcxx >=19 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - openssl >=3.5.7,<4.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - krb5 >=1.22.2,<1.23.0a0 + size: 1159780 + timestamp: 1781859501654 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.19.1-hdfa7624_1.conda + sha256: ccb5598fad3694e79bf54f0eb812e3b3c3dd63d1497e631f5978800eadb9bcc4 + md5: d2f2c7c10e2957647d45589b7701a453 + depends: + - __osx >=11.0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - lcms2 >=2.19.1,<3.0a0 + size: 213747 + timestamp: 1780212240694 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.1.0-h1eee2c3_0.conda + sha256: 66e5ffd301a44da696f3efc2f25d6d94f42a9adc0db06c44ad753ab844148c51 + md5: 095e5749868adab9cae42d4b460e5443 + depends: + - __osx >=11.0 + - libcxx >=19 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - lerc >=4.1.0,<5.0a0 + size: 164222 + timestamp: 1773114244984 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda + sha256: 756611fbb8d2957a5b4635d9772bd8432cb6ddac05580a6284cca6fdc9b07fca + md5: bb65152e0d7c7178c0f1ee25692c9fd1 + depends: + - __osx >=11.0 + - libcxx >=19 + constrains: + - abseil-cpp =20260107.1 + - libabseil-static =20260107.1=cxx17* + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - libabseil >=20260107.1,<20260108.0a0 + - libabseil =*=cxx17* + size: 1229639 + timestamp: 1770863511331 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda + sha256: af9cd8db11eb719e38a3340c88bb4882cf19b5b4237d93845224489fc2a13b46 + md5: 13e6d9ae0efbc9d2e9a01a91f4372b41 + depends: + - __osx >=11.0 + - libcxx >=19 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - libaec >=1.1.5,<2.0a0 + size: 30390 + timestamp: 1769222133373 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.8.8-gpl_h6fbacd7_100.conda + sha256: 05c370fae4f2a5fd7baf59c15d75caec718d785ec47e813dbf7bff68355e4bb7 + md5: cfa10f3c4b14c13f676dc08e2ea29023 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - lzo >=2.10,<3.0a0 + - openssl >=3.5.7,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - libarchive >=3.8.8,<3.9.0a0 + size: 796153 + timestamp: 1782289667690 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-24.0.0-h30967a1_9_cpu.conda + build_number: 9 + sha256: 7357fe5e29ced516761bae573e5d7322a551bdffe2409342d0467c5c44357df6 + md5: ec5bf7eaf2d3c958763d0b8550c91027 + depends: + - __osx >=11.0 + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libcxx >=21 + - libgoogle-cloud >=3.6.0,<3.7.0a0 + - libgoogle-cloud-storage >=3.6.0,<3.7.0a0 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.3.0,<2.3.1.0a0 + - snappy >=1.2.2,<1.3.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libarrow >=24.0.0,<24.1.0a0 + size: 4250949 + timestamp: 1782267972161 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-24.0.0-ha4f4840_9_cpu.conda + build_number: 9 + sha256: 69873fda9ac704660ac7bc1552d572b2a993e15aebd36fb8f132aa4f8ac97c38 + md5: dacd026ccf72268ce2d29499ad0ac4c5 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 24.0.0 h30967a1_9_cpu + - libarrow-compute 24.0.0 h8d10c55_9_cpu + - libcxx >=21 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libarrow-acero >=24.0.0,<24.1.0a0 + size: 520300 + timestamp: 1782268326226 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-24.0.0-h8d10c55_9_cpu.conda + build_number: 9 + sha256: 8dae780498159c8b84d02f9c147992fd10e983798c1e2d67a8c4be0220920d81 + md5: 0aa363a5634f963c09b486bb4f12a3e0 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 24.0.0 h30967a1_9_cpu + - libcxx >=21 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libre2-11 >=2025.11.5 + - libutf8proc >=2.11.3,<2.12.0a0 + - re2 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libarrow-compute >=24.0.0,<24.1.0a0 + size: 2241981 + timestamp: 1782268075273 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-24.0.0-ha4f4840_9_cpu.conda + build_number: 9 + sha256: bde9851c11880d22a61c54695a621b1fa3900e51b2e1f68ad039a8402d1bfb50 + md5: 0a541a8ae3c0658b91c1a0370e7b7645 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 24.0.0 h30967a1_9_cpu + - libarrow-acero 24.0.0 ha4f4840_9_cpu + - libarrow-compute 24.0.0 h8d10c55_9_cpu + - libcxx >=21 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libparquet 24.0.0 h840b369_9_cpu + - libprotobuf >=6.33.5,<6.33.6.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libarrow-dataset >=24.0.0,<24.1.0a0 + size: 519200 + timestamp: 1782268467182 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-24.0.0-h05be00f_9_cpu.conda + build_number: 9 + sha256: 26ea125e821beaaef124943a0292f6352b17b3bd73134f3351e7c0a03a5f9900 + md5: 6b04ee6621d26e21adc10fae391a7a07 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 24.0.0 h30967a1_9_cpu + - libarrow-acero 24.0.0 ha4f4840_9_cpu + - libarrow-dataset 24.0.0 ha4f4840_9_cpu + - libcxx >=21 + - libprotobuf >=6.33.5,<6.33.6.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libarrow-substrait >=24.0.0,<24.1.0a0 + size: 454629 + timestamp: 1782268521948 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda + build_number: 8 + sha256: 8f5ec18ead0619a9cf0f38b49796c22f6fc0f44850c0df2baea0f5277db16e75 + md5: dbfe729181a32741ae63ecb41eefbac6 + depends: + - libopenblas >=0.3.33,<0.3.34.0a0 + - libopenblas >=0.3.33,<1.0a0 + constrains: + - blas 2.308 openblas + - liblapack 3.11.0 8*_openblas + - liblapacke 3.11.0 8*_openblas + - libcblas 3.11.0 8*_openblas + - mkl <2027 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libblas >=3.11.0,<4.0a0 + size: 18949 + timestamp: 1779859141315 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda + sha256: a7cb9e660531cf6fbd4148cff608c85738d0b76f0975c5fc3e7d5e92840b7229 + md5: 006e7ddd8a110771134fcc4e1e3a6ffa + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: + weak: + - libbrotlicommon >=1.2.0,<1.3.0a0 + size: 79443 + timestamp: 1764017945924 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda + sha256: 2eae444039826db0454b19b52a3390f63bfe24f6b3e63089778dd5a5bf48b6bf + md5: 079e88933963f3f149054eec2c487bc2 + depends: + - __osx >=11.0 + - libbrotlicommon 1.2.0 hc919400_1 + license: MIT + license_family: MIT + run_exports: + weak: + - libbrotlidec >=1.2.0,<1.3.0a0 + size: 29452 + timestamp: 1764017979099 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda + sha256: 01436c32bb41f9cb4bcf07dda647ce4e5deb8307abfc3abdc8da5317db8189d1 + md5: b2b7c8288ca1a2d71ff97a8e6a1e8883 + depends: + - __osx >=11.0 + - libbrotlicommon 1.2.0 hc919400_1 + license: MIT + license_family: MIT + run_exports: + weak: + - libbrotlienc >=1.2.0,<1.3.0a0 + size: 290754 + timestamp: 1764018009077 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda + build_number: 8 + sha256: f93efcd44bc24f97c2478c7474d3baa6801a057974f330e1d06bedc33e4c778f + md5: 03a2ef3491da9e5b4d18c03e9f4b3109 + depends: + - libblas 3.11.0 8_h51639a9_openblas + constrains: + - blas 2.308 openblas + - liblapack 3.11.0 8*_openblas + - liblapacke 3.11.0 8*_openblas + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libcblas >=3.11.0,<4.0a0 + size: 18911 + timestamp: 1779859147634 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 + md5: 32bd82a6a625ea6ce090a81c3d34edeb + depends: + - libcxx >=11.1.0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libcrc32c >=1.1.2,<1.2.0a0 + size: 18765 + timestamp: 1633683992603 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.21.0-h1359186_2.conda + sha256: b21aec36796a7d9b3c8b634f2d466c1d0a2658b2e57aa4686285cf4c10d5c227 + md5: dfe89fb0539ad4611998a5c6905692ff + depends: + - __osx >=11.0 + - krb5 >=1.22.2,<1.23.0a0 + - libnghttp2 >=1.68.1,<2.0a0 + - libpsl >=0.22.0,<0.23.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: curl + license_family: MIT + run_exports: + weak: + - libcurl >=8.21.0,<9.0a0 + size: 411467 + timestamp: 1782911970818 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda + sha256: a2e7abab5add9750fab064c024394de48e49f97631c605ad5db5c8ac3fc769ef + md5: 89f76a2a21a3ec3ec983b5eb237c4113 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + run_exports: {} + size: 569349 + timestamp: 1781670209146 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda + sha256: 5e0b6961be3304a5f027a8c00bd0967fc46ae162cffb7553ff45c70f51b8314c + md5: a6130c709305cd9828b4e1bd9ba0000c + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: + weak: + - libdeflate >=1.25,<1.26.0a0 + size: 55420 + timestamp: 1761980066242 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda + sha256: 66aa216a403de0bb0c1340a88d1a06adaff66bae2cfd196731aa24db9859d631 + md5: 44083d2d2c2025afca315c7a172eab2b + depends: + - ncurses + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - libedit >=3.1.20250104,<3.2.0a0 + size: 107691 + timestamp: 1738479560845 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + sha256: 95cecb3902fbe0399c3a7e67a5bed1db813e5ab0e22f4023a5e0f722f2cc214f + md5: 36d33e440c31857372a72137f78bacf5 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - libev >=4.33,<4.34.0a0 + size: 107458 + timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 + md5: 1a109764bff3bdc7bdd84088347d71dc + depends: + - openssl >=3.1.1,<4.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libevent >=2.1.12,<2.1.13.0a0 + size: 368167 + timestamp: 1685726248899 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda + sha256: 5af74261101e3c777399c6294b2b5d290e508153268eb2e9ff99c4d69834612f + md5: a915151d5d3c5bf039f5ccc8402a436f + depends: + - __osx >=11.0 + constrains: + - expat 2.8.1.* + license: MIT + license_family: MIT + run_exports: {} + size: 69362 + timestamp: 1781203631990 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda + sha256: 6686a26466a527585e6a75cc2a242bf4a3d97d6d6c86424a441677917f28bec7 + md5: 43c04d9cb46ef176bb2a4c77e324d599 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: + weak: + - libffi >=3.5.2,<3.6.0a0 + size: 40979 + timestamp: 1769456747661 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype-2.14.3-hce30654_1.conda + sha256: d5637b01941c0fc8f5cbb1f170c238f4ee153b3c1708b9d50f4f1305438ff051 + md5: 0582e67cd14cfed773be2f3b1aba08e0 + depends: + - libfreetype6 >=2.14.3 + license: GPL-2.0-only OR FTL + run_exports: {} + size: 8365 + timestamp: 1780933612390 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libfreetype6-2.14.3-hdfa99f5_1.conda + sha256: abbfffd8a8c776bb8b59a10c8247fc3aa6b17ba0051e9f6d199dca38479f214f + md5: a0bb0678f67c464938d3693fa96f6884 + depends: + - __osx >=11.0 + - libpng >=1.6.58,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - freetype >=2.14.3 + license: GPL-2.0-only OR FTL + run_exports: {} + size: 338442 + timestamp: 1780933611662 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda + sha256: 06644fa4d34d57c9e48f4d84b1256f9e5f654fdb37f43acc8a58a396952d42b7 + md5: 644058123986582db33aebd4ae2ca184 + depends: + - _openmp_mutex + constrains: + - libgcc-ng ==15.2.0=*_19 + - libgomp 15.2.0 19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 404080 + timestamp: 1778273064154 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgd-2.3.3-h05bcc79_12.conda + sha256: 269edce527e204a80d3d05673301e0207efcd0dbeebc036a118ceb52690d6341 + md5: fa4a92cfaae9570d89700a292a9ca714 + depends: + - __osx >=11.0 + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.1,<79.0a0 + - libexpat >=2.7.3,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libiconv >=1.18,<2.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - libpng >=1.6.53,<1.7.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: GD + license_family: BSD + run_exports: + weak: + - libgd >=2.3.3,<2.4.0a0 + size: 159247 + timestamp: 1766331953491 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-core-3.12.3-haccf57a_3.conda + sha256: 19376eefc969f055b5823dec7b847011b70a3013c094e53bf0380fffdf436504 + md5: 7c7439b43fee531ac02bf45df6caf870 + depends: + - __osx >=11.0 + - blosc >=1.21.6,<2.0a0 + - geos >=3.14.1,<3.14.2.0a0 + - giflib >=5.2.2,<5.3.0a0 + - json-c >=0.18,<0.19.0a0 + - lerc >=4.1.0,<5.0a0 + - libarchive >=3.8.6,<3.9.0a0 + - libcurl >=8.19.0,<9.0a0 + - libcxx >=19 + - libdeflate >=1.25,<1.26.0a0 + - libexpat >=2.7.5,<3.0a0 + - libiconv >=1.18,<2.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - libjxl >=0.11,<0.12.0a0 + - libkml >=1.3.0,<1.4.0a0 + - liblzma >=5.8.2,<6.0a0 + - libpng >=1.6.57,<1.7.0a0 + - libspatialite >=5.1.0,<5.2.0a0 + - libsqlite >=3.52.0,<4.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - muparser >=2.3.5,<2.4.0a0 + - openssl >=3.5.6,<4.0a0 + - pcre2 >=10.47,<10.48.0a0 + - proj >=9.7.1,<9.8.0a0 + - xerces-c >=3.3.0,<3.4.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - libgdal 3.12.3.* + license: MIT + license_family: MIT + run_exports: + weak: + - libgdal-core >=3.12.3,<3.13.0a0 + size: 9896508 + timestamp: 1775715987003 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda + sha256: d4837b3b9b30af3132d260225e91ab9dde83be04c59513f500cc81050fb37486 + md5: 1ea03f87cdb1078fbc0e2b2deb63752c + depends: + - libgfortran5 15.2.0 hdae7583_19 + constrains: + - libgfortran-ng ==15.2.0=*_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 139675 + timestamp: 1778273280875 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda + sha256: d0a68b7a121d115b80c169e24d1265dcc25a3fe58d107df1bbc430797e226d88 + md5: ba36d8c606a6a53fe0b8c12d47267b3d + depends: + - libgcc >=15.2.0 + constrains: + - libgfortran 15.2.0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 599691 + timestamp: 1778273075448 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libglib-2.88.2-ha08bb59_0.conda + sha256: 68ac66904a284a7dfbb3bdf9225380eaf20750b2d414215e6d7af5caa3ed1a63 + md5: 03123cafdc96cef79fc8a615f9119b79 + depends: + - __osx >=11.0 + - pcre2 >=10.47,<10.48.0a0 + - libiconv >=1.18,<2.0a0 + - libintl >=0.25.1,<1.0a0 + - libzlib >=1.3.2,<2.0a0 + - libffi >=3.5.2,<3.6.0a0 + constrains: + - glib >2.66 + license: LGPL-2.1-or-later + run_exports: + weak: + - libglib >=2.88.2,<3.0a0 + size: 4437447 + timestamp: 1782463971075 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.6.0-h688a705_0.conda + sha256: 650f0605bed3048ca69b547cc31e1d6c70b7371fb3212b00b103da6fd2f11d77 + md5: be005bcbd77890a199ee583ba7a74bec + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.20.0,<9.0a0 + - libcxx >=19 + - libgrpc >=1.78.1,<1.79.0a0 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - openssl >=3.5.7,<4.0a0 + constrains: + - libgoogle-cloud 3.6.0 *_0 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - libgoogle-cloud >=3.6.0,<3.7.0a0 + size: 1839082 + timestamp: 1781921657626 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.6.0-ha114238_0.conda + sha256: a01821942ab88a433a81ec9a0e6aa72ed5f7ceb5e11a295f3eb28dd22a0a24bf + md5: b7c9ec99242e620133106438ccfcf08e + depends: + - __osx >=11.0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libcxx >=19 + - libgoogle-cloud 3.6.0 h688a705_0 + - libzlib >=1.3.2,<2.0a0 + - openssl + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - libgoogle-cloud-storage >=3.6.0,<3.7.0a0 + size: 528490 + timestamp: 1781921815114 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda + sha256: a6e01573795484c2200e499ddffb825d24184888be6a596d4beaceebe6f8f525 + md5: 17b9e07ba9b46754a6953999a948dcf7 + depends: + - __osx >=11.0 + - c-ares >=1.34.6,<2.0a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcxx >=19 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libre2-11 >=2025.11.5 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.78.1 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libgrpc >=1.78.1,<1.79.0a0 + size: 4820402 + timestamp: 1774012715207 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libharfbuzz-14.2.1-h5a65909_1.conda + sha256: 75860db66af9748572038d1e3a2260eca56ee4b38b9523e042fac8caf4277529 + md5: e8d6e86663316dfbdec7dac532824516 + depends: + - __osx >=11.0 + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.15,<2.0a0 + - icu >=78.3,<79.0a0 + - libcxx >=19 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libglib >=2.88.2,<3.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + run_exports: {} + size: 900474 + timestamp: 1782800553099 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libharfbuzz-devel-14.2.1-h5a65909_1.conda + sha256: f3f74f090b6a31fed00d64cbe6bbeed6b2a9b820442714ecb66ada08dec913ea + md5: e538f961a3042abf8307c5c5a6d6b09b + depends: + - __osx >=11.0 + - cairo >=1.18.4,<2.0a0 + - freetype + - graphite2 >=1.3.15,<2.0a0 + - icu >=78.3,<79.0a0 + - libcxx >=19 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libglib >=2.88.2,<3.0a0 + - libharfbuzz 14.2.1 h5a65909_1 + - libpng >=1.6.58,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libharfbuzz >=14.2.1 + size: 1416806 + timestamp: 1782800583113 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwy-1.4.0-ha332bbd_0.conda + sha256: 4fcad3cbec60da940312e883b7866816517acc5f9baecfe9a778de57327a1b1b + md5: 7394850583ca88325244b68b532c7a39 + depends: + - __osx >=11.0 + - libcxx >=19 + license: Apache-2.0 OR BSD-3-Clause + run_exports: + weak: + - libhwy >=1.4.0,<1.5.0a0 + size: 609931 + timestamp: 1776990524407 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda + sha256: de0336e800b2af9a40bdd694b03870ac4a848161b35c8a2325704f123f185f03 + md5: 4d5a7445f0b25b6a3ddbb56e790f5251 + depends: + - __osx >=11.0 + license: LGPL-2.1-only + run_exports: + weak: + - libiconv >=1.18,<2.0a0 + size: 750379 + timestamp: 1754909073836 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libintl-0.25.1-h493aca8_0.conda + sha256: 99d2cebcd8f84961b86784451b010f5f0a795ed1c08f1e7c76fbb3c22abf021a + md5: 5103f6a6b210a3912faf8d7db516918c + depends: + - __osx >=11.0 + - libiconv >=1.18,<2.0a0 + license: LGPL-2.1-or-later + run_exports: + weak: + - libintl >=0.25.1,<1.0a0 + size: 90957 + timestamp: 1751558394144 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.2.0-h84a0fba_0.conda + sha256: e2b4fce7cf48705dc182a0aa6c478a47b16202aeb712242caf9c9ab6a19778fa + md5: 8f05a69b7e870574a2d366043f1515b1 + depends: + - __osx >=11.0 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + run_exports: + weak: + - libjpeg-turbo >=3.2.0,<4.0a0 + size: 558409 + timestamp: 1783732115664 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjxl-0.11.2-h934fa54_1.conda + sha256: 948cf1370abb58e06a7c9554838c68672ef1d78e01c3fc4e62ccfc3072579645 + md5: 05bead8980f5ae6a070117dacec38b5b + depends: + - libcxx >=19 + - __osx >=11.0 + - libhwy >=1.4.0,<1.5.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libjxl >=0.11,<1.0a0 + size: 1032419 + timestamp: 1777065264956 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libkml-1.3.0-hb833057_1023.conda + sha256: bfc6c0b1f30de524e3270eed2171d87e6b96552ff90cf2a5eb34c00d6bcb3dfa + md5: 3d8eeedb8e541d1cb593e8204fcc397d + depends: + - __osx >=11.0 + - libcxx >=19 + - libexpat >=2.7.5,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + - uriparser >=0.9.8,<1.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 283804 + timestamp: 1777027670481 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda + build_number: 8 + sha256: 8a076fe82142a00fe85f5a5a5351e286e8064f0100fe13608d19182cd0018c25 + md5: 85adeb3d469d082dbd9c8c39e36dec57 + depends: + - libblas 3.11.0 8_h51639a9_openblas + constrains: + - libcblas 3.11.0 8*_openblas + - blas 2.308 openblas + - liblapacke 3.11.0 8*_openblas + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - liblapack >=3.11.0,<3.12.0a0 + size: 18925 + timestamp: 1779859153970 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda + sha256: 34878d87275c298f1a732c6806349125cebbf340d24c6c23727268184bba051e + md5: b1fd823b5ae54fbec272cea0811bd8a9 + depends: + - __osx >=11.0 + constrains: + - xz 5.8.3.* + license: 0BSD + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 92472 + timestamp: 1775825802659 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h84a0fba_1.conda + sha256: 1089c7f15d5b62c622625ec6700732ece83be8b705da8c6607f4dabb0c4bd6d2 + md5: 57c4be259f5e0b99a5983799a228ae55 + depends: + - __osx >=11.0 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 73690 + timestamp: 1769482560514 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnetcdf-4.10.1-nompi_h12274ac_200.conda + build_number: 100 + sha256: cc12903b9147d9b7978e66fe857e3f38e616779eec5ce142039ca38f75bad9ba + md5: d0c905c63b045ebf918cbbad7296b680 + depends: + - __osx >=11.0 + - libcxx >=19 + - hdf5 >=1.14.6,<1.14.7.0a0 + - blosc >=1.21.6,<2.0a0 + - libcurl >=8.21.0,<9.0a0 + - bzip2 >=1.0.8,<2.0a0 + - libaec >=1.1.5,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - libzip >=1.11.2,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - hdf4 >=4.2.15,<4.2.16.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libnetcdf >=4.10.1,<4.10.2.0a0 + size: 783726 + timestamp: 1783810919864 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.68.1-h8f3e76b_0.conda + sha256: 2bc7bc3978066f2c274ebcbf711850cc9ab92e023e433b9631958a098d11e10a + md5: 6ea18834adbc3b33df9bd9fb45eaf95b + depends: + - __osx >=11.0 + - c-ares >=1.34.6,<2.0a0 + - libcxx >=19 + - libev >=4.33,<4.34.0a0 + - libev >=4.33,<5.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libnghttp2 >=1.68.1,<2.0a0 + size: 576526 + timestamp: 1773854624224 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda + sha256: 9dd455b2d172aeedfa2058d324b5b5822b0bc1b7c1f32cd183d7078540d2f6eb + md5: 909e41855c29f0d52ae630198cd57135 + depends: + - __osx >=11.0 + - libgfortran + - libgfortran5 >=14.3.0 + - llvm-openmp >=19.1.7 + constrains: + - openblas >=0.3.33,<0.3.34.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libopenblas >=0.3.33,<1.0a0 + size: 4304965 + timestamp: 1776995497368 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.27.0-h08d5cc3_0.conda + sha256: db60a4d6eb5be208f8a0be686909b1f10635b3913a7c1ce391d4d26d991115c3 + md5: 35e93c8c0edb8dff7f9ebeb55ec4e6a6 + depends: + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.20.0,<9.0a0 + - libgrpc >=1.78.1,<1.79.0a0 + - libopentelemetry-cpp-headers 1.27.0 hce30654_0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.2,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.27.0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + size: 582427 + timestamp: 1778721505645 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.27.0-hce30654_0.conda + sha256: 64724bf5c5c48ecbc92a7d561654c6305d6dc819e0773c8989877f0613e52542 + md5: f8039fbb88b31890de23c8a16ae03d92 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 394303 + timestamp: 1778721455052 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-24.0.0-h840b369_9_cpu.conda + build_number: 9 + sha256: 1e98a1d5a15d939feb0bdfee5a899e868c54065331501ea3e1105ebbc889c426 + md5: cacfe876726a9bc8ab1246e6369dfc6d + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 24.0.0 h30967a1_9_cpu + - libcxx >=21 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libthrift >=0.22.0,<0.22.1.0a0 + - openssl >=3.5.7,<4.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libparquet >=24.0.0,<24.1.0a0 + size: 1097847 + timestamp: 1782268279252 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.58-h132b30e_0.conda + sha256: 66eae34546df1f098a67064970c92aa14ae7a7505091889e00468294d2882c36 + md5: 2259ae0949dbe20c0665850365109b27 + depends: + - __osx >=11.0 + - libzlib >=1.3.2,<2.0a0 + license: zlib-acknowledgement + run_exports: + weak: + - libpng >=1.6.58,<1.7.0a0 + size: 289546 + timestamp: 1776315246750 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-hb82ec63_2.conda + sha256: 619d06e4cd3f2501c7cfce3b64739726609da79cc000f66090b753a6f4ed472c + md5: fa6df7c5daaa2c0f22da8c742da223ec + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcxx >=19 + - libzlib >=1.3.2,<2.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libprotobuf >=6.33.5,<6.33.6.0a0 + size: 2811893 + timestamp: 1783168732425 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpsl-0.22.0-h92480b3_1.conda + sha256: 1dd03b21e74f41ed7af31d82f61129d94e3cce31485eb221e3acecba26ab34bf + md5: 9bced3ae8f4bc78a5b22f7247554c9ee + depends: + - __osx >=11.0 + - icu >=78.3,<79.0a0 + - libcxx >=19 + license: MIT + license_family: MIT + run_exports: + weak: + - libpsl >=0.22.0,<0.23.0a0 + size: 68846 + timestamp: 1783937608868 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libraqm-0.10.5-h45af499_1.conda + sha256: 7d88c506b9899d60e57f7456b02f54c7330029f2ad56c6df96357f981aa1bd96 + md5: fa1a27aaaa10e92be48372fa01573f7c + depends: + - __osx >=11.0 + - libharfbuzz >=14.2.1 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - fribidi >=1.0.16,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libraqm >=0.10.5,<0.11.0a0 + size: 27026 + timestamp: 1782807229285 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda + sha256: 1e2d23bbc1ffca54e4912365b7b59992b7ae5cbeb892779a6dcd9eca9f71c428 + md5: 40d8ad21be4ccfff83a314076c3563f4 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.0,<20260108.0a0 + - libcxx >=19 + constrains: + - re2 2025.11.05.* + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libre2-11 >=2025.11.5 + size: 165851 + timestamp: 1768190225157 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/librsvg-2.62.3-he8aa2a2_0.conda + sha256: f5b4fb7b6f13bbfca59613bff2e70b5a398e80727b9d0f814837ffcbc34185e1 + md5: 6973724fadafe66ac6e4f1c55c191407 + depends: + - __osx >=11.0 + - cairo >=1.18.4,<2.0a0 + - fontconfig >=2.18.0,<3.0a0 + - fonts-conda-ecosystem + - gdk-pixbuf >=2.44.6,<3.0a0 + - harfbuzz >=14.2.0 + - libglib >=2.88.1,<3.0a0 + - libxml2-16 >=2.14.6 + - pango >=1.56.4,<2.0a0 + constrains: + - __osx >=11.0 + license: LGPL-2.1-or-later + run_exports: + weak: + - librsvg >=2.62.3,<3.0a0 + size: 2397567 + timestamp: 1780452232118 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/librttopo-1.1.0-ha909e78_20.conda + sha256: 2b28c777889b1b638244f65d5bef4a8ba4624bdb740cecf26c845876653552c2 + md5: d07359797436cfc891b38e203cf0caac + depends: + - __osx >=11.0 + - geos >=3.14.1,<3.14.2.0a0 + - libcxx >=19 + license: GPL-2.0-or-later + license_family: GPL + run_exports: + weak: + - librttopo >=1.1.0,<1.2.0a0 + size: 192590 + timestamp: 1761670939075 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.22-h1a92334_1.conda + sha256: 202be45db5726757a8ea1f374f85aacc18c504f5ff15b2558496dff4c8779c48 + md5: 9ed5ab909c449bdcae72322e44875a18 + depends: + - __osx >=11.0 + license: ISC + run_exports: + weak: + - libsodium >=1.0.22,<1.0.23.0a0 + size: 247352 + timestamp: 1779164136206 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libspatialite-5.1.0-gpl_ha239c29_119.conda + sha256: 631e1bca330abc13bcbb0a16aea47aec969ddd5a82f695bdc840497069fc1dec + md5: babf54eb886241155434878f728ea099 + depends: + - __osx >=11.0 + - freexl >=2 + - freexl >=2.0.0,<3.0a0 + - geos >=3.14.1,<3.14.2.0a0 + - libcxx >=19 + - libiconv >=1.18,<2.0a0 + - librttopo >=1.1.0,<1.2.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libxml2-devel + - libzlib >=1.3.1,<2.0a0 + - proj >=9.7.0,<9.8.0a0 + - sqlite + - zlib + license: MPL-1.1 + license_family: MOZILLA + run_exports: + weak: + - libspatialite >=5.1.0,<5.2.0a0 + size: 2712485 + timestamp: 1761681521138 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.53.3-h1b79a29_0.conda + sha256: a73a8acd97a6599fd6e561514db9f101ca7fd984cdc0cfd91ba74c8aa9dbe067 + md5: 7184d95871a58b8258a8ea124ed5aabc + depends: + - __osx >=11.0 + - libzlib >=1.3.2,<2.0a0 + license: blessing + run_exports: + weak: + - libsqlite >=3.53.3,<4.0a0 + size: 924912 + timestamp: 1782519136322 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda + sha256: 8bfe837221390ffc6f111ecca24fa12d4a6325da0c8d131333d63d6c37f27e0a + md5: b68e8f66b94b44aaa8de4583d3d4cc40 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libssh2 >=1.11.1,<2.0a0 + size: 279193 + timestamp: 1745608793272 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h1fb9c8a_2.conda + sha256: 568bb23db02b050c3903bec05edbcab84960c8c7e5a1710dac3109df997ac7f1 + md5: d006875f9a58a44f92aec9a7ebeb7150 + depends: + - __osx >=11.0 + - libcxx >=19 + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libthrift >=0.22.0,<0.22.1.0a0 + size: 323017 + timestamp: 1777019893083 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.2-h282da08_0.conda + sha256: 253153cabf9469170e02b21a6bc9aa598048e7c34966b1103af52d27d2a708a4 + md5: 6fa87106b3c041ad6d965a9411e79b94 + depends: + - __osx >=11.0 + - lerc >=4.1.0,<5.0a0 + - libcxx >=19 + - libdeflate >=1.25,<1.26.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - liblzma >=5.8.3,<6.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + run_exports: + weak: + - libtiff >=4.7.2,<4.8.0a0 + size: 387825 + timestamp: 1783085754081 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda + sha256: ae1a82e62cd4e3c18e005ae7ff4358ed72b2bfbfe990d5a6a5587f81e9a100dc + md5: 2255add2f6ae77d0a96624a5cbde6d45 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: + weak: + - libutf8proc >=2.11.3,<2.12.0a0 + size: 87916 + timestamp: 1768735311947 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda + sha256: a4de3f371bb7ada325e1f27a4ef7bcc81b2b6a330e46fac9c2f78ac0755ea3dd + md5: e5e7d467f80da752be17796b87fe6385 + depends: + - __osx >=11.0 + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libwebp-base >=1.6.0,<2.0a0 + size: 294974 + timestamp: 1752159906788 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda + sha256: bd3816218924b1e43b275863e21a3e13a5db4a6da74cca8e60bc3c213eb62f71 + md5: af523aae2eca6dfa1c8eec693f5b9a79 + depends: + - __osx >=11.0 + - pthread-stubs + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + run_exports: + weak: + - libxcb >=1.17.0,<2.0a0 + size: 323658 + timestamp: 1727278733917 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.3-h5ef1a60_0.conda + sha256: ff75b84cdb9e8d123db2fa694a8ac2c2059516b6cbc98ac21fb68e235d0fd354 + md5: 19edaa53885fc8205614b03da2482282 + depends: + - __osx >=11.0 + - icu >=78.3,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + constrains: + - libxml2 2.15.3 + license: MIT + license_family: MIT + run_exports: {} + size: 466360 + timestamp: 1776377102261 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.3-h5654f7c_0.conda + sha256: 2fe1d8de0854342ae9cabe408b476935f82f5636e153b3b497456264dc8ff3a1 + md5: 8e037d73747d6fe34e12d7bcac10cf21 + depends: + - __osx >=11.0 + - icu >=78.3,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.3 h5ef1a60_0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libxml2 + - libxml2-16 >=2.15.3 + size: 41102 + timestamp: 1776377119495 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-devel-2.15.3-h5654f7c_0.conda + sha256: 541980a15bf0acb7794754f1cde9cfeb74ca27c139d065c1c6541c73b4e07105 + md5: 469f4af737803bf7deda25d41c557593 + depends: + - __osx >=11.0 + - icu >=78.3,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2 2.15.3 h5654f7c_0 + - libxml2-16 2.15.3 h5ef1a60_0 + - libzlib >=1.3.2,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libxml2 + - libxml2-16 >=2.15.3 + size: 80217 + timestamp: 1776377134719 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxslt-1.1.43-hb2570ba_1.conda + sha256: 7a4d0676ab1407fecb24d4ada7fe31a98c8889f61f04612ea533599c22b8c472 + md5: 90f7ed12bb3c164c758131b3d3c2ab0c + depends: + - __osx >=11.0 + - libxml2 + - libxml2-16 >=2.14.6 + license: MIT + license_family: MIT + run_exports: + weak: + - libxslt >=1.1.43,<2.0a0 + size: 220345 + timestamp: 1757964000982 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzip-1.11.2-h1336266_0.conda + sha256: 507599a77c1ce823c2d3acaefaae4ead0686f183f3980467a4c4b8ba209eff40 + md5: 7177414f275db66735a17d316b0a81d6 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libzip >=1.11.2,<2.0a0 + size: 125507 + timestamp: 1730442214849 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05 + md5: bc5a5721b6439f2f62a84f2548136082 + depends: + - __osx >=11.0 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 47759 + timestamp: 1774072956767 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.8-hc7d1edf_0.conda + sha256: ccbaad6bbc88f135ab849bc36af5fa6eda36a9ed18ce6f58e3dde3d11784c156 + md5: a9c118f6343fb6301b6f3b4e94c4c562 + depends: + - __osx >=11.0 + constrains: + - intel-openmp <0.0a0 + - openmp 22.1.8|22.1.8.* + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: + strong: + - llvm-openmp >=22.1.8 + size: 286313 + timestamp: 1781736516782 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.47.0-py314hc7e35b3_1.conda + sha256: 54dbf3a5acc8eb4d0902345145bdf0a658a3ac118ab3d10424c899fb899cda46 + md5: c555bb3e65064bf7807d0419eb0ae120 + depends: + - __osx >=11.0 + - libcxx >=19 + - libzlib >=1.3.2,<2.0a0 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 24327499 + timestamp: 1776077303342 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lxml-6.1.1-py314h264e108_0.conda + sha256: f2c95fdbfa2cb7fb3d97987d2b06617fb57a346a6d93030516b0bce5c420cfb7 + md5: 1f41be2aa1490c4da46da7c2e0de83d6 + depends: + - __osx >=11.0 + - libxml2 + - libxml2-16 >=2.14.6 + - libxslt >=1.1.43,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause and MIT-CMU + run_exports: {} + size: 1376491 + timestamp: 1779195548681 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-4.4.5-py314h24f3bdd_1.conda + sha256: fb105138b325e81f8dabc859cc47e9e29295b68cd6fd4dd333ed30e527e7c08b + md5: aea17e1b366b814eff15fc3c8c4c1e3c + depends: + - python + - lz4-c + - __osx >=11.0 + - python 3.14.* *_cp314 + - lz4-c >=1.10.0,<1.11.0a0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 127471 + timestamp: 1765026415723 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda + sha256: 94d3e2a485dab8bdfdd4837880bde3dd0d701e2b97d6134b8806b7c8e69c8652 + md5: 01511afc6cc1909c5303cf31be17b44f + depends: + - __osx >=11.0 + - libcxx >=18 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - lz4-c >=1.10.0,<1.11.0a0 + size: 148824 + timestamp: 1733741047892 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/lzo-2.10-h925e9cb_1002.conda + sha256: db40fd25c6306bfda469f84cddd8b5ebb9aa08d509cecb49dfd0bb8228466d0c + md5: e56eaa1beab0e7fed559ae9c0264dd88 + depends: + - __osx >=11.0 + license: GPL-2.0-or-later + license_family: GPL + run_exports: + weak: + - lzo >=2.10,<3.0a0 + size: 152755 + timestamp: 1753889267953 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-3.0.3-py314h6e9b3f0_1.conda + sha256: 411153d14ee0d98be6e3751cf5cc0502db17bce2deebebb8779e33d29d0e525f + md5: d33c0a15882b70255abdd54711b06a45 + depends: + - __osx >=11.0 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 27256 + timestamp: 1772445397216 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.11.0-py314hf6804ef_1.conda + sha256: a55f1d61cb9265187477a90dd9d3b4a82a1d559d291846af5f4719815822fff4 + md5: 839648f58bc9c220a496ad342adc34d9 + depends: + - __osx >=11.0 + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype + - kiwisolver >=1.3.1 + - libcxx >=19 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libraqm >=0.10.5,<0.11.0a0 + - numpy >=1.23 + - numpy >=1.25,<3 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.14,<3.15.0a0 + - python-dateutil >=2.7 + - python_abi 3.14.* *_cp314 + - qhull >=2020.2,<2020.3.0a0 + license: PSF-2.0 + license_family: PSF + run_exports: {} + size: 8826632 + timestamp: 1782829663874 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/minizip-4.2.2-hdb7fadc_0.conda + sha256: 9a59199ab5812dd7a237ab9cbd1091a29a9532a70035929fb7f255fd2ee5da0d + md5: 6bf8d76a71b4eb31138fc5c217a77af0 + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libcxx >=19 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Zlib + license_family: Other + run_exports: + weak: + - minizip >=4.2.2,<5.0a0 + size: 462323 + timestamp: 1782852375098 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.2.1-py314hf8a3a22_1.conda + sha256: a6f59e73e012318028ebe905eb7843f4a43c5c11205078b932cbb2d55b98f27a + md5: 437187ee6b84e1cb787b8b8194478174 + depends: + - python + - libcxx >=19 + - __osx >=11.0 + - python 3.14.* *_cp314 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 105734 + timestamp: 1782460899732 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/muparser-2.3.5-h11e0b38_0.conda + sha256: 5533e7e3d4b0819b4426f8a1b3f680e6b9c922cdae2b7fabcd0e8c59df22772a + md5: 1cdbe54881794ee356d3cba7e3ed6668 + depends: + - __osx >=11.0 + - libcxx >=18 + - llvm-openmp >=18.1.8 + license: MIT + license_family: MIT + run_exports: + weak: + - muparser >=2.3.5,<2.4.0a0 + size: 154087 + timestamp: 1747117056226 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda + sha256: 4ea6c620b87bd1d42bb2ccc2c87cd2483fa2d7f9e905b14c223f11ff3f4c455d + md5: 343d10ed5b44030a2f67193905aea159 + depends: + - __osx >=11.0 + license: X11 AND BSD-3-Clause + run_exports: + weak: + - ncurses >=6.6,<7.0a0 + size: 805509 + timestamp: 1777423252320 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/netcdf4-1.7.4-nompi_py311hb912870_109.conda + noarch: python + sha256: ee86bc8621211c975cf1a62d893043798da856f1dc01ee063f6f79ed0bd22c3a + md5: 920f8a7fce256025115bba923c6ebce9 + depends: + - python + - certifi + - cftime + - numpy + - packaging + - hdf5 + - libnetcdf + - __osx >=11.0 + - hdf5 >=1.14.6,<1.14.7.0a0 + - numpy >=1.23,<3 + - libnetcdf >=4.10.1,<4.10.2.0a0 + - libzlib >=1.3.2,<2.0a0 + - _python_abi3_support 1.* + - cpython >=3.11 + license: MIT + run_exports: {} + size: 998158 + timestamp: 1783865942129 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.6-py310h3b8a9b8_0.conda + noarch: python + sha256: ce2cbbab1b433212f3f40c5d8d123c8ea24b1e8cb20abf13b5dc7522c9f7db69 + md5: 2360c27e16dbf61e6da6993a858d8d45 + depends: + - python + - __osx >=11.0 + - _python_abi3_support 1.* + - cpython >=3.10 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: {} + size: 629436 + timestamp: 1782129869826 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h784d473_1.conda + sha256: 1945fd5b64b74ef3d57926156fb0bfe88ee637c49f3273067f7231b224f1d26d + md5: 755cfa6c08ed7b7acbee20ccbf15a47c + constrains: + - nlohmann_json-abi ==3.12.0 + license: MIT + license_family: MIT + run_exports: {} + size: 137595 + timestamp: 1768670878127 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.65.1-py314hb38061f_1.conda + sha256: 86ab4c3273761dec812c198fcb658c3b8f86b39bb0a3b409a62baff9f19db927 + md5: 606140802769e37d32f5e83a485e5a4b + depends: + - __osx >=11.0 + - libcxx >=19 + - llvm-openmp >=19.1.7 + - llvmlite >=0.47.0,<0.48.0a0 + - numpy >=1.22.3,<2.5 + - numpy >=1.23,<3 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + constrains: + - cudatoolkit >=11.2 + - libopenblas >=0.3.18,!=0.3.20 + - tbb >=2021.6.0 + - cuda-version >=11.2 + - cuda-python >=11.6 + - scipy >=1.0 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 5766480 + timestamp: 1778390893034 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numcodecs-0.16.5-py314ha3d490a_0.conda + sha256: 13169b72b28aa76ff5ec6d05220fd122b398470c9637b32301a039ec719d4806 + md5: 0aaf2782f8b7e4ca443b0d83c2a1ffdf + depends: + - __osx >=11.0 + - deprecated + - libcxx >=19 + - msgpack-python + - numpy >=1.23,<3 + - numpy >=1.24 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + - typing_extensions + license: MIT + license_family: MIT + run_exports: {} + size: 668653 + timestamp: 1764782949708 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.6-py314hb79c6fa_0.conda + sha256: 538064b78042cd2751664f00c6255ecce81b38e9fa6dd9c1863327e6c759ed4a + md5: e64e47cb372d92e3425816a2918f4605 + depends: + - python + - __osx >=11.0 + - libcxx >=19 + - libblas >=3.9.0,<4.0a0 + - python_abi 3.14.* *_cp314 + - liblapack >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - numpy >=1.23,<3 + size: 6995531 + timestamp: 1779169217034 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hd9e9057_0.conda + sha256: 60aca8b9f94d06b852b296c276b3cf0efba5a6eb9f25feb8708570d3a74f00e4 + md5: 4b5d3a91320976eec71678fad1e3569b + depends: + - __osx >=11.0 + - libcxx >=19 + - libpng >=1.6.55,<1.7.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - openjpeg >=2.5.4,<3.0a0 + size: 319697 + timestamp: 1772625397692 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.3-hd24854e_0.conda + sha256: b3e3ca895c336d4eb91c5d2f244a312bdb59a0de8cfa0cc4c179225ab2f6bbfb + md5: 8187a86242741725bfa74785fe812979 + depends: + - __osx >=11.0 + - ca-certificates + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - openssl >=3.6.3,<4.0a0 + size: 3102584 + timestamp: 1781069820667 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda + sha256: 8594f064828cca9b8d625e2ebe79436fd4ffc030c950573380c54a8f4329f955 + md5: 77bfe521901c1a247cc66c1276826a85 + depends: + - tzdata + - libcxx >=19 + - __osx >=11.0 + - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.1,<2.0a0 + - snappy >=1.2.2,<1.3.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - lz4-c >=1.10.0,<1.11.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - orc >=2.3.0,<2.3.1.0a0 + size: 548180 + timestamp: 1773230270828 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-3.0.3-py314he609de1_0.conda + sha256: 90d84a2a6e7e9826f28f71ff34c7daacd0819c96eb3951f1ab59ef460a75fb58 + md5: 703276fc0e3693ff6a7566f1ac6865ab + depends: + - python + - numpy >=1.26.0 + - python-dateutil >=2.8.2 + - libcxx >=19 + - python 3.14.* *_cp314 + - __osx >=11.0 + - python_abi 3.14.* *_cp314 + - numpy >=1.23,<3 + constrains: + - adbc-driver-postgresql >=1.2.0 + - adbc-driver-sqlite >=1.2.0 + - beautifulsoup4 >=4.12.3 + - blosc >=1.21.3 + - bottleneck >=1.4.2 + - fastparquet >=2024.11.0 + - fsspec >=2024.10.0 + - gcsfs >=2024.10.0 + - html5lib >=1.1 + - hypothesis >=6.116.0 + - jinja2 >=3.1.5 + - lxml >=5.3.0 + - matplotlib >=3.9.3 + - numba >=0.60.0 + - numexpr >=2.10.2 + - odfpy >=1.4.1 + - openpyxl >=3.1.5 + - psycopg2 >=2.9.10 + - pyarrow >=13.0.0 + - pyiceberg >=0.8.1 + - pymysql >=1.1.1 + - pyqt5 >=5.15.9 + - pyreadstat >=1.2.8 + - pytables >=3.10.1 + - pytest >=8.3.4 + - pytest-xdist >=3.6.1 + - python-calamine >=0.3.0 + - pytz >=2024.2 + - pyxlsb >=1.0.10 + - qtpy >=2.4.2 + - scipy >=1.14.1 + - s3fs >=2024.10.0 + - sqlalchemy >=2.0.36 + - tabulate >=0.9.0 + - xarray >=2024.10.0 + - xlrd >=2.0.1 + - xlsxwriter >=3.2.0 + - zstandard >=0.23.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 14368928 + timestamp: 1778602917992 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pango-1.56.4-hf80efc4_1.conda + sha256: b57c59cf5abb06d407b3a79017b990ca5bfb10c15a10c62fc29e113f2b12d9a9 + md5: 4b433508ebb295c05dd3d03daf27f7bb + depends: + - __osx >=11.0 + - cairo >=1.18.4,<2.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - fribidi >=1.0.16,<2.0a0 + - harfbuzz >=13.2.1 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 + - libglib >=2.86.4,<3.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + license: LGPL-2.1-or-later + run_exports: + weak: + - pango >=1.56.4,<2.0a0 + size: 425743 + timestamp: 1774282709773 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda + sha256: 5e2e443f796f2fd92adf7978286a525fb768c34e12b1ee9ded4000a41b2894ba + md5: 9b4190c4055435ca3502070186eba53a + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - pcre2 >=10.47,<10.48.0a0 + size: 850231 + timestamp: 1763655726735 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.3.0-py314hab283cf_0.conda + sha256: dd7303ea135116cc1182c109825459a9eeb77d244d3899f03dd8d83a8db956f9 + md5: 4f25498ea1962ab24097fed8700e91ae + depends: + - python + - python 3.14.* *_cp314 + - __osx >=11.0 + - zlib-ng >=2.3.3,<2.4.0a0 + - openjpeg >=2.5.4,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libxcb >=1.17.0,<2.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - python_abi 3.14.* *_cp314 + - tk >=8.6.13,<8.7.0a0 + - lcms2 >=2.19.1,<3.0a0 + license: HPND + run_exports: {} + size: 1019767 + timestamp: 1782912213683 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pixman-0.46.4-h81086ad_1.conda + sha256: 29c9b08a9b8b7810f9d4f159aecfd205fce051633169040005c0b7efad4bc718 + md5: 17c3d745db6ea72ae2fce17e7338547f + depends: + - __osx >=11.0 + - libcxx >=19 + license: MIT + license_family: MIT + run_exports: + weak: + - pixman >=0.46.4,<1.0a0 + size: 248045 + timestamp: 1754665282033 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/proj-9.7.1-hfb14a63_3.conda + sha256: 14484430a32a13cb9c03ebf3084a4ffb1feb417aa4c23907844fba219924058f + md5: 8f33a4a2b856de0e8f006c489beca62a + depends: + - sqlite + - libtiff + - libcurl + - __osx >=11.0 + - libcxx >=19 + - libsqlite >=3.51.2,<4.0a0 + - libcurl >=8.18.0,<9.0a0 + - libtiff >=4.7.1,<4.8.0a0 + constrains: + - proj4 ==999999999999 + license: MIT + license_family: MIT + run_exports: + weak: + - proj >=9.7.1,<9.8.0a0 + size: 3098262 + timestamp: 1770890778843 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + sha256: 851a77ae1a8e90db9b9f3c4466abea7afb52713c3d98ceb0d37ba6ff27df2eff + md5: 7172339b49c94275ba42fec3eaeda34f + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - zlib + license: MIT + license_family: MIT + run_exports: + weak: + - prometheus-cpp >=1.3.0,<1.4.0a0 + size: 173220 + timestamp: 1730769371051 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/protobuf-6.33.5-py314he407d35_2.conda + sha256: 1c9dc0ad0ecb8b346b8321c6c6a57cd436a0a852d02e42ce05c1ec12964cb8dd + md5: a667bd9984b0d39ec5d6ea5bf7f052c4 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcxx >=19 + - libzlib >=1.3.1,<2.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + constrains: + - libprotobuf 6.33.5 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 473978 + timestamp: 1773265431848 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-7.2.2-py314ha14b1ff_0.conda + sha256: e0f31c053eb11803d63860c213b2b1b57db36734f5f84a3833606f7c91fedff9 + md5: fc4c7ab223873eee32080d51600ce7e7 + depends: + - python + - __osx >=11.0 + - python 3.14.* *_cp314 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 245502 + timestamp: 1769678303655 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda + sha256: 8ed65e17fbb0ca944bfb8093b60086e3f9dd678c3448b5de212017394c247ee3 + md5: 415816daf82e0b23a736a069a75e9da7 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: {} + size: 8381 + timestamp: 1726802424786 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-24.0.0-py314he55896b_0.conda + sha256: af8d6775f7ba3642cbc6bd13fcd5964269d4f36ffe00ee6b54161471aeea27f8 + md5: be8e7739464185154f706560c30ced52 + depends: + - libarrow-acero 24.0.0.* + - libarrow-dataset 24.0.0.* + - libarrow-substrait 24.0.0.* + - libparquet 24.0.0.* + - pyarrow-core 24.0.0 *_0_* + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 26896 + timestamp: 1776928739464 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-24.0.0-py314h109bba2_0_cpu.conda + sha256: d8ed966420d2ede8b3cefc2fc831b3d6ff6f111e2309feed660e1a3db4b536c7 + md5: 9282fb072642aa9d8242f906532504fa + depends: + - __osx >=11.0 + - libarrow 24.0.0.* *cpu + - libarrow-compute 24.0.0.* *cpu + - libcxx >=21 + - libzlib >=1.3.2,<2.0a0 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + constrains: + - apache-arrow-proc * cpu + - numpy >=1.23,<3 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 4334926 + timestamp: 1776928703378 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-12.2.1-py314h6590101_0.conda + sha256: d400216f2f724b20e56a47837d0924df8558a426af8042494bf59f9a317cdcc4 + md5: 3701b8006ce23a111d15ca1d514e9055 + depends: + - __osx >=11.3 + - libffi >=3.5.2,<3.6.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - setuptools + license: MIT + license_family: MIT + run_exports: {} + size: 2165860 + timestamp: 1782232267924 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-framework-cocoa-12.2.1-py314ha06c032_0.conda + sha256: 7368f25512f0920c4e5ad39b27cc34ecba1502b2bfbf7be0058352b31bb4e0f5 + md5: c28c88396a6c6fb064aa7bd1a7d7df4f + depends: + - __osx >=11.3 + - libffi >=3.5.2,<3.6.0a0 + - pyobjc-core 12.2.1.* + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 383812 + timestamp: 1782265953125 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyproj-3.7.2-py314hb2113e1_3.conda + sha256: a2a7d692bbac993396569bf68aaeabdc1b80fbe33400ef7f59655d81f3025115 + md5: 841b9e806c0d84635ff9cf329623cf8f + depends: + - python + - proj + - certifi + - python 3.14.* *_cp314 + - __osx >=11.0 + - proj >=9.7.1,<9.8.0a0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 528919 + timestamp: 1772623276635 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.6-h156bc91_100_cp314.conda + build_number: 100 + sha256: 984081c9fae3a3944c6f2707bbbbc70e8b961f02cdb7c640d9745e2636235632 + md5: 4841be3d0cf616a860efc6e60af66f8b + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.53.2,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - openssl >=3.5.7,<4.0a0 + - python_abi 3.14.* *_cp314 + - readline >=8.3,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + run_exports: + weak: + - python_abi 3.14.* *_cp314 + noarch: + - python + size: 14059371 + timestamp: 1781254578985 + python_site_packages_path: lib/python3.14/site-packages +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyyaml-6.0.3-py314h6e9b3f0_1.conda + sha256: 95f385f9606e30137cf0b5295f63855fd22223a4cf024d306cf9098ea1c4a252 + md5: dcf51e564317816cb8d546891019b3ab + depends: + - __osx >=11.0 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + run_exports: {} + size: 189475 + timestamp: 1770223788648 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312h022ad19_3.conda + noarch: python + sha256: 086cc67ec57afb7c9c09b5e09e7356b536b5b1af6c2e97117dc022cd22f0d472 + md5: 73f22bde4991f30ae2bfac3811577c15 + depends: + - python + - libcxx >=19 + - __osx >=11.0 + - zeromq >=4.3.5,<4.4.0a0 + - _python_abi3_support 1.* + - cpython >=3.12 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 191432 + timestamp: 1779484184540 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda + sha256: 873ac689484262a51fd79bc6103c1a1bedbf524924d7f0088fb80703042805e4 + md5: 6483b1f59526e05d7d894e466b5b6924 + depends: + - __osx >=11.0 + - libcxx >=16 + license: LicenseRef-Qhull + run_exports: + weak: + - qhull >=2020.2,<2020.3.0a0 + size: 516376 + timestamp: 1720814307311 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rasterio-1.5.0-py314h5002e4e_0.conda + sha256: 39cbd44377e218d94e88a17dbafa82e18f3631929832ff7bdb3b3c2c3af672dd + md5: 8a3db2ceb5103f48878c510065febca3 + depends: + - __osx >=11.0 + - affine + - attrs + - certifi + - click >=4,!=8.2.* + - click-plugins + - cligj >=0.5 + - libcxx >=19 + - libgdal-core >=3.12.1,<3.13.0a0 + - numpy >=1.23,<3 + - proj >=9.7.1,<9.8.0a0 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + - setuptools >=0.9.8 + - snuggs >=1.4.1 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 7442099 + timestamp: 1767632864203 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda + sha256: 5bab972e8f2bff1b5b3574ffec8ecb89f7937578bd107584ed3fde507ff132f9 + md5: a1ff22f664b0affa3de712749ccfbf04 + depends: + - libre2-11 2025.11.05 h4c27e2a_1 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libre2-11 >=2025.11.5 + - re2 + size: 27445 + timestamp: 1768190259003 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda + sha256: a77010528efb4b548ac2a4484eaf7e1c3907f2aec86123ed9c5212ae44502477 + md5: f8381319127120ce51e081dce4865cf4 + depends: + - __osx >=11.0 + - ncurses >=6.5,<7.0a0 + license: GPL-3.0-only + license_family: GPL + run_exports: + weak: + - readline >=8.3,<9.0a0 + size: 313930 + timestamp: 1765813902568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-2026.6.3-py314he1d1ac0_0.conda + sha256: 30bf9b362be5f04ccb7c0d9549f474763fb6fd11e7f0b78e5286b881f3c382cf + md5: 2e8e2fe25e9d6df3628b068fe7407299 + depends: + - python + - __osx >=11.0 + - python_abi 3.14.* *_cp314 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: {} + size: 285627 + timestamp: 1782831308617 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.9.0-np2py314h15f0f0f_0.conda + sha256: c5dc417c26c46eecf7e8931c53a4c18bcd2c274c994ee80bae4767baeed4807c + md5: 72cd17b6f8016221faaa96123711f8c9 + depends: + - python + - numpy >=1.24.1 + - scipy >=1.10.0 + - joblib >=1.4.0 + - threadpoolctl >=3.5.0 + - narwhals >=2.0.1 + - python 3.14.* *_cp314 + - __osx >=11.0 + - llvm-openmp >=19.1.7 + - libcxx >=19 + - python_abi 3.14.* *_cp314 + - numpy >=1.23,<3 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 9667030 + timestamp: 1780401292916 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.18.0-py314h18e1515_0.conda + sha256: 7ce218a4e1c55775547835d21a7ead0d50e5ac348fd638ce6ba316c48c8547b7 + md5: e55fe08bb5d43e7120672338dd129030 + depends: + - __osx >=11.0 + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - libcxx >=19 + - libgfortran + - libgfortran5 >=14.3.0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.7 + - numpy >=1.23,<3 + - numpy >=2.0.0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 14122215 + timestamp: 1781912992503 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/shapely-2.1.2-py314h277790e_2.conda + sha256: 3d6f64391563dbe47f2e795ce99b2389c84c695df12170e0a1743b10963ebce7 + md5: 947d1f4e3160c83140a9c8bcb046fdac + depends: + - __osx >=11.0 + - geos >=3.14.1,<3.14.2.0a0 + - numpy >=1.23,<3 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 618928 + timestamp: 1762524178138 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.2-hada39a4_1.conda + sha256: cb9305ede19584115f43baecdf09a3866bfcd5bcca0d9e527bd76d9a1dbe2d8d + md5: fca4a2222994acd7f691e57f94b750c5 + depends: + - libcxx >=19 + - __osx >=11.0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - snappy >=1.2.2,<1.3.0a0 + size: 38883 + timestamp: 1762948066818 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlalchemy-2.0.51-py314ha14b1ff_0.conda + sha256: c355708c29086c3ce0916f5d5367cfea733f73d9c194b4fa5d21a40317374d32 + md5: 540fe3cb235eb16dcf0ff5e13eb96411 + depends: + - python + - greenlet !=0.4.17 + - typing-extensions >=4.6.0 + - __osx >=11.0 + - python 3.14.* *_cp314 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 4036851 + timestamp: 1781547978515 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.53.3-h85ec8f2_0.conda + sha256: 95482d44bef095da3c63be6e0c66a2e5b66a2a551e11d4c40949c075df13ec2c + md5: b9df2fcb7e9eba945c1c946c438c4586 + depends: + - __osx >=11.0 + - libsqlite 3.53.3 h1b79a29_0 + - libzlib >=1.3.2,<2.0a0 + - ncurses >=6.6,<7.0a0 + - readline >=8.3,<9.0a0 + license: blessing + run_exports: + weak: + - libsqlite >=3.53.3,<4.0a0 + size: 183088 + timestamp: 1782519149990 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda + sha256: 799cab4b6cde62f91f750149995d149bc9db525ec12595e8a1d91b9317f038b3 + md5: a9d86bc62f39b94c4661716624eb21b0 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: TCL + license_family: BSD + run_exports: + weak: + - tk >=8.6.13,<8.7.0a0 + size: 3127137 + timestamp: 1769460817696 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.7-py314h6c2aa35_0.conda + sha256: 1a4f3d940cf239acde2fc61674b7cf80219a7f22a369e92b95b245be2d47caf1 + md5: cc1d84777343f00f01c08a2d9550f639 + depends: + - __osx >=11.0 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 915857 + timestamp: 1781007345425 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ujson-5.13.0-py314he609de1_0.conda + sha256: b9f9352364ccb74d3628c8597c12f9952a74cdf6f8e737b32e9c137a17680804 + md5: d2ff8652d2bfe6de26a280b37e2dc5e6 + depends: + - python + - libcxx >=19 + - __osx >=11.0 + - python 3.14.* *_cp314 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 67728 + timestamp: 1781561797729 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ukkonen-1.1.0-py314h6cfcd04_0.conda + sha256: 033dbf9859fe58fb85350cf6395be6b1346792e1766d2d5acab538a6eb3659fb + md5: e229f444fbdb28d8c4f40e247154d993 + depends: + - __osx >=11.0 + - cffi + - libcxx >=19 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 14884 + timestamp: 1769439056290 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.1-py314h6c2aa35_0.conda + sha256: 09bfbee5a2bcf4df06f21a2aa9eb40a7af97864a569beb5ea85fd6baf6e03ce7 + md5: 4fffb3ba871bb05f34ffb705534dfef5 + depends: + - __osx >=11.0 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 416130 + timestamp: 1770909728445 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/uriparser-0.9.8-h00cdb27_0.conda + sha256: fa0bcbfb20a508ca9bf482236fe799581cbd0eab016e47a865e9fa44dbe3c512 + md5: e8ff9e11babbc8cd77af5a4258dc2802 + depends: + - __osx >=11.0 + - libcxx >=16 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - uriparser >=0.9.8,<1.0a0 + size: 40625 + timestamp: 1715010029254 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/watchfiles-1.2.0-py314he1d1ac0_1.conda + sha256: cd8c788feb2a47551b7f37ca7dfa4b5df1fe732007539d29be53874f03c6d945 + md5: 042bf3289f21e8a5c28551d150704295 + depends: + - python + - anyio >=3.0.0 + - __osx >=11.0 + - python_abi 3.14.* *_cp314 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: {} + size: 352931 + timestamp: 1781180392615 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/websockets-16.1-py314h2fbedac_0.conda + sha256: b9833e183876f7a46aad62f50d7385a0730f20de8fc75c4e99e7c59207e943da + md5: 853efa711a6a4c50fc8a7f3bd2a709a3 + depends: + - python + - __osx >=11.0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 389316 + timestamp: 1783694722945 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-2.2.2-py314h6c2aa35_0.conda + sha256: 3fff09a8c28dbdd3280c767f0b09ab5a25bcda2ed3b0a07b48a5b986e0ff12df + md5: abca357e08d7ceaaeebafa6d7f5a7fad + depends: + - __osx >=11.0 + - python >=3.14,<3.15.0a0 + - python >=3.14,<3.15.0a0 *_cp314 + - python_abi 3.14.* *_cp314 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 115243 + timestamp: 1782134346100 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xerces-c-3.3.0-h25f632f_1.conda + sha256: 89152175f45b5e84e0f1575848f607e305ffc122ab59d9704ea77ce699b1bd2b + md5: 0b886d06130b774f086d3b2ce0b7277a + depends: + - __osx >=11.0 + - icu >=78.1,<79.0a0 + - libcxx >=19 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - xerces-c >=3.3.0,<3.4.0a0 + size: 1283088 + timestamp: 1766327630028 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda + sha256: adae11db0f66f86156569415ed79cda75b2dbf4bea48d1577831db701438164f + md5: 78b548eed8227a689f93775d5d23ae09 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxau >=1.0.12,<2.0a0 + size: 14105 + timestamp: 1762976976084 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda + sha256: f7fa0de519d8da589995a1fe78ef74556bb8bc4172079ae3a8d20c3c81354906 + md5: 9d1299ace1924aa8f4e0bc8e71dd0cf7 + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxdmcp >=1.1.5,<2.0a0 + size: 19156 + timestamp: 1762977035194 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda + sha256: b03433b13d89f5567e828ea9f1a7d5c5d697bf374c28a4168d71e9464f5dafac + md5: 78a0fe9e9c50d2c381e8ee47e3ea437d + depends: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: + weak: + - yaml >=0.2.5,<0.3.0a0 + size: 83386 + timestamp: 1753484079473 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h10816f8_11.conda + sha256: 01fd50d2801b23b59fafea6bf704a6c5faf0f5969104400eae0e6572cb2e5304 + md5: d31c0e54c4f9c51100ec8c812ee925d1 + depends: + - libcxx >=19 + - __osx >=11.0 + - krb5 >=1.22.2,<1.23.0a0 + - libsodium >=1.0.22,<1.0.23.0a0 + license: MPL-2.0 + license_family: MOZILLA + run_exports: + weak: + - zeromq >=4.3.5,<4.4.0a0 + size: 245404 + timestamp: 1779124076307 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda + sha256: 8dd2ac25f0ba714263aac5832d46985648f4bfb9b305b5021d702079badc08d2 + md5: f1c0bce276210bed45a04949cfe8dc20 + depends: + - __osx >=11.0 + - libzlib 1.3.2 h8088a28_2 + license: Zlib + license_family: Other + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 81123 + timestamp: 1774072974535 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.3-hed4e4f5_1.conda + sha256: a339606a6b224bb230ff3d711e801934f3b3844271df9720165e0353716580d4 + md5: d99c2a23a31b0172e90f456f580b695e + depends: + - __osx >=11.0 + - libcxx >=19 + license: Zlib + license_family: Other + run_exports: + weak: + - zlib-ng >=2.3.3,<2.4.0a0 + size: 94375 + timestamp: 1770168363685 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda + sha256: 9485ba49e8f47d2b597dd399e88f4802e100851b27c21d7525625b0b4025a5d9 + md5: ab136e4c34e97f34fb621d2592a393d8 + depends: + - __osx >=11.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - zstd >=1.5.7,<1.6.0a0 + size: 433413 + timestamp: 1764777166076 +- conda: https://conda.anaconda.org/conda-forge/win-64/_openmp_mutex-4.5-20_gnu.conda + build_number: 20 + sha256: 8a1cee28bd0ee7451ada1cd50b64720e57e17ff994fc62dd8329bef570d382e4 + md5: 1626967b574d1784b578b52eaeb071e7 + depends: + - libgomp >=7.5.0 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + constrains: + - openmp_impl <0.0a0 + - msys2-conda-epoch <0.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + strong: + - _openmp_mutex >=4.5 + size: 52252 + timestamp: 1770943776666 +- conda: https://conda.anaconda.org/conda-forge/win-64/argon2-cffi-bindings-25.1.0-py314h5a2d7ad_2.conda + sha256: a742e7cd0d5534bfff3fd550a0c1e430411fad60a24f88930d261056ab08096f + md5: ffa247e46f47e157851dc547f4c513e4 + depends: + - cffi >=2.0.0b1 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: {} + size: 38653 + timestamp: 1762509771011 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.3-h0a1c2aa_4.conda + sha256: a87f863ffd39c69340fbda750eafde23097681e45bb08c04a8566e87b327a04a + md5: f191830ba03429449e6de9ba5f00a1b7 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-auth >=0.10.3,<0.10.4.0a0 + size: 127721 + timestamp: 1783461474966 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.14-h92e57be_3.conda + sha256: dd706664dd7ab021320634481f5b126f774c6b0526eab24b79f9a6a3961ea6ed + md5: 5057d17412a615efce912b41c6a26d82 + depends: + - aws-c-common >=0.14.1,<0.14.2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - aws-c-cal >=0.9.14,<0.9.15.0a0 + size: 54261 + timestamp: 1783165096177 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.14.1-hfd05255_0.conda + sha256: 803a59e9d4b324dc49aa9bc25f601f0766adbe344acf345015a1437210d9157e + md5: bda6f415d6bf1be6c3de28477c3c6d21 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - aws-c-common >=0.14.1,<0.14.2.0a0 + size: 240649 + timestamp: 1782343687763 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-h4c63076_3.conda + sha256: a41fdc98f48defd807d9befeec975cb772ceeb1ab1d944ecb7d73f2f13882d89 + md5: 5ee3f4b0f44948e8381d3ed85b968c6f + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-compression >=0.3.2,<0.3.3.0a0 + size: 23356 + timestamp: 1783166749848 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.7.1-h3c50fbe_3.conda + sha256: 3d5ef6650b27b7e2c678a0cee29ae913b0a4a6949ccdc687ee6ecd7c557665bb + md5: d004f2e9934cea9bbfd185d520f6eed0 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + size: 58202 + timestamp: 1783193002471 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.11.0-h2c07012_3.conda + sha256: 0957c39b445ab342bf0747334e4c823212c6e3297ac41f13d6bd96b221a51e0a + md5: 7eb24c10ea05776b52dc4659dffd9a38 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-compression >=0.3.2,<0.3.3.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-http >=0.11.0,<0.11.1.0a0 + size: 213356 + timestamp: 1783192901198 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-hf70332f_6.conda + sha256: 843e1d7f512adb0910c59ef0ae7772c87c8524878febfb793bf0106d813e82eb + md5: 7902637f56f67f42d298763e5d88a9e6 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-io >=0.26.3,<0.26.4.0a0 + size: 182541 + timestamp: 1783180053272 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.16.0-h2dc7e49_1.conda + sha256: 028277a6b5e31751164d3f9e4e92d20979c8eb5889d488ca4f8750f99ed57495 + md5: fd34addc1f8e7f8559c814e9bf1aa116 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-mqtt >=0.16.0,<0.16.1.0a0 + size: 215007 + timestamp: 1783205896800 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.12.6-hcb9225d_1.conda + sha256: b37e42dda013641efd411b5f5cd85e49dbc874943b5a7b4cc2628e3c2cb1837e + md5: bd68a03d89eb296fe3b41ee9a6696341 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-auth >=0.10.3,<0.10.4.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-s3 >=0.12.6,<0.12.7.0a0 + size: 144471 + timestamp: 1783472008846 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.7-h4c63076_1.conda + sha256: fc4a86838f740f1639f12fe39eaa6550126dd7330fbd0b7c4b85246f40e4ea2c + md5: 4914281d91c9385ae6a57be69489cc16 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + size: 64731 + timestamp: 1783172605202 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-h4c63076_3.conda + sha256: e403379e7686613f198474f56dc7019bbe5cc080baa6dd55ceab6270a193e53e + md5: 3a97d5f5d53f730c6d03a3034f99f00b + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-checksums >=0.2.10,<0.2.11.0a0 + size: 117111 + timestamp: 1783166923557 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.40.1-h5dbc166_2.conda + sha256: e913a861c0dac6519fb37205322094813647996bfef8e9b75abd05f131a31474 + md5: 33201131148d3750df61b4e8799d95e0 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - aws-c-s3 >=0.12.6,<0.12.7.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + - aws-c-auth >=0.10.3,<0.10.4.0a0 + - aws-c-cal >=0.9.14,<0.9.15.0a0 + - aws-c-sdkutils >=0.2.7,<0.2.8.0a0 + - aws-c-mqtt >=0.16.0,<0.16.1.0a0 + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-http >=0.11.0,<0.11.1.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + size: 311681 + timestamp: 1783483069438 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.833-h583dddf_8.conda + sha256: 27820794af36a15f7eeb3e8d546198ad3ac1235cdfa340ef955bce78ea7e9624 + md5: f9113b3ca39be21963faabc1117f192b + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.2,<2.0a0 + - aws-c-event-stream >=0.7.1,<0.7.2.0a0 + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + - aws-c-common >=0.14.1,<0.14.2.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 + size: 21900231 + timestamp: 1783536831062 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-core-cpp-1.16.3-h49e36cd_0.conda + sha256: cfcbd49faf954343220ed5e5feb8be1f65070f9d077ad223c9b1958f3a73b075 + md5: 1e8ee0cbdb1822de68e488e98cd8a31e + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + size: 502079 + timestamp: 1775238920903 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-identity-cpp-1.13.3-hf9fdf8e_2.conda + sha256: a7809dbee931b757c7b4a3c5c9fa9fd6a7e7648e02e98216d97097364eadf1f9 + md5: d1842ddabf2087c50e5305fc4f613cec + depends: + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + size: 425897 + timestamp: 1781268289981 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.18.0-h4fb3251_1.conda + sha256: 51533ea83750b76c89dca67e2967f2ef20be5b26406f76ecb0e85537237b7a2e + md5: 7d38f326139cefa0a9c2ec505c0177b1 + depends: + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + size: 800072 + timestamp: 1781283965517 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.14.0-hf9fdf8e_1.conda + sha256: 38dcabc3ec9d8a8f7cda50c1508aca09d0dfc27bd9f3cf9d681f0496896a6760 + md5: dbaa5d09d06d06a5febe0984667aa6d2 + depends: + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + size: 256108 + timestamp: 1781268295342 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.16.0-heb2e695_1.conda + sha256: 51d41dd74824cfc3dd0312378bb6d7bd6a9672aaf6f105834ee63cfbfd2fecbb + md5: 59a1891edca316111ad277dc3535f2f0 + depends: + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + - azure-storage-common-cpp >=12.14.0,<12.14.1.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 + size: 450656 + timestamp: 1781540588533 +- conda: https://conda.anaconda.org/conda-forge/win-64/blosc-1.21.6-hfd34d9b_1.conda + sha256: 9303a7a0e03cf118eab3691013f6d6cbd1cbac66efbc70d89b20f5d0145257c0 + md5: 357d7be4146d5fec543bfaa96a8a40de + depends: + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - zstd >=1.5.6,<1.6.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - blosc >=1.21.6,<2.0a0 + size: 49840 + timestamp: 1733513605730 +- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-1.2.0-h2d644bc_1.conda + sha256: a4fffdf1c9b9d3d0d787e20c724cff3a284dfa3773f9ce609c93b1cfd0ce8933 + md5: bc58fdbced45bb096364de0fba1637af + depends: + - brotli-bin 1.2.0 hfd05255_1 + - libbrotlidec 1.2.0 hfd05255_1 + - libbrotlienc 1.2.0 hfd05255_1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + size: 20342 + timestamp: 1764017988883 +- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-bin-1.2.0-hfd05255_1.conda + sha256: e76966232ef9612de33c2087e3c92c2dc42ea5f300050735a3c646f33bce0429 + md5: 6abd7089eb3f0c790235fe469558d190 + depends: + - libbrotlidec 1.2.0 hfd05255_1 + - libbrotlienc 1.2.0 hfd05255_1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: {} + size: 22714 + timestamp: 1764017952449 +- conda: https://conda.anaconda.org/conda-forge/win-64/brotli-python-1.2.0-py314he701e3d_1.conda + sha256: 6854ee7675135c57c73a04849c29cbebc2fb6a3a3bfee1f308e64bf23074719b + md5: 1302b74b93c44791403cbeee6a0f62a3 + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libbrotlicommon 1.2.0 hfd05255_1 + license: MIT + license_family: MIT + run_exports: {} + size: 335782 + timestamp: 1764018443683 +- conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda + sha256: 76dfb71df5e8d1c4eded2dbb5ba15bb8fb2e2b0fe42d94145d5eed4c75c35902 + md5: 4cb8e6b48f67de0b018719cdf1136306 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: bzip2-1.0.6 + license_family: BSD + run_exports: + weak: + - bzip2 >=1.0.8,<2.0a0 + size: 56115 + timestamp: 1771350256444 +- conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.6-hfd05255_0.conda + sha256: 5e1e2e24ce279f77e421fcc0e5846c944a8a75f7cf6158427c7302b02984291a + md5: 7c6da34e5b6e60b414592c74582e28bf + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - c-ares >=1.34.6,<2.0a0 + size: 193550 + timestamp: 1765215100218 +- conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h477c42c_1.conda + sha256: 9ee4ad706c5d3e1c6c469785d60e3c2b263eec569be0eac7be33fbaef978bccc + md5: 52ea1beba35b69852d210242dd20f97d + depends: + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.1,<79.0a0 + - libexpat >=2.7.3,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libglib >=2.86.3,<3.0a0 + - libpng >=1.6.53,<1.7.0a0 + - libzlib >=1.3.1,<2.0a0 + - pixman >=0.46.4,<1.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-only or MPL-1.1 + run_exports: + weak: + - cairo >=1.18.4,<2.0a0 + size: 1537783 + timestamp: 1766416059188 +- conda: https://conda.anaconda.org/conda-forge/win-64/cartopy-0.25.0-py314hd8fd7ce_1.conda + sha256: e5d13786c9629c3a83089ee46abd828cabdf2dcfe74ddcd4cfc0f2b1b7f67cbb + md5: f087cf669551d9c98b68869395f311f4 + depends: + - matplotlib-base >=3.6 + - numpy >=1.23,<3 + - packaging >=21 + - pyproj >=3.3.1 + - pyshp >=2.3 + - python >=3.14.0rc2,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - shapely >=2.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 1602977 + timestamp: 1756883888479 +- conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.1.0-py314h5a2d7ad_0.conda + sha256: cc87e3ddaedd546dec4be978422058cd323cd2e973e1e503edf01da18fc5ecd4 + md5: fbc8f87f9d7bad413932c7e7d9e45eb5 + depends: + - pycparser + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: {} + size: 348640 + timestamp: 1783424290792 +- conda: https://conda.anaconda.org/conda-forge/win-64/cftime-1.6.5-py314h2dcd201_1.conda + sha256: c3f5b0645a746dc520ceb30171c7e9938f61c57cffb0131085f0b42002d2f62c + md5: ed5f4a7e6c49c680bfe7f2ff0ec583be + depends: + - numpy >=1.21.2 + - numpy >=1.23,<3 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: {} + size: 377553 + timestamp: 1768511112844 +- conda: https://conda.anaconda.org/conda-forge/win-64/contourpy-1.3.3-py314hf309875_4.conda + sha256: f141bcbf8e490b49b2f53f517173d13a64d75e43cfae170e0d931cb0b66f4bce + md5: c26934035616f7d578f9da0491aed3d8 + depends: + - numpy >=1.25 + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 247437 + timestamp: 1769155978556 +- conda: https://conda.anaconda.org/conda-forge/win-64/cryptography-49.0.0-py314he884d78_0.conda + sha256: 7348f37f03538c7755824a39f33f6f30312e3349cd7b0a8b285a0bc377ba159e + md5: d8cfad425d09c7838d724f6c9501a1c4 + depends: + - cffi >=2.0 + - openssl >=3.5.7,<4.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT + license_family: BSD + run_exports: {} + size: 1662747 + timestamp: 1781385594371 +- conda: https://conda.anaconda.org/conda-forge/win-64/cytoolz-1.1.0-py314h5a2d7ad_2.conda + sha256: 04dca71339134390f2d76467070f02356efb7bf21408cdd45a868a94009e93b9 + md5: 8309b55a55dac8050260de935d31724a + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - toolz >=0.10.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 582082 + timestamp: 1771855937157 +- conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.21-py314hb98de8c_0.conda + sha256: daa9397ffba6722f27c21b2f0a02b197f3ba9baedb484a155539743ec5ea3ac3 + md5: 945786ac874b8e821a675fbdd885f844 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 4022782 + timestamp: 1780390190830 +- conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.18.1-hd47e2ca_0.conda + sha256: 9217184c4a8e82101b0e512b059ae3ff67e3913133b9031edad89ab5341284e4 + md5: abd79bad98c99c1a116154d6de74ea89 + depends: + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libiconv >=1.18,<2.0a0 + - libintl >=0.22.5,<1.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - fontconfig >=2.18.1,<3.0a0 + - fonts-conda-ecosystem + size: 202630 + timestamp: 1780450217840 +- conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.3-h57928b3_1.conda + sha256: a0e419e96146159f12344c870dca608d11bca36841f228092b986ffc2e1e0f02 + md5: e77293b32225b136a8be300f93d0e89f + depends: + - libfreetype 2.14.3 h57928b3_1 + - libfreetype6 2.14.3 hdbac1cb_1 + - zlib + license: GPL-2.0-only OR FTL + run_exports: + weak: + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + size: 185584 + timestamp: 1780934817461 +- conda: https://conda.anaconda.org/conda-forge/win-64/freexl-2.0.0-hf297d47_2.conda + sha256: 1e62cbc6daa74656034dc4a6e58faa2d50291719c1cba53cc0b1946f0d2b9404 + md5: d6a8059de245e53478b581742b53f71d + depends: + - libexpat >=2.6.4,<3.0a0 + - libiconv >=1.17,<2.0a0 + - minizip >=4.0.7,<5.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MPL-1.1 + license_family: MOZILLA + run_exports: + weak: + - freexl >=2.0.0,<3.0a0 + size: 77528 + timestamp: 1734015193826 +- conda: https://conda.anaconda.org/conda-forge/win-64/fribidi-1.0.16-hfd05255_0.conda + sha256: 15011071ee56c216ffe276c8d734427f1f893f275ef733f728d13f610ed89e6e + md5: c27bd87e70f970010c1c6db104b88b18 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-or-later + run_exports: + weak: + - fribidi >=1.0.16,<2.0a0 + size: 64394 + timestamp: 1757438741305 +- conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.14.1-hdade9fe_0.conda + sha256: 032a16d78e69a20ffae6216191a66977bc50f6c21cb75f9853b37298b95308c4 + md5: 8c75d7e401a4d799ce8d4bb922320967 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-only + run_exports: + weak: + - geos >=3.14.1,<3.14.2.0a0 + size: 1772787 + timestamp: 1761593910217 +- conda: https://conda.anaconda.org/conda-forge/win-64/getopt-win32-0.1-h6a83c73_3.conda + sha256: d04c4a6c11daa72c4a0242602e1d00c03291ef66ca2d7cd0e171088411d57710 + md5: 49c36fcad2e9af6b91e91f2ce5be8ebd + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: LGPL-3.0-only + license_family: LGPL + run_exports: + weak: + - getopt-win32 >=0.1,<0.1.1.0a0 + size: 26238 + timestamp: 1750744808182 +- conda: https://conda.anaconda.org/conda-forge/win-64/glib-2.88.2-h395db07_0.conda + sha256: b67107959a71dbf9f5c2e95511f18095d9ac6f0001f0de4a1b6e14282162989e + md5: 7d203837b88a2255b32dca555d37ca50 + depends: + - python * + - packaging + - libglib ==2.88.2 h7ce1215_0 + - glib-tools ==2.88.2 h74ecf4c_0 + - libintl-devel + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libintl >=0.22.5,<1.0a0 + license: LGPL-2.1-or-later + run_exports: + weak: + - libglib >=2.88.2,<3.0a0 + size: 75973 + timestamp: 1782463965040 +- conda: https://conda.anaconda.org/conda-forge/win-64/glib-tools-2.88.2-h74ecf4c_0.conda + sha256: c604b6ca42c6271f281b1c0616e0d50bd800f8fc913a91a2753c2551b3b6b16c + md5: 63c615f0c525ee64f72e557e583b6257 + depends: + - libglib ==2.88.2 h7ce1215_0 + - libffi + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libintl >=0.22.5,<1.0a0 + license: LGPL-2.1-or-later + run_exports: {} + size: 251644 + timestamp: 1782463965040 +- conda: https://conda.anaconda.org/conda-forge/win-64/google-crc32c-1.8.0-py314h720154c_1.conda + sha256: 85cd3ddabe68ed21d8cea6d1891e2f8314cedc1a83ed4d0d1becc404b9e196f8 + md5: a0a922d23c89200907da94cf4e2bdbaf + depends: + - libcrc32c >=1.1.2,<1.2.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 29230 + timestamp: 1768549336961 +- conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.15-hac47afa_0.conda + sha256: 88b6601f8edae59834b59b521e293ff3b58361dc1603240f5a8328c24e6936ad + md5: ff9a9bfe791f56b0227597a7651a6af0 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.0-or-later + license_family: LGPL + run_exports: + weak: + - graphite2 >=1.3.15,<2.0a0 + size: 97308 + timestamp: 1780454389458 +- conda: https://conda.anaconda.org/conda-forge/win-64/graphviz-14.1.2-h4c50273_0.conda + sha256: 58f83755509a19501a9efe40c484727ffa61fcfaf6a237870678a79638fa6982 + md5: afabed4c46b197b89eb974aa038d12db + depends: + - cairo >=1.18.4,<2.0a0 + - getopt-win32 >=0.1,<0.1.1.0a0 + - gts >=0.7.6,<0.8.0a0 + - libexpat >=2.7.3,<3.0a0 + - libgd >=2.3.3,<2.4.0a0 + - libglib >=2.86.3,<3.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - pango >=1.56.4,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: EPL-1.0 + license_family: Other + run_exports: + weak: + - graphviz >=14.1.2,<15.0a0 + size: 1223547 + timestamp: 1769427507016 +- conda: https://conda.anaconda.org/conda-forge/win-64/greenlet-3.5.3-py314hb98de8c_0.conda + sha256: 3e7382c137b987f4015d701afdfd8eaf580b24008a80bad80b2f51da437722ce + md5: 5a81d686e0ae1e9eff5081ea846b7cb4 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 249776 + timestamp: 1782524684535 +- conda: https://conda.anaconda.org/conda-forge/win-64/grpcio-1.78.1-py314h8eb4245_0.conda + sha256: aa68e206461b2f3321309357ecd241bcc9b48aecceff894aa320d5fc3343fe74 + md5: 8559baec771c97f3b19513a4205ebec6 + depends: + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libgrpc 1.78.1 h9ff2b3e_0 + - libzlib >=1.3.1,<2.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - typing-extensions >=4.12,<5 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 737503 + timestamp: 1774013721630 +- conda: https://conda.anaconda.org/conda-forge/win-64/gsw-3.6.23-h308a848_0.conda + noarch: python + sha256: d413bdf7527d748bf8fa1fc51a7d9879e4e6514d42c03b1cbf7bfc7099e22bf2 + md5: 9fadc8cb1b8aa6a4d4206bc321727305 + depends: + - python + - numpy + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - _python_abi3_support 1.* + - cpython >=3.11 + - numpy >=1.23,<3 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 2111790 + timestamp: 1782065474430 +- conda: https://conda.anaconda.org/conda-forge/win-64/gts-0.7.6-h6b5321d_4.conda + sha256: b79755d2f9fc2113b6949bfc170c067902bc776e2c20da26e746e780f4f5a2d4 + md5: a41f14768d5e377426ad60c613f2923b + depends: + - libglib >=2.76.3,<3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.0-or-later + license_family: LGPL + run_exports: + weak: + - gts >=0.7.6,<0.8.0a0 + size: 188688 + timestamp: 1686545648050 +- conda: https://conda.anaconda.org/conda-forge/win-64/h5py-3.16.0-nompi_py314hc249e69_102.conda + sha256: 34880617136bfe9c3946fe767c1fef470d62b5ecd177410443af7a1e7f0927fb + md5: a97e08636b7aa2bb61b820082e8f5e4c + depends: + - cached-property + - hdf5 >=1.14.6,<1.14.7.0a0 + - numpy >=1.23,<3 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 1097161 + timestamp: 1775581481450 +- conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-14.2.1-h57928b3_1.conda + sha256: c8bf564f2c415b82f056eff98b8967fb75c86821398998f20289397b5acf1ef7 + md5: e706de885f817f9832c56f1c9ad7ce71 + depends: + - libharfbuzz-devel 14.2.1 h03b5201_1 + license: MIT + license_family: MIT + run_exports: + weak: + - libharfbuzz >=14.2.1 + size: 11542 + timestamp: 1782801047786 +- conda: https://conda.anaconda.org/conda-forge/win-64/hdf4-4.2.15-h5557f11_7.conda + sha256: 52fa5dde69758c19c69ab68a3d7ebfb2c9042e3a55d405c29a59d3b0584fd790 + md5: 84344a916a73727c1326841007b52ca8 + depends: + - libjpeg-turbo >=3.0.0,<4.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - hdf4 >=4.2.15,<4.2.16.0a0 + size: 779637 + timestamp: 1695662145568 +- conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-1.14.6-nompi_hae35d4c_110.conda + sha256: 54f5211e698a468fd74def162e277d834e956c5b24a9ba4f9cf6298209328475 + md5: 4c94504a694781771108b07bf4a9370f + depends: + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.20.0,<9.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - hdf5 >=1.14.6,<1.14.7.0a0 + size: 2354049 + timestamp: 1780581446500 +- conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.3-h637d24d_0.conda + sha256: 1bda728d70a619731b278c859eda364146cb5b4b8c739a64da8128353d81d1c4 + md5: 0097b24800cb696915c3dbd1f5335d3f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - icu >=78.3,<79.0a0 + size: 14954024 + timestamp: 1773822508646 +- conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.5.0-py314hf309875_0.conda + sha256: 37cbc49fd7255532d09fb3bc9cc699554693e632fa90678a9b3d0ed12557d0d7 + md5: 0508c8dabeab91311e5c59b5e3f6d278 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 73330 + timestamp: 1773067062280 +- conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h719d79b_1.conda + sha256: c55745796e762ba9e817ab1fc0f21f1a049e202f90fa762df39578f37923f6c2 + md5: 00335c2c4a98656554771aaf6f1a7400 + depends: + - openssl >=3.5.7,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - krb5 >=1.22.2,<1.23.0a0 + size: 750320 + timestamp: 1781859644591 +- conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.19.1-hf2c6c5f_1.conda + sha256: 5ed63a32639a130564a870becb679fd52dfb816666a61ed3c023917389010480 + md5: 1df4012c8a2478699d07bc26af66d41e + depends: + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - lcms2 >=2.19.1,<3.0a0 + size: 523194 + timestamp: 1780211799997 +- conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.1.0-hd936e49_0.conda + sha256: 45df58fca800b552b17c3914cc9ab0d55a82c5172d72b5c44a59c710c06c5473 + md5: 54b231d595bc1ff9bff668dd443ee012 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - lerc >=4.1.0,<5.0a0 + size: 172395 + timestamp: 1773113455582 +- conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda + sha256: 7e7f3754f8afaabd946dc11d7c00fd1dc93f0388a2d226a7abf1bf07deab0e2b + md5: 60da39dd5fd93b2a4a0f986f3acc2520 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libabseil-static =20260107.1=cxx17* + - abseil-cpp =20260107.1 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - libabseil >=20260107.1,<20260108.0a0 + - libabseil =*=cxx17* + size: 1884784 + timestamp: 1770863303486 +- conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda + sha256: e54c08964262c73671d9e80e400333e59c617e0b454476ad68933c0c458156c8 + md5: 43b6385cfad52a7083f2c41984eb4e91 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - libaec >=1.1.5,<2.0a0 + size: 34463 + timestamp: 1769221960556 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.8-gpl_he24518a_100.conda + sha256: abeec1902a9933f71a70bb54a436897d54ea08b290f084c0ce511e4d7eb24548 + md5: e61cb5e50e73c4563c2427de40435171 + depends: + - bzip2 >=1.0.8,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - lzo >=2.10,<3.0a0 + - openssl >=3.5.7,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - libarchive >=3.8.8,<3.9.0a0 + size: 1117061 + timestamp: 1782289351052 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-24.0.0-hcc6a8f1_9_cpu.conda + build_number: 9 + sha256: 8af361336361b12b6e531e26e96d185dfcbcde26feaf0e1c7898644e6f69dc30 + md5: bd0e4a5f0d8d1dc0db924cddce4de654 + depends: + - aws-crt-cpp >=0.40.1,<0.40.2.0a0 + - aws-sdk-cpp >=1.11.833,<1.11.834.0a0 + - azure-core-cpp >=1.16.3,<1.16.4.0a0 + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + - azure-storage-blobs-cpp >=12.18.0,<12.18.1.0a0 + - azure-storage-files-datalake-cpp >=12.16.0,<12.16.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl >=8.20.0,<9.0a0 + - libgoogle-cloud >=3.6.0,<3.7.0a0 + - libgoogle-cloud-storage >=3.6.0,<3.7.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.3.0,<2.3.1.0a0 + - snappy >=1.2.2,<1.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - arrow-cpp <0.0a0 + - apache-arrow-proc =*=cpu + - parquet-cpp <0.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libarrow >=24.0.0,<24.1.0a0 + size: 4344246 + timestamp: 1782271559720 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-24.0.0-h7d8d6a5_9_cpu.conda + build_number: 9 + sha256: 46fcbf33d83c9ddad87a939096d15d4a9ea976806f70a16281a13313ac685f08 + md5: 1441d65c26c64d8d62d666886d5d588c + depends: + - libarrow 24.0.0 hcc6a8f1_9_cpu + - libarrow-compute 24.0.0 h081cd8e_9_cpu + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libarrow-acero >=24.0.0,<24.1.0a0 + size: 446567 + timestamp: 1782271818421 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-24.0.0-h081cd8e_9_cpu.conda + build_number: 9 + sha256: 9871879b789b8dd93a11ed82dfa29e68c6cdadf178e45531d02eef457e2f7876 + md5: 3a7eccb217cc3a731b5cca9f73d227b7 + depends: + - libarrow 24.0.0 hcc6a8f1_9_cpu + - libre2-11 >=2025.11.5 + - libutf8proc >=2.11.3,<2.12.0a0 + - re2 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libarrow-compute >=24.0.0,<24.1.0a0 + size: 1753130 + timestamp: 1782271648370 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-24.0.0-h7d8d6a5_9_cpu.conda + build_number: 9 + sha256: b88fea04fd71bfde49d51b3aac810ca912da4b93d2196df57c15d0a8194e2987 + md5: 5ef28e253eba8177f23d712158d71a4f + depends: + - libarrow 24.0.0 hcc6a8f1_9_cpu + - libarrow-acero 24.0.0 h7d8d6a5_9_cpu + - libarrow-compute 24.0.0 h081cd8e_9_cpu + - libparquet 24.0.0 h7051d1f_9_cpu + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libarrow-dataset >=24.0.0,<24.1.0a0 + size: 428201 + timestamp: 1782271931061 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-24.0.0-h524e9bd_9_cpu.conda + build_number: 9 + sha256: bebb48bcbd59eb5937fe8f6431541d27361d55f9b0848c828d2df1a53d3f47d4 + md5: 417e559fa9e0074bb9fe9940b04d3b4c + depends: + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 24.0.0 hcc6a8f1_9_cpu + - libarrow-acero 24.0.0 h7d8d6a5_9_cpu + - libarrow-dataset 24.0.0 h7d8d6a5_9_cpu + - libprotobuf >=6.33.5,<6.33.6.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libarrow-substrait >=24.0.0,<24.1.0a0 + size: 362117 + timestamp: 1782271978945 +- conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda + build_number: 8 + sha256: 43a87b59e6d4c68d80b2e4de487b1b54d66fe1f9a06636909b5a5ab9eae27269 + md5: 4a0ce24b1a946ff77ae9eaa7ef015a33 + depends: + - mkl >=2026.0.0,<2027.0a0 + constrains: + - libcblas 3.11.0 8*_mkl + - liblapacke 3.11.0 8*_mkl + - blas 2.308 mkl + - liblapack 3.11.0 8*_mkl + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libblas >=3.11.0,<4.0a0 + size: 68103 + timestamp: 1779859688049 +- conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda + sha256: 5097303c2fc8ebf9f9ea9731520aa5ce4847d0be41764edd7f6dee2100b82986 + md5: 444b0a45bbd1cb24f82eedb56721b9c4 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libbrotlicommon >=1.2.0,<1.3.0a0 + size: 82042 + timestamp: 1764017799966 +- conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda + sha256: 3239ce545cf1c32af6fffb7fc7c75cb1ef5b6ea8221c66c85416bb2d46f5cccb + md5: 450e3ae947fc46b60f1d8f8f318b40d4 + depends: + - libbrotlicommon 1.2.0 hfd05255_1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libbrotlidec >=1.2.0,<1.3.0a0 + size: 34449 + timestamp: 1764017851337 +- conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda + sha256: 3226df6b7df98734440739f75527d585d42ca2bfe912fbe8d1954c512f75341a + md5: ccd93cfa8e54fd9df4e83dbe55ff6e8c + depends: + - libbrotlicommon 1.2.0 hfd05255_1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libbrotlienc >=1.2.0,<1.3.0a0 + size: 252903 + timestamp: 1764017901735 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda + build_number: 8 + sha256: 2a5b6555b481df4603e44cba49a6ef727584fd2f3c5235dd4bcb3028fffbdfb5 + md5: 09f1d8e4d2675d34ad2acb115211d10c + depends: + - libblas 3.11.0 8_h8455456_mkl + constrains: + - liblapacke 3.11.0 8*_mkl + - blas 2.308 mkl + - liblapack 3.11.0 8*_mkl + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libcblas >=3.11.0,<4.0a0 + size: 68443 + timestamp: 1779859701498 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 + sha256: 75e60fbe436ba8a11c170c89af5213e8bec0418f88b7771ab7e3d9710b70c54e + md5: cd4cc2d0c610c8cb5419ccc979f2d6ce + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libcrc32c >=1.1.2,<1.2.0a0 + size: 25694 + timestamp: 1633684287072 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.21.0-h51a1c48_2.conda + sha256: e9a9231e6c04b82979a6a1a4f90b8a697dc3a42884e709dee8ba5d0355b45296 + md5: 88c875a8f34785d6f6185ceb646154fa + depends: + - krb5 >=1.22.2,<1.23.0a0 + - libpsl >=0.22.0,<0.23.0a0 + - libssh2 >=1.11.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: curl + license_family: MIT + run_exports: + weak: + - libcurl >=8.21.0,<9.0a0 + size: 404786 + timestamp: 1782911887650 +- conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda + sha256: 834e4881a18b690d5ec36f44852facd38e13afe599e369be62d29bd675f107ee + md5: e77030e67343e28b084fabd7db0ce43e + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libdeflate >=1.25,<1.26.0a0 + size: 156818 + timestamp: 1761979842440 +- conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda + sha256: af03882afb7a7135288becf340c2f0cf8aa8221138a9a7b108aaeb308a486da1 + md5: 25efbd786caceef438be46da78a7b5ef + depends: + - openssl >=3.1.1,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libevent >=2.1.12,<2.1.13.0a0 + size: 410555 + timestamp: 1685726568668 +- conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda + sha256: 1a54d874addda73b6f7164d5f3905821277a1831bcc05edd74b3085391688571 + md5: ccc490c81ffe14181861beac0e8f3169 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - expat 2.8.1.* + license: MIT + license_family: MIT + run_exports: {} + size: 71631 + timestamp: 1781203724164 +- conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.5.2-h3d046cb_0.conda + sha256: 59d01f2dfa8b77491b5888a5ab88ff4e1574c9359f7e229da254cdfe27ddc190 + md5: 720b39f5ec0610457b725eb3f396219a + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libffi >=3.5.2,<3.6.0a0 + size: 45831 + timestamp: 1769456418774 +- conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype-2.14.3-h57928b3_1.conda + sha256: 035d0c67bf9f7a16f4a1764f420c120f1a995d071bb265fcc66ef688ef709d7b + md5: e45b52fb9a81c9e2708465a706e05952 + depends: + - libfreetype6 >=2.14.3 + license: GPL-2.0-only OR FTL + run_exports: {} + size: 8711 + timestamp: 1780934891782 +- conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.3-hdbac1cb_1.conda + sha256: 0bbd19c9f7c4d0232b31892e6a4d1f82b8d19d1b84d89725f1f491b336447758 + md5: 4e4d54f9f98383d977ba56ef39ebf46d + depends: + - libpng >=1.6.58,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - freetype >=2.14.3 + license: GPL-2.0-only OR FTL + run_exports: {} + size: 340411 + timestamp: 1780934813224 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_19.conda + sha256: 80e80ef5e31b00b12539db3c5aaecde60dab91381abfc1060e323d5c3b016dce + md5: cc5d690fc1c629038f13c68e88e65f44 + depends: + - _openmp_mutex >=4.5 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + constrains: + - msys2-conda-epoch <0.0a0 + - libgcc-ng ==15.2.0=*_19 + - libgomp 15.2.0 h8ee18e1_19 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: {} + size: 821854 + timestamp: 1778273037795 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgd-2.3.3-h4974f7c_12.conda + sha256: 9ab562c718bd3fcef5f6189c8e2730c3d9321e05f13749a611630475d41207fc + md5: 3a5b40267fcd31f1ba3a24014fe92044 + depends: + - fontconfig >=2.15.0,<3.0a0 + - fonts-conda-ecosystem + - icu >=78.1,<79.0a0 + - libexpat >=2.7.3,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libjpeg-turbo >=3.1.2,<4.0a0 + - libpng >=1.6.53,<1.7.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - xorg-libxpm >=3.5.17,<4.0a0 + license: GD + license_family: BSD + run_exports: + weak: + - libgd >=2.3.3,<2.4.0a0 + size: 166711 + timestamp: 1766331770351 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.12.3-h9aca766_3.conda + sha256: 2449a09813033fd24bfbdac8e16c124b24d528490d11752676182a6628ca52f9 + md5: d91e85ddde53dec18e3bc9539d9535b7 + depends: + - blosc >=1.21.6,<2.0a0 + - geos >=3.14.1,<3.14.2.0a0 + - lerc >=4.1.0,<5.0a0 + - libarchive >=3.8.6,<3.9.0a0 + - libcurl >=8.19.0,<9.0a0 + - libdeflate >=1.25,<1.26.0a0 + - libexpat >=2.7.5,<3.0a0 + - libiconv >=1.18,<2.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - libjxl >=0.11,<0.12.0a0 + - libkml >=1.3.0,<1.4.0a0 + - liblzma >=5.8.2,<6.0a0 + - libpng >=1.6.57,<1.7.0a0 + - libspatialite >=5.1.0,<5.2.0a0 + - libsqlite >=3.52.0,<4.0a0 + - libwebp-base >=1.6.0,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libzlib >=1.3.2,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - muparser >=2.3.5,<2.4.0a0 + - openssl >=3.5.6,<4.0a0 + - pcre2 >=10.47,<10.48.0a0 + - proj >=9.7.1,<9.8.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - xerces-c >=3.3.0,<3.4.0a0 + - zstd >=1.5.7,<1.6.0a0 + constrains: + - libgdal 3.12.3.* + license: MIT + license_family: MIT + run_exports: + weak: + - libgdal-core >=3.12.3,<3.13.0a0 + size: 9783968 + timestamp: 1775714751480 +- conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.88.2-h7ce1215_0.conda + sha256: 20d4a182b8aa1d71b331579fae281bb3ccb1a199257ce15fadc53786031a7408 + md5: 5be116480ef34a5646894d7f7cd7ae41 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libintl >=0.22.5,<1.0a0 + - libzlib >=1.3.2,<2.0a0 + - libiconv >=1.18,<2.0a0 + - pcre2 >=10.47,<10.48.0a0 + - libffi >=3.5.2,<3.6.0a0 + constrains: + - glib >2.66 + license: LGPL-2.1-or-later + run_exports: + weak: + - libglib >=2.88.2,<3.0a0 + size: 4518265 + timestamp: 1782463965040 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_19.conda + sha256: 4dc958ced2fc7f42bc675b07e2c9abe3e150875ffdf62ca551d94fc6facf1fd7 + md5: f1147651e3fdd585e2f442c0c2fc8f2d + depends: + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + constrains: + - msys2-conda-epoch <0.0a0 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + run_exports: + strong: + - _openmp_mutex >=4.5 + - libgomp >=15.2.0 + size: 664640 + timestamp: 1778272979661 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-3.6.0-he22669a_0.conda + sha256: 11cb7ec822abcf6feedcd778f1f71d889b4c1b270949927aa468a6b24abe230d + md5: 24239981d980d39030515bc50f696e2f + depends: + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.20.0,<9.0a0 + - libgrpc >=1.78.1,<1.79.0a0 + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libgoogle-cloud 3.6.0 *_0 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - libgoogle-cloud >=3.6.0,<3.7.0a0 + size: 17255 + timestamp: 1781928103484 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-3.6.0-he04ea4c_0.conda + sha256: 5c62334045397f97437f7cb2d44672914eb2facc12839aaac87386f2aeebd05b + md5: 0f4a153aa13c9a98de0be992cfd9f6bb + depends: + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libgoogle-cloud 3.6.0 he22669a_0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - libgoogle-cloud-storage >=3.6.0,<3.7.0a0 + size: 17216 + timestamp: 1781928427840 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.78.1-h9ff2b3e_0.conda + sha256: e5667a557c6211db4e1de0bf3146b880977cd7447dce5e5f5cb7d9e3dc9afa70 + md5: 26dbb65607f8fe485df5ee98fa6eb79f + depends: + - c-ares >=1.34.6,<2.0a0 + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libre2-11 >=2025.11.5 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.5,<4.0a0 + - re2 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - grpc-cpp =1.78.1 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libgrpc >=1.78.1,<1.79.0a0 + size: 11546515 + timestamp: 1774013326223 +- conda: https://conda.anaconda.org/conda-forge/win-64/libharfbuzz-14.2.1-h03b5201_1.conda + sha256: 634a64cf43f1ce5a4139334bcdbde54d6854ae33d881ae1774377965e21051a5 + md5: 005469a341088900ca235892d3154c24 + depends: + - cairo >=1.18.4,<2.0a0 + - graphite2 >=1.3.15,<2.0a0 + - icu >=78.3,<79.0a0 + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libglib >=2.88.2,<3.0a0 + - libpng >=1.6.58,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: {} + size: 1008194 + timestamp: 1782801000396 +- conda: https://conda.anaconda.org/conda-forge/win-64/libharfbuzz-devel-14.2.1-h03b5201_1.conda + sha256: d04bac65245bf76ae23a18148b941d8215085d38a6d391971966ccda8a996b99 + md5: de077ebf9cbc0c1da6510fdf1bbc6baa + depends: + - cairo >=1.18.4,<2.0a0 + - freetype + - glib + - graphite2 >=1.3.15,<2.0a0 + - icu >=78.3,<79.0a0 + - libexpat >=2.8.1,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libglib >=2.88.2,<3.0a0 + - libharfbuzz 14.2.1 h03b5201_1 + - libpng >=1.6.58,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libharfbuzz >=14.2.1 + size: 321750 + timestamp: 1782801035822 +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.13.0-default_h049141e_1000.conda + sha256: 2ee12e37223dfcd0acd050c80a91150c482b6e2899198521e1800dce66662467 + md5: 6a01c986e30292c715038d2788aa1385 + depends: + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - libxml2 + - libxml2-16 >=2.14.6 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libhwloc >=2.13.0,<2.13.1.0a0 + size: 2396128 + timestamp: 1770954127918 +- conda: https://conda.anaconda.org/conda-forge/win-64/libhwy-1.4.0-h172a326_0.conda + sha256: 4b45bf59ee46d3c746272c27651da9ce709fda4eee8536c7424acea60d0e2ad0 + md5: aeca1cb6665f19e560c1fbd20b5bcf34 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 OR BSD-3-Clause + run_exports: + weak: + - libhwy >=1.4.0,<1.5.0a0 + size: 562583 + timestamp: 1776989522919 +- conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda + sha256: 0dcdb1a5f01863ac4e8ba006a8b0dc1a02d2221ec3319b5915a1863254d7efa7 + md5: 64571d1dd6cdcfa25d0664a5950fdaa2 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LGPL-2.1-only + run_exports: + weak: + - libiconv >=1.18,<2.0a0 + size: 696926 + timestamp: 1754909290005 +- conda: https://conda.anaconda.org/conda-forge/win-64/libintl-0.22.5-h5728263_3.conda + sha256: c7e4600f28bcada8ea81456a6530c2329312519efcf0c886030ada38976b0511 + md5: 2cf0cf76cc15d360dfa2f17fd6cf9772 + depends: + - libiconv >=1.17,<2.0a0 + license: LGPL-2.1-or-later + run_exports: + weak: + - libintl >=0.22.5,<1.0a0 + size: 95568 + timestamp: 1723629479451 +- conda: https://conda.anaconda.org/conda-forge/win-64/libintl-devel-0.22.5-h5728263_3.conda + sha256: be1f3c48bc750bca7e68955d57180dfd826d6f9fa7eb32994f6cb61b813f9a6a + md5: 7537784e9e35399234d4007f45cdb744 + depends: + - libiconv >=1.17,<2.0a0 + - libintl 0.22.5 h5728263_3 + license: LGPL-2.1-or-later + run_exports: + weak: + - libintl >=0.22.5,<1.0a0 + size: 40746 + timestamp: 1723629745649 +- conda: https://conda.anaconda.org/conda-forge/win-64/libjpeg-turbo-3.2.0-hfd05255_0.conda + sha256: 3d6635efa9497b9c5ba7957df8067c0a980d5cb10a6ea136931809eb410f8a99 + md5: cf219146d5bf2fee5907409ff9f5ac89 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - jpeg <0.0.0a + license: IJG AND BSD-3-Clause AND Zlib + run_exports: + weak: + - libjpeg-turbo >=3.2.0,<4.0a0 + size: 991057 + timestamp: 1783731990693 +- conda: https://conda.anaconda.org/conda-forge/win-64/libjxl-0.11.2-h932607e_1.conda + sha256: 4715e22c602526c85da09f73865676add67e0995a944b821fbff84547a9db533 + md5: 327bce3eb1ef1875c7145e915d25bcd3 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libhwy >=1.4.0,<1.5.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libjxl >=0.11,<1.0a0 + size: 1194926 + timestamp: 1777065171989 +- conda: https://conda.anaconda.org/conda-forge/win-64/libkml-1.3.0-h68a222c_1023.conda + sha256: 6b2c6506dc7d7bb3bc4128d575e4ae6c2cf18d3f9828a4be331e0b5e49edf108 + md5: b44e0d9eb84c6c086d809787aab0a1da + depends: + - libexpat >=2.7.5,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - uriparser >=0.9.8,<1.0a0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 1668156 + timestamp: 1777026660593 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda + build_number: 8 + sha256: 44999ed04bc0a56de44ee0ac8bd5b3702efd411a8b29491c0e3d3deb8619c94e + md5: d584799b920ecae9b75a2b70743a3de7 + depends: + - libblas 3.11.0 8_h8455456_mkl + constrains: + - libcblas 3.11.0 8*_mkl + - liblapacke 3.11.0 8*_mkl + - blas 2.308 mkl + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - liblapack >=3.11.0,<3.12.0a0 + size: 81027 + timestamp: 1779859714698 +- conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda + sha256: d636d1a25234063642f9c531a7bb58d84c1c496411280a36ea000bd122f078f1 + md5: 8f83619ab1588b98dd99c90b0bfc5c6d + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - xz 5.8.3.* + license: 0BSD + run_exports: + weak: + - liblzma >=5.8.3,<6.0a0 + size: 106486 + timestamp: 1775825663227 +- conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-hfd05255_1.conda + sha256: 40dcd0b9522a6e0af72a9db0ced619176e7cfdb114855c7a64f278e73f8a7514 + md5: e4a9fc2bba3b022dad998c78856afe47 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 89411 + timestamp: 1769482314283 +- conda: https://conda.anaconda.org/conda-forge/win-64/libnetcdf-4.10.1-nompi_he1c4404_200.conda + build_number: 100 + sha256: 74c18520802925d4623ae5f285ee3bc5b707d48b80fcd32d936df92065ec5701 + md5: 3ee891d82d25d3780749dee2cbb9b54a + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - zstd >=1.5.7,<1.6.0a0 + - libcurl >=8.21.0,<9.0a0 + - bzip2 >=1.0.8,<2.0a0 + - libzip >=1.11.2,<2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libaec >=1.1.5,<2.0a0 + - hdf5 >=1.14.6,<1.14.7.0a0 + - libzlib >=1.3.2,<2.0a0 + - hdf4 >=4.2.15,<4.2.16.0a0 + - blosc >=1.21.6,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libnetcdf >=4.10.1,<4.10.2.0a0 + size: 760930 + timestamp: 1783810940603 +- conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-1.27.0-hc88f397_0.conda + sha256: 61779880ca16472beb82806497d8806d8ebfb0d2f76b6dfdf8199b3318e172dd + md5: 23ccf8e4734ffa194b2c3b318c0b3e8f + depends: + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.20.0,<9.0a0 + - libgrpc >=1.78.1,<1.79.0a0 + - libopentelemetry-cpp-headers 1.27.0 h57928b3_0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.2,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.27.0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libopentelemetry-cpp >=1.27.0,<1.28.0a0 + size: 3563008 + timestamp: 1778721903212 +- conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-headers-1.27.0-h57928b3_0.conda + sha256: 12b0774d4cf6b45cfd27a8754428ab908cc928da684d24eb6e84b9f314e6c5a6 + md5: c661e9d8ebc6100d298f79b66fd078e0 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 434894 + timestamp: 1778721812996 +- conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-24.0.0-h7051d1f_9_cpu.conda + build_number: 9 + sha256: f825b0adc2085fdb7fbf6430bd8e8baec8840ffb068e7a8683bec45256e6f721 + md5: 1358f12ff71ab8552e77b5a6f1ecb500 + depends: + - libarrow 24.0.0 hcc6a8f1_9_cpu + - libthrift >=0.22.0,<0.22.1.0a0 + - openssl >=3.5.7,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libparquet >=24.0.0,<24.1.0a0 + size: 967219 + timestamp: 1782271781595 +- conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + sha256: 218913aeee391460bd0e341b834dbd9c6fa6ae0a4276c0c300266cc99a816a28 + md5: 52f1280563f3b48b5f75414cd2d15dd1 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.2,<2.0a0 + license: zlib-acknowledgement + run_exports: + weak: + - libpng >=1.6.58,<1.7.0a0 + size: 385227 + timestamp: 1776315248638 +- conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.33.5-h637c107_2.conda + sha256: b5ad018d96953534c4f1b513af3f73581e7e8fbfc7b54b3d67d40c05fb42885d + md5: 4493b928107c306fa19455841de1b4bb + depends: + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libprotobuf >=6.33.5,<6.33.6.0a0 + size: 6950375 + timestamp: 1783169980984 +- conda: https://conda.anaconda.org/conda-forge/win-64/libpsl-0.22.0-h25e0afd_1.conda + sha256: 040d4adabae2634b13183203e383c21f74ed98028b5d50bf9bae4968dd05aaa5 + md5: ba200e33e10ccf0d730c4ce87badbdf1 + depends: + - icu >=78.3,<79.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libpsl >=0.22.0,<0.23.0a0 + size: 72405 + timestamp: 1783937048984 +- conda: https://conda.anaconda.org/conda-forge/win-64/libraqm-0.10.5-h50d6d30_1.conda + sha256: 79ca55f7202daa560bffafcf7aef435e48618fe91a5243b8e4a6ed4edfbe63bc + md5: e5ab537cdd3462f26be2803209142913 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libharfbuzz >=14.2.1 + - fribidi >=1.0.16,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - libraqm >=0.10.5,<0.11.0a0 + size: 29296 + timestamp: 1782807186901 +- conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h04e5de1_1.conda + sha256: 7e26b7868b10e40bc441e00c558927835eacef7e5a39611c2127558edd660c8f + md5: 3d863f1a19f579ca511f6ac02038ab5a + depends: + - libabseil * cxx17* + - libabseil >=20260107.0,<20260108.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - re2 2025.11.05.* + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libre2-11 >=2025.11.5 + size: 266062 + timestamp: 1768190189553 +- conda: https://conda.anaconda.org/conda-forge/win-64/librttopo-1.1.0-haa95264_20.conda + sha256: d8d091afa0e5009b71e9a931da862a60104b75ca13c3021edf036620eebaf2d0 + md5: 7eeb5aed49853f8b3e1ca0463ef55a8e + depends: + - geos >=3.14.1,<3.14.2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: GPL-2.0-or-later + license_family: GPL + run_exports: + weak: + - librttopo >=1.1.0,<1.2.0a0 + size: 403088 + timestamp: 1761671197546 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.22-h6a83c73_1.conda + sha256: de45b71224da77a1c3a7dd48d8885eb957c9f05455d4f0828463293e7144330f + md5: 7d5abf7ca1bd00b43d273f44d93d05dc + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: ISC + run_exports: + weak: + - libsodium >=1.0.22,<1.0.23.0a0 + size: 280234 + timestamp: 1779164124739 +- conda: https://conda.anaconda.org/conda-forge/win-64/libspatialite-5.1.0-gpl_h0cd62ae_119.conda + sha256: c34dd6238ac4723b83b2155b18e7a91ce70dc80b422a50b19c4c713c7c6a8d80 + md5: c0eeff876d19f52efddccbd4887bb66f + depends: + - freexl >=2 + - freexl >=2.0.0,<3.0a0 + - geos >=3.14.1,<3.14.2.0a0 + - librttopo >=1.1.0,<1.2.0a0 + - libsqlite >=3.50.4,<4.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libxml2-devel + - libzlib >=1.3.1,<2.0a0 + - proj >=9.7.0,<9.8.0a0 + - sqlite + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zlib + license: MPL-1.1 + license_family: MOZILLA + run_exports: + weak: + - libspatialite >=5.1.0,<5.2.0a0 + size: 8671657 + timestamp: 1761681604524 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.3-hf5d6505_0.conda + sha256: 692dfb73a22c873656d5e393b8f1e2b019a3c8a6486c97cb6900552e64e38c25 + md5: 051f1b2228e7517a2ef8cca5146c8967 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + run_exports: + weak: + - libsqlite >=3.53.3,<4.0a0 + size: 1315909 + timestamp: 1782519131898 +- conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda + sha256: cbdf93898f2e27cefca5f3fe46519335d1fab25c4ea2a11b11502ff63e602c09 + md5: 9dce2f112bfd3400f4f432b3d0ac07b2 + depends: + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.5.0,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libssh2 >=1.11.1,<2.0a0 + size: 292785 + timestamp: 1745608759342 +- conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h2e43b2f_2.conda + sha256: 7ffb48755c4fc4a7cca454e4afea286e4fb47e50e153df1b006b14691f0f43d0 + md5: 42856184560e5cf901551fd414ad25c1 + depends: + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - libthrift >=0.22.0,<0.22.1.0a0 + size: 634136 + timestamp: 1777019194906 +- conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.2-h8f73337_0.conda + sha256: ec6d66308a6d6abaf3225f2f185113e6172e77eb0fa8622af982d7a5d6d47a2c + md5: e83f459471905a04ebe15e21d063c49d + depends: + - lerc >=4.1.0,<5.0a0 + - libdeflate >=1.25,<1.26.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: HPND + run_exports: + weak: + - libtiff >=4.7.2,<4.8.0a0 + size: 1014598 + timestamp: 1783085017197 +- conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda + sha256: 5d82af0779eab283416240da792a0d2fe4f8213c447e9f04aeaab1801468a90c + md5: 5f34fcb6578ea9bdbfd53cc2cfb88200 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libutf8proc >=2.11.3,<2.12.0a0 + size: 89061 + timestamp: 1768735187639 +- conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda + sha256: 7b6316abfea1007e100922760e9b8c820d6fc19df3f42fb5aca684cfacb31843 + md5: f9bbae5e2537e3b06e0f7310ba76c893 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libwebp 1.6.0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libwebp-base >=1.6.0,<2.0a0 + size: 279176 + timestamp: 1752159543911 +- conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda + sha256: 0fccf2d17026255b6e10ace1f191d0a2a18f2d65088fd02430be17c701f8ffe0 + md5: 8a86073cf3b343b87d03f41790d8b4e5 + depends: + - ucrt + constrains: + - pthreads-win32 <0.0a0 + - msys2-conda-epoch <0.0a0 + license: MIT AND BSD-3-Clause-Clear + run_exports: {} + size: 36621 + timestamp: 1759768399557 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda + sha256: 08dec73df0e161c96765468847298a420933a36bc4f09b50e062df8793290737 + md5: a69bbf778a462da324489976c84cfc8c + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - pthread-stubs + - ucrt >=10.0.20348.0 + - xorg-libxau >=1.0.11,<2.0a0 + - xorg-libxdmcp + license: MIT + license_family: MIT + run_exports: + weak: + - libxcb >=1.17.0,<2.0a0 + size: 1208687 + timestamp: 1727279378819 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.3-h3cfd58e_0.conda + sha256: 3b61ee3caba702d2ff432fa3920835db963026e5c99c4e6fdca0c6114f59e7ce + md5: 9e8dd0d90ed830107b2c36801035b7db + depends: + - icu >=78.3,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libxml2 2.15.3 + license: MIT + license_family: MIT + run_exports: {} + size: 519871 + timestamp: 1776376969852 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.3-h8ef44ab_0.conda + sha256: a4599c6bbbbdd7db570896e520c557eec8e66d94e839a59d17dc1f24a3d5f82b + md5: 95591ca5671d2213f5b2d5aa7818420d + depends: + - icu >=78.3,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2-16 2.15.3 h3cfd58e_0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libxml2 + - libxml2-16 >=2.15.3 + size: 43684 + timestamp: 1776376992865 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.3-h8ef44ab_0.conda + sha256: 1991b4e5e19b877b4cf01d9980957df1cc00dec94d7b93354a919ddaf8469582 + md5: 97b52e0d228b549e289445ab1238af7e + depends: + - icu >=78.3,<79.0a0 + - libiconv >=1.18,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libxml2 2.15.3 h8ef44ab_0 + - libxml2-16 2.15.3 h3cfd58e_0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libxml2 + - libxml2-16 >=2.15.3 + size: 123614 + timestamp: 1776377012113 +- conda: https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.43-h0fbe4c1_1.conda + sha256: 13da38939c2c20e7112d683ab6c9f304bfaf06230a2c6a7cf00359da1a003ec7 + md5: 46034d9d983edc21e84c0b36f1b4ba61 + depends: + - libxml2 + - libxml2-16 >=2.14.6 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: + weak: + - libxslt >=1.1.43,<2.0a0 + size: 420223 + timestamp: 1757963935611 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzip-1.11.2-h3135430_0.conda + sha256: 8ed49d8aa0ff908e16c82f92154174027c8906429e8b63d71f0b27ecc987b43e + md5: 09066edc7810e4bd1b41ad01a6cc4706 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libzip >=1.11.2,<2.0a0 + size: 146856 + timestamp: 1730442305774 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + sha256: 88609816e0cc7452bac637aaf65783e5edf4fee8a9f8e22bdc3a75882c536061 + md5: dbabbd6234dea34040e631f87676292f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - zlib 1.3.2 *_2 + license: Zlib + license_family: Other + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 58347 + timestamp: 1774072851498 +- conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.8-h4fa8253_0.conda + sha256: 50c02902bb516eeb56680358f052be38b5bf74b40e78ea4b2a675e84957e7307 + md5: de3551bf6508d45ca46b714639e52823 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - openmp 22.1.8|22.1.8.* + - intel-openmp <0.0a0 + license: Apache-2.0 WITH LLVM-exception + license_family: APACHE + run_exports: + strong: + - llvm-openmp >=22.1.8 + size: 348002 + timestamp: 1781737042070 +- conda: https://conda.anaconda.org/conda-forge/win-64/llvmlite-0.47.0-py314hb492ee6_1.conda + sha256: 9caf2c3ec4b747554421bbe0adb5e5dbfec45463638b7e3407d1ba02167bf472 + md5: ad66bb59a59cfa219311bf5072c1a087 + depends: + - libzlib >=1.3.2,<2.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 22909282 + timestamp: 1776076971549 +- conda: https://conda.anaconda.org/conda-forge/win-64/lxml-6.1.1-py314hcdb55d9_0.conda + sha256: 0592cfa3f24bf8fa1980bcdec0aba6f532118374ec859b7429f2458aad6ae0a9 + md5: 8aafd5987b9bcfe357c44787fe2ed8c2 + depends: + - libxml2 + - libxml2-16 >=2.14.6 + - libxslt >=1.1.43,<2.0a0 + - libzlib >=1.3.2,<2.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause and MIT-CMU + run_exports: {} + size: 1236191 + timestamp: 1779194955487 +- conda: https://conda.anaconda.org/conda-forge/win-64/lz4-4.4.5-py314hfc2a91f_1.conda + sha256: 764da65f49c2520ff5e2fdc8aaa57e94ca884dac58da2bdc294cb56950c63cec + md5: 8e9b2740fe44700706e8e4ca7e4fb8b6 + depends: + - python + - lz4-c + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + - lz4-c >=1.10.0,<1.11.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 47054 + timestamp: 1765026429237 +- conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h2466b09_1.conda + sha256: 632cf3bdaf7a7aeb846de310b6044d90917728c73c77f138f08aa9438fc4d6b5 + md5: 0b69331897a92fac3d8923549d48d092 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - lz4-c >=1.10.0,<1.11.0a0 + size: 139891 + timestamp: 1733741168264 +- conda: https://conda.anaconda.org/conda-forge/win-64/lzo-2.10-h6a83c73_1002.conda + sha256: 344f4f225c6dfb523fb477995545542224c37a5c86161f053a1a18fe547aa979 + md5: c5cb4159f0eea65663b31dd1e49bbb71 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: GPL-2.0-or-later + license_family: GPL + run_exports: + weak: + - lzo >=2.10,<3.0a0 + size: 165589 + timestamp: 1753889311940 +- conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-3.0.3-py314h2359020_1.conda + sha256: 02805a0f3cd168dbf13afc5e4aed75cc00fe538ce143527a6471485b36f5887c + md5: 8de7b40f8b30a8fcaa423c2537fe4199 + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 30022 + timestamp: 1772445159549 +- conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.11.0-py314hd0c49b1_1.conda + sha256: 94bc6fb3f0dc6337ca3b5dcb3d65da3ede1f24ce14d1e597ed83585bffe59dfc + md5: 99da493a14f3e26e8069e12281ce504f + depends: + - contourpy >=1.0.1 + - cycler >=0.10 + - fonttools >=4.22.0 + - freetype + - kiwisolver >=1.3.1 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libraqm >=0.10.5,<0.11.0a0 + - numpy >=1.23 + - numpy >=1.25,<3 + - packaging >=20.0 + - pillow >=8 + - pyparsing >=2.3.1 + - python >=3.14,<3.15.0a0 + - python-dateutil >=2.7 + - python_abi 3.14.* *_cp314 + - qhull >=2020.2,<2020.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: PSF-2.0 + license_family: PSF + run_exports: {} + size: 8747069 + timestamp: 1782829728451 +- conda: https://conda.anaconda.org/conda-forge/win-64/minizip-4.2.2-h0ffbb96_0.conda + sha256: 1c0c9b720b5dc860cc8a127d925c161d234a8a3ca4a10cea5038bfa548315557 + md5: 431ad376b1c4e5306a8ceb6b7278de41 + depends: + - bzip2 >=1.0.8,<2.0a0 + - liblzma >=5.8.3,<6.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: Zlib + license_family: Other + run_exports: + weak: + - minizip >=4.2.2,<5.0a0 + size: 106476 + timestamp: 1782851531134 +- conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2026.1.0-hac47afa_233.conda + sha256: ff355522fb0b6e33841167d9ca749147c8734d8be07b63b2ce25b0db043f42ed + md5: 5afbf28c4ca3e05b5469dbbd78c8e704 + depends: + - llvm-openmp >=22.1.8 + - onemkl-license 2026.1.0 h57928b3_233 + - tbb >=2023.0.0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + run_exports: {} + size: 114592547 + timestamp: 1783700769546 +- conda: https://conda.anaconda.org/conda-forge/win-64/msgpack-python-1.2.1-py314hf309875_1.conda + sha256: 548f4b23229abf8503b1e28438682e79a82ed0f2081a0c5ddfadb49e721b5022 + md5: 2a6b2dce5b76d32c67d11fcdd88ef037 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 89771 + timestamp: 1782460807585 +- conda: https://conda.anaconda.org/conda-forge/win-64/muparser-2.3.5-he0c23c2_0.conda + sha256: 57f78d8cd9a282d03cd7a7ffb1f42d570e1bbfb42d606e99de5c16e089067185 + md5: 013aabb169d59009bdf7d70319360e9b + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + run_exports: + weak: + - muparser >=2.3.5,<2.4.0a0 + size: 148557 + timestamp: 1747117340968 +- conda: https://conda.anaconda.org/conda-forge/win-64/netcdf4-1.7.4-nompi_py311h4277b3b_109.conda + noarch: python + sha256: de1bb01a4672b9e7b5e076bdfaee9db97a85592bdc0989c5530b08c1fc98188c + md5: 080a972649746b7a72d0808edfbfa0ea + depends: + - python + - certifi + - cftime + - numpy + - packaging + - hdf5 + - libnetcdf + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - hdf5 >=1.14.6,<1.14.7.0a0 + - _python_abi3_support 1.* + - cpython >=3.11 + - libnetcdf >=4.10.1,<4.10.2.0a0 + - numpy >=1.23,<3 + - libzlib >=1.3.2,<2.0a0 + license: MIT + run_exports: {} + size: 955064 + timestamp: 1783865866891 +- conda: https://conda.anaconda.org/conda-forge/win-64/nh3-0.3.6-py310ha413424_0.conda + noarch: python + sha256: aa8dffddfc42df86a87020294d4cb632b2e352dd1185cffd8b712afaaf28c531 + md5: 7a350d783a61aaa5adffbc6c43897600 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - _python_abi3_support 1.* + - cpython >=3.10 + license: MIT + license_family: MIT + run_exports: {} + size: 600627 + timestamp: 1782129887550 +- conda: https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.12.0-h5112557_1.conda + sha256: 045edd5d571c235de67472ad8fe03d9706b8426c4ba9a73f408f946034b6bc5e + md5: 24a9dde77833cc48289ef92b4e724da4 + constrains: + - nlohmann_json-abi ==3.12.0 + license: MIT + license_family: MIT + run_exports: {} + size: 134870 + timestamp: 1758194302226 +- conda: https://conda.anaconda.org/conda-forge/win-64/numba-0.65.1-py314h36f8cf2_1.conda + sha256: 3998df5608bb2309ac7857bfb6b2f2d804f2f10d5e62173db0aada1660346705 + md5: b7a863d5eaa15a4fb5970165f413f411 + depends: + - llvmlite >=0.47.0,<0.48.0a0 + - numpy >=1.22.3,<2.5 + - numpy >=1.23,<3 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - cudatoolkit >=11.2 + - libopenblas !=0.3.6 + - cuda-python >=11.6 + - scipy >=1.0 + - cuda-version >=11.2 + - tbb >=2021.6.0 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 5787391 + timestamp: 1778390612597 +- conda: https://conda.anaconda.org/conda-forge/win-64/numcodecs-0.16.5-py314hd8fd7ce_0.conda + sha256: 5181c402d78704f3d2ae5797262dd3459fd4d4ca9a49d3f48278aea09a932817 + md5: 04b1473b12a9e487fa9c085223095b0d + depends: + - deprecated + - msgpack-python + - numpy >=1.23,<3 + - numpy >=1.24 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - typing_extensions + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: {} + size: 519894 + timestamp: 1764782737019 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.6-py314h02f10f6_0.conda + sha256: de0eee21d902fb45a58454e3739e04ede7d02bf7575ca0ae9f959f20fa15c76b + md5: df95e6c7325bbae2571e5cef5f9c8096 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - libblas >=3.9.0,<4.0a0 + - python_abi 3.14.* *_cp314 + constrains: + - numpy-base <0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - numpy >=1.23,<3 + size: 7318163 + timestamp: 1779169232086 +- conda: https://conda.anaconda.org/conda-forge/win-64/onemkl-license-2026.1.0-h57928b3_233.conda + sha256: 96dec1c878d6e6f835be8ed57152a37be9a5104ac79c2425815d71c64cf13ee4 + md5: 1566e2ce8c3bc23a2feb866c4d9e91e3 + license: LicenseRef-IntelSimplifiedSoftwareOct2022 + license_family: Proprietary + run_exports: {} + size: 53362 + timestamp: 1783700628723 +- conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h0e57b4f_0.conda + sha256: 24342dee891a49a9ba92e2018ec0bde56cc07fdaec95275f7a55b96f03ea4252 + md5: e723ab7cc2794c954e1b22fde51c16e4 + depends: + - libpng >=1.6.55,<1.7.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-2-Clause + license_family: BSD + run_exports: + weak: + - openjpeg >=2.5.4,<3.0a0 + size: 245594 + timestamp: 1772624841727 +- conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda + sha256: cb6e7ba0d010ee0d3249ce9886de3d7613d26d9965d4c95666fa66b9c4c31001 + md5: e99f95734a326c0fd4d02bbd995150d4 + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - openssl >=3.6.3,<4.0a0 + size: 9414790 + timestamp: 1781071745579 +- conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda + sha256: f65b96be3790bdb90195226dfbcac2025b680bdffdbedc7e87d919161a63f8a7 + md5: 1e03f610c02a16fdd7fee7430ec23115 + depends: + - tzdata + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - snappy >=1.2.2,<1.3.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.1,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + license: Apache-2.0 + license_family: APACHE + run_exports: + weak: + - orc >=2.3.0,<2.3.1.0a0 + size: 1438607 + timestamp: 1773230254230 +- conda: https://conda.anaconda.org/conda-forge/win-64/pandas-3.0.3-py314hf700ef7_0.conda + sha256: 7f9912ba70e53805432f8e3a980fec5d13fe851989f68a70889394a2b4438ac2 + md5: 33451badee17d4162840339efdab40ad + depends: + - python + - numpy >=1.26.0 + - python-dateutil >=2.8.2 + - python-tzdata + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + - numpy >=1.23,<3 + constrains: + - adbc-driver-postgresql >=1.2.0 + - adbc-driver-sqlite >=1.2.0 + - beautifulsoup4 >=4.12.3 + - blosc >=1.21.3 + - bottleneck >=1.4.2 + - fastparquet >=2024.11.0 + - fsspec >=2024.10.0 + - gcsfs >=2024.10.0 + - html5lib >=1.1 + - hypothesis >=6.116.0 + - jinja2 >=3.1.5 + - lxml >=5.3.0 + - matplotlib >=3.9.3 + - numba >=0.60.0 + - numexpr >=2.10.2 + - odfpy >=1.4.1 + - openpyxl >=3.1.5 + - psycopg2 >=2.9.10 + - pyarrow >=13.0.0 + - pyiceberg >=0.8.1 + - pymysql >=1.1.1 + - pyqt5 >=5.15.9 + - pyreadstat >=1.2.8 + - pytables >=3.10.1 + - pytest >=8.3.4 + - pytest-xdist >=3.6.1 + - python-calamine >=0.3.0 + - pytz >=2024.2 + - pyxlsb >=1.0.10 + - qtpy >=2.4.2 + - scipy >=1.14.1 + - s3fs >=2024.10.0 + - sqlalchemy >=2.0.36 + - tabulate >=0.9.0 + - xarray >=2024.10.0 + - xlrd >=2.0.1 + - xlsxwriter >=3.2.0 + - zstandard >=0.23.0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 14062915 + timestamp: 1778602665890 +- conda: https://conda.anaconda.org/conda-forge/win-64/pango-1.56.4-h13911b6_1.conda + sha256: 3d4e6e541e633f6fd22fc2c1d79ad5ec39503dea3ba04fc3e01d5be904ec7cea + md5: 1f1cf3772ba7d4eef989e4679ddf97f7 + depends: + - cairo >=1.18.4,<2.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - fribidi >=1.0.16,<2.0a0 + - harfbuzz >=13.2.1 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 + - libglib >=2.86.4,<3.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LGPL-2.1-or-later + run_exports: + weak: + - pango >=1.56.4,<2.0a0 + size: 454919 + timestamp: 1774282149607 +- conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda + sha256: 3e9e02174edf02cb4bcdd75668ad7b74b8061791a3bc8bdb8a52ae336761ba3e + md5: 77eaf2336f3ae749e712f63e36b0f0a1 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - pcre2 >=10.47,<10.48.0a0 + size: 995992 + timestamp: 1763655708300 +- conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.3.0-py314h61b30b5_0.conda + sha256: c9dc3212ed0021974541072ee3765a5097a0721191c34ee485d7d7e94449648f + md5: 09b8e6ac8f4a257b59e5d3025f3c9c1d + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libwebp-base >=1.6.0,<2.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - openjpeg >=2.5.4,<3.0a0 + - lcms2 >=2.19.1,<3.0a0 + - libxcb >=1.17.0,<2.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - zlib-ng >=2.3.3,<2.4.0a0 + license: HPND + run_exports: {} + size: 989058 + timestamp: 1782912129930 +- conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda + sha256: 246fce4706b3f8b247a7d6142ba8d732c95263d3c96e212b9d63d6a4ab4aff35 + md5: 08c8fa3b419df480d985e304f7884d35 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + run_exports: + weak: + - pixman >=0.46.4,<1.0a0 + size: 542795 + timestamp: 1754665193489 +- conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.7.1-hd30e2cd_3.conda + sha256: 8ff06eae963bdc7580ccb246df911614e9a5a23683b26326df76b1b6f3258e94 + md5: f2b0478a02d35bac5b872d4d63b96be3 + depends: + - sqlite + - libtiff + - libcurl + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libsqlite >=3.51.2,<4.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libcurl >=8.18.0,<9.0a0 + constrains: + - proj4 ==999999999999 + license: MIT + license_family: MIT + run_exports: + weak: + - proj >=9.7.1,<9.8.0a0 + size: 3084268 + timestamp: 1770890802564 +- conda: https://conda.anaconda.org/conda-forge/win-64/prometheus-cpp-1.3.0-hcea2f5d_0.conda + sha256: ed08acd2ce6c69063693193450df89e8695e8b1251b399d34fb56ab45d900cbc + md5: 128297355faf0afcb84e22e43d472101 + depends: + - libcurl >=8.10.1,<9.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - zlib + license: MIT + license_family: MIT + run_exports: + weak: + - prometheus-cpp >=1.3.0,<1.4.0a0 + size: 183665 + timestamp: 1730769570131 +- conda: https://conda.anaconda.org/conda-forge/win-64/protobuf-6.33.5-py314h6a447be_2.conda + sha256: c9f63ba6600618d805c14fa0a146abfc4fd06f1e400462dd8492125225095954 + md5: 1ac0ec70143e747ca607074570b732f6 + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - libprotobuf 6.33.5 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 498409 + timestamp: 1773266588160 +- conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.2-py314hc5dbbe4_0.conda + sha256: 17c8274ce5a32c9793f73a5a0094bd6188f3a13026a93147655143d4df034214 + md5: fd539ac231820f64066839251aa9fa48 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 249950 + timestamp: 1769678167309 +- conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda + sha256: 7e446bafb4d692792310ed022fe284e848c6a868c861655a92435af7368bae7b + md5: 3c8f2573569bb816483e5cf57efbbe29 + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + run_exports: {} + size: 9389 + timestamp: 1726802555076 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-24.0.0-py314h86ab7b2_0.conda + sha256: fdf414b7269ed3474c381689344ad71a626541c1354967f9d595398a3d384198 + md5: 152580a594ef1924366fe6a934dac602 + depends: + - libarrow-acero 24.0.0.* + - libarrow-dataset 24.0.0.* + - libarrow-substrait 24.0.0.* + - libparquet 24.0.0.* + - pyarrow-core 24.0.0 *_0_* + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 27124 + timestamp: 1776928424429 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-24.0.0-py314h159fc0c_0_cpu.conda + sha256: ce48dc60dc471037d2d97c1104b443cb2e8edb06dbd827804a8409ac28a5b912 + md5: c4ee1bdf0e766307d105eafbcb720035 + depends: + - libarrow 24.0.0.* *cpu + - libarrow-compute 24.0.0.* *cpu + - libzlib >=1.3.2,<2.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + constrains: + - apache-arrow-proc * cpu + - numpy >=1.23,<3 + - libprotobuf >=6.33.5 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 3670958 + timestamp: 1776928382916 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyproj-3.7.2-py314h839d035_3.conda + sha256: 7b16c84b574604d9b9b9ae24055f81447bf560a1431c93dd02d6f20d9d2f8c72 + md5: 1a5451c54dbd3676f85e297e82d13d07 + depends: + - python + - proj + - certifi + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - proj >=9.7.1,<9.8.0a0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 901573 + timestamp: 1772623279160 +- conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.6-h4b44e0e_100_cp314.conda + build_number: 100 + sha256: f1acb89cb1a6bec9a94ae9f8e7411839de009cd64d3ac6a6aec4f3d8a481099a + md5: 8333e3ca6f8d1ebcd30b678dd53f0a25 + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.8.1,<3.0a0 + - libffi >=3.5.2,<3.6.0a0 + - liblzma >=5.8.3,<6.0a0 + - libmpdec >=4.0.0,<5.0a0 + - libsqlite >=3.53.2,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.7,<4.0a0 + - python_abi 3.14.* *_cp314 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - zstd >=1.5.7,<1.6.0a0 + license: Python-2.0 + run_exports: + weak: + - python_abi 3.14.* *_cp314 + noarch: + - python + size: 18481352 + timestamp: 1781256034828 + python_site_packages_path: Lib/site-packages +- conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-312-py314hcaaf0b2_0.conda + sha256: 71f9617186f5e2273bcefc4f3a258df5784886077ad36fe14f1d16b1c2c506eb + md5: 4d49ac91c23c4b1878daf5ea9e7c767a + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: PSF-2.0 + license_family: PSF + run_exports: {} + size: 4472831 + timestamp: 1781362876741 +- conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda + sha256: 048e20641da680aedaab285640a2aca56b7b5baf7a18f8f164f2796e13628c1f + md5: dd84e8748bd3c85a5c751b0576488080 + depends: + - python >=3.14.0rc3,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - winpty + license: MIT + license_family: MIT + run_exports: {} + size: 216325 + timestamp: 1759557436167 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyyaml-6.0.3-py314h2359020_1.conda + sha256: a2aff34027aa810ff36a190b75002d2ff6f9fbef71ec66e567616ac3a679d997 + md5: 0cd9b88826d0f8db142071eb830bce56 + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - yaml >=0.2.5,<0.3.0a0 + license: MIT + license_family: MIT + run_exports: {} + size: 181257 + timestamp: 1770223460931 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312h343a6d4_3.conda + noarch: python + sha256: d7e65c44ea8a92f80cc0e424b4b7dbe63b8a9ec04ea774b7d4f7aed4c34cce4c + md5: ebbda9a4e5161d6e1f98146ad057dc10 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - _python_abi3_support 1.* + - cpython >=3.12 + - zeromq >=4.3.5,<4.3.6.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 182831 + timestamp: 1779483925948 +- conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda + sha256: 887d53486a37bd870da62b8fa2ebe3993f912ad04bd755e7ed7c47ced97cbaa8 + md5: 854fbdff64b572b5c0b470f334d34c11 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: LicenseRef-Qhull + run_exports: + weak: + - qhull >=2020.2,<2020.3.0a0 + size: 1377020 + timestamp: 1720814433486 +- conda: https://conda.anaconda.org/conda-forge/win-64/rasterio-1.5.0-py314h807bb43_0.conda + sha256: 79ec1034ea7d85eb5d4c6f7bca4bf13a109ac26bd4936057d2ec419df5ac4d5b + md5: bec04a840694000666e487dbec1e3e03 + depends: + - affine + - attrs + - certifi + - click >=4,!=8.2.* + - click-plugins + - cligj >=0.5 + - libgdal-core >=3.12.1,<3.13.0a0 + - numpy >=1.23,<3 + - proj >=9.7.1,<9.8.0a0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - setuptools >=0.9.8 + - snuggs >=1.4.1 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 8198507 + timestamp: 1767633074010 +- conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_1.conda + sha256: 345b1ed8288d81510101f886aaf547e3294370e5dab340c4c3fcb0b25e5d99e0 + md5: 6807f05dcf3f1736ad6cc9525b8b8725 + depends: + - libre2-11 2025.11.05 h04e5de1_1 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - libre2-11 >=2025.11.5 + - re2 + size: 220305 + timestamp: 1768190225351 +- conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-2026.6.3-py314hc980628_0.conda + sha256: ac1047c2a9bb3dc7cac31b7c995a7b25f9a4eb52ee8ae106ca6e6c15679f34fc + md5: 52429bdb1752b43f8364bc482cf65fda + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 217789 + timestamp: 1782831449604 +- conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.9.0-np2py314h1b5b07a_0.conda + sha256: 3e30cc784bd5af6aa035807e5c2f12a1ecbc298d755561f6ce968b3b598b940a + md5: 74bafde39f688cb95c111e74bfad6669 + depends: + - python + - numpy >=1.24.1 + - scipy >=1.10.0 + - joblib >=1.4.0 + - threadpoolctl >=3.5.0 + - narwhals >=2.0.1 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.23,<3 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 9411356 + timestamp: 1780401101875 +- conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.18.0-py314h221f224_0.conda + sha256: 952db1642d707d2572b511b1207bfd8e8c114fdc99930c400b547eb8ab92ac19 + md5: a925cfb1429da2b1312c86516ae7c418 + depends: + - libblas >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 + - numpy <2.7 + - numpy >=1.23,<3 + - numpy >=2.0.0 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 15353018 + timestamp: 1781914001107 +- conda: https://conda.anaconda.org/conda-forge/win-64/shapely-2.1.2-py314h76f3c27_2.conda + sha256: ffc9c4b2fae82b4dfb14fe6d4b95382d9e6d88fd01f8eb9fbf6f7d2bef65ea35 + md5: c5a64ac49215efe79837adbd7e42b605 + depends: + - geos >=3.14.1,<3.14.2.0a0 + - numpy >=1.23,<3 + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 614463 + timestamp: 1762523809485 +- conda: https://conda.anaconda.org/conda-forge/win-64/snappy-1.2.2-h7fa0ca8_1.conda + sha256: d2deda1350abf8c05978b73cf7fe9147dd5c7f2f9b312692d1b98e52efad53c3 + md5: 3075846de68f942150069d4289aaad63 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - snappy >=1.2.2,<1.3.0a0 + size: 67417 + timestamp: 1762948090450 +- conda: https://conda.anaconda.org/conda-forge/win-64/sqlalchemy-2.0.51-py314hc5dbbe4_0.conda + sha256: 55e98a0f4e491151ffad7c274d22dfb2d999d50cafa606ec649eff29f079591b + md5: 920cf560266c77de21a8f55e7d0e0329 + depends: + - python + - greenlet !=0.4.17 + - typing-extensions >=4.6.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 3986755 + timestamp: 1781547909164 +- conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.53.3-hdb435a2_0.conda + sha256: 700391bf405117eb5c766c4b506f23d3a31f56191ca6619d1b8e5c715376bb7f + md5: 7a28cb97617f0bd6a650b4b88f1f44cb + depends: + - libsqlite 3.53.3 hf5d6505_0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: blessing + run_exports: + weak: + - libsqlite >=3.53.3,<4.0a0 + size: 426871 + timestamp: 1782519137996 +- conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda + sha256: 8a4053839b8e997a5965e2dff7d6cf3c77be62d82c0e48c8a04a5ed2d2e73035 + md5: 8ee01a693aecff5432069eaaf1183c45 + depends: + - libhwloc >=2.13.0,<2.13.1.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: APACHE + run_exports: {} + size: 156515 + timestamp: 1778673901757 +- conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + sha256: 0e79810fae28f3b69fe7391b0d43f5474d6bd91d451d5f2bde02f55ae481d5e3 + md5: 0481bfd9814bf525bd4b3ee4b51494c4 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: TCL + license_family: BSD + run_exports: + weak: + - tk >=8.6.13,<8.7.0a0 + size: 3526350 + timestamp: 1769460339384 +- conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.7-py314h5a2d7ad_0.conda + sha256: 6b9f5a195ca148f7c6b9a4a0a026631979b3112c43cd7c1064085ff833dfa4f0 + md5: b1b9bf11a82e608c5649d7462de94c5f + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 919275 + timestamp: 1781006902968 +- conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda + sha256: 3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5 + md5: 71b24316859acd00bdb8b38f5e2ce328 + constrains: + - vc14_runtime >=14.29.30037 + - vs2015_runtime >=14.29.30037 + license: LicenseRef-MicrosoftWindowsSDK10 + run_exports: {} + size: 694692 + timestamp: 1756385147981 +- conda: https://conda.anaconda.org/conda-forge/win-64/ujson-5.13.0-py314hb98de8c_0.conda + sha256: 40d9682b465a20acbffe4e075a8cac4471d6d0ef01089fcea6701c931f61eae5 + md5: 0d41e522e46805227a3f8fd1b243db34 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 51629 + timestamp: 1781561644996 +- conda: https://conda.anaconda.org/conda-forge/win-64/ukkonen-1.1.0-py314h909e829_0.conda + sha256: 96990a5948e0c30788360836d94bf6145fdac0c187695ed9b3c2d61d9e11d267 + md5: 54e012b629ac5a40c9b3fa32738375dc + depends: + - cffi + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + run_exports: {} + size: 18504 + timestamp: 1769438844417 +- conda: https://conda.anaconda.org/conda-forge/win-64/unicodedata2-17.0.1-py314h5a2d7ad_0.conda + sha256: 9041e463044944460f73f9528f2ec491180f0ffe857e3555aa8160b81050b8d9 + md5: d6b580a13384df5155c6ca19ee66854e + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + run_exports: {} + size: 406126 + timestamp: 1770909191618 +- conda: https://conda.anaconda.org/conda-forge/win-64/uriparser-0.9.8-h5a68840_0.conda + sha256: ed0eed8ed0343d29cdbfaeb1bfd141f090af696547d69f91c18f46350299f00d + md5: 28b4cf9065681f43cc567410edf8243d + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - uriparser >=0.9.8,<1.0a0 + size: 49181 + timestamp: 1715010467661 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.5-h1b7c187_39.conda + sha256: 17693b60cb54f80c60275f003f3bfc1b128af56dbfd65c4fae37c64eeb755ce1 + md5: 2eacea63f545b97342da520df6854276 + depends: + - vc14_runtime >=14.51.36231 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 20362 + timestamp: 1781320968457 +- conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda + sha256: 8153ed849c92e891eacac0f2f8d7ecb79f9b5fd7f7917fbb896f252a60a40390 + md5: 06a5bf5a1ca16cce0df6eaa91fc42bc2 + depends: + - ucrt >=10.0.20348.0 + - vcomp14 14.51.36231 h1b9f54f_39 + constrains: + - vs2015_runtime 14.51.36231.* *_39 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + run_exports: {} + size: 737434 + timestamp: 1781320964561 +- conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda + sha256: 07fb14713c4bc62e2533a2e23a363abfb0e65650681fba0ae4c840e2219350f3 + md5: 8b53a83fda40ec679e4d63fa32fae989 + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.51.36231.* *_39 + license: LicenseRef-MicrosoftVisualCpp2015-2022Runtime + license_family: Proprietary + run_exports: + strong: + - vcomp14 >=14.51.36231 + size: 120684 + timestamp: 1781320948530 +- conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.51.36231-h84cd919_39.conda + sha256: 6de6c2cf008fc2dce61060b583f2d8494c83883106952b201381b6b0505f03d7 + md5: 2ccc63d7b7d066a814ed9f99072832d7 + depends: + - vc14_runtime >=14.51.36231 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 20355 + timestamp: 1781320968804 +- conda: https://conda.anaconda.org/conda-forge/win-64/watchfiles-1.2.0-py314hc980628_1.conda + sha256: 262150bdbbecbe49096ef90b8233412d6134f4d43168e7e5c530d8b3252f6cb4 + md5: 5654b0a18935e2baecb89e33e2d6a530 + depends: + - python + - anyio >=3.0.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: MIT + license_family: MIT + run_exports: {} + size: 351309 + timestamp: 1781180337205 +- conda: https://conda.anaconda.org/conda-forge/win-64/websockets-16.1-py314h13f4da2_0.conda + sha256: e9185e045e985e8982c943a0dbfd945ec670797cfd214085cc703562af1672c7 + md5: d3bc29bf51308e52f9b980a0e627ff39 + depends: + - python + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - python_abi 3.14.* *_cp314 + license: BSD-3-Clause + license_family: BSD + run_exports: {} + size: 445393 + timestamp: 1783694747700 +- conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 + sha256: 9df10c5b607dd30e05ba08cbd940009305c75db242476f4e845ea06008b0a283 + md5: 1cee351bf20b830d991dbe0bc8cd7dfe + license: MIT + license_family: MIT + run_exports: {} + size: 1176306 +- conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-2.2.2-py314h5a2d7ad_0.conda + sha256: 93cbcaf37eff31ccb2cdaca883f8be991e7c5098b925e8372c3ac615fef47197 + md5: db00af109424ec883fe7d239a4ccee44 + depends: + - python >=3.14,<3.15.0a0 + - python_abi 3.14.* *_cp314 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: BSD-2-Clause + license_family: BSD + run_exports: {} + size: 115544 + timestamp: 1782133735742 +- conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-hac47afa_1.conda + sha256: 9583a8fcf01c59b26a4285bc151b6315fd0bd504e1628f004519dc871eb17073 + md5: d1097e01041cfed41c81f1e3d1f52572 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Apache-2.0 + license_family: Apache + run_exports: + weak: + - xerces-c >=3.3.0,<3.4.0a0 + size: 3598939 + timestamp: 1766327729418 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libice-1.1.2-h0e40799_0.conda + sha256: bf1d34142b1bf9b5a4eed96bcc77bc4364c0e191405fd30d2f9b48a04d783fd3 + md5: 105cb93a47df9c548e88048dc9cbdbc9 + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libice >=1.1.2,<2.0a0 + size: 236306 + timestamp: 1734228116846 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libsm-1.2.6-h0e40799_0.conda + sha256: 065d49b0d1e6873ed1238e962f56cb8204c585cdc5c9bd4ae2bf385cadb5bd65 + md5: 570c9a6d9b4909e45d49e9a5daa528de + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + - xorg-libice >=1.1.2,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libsm >=1.2.6,<2.0a0 + size: 97096 + timestamp: 1741896840170 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libx11-1.8.13-hfa52320_0.conda + sha256: eadb12d4597b577cf9bde82a8a2a502a331bd5bfdd60ce508cea93912478e255 + md5: 5a823e21e090f8bc43dbfba00cd2f0e2 + depends: + - libgcc >=14 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - libxcb >=1.17.0,<2.0a0 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libx11 >=1.8.13,<2.0a0 + size: 954604 + timestamp: 1770819901886 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda + sha256: 156a583fa43609507146de1c4926172286d92458c307bb90871579601f6bc568 + md5: 8436cab9a76015dfe7208d3c9f97c156 + depends: + - libgcc >=14 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxau >=1.0.12,<2.0a0 + size: 109246 + timestamp: 1762977105140 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda + sha256: 366b8ae202c3b48958f0b8784bbfdc37243d3ee1b1cd4b8e76c10abe41fa258b + md5: a7c03e38aa9c0e84d41881b9236eacfb + depends: + - libgcc >=14 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxdmcp >=1.1.5,<2.0a0 + size: 70691 + timestamp: 1762977015220 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxext-1.3.7-hba3369d_0.conda + sha256: 5966dff3ea3f805e11b5fb466107d64704eb94f00d28818f6891a3ecd075d08e + md5: 74bc8e26c2716e9b1542bef908887b82 + depends: + - libgcc >=14 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + - xorg-libx11 >=1.8.12,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxext >=1.3.7,<2.0a0 + size: 286083 + timestamp: 1769445495320 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxpm-3.5.19-hba3369d_0.conda + sha256: 1d3907533a6e26bb62f109a33107064e2140503a8076de5b28b384ef3e473d27 + md5: 39d8a6b9a87047c817e5881fc0706684 + depends: + - libgcc >=14 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + - xorg-libx11 >=1.8.13,<2.0a0 + - xorg-libxext >=1.3.7,<2.0a0 + - xorg-libxt >=1.3.1,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxpm >=3.5.19,<4.0a0 + size: 237565 + timestamp: 1776790287445 +- conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxt-1.3.1-h0e40799_0.conda + sha256: c940a6b71a1e59450b01ebfb3e21f3bbf0a8e611e5fbfc7982145736b0f20133 + md5: 31baf0ce8ef19f5617be73aee0527618 + depends: + - libgcc >=13 + - libwinpthread >=12.0.0.r4.gg4f2fc60ca + - ucrt >=10.0.20348.0 + - xorg-libice >=1.1.1,<2.0a0 + - xorg-libsm >=1.2.4,<2.0a0 + - xorg-libx11 >=1.8.10,<2.0a0 + license: MIT + license_family: MIT + run_exports: + weak: + - xorg-libxt >=1.3.1,<2.0a0 + size: 918674 + timestamp: 1731861024233 +- conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda + sha256: 80ee68c1e7683a35295232ea79bcc87279d31ffeda04a1665efdb43cbd50a309 + md5: 433699cba6602098ae8957a323da2664 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + run_exports: + weak: + - yaml >=0.2.5,<0.3.0a0 + size: 63944 + timestamp: 1753484092156 +- conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h3a581c9_11.conda + sha256: c3e279cb309b153152fcdd6ee6d039ad996d563c849f06be39d85b8e3351df25 + md5: f016c0c5f9c01549b259146614786192 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libsodium >=1.0.22,<1.0.23.0a0 + - krb5 >=1.22.2,<1.23.0a0 + license: MPL-2.0 + license_family: MOZILLA + run_exports: + weak: + - zeromq >=4.3.5,<4.3.6.0a0 + size: 265717 + timestamp: 1779124031378 +- conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_2.conda + sha256: ef408f85f664a4b9c9dac3cb2e36154d9baa15a88984ea800e11060e0f2394a1 + md5: 5187ecf958be3c39110fe691cbd6873e + depends: + - libzlib 1.3.2 hfd05255_2 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Zlib + license_family: Other + run_exports: + weak: + - libzlib >=1.3.2,<2.0a0 + size: 850351 + timestamp: 1774072891049 +- conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.3-h0261ad2_1.conda + sha256: 71332532332d13b5dbe57074ddcf82ae711bdc132affa5a2982a29ffa06dc234 + md5: 46a21c0a4e65f1a135251fc7c8663f83 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: Zlib + license_family: Other + run_exports: + weak: + - zlib-ng >=2.3.3,<2.4.0a0 + size: 124542 + timestamp: 1770167984883 +- conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda + sha256: 368d8628424966fd8f9c8018326a9c779e06913dd39e646cf331226acc90e5b2 + md5: 053b84beec00b71ea8ff7a4f84b55207 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libzlib >=1.3.1,<2.0a0 + license: BSD-3-Clause + license_family: BSD + run_exports: + weak: + - zstd >=1.5.7,<1.6.0a0 + size: 388453 + timestamp: 1764777142545 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..5e04d23b --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,115 @@ +[project] +name = "xarray-tutorial" +description = "Xarray Tutorial Website" +readme = "README.md" +license.file = "LICENSE" +requires-python = ">=3.10" +classifiers = [ + "Development Status :: 1 - Planning", + "Intended Audience :: Science/Research", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Scientific/Engineering", + "Typing :: Typed", +] + +[tool.black] +line-length = 100 +target-version = ['py311'] + +[tool.ruff.lint] +select = [ + "I", # isort + "W", # pycodestyle warnings + "B", # flake8-bugbear + "F", # Pyflakes + "E", # Pycodestyle +] +ignore = [ + "E203", # whitespace before '{symbol}' + "E266", # too many leading '#' before block comment + "E501", # line too long + "E722", # do not use bare except + "E402", # module level import not at top of file + "E731", # do not assign a lambda expression, use a def + # to remove fix eventually + "F401", # unused import + "F811", # redefinition of name + "B006", # mutable argument defaults + "B007", # unused loop control variable + "B905", # zip without explicit strict parameter +] +fixable = ["I"] + +[tool.codespell] +ignore-words-list = "nd" +skip = "pixi.lock,.pixi,qaqc.yaml,intermediate/indexing/why-an-index.ipynb" + +[tool.pixi.workspace] +name = "xarray-tutorial" +channels = ["conda-forge"] +platforms = ["osx-arm64", "linux-64", "win-64"] + +[tool.pixi.pypi-dependencies] + +[tool.pixi.tasks] +tutorial = "jupyter lab --LabApp.default_url='/lab/tree/overview/xarray-in-45-min.ipynb'" +build = "jupyter-book build ./ --warningiserror --keep-going" +precommit = "pre-commit run --all" +checklinks = "jupyter-book build ./ --builder linkcheck" +clear-cache = "jupyter-book clean ." +# To clear a specific notebook pass ID number: jcache cache -p _build/.jupyter_cache remove 28 +# To clear all cached notebooks: jupyter-book clean . --all" +watch = { cmd = "jupyter-book config sphinx ./ && sphinx-autobuild ./ _build/html -b html --re-ignore '_build/.*'", description = "Build and serve with live reload" } +list-cache = "jcache cache -p _build/.jupyter_cache list" + +[tool.pixi.dependencies] +jupyter-book = ">=1.0.4.post1,<2" +pre-commit = ">=4.6.0,<5" +dask-labextension = ">=7.0.0,<8" +jupyterlab = ">=4.6.1,<5" +jupyter_bokeh = ">=4.1.0,<5" +jupyterlab-myst = ">=2.7.0,<3" +jupyter-resource-usage = ">=1.2.1,<2" +cartopy = ">=0.25.0,<0.26" +cf_xarray = ">=0.11.3,<0.12" +dask = ">=2026.7.0,<2027" +datashader = ">=0.19.1,<0.20" +distributed = ">=2026.7.0,<2027" +gcsfs = ">=2026.7.0,<2027" +geoviews-core = ">=1.15.1,<2" +gsw = ">=3.6.23,<4" +hvplot = ">=0.12.2,<0.13" +h5netcdf = ">=1.8.1,<2" +ipykernel = ">=7.3.0,<8" +matplotlib-base = ">=3.11.0,<4" +netcdf4 = ">=1.7.4,<2" +numpy = ">=2.4.6,<3" +pint-xarray = ">=0.6.1,<0.7" +pydap = ">=3.5.10,<4" +python-graphviz = ">=0.21,<0.22" +pooch = ">=1.9.0,<2" +rioxarray = ">=0.22.0,<0.23" +scikit-learn = ">=1.9.0,<2" +scipy = ">=1.18.0,<2" +sphinx-codeautolink = ">=0.18.1,<0.19" +sphinxcontrib-mermaid = ">=2.0.3,<3" +sphinx-notfound-page = ">=1.1.0,<2" +sphinx-autobuild = ">=2025.8.25,<2026" +sphinxext-rediraffe = ">=0.3.0,<0.4" +s3fs = ">=2026.6.0,<2027" +xarray = ">=2026.7.0,<2027" +zarr = ">=3.2.1,<4" +flox = ">=0.11.2,<0.12" +numbagg = ">=0.9.4,<0.10" +rich = ">=15.0.0,<16" +imageio = ">=2.37.0,<3" +intake = "<2" +intake-xarray = "<2" diff --git a/reference/glossary.md b/reference/glossary.md new file mode 100644 index 00000000..99ab718d --- /dev/null +++ b/reference/glossary.md @@ -0,0 +1,23 @@ +# Glossary + +For Xarray data structure terminology see https://docs.xarray.dev/en/stable/user-guide/terminology.html + +```{glossary} +[Xarray](https://docs.xarray.dev) + An open source project and Python package that makes working with labelled multi-dimensional arrays simple, efficient, and fun! + +[Zarr](https://zarr.readthedocs.io) + A Python package that provides an implementation of chunked, compressed, N-dimensional arrays + +[GDAL](https://gdal.org) + (Geospatial Data Abstraction Library) a translator library for raster and vector geospatial data formats + +[HDF](https://www.hdfgroup.org/solutions/hdf5/) + (Hierarchical Data Format) binary file format for heterogeneous N-dimensional datasets + +[netCDF](https://www.unidata.ucar.edu/software/netcdf/) + (Network Common Data Form) binary file format for N-dimensional self-described datasets that originated in the geosciences + +[CF Conventions](https://cfconventions.org) + Metadata conventions designed to promote the processing and sharing of netCDF files +``` diff --git a/reference/references.bib b/reference/references.bib new file mode 100644 index 00000000..e8bf1925 --- /dev/null +++ b/reference/references.bib @@ -0,0 +1,20 @@ +@article{hoyerhamman2017, + title = {xarray: {N-D} labeled arrays and datasets in {Python}}, + author = {Hoyer, S. and J. Hamman}, + journal = {Journal of Open Research Software}, + volume = {5}, + number = {1}, + year = {2017}, + publisher = {Ubiquity Press}, + doi = {10.5334/jors.148}, + url = {https://doi.org/10.5334/jors.148} +} + +@misc{xarray_v202230, + author = {Stephan Hoyer and Clark Fitzgerald and Joe Hamman and others}, + title = {xarray: v2022.3.0}, + month = May, + year = 2022, + doi = {10.5281/zenodo.59499}, + url = {https://doi.org/10.5281/zenodo.59499} + } diff --git a/reference/resources.md b/reference/resources.md new file mode 100644 index 00000000..854da382 --- /dev/null +++ b/reference/resources.md @@ -0,0 +1,41 @@ +# Keep Exploring! + +To help you go deeper, we've also create a list of notebooks that +demonstrate real-world applications of Xarray in a variety of use cases. These +need not be explored in any particular sequence, instead they are meant to +provide a sampling of what Xarray can be used for. + +```{seealso} +1. The [Xarray blog](https://xarray.dev/blog) has a number of user stories showcasing Xarray in +many scientific domains. +2. [Project Pythia Foundations](https://foundations.projectpythia.org/) is a great collection of +material on Xarray and related packages. +``` + +## Weather and Climate + +1. [Global Mean Surface Temperature from CMIP6](https://gallery.pangeo.io/repos/pangeo-gallery/cmip6/): + Start with `global_mean_surface_temp.ipynb` then feel free to explore the + rest of the notebooks. + +1. [National Water Model Streamflow Analysis](https://gallery.pangeo.io/repos/rsignell-usgs/esip-gallery/): + Start with `02_National_Water_Model.ipynb` then feel free to explore the rest + of the notebooks. +1. The [Project Pythia Cookbooks](https://cookbooks.projectpythia.org/) are a great collection of + resources showcasing use of Xarray with real world datasets. +1. [Examples using the Microsoft Planetary Computer](https://github.com/microsoft/PlanetaryComputerExamples) + +## Bayesian Statistical Modeling + +1. [Xarray and PyMC3](https://mybinder.org/v2/gh/pymc-devs/pymc3/main?filepath=%2Fdocs%2Fsource%2Fnotebooks): + Start with `multilevel_modeling.ipynb` then feel free to explore the rest of + the notebooks. Also checkout [Arviz](https://arviz-devs.github.io/arviz/) + which uses Xarray as its data model. + +## Genomics + +1. [From "data analysis for genomic surveillance of African malaria vectors" ](https://anopheles-genomic-surveillance.github.io/workshop-5/module-1-xarray.html) + +## Electrophysiology + +1. ["Analyzing intracranial electrophysiology data with xarray"](https://chrisholdgraf.com/blog/2019/2019-10-22-xarray-neuro) diff --git a/scipy-tutorial/00_overview.ipynb b/scipy-tutorial/00_overview.ipynb deleted file mode 100644 index 5ffcbc1a..00000000 --- a/scipy-tutorial/00_overview.ipynb +++ /dev/null @@ -1,194 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "# Introduction\n", - "\n", - "Welcome to the Xarray Tutorial.\n", - "\n", - "Xarray is an open source project and Python package that makes working with\n", - "labelled multi-dimensional arrays simple, efficient, and fun!\n", - "\n", - "Xarray introduces labels in the form of dimensions, coordinates and attributes\n", - "on top of raw [NumPy](https://numpy.org/)-like arrays, which allows for a more\n", - "intuitive, more concise, and less error-prone developer experience. The package\n", - "includes a large and growing library of domain-agnostic functions for advanced\n", - "analytics and visualization with these data structures.\n", - "\n", - "Xarray is inspired by and borrows heavily from\n", - "[pandas](https://pandas.pydata.org/), the popular data analysis package focused\n", - "on labelled tabular data. It is particularly tailored to working with\n", - "[netCDF files](http://www.unidata.ucar.edu/software/netcdf), which were the\n", - "source of Xarray’s data model, and integrates tightly with\n", - "[Dask](http://dask.org/) for parallel computing.\n", - "\n", - "## Tutorial Setup\n", - "\n", - "This tutorial is designed to run on [Binder](https://mybinder.org/). This will\n", - "allow you to run the turoial in the cloud without any additional setup. To get\n", - "started, simply click\n", - "[here](https://mybinder.org/v2/gh/xarray-contrib/xarray-tutorial/master?urlpath=lab):\n", - "[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/xarray-contrib/xarray-tutorial/master)\n", - "\n", - "If you choose to install the tutorial locally, follow these steps:\n", - "\n", - "1. Clone the repository:\n", - "\n", - " ```\n", - " git clone https://github.com/xarray-contrib/xarray-tutorial.git\n", - " ```\n", - "\n", - "1. Install the environment. The repository includes an `environment.yaml` in the\n", - " `.binder` subdirectory that contains a list of all the packages needed to run\n", - " this tutorial. To install them using conda run:\n", - "\n", - " ```\n", - " conda env create -f .binder/environment.yml\n", - " conda activate xarray\n", - " ```\n", - "\n", - "1. Start a Jupyter session:\n", - "\n", - " ```\n", - " jupyter lab\n", - " ```\n", - "\n", - "## Useful links\n", - "\n", - "1. References\n", - "\n", - "- [Documentation](http://xarray.pydata.org/en/stable/)\n", - "- [Code Repository](https://github.com/pydata/xarray)\n", - "\n", - "1. Ask for help:\n", - "\n", - "- Use the\n", - " [python-xarray](https://stackoverflow.com/questions/tagged/python-xarray) on\n", - " StackOverflow\n", - "- [GitHub Issues](https://github.com/pydata/xarray/issues) for bug reports and\n", - " feature requests\n", - "\n", - "## Tutorial Structure\n", - "\n", - "This tutorial is made up of multiple Jupyter Notebooks. These notebooks mix\n", - "code, text, visualization, and exercises.\n", - "\n", - "If you haven't used JupyterLab before, it's similar to the Jupyter Notebook. If\n", - "you haven't used the Notebook, the quick intro is\n", - "\n", - "1. There are two modes: command and edit\n", - "1. From command mode, press Enter to edit a cell (like this markdown cell)\n", - "1. From edit mode, press Esc to change to command mode\n", - "1. Press shift+enter to execute a cell and move to the next cell.\n", - "1. The toolbar has commands for executing, converting, and creating cells.\n", - "\n", - "The layout of the tutorial will be as follows:\n", - "\n", - "1. [Introduction + Data structures for multi-dimensional data](./01_datastructures_and_io.ipynb)\n", - "1. [Working with labeled data](02_working_with_labeled_data.ipynb)\n", - "1. [Computation with Xarray](03_computation_with_xarray.ipynb)\n", - "1. [Plotting and Visualization](04_plotting_and_visualization.ipynb)\n", - "1. [Introduction to Dask](05_intro_to_dask.ipynb)\n", - "1. [Dask and Xarray](06_xarray_and_dask.ipynb)\n", - "\n", - "## Exercise: Print Hello, world!\n", - "\n", - "Each notebook will have exercises for you to solve. You'll be given a blank or\n", - "partially completed cell, followed by a hidden cell with a solution. For\n", - "example.\n", - "\n", - "Print the text \"Hello, world!\".\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Your code here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In some cases, the next cell will have the solution. Click the ellipses to\n", - "expand the solution, and always make sure to run the solution cell, in case\n", - "later sections of the notebook depend on the output from the solution.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "jupyter": { - "source_hidden": true - } - }, - "outputs": [], - "source": [ - "print(\"Hello, world!\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Going Deeper\n", - "\n", - "We've designed the notebooks above to cover the basics of Xarray from beginning\n", - "to end. To help you go deeper, we've also create a list of notebooks that\n", - "demonstrate real-world applications of Xarray in a variety of use cases. These\n", - "need not be explored in any particular sequence, instead they are meant to\n", - "provide a sampling of what Xarray can be used for.\n", - "\n", - "### Xarray and Weather/Climate Model Data\n", - "\n", - "1. [Global Mean Surface Temperature from CMIP6](https://binder.pangeo.io/v2/gh/pangeo-gallery/cmip6/binder?urlpath=git-pull?repo=https://github.com/pangeo-gallery/cmip6%26amp%3Burlpath=lab/tree/cmip6):\n", - " Start with `global_mean_surface_temp.ipynb` then feel free to explore the\n", - " rest of the notebooks.\n", - " \n", - "1. [National Water Model Streamflow Analysis](https://aws-uswest2-binder.pangeo.io/v2/gh/rsignell-usgs/esip-gallery/binder?urlpath=git-pull?repo=https://github.com/rsignell-usgs/esip-gallery%26amp%3Burlpath=lab/tree/esip-gallery):\n", - " Start with `02_National_Water_Model.ipynb` then feel free to explore the rest\n", - " of the notebooks.\n", - "\n", - "### Xarray and Satellite Data\n", - "\n", - "1. [Landsat-8 on AWS](https://aws-uswest2-binder.pangeo.io/v2/gh/pangeo-data/landsat-8-tutorial-gallery/master/?urlpath=git-pull?repo=https://github.com/pangeo-data/landsat-8-tutorial-gallery%26amp%3Burlpath=lab/tree/landsat-8-tutorial-gallery/landsat8.ipynb%3Fautodecode)\n", - "\n", - "### Xarray and Baysian Statistical Modeling\n", - "\n", - "1. [Xarray and PyMC3](https://mybinder.org/v2/gh/pymc-devs/pymc3/master?filepath=%2Fdocs%2Fsource%2Fnotebooks):\n", - " Start with `multilevel_modeling.ipynb` then feel free to explore the rest of\n", - " the notebooks. Also checkout [Arviz](https://arviz-devs.github.io/arviz/)\n", - " which uses Xarray as its data model.\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/scipy-tutorial/01_datastructures_and_io.ipynb b/scipy-tutorial/01_datastructures_and_io.ipynb deleted file mode 100644 index 9c109a73..00000000 --- a/scipy-tutorial/01_datastructures_and_io.ipynb +++ /dev/null @@ -1,886 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "# Data structures for multi-dimensional data\n", - "\n", - "In this lesson, we discuss cover the basics of Xarray data structures. Our\n", - "learning goals are as follows. By the end of the lesson, we will be able to:\n", - "\n", - "- Understand the basic data structures in Xarray\n", - "- Build and inspect `DataArray` and `Dataset` objects.\n", - "- Read and write various data formats (e.g. NetCDF, Zarr) using Xarray.\n", - "\n", - "---\n", - "\n", - "## Introduction\n", - "\n", - "Multi-dimensional (a.k.a. N-dimensional, ND) arrays (sometimes called “tensors”)\n", - "are an essential part of computational science. They are encountered in a wide\n", - "range of fields, including physics, astronomy, geoscience, bioinformatics,\n", - "engineering, finance, and deep learning. In Python, [NumPy](https://numpy.org/)\n", - "provides the fundamental data structure and API for working with raw ND arrays.\n", - "However, real-world datasets are usually more than just raw numbers; they have\n", - "labels which encode information about how the array values map to locations in\n", - "space, time, etc.\n", - "\n", - "Here is an example of how we might structure a dataset for a weather forecast:\n", - "\n", - "\n", - "\n", - "You'll notice multiple data variables (temperature, precipitation), coordinate\n", - "variables (latitude, longitude), and dimensions (x, y, t). We'll cover how these\n", - "fit into Xarray's data structures below.\n", - "\n", - "Xarray doesn’t just keep track of labels on arrays – it uses them to provide a\n", - "powerful and concise interface. For example:\n", - "\n", - "- Apply operations over dimensions by name: `x.sum('time')`.\n", - "\n", - "- Select values by label (or logical location) instead of integer location:\n", - " `x.loc['2014-01-01']` or `x.sel(time='2014-01-01')`.\n", - "\n", - "- Mathematical operations (e.g., `x - y`) vectorize across multiple dimensions\n", - " (array broadcasting) based on dimension names, not shape.\n", - "\n", - "- Easily use the split-apply-combine paradigm with groupby:\n", - " `x.groupby('time.dayofyear').mean()`.\n", - "\n", - "- Database-like alignment based on coordinate labels that smoothly handles\n", - " missing values: `x, y = xr.align(x, y, join='outer')`.\n", - "\n", - "- Keep track of arbitrary metadata in the form of a Python dictionary:\n", - " `x.attrs`.\n", - "\n", - "The N-dimensional nature of xarray’s data structures makes it suitable for\n", - "dealing with multi-dimensional scientific data, and its use of dimension names\n", - "instead of axis labels (`dim='time'` instead of `axis=0`) makes such arrays much\n", - "more manageable than the raw numpy ndarray: with xarray, you don’t need to keep\n", - "track of the order of an array’s dimensions or insert dummy dimensions of size 1\n", - "to align arrays (e.g., using np.newaxis).\n", - "\n", - "The immediate payoff of using xarray is that you’ll write less code. The\n", - "long-term payoff is that you’ll understand what you were thinking when you come\n", - "back to look at it weeks or months later.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data structures\n", - "\n", - "Xarray provides two data structures: the `DataArray` and `Dataset`. The\n", - "`DataArray` class attaches dimension names, coordinates and attributes to\n", - "multi-dimensional arrays while `Dataset` combines multiple arrays.\n", - "\n", - "Both classes are most commonly created by reading data, but to understand them\n", - "let's first look at creating them programmatically.\n", - "\n", - "### DataArray\n", - "\n", - "The `DataArray` class is used to attach a name, dimension names, labels, and\n", - "attributes to an array.\n", - "\n", - "As an example, let's create a `DataArray` named `a` with three dimensions (named\n", - "`x`, `y`, `z`) from a `numpy` array:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import xarray as xr\n", - "\n", - "rng = np.random.default_rng(seed=0) # we'll use this later" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "da = xr.DataArray(\n", - " np.ones((3, 4, 2)),\n", - " dims=(\"x\", \"y\", \"z\"),\n", - " name=\"a\",\n", - " coords={\"z\": [-1, 1], \"u\": (\"x\", [0.1, 1.2, 2.3])},\n", - " attrs={\"attr\": \"value\"},\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this case, we used a 3x4 `numpy` array with all values being equal to `1`,\n", - "but it can be anything that either behaves like a `numpy` array or can be\n", - "coerced to a `numpy` array using\n", - "[`numpy.array`](https://numpy.org/doc/stable/reference/generated/numpy.array.html).\n", - "\n", - "We also passed a sequence (a tuple here, but could also be a list) containing\n", - "the dimension names `x`, `y`, and `z` to `dims`. In case we have only a single\n", - "dimension we can also pass just the dimension name. For example:\n", - "\n", - "```python\n", - "xr.DataArray([1, 1], dims=\"x\")\n", - "```\n", - "\n", - "The dimension names (and the array's `name`) can be anything that fits into a\n", - "python `set` (i.e. calling `hash()` on it doesn't raise an error), but to be\n", - "useful they should be strings.\n", - "\n", - "`coords` is a [dict-like](https://docs.python.org/3/glossary.html#term-mapping)\n", - "container of arrays (coordinates) that label each point (e.g., 1-dimensional\n", - "arrays of numbers, datetime objects or strings). We will look at its format\n", - "later.\n", - "\n", - "We can also attach arbitrary metadata (attributes) to the `DataArray` by passing\n", - "a dict-like to the `attrs` parameter.\n", - "\n", - "#### String representations\n", - "\n", - "Now that we have the `DataArray` we can look at its string representation.\n", - "\n", - "xarray has two representation types: `\"html\"` (which is only available in\n", - "notebooks) and `\"text\"`. To choose between them, use the `display_style` option.\n", - "\n", - "Let's first look at the text representation:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with xr.set_options(display_style=\"text\"):\n", - " display(da)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It consists of:\n", - "\n", - "- the name of the `DataArray` (`'a'`). If we didn't provide a name, this will be\n", - " omitted\n", - "- the dimensions of the array `(x: 3, y: 4, z: 2)`: this tells us that the first\n", - " dimension is named `x` and has a size of `3`, the second dimension is named\n", - " `y` and has a size of `4`, and the third dimension is named `z` and has a size\n", - " of `2`\n", - "- a preview of the data\n", - "- a (unordered) list of coordinates or dimensions with coordinates with one item\n", - " per line. Each item has a name, one or more dimensions in parentheses, a dtype\n", - " and a preview of the values. Also, if it is a dimension coordinate, it will be\n", - " marked with a `*`.\n", - "- a alphabetically sorted list of dimensions without coordinates\n", - "- a (unordered) list of attributes\n", - "\n", - "The `\"html\"` representation looks similar:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with xr.set_options(display_style=\"html\"):\n", - " display(da)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "except the data preview was collapsed to a single line (we can expand it by\n", - "clicking on the symbol on the left) and the dimensions are marked by a bold font\n", - "instead of a `*` prefix.\n", - "\n", - "Going forward, we'll use the HTML representation except when explaining the text\n", - "representation.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Once we have created the `DataArray`, we can look at its data:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "da.data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "da.dims" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "da.coords" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "da.attrs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### coordinates\n", - "\n", - "As mentioned above, `coords` is a dict-like mapping names to values. These\n", - "values can be either\n", - "\n", - "- another `DataArray` object\n", - "- a tuple of the form `(dims, data, attrs)` where `attrs` is optional. This is\n", - " roughly equivalent to creating a new `DataArray` object with\n", - " `DataArray(dims=dims, data=data, attrs=attrs)`\n", - "- a `numpy` array (or anything that can be coerced to one using `numpy.array`).\n", - "\n", - "Let's look at an example:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "da = xr.DataArray(\n", - " np.ones((3, 4)),\n", - " dims=(\"x\", \"y\"),\n", - " coords={\n", - " \"x\": [\"a\", \"b\", \"c\"],\n", - " \"y\": np.arange(4),\n", - " \"u\": (\"x\", np.arange(3), {\"attr1\": 0}),\n", - " },\n", - ")\n", - "da" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can see that we assigned labels to the `x` and `y` dimensions and also\n", - "created a coordinate named `u` along `x` with its own metadata (click on the\n", - "sheet icon to look at them).\n", - "\n", - "The difference between the dimension labels (dimension coordinates) and normal\n", - "coordinates is that for now it only is possible to use indexing operations\n", - "(`sel`, `reindex`, etc) with dimension coordinates. Also, while coordinates can\n", - "have arbitrary dimensions, dimension coordinates have to be one-dimensional.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Exercises\n", - "\n", - "create a `DataArray` named \"height\" from random data\n", - "\n", - "1. with dimensions named \"latitude\" and \"longitude\"\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "height = rng.random((180, 360)) * 400\n", - "xr.DataArray(\n", - " # your code here\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "2. with dimension coordinates:\n", - "\n", - "- \"latitude\": -90 to 90 with step size 1\n", - "- \"longitude\": -180 to 180 with step size 1\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "xr.DataArray(\n", - " # your code here\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "3. with metadata for both data and coordinates:\n", - "\n", - "- height: \"type\": \"ellipsoid\"\n", - "- latitude: \"type\": \"geodetic\"\n", - "- longitude: \"prime_meridian\": \"greenwich\"\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "xr.DataArray(\n", - " # your code here\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Dataset\n", - "\n", - "`Dataset` objects collect multiple data variables, each with possibly different\n", - "dimensions.\n", - "\n", - "The constructor of `Dataset` takes three parameters:\n", - "\n", - "- `data_vars`: dict-like mapping names to values. It has the format described in\n", - " [coordinates](#coordinates) except we need to use either `DataArray` objects\n", - " or the tuple syntax since we have to provide dimensions\n", - "- `coords`: same as for `DataArray`\n", - "- `attrs`: same as for `Dataset`\n", - "\n", - "For example, let's create a `Dataset` with two variables:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds = xr.Dataset(\n", - " data_vars={\n", - " \"a\": ((\"x\", \"y\"), np.ones((3, 4))),\n", - " \"b\": (\"t\", np.full((8,), 3), {\"attr\": \"value\"}),\n", - " },\n", - " coords={\"x\": [-1, 0, 1],},\n", - " attrs={\"attr\": \"value\"},\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### String representations\n", - "\n", - "Let's again first look at the text representation:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with xr.set_options(display_style=\"text\"):\n", - " display(ds)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It consists of\n", - "\n", - "- a summary of all dimensions in the dataset and their lengths\n", - "- a unordered list of coordinates (same format as the `DataArray`)\n", - "- a unordered list of dimensions without coordinates\n", - "- a unordered list of data variables: each item has the same format as the\n", - " coordinates with the exception of the dimension mark (`*`)\n", - "\n", - "Again, the HTML representation is similar:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "with xr.set_options(display_style=\"html\"):\n", - " display(ds)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### coordinates\n", - "\n", - "As with `DataArray`, a `Dataset` really becomes useful once we assign\n", - "coordinates. Here we also introduce using Pandas datetime objects as coordinate\n", - "values:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "\n", - "xr.Dataset(\n", - " data_vars={\n", - " \"a\": ((\"x\", \"y\"), np.ones((3, 4))),\n", - " \"b\": ((\"t\", \"x\"), np.full((8, 3), 3)),\n", - " },\n", - " coords={\n", - " \"x\": [\"a\", \"b\", \"c\"],\n", - " \"y\": np.arange(4),\n", - " \"t\": pd.date_range(\"2020-07-05\", periods=8, freq=\"D\"),\n", - " },\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we have variables with different values along the same dimension, we can't\n", - "use the shortcut syntax anymore. Instead, we need to use `DataArray` objects:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "x_a = np.arange(1, 4)\n", - "x_b = np.arange(-1, 3)\n", - "\n", - "a = xr.DataArray(np.linspace(0, 1, 3), dims=\"x\", coords={\"x\": x_a})\n", - "b = xr.DataArray(np.zeros(4), dims=\"x\", coords={\"x\": x_b})\n", - "\n", - "xr.Dataset(data_vars={\"a\": a, \"b\": b})" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "which combines the coordinates and fills in floating-point `nan` values for\n", - "missing data (converting the data type to `float` in the process). For example,\n", - "`b` doesn't have a value for `x == 3` so `nan` was used.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Exercises\n", - "\n", - "1. create a Dataset with two variables along `latitude` and `longitude`:\n", - " `height` and `gravity_anomaly`\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "height = rng.random((180, 360)) * 400\n", - "gravity_anomaly = rng.random((180, 360)) * 400 - 200\n", - "\n", - "xr.Dataset(\n", - " # your code here\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "2. add coordinates to `latitude` and `longitude`:\n", - "\n", - "- `latitude`: from -90 to 90 with step size 1\n", - "- `longitude`: from -180 to 180 with step size 1\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "xr.Dataset(\n", - " # your code here\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "3. add metadata to coordinates and variables:\n", - "\n", - "- `latitude`: \"type\": \"geodetic\"\n", - "- `longitude`: \"prime_meridian\": \"greenwich\"\n", - "- `height`: \"ellipsoid\": \"wgs84\"\n", - "- `gravity_anomaly`: \"ellipsoid\": \"grs80\"\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "xr.Dataset(\n", - " # your code here\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Roundtripping and I/O\n", - "\n", - "`DataArray` and `Dataset` objects are frequently created by converting from\n", - "other libraries such as [pandas](https://pandas.pydata.org/) or by reading from\n", - "data storage formats such as\n", - "[NetCDF](https://www.unidata.ucar.edu/software/netcdf/) or\n", - "[zarr](https://zarr.readthedocs.io/en/stable/).\n", - "\n", - "To convert from / to `pandas`, we can use the\n", - "[to_xarray](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_xarray.html)\n", - "methods on [pandas](https://zarr.readthedocs.io/en/stable/) objects or the\n", - "[to_pandas](http://xarray.pydata.org/en/stable/generated/xarray.DataArray.to_pandas.html)\n", - "methods on `xarray` objects:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "series = pd.Series(np.ones((10,)), index=list(\"abcdefghij\"))\n", - "series" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "arr = series.to_xarray()\n", - "arr" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "arr.to_pandas()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also control what `pandas` object is used by calling `to_series` /\n", - "`to_dataframe`:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds = xr.Dataset(\n", - " data_vars={\"a\": (\"x\", np.arange(5)), \"b\": ((\"x\", \"y\"), np.ones((5, 4)))}\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**to_series**: This will always convert `DataArray` objects to\n", - "`pandas.Series`, using a `MultiIndex` for higher dimensions\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.a.to_series()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.b.to_series()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**to_dataframe**: This will always convert `DataArray` or `Dataset`\n", - "objects to a `pandas.DataFrame`. Note that `DataArray` objects have to be named\n", - "for this.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.a.to_dataframe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Since columns in a `DataFrame` need to have the same index, they are\n", - "broadcasted.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.to_dataframe()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### I/O\n", - "\n", - "One of Xarray's most widely used features is its ability to read from and write\n", - "to a variety of data formats. For example, Xarray can read the following\n", - "formats:\n", - "\n", - "- [NetCDF](https://www.unidata.ucar.edu/software/netcdf/) / GRIB (via\n", - " `open_dataset` / `open_mfdataset`, `to_netcdf` / `save_mfdataset`)\n", - "- [Zarr](https://zarr.readthedocs.io/en/stable/) (via `open_zarr`, `to_zarr`)\n", - "- [GeoTIFF](https://gdal.org/drivers/raster/gtiff.html) /\n", - " [GDAL rasters](https://svn.osgeo.org/gdal/tags/gdal_1_2_5/frmts/formats_list.html)\n", - " (via `open_rasterio`)\n", - "\n", - "#### NetCDF\n", - "\n", - "The recommended way to store xarray data structures is NetCDF, which is a binary\n", - "file format for self-described datasets that originated in the geosciences.\n", - "Xarray is based on the netCDF data model, so netCDF files on disk directly\n", - "correspond to Dataset objects.\n", - "\n", - "Xarray reads and writes to NetCDF files using the `open_dataset` /\n", - "`open_dataarray` functions and the `to_netcdf` method.\n", - "\n", - "Let's first create some datasets and write them to disk using `to_netcdf`, which\n", - "takes the path we want to write to:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds1 = xr.Dataset(\n", - " data_vars={\n", - " \"a\": ((\"x\", \"y\"), np.random.randn(4, 2)),\n", - " \"b\": ((\"z\", \"x\"), np.random.randn(6, 4)),\n", - " },\n", - " coords={\"x\": np.arange(4), \"y\": np.arange(-2, 0), \"z\": np.arange(-3, 3),},\n", - ")\n", - "ds2 = xr.Dataset(\n", - " data_vars={\n", - " \"a\": ((\"x\", \"y\"), np.random.randn(7, 3)),\n", - " \"b\": ((\"z\", \"x\"), np.random.randn(2, 7)),\n", - " },\n", - " coords={\"x\": np.arange(6, 13), \"y\": np.arange(3), \"z\": np.arange(3, 5),},\n", - ")\n", - "\n", - "# write datasets\n", - "ds1.to_netcdf(\"ds1.nc\")\n", - "ds2.to_netcdf(\"ds2.nc\")\n", - "\n", - "# write dataarray\n", - "ds1.a.to_netcdf(\"da1.nc\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Reading those files is just as simple:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "xr.open_dataset(\"ds1.nc\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "xr.open_dataarray(\"da1.nc\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Zarr\n", - "\n", - "[Zarr](https://zarr.readthedocs.io/en/stable/) is a Python package and data\n", - "format providing an implementation of chunked, compressed, N-dimensional arrays.\n", - "Zarr has the ability to store arrays in a range of ways, including in memory, in\n", - "files, and in cloud-based object storage such as Amazon S3 and Google Cloud\n", - "Storage. Xarray’s Zarr backend allows xarray to leverage these capabilities.\n", - "\n", - "Zarr files can be written with:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds1.to_zarr(\"ds1.zarr\", mode=\"w\")" - ] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [ - "or to any `MutableMapping` interface:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mystore = {}\n", - "\n", - "ds1.to_zarr(store=mystore)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can then read the created file with:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "xr.open_zarr(\"ds1.zarr\", chunks=None)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "setting the `chunks` parameter to `None` avoids `dask` (more on that in a later\n", - "session)\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.2" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/scipy-tutorial/02_working_with_labeled_data.ipynb b/scipy-tutorial/02_working_with_labeled_data.ipynb deleted file mode 100644 index 159ec1c3..00000000 --- a/scipy-tutorial/02_working_with_labeled_data.ipynb +++ /dev/null @@ -1,505 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "# Working with labeled data\n", - "\n", - "Learing goals:\n", - "\n", - "- Use different forms of indexing to select data based on position and\n", - " coordinates\n", - "- Select datatime ranges\n", - "- Interpolate data to new coordinates\n", - "\n", - "## Named dimensions\n", - "\n", - "As mentioned in the previous session, labeled dimensions really help to make the\n", - "code less difficult to understand. Compare pure `numpy` indexing:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "import xarray as xr\n", - "\n", - "np.random.seed(0)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# axis0: x, axis1: y\n", - "np_array = np.random.randn(3, 4)\n", - "np_array[1, 3]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "and slicing:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np_array[:2, 1:]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "with label based indexing:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "arr = xr.DataArray(np_array, dims=(\"x\", \"y\"))\n", - "arr.isel(x=1, y=3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is the same as\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "arr[{\"x\": 1, \"y\": 1}]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Due to the language syntax, slices have to be constructed manually:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds = xr.Dataset(\n", - " {\n", - " \"a\": ((\"x\", \"y\"), np.random.randn(3, 4)),\n", - " \"b\": ((\"x\", \"y\"), np.random.randn(3, 4)),\n", - " }\n", - ")\n", - "ds.isel(x=slice(None, 2), y=slice(1, None))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also use these names to peek at the data if the automatic preview is not\n", - "enough:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.head(x=2, y=3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "see also `tail` and `thin`.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Coordinate labels and label based indexing\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "xarray objects become much more interesting when adding coordinate labels:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "arr = xr.DataArray(\n", - " np.random.randn(4, 6),\n", - " dims=(\"x\", \"y\"),\n", - " coords={\n", - " \"x\": [-3.2, 2.1, 5.3, 6.5],\n", - " \"y\": pd.date_range(\"2009-01-05\", periods=6, freq=\"M\"),\n", - " },\n", - ")\n", - "arr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To select data by coordinate labels instead of integer indices we can use the\n", - "same syntax, using `sel` instead of `isel`:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "arr.sel(x=5.3, y=\"2009-04-30\") # or a.loc[{\"x\": 5.3, \"y\": \"2009-04-30\"}]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "this will require us to specify exact values. If we don't have those, we can use\n", - "the `method` parameter (see `Dataset.sel` for documentation):\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "arr.sel(x=4, y=\"2009-04-01\", method=\"nearest\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can also select multiple values:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "arr.sel(x=[-3.2, 6.5], y=slice(\"2009-02-28\", \"2009-05-31\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If instead of selecting data we want to drop it, we can use `drop_sel`:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "arr.drop_sel(x=[-3.2, 5.3])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds = xr.tutorial.open_dataset(\"air_temperature\")\n", - "ds" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "1. Select the first 30 entries of latitude and 20th to 40th entries of longitude\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# your code here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "2. Select all data at 75 degree north and between Jan 1, 2013 and Oct 15, 2013\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# your code here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "3. Remove all entries at 260 and 270 degrees\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# your code here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Interpolation\n", - "\n", - "If we want to look at values between the current grid cells (interpolation), we\n", - "can do that with `interp` (requires `scipy`):\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "arr.interp(\n", - " x=np.linspace(2, 6, 10),\n", - " y=pd.date_range(\"2009-04-01\", \"2009-04-30\", freq=\"D\"),\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "when trying to extrapolate, the resulting values will be `nan`.\n", - "\n", - "If we already have a object with the desired coordinates, we can use\n", - "`interp_like`:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "other = xr.DataArray(\n", - " dims=(\"x\", \"y\"),\n", - " coords={\n", - " \"x\": np.linspace(2, 4, 10),\n", - " \"y\": pd.date_range(\"2009-04-01\", \"2009-04-30\", freq=\"D\"),\n", - " },\n", - ")\n", - "arr.interp_like(other)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercises\n", - "\n", - "Increase the step size along latitude and longitude from 2.5 degrees to 1\n", - "degree.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# your code here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Broadcasting and automatic alignment\n", - "\n", - "Labels help with combining arrays with different coordinates:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a = xr.DataArray(\n", - " np.random.randn(3, 4),\n", - " dims=(\"x\", \"y\"),\n", - " coords={\"x\": [\"a\", \"b\", \"c\"], \"y\": np.arange(4)},\n", - ")\n", - "b = xr.DataArray(\n", - " np.random.randn(2, 7),\n", - " dims=(\"x\", \"y\"),\n", - " coords={\"x\": [\"b\", \"d\"], \"y\": [-2, -1, 0, 1, 2, 3, 4]},\n", - ")\n", - "\n", - "a + b" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This will automatically select only common labels from both arrays (a inner\n", - "join) and then perform the operation.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Broadcasting works similar:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "arr1 = xr.DataArray(\n", - " np.random.randn(3), dims=\"x\", coords={\"x\": [\"a\", \"b\", \"c\"]},\n", - ")\n", - "arr2 = xr.DataArray(np.random.randn(4), dims=\"y\", coords={\"y\": np.arange(4)},)\n", - "\n", - "arr1 + arr2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "where both arrays were automatically broadcasted against each other:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "arr1_, arr2_ = xr.broadcast(arr1, arr2)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "arr1_" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "arr2_" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "and then the operation (a sum) was executed.\n", - "\n", - "We can also call `align` speciically with different options.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a_al, b_al = xr.align(a, b, join=\"inner\")\n", - "b_al" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.1" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/scipy-tutorial/03_computation_with_xarray.ipynb b/scipy-tutorial/03_computation_with_xarray.ipynb deleted file mode 100644 index 6f870991..00000000 --- a/scipy-tutorial/03_computation_with_xarray.ipynb +++ /dev/null @@ -1,969 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "# Computation with Xarray\n", - "\n", - "In this lesson, we discuss how to do scientific computations with xarray\n", - "objects. Our learning goals are as follows. By the end of the lesson, we will be\n", - "able to:\n", - "\n", - "- Apply basic arithmetic and numpy functions to xarray DataArrays / Dataset.\n", - "- Use Xarray's label-aware reduction operations (e.g. `mean`, `sum`) weighted\n", - " reductions.\n", - "- Apply arbitrary functions to Xarray data via `apply_ufunc`.\n", - "- Use Xarray's broadcasting to compute on arrays of different dimensionality.\n", - "- Perform \"split / apply / combine\" workflows in Xarray using `groupby`,\n", - " including\n", - " - reductions within groups\n", - " - transformations on groups\n", - "- Use the `resample`, `rolling` and `coarsen` functions to manipulate data.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import expectexception\n", - "import numpy as np\n", - "import xarray as xr\n", - "from matplotlib import pyplot as plt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Example Dataset\n", - "\n", - "First we load a dataset. We will use the\n", - "[NOAA Extended Reconstructed Sea Surface Temperature (ERSST) v5](https://www.ncdc.noaa.gov/data-access/marineocean-data/extended-reconstructed-sea-surface-temperature-ersst-v5)\n", - "product, a widely used and trusted gridded compilation of of historical data\n", - "going back to 1854.\n", - "\n", - "Since the data is provided via an\n", - "[OPeNDAP](https://en.wikipedia.org/wiki/OPeNDAP) server, we can load it directly\n", - "without downloading anything:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "### NOTE: If hundreds of people connect to this server at once and download the same dataset,\n", - "### things might not go so well! Recommended to use the Google Cloud copy instead.\n", - "\n", - "# url = \"http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/noaa.ersst.v5/sst.mnmean.nc\"\n", - "# # drop an unnecessary variable which complicates some operations\n", - "# ds = xr.open_dataset(url, drop_variables=[\"time_bnds\"])\n", - "# # will take a minute or two to complete\n", - "# ds = ds.sel(time=slice(\"1960\", \"2018\")).load()\n", - "# ds" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import gcsfs\n", - "\n", - "fs = gcsfs.GCSFileSystem(token=\"anon\")\n", - "ds = xr.open_zarr(\n", - " fs.get_mapper(\"gs://pangeo-noaa-ncei/noaa.ersst.v5.zarr\"), consolidated=True\n", - ").load()\n", - "ds" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's do some basic visualizations of the data, just to make sure it looks\n", - "reasonable.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.sst[0].plot(vmin=-2, vmax=30)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Basic Arithmetic\n", - "\n", - "Xarray dataarrays and datasets work seamlessly with arithmetic operators and\n", - "numpy array functions.\n", - "\n", - "For example, imagine we want to convert the temperature (given in Celsius) to\n", - "Kelvin:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sst_kelvin = ds.sst + 273.15\n", - "sst_kelvin" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The dimensions and coordinates were preseved following the operation.\n", - "\n", - "
\n", - " Warning: Although many xarray datasets have a units attribute, which is used in plotting,\n", - " Xarray does not inherently understand units. However, work is underway to integrate xarray\n", - " with pint, which will provide full unit-aware operations.\n", - "
\n", - "\n", - "We can apply more complex functions, including numpy ufuncs, to Xarray objects.\n", - "Imagine we wanted to compute the following expression as a function of SST\n", - "($\\Theta$) in Kelvin:\n", - "\n", - "$$ f(\\Theta) = 0.5 \\ln(\\Theta^2) $$\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "f = 0.5 * np.log(sst_kelvin ** 2)\n", - "f" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Applying Aribtrary Functions\n", - "\n", - "It's awesome that we can call `np.log(ds)` and have it \"just work\". However, not\n", - "all third party libraries work this way.\n", - "\n", - "In this example, we will use functions from the\n", - "[Gibbs Seawater Toolkit](https://teos-10.github.io/GSW-Python/), a package for\n", - "the thermodynamics of seawater. This package provides ufuncs that operate on\n", - "numpy arrays.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import gsw\n", - "\n", - "# an example function\n", - "# http://www.teos-10.org/pubs/gsw/html/gsw_t90_from_t68.html\n", - "gsw.t90_from_t68?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "gsw.t90_from_t68(ds.sst) # -> returns a numpy array" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It would be nice to keep our dimensions and coordinates. We can accomplish this\n", - "with `xr.apply_ufunc`.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "xr.apply_ufunc(gsw.t90_from_t68, ds.sst)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - " Note: apply_ufunc is a powerful and mysterious function.\n", - " It has many options for doing more complicated things.\n", - " Unfortunately, we don't have time to go into more depth here.\n", - " Please consult the [Xarray docs](http://xarray.pydata.org/en/latest/generated/xarray.apply_ufunc.html) for more details.\n", - "
\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Reductions\n", - "\n", - "Just like in numpy, we can reduce xarray DataArrays along any number of axes:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sst = ds.sst\n", - "sst.mean(axis=0)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sst.mean(axis=(1, 2))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sst.mean()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "However, rather than performing reductions on axes (as in numpy), we can perform\n", - "them on dimensions. This turns out to be a huge convenience, particularly in\n", - "complex calculations when you can't easily remember which axis corresponds to\n", - "which dimension:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sst.mean(dim=\"time\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "All of the standard numpy reductions (e.g. `min`, `max`, `sum`, `std`, etc.) are\n", - "available\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Exercise\n", - "\n", - "Take the mean of `sst` in both longitude and latitude. Make a simple timeseries\n", - "plot:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# your code here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Broadcasting\n", - "\n", - "Broadcasting refers to the alignmed of arrays with different numbers of\n", - "dimensions. Numpy's broadcasting rules, based on array shape, can sometimes be\n", - "difficult to understand and remember. Xarray does brodcasting by dimension name,\n", - "rather than array shape. This is a huge convenience.\n", - "\n", - "Let's now create two arrays with some dimensions in common. For this example, we\n", - "will create a \"weights\" array proportional to cosine of latitude. Modulo a\n", - "normalization, this is the correct area-weighting factor for data on a regular\n", - "lat-lon grid.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "weights = np.cos(np.deg2rad(ds.lat))\n", - "weights.dims" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If we multiply this by SST, it \"just works,\" and the arrays are broadcasted\n", - "properly:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "(ds.sst * weights).dims" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - " Warning: If the arrays being broadcasted share a dimension name, but have different coordinates,\n", - " they will first be aligned using Xarray's default align settings (including filling missing values with NaNs).\n", - " If that's not what you want, it's best to call align explicitly before broadcasting.\n", - "
\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Weighted Reductions\n", - "\n", - "We could imagine computing the weighted spatial mean of SST manually, like this:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sst_mean = (ds.sst * weights).sum(dim=(\"lon\", \"lat\")) / weights.sum(dim=\"lat\")\n", - "sst_mean.plot()\n", - "plt.title(\"This is wrong!\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "That would be wrong, however, because the denominator (`weights.sum(dim='lat')`)\n", - "needs to be expanded to include the `lon` dimension and modified to account for\n", - "the missing values (land points).\n", - "\n", - "In general, weighted reductions on multidimensional arrays are complicated. To\n", - "make it a bit easier, Xarray provides a mechanism for weighted reductions. It\n", - "does this by creating a special intermediate `DataArrayWeighted` object, to\n", - "which different reduction operations can applied.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sst_weighted = ds.sst.weighted(weights)\n", - "sst_weighted" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sst_weighted.mean(dim=(\"lon\", \"lat\")).plot()\n", - "plt.title(\"Correct Global Mean SST\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Groupby\n", - "\n", - "Xarray copies Pandas' very useful groupby functionality, enabling the \"split /\n", - "apply / combine\" workflow on xarray DataArrays and Datasets.\n", - "\n", - "To provide a physically motivated example, let's examine a timeseries of SST at\n", - "a single point.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.sst.sel(lon=300, lat=50).plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As we can see from the plot, the timeseries at any one point is totally\n", - "dominated by the seasonal cycle. We would like to remove this seasonal cycle\n", - "(called the \"climatology\") in order to better see the long-term variaitions in\n", - "temperature. We can accomplish this using **groupby**.\n", - "\n", - "Before moving forward, w note that xarray correctly parsed the time index,\n", - "resulting in a Pandas datetime index on the time dimension.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.time" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The syntax of Xarray's groupby is almost identical to Pandas.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.groupby?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Split Step\n", - "\n", - "The most important argument is `group`: this defines the unique values we will\n", - "us to \"split\" the data for grouped analysis. We can pass either a DataArray or a\n", - "name of a variable in the dataset. Lets first use a DataArray. Just like with\n", - "Pandas, we can use the time indexe to extract specific components of dates and\n", - "times. Xarray uses a special syntax for this `.dt`, called the\n", - "`DatetimeAccessor`.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.time.dt" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.time.dt.month" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "ds.time.dt.year\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use these arrays in a groupby operation:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "gb = ds.groupby(ds.time.dt.month)\n", - "gb" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Xarray also offers a more concise syntax when the variable you're grouping on is\n", - "already present in the dataset. This is identical to the previous line:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "gb = ds.groupby(\"time.month\")\n", - "gb" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that the data are split, we can manually iterate over the group. The\n", - "iterator returns the key (group name) and the value (the actual dataset\n", - "corresponding to that group) for each group.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for group_name, group_ds in gb:\n", - " # stop iterating after the first loop\n", - " break\n", - "print(group_name)\n", - "group_ds" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Apply & Combine\n", - "\n", - "Now that we have groups defined, it's time to \"apply\" a calculation to the\n", - "group. Like in Pandas, these calculations can either be:\n", - "\n", - "- _aggregation_: reduces the size of the group\n", - "- _transformation_: preserves the group's full size\n", - "\n", - "At then end of the apply step, xarray will automatically combine the aggregated\n", - "/ transformed groups back into a single object.\n", - "\n", - "The most fundamental way to apply is with the `.map` method.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "gb.map?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Aggregations\n", - "\n", - "`.apply` accepts as its argument a function. We can pass an existing function:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "gb.map(np.mean)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Because we specified no extra arguments (like `axis`) the function was applied\n", - "over all space and time dimensions. This is not what we wanted. Instead, we\n", - "could define a custom function. This function takes a single argument--the group\n", - "dataset--and returns a new dataset to be combined:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def time_mean(a):\n", - " return a.mean(dim=\"time\")\n", - "\n", - "\n", - "gb.map(time_mean)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Like Pandas, xarray's groupby object has many built-in aggregation operations\n", - "(e.g. `mean`, `min`, `max`, `std`, etc):\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# this does the same thing as the previous cell\n", - "ds_mm = gb.mean(dim=\"time\")\n", - "ds_mm" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So we did what we wanted to do: calculate the climatology at every point in the\n", - "dataset. Let's look at the data a bit.\n", - "\n", - "_Climatlogy at a specific point in the North Atlantic_\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds_mm.sst.sel(lon=300, lat=50).plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "_Zonal Mean Climatolgoy_\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds_mm.sst.mean(dim=\"lon\").plot.contourf(x=\"month\", levels=12, vmin=-2, vmax=30)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "_Difference between January and July Climatology_\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "(ds_mm.sst.sel(month=1) - ds_mm.sst.sel(month=7)).plot(vmax=10)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Transformations\n", - "\n", - "Now we want to _remove_ this climatology from the dataset, to examine the\n", - "residual, called the _anomaly_, which is the interesting part from a climate\n", - "perspective. Removing the seasonal climatology is a perfect example of a\n", - "transformation: it operates over a group, but doesn't change the size of the\n", - "dataset. Here is one way to code it\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def remove_time_mean(x):\n", - " return x - x.mean(dim=\"time\")\n", - "\n", - "\n", - "ds_anom = ds.groupby(\"time.month\").map(remove_time_mean)\n", - "ds_anom" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Xarray makes these sorts of transformations easy by supporting _groupby\n", - "arithmetic_. This concept is easiest explained with an example:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "gb = ds.groupby(\"time.month\")\n", - "ds_anom = gb - gb.mean(dim=\"time\")\n", - "ds_anom" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can view the climate signal without the overwhelming influence of the\n", - "seasonal cycle.\n", - "\n", - "_Timeseries at a single point in the North Atlantic_\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds_anom.sst.sel(lon=300, lat=50).plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "_Difference between Jan. 1 2018 and Jan. 1 1960_\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "(ds_anom.sel(time=\"2018-01-01\") - ds_anom.sel(time=\"1960-01-01\")).sst.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Grouby-Related: Resample, Rolling, Coarsen\n", - "\n", - "Resample in xarray is nearly identical to Pandas. It is effectively a group-by\n", - "operation, and uses the same basic syntax. It can be applied only to time-index\n", - "dimensions. Here we compute the five-year mean.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "resample_obj = ds_anom.resample(time=\"5Y\")\n", - "resample_obj" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds_anom_resample = resample_obj.mean(dim=\"time\")\n", - "ds_anom_resample" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds_anom.sst.sel(lon=300, lat=50).plot()\n", - "ds_anom_resample.sst.sel(lon=300, lat=50).plot(marker=\"o\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "
\n", - " Note: resample only works with proper datetime indexes.\n", - "
\n", - "\n", - "Rolling is also similar to pandas, but can be applied along any dimension. It\n", - "works with logical coordinates.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds_anom_rolling = ds_anom.rolling(time=12, center=True).mean()\n", - "ds_anom_rolling" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds_anom.sst.sel(lon=300, lat=50).plot(label=\"monthly anom\")\n", - "ds_anom_resample.sst.sel(lon=300, lat=50).plot(\n", - " marker=\"o\", label=\"5 year resample\"\n", - ")\n", - "ds_anom_rolling.sst.sel(lon=300, lat=50).plot(label=\"12 month rolling mean\")\n", - "plt.legend()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`coarsen` does something similar to `resample`, but without being aware of time.\n", - "It operates on logical coordinates only but can work on multiple dimensions at a\n", - "time.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds_anom_coarsen_time = ds_anom.coarsen(time=12).mean()\n", - "\n", - "ds_anom_rolling.sst.sel(lon=300, lat=50).plot(label=\"12 month rolling mean\")\n", - "ds_anom_coarsen_time.sst.sel(lon=300, lat=50).plot(\n", - " marker=\"^\", label=\"12 item coarsen\"\n", - ")\n", - "plt.legend()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%%expect_exception\n", - "ds_anom_coarsen_space = ds_anom.coarsen(lon=4, lat=4).mean()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds_anom_coarsen_space = (\n", - " ds_anom.isel(lat=slice(0, -1)).coarsen(lon=4, lat=4).mean()\n", - ")\n", - "ds_anom_coarsen_space" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds_anom_coarsen_space.sst.isel(time=0).plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Exercise\n", - "\n", - "Load the following \"basin mask\" dataset, and use it to take a weighted average\n", - "of SST in each ocean basin. Figure out which ocean basins are the warmest and\n", - "coldest.\n", - "\n", - "**Hint:** you will first need to align this dataset with the SST dataset. Use\n", - "what you learned in the \"indexing and alignment\" lesson.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "basin = xr.open_dataset(\n", - " \"http://iridl.ldeo.columbia.edu/SOURCES/.NOAA/.NODC/.WOA09/.Masks/.basin/dods\"\n", - ")\n", - "basin" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.1" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/scipy-tutorial/04_plotting_and_visualization.ipynb b/scipy-tutorial/04_plotting_and_visualization.ipynb deleted file mode 100644 index 00cba153..00000000 --- a/scipy-tutorial/04_plotting_and_visualization.ipynb +++ /dev/null @@ -1,835 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "toc": true - }, - "source": [ - "\n", - "\n", - "# Plotting and Visualization\n", - "\n", - "At the end of this lesson you will learn:\n", - "\n", - "1. how to use xarray's convenient matplotlib-backed plotting interface to\n", - " visualize your datasets.\n", - "2. that `hvplot` provides an equally convenient interface for bokeh-backed plots\n", - "\n", - "## Table of contents\n", - "\n", - "1. [Basic plotting](#basic)\n", - "1. [Histograms](#hist)\n", - "1. [2D plots](#2d)\n", - "1. [1D line plots](#1d)\n", - "1. [Faceting or multiple subplots](#facet)\n", - "1. [Geography: matplotlib and cartopy](#geo)\n", - "1. [Interactive bokeh plots using hvplot](#bokeh)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T02:27:32.419178Z", - "start_time": "2020-06-11T02:27:30.533425Z" - } - }, - "outputs": [], - "source": [ - "import matplotlib as mpl\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import xarray as xr" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T02:27:32.437582Z", - "start_time": "2020-06-11T02:27:32.421755Z" - } - }, - "outputs": [], - "source": [ - "xr.set_options(display_style=\"html\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Load data\n", - "\n", - "First lets load up a tutorial dataset to visualize.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T02:27:37.555998Z", - "start_time": "2020-06-11T02:27:37.357785Z" - } - }, - "outputs": [], - "source": [ - "ds = xr.tutorial.open_dataset(\"air_temperature.nc\").rename({\"air\": \"Tair\"})\n", - "\n", - "# we will add a gradient field with appropriate attributes\n", - "ds[\"dTdx\"] = ds.Tair.differentiate(\"lon\") / 110e3 / np.cos(ds.lat * np.pi / 180)\n", - "ds[\"dTdy\"] = ds.Tair.differentiate(\"lat\") / 105e3\n", - "ds.dTdx.attrs = {\"long_name\": \"$∂T/∂x$\", \"units\": \"°C/m\"}\n", - "ds.dTdy.attrs = {\"long_name\": \"$∂T/∂y$\", \"units\": \"°C/m\"}\n", - "\n", - "ds" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This dataset has three \"data variables\", `Tair` is air temperature and `dTdx`\n", - "and `dTdy` are horizontal gradients of this temperature field. All three \"data\n", - "variables\" are three-dimensional with dimensions `(time, lat, lon)`.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "## Basic plotting: .plot()\n", - "\n", - "DataArray objects have a `plot` method. This method creates plots using\n", - "`matplotlib` so all of your existing matplotlib knowledge carries over!\n", - "\n", - "By default `.plot()` makes\n", - "\n", - "1. a line plot for 1-D arrays using `plt.plot()`\n", - "2. a `pcolormesh` plot for 2-D arrays using `plt.pcolormesh()`\n", - "3. a histogram for everything else using `plt.hist()`\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "## Histograms\n", - "\n", - "`Tair` is three-dimensional, so we got a histogram of temperature values. Notice\n", - "the label on the x-axis. One of xarray's convenient plotting features is that it\n", - "uses the `attrs` of `Tair` to nicely label axes and colorbars.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-05-30T13:15:04.121767Z", - "start_time": "2020-05-30T13:15:03.884190Z" - } - }, - "outputs": [], - "source": [ - "ds.Tair.plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can pass extra arguments to the underlying `hist()` call. See the matplotlib\n", - "docs (https://matplotlib.org/3.2.1/api/_as_gen/matplotlib.pyplot.hist.html) for\n", - "all possible keyword arguments.\n", - "\n", - "**Tip:** Note that the returned values are exactly what matplotlib would return\n", - "\n", - "#### Exercise\n", - "\n", - "Update the above plot to show 50 bins with unfilled steps instead of filled\n", - "bars.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "## 2D plots\n", - "\n", - "Now we will explore 2D plots. Let's select a single timestep of `Tair` to\n", - "visualize.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-05-30T13:15:04.364426Z", - "start_time": "2020-05-30T13:15:04.124100Z" - } - }, - "outputs": [], - "source": [ - "ds.Tair.isel(time=1).plot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice how much information is on that plot!\n", - "\n", - "The x- and y-axes are labeled with full names — \"Latitude\", \"Longitude\" — along\n", - "with units. The colorbar has a nice label, again with units. And the title tells\n", - "us the timestamp of the data presented.\n", - "\n", - "`plot` takes many keyword arguments and is quite sophisticated (see\n", - "https://xarray.pydata.org/en/stable/generated/xarray.plot.pcolormesh.html).\n", - "\n", - "Here is a more complicated figure that explicitly sets `time` as the x-axis,\n", - "customizes the colorbar, and overlays two contours at specific levels.\n", - "\n", - "**Tip:** Other options for 2D plots include `.plot.contour`, `.plot.contourf`,\n", - "`.plot.imshow`\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T02:52:00.680192Z", - "start_time": "2020-06-11T02:52:00.365423Z" - } - }, - "outputs": [], - "source": [ - "ds.Tair.isel(lon=1).plot(\n", - " x=\"time\", # coordinate to plot on the x-axis of the plot\n", - " robust=True, # set colorbar limits to 2nd and 98th percentile of data\n", - " cbar_kwargs={\n", - " \"orientation\": \"horizontal\",\n", - " \"label\": \"custom label\",\n", - " \"pad\": 0.2,\n", - " }, # passed to plt.colorbar\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercise\n", - "\n", - "Update the above plot to use a different matplotlib colormap.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Exercise\n", - "\n", - "Now overlay a contour plot on top of the previous plot\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "## 1D line plots\n", - "\n", - "xarray is also able to plot lines by wrapping `plt.plot()`. As in the earlier\n", - "examples, the axes are labelled and keyword arguments can be passed to the\n", - "underlying `matplotlib` call.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T02:49:58.450746Z", - "start_time": "2020-06-11T02:49:58.282708Z" - } - }, - "outputs": [], - "source": [ - "ds.Tair.isel(time=1, lon=10).plot(marker=\"o\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Lets say we want to compare line plots of temperature at three different\n", - "latitudes. We can use the `hue` kwarg to do this.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T02:55:01.478139Z", - "start_time": "2020-06-11T02:55:01.290510Z" - } - }, - "outputs": [], - "source": [ - "ds.Tair.isel(time=1).sel(lat=[40, 50, 60], method=\"nearest\").plot(\n", - " x=\"lon\", hue=\"lat\"\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Customization\n", - "\n", - "All of xarray's plotting functions take an large list kwargs that customize\n", - "behaviour. A full list can be seen here:\n", - "https://xarray.pydata.org/en/stable/generated/xarray.plot.pcolormesh.html. That\n", - "said xarray does not wrap all matplotlib functionality.\n", - "\n", - "The general strategy for making plots that are more complicated that the\n", - "examples above is\n", - "\n", - "1. Create a matplotlib axis `ax`\n", - "2. Use xarray to make a close approximation of the final plot specifying\n", - " `ax=ax`.\n", - "3. Use `ax` methods to fully customize the plot\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "## Faceting\n", - "\n", - "Faceting is the art of presenting \"small multiples\" of the data. It is an\n", - "effective way of visualizing variations of 3D data where 2D slices are\n", - "visualized in a panel (subplot) and the third dimensions is varied between\n", - "panels (subplots).\n", - "\n", - "Here is where xarray really augments matplotlib's functionality. We will use\n", - "monthly means to illustrate\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T03:00:50.654212Z", - "start_time": "2020-06-11T03:00:50.534996Z" - } - }, - "outputs": [], - "source": [ - "monthly_means = ds.groupby(\"time.month\").mean()\n", - "# xarray's groupby reductions drop attributes. Let's assign them back so we get nice labels.\n", - "monthly_means.Tair.attrs = ds.Tair.attrs\n", - "monthly_means" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that the dimensions are now `lat, lon, month`.\n", - "\n", - "We want to visualize how the monthly mean air temperature varies with month of\n", - "the year.\n", - "\n", - "The simplest way to facet is to specify the `row` or `col` kwargs which are\n", - "expected to be a dimension name. Here we use `month` so that each panel or\n", - "\"facet\" of the plot presents the mean temperature field in a given month. Since\n", - "a 12 column plot would be too small to interpret, we can \"wrap\" the facets into\n", - "multiple rows using `col_wrap`\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T03:01:53.163195Z", - "start_time": "2020-06-11T03:01:51.194451Z" - } - }, - "outputs": [], - "source": [ - "fg = monthly_means.Tair.plot(\n", - " col=\"month\", col_wrap=4, # each row has a maximum of 4 columns\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "All the usual customizations are possible\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T03:02:02.757064Z", - "start_time": "2020-06-11T03:02:00.759775Z" - } - }, - "outputs": [], - "source": [ - "fg = monthly_means.Tair.plot(\n", - " col=\"month\",\n", - " col_wrap=4,\n", - " # The remaining kwargs customize the plot just as for not-faceted plots\n", - " robust=True,\n", - " cmap=mpl.cm.RdYlBu_r,\n", - " cbar_kwargs={\n", - " \"orientation\": \"horizontal\",\n", - " \"shrink\": 0.8,\n", - " \"aspect\": 40,\n", - " \"pad\": 0.1,\n", - " },\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The returned FacetGrid object `fg` has many useful properties and methods e.g.\n", - "\n", - "1. `fg.fig` provides a handle to the figure\n", - "2. `fg.axes` is a numpy object array with handles to each individual axes\n", - "3. `fg.set_xlabels` and `fg.set_ylabels` can be used to change axes labels.\n", - "\n", - "See https://xarray.pydata.org/en/stable/api.html#faceting for a full list.\n", - "\n", - "### Exercise\n", - "\n", - "Use these methods to set a title for the figure using `suptitle`, as well as\n", - "change the x- and y-labels.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fg" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Modifying all facets of a plot\n", - "\n", - "The FacetGrid object has some more advanced methods that let you customize the\n", - "plot further.\n", - "\n", - "Here we illustrate the use of `map` and `map_dataarray` that let you map custom\n", - "plotting functions to an existing `FacetGrid`. The functions passed to `map` and\n", - "`map_dataarray` must have a particular signature. See the docstring for more\n", - "details.\n", - "\n", - "Alternatively one can loop over `fg.axes` and modify each individual subplot as\n", - "needed\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T03:06:40.368314Z", - "start_time": "2020-06-11T03:06:38.735106Z" - } - }, - "outputs": [], - "source": [ - "fg = monthly_means.Tair.plot(col=\"month\", col_wrap=4)\n", - "\n", - "# Use this to plot contours on each panel\n", - "# Note that this plotting call uses the original DataArray gradients\n", - "fg.map_dataarray(\n", - " xr.plot.contour, x=\"lon\", y=\"lat\", colors=\"k\", levels=13, add_colorbar=False\n", - ")\n", - "\n", - "# Add a point (or anything else!)\n", - "fg.map(lambda: plt.plot(250, 40, markersize=20, marker=\".\", color=\"w\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Faceting tip: Use faceting to plot multiple DataArrays\n", - "\n", - "Faceting can be used to plot multiple DataArrays in a Dataset. The trick is to\n", - "use `to_array()` to convert a Dataset to a DataArray and thne facet that.\n", - "\n", - "This trick only works when it is sensible to use the same colormap and color\n", - "scale for all DataArrays like with `dTdx` and `dTdy`\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T03:05:00.036216Z", - "start_time": "2020-06-11T03:04:59.973964Z" - } - }, - "outputs": [], - "source": [ - "gradients = monthly_means[[\"dTdx\", \"dTdy\"]].to_array(\"gradient\")\n", - "gradients" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T03:05:02.894528Z", - "start_time": "2020-06-11T03:05:01.454396Z" - } - }, - "outputs": [], - "source": [ - "fg = gradients.isel(month=slice(None, None, 3)).plot.contourf(\n", - " levels=13,\n", - " col=\"month\",\n", - " row=\"gradient\",\n", - " robust=True,\n", - " cmap=mpl.cm.coolwarm,\n", - " cbar_kwargs={\n", - " \"orientation\": \"horizontal\",\n", - " \"shrink\": 0.8,\n", - " \"aspect\": 40,\n", - " \"label\": \"Gradient [°C/m]\",\n", - " },\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "## Geography: Matplotlib and Cartopy\n", - "\n", - "Since xarray's default plotting functionality builds on matplotlib, we can\n", - "seamlessly use cartopy to make nice maps:\n", - "\n", - "1. Specify a `projection` for the plot when creating a new figure `fig` with\n", - " axis `axis`.\n", - "2. Explicitly ask xarray to plot to axis `axis` by passing the kwarg `ax=axis`.\n", - "3. Specify the projection of the data using `transform` (`PlateCarree` here) in\n", - " `.plot()`.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T03:17:25.685880Z", - "start_time": "2020-06-11T03:17:25.512169Z" - } - }, - "outputs": [], - "source": [ - "import cartopy.crs as ccrs\n", - "\n", - "fig, axis = plt.subplots(\n", - " 1, 1, subplot_kw=dict(projection=ccrs.Orthographic(-90, 30))\n", - ")\n", - "\n", - "ds.Tair.isel(time=1).plot(\n", - " ax=axis,\n", - " transform=ccrs.PlateCarree(), # this is important!\n", - " # usual xarray stuff\n", - " cbar_kwargs={\"orientation\": \"horizontal\", \"shrink\": 0.7},\n", - " robust=True,\n", - ")\n", - "axis.coastlines() # cartopy function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Faceting maps\n", - "\n", - "We can make faceted maps. Since `FacetGrid` creates the axes it plots to, we\n", - "need to pass the `projection` kwarg in `subplot_kws`. This makes sure that the\n", - "subplots are set up properly for cartopy.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T03:22:50.356379Z", - "start_time": "2020-06-11T03:22:50.044591Z" - } - }, - "outputs": [], - "source": [ - "fg = monthly_means.Tair.isel(month=[1, 2, 3]).plot(\n", - " col=\"month\",\n", - " transform=ccrs.PlateCarree(), # remember to provide this!\n", - " subplot_kws={\n", - " \"projection\": ccrs.LambertConformal(\n", - " central_longitude=-95, central_latitude=45\n", - " )\n", - " },\n", - " cbar_kwargs={\"orientation\": \"horizontal\", \"shrink\": 0.8, \"aspect\": 40},\n", - " robust=True,\n", - ")\n", - "\n", - "# lets add a coastline to each axis\n", - "# great reason to use FacetGrid.map\n", - "fg.map(lambda: plt.gca().coastlines())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "## Interactive bokeh plots using hvplot\n", - "\n", - "Xarray's builtin plotting functionality wraps matplotlib.\n", - "\n", - "The `holoviews` plotting ecosystem provides the `hvplot` package to allow easy\n", - "visualization of xarray (and other) objects (https://hvplot.holoviz.org/). These\n", - "plots build on [Bokeh](https://bokeh.org/).\n", - "\n", - "`hvplot` makes uses of xarray's accessor interface. This means that all xarray\n", - "objects gain a `.hvplot` attribute that lets you access `hvplot` functionality\n", - "as easily as you would use `.plot`\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T03:12:07.379960Z", - "start_time": "2020-06-11T03:12:05.559749Z" - } - }, - "outputs": [], - "source": [ - "import hvplot.xarray" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**`hvplot` makes the same default choices as xarray**\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T03:12:10.251511Z", - "start_time": "2020-06-11T03:12:09.004741Z" - } - }, - "outputs": [], - "source": [ - "ds.Tair.hvplot()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T03:12:13.498644Z", - "start_time": "2020-06-11T03:12:13.391829Z" - } - }, - "outputs": [], - "source": [ - "# 2D array yields a quadmesh plot\n", - "ds.Tair.isel(time=1).hvplot(cmap=\"fire\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T03:12:15.282022Z", - "start_time": "2020-06-11T03:12:15.180088Z" - } - }, - "outputs": [], - "source": [ - "# 1D array yields a line plot\n", - "ds.Tair.isel(time=1, lon=1).hvplot()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Interactivity\n", - "\n", - "But `hvplot` shines when interactivity is used. Here we can give it _all_ the\n", - "data and ask it to create a nice slider to control the time slice using the\n", - "`groupby` kwarg.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T03:12:41.353540Z", - "start_time": "2020-06-11T03:12:41.143491Z" - } - }, - "outputs": [], - "source": [ - "ds.Tair.hvplot(\n", - " groupby=\"time\",\n", - " clim=(250, 295), # adds a widget for time # sets colorbar limits\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Animations are easy\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T03:12:47.032547Z", - "start_time": "2020-06-11T03:12:46.820441Z" - } - }, - "outputs": [], - "source": [ - "# set constant colorbar limits\n", - "ds.Tair.hvplot(\n", - " groupby=\"time\", # adds a widget for time\n", - " clim=(250, 295), # sets colormap limits\n", - " widget_type=\"scrubber\",\n", - " widget_location=\"bottom\",\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Geography\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "end_time": "2020-06-11T03:23:34.446468Z", - "start_time": "2020-06-11T03:23:32.211041Z" - } - }, - "outputs": [], - "source": [ - "ds.Tair.isel(time=1).hvplot(\n", - " projection=ccrs.Orthographic(-90, 30), coastline=True,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## More resources\n", - "\n", - "1. Xarray's visualization gallery:\n", - " https://xarray.pydata.org/en/stable/examples/visualization_gallery.html\n", - "2. Xarray's plotting documentation:\n", - " https://xarray.pydata.org/en/stable/plotting.html\n", - "3. hvplot's plotting documentation:\n", - " https://hvplot.holoviz.org/user_guide/Gridded_Data.html\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.6" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": true, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": true - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/scipy-tutorial/06_xarray_and_dask.ipynb b/scipy-tutorial/06_xarray_and_dask.ipynb deleted file mode 100644 index 5248da70..00000000 --- a/scipy-tutorial/06_xarray_and_dask.ipynb +++ /dev/null @@ -1,661 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "# Xarray and Dask\n", - "\n", - "This notebook demonstrates one of xarray's most powerful features: the ability\n", - "to wrap dask arrays and allow users to seamlessly execute analysis code in\n", - "parallel.\n", - "\n", - "By the end of this notebook, you will:\n", - "\n", - "1. Xarray DataArrays and Datasets are \"dask collections\" i.e. you can execute\n", - " top-level dask functions such as `dask.visualize(xarray_object)`\n", - "2. Learn that all xarray built-in operations can transparently use dask\n", - "3. Learn that xarray provides tools to easily parallelize custom functions\n", - " across blocks of dask-backed xarray objects.\n", - "\n", - "## Table of contents\n", - "\n", - "1. [Reading data with Dask and Xarray](#readwrite)\n", - "2. [Parallel/streaming/lazy computation using dask.array with Xarray](#compute)\n", - "3. [Automatic parallelization with apply_ufunc and map_blocks](#applymap)\n", - "\n", - "First lets do the necessary imports, start a dask cluster and test the dashboard\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import expectexception\n", - "import numpy as np\n", - "import xarray as xr" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First lets set up a `LocalCluster` using `dask.distributed`.\n", - "\n", - "You can use any kind of dask cluster. This step is completely independent of\n", - "xarray.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from dask.distributed import Client\n", - "\n", - "client = Client()\n", - "client" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "

👆

Click the Dashboard link above. Or click the \"Search\" button in the dashboard.\n", - "\n", - "Let's test that the dashboard is working..\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import dask.array\n", - "\n", - "dask.array.ones(\n", - " (1000, 4), chunks=(2, 1)\n", - ").compute() # should see activity in dashboard" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "## Reading data with Dask and Xarray\n", - "\n", - "The `chunks` argument to both `open_dataset` and `open_mfdataset` allow you to\n", - "read datasets as dask arrays. See\n", - "https://xarray.pydata.org/en/stable/dask.html#reading-and-writing-data for more\n", - "details\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds = xr.tutorial.open_dataset(\n", - " \"air_temperature\",\n", - " chunks={\n", - " \"lat\": 25,\n", - " \"lon\": 25,\n", - " \"time\": -1,\n", - " }, # this tells xarray to open the dataset as a dask array\n", - ")\n", - "ds" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The repr for the `air` DataArray shows the dask repr.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.air" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.air.chunks" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Tip**: All variables in a `Dataset` need _not_ have the same chunk size along\n", - "common dimensions.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mean = ds.air.mean(\"time\") # no activity on dashboard\n", - "mean # contains a dask array" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is true for all xarray operations including slicing\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.air.isel(lon=1, lat=20)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "and more complicated operations...\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "## Parallel/streaming/lazy computation using dask.array with Xarray\n", - "\n", - "Xarray seamlessly wraps dask so all computation is deferred until explicitly\n", - "requested\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mean = ds.air.mean(\"time\") # no activity on dashboard\n", - "mean # contains a dask array" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This is true for all xarray operations including slicing\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "timeseries = (\n", - " ds.air.rolling(time=5).mean().isel(lon=1, lat=20)\n", - ") # no activity on dashboard\n", - "timeseries # contains dask array" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "timeseries = ds.air.rolling(time=5).mean() # no activity on dashboard\n", - "timeseries # contains dask array" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Getting concrete values from dask arrays\n", - "\n", - "At some point, you will want to actually get concrete values from dask.\n", - "\n", - "There are two ways to compute values on dask arrays. These concrete values are\n", - "usually numpy arrays but could be a `pydata/sparse` array for example.\n", - "\n", - "1. `.compute()` returns an xarray object\n", - "2. `.load()` replaces the dask array in the xarray object with a numpy array.\n", - " This is equivalent to `ds = ds.compute()`\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "computed = mean.compute() # activity on dashboard\n", - "computed # has real numpy values" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Note that `mean` still contains a dask array\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mean" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But if we call `.load()`, `mean` will now contain a numpy array\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mean.load()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's check that again...\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "mean" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Tip:** `.persist()` loads the values into distributed RAM. This is useful if\n", - "you will be repeatedly using a dataset for computation but it is too large to\n", - "load into local memory. You will see a persistent task on the dashboard.\n", - "\n", - "See https://docs.dask.org/en/latest/api.html#dask.persist for more\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Extracting underlying data: `.values` vs `.data`\n", - "\n", - "There are two ways to pull out the underlying data in an xarray object.\n", - "\n", - "1. `.values` will always return a NumPy array. For dask-backed xarray objects,\n", - " this means that compute will always be called\n", - "2. `.data` will return a Dask array\n", - "\n", - "#### Exercise\n", - "\n", - "Try extracting a dask array from `ds.air`\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now extract a NumPy array from `ds.air`. Do you see compute activity on your\n", - "dashboard?\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Xarray data structures are first-class dask collections.\n", - "\n", - "This means you can do things like `dask.compute(xarray_object)`,\n", - "`dask.visualize(xarray_object)`, `dask.persist(xarray_object)`. This works for\n", - "both DataArrays and Datasets\n", - "\n", - "#### Exercise\n", - "\n", - "Visualize the task graph for `mean`\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Visualize the task graph for `mean.data`. Is that the same as the above graph?\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "## Automatic parallelization with apply_ufunc and map_blocks\n", - "\n", - "Almost all of xarray’s built-in operations work on Dask arrays.\n", - "\n", - "Sometimes analysis calls for functions that aren't in xarray's API (e.g. scipy).\n", - "There are three ways to apply these functions in parallel on each block of your\n", - "xarray object:\n", - "\n", - "1. Extract Dask arrays from xarray objects (`.data`) and use Dask directly e.g.\n", - " (`apply_gufunc`, `map_blocks`, `map_overlap`, or `blockwise`)\n", - "\n", - "2. Use `xarray.apply_ufunc()` to apply functions that consume and return NumPy\n", - " arrays.\n", - "\n", - "3. Use `xarray.map_blocks()`, `Dataset.map_blocks()` or `DataArray.map_blocks()`\n", - " to apply functions that consume and return xarray objects.\n", - "\n", - "Which method you use ultimately depends on the type of input objects expected by\n", - "the function you're wrapping, and the level of performance or convenience you\n", - "desire.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### `map_blocks`\n", - "\n", - "`map_blocks` is inspired by the `dask.array` function of the same name and lets\n", - "you map a function on blocks of the xarray object (including Datasets!).\n", - "\n", - "At _compute_ time, your function will receive an xarray object with concrete\n", - "(computed) values along with appropriate metadata. This function should return\n", - "an xarray object.\n", - "\n", - "Here is an example\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def time_mean(obj):\n", - " # use xarray's convenient API here\n", - " # you could convert to a pandas dataframe and use pandas' extensive API\n", - " # or use .plot() and plt.savefig to save visualizations to disk in parallel.\n", - " return obj.mean(\"lat\")\n", - "\n", - "\n", - "ds.map_blocks(time_mean) # this is lazy!" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# this will calculate values and will return True if the computation works as expected\n", - "ds.map_blocks(time_mean).identical(ds.mean(\"lat\"))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Exercise\n", - "\n", - "Try applying the following function with `map_blocks`. Specify `scale` as an\n", - "argument and `offset` as a kwarg.\n", - "\n", - "The docstring should help:\n", - "https://xarray.pydata.org/en/stable/generated/xarray.map_blocks.html\n", - "\n", - "```\n", - "def time_mean_scaled(obj, scale, offset):\n", - " return obj.mean(\"lat\") * scale + offset\n", - "```\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### More advanced functions\n", - "\n", - "`map_blocks` needs to know what the returned object looks like _exactly_. It\n", - "does so by passing a 0-shaped xarray object to the function and examining the\n", - "result. This approach cannot work in all cases For such advanced use cases,\n", - "`map_blocks` allows a `template` kwarg. See\n", - "https://xarray.pydata.org/en/latest/dask.html#map-blocks for more details\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### apply_ufunc\n", - "\n", - "`apply_ufunc` is a more advanced wrapper that is designed to apply functions\n", - "that expect and return NumPy (or other arrays). For example, this would include\n", - "all of SciPy's API. Since `apply_ufunc` operates on lower-level NumPy or Dask\n", - "objects, it skips the overhead of using Xarray objects making it a good choice\n", - "for performance-critical functions.\n", - "\n", - "`apply_ufunc` can be a little tricky to get right since it operates at a lower\n", - "level than `map_blocks`. On the other hand, Xarray uses `apply_ufunc` internally\n", - "to implement much of its API, meaning that it is quite powerful!\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### A simple example\n", - "\n", - "Simple functions that act independently on each value should work without any\n", - "additional arguments. However `dask` handling needs to be explictly enabled\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [ - "raises-exception" - ] - }, - "outputs": [], - "source": [ - "%%expect_exception\n", - "\n", - "squared_error = lambda x, y: (x - y) ** 2\n", - "\n", - "xr.apply_ufunc(squared_error, ds.air, 1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There are two options for the `dask` kwarg.\n", - "\n", - "1. `dask=\"allowed\"` Dask arrays are passed to the user function. This is a good\n", - " choice if your function can handle dask arrays and won't call compute\n", - " explicitly.\n", - "2. `dask=\"parallelized\"`. This applies the user function over blocks of the dask\n", - " array using `dask.array.blockwise`. This is useful when your function cannot\n", - " handle dask arrays natively (e.g. scipy API).\n", - "\n", - "Since `squared_error` can handle dask arrays without computing them, we specify\n", - "`dask=\"allowed\"`.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "sqer = xr.apply_ufunc(squared_error, ds.air, 1, dask=\"allowed\",)\n", - "sqer # dask-backed DataArray! with nice metadata!" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### A more complicated example with a dask-aware function\n", - "\n", - "For using more complex operations that consider some array values collectively,\n", - "it’s important to understand the idea of **core dimensions** from NumPy’s\n", - "generalized ufuncs. Core dimensions are defined as dimensions that should not be\n", - "broadcast over. Usually, they correspond to the fundamental dimensions over\n", - "which an operation is defined, e.g., the summed axis in `np.sum`. A good clue\n", - "that core dimensions are needed is the presence of an `axis` argument on the\n", - "corresponding NumPy function.\n", - "\n", - "With `apply_ufunc`, core dimensions are recognized by name, and then moved to\n", - "the last dimension of any input arguments before applying the given function.\n", - "This means that for functions that accept an `axis` argument, you usually need\n", - "to set `axis=-1`\n", - "\n", - "Let's use `dask.array.mean` as an example of a function that can handle dask\n", - "arrays and uses an `axis` kwarg\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def time_mean(da):\n", - " return xr.apply_ufunc(\n", - " dask.array.mean,\n", - " da,\n", - " input_core_dims=[[\"time\"]],\n", - " dask=\"allowed\",\n", - " kwargs={\"axis\": -1}, # core dimensions are moved to the end\n", - " )\n", - "\n", - "\n", - "time_mean(ds.air)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "ds.air.mean(\"time\").identical(time_mean(ds.air))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Automatically parallelizing dask-unaware functions\n", - "\n", - "A very useful `apply_ufunc` feature is the ability to apply arbitrary functions\n", - "in parallel to each block. This ability can be activated using\n", - "`dask=\"parallelized\"`. Again xarray needs a lot of extra metadata, so depending\n", - "on the function, extra arguments such as `output_dtypes` and `output_sizes` may\n", - "be necessary.\n", - "\n", - "We will use `scipy.integrate.trapz` as an example of a function that cannot\n", - "handle dask arrays and requires a core dimension.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import scipy as sp\n", - "import scipy.integrate\n", - "\n", - "sp.integrate.trapz(ds.air.data) # does NOT return a dask array" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Exercise\n", - "\n", - "Use `apply_ufunc` to apply `sp.integrate.trapz` along the `time` axis so that\n", - "you get a dask array returned. You will need to specify `dask=\"parallelized\"`\n", - "and `output_dtypes` (a list of `dtypes` per returned variable).\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## More\n", - "\n", - "1. https://xarray.pydata.org/en/stable/examples/apply_ufunc_vectorize_1d.html#\n", - "2. https://docs.dask.org/en/latest/array-best-practices.html\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.2" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 30a5d175..00000000 --- a/setup.cfg +++ /dev/null @@ -1,12 +0,0 @@ -[flake8] -max-line-length = 100 -per-file-ignores = conf.py:E501 - -[isort] -default_section = THIRDPARTY -known_third_party = nbconvert,nbformat -multi_line_output = 3 -include_trailing_comma = True -force_grid_wrap = 0 -use_parentheses = True -line_length = 100 diff --git a/workshops/oceanhackweek2020/README.md b/workshops/oceanhackweek2020/README.md new file mode 100644 index 00000000..9155eae2 --- /dev/null +++ b/workshops/oceanhackweek2020/README.md @@ -0,0 +1,15 @@ +# Oceanhackweek 2020 + +Presented August 2020 at [OceanHackWeek](https://oceanhackweek.github.io) by Deepak Cheerian + +This 45-minute tutorial covers the basics of Xarray data structures. + +Video Recording: +https://www.youtube.com/watch?v=q020HHnGAWo + +By the end of the lesson, we will be able to: + +- Understand the basic data structures in Xarray +- Inspect `DataArray` and `Dataset` objects. +- Read and write netCDF files using Xarray. +- Understand that there are many packages that build on top of xarray diff --git a/workshops/online-tutorial-series/01_xarray_fundamentals.ipynb b/workshops/online-tutorial-series/01_xarray_fundamentals.ipynb new file mode 100644 index 00000000..03eded1c --- /dev/null +++ b/workshops/online-tutorial-series/01_xarray_fundamentals.ipynb @@ -0,0 +1,448 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Xarray Fundamentals\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Learning Objectives\n", + "\n", + "- Provide an overview of xarray\n", + "- Describe the core xarray data structures, the DataArray and the Dataset, and\n", + " the components that make them up\n", + "- Load xarray dataset from a netCDF file\n", + "- View and set attributes\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What Is Xarray?\n", + "\n", + "- Unlabeled, N-dimensional arrays of numbers (e.g., NumPy’s ndarray) are the\n", + " most widely used data structure in scientific computing. However, they lack a\n", + " meaningful representation of the metadata associated with their data.\n", + " Implementing such functionality is left to individual users and\n", + " domain-specific packages.\n", + "\n", + "- xarray expands on the capabilities of NumPy arrays, providing a lot of\n", + " streamline data manipulation.\n", + "\n", + "- Xarray's interface is based largely on the netCDF data model (variables,\n", + " attributes, and dimensions), but it goes beyond the traditional netCDF\n", + " interfaces to provide functionality similar to netCDF-java's Common Data Model\n", + " (CDM).\n", + "\n", + "- xarray is motivated by weather and climate use cases but is **domain\n", + " agnostic**...\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Core Data Structures\n", + "\n", + "- xarray has 2 fundamental data structures:\n", + "\n", + " - `DataArray`, which holds single multi-dimensional variables and its\n", + " coordinates\n", + " - `Dataset`, which holds multiple variables that potentially share the same\n", + " coordinates\n", + "\n", + "![](../../images/xarray-data-structures.png)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Loading data from netCDF\n", + "\n", + "- NetCDF (network Common Data Form) is a file format for storing\n", + " multidimensional array data\n", + "- NetCDF is a self-describing, meaning that a netCDF file includes information\n", + " about the data it contains, and the necessary metadata such as coordinate\n", + " system used, attributes describing the data, etc...\n", + "- NetCDF is used extensively in the geoscience communities\n", + "- Xarray's interface is based largely on the netCDF data model\n", + "\n", + "Learn more about netCDF\n", + "[here](https://docs.unidata.ucar.edu/netcdf-c/current/faq.html#What-Is-netCDF).\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr\n", + "\n", + "%config InlineBackend.figure_format='retina'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Load mean sea surface temperature dataset\n", + "ds = xr.open_dataset(\"../../data/sst.mnmean.nc\", engine=\"netcdf4\")\n", + "\n", + "# xarray's HTML representation\n", + "ds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# If you prefer a text based repr, you can set the display_style='text' by uncommenting the line below\n", + "# xr.set_options(display_style=\"text\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-output", + "output_scroll" + ] + }, + "outputs": [], + "source": [ + "# Look at the netCDF representation\n", + "ds.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `Dataset`\n", + "\n", + "- Xarray's `Dataset` is a dict-like container of labeled arrays (`DataArrays`)\n", + " with aligned dimensions. - It is designed as an in-memory representation of a\n", + " netCDF dataset.\n", + "- In addition to the dict-like interface of the dataset itself, which can be\n", + " used to access any `DataArray` in a `Dataset`. Datasets have the following key\n", + " properties:\n", + "\n", + "| Attribute | Description |\n", + "| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------- |\n", + "| `data_vars` | OrderedDict of `DataArray` objects corresponding to data variables. |\n", + "| `dims` | dictionary mapping from dimension names to the fixed length of each dimension (e.g., {`lat`: 6, `lon`: 6, `time`: 8}). |\n", + "| `coords` | a dict-like container of arrays (coordinates) that label each point (e.g., 1-dimensional arrays of numbers, datetime objects or strings) |\n", + "| `attrs` | OrderedDict to hold arbitrary metadata pertaining to the dataset. |\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# variables are in our dataset\n", + "ds.data_vars" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# select one variable and pick the first entry along the first axis (time)\n", + "ds.sst[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot one timestep\n", + "ds.sst[0].plot();" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# dataset dimensions\n", + "ds.dims" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# dataset coordinates\n", + "ds.coords" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "output_scroll" + ] + }, + "outputs": [], + "source": [ + "# dataset global attributes\n", + "ds.attrs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### `DataArray`\n", + "\n", + "The DataArray is xarray's implementation of a labeled, multi-dimensional array.\n", + "It has several key properties:\n", + "\n", + "| Attribute | Description |\n", + "| --------- | ---------------------------------------------------------------------------------------------------------------------------------------- |\n", + "| `data` | `numpy.ndarray` or `dask.array` holding the array's values. |\n", + "| `dims` | dimension names for each axis. For example:(`x`, `y`, `z`) (`lat`, `lon`, `time`). |\n", + "| `coords` | a dict-like container of arrays (coordinates) that label each point (e.g., 1-dimensional arrays of numbers, datetime objects or strings) |\n", + "| `attrs` | an `OrderedDict` to hold arbitrary attributes/metadata (such as units) |\n", + "| `name` | an arbitrary name of the array |\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Extract the sst Variable/DataArray\n", + "ds[\"sst\"] # Equivalent to ds.sst" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "# The actual (numpy) array data\n", + "ds.sst.data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# DataArray/Variable dimensions\n", + "ds.sst.dims" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# DataArray/Variable coordinates\n", + "ds.sst.coords" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# DataArray/Variable attributes\n", + "ds.sst.attrs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Coordinates vs dimensions\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- DataArray objects inside a Dataset may have any number of dimensions but are\n", + " presumed to share a common coordinate system.\n", + "- Coordinates can also have any number of dimensions but denote\n", + " constant/independent quantities, unlike the varying/dependent quantities that\n", + " belong in data.\n", + "- A dimension is just a name of an axis, like \"time\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.dims" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.coords" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "# extracting a coordinate variable\n", + "ds.sst.lon" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "# extracting a coordinate variable from .coords\n", + "ds.coords[\"time\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Attributes\n", + "\n", + "Attributes can be used to store metadata. What metadata should you store? It\n", + "depends on your domain and your needs\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "output_scroll" + ] + }, + "outputs": [], + "source": [ + "# Look at global attributes\n", + "ds.attrs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Look at variable specific attributes\n", + "ds.sst.attrs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Set some arbitrary attribute on a data Variable/DataArray\n", + "ds.sst.attrs[\"my_custom_attribute\"] = \"Foo Bar\"\n", + "ds.sst.attrs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Going Further\n", + "\n", + "- Xarray Documentation on Data Structures:\n", + " https://docs.xarray.dev/en/stable/data-structures.html\n", + "- Xarray Documentation on Reading files and writing files:\n", + " https://docs.xarray.dev/en/stable/user-guide/io.html\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "

Next: Indexing

\n", + "
\n" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": true, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + }, + "toc-autonumbering": true + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/workshops/online-tutorial-series/02_indexing.ipynb b/workshops/online-tutorial-series/02_indexing.ipynb new file mode 100644 index 00000000..8e7ffe79 --- /dev/null +++ b/workshops/online-tutorial-series/02_indexing.ipynb @@ -0,0 +1,351 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Indexing and Selecting Data\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Learning Objectives\n", + "\n", + "- Select data by position using `.isel` with values or slices\n", + "- Select data by label using `.sel` with values or slices\n", + "- Select timeseries data by date/time with values or slices\n", + "- Use nearest-neighbor lookups with `.sel`\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Why do we need label-based indexing?\n", + "\n", + "Scientific data is inherently labeled. For example, time series data includes\n", + "timestamps that label individual periods or points in time, spatial data has\n", + "coordinates (e.g. longitude, latitude, elevation), and model or laboratory\n", + "experiments are often identified by unique identifiers.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr\n", + "\n", + "%config InlineBackend.figure_format='retina'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.open_dataset(\"../../data/sst.mnmean.nc\")\n", + "ds" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## NumPy Positional Indexing\n", + "\n", + "When working with numpy, indexing is done by position (slices/ranges/scalars).\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "t = ds[\"sst\"].data # numpy array\n", + "t" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "t.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "# extract a time-series for one spatial location\n", + "t[:, 20, 40]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "but wait, what labels go with 20 and 40? Was that lat/lon or lon/lat? Where are the timestamps that go along with this time-series?\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Indexing with xarray\n", + "\n", + "xarray offers extremely flexible indexing routines that combine the best\n", + "features of NumPy and pandas for data selection.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "da = ds[\"sst\"] # Extract data array\n", + "da" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- **NumPy style indexing still works (but preserves the labels/metadata)**\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "da[:, 20, 40]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- **Positional indexing using dimension names**\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da.isel(lat=60, lon=40).plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- **Label-based indexing**\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da.sel(lat=-32, lon=80).plot();" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da.sel(lat=50.0, lon=200.0, time=\"2020\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# demonstrate slicing\n", + "ds.sel(time=slice(\"2019-05\", \"2020-07\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- **Nearest Neighbor Lookups**\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "da.sel(lat=52.25, lon=251.8998, method=\"nearest\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "- **All of these indexing methods work on the dataset too:**\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds.sel(lat=52.25, lon=251.8998, method=\"nearest\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Vectorized Indexing\n", + "\n", + "Like numpy and pandas, xarray supports indexing many array elements at once in a\n", + "vectorized manner:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# generate a coordinates for a transect of points\n", + "lat_points = xr.DataArray([60, 80, 90], dims=\"points\")\n", + "lon_points = xr.DataArray([250, 250, 250], dims=\"points\")\n", + "lat_points" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "lon_points" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# nearest neighbor selection along the transect\n", + "da.sel(lat=lat_points, lon=lon_points, method=\"nearest\").plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Indexing with `where()`\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "hide-output" + ] + }, + "outputs": [], + "source": [ + "# Let's replace the missing values (nan) with some placeholder\n", + "ds.sst.where(ds.sst.notnull(), -99)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Going Further\n", + "\n", + "- [Xarray Docs - Indexing and Selecting Data](https://docs.xarray.dev/en/stable/indexing.html)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "

Previous: xarray fundamentals

\n", + "

Next: Computation

\n", + "
\n" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": true, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/workshops/online-tutorial-series/03_computation.ipynb b/workshops/online-tutorial-series/03_computation.ipynb new file mode 100644 index 00000000..f4ae294e --- /dev/null +++ b/workshops/online-tutorial-series/03_computation.ipynb @@ -0,0 +1,312 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Computation\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Learning Objectives\n", + "\n", + "- Do basic arithmetic with DataArrays and Datasets\n", + "- Perform aggregation (reduction) along one or multiple dimensions of a\n", + " DataArray or Dataset\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Arithmetic Operations\n", + "\n", + "Arithmetic operations with a single DataArray automatically vectorize (like\n", + "numpy) over all array values:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds = xr.open_dataset(\"../../data/sst.mnmean.nc\")\n", + "da = ds[\"sst\"]\n", + "da" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da + 273.15" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Aggregation (Reduction) Methods\n", + "\n", + "Xarray supports many of the aggregations methods that numpy has. A partial list\n", + "includes: all, any, argmax, argmin, max, mean, median, min, prod, sum, std, var.\n", + "\n", + "Whereas the numpy syntax would require scalar axes, xarray can use dimension\n", + "names:\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da_mean = da.mean(dim=\"time\")\n", + "da_mean" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da.std(dim=[\"lat\", \"lon\"]).plot()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Broadcasting:\n", + "\n", + "**Broadcasting** allows an operator or a function to act on two or more arrays\n", + "to operate even if these arrays do not have the same shape. That said, not all\n", + "the dimensions can be subjected to broadcasting; they must meet certain rules.\n", + "The image below illustrates how performing an operation on arrays with\n", + "differently coordinates will result in automatic broadcasting\n", + "\n", + "![](../../images/broadcasting.png)\n", + "\n", + "Credit: Stephan Hoyer --\n", + "[xarray ECMWF Python workshop](https://docs.google.com/presentation/d/16CMY3g_OYr6fQplUZIDqVtG-SKZqsG8Ckwoj2oOqepU/)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da.shape, da.dims" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "da_mean.shape, da_mean.dims" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Subtract the mean (2D array) from the original array (3D array)\n", + "x = da - da_mean\n", + "x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## High level computation: groupby, resample, rolling, coarsen, weighted\n", + "\n", + "Xarray has some very useful high level objects that let you do common\n", + "computations:\n", + "\n", + "- `groupby` :\n", + " [Bin data in to groups and reduce](https://docs.xarray.dev/en/stable/groupby.html)\n", + "- `resample` :\n", + " [Groupby specialized for time axes. Either downsample or upsample your data](https://docs.xarray.dev/en/stable/user-guide/time-series.html#resampling-and-grouped-operations).\n", + "- `rolling` :\n", + " [Operate on rolling windows of your data e.g. running mean](https://docs.xarray.dev/en/stable/user-guide/computation.html#rolling-window-operations)\n", + "- `coarsen` :\n", + " [Downsample your data](https://docs.xarray.dev/en/stable/user-guide/computation.html#coarsen-large-arrays)\n", + "- `weighted` :\n", + " [Weight your data before applying reductions](https://docs.xarray.dev/en/stable/user-guide/computation.html#weighted-array-reductions)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### groupby\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ds" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# seasonal groups\n", + "ds.groupby(\"time.season\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# day of the week groups\n", + "ds.groupby(\"time.dayofweek\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# compute a seasonal mean\n", + "seasonal_mean = ds.groupby(\"time.season\").mean()\n", + "seasonal_mean" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# The seasons are out of order (they are alphabetically sorted). This is a common annoyance. The solution is to use .reindex\n", + "seasonal_mean = seasonal_mean.reindex(season=[\"DJF\", \"MAM\", \"JJA\", \"SON\"])\n", + "seasonal_mean" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "seasonal_mean.sst.plot(col=\"season\", robust=True, cmap=\"turbo\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### resample\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# resample to bi-monthly frequency\n", + "ds.sst.resample(time=\"2MS\").mean()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### rolling window operations\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# A rolling mean with a window size of 7\n", + "ds.sst.rolling(time=7).mean()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Going Further\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "

Computation with xarray (extended version): Computation with xarray notebook

\n", + "

Plotting and visualization (extended version): Plotting and Visualization notebook

\n", + "
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": true, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": true + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/workshops/online-tutorial-series/README.md b/workshops/online-tutorial-series/README.md new file mode 100644 index 00000000..6b68c89f --- /dev/null +++ b/workshops/online-tutorial-series/README.md @@ -0,0 +1,23 @@ +# Xarray Online Tutorial 2020 + +Presented October 6 2020 by: + +- Anderson Banihirwe (NCAR) +- Deepak Cherian (NCAR) +- Martin Durant (Anaconda) + +This 90 minute tutorial covers fundamentals of Xarray, indexing, computation + visualization. + +Video Recoding: +https://www.youtube.com/watch?v=a339Q5F48UQ&list=PLNemzZpJM7lUu_iGP_lA2m7SeSUwKSIvR&index=8 + +## Schedule + +_These are the rough timings for the tutorial_: + +| Topic | Time (min) | +| --------------------------- | ---------- | +| Xarray fundamentals | 30 | +| Indexing | 15 | +| Break | 5 | +| Computation & visualization | 40 | diff --git a/workshops/scipy2023/README.md b/workshops/scipy2023/README.md new file mode 100644 index 00000000..2528e171 --- /dev/null +++ b/workshops/scipy2023/README.md @@ -0,0 +1,75 @@ +# SciPy 2023 + +## Xarray: Friendly, Interactive, and Scalable Scientific Data Analysis + +Organized by: + +- Deepak Cherian (National Center for Atmospheric Research) +- Scott Henderson (Univ. Washington) +- Jessica Scheick (Univ. New Hampshire) +- Negin Sobhani (National Center for Atmospheric Research) +- Tom Nicholas (Lamont-Doherty Earth Observatory) +- Anderson Banihirwe (CarbonPlan) +- Don Setiawan (Univ. Washington) + +## Instructions + +:::{note} +You can access a recording of this tutorial [here](https://www.youtube.com/watch?v=L4FXcIOMlsY) +::: + +### Running Locally + +See instructions to set up the environment for running the tutorial material [here](get-started). + +### Github Codespaces + +This tutorial is available to run within [Github Codespaces](https://github.com/features/codespaces) - "a development environment that's hosted in the cloud" + +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/xarray-contrib/xarray-tutorial/tree/main?devcontainer_path=.devcontainer%2Fscipy2023%2Fdevcontainer.json) + +☝️ Click the button above to go to options window to launch a Github codespace. + +A codespace is a development environment that's hosted in the cloud. +You can choose from a selection of virtual machine types: 2 cores - 4 GB RAM - 32 GB storage, and 4 cores - 8 GB RAM - 32GB storage. +Additionally, you are able to chose from various Dev container configuration, for this specific workshop, please ensure that `Scipy2023` is selected. +GitHub currently gives every user [120 vCPU hours per month for free](https://docs.github.com/en/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts), beyond that you must pay. **So be sure to explicitly stop or shut down your codespace when you are done by going to this page (https://github.com/codespaces).** + +Once your codespace is launched, the following happens: + +- [Visual Studio Code](https://code.visualstudio.com/) Interface will open up within your browser. +- A built in terminal will open and it will execute `jupyter lab` automatically. +- Once you see a url to click within the terminal, simply `cmd + click` the given url. +- This will open up another tab in your browser, leading to a [Jupyter Lab](https://jupyterlab.readthedocs.io/en/latest/) Interface. + +## Outline + +```{dropdown} Introduction +{doc}`../../overview/get-started` +``` + +```{dropdown} Indexing +{doc}`../../fundamentals/02.1_indexing_Basic` + +{doc}`../../intermediate/indexing/advanced-indexing` + +{doc}`../../intermediate/indexing/boolean-masking-indexing` +``` + +```{dropdown} Computational Patterns +{doc}`../../intermediate/computation/01-high-level-computation-patterns` +``` + +```{dropdown} Wrapping other arrays: dask +{doc}`../../intermediate/xarray_and_dask` +``` + +```{dropdown} Wrapping custom computation +{doc}`../../advanced/apply_ufunc/simple_numpy_apply_ufunc` + +{doc}`../../advanced/apply_ufunc/core-dimensions` + +{doc}`../../advanced/apply_ufunc/complex-output-numpy` + +{doc}`Explore the remaining material <../../advanced/apply_ufunc/apply_ufunc>` +``` diff --git a/workshops/scipy2023/index.ipynb b/workshops/scipy2023/index.ipynb new file mode 100644 index 00000000..3072d80e --- /dev/null +++ b/workshops/scipy2023/index.ipynb @@ -0,0 +1,67 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n", + "# Welcome to the Xarray SciPy 2023 Tutorial! \n", + "\n", + "**Xarray**: *Friendly, Interactive, and Scalable Scientific Data Analysis*\n", + "\n", + "\n", + "This *4-hour* workshop will explore content from [the Xarray tutorial](https://tutorial.xarray.dev), which contains a comprehensive collection of hands-on tutorial Jupyter Notebooks. We won't cover it all today, but instead will review a curated set of examples that will prepare you for increasingly complex real-world data analysis tasks!\n", + "\n", + "## Schedule \n", + "*Times in Central Daylight (Austin, TX)\n", + "\n", + "Use the links to navigate to the right notebooks.\n", + "\n", + "| Topic | Time | Notebook Links | \n", + "| :- | - | - | \n", + "| Introduction and Setup | 1:30 (20 min) | --- | \n", + "| Indexing | 1:50 (30 min) | [Quick Introduction to Indexing](../../fundamentals/02.1_indexing_Basic.ipynb)
[Advanced and Vectorized Indexing](../../intermediate/indexing/advanced-indexing.ipynb)
[Boolean Indexing & Masking](../../intermediate/indexing/boolean-masking-indexing.ipynb) | \n", + "| *10 minute Break* \n", + "| Computational Patterns | 2:30 (50 min) | [Computation Patterns](../../intermediate/01-high-level-computation-patterns.ipynb) | \n", + "| *10 minute Break* | \n", + "| Wrapping other arrays | 3:30 (50 min) | [Xarray and Dask](../../intermediate/xarray_and_dask.ipynb) | \n", + "| *10 minute Break* | \n", + "| Wrapping custom computation (apply_ufunc) | 4:30 (30 min)


5:00 (30 min) | [A gentle introduction](../../advanced/apply_ufunc/simple_numpy_apply_ufunc.ipynb)
[Core dimensions](../../advanced/apply_ufunc/core-dimensions.ipynb)
[Handling complex output](../../advanced/apply_ufunc/complex-output-numpy.ipynb)
Explore the rest of the material |\n", + "| | **End 5:30** | |\n", + "\n", + "\n", + "## Notes\n", + "\n", + "- Remember to select `global-global-xarray environment` for the notebooks when prompted.\n", + "\n", + "- These notebooks render best if you choose the \"Medium instance for Xarray\" option at login.\n", + "\n", + "```{tip}\n", + "Check that you see \"tip\" in a green bar 👆🏾.\n", + "```\n", + "\n", + "## Thanks for attending!\n", + "\n", + "Please continue to explore the subfolders in the JupyterLab File Browser for additional tutorial notebooks to run, or read the rendered notebooks at [https://tutorial.xarray.dev](https://tutorial.xarray.dev)" + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/workshops/scipy2024/index.ipynb b/workshops/scipy2024/index.ipynb new file mode 100644 index 00000000..8d58a17d --- /dev/null +++ b/workshops/scipy2024/index.ipynb @@ -0,0 +1,110 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# SciPy 2024\n", + "\n", + "## Welcome to the Xarray SciPy 2024 Tutorial! \n", + "\n", + "\n", + "\n", + "**Xarray**: *Friendly, Interactive, and Scalable Scientific Data Analysis*\n", + "\n", + "July 8, 13:30–17:30 (US/Pacific), Tacoma Convention Center Ballroom B/C\n", + "\n", + "This *4-hour* workshop will explore content from [the Xarray tutorial](https://tutorial.xarray.dev), which contains a comprehensive collection of hands-on tutorial Jupyter Notebooks. We will review a curated set of examples that will prepare you for increasingly complex real-world data analysis tasks!\n", + "\n", + ":::{admonition} Learning Goals\n", + "- Orient yourself to Xarray resources to continue on your Xarray journey!\n", + "- Effectively use Xarray’s multidimensional indexing and computational patterns\n", + "- Understand how Xarray integrates with other libraries in the scientific Python ecosystem\n", + "- Learn how to leverage Xarray’s powerful backend and extension capabilities to customize workflows and open a variety of scientific datasets\n", + ":::\n", + "\n", + "## Schedule \n", + "\n", + "*Times in US/Pacific Timezone (Tacoma, WA)\n", + "\n", + "Use the links to navigate to the right notebooks.\n", + "\n", + "| Topic | Time | Notebook Links | \n", + "| :- | - | - | \n", + "| Introduction and Setup | 1:30 (10 min) | --- | \n", + "| The Xarray Data Model | 1:40 (40 min) | [Data structures](../../fundamentals/01_data_structures.md)
[Basic Indexing](../../fundamentals/02.1_indexing_Basic.ipynb) | \n", + "| *10 minute Break* \n", + "| Indexing & Computational Patterns | 2:30 (50 min) | [Advanced Indexing](../../intermediate/indexing/indexing.md)
[Computational Patterns](../../intermediate/computation/01-high-level-computation-patterns.ipynb)
| \n", + "| *10 minute Break* | \n", + "| Xarray Integrations and Extensions | 3:30 (50 min) | [The Xarray Ecosystem](../../intermediate/xarray_ecosystem.ipynb) | \n", + "| *10 minute Break* | \n", + "| Backends & Remote data| 4:30 (50 min) | [Remote Data](../../intermediate/remote_data/remote-data.ipynb) |\n", + "| | End 5:30 | |\n", + "\n", + "\n", + "### Tutorial Setup\n", + "\n", + "We recommend using a preconfigured GitHub Codespace for this tutorial. This section describes how to access and manage a GitHub Codespace.\n", + "\n", + ":::{note}\n", + "If you prefer to work on your own computer, refer to instructions in the [Getting Started Section](../../overview/get-started.md)\n", + ":::\n", + "\n", + "This tutorial is available to run within [Github Codespaces](https://github.com/features/codespaces) - \"a development environment that's hosted in the cloud\".\n", + "\n", + "[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new/xarray-contrib/xarray-tutorial/tree/main?devcontainer_path=.devcontainer%2Fscipy2024%2Fdevcontainer.json)\n", + "\n", + "☝️ Click the button above to go to options window to launch a Github Codespace.\n", + "\n", + "GitHub currently gives every user [120 vCPU-hours per month for free](https://docs.github.com/en/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces#monthly-included-storage-and-core-hours-for-personal-accounts), beyond that you must pay. **So be sure to explicitly stop your Codespace when you are done by going to this page (https://github.com/codespaces).**\n", + "\n", + "Once your Codespace is launched, the following happens:\n", + "\n", + "- [Visual Studio Code](https://code.visualstudio.com/) Interface will open up within your browser.\n", + "- A built in terminal will open and it will execute `jupyter lab` automatically.\n", + "- Once you see a url to click within the terminal, simply `cmd + click` the given url.\n", + "- This will open up another tab in your browser, leading to a [Jupyter Lab](https://jupyterlab.readthedocs.io/en/latest/) Interface.\n", + "\n", + ":::{warning}\n", + "Consider Codespaces as ephemeral environments. You may lose your connection and any edits you make.\n", + ":::\n", + "\n", + "\n", + "## Thanks for attending!\n", + "\n", + "Please continue to explore the subfolders in the JupyterLab File Browser for additional tutorial notebooks to run, or read the rendered notebooks at [https://tutorial.xarray.dev](https://tutorial.xarray.dev)\n", + "\n", + "### SciPy 2024 Organized by:\n", + "\n", + "- Scott Henderson (Univ. Washington)\n", + "- Jessica Scheick (Univ. New Hampshire)\n", + "- Negin Sobhani (National Center for Atmospheric Research)\n", + "- Tom Nicholas [C]worthy\n", + "- Max Jones (CarbonPlan)\n", + "- Wietze Suijker (Space Intelligence)" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/workshops/scipy2025/index.ipynb b/workshops/scipy2025/index.ipynb new file mode 100644 index 00000000..a9670341 --- /dev/null +++ b/workshops/scipy2025/index.ipynb @@ -0,0 +1,80 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# SciPy 2025\n", + "\n", + "## Welcome to the Xarray SciPy 2025 Tutorial! \n", + "\n", + "\n", + "\n", + "**Hierarchical Data Analysis with Xarray DataTree & Zarr**\n", + "\n", + "July 8, 13:30–17:30 (US/Pacific), Tacoma Convention Center Room 315\n", + "\n", + "This *4-hour* workshop will explore content from [the Xarray tutorial](https://tutorial.xarray.dev), which contains a comprehensive collection of hands-on tutorial Jupyter Notebooks. We will review a curated set of examples that will prepare you for increasingly complex real-world data analysis tasks!\n", + "\n", + ":::{admonition} Learning Goals\n", + "- Understand Xarray’s core data structures\n", + "- Understand how to map typical Xarray computations and workflows over hierarchical data\n", + "- Understand how common storage formats correspond to the DataTree model\n", + "- Open a public Zarr store in the cloud and manipulate the contents\n", + ":::" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## Schedule \n", + "\n", + "*Times in US/Pacific Timezone (Tacoma, WA)\n", + "\n", + "Use the links to navigate to the right notebooks.\n", + "\n", + "| Topic | Time | Notebook Links | \n", + "| :- | - | - | \n", + "| Introduction and Setup | 1:30 (10 min) | | \n", + "| The Xarray Data Model | 1:40 (50 min) | [Data structures Part 1](../../intermediate/datastructures-intermediate.ipynb)|\n", + "|||[Data structures In Biology](../../intermediate/BiologyDataset.ipynb)| \n", + "|||[Data structures Part 2](../../fundamentals/01_data_structures.md)| \n", + "| *10 minute Break* \n", + "| Computational Patterns | 2:30 (50 min) | [Computational Patterns](../../fundamentals/03.1_computation_with_xarray.ipynb)
[Hierarchical computation](../../intermediate/computation/hierarchical_computation.ipynb) | \n", + "| *10 minute Break* | \n", + "| Storage formats | 3:30 (50 min) | [Storage formats](../../fundamentals/01.1_io.ipynb) | \n", + "| *10 minute Break* | \n", + "| Zarr & the cloud | 4:30 (50 min) | [Intro to Zarr](../../intermediate/intro-to-zarr.ipynb) |\n", + "| | End 5:30 | |" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "### Tutorial Setup\n", + "\n", + "Refer to the [Getting Started Section](../../overview/get-started.md) for various options to run tutorial notebooks either on your personal computer or on a free Cloud-hosted server." + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/workshops/scipy2026/index.ipynb b/workshops/scipy2026/index.ipynb new file mode 100644 index 00000000..9ad3538c --- /dev/null +++ b/workshops/scipy2026/index.ipynb @@ -0,0 +1,84 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# SciPy 2026\n", + "\n", + "## Welcome to the Xarray SciPy 2026 Tutorial! \n", + "\n", + "> 🚧👷‍♀️🏗️ This page is under construction. Please check back later.\n", + "\n", + "\n", + "\n", + "**Everything is an Xarray Dataset**\n", + "\n", + "July 14, 13:30–17:30 (CDT), University of Minnesota (526 Delaware Street SE), room HSEC 2-138\n", + "\n", + "This *4-hour* workshop will explore content from [the Xarray tutorial](https://tutorial.xarray.dev), which contains a comprehensive collection of hands-on tutorial Jupyter Notebooks. We will review a curated set of examples that will prepare you for increasingly complex real-world data analysis tasks!\n", + "\n", + ":::{admonition} Learning Goals\n", + "- Understand Xarray’s core data structures\n", + "- Understand how to use various backend engines, as well as create your own\n", + "- Understand what data cataloguing is, and how it applies to Xarray\n", + "- Understand how common storage formats correspond to the DataTree model\n", + "- Understand how to use Xarray's flexible indices\n", + ":::\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## Schedule\n", + "\n", + "*Times in local time\n", + "\n", + "Use the links to navigate to the right notebooks.\n", + "\n", + "**Everything is an Xarray dataset**\n", + "\n", + "| Topic | Time | Notebook Links | \n", + "| :- | - | - | \n", + "| Introduction and Setup | 1:30 (10 min) | | \n", + "| The Xarray Data Model | 1:40 (50 min) | [Data structures Part 1](../../intermediate/datastructures-intermediate.ipynb)
[Data structures Part 2](../../fundamentals/01_data_structures.md)
[Datatrees and Hierarchical data](../../fundamentals/01_datatree_hierarchical_data.ipynb)|\n", + "| *10 minute Break* \n", + "| Xarray backends | 2:40 (60 min) | [Intro to backends](../../advanced/backends/intro-backends.ipynb)
[Zarr stores in the cloud](../../intermediate/hierarchical_zarr_store.ipynb)
[Rioxarray](../../advanced/backends/rasterio_backend.ipynb)
[Creating custom backends](../../advanced/backends/create_custom_backend.ipynb) |\n", + "| *10 minute Break* |\n", + "| Data cataloguing | 3:50 (40 min) | [Data cataloging](../../intermediate/cataloging.ipynb) |\n", + "| *10 minute Break* \n", + "| Flexible indices | 4:40 (50 min) | [Why an index](../../intermediate/indexing/why-an-index.ipynb) |" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "### Tutorial Setup\n", + "\n", + "Refer to the [Getting Started Section](../../overview/get-started.md) for various options to run tutorial notebooks either on your personal computer or on a free Cloud-hosted server." + ] + } + ], + "metadata": { + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/workshops/thinking-like-xarray/README.md b/workshops/thinking-like-xarray/README.md new file mode 100644 index 00000000..3d9fdc70 --- /dev/null +++ b/workshops/thinking-like-xarray/README.md @@ -0,0 +1,8 @@ +# Thinking like Xarray 2022 + +Presented March 2022 for the [NCAR Python Seminar Series](https://ncar.github.io/esds/posts/2022/Thinking-with-Xarray/) by Deepak Cheerian + +This 60-minute, intermediate-level lesson covers common high-level computing patterns. The version of the notebook here includes material inserted during the presentation. + +Video Recording: +https://www.youtube.com/watch?v=TSw3GF_d2y8&list=PLNemzZpJM7lUu_iGP_lA2m7SeSUwKSIvR diff --git a/xarray_and_dask.ipynb b/xarray_and_dask.ipynb deleted file mode 100644 index 69e7bcc1..00000000 --- a/xarray_and_dask.ipynb +++ /dev/null @@ -1,42 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Xarray and Dask\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import xarray as xr\n", - "from dask.distributed import Client" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.2" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/xarray_for_data_analysis.ipynb b/xarray_for_data_analysis.ipynb deleted file mode 100644 index 84c6c347..00000000 --- a/xarray_for_data_analysis.ipynb +++ /dev/null @@ -1,41 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Xarray for Data Analysis\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import xarray as xr" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.2" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/xarray_for_geoscientists.ipynb b/xarray_for_geoscientists.ipynb deleted file mode 100644 index 56428978..00000000 --- a/xarray_for_geoscientists.ipynb +++ /dev/null @@ -1,41 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Xarray for Geoscientists\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import xarray as xr" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.2" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -}