Last active
December 23, 2025 14:57
-
-
Save mrocklin/3d379bfdb0970274dfd71c00c8e1aae2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "id": "cell-0", | |
| "metadata": {}, | |
| "source": [ | |
| "# Dask Expression Query Optimization\n", | |
| "\n", | |
| "This notebook demonstrates how xarray operations build expression trees that can be inspected and optimized before computation." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 1, | |
| "id": "cell-1", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "import xarray as xr\n", | |
| "import dask\n", | |
| "from pathlib import Path" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "cell-2", | |
| "metadata": {}, | |
| "source": [ | |
| "## Setup\n", | |
| "\n", | |
| "Load the tutorial air temperature dataset from Zarr." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 2, | |
| "id": "cell-3", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stderr", | |
| "output_type": "stream", | |
| "text": [ | |
| "/var/folders/8g/4d0k7yxx3mx8g_ll1lf4p3980000gn/T/ipykernel_46343/3947360380.py:7: UserWarning: The specified chunks separate the stored chunks along dimension \"time\" starting at index 500. This could degrade performance. Instead, consider rechunking after loading.\n", | |
| " ds = xr.open_zarr(zarr_path, chunks={\"time\": 500})\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n", | |
| "<defs>\n", | |
| "<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n", | |
| "<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n", | |
| "<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n", | |
| "<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n", | |
| "</symbol>\n", | |
| "<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n", | |
| "<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n", | |
| "<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n", | |
| "<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n", | |
| "<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n", | |
| "</symbol>\n", | |
| "</defs>\n", | |
| "</svg>\n", | |
| "<style>/* CSS stylesheet for displaying xarray objects in notebooks */\n", | |
| "\n", | |
| ":root {\n", | |
| " --xr-font-color0: var(\n", | |
| " --jp-content-font-color0,\n", | |
| " var(--pst-color-text-base rgba(0, 0, 0, 1))\n", | |
| " );\n", | |
| " --xr-font-color2: var(\n", | |
| " --jp-content-font-color2,\n", | |
| " var(--pst-color-text-base, rgba(0, 0, 0, 0.54))\n", | |
| " );\n", | |
| " --xr-font-color3: var(\n", | |
| " --jp-content-font-color3,\n", | |
| " var(--pst-color-text-base, rgba(0, 0, 0, 0.38))\n", | |
| " );\n", | |
| " --xr-border-color: var(\n", | |
| " --jp-border-color2,\n", | |
| " hsl(from var(--pst-color-on-background, white) h s calc(l - 10))\n", | |
| " );\n", | |
| " --xr-disabled-color: var(\n", | |
| " --jp-layout-color3,\n", | |
| " hsl(from var(--pst-color-on-background, white) h s calc(l - 40))\n", | |
| " );\n", | |
| " --xr-background-color: var(\n", | |
| " --jp-layout-color0,\n", | |
| " var(--pst-color-on-background, white)\n", | |
| " );\n", | |
| " --xr-background-color-row-even: var(\n", | |
| " --jp-layout-color1,\n", | |
| " hsl(from var(--pst-color-on-background, white) h s calc(l - 5))\n", | |
| " );\n", | |
| " --xr-background-color-row-odd: var(\n", | |
| " --jp-layout-color2,\n", | |
| " hsl(from var(--pst-color-on-background, white) h s calc(l - 15))\n", | |
| " );\n", | |
| "}\n", | |
| "\n", | |
| "html[theme=\"dark\"],\n", | |
| "html[data-theme=\"dark\"],\n", | |
| "body[data-theme=\"dark\"],\n", | |
| "body.vscode-dark {\n", | |
| " --xr-font-color0: var(\n", | |
| " --jp-content-font-color0,\n", | |
| " var(--pst-color-text-base, rgba(255, 255, 255, 1))\n", | |
| " );\n", | |
| " --xr-font-color2: var(\n", | |
| " --jp-content-font-color2,\n", | |
| " var(--pst-color-text-base, rgba(255, 255, 255, 0.54))\n", | |
| " );\n", | |
| " --xr-font-color3: var(\n", | |
| " --jp-content-font-color3,\n", | |
| " var(--pst-color-text-base, rgba(255, 255, 255, 0.38))\n", | |
| " );\n", | |
| " --xr-border-color: var(\n", | |
| " --jp-border-color2,\n", | |
| " hsl(from var(--pst-color-on-background, #111111) h s calc(l + 10))\n", | |
| " );\n", | |
| " --xr-disabled-color: var(\n", | |
| " --jp-layout-color3,\n", | |
| " hsl(from var(--pst-color-on-background, #111111) h s calc(l + 40))\n", | |
| " );\n", | |
| " --xr-background-color: var(\n", | |
| " --jp-layout-color0,\n", | |
| " var(--pst-color-on-background, #111111)\n", | |
| " );\n", | |
| " --xr-background-color-row-even: var(\n", | |
| " --jp-layout-color1,\n", | |
| " hsl(from var(--pst-color-on-background, #111111) h s calc(l + 5))\n", | |
| " );\n", | |
| " --xr-background-color-row-odd: var(\n", | |
| " --jp-layout-color2,\n", | |
| " hsl(from var(--pst-color-on-background, #111111) h s calc(l + 15))\n", | |
| " );\n", | |
| "}\n", | |
| "\n", | |
| ".xr-wrap {\n", | |
| " display: block !important;\n", | |
| " min-width: 300px;\n", | |
| " max-width: 700px;\n", | |
| " line-height: 1.6;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-text-repr-fallback {\n", | |
| " /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n", | |
| " display: none;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-header {\n", | |
| " padding-top: 6px;\n", | |
| " padding-bottom: 6px;\n", | |
| " margin-bottom: 4px;\n", | |
| " border-bottom: solid 1px var(--xr-border-color);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-header > div,\n", | |
| ".xr-header > ul {\n", | |
| " display: inline;\n", | |
| " margin-top: 0;\n", | |
| " margin-bottom: 0;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-obj-type,\n", | |
| ".xr-obj-name,\n", | |
| ".xr-group-name {\n", | |
| " margin-left: 2px;\n", | |
| " margin-right: 10px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-name::before {\n", | |
| " content: \"📁\";\n", | |
| " padding-right: 0.3em;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-name,\n", | |
| ".xr-obj-type {\n", | |
| " color: var(--xr-font-color2);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-sections {\n", | |
| " padding-left: 0 !important;\n", | |
| " display: grid;\n", | |
| " grid-template-columns: 150px auto auto 1fr 0 20px 0 20px;\n", | |
| " margin-block-start: 0;\n", | |
| " margin-block-end: 0;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item {\n", | |
| " display: contents;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item input {\n", | |
| " display: inline-block;\n", | |
| " opacity: 0;\n", | |
| " height: 0;\n", | |
| " margin: 0;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item input + label {\n", | |
| " color: var(--xr-disabled-color);\n", | |
| " border: 2px solid transparent !important;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item input:enabled + label {\n", | |
| " cursor: pointer;\n", | |
| " color: var(--xr-font-color2);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item input:focus + label {\n", | |
| " border: 2px solid var(--xr-font-color0) !important;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item input:enabled + label:hover {\n", | |
| " color: var(--xr-font-color0);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary {\n", | |
| " grid-column: 1;\n", | |
| " color: var(--xr-font-color2);\n", | |
| " font-weight: 500;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary > span {\n", | |
| " display: inline-block;\n", | |
| " padding-left: 0.5em;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in:disabled + label {\n", | |
| " color: var(--xr-font-color2);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in + label:before {\n", | |
| " display: inline-block;\n", | |
| " content: \"►\";\n", | |
| " font-size: 11px;\n", | |
| " width: 15px;\n", | |
| " text-align: center;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in:disabled + label:before {\n", | |
| " color: var(--xr-disabled-color);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in:checked + label:before {\n", | |
| " content: \"▼\";\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in:checked + label > span {\n", | |
| " display: none;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary,\n", | |
| ".xr-section-inline-details {\n", | |
| " padding-top: 4px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-inline-details {\n", | |
| " grid-column: 2 / -1;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-details {\n", | |
| " display: none;\n", | |
| " grid-column: 1 / -1;\n", | |
| " margin-top: 4px;\n", | |
| " margin-bottom: 5px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in:checked ~ .xr-section-details {\n", | |
| " display: contents;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-box {\n", | |
| " display: inline-grid;\n", | |
| " grid-template-columns: 0px 20px auto;\n", | |
| " width: 100%;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-box-vline {\n", | |
| " grid-column-start: 1;\n", | |
| " border-right: 0.2em solid;\n", | |
| " border-color: var(--xr-border-color);\n", | |
| " width: 0px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-box-hline {\n", | |
| " grid-column-start: 2;\n", | |
| " grid-row-start: 1;\n", | |
| " height: 1em;\n", | |
| " width: 20px;\n", | |
| " border-bottom: 0.2em solid;\n", | |
| " border-color: var(--xr-border-color);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-box-contents {\n", | |
| " grid-column-start: 3;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-array-wrap {\n", | |
| " grid-column: 1 / -1;\n", | |
| " display: grid;\n", | |
| " grid-template-columns: 20px auto;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-array-wrap > label {\n", | |
| " grid-column: 1;\n", | |
| " vertical-align: top;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-preview {\n", | |
| " color: var(--xr-font-color3);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-array-preview,\n", | |
| ".xr-array-data {\n", | |
| " padding: 0 5px !important;\n", | |
| " grid-column: 2;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-array-data,\n", | |
| ".xr-array-in:checked ~ .xr-array-preview {\n", | |
| " display: none;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-array-in:checked ~ .xr-array-data,\n", | |
| ".xr-array-preview {\n", | |
| " display: inline-block;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-dim-list {\n", | |
| " display: inline-block !important;\n", | |
| " list-style: none;\n", | |
| " padding: 0 !important;\n", | |
| " margin: 0;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-dim-list li {\n", | |
| " display: inline-block;\n", | |
| " padding: 0;\n", | |
| " margin: 0;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-dim-list:before {\n", | |
| " content: \"(\";\n", | |
| "}\n", | |
| "\n", | |
| ".xr-dim-list:after {\n", | |
| " content: \")\";\n", | |
| "}\n", | |
| "\n", | |
| ".xr-dim-list li:not(:last-child):after {\n", | |
| " content: \",\";\n", | |
| " padding-right: 5px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-has-index {\n", | |
| " font-weight: bold;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-list,\n", | |
| ".xr-var-item {\n", | |
| " display: contents;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-item > div,\n", | |
| ".xr-var-item label,\n", | |
| ".xr-var-item > .xr-var-name span {\n", | |
| " background-color: var(--xr-background-color-row-even);\n", | |
| " border-color: var(--xr-background-color-row-odd);\n", | |
| " margin-bottom: 0;\n", | |
| " padding-top: 2px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-item > .xr-var-name:hover span {\n", | |
| " padding-right: 5px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-list > li:nth-child(odd) > div,\n", | |
| ".xr-var-list > li:nth-child(odd) > label,\n", | |
| ".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n", | |
| " background-color: var(--xr-background-color-row-odd);\n", | |
| " border-color: var(--xr-background-color-row-even);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-name {\n", | |
| " grid-column: 1;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-dims {\n", | |
| " grid-column: 2;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-dtype {\n", | |
| " grid-column: 3;\n", | |
| " text-align: right;\n", | |
| " color: var(--xr-font-color2);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-preview {\n", | |
| " grid-column: 4;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-index-preview {\n", | |
| " grid-column: 2 / 5;\n", | |
| " color: var(--xr-font-color2);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-name,\n", | |
| ".xr-var-dims,\n", | |
| ".xr-var-dtype,\n", | |
| ".xr-preview,\n", | |
| ".xr-attrs dt {\n", | |
| " white-space: nowrap;\n", | |
| " overflow: hidden;\n", | |
| " text-overflow: ellipsis;\n", | |
| " padding-right: 10px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-name:hover,\n", | |
| ".xr-var-dims:hover,\n", | |
| ".xr-var-dtype:hover,\n", | |
| ".xr-attrs dt:hover {\n", | |
| " overflow: visible;\n", | |
| " width: auto;\n", | |
| " z-index: 1;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-attrs,\n", | |
| ".xr-var-data,\n", | |
| ".xr-index-data {\n", | |
| " display: none;\n", | |
| " border-top: 2px dotted var(--xr-background-color);\n", | |
| " padding-bottom: 20px !important;\n", | |
| " padding-top: 10px !important;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-attrs-in + label,\n", | |
| ".xr-var-data-in + label,\n", | |
| ".xr-index-data-in + label {\n", | |
| " padding: 0 1px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n", | |
| ".xr-var-data-in:checked ~ .xr-var-data,\n", | |
| ".xr-index-data-in:checked ~ .xr-index-data {\n", | |
| " display: block;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-data > table {\n", | |
| " float: right;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-data > pre,\n", | |
| ".xr-index-data > pre,\n", | |
| ".xr-var-data > table > tbody > tr {\n", | |
| " background-color: transparent !important;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-name span,\n", | |
| ".xr-var-data,\n", | |
| ".xr-index-name div,\n", | |
| ".xr-index-data,\n", | |
| ".xr-attrs {\n", | |
| " padding-left: 25px !important;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-attrs,\n", | |
| ".xr-var-attrs,\n", | |
| ".xr-var-data,\n", | |
| ".xr-index-data {\n", | |
| " grid-column: 1 / -1;\n", | |
| "}\n", | |
| "\n", | |
| "dl.xr-attrs {\n", | |
| " padding: 0;\n", | |
| " margin: 0;\n", | |
| " display: grid;\n", | |
| " grid-template-columns: 125px auto;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-attrs dt,\n", | |
| ".xr-attrs dd {\n", | |
| " padding: 0;\n", | |
| " margin: 0;\n", | |
| " float: left;\n", | |
| " padding-right: 10px;\n", | |
| " width: auto;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-attrs dt {\n", | |
| " font-weight: normal;\n", | |
| " grid-column: 1;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-attrs dt:hover span {\n", | |
| " display: inline-block;\n", | |
| " background: var(--xr-background-color);\n", | |
| " padding-right: 10px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-attrs dd {\n", | |
| " grid-column: 2;\n", | |
| " white-space: pre-wrap;\n", | |
| " word-break: break-all;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-icon-database,\n", | |
| ".xr-icon-file-text2,\n", | |
| ".xr-no-icon {\n", | |
| " display: inline-block;\n", | |
| " vertical-align: middle;\n", | |
| " width: 1em;\n", | |
| " height: 1.5em !important;\n", | |
| " stroke-width: 0;\n", | |
| " stroke: currentColor;\n", | |
| " fill: currentColor;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-attrs-in:checked + label > .xr-icon-file-text2,\n", | |
| ".xr-var-data-in:checked + label > .xr-icon-database,\n", | |
| ".xr-index-data-in:checked + label > .xr-icon-database {\n", | |
| " color: var(--xr-font-color0);\n", | |
| " filter: drop-shadow(1px 1px 5px var(--xr-font-color2));\n", | |
| " stroke-width: 0.8px;\n", | |
| "}\n", | |
| "</style><pre class='xr-text-repr-fallback'><xarray.Dataset> Size: 31MB\n", | |
| "Dimensions: (time: 2920, lat: 25, lon: 53)\n", | |
| "Coordinates:\n", | |
| " * time (time) datetime64[ns] 23kB 2013-01-01 ... 2014-12-31T18:00:00\n", | |
| " * lat (lat) float32 100B 75.0 72.5 70.0 67.5 65.0 ... 22.5 20.0 17.5 15.0\n", | |
| " * lon (lon) float32 212B 200.0 202.5 205.0 207.5 ... 325.0 327.5 330.0\n", | |
| "Data variables:\n", | |
| " air (time, lat, lon) float64 31MB dask.array<chunksize=(500, 13, 27), meta=np.ndarray>\n", | |
| "Attributes:\n", | |
| " Conventions: COARDS\n", | |
| " title: 4x daily NMC reanalysis (1948)\n", | |
| " description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n", | |
| " platform: Model\n", | |
| " references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...</pre><div class='xr-wrap' style='display:none'><div class='xr-header'><div class='xr-obj-type'>xarray.Dataset</div></div><ul class='xr-sections'><li class='xr-section-item'><input id='section-48b82a85-4a27-4b7b-aa05-ddcbbe7d9879' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-48b82a85-4a27-4b7b-aa05-ddcbbe7d9879' class='xr-section-summary' title='Expand/collapse section'>Dimensions:</label><div class='xr-section-inline-details'><ul class='xr-dim-list'><li><span class='xr-has-index'>time</span>: 2920</li><li><span class='xr-has-index'>lat</span>: 25</li><li><span class='xr-has-index'>lon</span>: 53</li></ul></div><div class='xr-section-details'></div></li><li class='xr-section-item'><input id='section-a949d4bf-5670-4e40-a3aa-aa85c0626a76' class='xr-section-summary-in' type='checkbox' checked><label for='section-a949d4bf-5670-4e40-a3aa-aa85c0626a76' class='xr-section-summary' >Coordinates: <span>(3)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>time</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>2013-01-01 ... 2014-12-31T18:00:00</div><input id='attrs-58a46b32-df93-4000-8fe6-9f3cd1c9b4c3' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-58a46b32-df93-4000-8fe6-9f3cd1c9b4c3' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-b6686975-68b8-413d-90d8-9dfc1754ff81' class='xr-var-data-in' type='checkbox'><label for='data-b6686975-68b8-413d-90d8-9dfc1754ff81' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>time</dd><dt><span>long_name :</span></dt><dd>Time</dd></dl></div><div class='xr-var-data'><pre>array(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n", | |
| " '2013-01-01T12:00:00.000000000', ..., '2014-12-31T06:00:00.000000000',\n", | |
| " '2014-12-31T12:00:00.000000000', '2014-12-31T18:00:00.000000000'],\n", | |
| " shape=(2920,), dtype='datetime64[ns]')</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>lat</span></div><div class='xr-var-dims'>(lat)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>75.0 72.5 70.0 ... 20.0 17.5 15.0</div><input id='attrs-52541b62-0e0e-4e6d-be4b-4ac5840a531d' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-52541b62-0e0e-4e6d-be4b-4ac5840a531d' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-1c80c92c-bf8a-46bd-b10c-abc81d588863' class='xr-var-data-in' type='checkbox'><label for='data-1c80c92c-bf8a-46bd-b10c-abc81d588863' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>latitude</dd><dt><span>long_name :</span></dt><dd>Latitude</dd><dt><span>units :</span></dt><dd>degrees_north</dd><dt><span>axis :</span></dt><dd>Y</dd></dl></div><div class='xr-var-data'><pre>array([75. , 72.5, 70. , 67.5, 65. , 62.5, 60. , 57.5, 55. , 52.5, 50. , 47.5,\n", | |
| " 45. , 42.5, 40. , 37.5, 35. , 32.5, 30. , 27.5, 25. , 22.5, 20. , 17.5,\n", | |
| " 15. ], dtype=float32)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>lon</span></div><div class='xr-var-dims'>(lon)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>200.0 202.5 205.0 ... 327.5 330.0</div><input id='attrs-6a020fea-ed9e-4e43-bde6-29bbed7ac999' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-6a020fea-ed9e-4e43-bde6-29bbed7ac999' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-7fdde549-81bd-44e6-99a4-9cfe387d88f7' class='xr-var-data-in' type='checkbox'><label for='data-7fdde549-81bd-44e6-99a4-9cfe387d88f7' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>longitude</dd><dt><span>long_name :</span></dt><dd>Longitude</dd><dt><span>units :</span></dt><dd>degrees_east</dd><dt><span>axis :</span></dt><dd>X</dd></dl></div><div class='xr-var-data'><pre>array([200. , 202.5, 205. , 207.5, 210. , 212.5, 215. , 217.5, 220. , 222.5,\n", | |
| " 225. , 227.5, 230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5,\n", | |
| " 250. , 252.5, 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5,\n", | |
| " 275. , 277.5, 280. , 282.5, 285. , 287.5, 290. , 292.5, 295. , 297.5,\n", | |
| " 300. , 302.5, 305. , 307.5, 310. , 312.5, 315. , 317.5, 320. , 322.5,\n", | |
| " 325. , 327.5, 330. ], dtype=float32)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-0714c53d-220c-489e-91d4-2d6baf15dc8b' class='xr-section-summary-in' type='checkbox' checked><label for='section-0714c53d-220c-489e-91d4-2d6baf15dc8b' class='xr-section-summary' >Data variables: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>air</span></div><div class='xr-var-dims'>(time, lat, lon)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>dask.array<chunksize=(500, 13, 27), meta=np.ndarray></div><input id='attrs-d716fcdb-0de7-4690-b320-e054f2c2f2e7' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-d716fcdb-0de7-4690-b320-e054f2c2f2e7' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-cf14d296-4549-4d0d-bedc-c8ef4e5d1a45' class='xr-var-data-in' type='checkbox'><label for='data-cf14d296-4549-4d0d-bedc-c8ef4e5d1a45' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>4xDaily Air temperature at sigma level 995</dd><dt><span>units :</span></dt><dd>degK</dd><dt><span>precision :</span></dt><dd>2</dd><dt><span>GRIB_id :</span></dt><dd>11</dd><dt><span>GRIB_name :</span></dt><dd>TMP</dd><dt><span>var_desc :</span></dt><dd>Air temperature</dd><dt><span>dataset :</span></dt><dd>NMC Reanalysis</dd><dt><span>level_desc :</span></dt><dd>Surface</dd><dt><span>statistic :</span></dt><dd>Individual Obs</dd><dt><span>parent_stat :</span></dt><dd>Other</dd><dt><span>actual_range :</span></dt><dd>[185.16000366210938, 322.1000061035156]</dd></dl></div><div class='xr-var-data'><table>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " <table style=\"border-collapse: collapse;\">\n", | |
| " <thead>\n", | |
| " <tr>\n", | |
| " <td> </td>\n", | |
| " <th> Array </th>\n", | |
| " <th> Chunk </th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " \n", | |
| " <tr>\n", | |
| " <th> Bytes </th>\n", | |
| " <td> 29.52 MiB </td>\n", | |
| " <td> 1.34 MiB </td>\n", | |
| " </tr>\n", | |
| " \n", | |
| " <tr>\n", | |
| " <th> Shape </th>\n", | |
| " <td> (2920, 25, 53) </td>\n", | |
| " <td> (500, 13, 27) </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th> Dask graph </th>\n", | |
| " <td colspan=\"2\"> 24 chunks in 1 expression </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th> Data type </th>\n", | |
| " <td colspan=\"2\"> float64 numpy.ndarray </td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| " </table>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <svg width=\"159\" height=\"146\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"80\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"10\" y1=\"13\" x2=\"80\" y2=\"83\" />\n", | |
| " <line x1=\"10\" y1=\"25\" x2=\"80\" y2=\"96\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"10\" y2=\"25\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"22\" y1=\"12\" x2=\"22\" y2=\"37\" />\n", | |
| " <line x1=\"34\" y1=\"24\" x2=\"34\" y2=\"49\" />\n", | |
| " <line x1=\"46\" y1=\"36\" x2=\"46\" y2=\"61\" />\n", | |
| " <line x1=\"58\" y1=\"48\" x2=\"58\" y2=\"73\" />\n", | |
| " <line x1=\"70\" y1=\"60\" x2=\"70\" y2=\"85\" />\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"80\" y2=\"96\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"10.0,0.0 80.58823529411765,70.58823529411765 80.58823529411765,96.00085180870013 10.0,25.41261651458249\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"38\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"22\" y1=\"12\" x2=\"50\" y2=\"12\" />\n", | |
| " <line x1=\"34\" y1=\"24\" x2=\"62\" y2=\"24\" />\n", | |
| " <line x1=\"46\" y1=\"36\" x2=\"74\" y2=\"36\" />\n", | |
| " <line x1=\"58\" y1=\"48\" x2=\"86\" y2=\"48\" />\n", | |
| " <line x1=\"70\" y1=\"60\" x2=\"98\" y2=\"60\" />\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"109\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"80\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"24\" y1=\"0\" x2=\"95\" y2=\"70\" />\n", | |
| " <line x1=\"38\" y1=\"0\" x2=\"109\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"10.0,0.0 38.48973265594604,0.0 109.0779679500637,70.58823529411765 80.58823529411765,70.58823529411765\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"109\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"80\" y1=\"83\" x2=\"109\" y2=\"83\" />\n", | |
| " <line x1=\"80\" y1=\"96\" x2=\"109\" y2=\"96\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"80\" y2=\"96\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"95\" y1=\"70\" x2=\"95\" y2=\"96\" />\n", | |
| " <line x1=\"109\" y1=\"70\" x2=\"109\" y2=\"96\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"80.58823529411765,70.58823529411765 109.0779679500637,70.58823529411765 109.0779679500637,96.00085180870013 80.58823529411765,96.00085180870013\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"94.83310162209068\" y=\"116.00085180870013\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >53</text>\n", | |
| " <text x=\"129.07796795006368\" y=\"83.29454355140889\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,129.07796795006368,83.29454355140889)\">25</text>\n", | |
| " <text x=\"35.294117647058826\" y=\"80.70673416164131\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,35.294117647058826,80.70673416164131)\">2920</text>\n", | |
| "</svg>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| "</table></div></li></ul></div></li><li class='xr-section-item'><input id='section-9fd8f585-cca6-4fa6-8384-03f462551bbb' class='xr-section-summary-in' type='checkbox' checked><label for='section-9fd8f585-cca6-4fa6-8384-03f462551bbb' class='xr-section-summary' >Attributes: <span>(5)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'><dt><span>Conventions :</span></dt><dd>COARDS</dd><dt><span>title :</span></dt><dd>4x daily NMC reanalysis (1948)</dd><dt><span>description :</span></dt><dd>Data is from NMC initialized reanalysis\n", | |
| "(4x/day). These are the 0.9950 sigma level values.</dd><dt><span>platform :</span></dt><dd>Model</dd><dt><span>references :</span></dt><dd>http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html</dd></dl></div></li></ul></div></div>" | |
| ], | |
| "text/plain": [ | |
| "<xarray.Dataset> Size: 31MB\n", | |
| "Dimensions: (time: 2920, lat: 25, lon: 53)\n", | |
| "Coordinates:\n", | |
| " * time (time) datetime64[ns] 23kB 2013-01-01 ... 2014-12-31T18:00:00\n", | |
| " * lat (lat) float32 100B 75.0 72.5 70.0 67.5 65.0 ... 22.5 20.0 17.5 15.0\n", | |
| " * lon (lon) float32 212B 200.0 202.5 205.0 207.5 ... 325.0 327.5 330.0\n", | |
| "Data variables:\n", | |
| " air (time, lat, lon) float64 31MB dask.array<chunksize=(500, 13, 27), meta=np.ndarray>\n", | |
| "Attributes:\n", | |
| " Conventions: COARDS\n", | |
| " title: 4x daily NMC reanalysis (1948)\n", | |
| " description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n", | |
| " platform: Model\n", | |
| " references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly..." | |
| ] | |
| }, | |
| "execution_count": 2, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "zarr_path = Path(\"air_temperature.zarr\")\n", | |
| "\n", | |
| "if not zarr_path.exists():\n", | |
| " ds = xr.tutorial.load_dataset(\"air_temperature\")\n", | |
| " ds.to_zarr(zarr_path)\n", | |
| "\n", | |
| "ds = xr.open_zarr(zarr_path, chunks={\"time\": 500})\n", | |
| "ds" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "cell-4", | |
| "metadata": {}, | |
| "source": [ | |
| "## Complex Query\n", | |
| "\n", | |
| "Build a query combining spatial selection, temporal slicing, rechunking, unit conversion, and aggregation." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 3, | |
| "id": "cell-5", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n", | |
| "<defs>\n", | |
| "<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n", | |
| "<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n", | |
| "<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n", | |
| "<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n", | |
| "</symbol>\n", | |
| "<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n", | |
| "<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n", | |
| "<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n", | |
| "<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n", | |
| "<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n", | |
| "</symbol>\n", | |
| "</defs>\n", | |
| "</svg>\n", | |
| "<style>/* CSS stylesheet for displaying xarray objects in notebooks */\n", | |
| "\n", | |
| ":root {\n", | |
| " --xr-font-color0: var(\n", | |
| " --jp-content-font-color0,\n", | |
| " var(--pst-color-text-base rgba(0, 0, 0, 1))\n", | |
| " );\n", | |
| " --xr-font-color2: var(\n", | |
| " --jp-content-font-color2,\n", | |
| " var(--pst-color-text-base, rgba(0, 0, 0, 0.54))\n", | |
| " );\n", | |
| " --xr-font-color3: var(\n", | |
| " --jp-content-font-color3,\n", | |
| " var(--pst-color-text-base, rgba(0, 0, 0, 0.38))\n", | |
| " );\n", | |
| " --xr-border-color: var(\n", | |
| " --jp-border-color2,\n", | |
| " hsl(from var(--pst-color-on-background, white) h s calc(l - 10))\n", | |
| " );\n", | |
| " --xr-disabled-color: var(\n", | |
| " --jp-layout-color3,\n", | |
| " hsl(from var(--pst-color-on-background, white) h s calc(l - 40))\n", | |
| " );\n", | |
| " --xr-background-color: var(\n", | |
| " --jp-layout-color0,\n", | |
| " var(--pst-color-on-background, white)\n", | |
| " );\n", | |
| " --xr-background-color-row-even: var(\n", | |
| " --jp-layout-color1,\n", | |
| " hsl(from var(--pst-color-on-background, white) h s calc(l - 5))\n", | |
| " );\n", | |
| " --xr-background-color-row-odd: var(\n", | |
| " --jp-layout-color2,\n", | |
| " hsl(from var(--pst-color-on-background, white) h s calc(l - 15))\n", | |
| " );\n", | |
| "}\n", | |
| "\n", | |
| "html[theme=\"dark\"],\n", | |
| "html[data-theme=\"dark\"],\n", | |
| "body[data-theme=\"dark\"],\n", | |
| "body.vscode-dark {\n", | |
| " --xr-font-color0: var(\n", | |
| " --jp-content-font-color0,\n", | |
| " var(--pst-color-text-base, rgba(255, 255, 255, 1))\n", | |
| " );\n", | |
| " --xr-font-color2: var(\n", | |
| " --jp-content-font-color2,\n", | |
| " var(--pst-color-text-base, rgba(255, 255, 255, 0.54))\n", | |
| " );\n", | |
| " --xr-font-color3: var(\n", | |
| " --jp-content-font-color3,\n", | |
| " var(--pst-color-text-base, rgba(255, 255, 255, 0.38))\n", | |
| " );\n", | |
| " --xr-border-color: var(\n", | |
| " --jp-border-color2,\n", | |
| " hsl(from var(--pst-color-on-background, #111111) h s calc(l + 10))\n", | |
| " );\n", | |
| " --xr-disabled-color: var(\n", | |
| " --jp-layout-color3,\n", | |
| " hsl(from var(--pst-color-on-background, #111111) h s calc(l + 40))\n", | |
| " );\n", | |
| " --xr-background-color: var(\n", | |
| " --jp-layout-color0,\n", | |
| " var(--pst-color-on-background, #111111)\n", | |
| " );\n", | |
| " --xr-background-color-row-even: var(\n", | |
| " --jp-layout-color1,\n", | |
| " hsl(from var(--pst-color-on-background, #111111) h s calc(l + 5))\n", | |
| " );\n", | |
| " --xr-background-color-row-odd: var(\n", | |
| " --jp-layout-color2,\n", | |
| " hsl(from var(--pst-color-on-background, #111111) h s calc(l + 15))\n", | |
| " );\n", | |
| "}\n", | |
| "\n", | |
| ".xr-wrap {\n", | |
| " display: block !important;\n", | |
| " min-width: 300px;\n", | |
| " max-width: 700px;\n", | |
| " line-height: 1.6;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-text-repr-fallback {\n", | |
| " /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n", | |
| " display: none;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-header {\n", | |
| " padding-top: 6px;\n", | |
| " padding-bottom: 6px;\n", | |
| " margin-bottom: 4px;\n", | |
| " border-bottom: solid 1px var(--xr-border-color);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-header > div,\n", | |
| ".xr-header > ul {\n", | |
| " display: inline;\n", | |
| " margin-top: 0;\n", | |
| " margin-bottom: 0;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-obj-type,\n", | |
| ".xr-obj-name,\n", | |
| ".xr-group-name {\n", | |
| " margin-left: 2px;\n", | |
| " margin-right: 10px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-name::before {\n", | |
| " content: \"📁\";\n", | |
| " padding-right: 0.3em;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-name,\n", | |
| ".xr-obj-type {\n", | |
| " color: var(--xr-font-color2);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-sections {\n", | |
| " padding-left: 0 !important;\n", | |
| " display: grid;\n", | |
| " grid-template-columns: 150px auto auto 1fr 0 20px 0 20px;\n", | |
| " margin-block-start: 0;\n", | |
| " margin-block-end: 0;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item {\n", | |
| " display: contents;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item input {\n", | |
| " display: inline-block;\n", | |
| " opacity: 0;\n", | |
| " height: 0;\n", | |
| " margin: 0;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item input + label {\n", | |
| " color: var(--xr-disabled-color);\n", | |
| " border: 2px solid transparent !important;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item input:enabled + label {\n", | |
| " cursor: pointer;\n", | |
| " color: var(--xr-font-color2);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item input:focus + label {\n", | |
| " border: 2px solid var(--xr-font-color0) !important;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item input:enabled + label:hover {\n", | |
| " color: var(--xr-font-color0);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary {\n", | |
| " grid-column: 1;\n", | |
| " color: var(--xr-font-color2);\n", | |
| " font-weight: 500;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary > span {\n", | |
| " display: inline-block;\n", | |
| " padding-left: 0.5em;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in:disabled + label {\n", | |
| " color: var(--xr-font-color2);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in + label:before {\n", | |
| " display: inline-block;\n", | |
| " content: \"►\";\n", | |
| " font-size: 11px;\n", | |
| " width: 15px;\n", | |
| " text-align: center;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in:disabled + label:before {\n", | |
| " color: var(--xr-disabled-color);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in:checked + label:before {\n", | |
| " content: \"▼\";\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in:checked + label > span {\n", | |
| " display: none;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary,\n", | |
| ".xr-section-inline-details {\n", | |
| " padding-top: 4px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-inline-details {\n", | |
| " grid-column: 2 / -1;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-details {\n", | |
| " display: none;\n", | |
| " grid-column: 1 / -1;\n", | |
| " margin-top: 4px;\n", | |
| " margin-bottom: 5px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in:checked ~ .xr-section-details {\n", | |
| " display: contents;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-box {\n", | |
| " display: inline-grid;\n", | |
| " grid-template-columns: 0px 20px auto;\n", | |
| " width: 100%;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-box-vline {\n", | |
| " grid-column-start: 1;\n", | |
| " border-right: 0.2em solid;\n", | |
| " border-color: var(--xr-border-color);\n", | |
| " width: 0px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-box-hline {\n", | |
| " grid-column-start: 2;\n", | |
| " grid-row-start: 1;\n", | |
| " height: 1em;\n", | |
| " width: 20px;\n", | |
| " border-bottom: 0.2em solid;\n", | |
| " border-color: var(--xr-border-color);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-box-contents {\n", | |
| " grid-column-start: 3;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-array-wrap {\n", | |
| " grid-column: 1 / -1;\n", | |
| " display: grid;\n", | |
| " grid-template-columns: 20px auto;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-array-wrap > label {\n", | |
| " grid-column: 1;\n", | |
| " vertical-align: top;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-preview {\n", | |
| " color: var(--xr-font-color3);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-array-preview,\n", | |
| ".xr-array-data {\n", | |
| " padding: 0 5px !important;\n", | |
| " grid-column: 2;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-array-data,\n", | |
| ".xr-array-in:checked ~ .xr-array-preview {\n", | |
| " display: none;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-array-in:checked ~ .xr-array-data,\n", | |
| ".xr-array-preview {\n", | |
| " display: inline-block;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-dim-list {\n", | |
| " display: inline-block !important;\n", | |
| " list-style: none;\n", | |
| " padding: 0 !important;\n", | |
| " margin: 0;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-dim-list li {\n", | |
| " display: inline-block;\n", | |
| " padding: 0;\n", | |
| " margin: 0;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-dim-list:before {\n", | |
| " content: \"(\";\n", | |
| "}\n", | |
| "\n", | |
| ".xr-dim-list:after {\n", | |
| " content: \")\";\n", | |
| "}\n", | |
| "\n", | |
| ".xr-dim-list li:not(:last-child):after {\n", | |
| " content: \",\";\n", | |
| " padding-right: 5px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-has-index {\n", | |
| " font-weight: bold;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-list,\n", | |
| ".xr-var-item {\n", | |
| " display: contents;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-item > div,\n", | |
| ".xr-var-item label,\n", | |
| ".xr-var-item > .xr-var-name span {\n", | |
| " background-color: var(--xr-background-color-row-even);\n", | |
| " border-color: var(--xr-background-color-row-odd);\n", | |
| " margin-bottom: 0;\n", | |
| " padding-top: 2px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-item > .xr-var-name:hover span {\n", | |
| " padding-right: 5px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-list > li:nth-child(odd) > div,\n", | |
| ".xr-var-list > li:nth-child(odd) > label,\n", | |
| ".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n", | |
| " background-color: var(--xr-background-color-row-odd);\n", | |
| " border-color: var(--xr-background-color-row-even);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-name {\n", | |
| " grid-column: 1;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-dims {\n", | |
| " grid-column: 2;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-dtype {\n", | |
| " grid-column: 3;\n", | |
| " text-align: right;\n", | |
| " color: var(--xr-font-color2);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-preview {\n", | |
| " grid-column: 4;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-index-preview {\n", | |
| " grid-column: 2 / 5;\n", | |
| " color: var(--xr-font-color2);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-name,\n", | |
| ".xr-var-dims,\n", | |
| ".xr-var-dtype,\n", | |
| ".xr-preview,\n", | |
| ".xr-attrs dt {\n", | |
| " white-space: nowrap;\n", | |
| " overflow: hidden;\n", | |
| " text-overflow: ellipsis;\n", | |
| " padding-right: 10px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-name:hover,\n", | |
| ".xr-var-dims:hover,\n", | |
| ".xr-var-dtype:hover,\n", | |
| ".xr-attrs dt:hover {\n", | |
| " overflow: visible;\n", | |
| " width: auto;\n", | |
| " z-index: 1;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-attrs,\n", | |
| ".xr-var-data,\n", | |
| ".xr-index-data {\n", | |
| " display: none;\n", | |
| " border-top: 2px dotted var(--xr-background-color);\n", | |
| " padding-bottom: 20px !important;\n", | |
| " padding-top: 10px !important;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-attrs-in + label,\n", | |
| ".xr-var-data-in + label,\n", | |
| ".xr-index-data-in + label {\n", | |
| " padding: 0 1px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n", | |
| ".xr-var-data-in:checked ~ .xr-var-data,\n", | |
| ".xr-index-data-in:checked ~ .xr-index-data {\n", | |
| " display: block;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-data > table {\n", | |
| " float: right;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-data > pre,\n", | |
| ".xr-index-data > pre,\n", | |
| ".xr-var-data > table > tbody > tr {\n", | |
| " background-color: transparent !important;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-name span,\n", | |
| ".xr-var-data,\n", | |
| ".xr-index-name div,\n", | |
| ".xr-index-data,\n", | |
| ".xr-attrs {\n", | |
| " padding-left: 25px !important;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-attrs,\n", | |
| ".xr-var-attrs,\n", | |
| ".xr-var-data,\n", | |
| ".xr-index-data {\n", | |
| " grid-column: 1 / -1;\n", | |
| "}\n", | |
| "\n", | |
| "dl.xr-attrs {\n", | |
| " padding: 0;\n", | |
| " margin: 0;\n", | |
| " display: grid;\n", | |
| " grid-template-columns: 125px auto;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-attrs dt,\n", | |
| ".xr-attrs dd {\n", | |
| " padding: 0;\n", | |
| " margin: 0;\n", | |
| " float: left;\n", | |
| " padding-right: 10px;\n", | |
| " width: auto;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-attrs dt {\n", | |
| " font-weight: normal;\n", | |
| " grid-column: 1;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-attrs dt:hover span {\n", | |
| " display: inline-block;\n", | |
| " background: var(--xr-background-color);\n", | |
| " padding-right: 10px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-attrs dd {\n", | |
| " grid-column: 2;\n", | |
| " white-space: pre-wrap;\n", | |
| " word-break: break-all;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-icon-database,\n", | |
| ".xr-icon-file-text2,\n", | |
| ".xr-no-icon {\n", | |
| " display: inline-block;\n", | |
| " vertical-align: middle;\n", | |
| " width: 1em;\n", | |
| " height: 1.5em !important;\n", | |
| " stroke-width: 0;\n", | |
| " stroke: currentColor;\n", | |
| " fill: currentColor;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-attrs-in:checked + label > .xr-icon-file-text2,\n", | |
| ".xr-var-data-in:checked + label > .xr-icon-database,\n", | |
| ".xr-index-data-in:checked + label > .xr-icon-database {\n", | |
| " color: var(--xr-font-color0);\n", | |
| " filter: drop-shadow(1px 1px 5px var(--xr-font-color2));\n", | |
| " stroke-width: 0.8px;\n", | |
| "}\n", | |
| "</style><pre class='xr-text-repr-fallback'><xarray.Dataset> Size: 5MB\n", | |
| "Dimensions: (time: 1460, lat: 9, lon: 25)\n", | |
| "Coordinates:\n", | |
| " * time (time) datetime64[ns] 12kB 2013-01-01 ... 2013-12-31T18:00:00\n", | |
| " * lat (lat) float32 36B 50.0 47.5 45.0 42.5 40.0 37.5 35.0 32.5 30.0\n", | |
| " * lon (lon) float32 100B 230.0 232.5 235.0 ... 285.0 287.5 290.0\n", | |
| "Data variables:\n", | |
| " air (time, lat, lon) float64 3MB dask.array<chunksize=(100, 9, 20), meta=np.ndarray>\n", | |
| " air_celsius (time, lat, lon) float64 3MB dask.array<chunksize=(100, 9, 20), meta=np.ndarray>\n", | |
| "Attributes:\n", | |
| " Conventions: COARDS\n", | |
| " title: 4x daily NMC reanalysis (1948)\n", | |
| " description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n", | |
| " platform: Model\n", | |
| " references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly...</pre><div class='xr-wrap' style='display:none'><div class='xr-header'><div class='xr-obj-type'>xarray.Dataset</div></div><ul class='xr-sections'><li class='xr-section-item'><input id='section-45265132-d816-4172-9b83-6f2c8b0d8fb8' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-45265132-d816-4172-9b83-6f2c8b0d8fb8' class='xr-section-summary' title='Expand/collapse section'>Dimensions:</label><div class='xr-section-inline-details'><ul class='xr-dim-list'><li><span class='xr-has-index'>time</span>: 1460</li><li><span class='xr-has-index'>lat</span>: 9</li><li><span class='xr-has-index'>lon</span>: 25</li></ul></div><div class='xr-section-details'></div></li><li class='xr-section-item'><input id='section-c48fff3d-0e3c-49ad-ac35-e1c04e31f7f2' class='xr-section-summary-in' type='checkbox' checked><label for='section-c48fff3d-0e3c-49ad-ac35-e1c04e31f7f2' class='xr-section-summary' >Coordinates: <span>(3)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>time</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>2013-01-01 ... 2013-12-31T18:00:00</div><input id='attrs-81229d5d-308c-487b-ba7c-6661b3722155' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-81229d5d-308c-487b-ba7c-6661b3722155' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-d6225e0e-4c19-46a0-bf86-64107fc8fcaa' class='xr-var-data-in' type='checkbox'><label for='data-d6225e0e-4c19-46a0-bf86-64107fc8fcaa' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>time</dd><dt><span>long_name :</span></dt><dd>Time</dd></dl></div><div class='xr-var-data'><pre>array(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n", | |
| " '2013-01-01T12:00:00.000000000', ..., '2013-12-31T06:00:00.000000000',\n", | |
| " '2013-12-31T12:00:00.000000000', '2013-12-31T18:00:00.000000000'],\n", | |
| " shape=(1460,), dtype='datetime64[ns]')</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>lat</span></div><div class='xr-var-dims'>(lat)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>50.0 47.5 45.0 ... 35.0 32.5 30.0</div><input id='attrs-d437c695-e193-441f-9948-74d37b6b32aa' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-d437c695-e193-441f-9948-74d37b6b32aa' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-13fd6724-1037-4d13-83f8-afc24039b730' class='xr-var-data-in' type='checkbox'><label for='data-13fd6724-1037-4d13-83f8-afc24039b730' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>latitude</dd><dt><span>long_name :</span></dt><dd>Latitude</dd><dt><span>units :</span></dt><dd>degrees_north</dd><dt><span>axis :</span></dt><dd>Y</dd></dl></div><div class='xr-var-data'><pre>array([50. , 47.5, 45. , 42.5, 40. , 37.5, 35. , 32.5, 30. ], dtype=float32)</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>lon</span></div><div class='xr-var-dims'>(lon)</div><div class='xr-var-dtype'>float32</div><div class='xr-var-preview xr-preview'>230.0 232.5 235.0 ... 287.5 290.0</div><input id='attrs-020f59b9-44a8-40e4-b3b5-e9b64bb75ef8' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-020f59b9-44a8-40e4-b3b5-e9b64bb75ef8' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-0f562713-1fcb-49a3-b87a-d865fb1be8b5' class='xr-var-data-in' type='checkbox'><label for='data-0f562713-1fcb-49a3-b87a-d865fb1be8b5' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>longitude</dd><dt><span>long_name :</span></dt><dd>Longitude</dd><dt><span>units :</span></dt><dd>degrees_east</dd><dt><span>axis :</span></dt><dd>X</dd></dl></div><div class='xr-var-data'><pre>array([230. , 232.5, 235. , 237.5, 240. , 242.5, 245. , 247.5, 250. , 252.5,\n", | |
| " 255. , 257.5, 260. , 262.5, 265. , 267.5, 270. , 272.5, 275. , 277.5,\n", | |
| " 280. , 282.5, 285. , 287.5, 290. ], dtype=float32)</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-a847adcc-f555-4090-8316-6950ef231571' class='xr-section-summary-in' type='checkbox' checked><label for='section-a847adcc-f555-4090-8316-6950ef231571' class='xr-section-summary' >Data variables: <span>(2)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>air</span></div><div class='xr-var-dims'>(time, lat, lon)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>dask.array<chunksize=(100, 9, 20), meta=np.ndarray></div><input id='attrs-24f95b7b-b137-43ba-80f0-caafd6845945' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-24f95b7b-b137-43ba-80f0-caafd6845945' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-a7c9620b-f0f0-4592-8534-ed90d4d37b10' class='xr-var-data-in' type='checkbox'><label for='data-a7c9620b-f0f0-4592-8534-ed90d4d37b10' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>4xDaily Air temperature at sigma level 995</dd><dt><span>units :</span></dt><dd>degK</dd><dt><span>precision :</span></dt><dd>2</dd><dt><span>GRIB_id :</span></dt><dd>11</dd><dt><span>GRIB_name :</span></dt><dd>TMP</dd><dt><span>var_desc :</span></dt><dd>Air temperature</dd><dt><span>dataset :</span></dt><dd>NMC Reanalysis</dd><dt><span>level_desc :</span></dt><dd>Surface</dd><dt><span>statistic :</span></dt><dd>Individual Obs</dd><dt><span>parent_stat :</span></dt><dd>Other</dd><dt><span>actual_range :</span></dt><dd>[185.16000366210938, 322.1000061035156]</dd></dl></div><div class='xr-var-data'><table>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " <table style=\"border-collapse: collapse;\">\n", | |
| " <thead>\n", | |
| " <tr>\n", | |
| " <td> </td>\n", | |
| " <th> Array </th>\n", | |
| " <th> Chunk </th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " \n", | |
| " <tr>\n", | |
| " <th> Bytes </th>\n", | |
| " <td> 2.51 MiB </td>\n", | |
| " <td> 140.62 kiB </td>\n", | |
| " </tr>\n", | |
| " \n", | |
| " <tr>\n", | |
| " <th> Shape </th>\n", | |
| " <td> (1460, 9, 25) </td>\n", | |
| " <td> (100, 9, 20) </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th> Dask graph </th>\n", | |
| " <td colspan=\"2\"> 30 chunks in 1 expression </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th> Data type </th>\n", | |
| " <td colspan=\"2\"> float64 numpy.ndarray </td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| " </table>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <svg width=\"158\" height=\"146\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"80\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"10\" y1=\"25\" x2=\"80\" y2=\"96\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"10\" y2=\"25\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"14\" y1=\"4\" x2=\"14\" y2=\"30\" />\n", | |
| " <line x1=\"19\" y1=\"9\" x2=\"19\" y2=\"35\" />\n", | |
| " <line x1=\"24\" y1=\"14\" x2=\"24\" y2=\"39\" />\n", | |
| " <line x1=\"29\" y1=\"19\" x2=\"29\" y2=\"44\" />\n", | |
| " <line x1=\"34\" y1=\"24\" x2=\"34\" y2=\"49\" />\n", | |
| " <line x1=\"39\" y1=\"29\" x2=\"39\" y2=\"54\" />\n", | |
| " <line x1=\"43\" y1=\"33\" x2=\"43\" y2=\"59\" />\n", | |
| " <line x1=\"48\" y1=\"38\" x2=\"48\" y2=\"64\" />\n", | |
| " <line x1=\"53\" y1=\"43\" x2=\"53\" y2=\"68\" />\n", | |
| " <line x1=\"58\" y1=\"48\" x2=\"58\" y2=\"73\" />\n", | |
| " <line x1=\"63\" y1=\"53\" x2=\"63\" y2=\"78\" />\n", | |
| " <line x1=\"68\" y1=\"58\" x2=\"68\" y2=\"83\" />\n", | |
| " <line x1=\"72\" y1=\"62\" x2=\"72\" y2=\"88\" />\n", | |
| " <line x1=\"77\" y1=\"67\" x2=\"77\" y2=\"93\" />\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"80\" y2=\"96\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"10.0,0.0 80.58823529411765,70.58823529411765 80.58823529411765,96.00085180870013 10.0,25.412616514582485\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"38\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"14\" y1=\"4\" x2=\"43\" y2=\"4\" />\n", | |
| " <line x1=\"19\" y1=\"9\" x2=\"47\" y2=\"9\" />\n", | |
| " <line x1=\"24\" y1=\"14\" x2=\"52\" y2=\"14\" />\n", | |
| " <line x1=\"29\" y1=\"19\" x2=\"57\" y2=\"19\" />\n", | |
| " <line x1=\"34\" y1=\"24\" x2=\"62\" y2=\"24\" />\n", | |
| " <line x1=\"39\" y1=\"29\" x2=\"67\" y2=\"29\" />\n", | |
| " <line x1=\"43\" y1=\"33\" x2=\"72\" y2=\"33\" />\n", | |
| " <line x1=\"48\" y1=\"38\" x2=\"76\" y2=\"38\" />\n", | |
| " <line x1=\"53\" y1=\"43\" x2=\"81\" y2=\"43\" />\n", | |
| " <line x1=\"58\" y1=\"48\" x2=\"86\" y2=\"48\" />\n", | |
| " <line x1=\"63\" y1=\"53\" x2=\"91\" y2=\"53\" />\n", | |
| " <line x1=\"68\" y1=\"58\" x2=\"96\" y2=\"58\" />\n", | |
| " <line x1=\"72\" y1=\"62\" x2=\"101\" y2=\"62\" />\n", | |
| " <line x1=\"77\" y1=\"67\" x2=\"105\" y2=\"67\" />\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"108\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"80\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"32\" y1=\"0\" x2=\"103\" y2=\"70\" />\n", | |
| " <line x1=\"38\" y1=\"0\" x2=\"108\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"10.0,0.0 38.16994646543236,0.0 108.75818175955001,70.58823529411765 80.58823529411765,70.58823529411765\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"108\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"80\" y1=\"96\" x2=\"108\" y2=\"96\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"80\" y2=\"96\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"103\" y1=\"70\" x2=\"103\" y2=\"96\" />\n", | |
| " <line x1=\"108\" y1=\"70\" x2=\"108\" y2=\"96\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"80.58823529411765,70.58823529411765 108.75818175955001,70.58823529411765 108.75818175955001,96.00085180870013 80.58823529411765,96.00085180870013\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"94.67320852683383\" y=\"116.00085180870013\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >25</text>\n", | |
| " <text x=\"128.75818175955\" y=\"83.29454355140889\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,128.75818175955,83.29454355140889)\">9</text>\n", | |
| " <text x=\"35.294117647058826\" y=\"80.70673416164131\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,35.294117647058826,80.70673416164131)\">1460</text>\n", | |
| "</svg>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| "</table></div></li><li class='xr-var-item'><div class='xr-var-name'><span>air_celsius</span></div><div class='xr-var-dims'>(time, lat, lon)</div><div class='xr-var-dtype'>float64</div><div class='xr-var-preview xr-preview'>dask.array<chunksize=(100, 9, 20), meta=np.ndarray></div><input id='attrs-3401b4cd-69cb-4382-8c8a-b5163f09777b' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-3401b4cd-69cb-4382-8c8a-b5163f09777b' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-8de63dcc-7a79-4a39-859c-5a9b38f341c1' class='xr-var-data-in' type='checkbox'><label for='data-8de63dcc-7a79-4a39-859c-5a9b38f341c1' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>4xDaily Air temperature at sigma level 995</dd><dt><span>units :</span></dt><dd>degK</dd><dt><span>precision :</span></dt><dd>2</dd><dt><span>GRIB_id :</span></dt><dd>11</dd><dt><span>GRIB_name :</span></dt><dd>TMP</dd><dt><span>var_desc :</span></dt><dd>Air temperature</dd><dt><span>dataset :</span></dt><dd>NMC Reanalysis</dd><dt><span>level_desc :</span></dt><dd>Surface</dd><dt><span>statistic :</span></dt><dd>Individual Obs</dd><dt><span>parent_stat :</span></dt><dd>Other</dd><dt><span>actual_range :</span></dt><dd>[185.16000366210938, 322.1000061035156]</dd></dl></div><div class='xr-var-data'><table>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " <table style=\"border-collapse: collapse;\">\n", | |
| " <thead>\n", | |
| " <tr>\n", | |
| " <td> </td>\n", | |
| " <th> Array </th>\n", | |
| " <th> Chunk </th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " \n", | |
| " <tr>\n", | |
| " <th> Bytes </th>\n", | |
| " <td> 2.51 MiB </td>\n", | |
| " <td> 140.62 kiB </td>\n", | |
| " </tr>\n", | |
| " \n", | |
| " <tr>\n", | |
| " <th> Shape </th>\n", | |
| " <td> (1460, 9, 25) </td>\n", | |
| " <td> (100, 9, 20) </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th> Dask graph </th>\n", | |
| " <td colspan=\"2\"> 30 chunks in 1 expression </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th> Data type </th>\n", | |
| " <td colspan=\"2\"> float64 numpy.ndarray </td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| " </table>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <svg width=\"158\" height=\"146\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"80\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"10\" y1=\"25\" x2=\"80\" y2=\"96\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"10\" y2=\"25\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"14\" y1=\"4\" x2=\"14\" y2=\"30\" />\n", | |
| " <line x1=\"19\" y1=\"9\" x2=\"19\" y2=\"35\" />\n", | |
| " <line x1=\"24\" y1=\"14\" x2=\"24\" y2=\"39\" />\n", | |
| " <line x1=\"29\" y1=\"19\" x2=\"29\" y2=\"44\" />\n", | |
| " <line x1=\"34\" y1=\"24\" x2=\"34\" y2=\"49\" />\n", | |
| " <line x1=\"39\" y1=\"29\" x2=\"39\" y2=\"54\" />\n", | |
| " <line x1=\"43\" y1=\"33\" x2=\"43\" y2=\"59\" />\n", | |
| " <line x1=\"48\" y1=\"38\" x2=\"48\" y2=\"64\" />\n", | |
| " <line x1=\"53\" y1=\"43\" x2=\"53\" y2=\"68\" />\n", | |
| " <line x1=\"58\" y1=\"48\" x2=\"58\" y2=\"73\" />\n", | |
| " <line x1=\"63\" y1=\"53\" x2=\"63\" y2=\"78\" />\n", | |
| " <line x1=\"68\" y1=\"58\" x2=\"68\" y2=\"83\" />\n", | |
| " <line x1=\"72\" y1=\"62\" x2=\"72\" y2=\"88\" />\n", | |
| " <line x1=\"77\" y1=\"67\" x2=\"77\" y2=\"93\" />\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"80\" y2=\"96\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"10.0,0.0 80.58823529411765,70.58823529411765 80.58823529411765,96.00085180870013 10.0,25.412616514582485\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"38\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"14\" y1=\"4\" x2=\"43\" y2=\"4\" />\n", | |
| " <line x1=\"19\" y1=\"9\" x2=\"47\" y2=\"9\" />\n", | |
| " <line x1=\"24\" y1=\"14\" x2=\"52\" y2=\"14\" />\n", | |
| " <line x1=\"29\" y1=\"19\" x2=\"57\" y2=\"19\" />\n", | |
| " <line x1=\"34\" y1=\"24\" x2=\"62\" y2=\"24\" />\n", | |
| " <line x1=\"39\" y1=\"29\" x2=\"67\" y2=\"29\" />\n", | |
| " <line x1=\"43\" y1=\"33\" x2=\"72\" y2=\"33\" />\n", | |
| " <line x1=\"48\" y1=\"38\" x2=\"76\" y2=\"38\" />\n", | |
| " <line x1=\"53\" y1=\"43\" x2=\"81\" y2=\"43\" />\n", | |
| " <line x1=\"58\" y1=\"48\" x2=\"86\" y2=\"48\" />\n", | |
| " <line x1=\"63\" y1=\"53\" x2=\"91\" y2=\"53\" />\n", | |
| " <line x1=\"68\" y1=\"58\" x2=\"96\" y2=\"58\" />\n", | |
| " <line x1=\"72\" y1=\"62\" x2=\"101\" y2=\"62\" />\n", | |
| " <line x1=\"77\" y1=\"67\" x2=\"105\" y2=\"67\" />\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"108\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"10\" y1=\"0\" x2=\"80\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"32\" y1=\"0\" x2=\"103\" y2=\"70\" />\n", | |
| " <line x1=\"38\" y1=\"0\" x2=\"108\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"10.0,0.0 38.16994646543236,0.0 108.75818175955001,70.58823529411765 80.58823529411765,70.58823529411765\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"108\" y2=\"70\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"80\" y1=\"96\" x2=\"108\" y2=\"96\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"80\" y1=\"70\" x2=\"80\" y2=\"96\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"103\" y1=\"70\" x2=\"103\" y2=\"96\" />\n", | |
| " <line x1=\"108\" y1=\"70\" x2=\"108\" y2=\"96\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"80.58823529411765,70.58823529411765 108.75818175955001,70.58823529411765 108.75818175955001,96.00085180870013 80.58823529411765,96.00085180870013\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"94.67320852683383\" y=\"116.00085180870013\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >25</text>\n", | |
| " <text x=\"128.75818175955\" y=\"83.29454355140889\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,128.75818175955,83.29454355140889)\">9</text>\n", | |
| " <text x=\"35.294117647058826\" y=\"80.70673416164131\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(45,35.294117647058826,80.70673416164131)\">1460</text>\n", | |
| "</svg>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| "</table></div></li></ul></div></li><li class='xr-section-item'><input id='section-5ef68e3f-0d5b-4441-853f-0dee881fa33c' class='xr-section-summary-in' type='checkbox' checked><label for='section-5ef68e3f-0d5b-4441-853f-0dee881fa33c' class='xr-section-summary' >Attributes: <span>(5)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'><dt><span>Conventions :</span></dt><dd>COARDS</dd><dt><span>title :</span></dt><dd>4x daily NMC reanalysis (1948)</dd><dt><span>description :</span></dt><dd>Data is from NMC initialized reanalysis\n", | |
| "(4x/day). These are the 0.9950 sigma level values.</dd><dt><span>platform :</span></dt><dd>Model</dd><dt><span>references :</span></dt><dd>http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html</dd></dl></div></li></ul></div></div>" | |
| ], | |
| "text/plain": [ | |
| "<xarray.Dataset> Size: 5MB\n", | |
| "Dimensions: (time: 1460, lat: 9, lon: 25)\n", | |
| "Coordinates:\n", | |
| " * time (time) datetime64[ns] 12kB 2013-01-01 ... 2013-12-31T18:00:00\n", | |
| " * lat (lat) float32 36B 50.0 47.5 45.0 42.5 40.0 37.5 35.0 32.5 30.0\n", | |
| " * lon (lon) float32 100B 230.0 232.5 235.0 ... 285.0 287.5 290.0\n", | |
| "Data variables:\n", | |
| " air (time, lat, lon) float64 3MB dask.array<chunksize=(100, 9, 20), meta=np.ndarray>\n", | |
| " air_celsius (time, lat, lon) float64 3MB dask.array<chunksize=(100, 9, 20), meta=np.ndarray>\n", | |
| "Attributes:\n", | |
| " Conventions: COARDS\n", | |
| " title: 4x daily NMC reanalysis (1948)\n", | |
| " description: Data is from NMC initialized reanalysis\\n(4x/day). These a...\n", | |
| " platform: Model\n", | |
| " references: http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanaly..." | |
| ] | |
| }, | |
| "execution_count": 3, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# Complex query: select US region, first year, rechunk, convert to Celsius, compute anomaly\n", | |
| "query = (\n", | |
| " ds\n", | |
| " .assign(air_celsius=lambda x: x.air - 273.15) # Convert to Celsius\n", | |
| " .sel(lat=slice(50, 30), lon=slice(230, 290)) # Continental US region\n", | |
| " .isel(time=slice(0, 365 * 4)) # First year (4x daily)\n", | |
| " .chunk({\"time\": 100, \"lat\": 10, \"lon\": 20}) # Rechunk for analysis\n", | |
| ")\n", | |
| "query" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "fa30a43b-f5db-49a9-827c-437c55735db7", | |
| "metadata": {}, | |
| "source": [ | |
| "We store each operation in an expression tree" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 4, | |
| "id": "cell-6", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre><span style=\"font-weight: bold\">DatasetExpr</span>\n", | |
| "\n", | |
| "<span style=\"font-style: italic\">air </span>\n", | |
| "<span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Operation Dims Bytes Chunks </span>\n", | |
| " <span style=\"font-weight: bold\">Rechunk</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">time: 1460, lat: 9, lon: 25 </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">2.5 MiB</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> 100×9×20</span> \n", | |
| " <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">└ </span><span style=\"font-weight: bold\">Getitem</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">time: 1460, lat: 9, lon: 25 </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">2.5 MiB</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> 500×3×15</span> \n", | |
| " <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> └ </span><span style=\"font-weight: bold\">Getitem</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">time: 2920, lat: 9, lon: 25 </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">5.0 MiB</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> 500×3×15</span> \n", | |
| " <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> └ </span><span style=\"color: #ce5c00; text-decoration-color: #ce5c00; font-weight: bold\">Open Dataset</span> time: 2920, lat: 25, lon: 53 30 MiB 500×13×27 \n", | |
| "\n", | |
| "<span style=\"font-style: italic\">air_celsius </span>\n", | |
| "<span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Operation Dims Bytes Chunks </span>\n", | |
| " <span style=\"font-weight: bold\">Rechunk</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">time: 1460, lat: 9, lon: 25 </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">2.5 MiB</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> 100×9×20</span> \n", | |
| " <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">└ </span><span style=\"font-weight: bold\">Getitem</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">time: 1460, lat: 9, lon: 25 </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">2.5 MiB</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> 500×3×15</span> \n", | |
| " <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> └ </span><span style=\"font-weight: bold\">Getitem</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">time: 2920, lat: 9, lon: 25 </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">5.0 MiB</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> 500×3×15</span> \n", | |
| " <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> └ </span><span style=\"font-weight: bold\">Sub</span> time: 2920, lat: 25, lon: 53 30 MiB 500×13×27 \n", | |
| " <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> └ </span><span style=\"color: #ce5c00; text-decoration-color: #ce5c00; font-weight: bold\">Open Dataset</span> time: 2920, lat: 25, lon: 53 30 MiB 500×13×27 \n", | |
| "\n", | |
| "</pre>" | |
| ], | |
| "text/plain": [ | |
| "\u001b[1mDatasetExpr\u001b[0m\n", | |
| "\n", | |
| "\u001b[3mair \u001b[0m\n", | |
| "\u001b[2m \u001b[0m\u001b[2mOperation \u001b[0m\u001b[2m \u001b[0m\u001b[2mDims \u001b[0m\u001b[2m \u001b[0m\u001b[2m Bytes\u001b[0m\u001b[2m \u001b[0m\u001b[2m Chunks\u001b[0m\u001b[2m \u001b[0m\n", | |
| " \u001b[1mRechunk\u001b[0m \u001b[2mtime: 1460, lat: 9, lon: 25 \u001b[0m \u001b[2m2.5 MiB\u001b[0m \u001b[2m 100×9×20\u001b[0m \n", | |
| " \u001b[2m└ \u001b[0m\u001b[1mGetitem\u001b[0m \u001b[2mtime: 1460, lat: 9, lon: 25 \u001b[0m \u001b[2m2.5 MiB\u001b[0m \u001b[2m 500×3×15\u001b[0m \n", | |
| " \u001b[2m └ \u001b[0m\u001b[1mGetitem\u001b[0m \u001b[2mtime: 2920, lat: 9, lon: 25 \u001b[0m \u001b[2m5.0 MiB\u001b[0m \u001b[2m 500×3×15\u001b[0m \n", | |
| " \u001b[2m └ \u001b[0m\u001b[1;38;2;206;92;0mOpen Dataset\u001b[0m time: 2920, lat: 25, lon: 53 30 MiB 500×13×27 \n", | |
| "\n", | |
| "\u001b[3mair_celsius \u001b[0m\n", | |
| "\u001b[2m \u001b[0m\u001b[2mOperation \u001b[0m\u001b[2m \u001b[0m\u001b[2mDims \u001b[0m\u001b[2m \u001b[0m\u001b[2m Bytes\u001b[0m\u001b[2m \u001b[0m\u001b[2m Chunks\u001b[0m\u001b[2m \u001b[0m\n", | |
| " \u001b[1mRechunk\u001b[0m \u001b[2mtime: 1460, lat: 9, lon: 25 \u001b[0m \u001b[2m2.5 MiB\u001b[0m \u001b[2m 100×9×20\u001b[0m \n", | |
| " \u001b[2m└ \u001b[0m\u001b[1mGetitem\u001b[0m \u001b[2mtime: 1460, lat: 9, lon: 25 \u001b[0m \u001b[2m2.5 MiB\u001b[0m \u001b[2m 500×3×15\u001b[0m \n", | |
| " \u001b[2m └ \u001b[0m\u001b[1mGetitem\u001b[0m \u001b[2mtime: 2920, lat: 9, lon: 25 \u001b[0m \u001b[2m5.0 MiB\u001b[0m \u001b[2m 500×3×15\u001b[0m \n", | |
| " \u001b[2m └ \u001b[0m\u001b[1mSub\u001b[0m time: 2920, lat: 25, lon: 53 30 MiB 500×13×27 \n", | |
| " \u001b[2m └ \u001b[0m\u001b[1;38;2;206;92;0mOpen Dataset\u001b[0m time: 2920, lat: 25, lon: 53 30 MiB 500×13×27" | |
| ] | |
| }, | |
| "execution_count": 4, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "query.expr" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "d0f2344b-bb08-4bfc-9cc7-1639056761c7", | |
| "metadata": {}, | |
| "source": [ | |
| "We can simplify these expressions. Below note that the rechunk and getitem operations get absorbed into the initial Open Dataset (see the chunks and dimension ranges change). Note that they both progress through the `Sub` operation." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 5, | |
| "id": "67324ec5-3488-483a-b1fd-113048a69a4e", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre><span style=\"font-weight: bold\">DatasetExpr</span>\n", | |
| "\n", | |
| "<span style=\"font-style: italic\">air </span>\n", | |
| "<span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Operation Dims Bytes Chunks </span>\n", | |
| " <span style=\"color: #ce5c00; text-decoration-color: #ce5c00; font-weight: bold\">Open Dataset</span> time: 1460, lat: 9, lon: 25 2.5 MiB 100×9×20 \n", | |
| "\n", | |
| "<span style=\"font-style: italic\">air_celsius </span>\n", | |
| "<span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Operation Dims Bytes Chunks </span>\n", | |
| " <span style=\"font-weight: bold\">Sub</span> time: 1460, lat: 9, lon: 25 2.5 MiB 100×9×20 \n", | |
| " <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">└ </span><span style=\"color: #ce5c00; text-decoration-color: #ce5c00; font-weight: bold\">Open Dataset</span> time: 1460, lat: 9, lon: 25 2.5 MiB 100×9×20 \n", | |
| "\n", | |
| "</pre>" | |
| ], | |
| "text/plain": [ | |
| "\u001b[1mDatasetExpr\u001b[0m\n", | |
| "\n", | |
| "\u001b[3mair \u001b[0m\n", | |
| "\u001b[2m \u001b[0m\u001b[2mOperation \u001b[0m\u001b[2m \u001b[0m\u001b[2mDims \u001b[0m\u001b[2m \u001b[0m\u001b[2m Bytes\u001b[0m\u001b[2m \u001b[0m\u001b[2m Chunks\u001b[0m\u001b[2m \u001b[0m\n", | |
| " \u001b[1;38;2;206;92;0mOpen Dataset\u001b[0m time: 1460, lat: 9, lon: 25 2.5 MiB 100×9×20 \n", | |
| "\n", | |
| "\u001b[3mair_celsius \u001b[0m\n", | |
| "\u001b[2m \u001b[0m\u001b[2mOperation \u001b[0m\u001b[2m \u001b[0m\u001b[2mDims \u001b[0m\u001b[2m \u001b[0m\u001b[2m Bytes\u001b[0m\u001b[2m \u001b[0m\u001b[2m Chunks\u001b[0m\u001b[2m \u001b[0m\n", | |
| " \u001b[1mSub\u001b[0m time: 1460, lat: 9, lon: 25 2.5 MiB 100×9×20 \n", | |
| " \u001b[2m└ \u001b[0m\u001b[1;38;2;206;92;0mOpen Dataset\u001b[0m time: 1460, lat: 9, lon: 25 2.5 MiB 100×9×20" | |
| ] | |
| }, | |
| "execution_count": 5, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "query.expr.simplify()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "id": "cell-8", | |
| "metadata": {}, | |
| "source": [ | |
| "## Reduction Query\n", | |
| "\n", | |
| "Add a reduction to see how aggregations appear in the expression tree." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 6, | |
| "id": "cell-9", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n", | |
| "<defs>\n", | |
| "<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n", | |
| "<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n", | |
| "<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n", | |
| "<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n", | |
| "</symbol>\n", | |
| "<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n", | |
| "<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n", | |
| "<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n", | |
| "<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n", | |
| "<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n", | |
| "</symbol>\n", | |
| "</defs>\n", | |
| "</svg>\n", | |
| "<style>/* CSS stylesheet for displaying xarray objects in notebooks */\n", | |
| "\n", | |
| ":root {\n", | |
| " --xr-font-color0: var(\n", | |
| " --jp-content-font-color0,\n", | |
| " var(--pst-color-text-base rgba(0, 0, 0, 1))\n", | |
| " );\n", | |
| " --xr-font-color2: var(\n", | |
| " --jp-content-font-color2,\n", | |
| " var(--pst-color-text-base, rgba(0, 0, 0, 0.54))\n", | |
| " );\n", | |
| " --xr-font-color3: var(\n", | |
| " --jp-content-font-color3,\n", | |
| " var(--pst-color-text-base, rgba(0, 0, 0, 0.38))\n", | |
| " );\n", | |
| " --xr-border-color: var(\n", | |
| " --jp-border-color2,\n", | |
| " hsl(from var(--pst-color-on-background, white) h s calc(l - 10))\n", | |
| " );\n", | |
| " --xr-disabled-color: var(\n", | |
| " --jp-layout-color3,\n", | |
| " hsl(from var(--pst-color-on-background, white) h s calc(l - 40))\n", | |
| " );\n", | |
| " --xr-background-color: var(\n", | |
| " --jp-layout-color0,\n", | |
| " var(--pst-color-on-background, white)\n", | |
| " );\n", | |
| " --xr-background-color-row-even: var(\n", | |
| " --jp-layout-color1,\n", | |
| " hsl(from var(--pst-color-on-background, white) h s calc(l - 5))\n", | |
| " );\n", | |
| " --xr-background-color-row-odd: var(\n", | |
| " --jp-layout-color2,\n", | |
| " hsl(from var(--pst-color-on-background, white) h s calc(l - 15))\n", | |
| " );\n", | |
| "}\n", | |
| "\n", | |
| "html[theme=\"dark\"],\n", | |
| "html[data-theme=\"dark\"],\n", | |
| "body[data-theme=\"dark\"],\n", | |
| "body.vscode-dark {\n", | |
| " --xr-font-color0: var(\n", | |
| " --jp-content-font-color0,\n", | |
| " var(--pst-color-text-base, rgba(255, 255, 255, 1))\n", | |
| " );\n", | |
| " --xr-font-color2: var(\n", | |
| " --jp-content-font-color2,\n", | |
| " var(--pst-color-text-base, rgba(255, 255, 255, 0.54))\n", | |
| " );\n", | |
| " --xr-font-color3: var(\n", | |
| " --jp-content-font-color3,\n", | |
| " var(--pst-color-text-base, rgba(255, 255, 255, 0.38))\n", | |
| " );\n", | |
| " --xr-border-color: var(\n", | |
| " --jp-border-color2,\n", | |
| " hsl(from var(--pst-color-on-background, #111111) h s calc(l + 10))\n", | |
| " );\n", | |
| " --xr-disabled-color: var(\n", | |
| " --jp-layout-color3,\n", | |
| " hsl(from var(--pst-color-on-background, #111111) h s calc(l + 40))\n", | |
| " );\n", | |
| " --xr-background-color: var(\n", | |
| " --jp-layout-color0,\n", | |
| " var(--pst-color-on-background, #111111)\n", | |
| " );\n", | |
| " --xr-background-color-row-even: var(\n", | |
| " --jp-layout-color1,\n", | |
| " hsl(from var(--pst-color-on-background, #111111) h s calc(l + 5))\n", | |
| " );\n", | |
| " --xr-background-color-row-odd: var(\n", | |
| " --jp-layout-color2,\n", | |
| " hsl(from var(--pst-color-on-background, #111111) h s calc(l + 15))\n", | |
| " );\n", | |
| "}\n", | |
| "\n", | |
| ".xr-wrap {\n", | |
| " display: block !important;\n", | |
| " min-width: 300px;\n", | |
| " max-width: 700px;\n", | |
| " line-height: 1.6;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-text-repr-fallback {\n", | |
| " /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n", | |
| " display: none;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-header {\n", | |
| " padding-top: 6px;\n", | |
| " padding-bottom: 6px;\n", | |
| " margin-bottom: 4px;\n", | |
| " border-bottom: solid 1px var(--xr-border-color);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-header > div,\n", | |
| ".xr-header > ul {\n", | |
| " display: inline;\n", | |
| " margin-top: 0;\n", | |
| " margin-bottom: 0;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-obj-type,\n", | |
| ".xr-obj-name,\n", | |
| ".xr-group-name {\n", | |
| " margin-left: 2px;\n", | |
| " margin-right: 10px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-name::before {\n", | |
| " content: \"📁\";\n", | |
| " padding-right: 0.3em;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-name,\n", | |
| ".xr-obj-type {\n", | |
| " color: var(--xr-font-color2);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-sections {\n", | |
| " padding-left: 0 !important;\n", | |
| " display: grid;\n", | |
| " grid-template-columns: 150px auto auto 1fr 0 20px 0 20px;\n", | |
| " margin-block-start: 0;\n", | |
| " margin-block-end: 0;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item {\n", | |
| " display: contents;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item input {\n", | |
| " display: inline-block;\n", | |
| " opacity: 0;\n", | |
| " height: 0;\n", | |
| " margin: 0;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item input + label {\n", | |
| " color: var(--xr-disabled-color);\n", | |
| " border: 2px solid transparent !important;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item input:enabled + label {\n", | |
| " cursor: pointer;\n", | |
| " color: var(--xr-font-color2);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item input:focus + label {\n", | |
| " border: 2px solid var(--xr-font-color0) !important;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-item input:enabled + label:hover {\n", | |
| " color: var(--xr-font-color0);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary {\n", | |
| " grid-column: 1;\n", | |
| " color: var(--xr-font-color2);\n", | |
| " font-weight: 500;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary > span {\n", | |
| " display: inline-block;\n", | |
| " padding-left: 0.5em;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in:disabled + label {\n", | |
| " color: var(--xr-font-color2);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in + label:before {\n", | |
| " display: inline-block;\n", | |
| " content: \"►\";\n", | |
| " font-size: 11px;\n", | |
| " width: 15px;\n", | |
| " text-align: center;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in:disabled + label:before {\n", | |
| " color: var(--xr-disabled-color);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in:checked + label:before {\n", | |
| " content: \"▼\";\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in:checked + label > span {\n", | |
| " display: none;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary,\n", | |
| ".xr-section-inline-details {\n", | |
| " padding-top: 4px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-inline-details {\n", | |
| " grid-column: 2 / -1;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-details {\n", | |
| " display: none;\n", | |
| " grid-column: 1 / -1;\n", | |
| " margin-top: 4px;\n", | |
| " margin-bottom: 5px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-section-summary-in:checked ~ .xr-section-details {\n", | |
| " display: contents;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-box {\n", | |
| " display: inline-grid;\n", | |
| " grid-template-columns: 0px 20px auto;\n", | |
| " width: 100%;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-box-vline {\n", | |
| " grid-column-start: 1;\n", | |
| " border-right: 0.2em solid;\n", | |
| " border-color: var(--xr-border-color);\n", | |
| " width: 0px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-box-hline {\n", | |
| " grid-column-start: 2;\n", | |
| " grid-row-start: 1;\n", | |
| " height: 1em;\n", | |
| " width: 20px;\n", | |
| " border-bottom: 0.2em solid;\n", | |
| " border-color: var(--xr-border-color);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-group-box-contents {\n", | |
| " grid-column-start: 3;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-array-wrap {\n", | |
| " grid-column: 1 / -1;\n", | |
| " display: grid;\n", | |
| " grid-template-columns: 20px auto;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-array-wrap > label {\n", | |
| " grid-column: 1;\n", | |
| " vertical-align: top;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-preview {\n", | |
| " color: var(--xr-font-color3);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-array-preview,\n", | |
| ".xr-array-data {\n", | |
| " padding: 0 5px !important;\n", | |
| " grid-column: 2;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-array-data,\n", | |
| ".xr-array-in:checked ~ .xr-array-preview {\n", | |
| " display: none;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-array-in:checked ~ .xr-array-data,\n", | |
| ".xr-array-preview {\n", | |
| " display: inline-block;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-dim-list {\n", | |
| " display: inline-block !important;\n", | |
| " list-style: none;\n", | |
| " padding: 0 !important;\n", | |
| " margin: 0;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-dim-list li {\n", | |
| " display: inline-block;\n", | |
| " padding: 0;\n", | |
| " margin: 0;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-dim-list:before {\n", | |
| " content: \"(\";\n", | |
| "}\n", | |
| "\n", | |
| ".xr-dim-list:after {\n", | |
| " content: \")\";\n", | |
| "}\n", | |
| "\n", | |
| ".xr-dim-list li:not(:last-child):after {\n", | |
| " content: \",\";\n", | |
| " padding-right: 5px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-has-index {\n", | |
| " font-weight: bold;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-list,\n", | |
| ".xr-var-item {\n", | |
| " display: contents;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-item > div,\n", | |
| ".xr-var-item label,\n", | |
| ".xr-var-item > .xr-var-name span {\n", | |
| " background-color: var(--xr-background-color-row-even);\n", | |
| " border-color: var(--xr-background-color-row-odd);\n", | |
| " margin-bottom: 0;\n", | |
| " padding-top: 2px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-item > .xr-var-name:hover span {\n", | |
| " padding-right: 5px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-list > li:nth-child(odd) > div,\n", | |
| ".xr-var-list > li:nth-child(odd) > label,\n", | |
| ".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n", | |
| " background-color: var(--xr-background-color-row-odd);\n", | |
| " border-color: var(--xr-background-color-row-even);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-name {\n", | |
| " grid-column: 1;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-dims {\n", | |
| " grid-column: 2;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-dtype {\n", | |
| " grid-column: 3;\n", | |
| " text-align: right;\n", | |
| " color: var(--xr-font-color2);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-preview {\n", | |
| " grid-column: 4;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-index-preview {\n", | |
| " grid-column: 2 / 5;\n", | |
| " color: var(--xr-font-color2);\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-name,\n", | |
| ".xr-var-dims,\n", | |
| ".xr-var-dtype,\n", | |
| ".xr-preview,\n", | |
| ".xr-attrs dt {\n", | |
| " white-space: nowrap;\n", | |
| " overflow: hidden;\n", | |
| " text-overflow: ellipsis;\n", | |
| " padding-right: 10px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-name:hover,\n", | |
| ".xr-var-dims:hover,\n", | |
| ".xr-var-dtype:hover,\n", | |
| ".xr-attrs dt:hover {\n", | |
| " overflow: visible;\n", | |
| " width: auto;\n", | |
| " z-index: 1;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-attrs,\n", | |
| ".xr-var-data,\n", | |
| ".xr-index-data {\n", | |
| " display: none;\n", | |
| " border-top: 2px dotted var(--xr-background-color);\n", | |
| " padding-bottom: 20px !important;\n", | |
| " padding-top: 10px !important;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-attrs-in + label,\n", | |
| ".xr-var-data-in + label,\n", | |
| ".xr-index-data-in + label {\n", | |
| " padding: 0 1px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-attrs-in:checked ~ .xr-var-attrs,\n", | |
| ".xr-var-data-in:checked ~ .xr-var-data,\n", | |
| ".xr-index-data-in:checked ~ .xr-index-data {\n", | |
| " display: block;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-data > table {\n", | |
| " float: right;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-data > pre,\n", | |
| ".xr-index-data > pre,\n", | |
| ".xr-var-data > table > tbody > tr {\n", | |
| " background-color: transparent !important;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-name span,\n", | |
| ".xr-var-data,\n", | |
| ".xr-index-name div,\n", | |
| ".xr-index-data,\n", | |
| ".xr-attrs {\n", | |
| " padding-left: 25px !important;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-attrs,\n", | |
| ".xr-var-attrs,\n", | |
| ".xr-var-data,\n", | |
| ".xr-index-data {\n", | |
| " grid-column: 1 / -1;\n", | |
| "}\n", | |
| "\n", | |
| "dl.xr-attrs {\n", | |
| " padding: 0;\n", | |
| " margin: 0;\n", | |
| " display: grid;\n", | |
| " grid-template-columns: 125px auto;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-attrs dt,\n", | |
| ".xr-attrs dd {\n", | |
| " padding: 0;\n", | |
| " margin: 0;\n", | |
| " float: left;\n", | |
| " padding-right: 10px;\n", | |
| " width: auto;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-attrs dt {\n", | |
| " font-weight: normal;\n", | |
| " grid-column: 1;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-attrs dt:hover span {\n", | |
| " display: inline-block;\n", | |
| " background: var(--xr-background-color);\n", | |
| " padding-right: 10px;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-attrs dd {\n", | |
| " grid-column: 2;\n", | |
| " white-space: pre-wrap;\n", | |
| " word-break: break-all;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-icon-database,\n", | |
| ".xr-icon-file-text2,\n", | |
| ".xr-no-icon {\n", | |
| " display: inline-block;\n", | |
| " vertical-align: middle;\n", | |
| " width: 1em;\n", | |
| " height: 1.5em !important;\n", | |
| " stroke-width: 0;\n", | |
| " stroke: currentColor;\n", | |
| " fill: currentColor;\n", | |
| "}\n", | |
| "\n", | |
| ".xr-var-attrs-in:checked + label > .xr-icon-file-text2,\n", | |
| ".xr-var-data-in:checked + label > .xr-icon-database,\n", | |
| ".xr-index-data-in:checked + label > .xr-icon-database {\n", | |
| " color: var(--xr-font-color0);\n", | |
| " filter: drop-shadow(1px 1px 5px var(--xr-font-color2));\n", | |
| " stroke-width: 0.8px;\n", | |
| "}\n", | |
| "</style><pre class='xr-text-repr-fallback'><xarray.DataArray 'air' (time: 500)> Size: 4kB\n", | |
| "dask.array<mean_agg-aggregate, shape=(500,), dtype=float64, chunksize=(500,), chunktype=numpy.ndarray>\n", | |
| "Coordinates:\n", | |
| " * time (time) datetime64[ns] 4kB 2013-01-01 ... 2013-05-05T18:00:00\n", | |
| "Attributes:\n", | |
| " long_name: 4xDaily Air temperature at sigma level 995\n", | |
| " units: degK\n", | |
| " precision: 2\n", | |
| " GRIB_id: 11\n", | |
| " GRIB_name: TMP\n", | |
| " var_desc: Air temperature\n", | |
| " dataset: NMC Reanalysis\n", | |
| " level_desc: Surface\n", | |
| " statistic: Individual Obs\n", | |
| " parent_stat: Other\n", | |
| " actual_range: [185.16000366210938, 322.1000061035156]</pre><div class='xr-wrap' style='display:none'><div class='xr-header'><div class='xr-obj-type'>xarray.DataArray</div><div class='xr-obj-name'>'air'</div><ul class='xr-dim-list'><li><span class='xr-has-index'>time</span>: 500</li></ul></div><ul class='xr-sections'><li class='xr-section-item'><div class='xr-array-wrap'><input id='section-b02953bc-a999-4c9d-a739-1137211d776a' class='xr-array-in' type='checkbox' checked><label for='section-b02953bc-a999-4c9d-a739-1137211d776a' title='Show/hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-array-preview xr-preview'><span>dask.array<chunksize=(500,), meta=np.ndarray></span></div><div class='xr-array-data'><table>\n", | |
| " <tr>\n", | |
| " <td>\n", | |
| " <table style=\"border-collapse: collapse;\">\n", | |
| " <thead>\n", | |
| " <tr>\n", | |
| " <td> </td>\n", | |
| " <th> Array </th>\n", | |
| " <th> Chunk </th>\n", | |
| " </tr>\n", | |
| " </thead>\n", | |
| " <tbody>\n", | |
| " \n", | |
| " <tr>\n", | |
| " <th> Bytes </th>\n", | |
| " <td> 3.91 kiB </td>\n", | |
| " <td> 3.91 kiB </td>\n", | |
| " </tr>\n", | |
| " \n", | |
| " <tr>\n", | |
| " <th> Shape </th>\n", | |
| " <td> (500,) </td>\n", | |
| " <td> (500,) </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th> Dask graph </th>\n", | |
| " <td colspan=\"2\"> 1 chunks in 1 expression </td>\n", | |
| " </tr>\n", | |
| " <tr>\n", | |
| " <th> Data type </th>\n", | |
| " <td colspan=\"2\"> float64 numpy.ndarray </td>\n", | |
| " </tr>\n", | |
| " </tbody>\n", | |
| " </table>\n", | |
| " </td>\n", | |
| " <td>\n", | |
| " <svg width=\"170\" height=\"75\" style=\"stroke:rgb(0,0,0);stroke-width:1\" >\n", | |
| "\n", | |
| " <!-- Horizontal lines -->\n", | |
| " <line x1=\"0\" y1=\"0\" x2=\"120\" y2=\"0\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"0\" y1=\"25\" x2=\"120\" y2=\"25\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Vertical lines -->\n", | |
| " <line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"25\" style=\"stroke-width:2\" />\n", | |
| " <line x1=\"120\" y1=\"0\" x2=\"120\" y2=\"25\" style=\"stroke-width:2\" />\n", | |
| "\n", | |
| " <!-- Colored Rectangle -->\n", | |
| " <polygon points=\"0.0,0.0 120.0,0.0 120.0,25.412616514582485 0.0,25.412616514582485\" style=\"fill:#ECB172A0;stroke-width:0\"/>\n", | |
| "\n", | |
| " <!-- Text -->\n", | |
| " <text x=\"60.0\" y=\"45.41261651458248\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" >500</text>\n", | |
| " <text x=\"140.0\" y=\"12.706308257291242\" font-size=\"1.0rem\" font-weight=\"100\" text-anchor=\"middle\" transform=\"rotate(0,140.0,12.706308257291242)\">1</text>\n", | |
| "</svg>\n", | |
| " </td>\n", | |
| " </tr>\n", | |
| "</table></div></div></li><li class='xr-section-item'><input id='section-cf200a5a-5547-4d53-9edb-57edac1d81c1' class='xr-section-summary-in' type='checkbox' checked><label for='section-cf200a5a-5547-4d53-9edb-57edac1d81c1' class='xr-section-summary' >Coordinates: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>time</span></div><div class='xr-var-dims'>(time)</div><div class='xr-var-dtype'>datetime64[ns]</div><div class='xr-var-preview xr-preview'>2013-01-01 ... 2013-05-05T18:00:00</div><input id='attrs-da8bb0a3-27d8-45d2-a238-03a7aaae66f5' class='xr-var-attrs-in' type='checkbox' ><label for='attrs-da8bb0a3-27d8-45d2-a238-03a7aaae66f5' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-81c30c3a-c8f2-4bf9-9bfd-afae834a38cb' class='xr-var-data-in' type='checkbox'><label for='data-81c30c3a-c8f2-4bf9-9bfd-afae834a38cb' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'><dt><span>standard_name :</span></dt><dd>time</dd><dt><span>long_name :</span></dt><dd>Time</dd></dl></div><div class='xr-var-data'><pre>array(['2013-01-01T00:00:00.000000000', '2013-01-01T06:00:00.000000000',\n", | |
| " '2013-01-01T12:00:00.000000000', ..., '2013-05-05T06:00:00.000000000',\n", | |
| " '2013-05-05T12:00:00.000000000', '2013-05-05T18:00:00.000000000'],\n", | |
| " shape=(500,), dtype='datetime64[ns]')</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-2f533ec7-eb64-404c-ac61-3d580b3b57b8' class='xr-section-summary-in' type='checkbox' ><label for='section-2f533ec7-eb64-404c-ac61-3d580b3b57b8' class='xr-section-summary' >Attributes: <span>(11)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'><dt><span>long_name :</span></dt><dd>4xDaily Air temperature at sigma level 995</dd><dt><span>units :</span></dt><dd>degK</dd><dt><span>precision :</span></dt><dd>2</dd><dt><span>GRIB_id :</span></dt><dd>11</dd><dt><span>GRIB_name :</span></dt><dd>TMP</dd><dt><span>var_desc :</span></dt><dd>Air temperature</dd><dt><span>dataset :</span></dt><dd>NMC Reanalysis</dd><dt><span>level_desc :</span></dt><dd>Surface</dd><dt><span>statistic :</span></dt><dd>Individual Obs</dd><dt><span>parent_stat :</span></dt><dd>Other</dd><dt><span>actual_range :</span></dt><dd>[185.16000366210938, 322.1000061035156]</dd></dl></div></li></ul></div></div>" | |
| ], | |
| "text/plain": [ | |
| "<xarray.DataArray 'air' (time: 500)> Size: 4kB\n", | |
| "dask.array<mean_agg-aggregate, shape=(500,), dtype=float64, chunksize=(500,), chunktype=numpy.ndarray>\n", | |
| "Coordinates:\n", | |
| " * time (time) datetime64[ns] 4kB 2013-01-01 ... 2013-05-05T18:00:00\n", | |
| "Attributes:\n", | |
| " long_name: 4xDaily Air temperature at sigma level 995\n", | |
| " units: degK\n", | |
| " precision: 2\n", | |
| " GRIB_id: 11\n", | |
| " GRIB_name: TMP\n", | |
| " var_desc: Air temperature\n", | |
| " dataset: NMC Reanalysis\n", | |
| " level_desc: Surface\n", | |
| " statistic: Individual Obs\n", | |
| " parent_stat: Other\n", | |
| " actual_range: [185.16000366210938, 322.1000061035156]" | |
| ] | |
| }, | |
| "execution_count": 6, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "# Compute spatial mean temperature over time\n", | |
| "timeseries = (\n", | |
| " ds.air\n", | |
| " .sel(lat=slice(50, 30), lon=slice(250, 280))\n", | |
| " .isel(time=slice(0, 500))\n", | |
| " .mean(dim=[\"lat\", \"lon\"])\n", | |
| ")\n", | |
| "timeseries" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 7, | |
| "id": "cell-10", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Operation Dims Bytes Chunks </span>\n", | |
| " <span style=\"color: #3465a4; text-decoration-color: #3465a4; font-weight: bold\">Mean Agg</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">time: 500 </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">3.9 kiB</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> 500</span> \n", | |
| " <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">└ </span><span style=\"color: #3465a4; text-decoration-color: #3465a4; font-weight: bold\">Mean Chunk</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">time: 500 </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> 16 kiB</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> 500×1×1</span> \n", | |
| " <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> └ </span><span style=\"font-weight: bold\">Getitem</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">time: 500 </span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">457 kiB</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> 500×3×7</span> \n", | |
| " <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> └ </span><span style=\"font-weight: bold\">Getitem</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">time: 2920</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">2.6 MiB</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> 500×3×7</span> \n", | |
| " <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> └ </span><span style=\"color: #ce5c00; text-decoration-color: #ce5c00; font-weight: bold\">Open Dataset</span> time: 2920 30 MiB 500×13×27 \n", | |
| "</pre>" | |
| ], | |
| "text/plain": [ | |
| "\u001b[2m \u001b[0m\u001b[2mOperation \u001b[0m\u001b[2m \u001b[0m\u001b[2mDims \u001b[0m\u001b[2m \u001b[0m\u001b[2m Bytes\u001b[0m\u001b[2m \u001b[0m\u001b[2m Chunks\u001b[0m\u001b[2m \u001b[0m\n", | |
| " \u001b[1;38;2;52;101;164mMean Agg\u001b[0m \u001b[2mtime: 500 \u001b[0m \u001b[2m3.9 kiB\u001b[0m \u001b[2m 500\u001b[0m \n", | |
| " \u001b[2m└ \u001b[0m\u001b[1;38;2;52;101;164mMean Chunk\u001b[0m \u001b[2mtime: 500 \u001b[0m \u001b[2m 16 kiB\u001b[0m \u001b[2m 500×1×1\u001b[0m \n", | |
| " \u001b[2m └ \u001b[0m\u001b[1mGetitem\u001b[0m \u001b[2mtime: 500 \u001b[0m \u001b[2m457 kiB\u001b[0m \u001b[2m 500×3×7\u001b[0m \n", | |
| " \u001b[2m └ \u001b[0m\u001b[1mGetitem\u001b[0m \u001b[2mtime: 2920\u001b[0m \u001b[2m2.6 MiB\u001b[0m \u001b[2m 500×3×7\u001b[0m \n", | |
| " \u001b[2m └ \u001b[0m\u001b[1;38;2;206;92;0mOpen Dataset\u001b[0m time: 2920 30 MiB 500×13×27" | |
| ] | |
| }, | |
| "execution_count": 7, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "timeseries.expr" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 8, | |
| "id": "d45ffd1f-75bc-4935-bbf0-f515d8500e84", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/html": [ | |
| "<pre><span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> Operation Dims Bytes Chunks </span>\n", | |
| " <span style=\"color: #3465a4; text-decoration-color: #3465a4; font-weight: bold\">Mean Agg</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">time: 500</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">3.9 kiB</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> 500</span> \n", | |
| " <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">└ </span><span style=\"color: #3465a4; text-decoration-color: #3465a4; font-weight: bold\">Mean Chunk</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">time: 500</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> 16 kiB</span> <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\">500×1×1</span> \n", | |
| " <span style=\"color: #7f7f7f; text-decoration-color: #7f7f7f\"> └ </span><span style=\"color: #ce5c00; text-decoration-color: #ce5c00; font-weight: bold\">Open Dataset</span> time: 500 457 kiB 500×3×7 \n", | |
| "</pre>" | |
| ], | |
| "text/plain": [ | |
| "\u001b[2m \u001b[0m\u001b[2mOperation \u001b[0m\u001b[2m \u001b[0m\u001b[2mDims \u001b[0m\u001b[2m \u001b[0m\u001b[2m Bytes\u001b[0m\u001b[2m \u001b[0m\u001b[2m Chunks\u001b[0m\u001b[2m \u001b[0m\n", | |
| " \u001b[1;38;2;52;101;164mMean Agg\u001b[0m \u001b[2mtime: 500\u001b[0m \u001b[2m3.9 kiB\u001b[0m \u001b[2m 500\u001b[0m \n", | |
| " \u001b[2m└ \u001b[0m\u001b[1;38;2;52;101;164mMean Chunk\u001b[0m \u001b[2mtime: 500\u001b[0m \u001b[2m 16 kiB\u001b[0m \u001b[2m500×1×1\u001b[0m \n", | |
| " \u001b[2m └ \u001b[0m\u001b[1;38;2;206;92;0mOpen Dataset\u001b[0m time: 500 457 kiB 500×3×7" | |
| ] | |
| }, | |
| "execution_count": 8, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "timeseries.expr.simplify()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 9, | |
| "id": "cell-12", | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "[<matplotlib.lines.Line2D at 0x13c275d30>]" | |
| ] | |
| }, | |
| "execution_count": 9, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| }, | |
| { | |
| "data": { | |
| "image/png": "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", | |
| "text/plain": [ | |
| "<Figure size 640x480 with 1 Axes>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "output_type": "display_data" | |
| } | |
| ], | |
| "source": [ | |
| "# Compute and plot\n", | |
| "result = timeseries.compute()\n", | |
| "result.plot()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "id": "cfa6b52e-d66c-41fb-bb57-0a2486ec3cfb", | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "metadata": { | |
| "kernelspec": { | |
| "display_name": "Python 3 (ipykernel)", | |
| "language": "python", | |
| "name": "python3" | |
| }, | |
| "language_info": { | |
| "codemirror_mode": { | |
| "name": "ipython", | |
| "version": 3 | |
| }, | |
| "file_extension": ".py", | |
| "mimetype": "text/x-python", | |
| "name": "python", | |
| "nbconvert_exporter": "python", | |
| "pygments_lexer": "ipython3", | |
| "version": "3.14.0" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 5 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment