{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "monthly-intro",
   "metadata": {},
   "source": [
    "# One month of airport climate\n",
    "\n",
    "Use NOAA Global Summary of the Month (GSOM) to inspect May 2024 precipitation\n",
    "and mean temperature at Will Rogers World Airport in Oklahoma City. This\n",
    "example requires `usdata` v0.7 or newer.\n",
    "\n",
    "**Saved outputs are a recorded run**, with execution times and source\n",
    "provenance below. Restart the kernel and run all cells to run it yourself.\n",
    "See [examples setup](../README.md) for the optional notebook environment."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "monthly-setup",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Executed (UTC): 2026-09-09T00:11:42+00:00\n",
      "usdata 0.7.0; pandas 3.0.5\n"
     ]
    }
   ],
   "source": [
    "from datetime import UTC, datetime\n",
    "from pathlib import Path\n",
    "\n",
    "import pandas as pd\n",
    "from IPython.display import Markdown, display\n",
    "\n",
    "import usdata\n",
    "from usdata.pull import pull, verify\n",
    "\n",
    "manifest = Path(\"examples/monthly-climate/dataset.yaml\")\n",
    "if not manifest.is_file():\n",
    "    manifest = Path(\"dataset.yaml\")\n",
    "\n",
    "pd.set_option(\"display.max_rows\", 8)\n",
    "pd.set_option(\"display.max_columns\", 8)\n",
    "print(f\"Executed (UTC): {datetime.now(UTC).isoformat(timespec='seconds')}\")\n",
    "print(f\"usdata {usdata.__version__}; pandas {pd.__version__}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "monthly-manifest-notes",
   "metadata": {},
   "source": [
    "## 1. Declare the input\n",
    "\n",
    "The bundled manifest selects one station, one month, and two variables.\n",
    "`units: metric` requests precipitation in millimeters and temperature in\n",
    "degrees Celsius. All UTC calendar months touched by a GSOM query are selected\n",
    "in full: May 6–7 still selects May, and May 31–June 1 selects both months."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "monthly-manifest",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "name: okc-monthly-climate\n",
      "sources:\n",
      "  - dataset: noaa:gsom\n",
      "    start: 2024-05-01\n",
      "    end: 2024-05-31\n",
      "    variables: [PRCP, TAVG]\n",
      "    params:\n",
      "      stations: USW00013967\n",
      "      units: metric\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(manifest.read_text())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "monthly-pull-notes",
   "metadata": {},
   "source": [
    "## 2. Pull and open\n",
    "\n",
    "The first pull writes a lockfile next to the manifest. Later pulls reuse its\n",
    "pinned URLs and checksums. `DATE` stays a `YYYY-MM` string unless you explicitly\n",
    "parse it; each row represents a complete month. NCEI does not include an ERDDAP-style\n",
    "units row, so the units here come from the manifest's documented `metric` setting."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "monthly-pull",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>STATION</th>\n",
       "      <th>DATE</th>\n",
       "      <th>PRCP</th>\n",
       "      <th>TAVG</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>USW00013967</td>\n",
       "      <td>2024-05</td>\n",
       "      <td>91.8</td>\n",
       "      <td>21.7</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       STATION     DATE  PRCP  TAVG\n",
       "0  USW00013967  2024-05  91.8  21.7"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "result = pull(manifest)\n",
    "items = result.fetched\n",
    "(item,) = items\n",
    "frame = item.open()\n",
    "display(frame[[\"STATION\", \"DATE\", \"PRCP\", \"TAVG\"]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "monthly-provenance",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "noaa:gsom\n",
      "Retrieved (UTC): 2026-09-09T00:11:42.930094+00:00\n",
      "Bytes: 135; cache hit: False\n",
      "Checksum: sha256:a8ef33c3d551ea4a97f62ead7c5e91233495e2ac61497524fd8e6aa0828fc8c5\n"
     ]
    },
    {
     "data": {
      "text/markdown": [
       "[Source request](<https://www.ncei.noaa.gov/access/services/data/v1?dataset=global-summary-of-the-month&stations=USW00013967&startDate=2024-05-01&endDate=2024-05-31&format=csv&units=metric&includeStationLocation=1&dataTypes=PRCP%2CTAVG>)"
      ],
      "text/plain": [
       "<IPython.core.display.Markdown object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for item in items:\n",
    "    print(f\"{item.asset.dataset_id}\")\n",
    "    print(f\"Retrieved (UTC): {item.provenance.retrieved_at.isoformat()}\")\n",
    "    print(f\"Bytes: {item.provenance.size}; cache hit: {item.from_cache}\")\n",
    "    print(f\"Checksum: {item.provenance.checksum}\")\n",
    "    display(Markdown(f\"[Source request](<{item.provenance.source_url}>)\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "monthly-analysis-notes",
   "metadata": {},
   "source": [
    "## 3. Summarize the observations\n",
    "\n",
    "Precipitation is the monthly total; temperature is the monthly mean. They have\n",
    "different units and appear on separate axes. A single month at a single station\n",
    "cannot establish a climate trend. Missing measurements remain missing."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "monthly-summary",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "USW00013967 2024-05: precipitation 91.8 mm; mean temperature 21.7 °C\n"
     ]
    }
   ],
   "source": [
    "for _, row in frame.iterrows():\n",
    "    print(\n",
    "        f\"{row['STATION']} {row['DATE']}: precipitation {row['PRCP']:.1f} mm; \"\n",
    "        f\"mean temperature {row['TAVG']:.1f} °C\"\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "monthly-plot",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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HhHRByojIwP9+/dHhQoVsHjxYixevFhaNm7cOPTu3RsA8MUXX+DixYuoW7cuatasiRs3buCHH36At7e3pkInIio2TI6JiD5Q5cqVQ1hYmMplNWvWlNVbs2YN7ty5g3v37qFWrVowMzMrqTCJiErUe5Ecx8TE4OLFi9DT00PTpk1Rq1YtpTo3btzAwYMHYWBgAB8fH1hYWGggUiKi94eWlhZatmypdn0bGxs+MpqIyrxSPef41atX6NGjBzp16oSwsDBs2rQJDRo0wDfffCOrt3jxYtSvXx/btm3DwoULUatWLURFRWkmaCIiIiJ6b5XqkeOwsDBs374d58+fR7169QC8ToQ//fRTTJgwASYmJkhISMCYMWOwYMECfPrppwCATz75BIMHD8bly5c1GT4RERERvWdK9cixru7r3D3nZvQAYGZmhnLlyknvt23bBl1dXdlV1qNGjcJ///2HM2fOlFSoRERERFQGlOqRY29vb4wfPx49e/aEr68vUlNTERISgr/++gsmJiYAgIsXL8Le3l729CYnJydpWaNGjZTa5WNNiYiIiEiVUj1yLISAqakpnjx5ggsXLuDChQvIzMxEhQoVpDopKSmykWXg9U3rdXR0ck16+VhTIiIiIlKlVI8cr127FsHBwbhw4QIcHBwAACEhIfD394erqytq166N8uXLIyUlRbZeamoqsrKyZEn0m6ZOnYqJEydK75OTk5kgExEREVHpHjk+duwYHB0dpcQYADp27IhXr17hxIkTAIDatWvj9u3byMrKkurcuHFDWqYKH2tKRERERKqU6uS4Ro0auHXrFhITE6WykydPAvj/N6jv2rUrkpOTsXPnTqnO6tWrUbVqVTRt2rRkAyYiIiKi91qpnlYRFBSERYsWoWXLlggICEBqaioWL14MPz8/NGvWDADg6OiIyZMnIzAwEJ999hkSExOxfPlyrF27VrrbBRERERGROkp19mhkZITTp09jw4YNuHTpEvT09LBy5Up07txZVm/27Nnw8vJCWFgYLC0tERMTg4YNG2ooaiIiIiJ6X5Xq5Bh4PT944MCB+dbr0KEDOnToUAIREREREVFZVarnHBMRERERlSQmx0RERERECkyOiYiIiIgUmBwTERERESkwOSYiIiIiUmByTERERESkwOSYiIiIiEiByTERERERkQKTYyIiIiIiBSbHREREREQK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+/dly549e4axY8eiXr16aNy4MX766SdkZWVpKFIiorKjYsWKAF73s2969uwZjIyMcl1v6tSpSEpKkl7x8fHFGSYRUZF5b27lNnLkSGhpaSEuLg6vXr2SLevRowdevHiBv/76C0+fPsWQIUPw5MkT/PjjjxqKloiobKhcuTIqVaqE//77T1Z++fJllbd8y6Gvrw99ff3iDo+IqMi9FyPHq1evxqVLlzBz5kylZeHh4Th06BBWrlyJli1bolu3bvjhhx+wYMECJCUlaSBaIqKypXfv3vj777+lKRbXrl3D/v370bt3bw1HRkRU9Er9yPHVq1cxefJkHDp0CLdv31ZaHhERARsbGzg7O0tlHTt2RHp6OqKiotCxY8eSDJeI6L0SGxuLlStXIj09HQCwbNkyREREoG3btujatSsA4Ntvv0WbNm3g7u6OZs2aYffu3ejcuTMCAgI0GToRUbEo1clxRkYG+vbti2+//RaOjo4qk+M7d+6gatWqsrKc93fv3lXZbnp6uvSHAACvoiaiD5a+vr7UZ86ZM0cqf3M+caVKlXDy5Ens3LkTCQkJ6NevH9q1awctLa0Sj5eIqLiV6uT4iy++QPXq1TF8+PBc62RnZ0NXV74bOjo60NbWzvWivODgYMyaNatIYyUieh85Ojri888/z7eegYEBfH19SyAiIiLNKtVzjrdu3YqoqCjY29vD3t4eAwYMAAB4eHjg22+/BfB6ROPJkyey9RITE5GdnY3KlSurbJdXURMRERGRKqV65DgyMlJ2Z4ojR45gwIAB2LhxIxwdHQEA7u7u+OWXX/Dw4UNUqVJFWg8AmjRporJdXkVNRERERKqU6pFjGxsbadTY3t4elpaWUrm5uTkAoGvXrrC2tsaUKVOQkZGBp0+f4rvvvkPXrl1503kiIiIiKpBSnRyro3z58ggNDcWJEydgZmYGS0tLVKlSBcuXL9d0aERERET0ninV0yre1rJlS9y8eRNWVlay8oYNGyI2NhaPHj2Cnp4eTExMNBQhEREREb3P3qvk2MDAAPb29rkuz+0CPCIiIiIidbz30yqIiIiIiIoKk2MiIiIiIgUmx0RERERECkyOiYiIiIgUmBwTERERESkwOSYiIiIiUmByTERERESkwOSYiIiIiEiByTERERERkQKTYyIiIiIiBSbHREREREQKTI6JiIiIiBSYHBMRERERKTA5JiIiIiJSYHJMRERERKTA5JiIiIiISIHJMRERERGRApNjIiIiIiIFJsdERERERApMjomIiIiIFJgcExEREREpMDkmIiIiIlJgckxEREREpMDkmIiIiIhIgckxEREREZECk2MiIiIiIgUmx0RERERECkyOiYiIiIgUmBwTERERESkwOSYiIiIiUmByTERERESkwOSYiIiIiEiByTERERERkQKTYyIiIiIiBV1NB0BERKXb4cOHcfLkSVmZsbExhgwZoqGIiIiKD5NjIiLK07Zt27Bp0yb07NlTKjM3N9dcQERExYjJMRER5atu3bqYP3++psMgIip2pT45vnv3LjZt2oQbN27A1tYWAQEBsLKyUqq3fft2HDhwAAYGBvDz80PTpk01EC0RUdn06NEjLF68GEZGRnB3d0fNmjU1HRIRUbEo1RfkbdiwAW3atMHNmzdRs2ZNREdHo1atWoiOjpbVmzhxIgYPHgwzMzO8fPkSnp6eWLdunYaiJiIqe54+fYqjR49i1apVcHJywjfffJNn/fT0dCQnJ8teRETvg1I9cty0aVNcvHgRenp6AIBx48ahS5cumDFjBvbv3w8AuHz5MubPn48dO3agc+fOAICKFSti3Lhx8PPzg65uqd5FIqJSb8CAAfjxxx+ho6MD4PUc5J49e6JNmzbw8vJSuU5wcDBmzZpVkmESERWJUj1yXKNGDSkxzlGnTh08ePBAer9jxw6YmpqiQ4cOUln//v3x8OFDHDt2rMRiJSIqqxo1aiQlxgDQo0cPODg4YN++fbmuM3XqVCQlJUmv+Pj4kgiViOidvVfDqsnJyVi/fj38/PyksmvXrsHW1lbWcefMhbt27RpatGih1E56ejrS09Nl7RIRkfr09PSQlJSU63J9fX3o6+uXYEREREWjVI8cv+nVq1fw9/dH+fLlZT/VpaWlwcjISFa3fPny0NHRQVpamsq2goODYWJiIr1sbW2LNXYiovfZpUuXZO+PHTuG//77Dy1bttRQRERExee9GDnOyspCQEAALly4gIiICJiamkrLjI2N8fTpU1n9pKQkZGVlwdjYWGV7U6dOxcSJE6X3ycnJTJCJiHIRGBiIGjVqoEGDBrh37x5WrFgBf39/9OnTR9OhEREVuVI/cpyVlYUBAwYgKioK4eHhqFGjhmx5/fr1cfPmTdko8YULF6Rlqujr68PY2Fj2IiIi1aKjoxEQEICMjAzUqFED+/btw5o1a2TT2YiIyopSPXKcnZ2NgQMH4siRI4iIiFB5X80ePXpgwoQJWLp0KUaPHg0A+O233+Ds7AwXF5eSDpmIqMzR1tZG9+7d0b17d02HQkRU7Ep1cjx37lysXbsW7dq1ww8//CCVV6hQAb/++isAoGrVqvjzzz8xYsQI7Ny5E0+fPsX169exa9cuTYVNRERERO+pUp0ct23bFosXL1Yqf/sK6MDAQHh7eyMyMhL6+vpo164dTExMSipMIiIiIiojSnVy3LRpU7UfA21ra4t+/foVc0REREREVJaV+gvyiIiIiIhKCpNjIiIiIiIFJsdERERERApMjomIiIiIFJgcExEREREpMDkmIiIiIlJgckxEREREpMDkmIiIiIhIgckxEREREZECk2MiIiIiIgUmx0RERERECkyOiYiIiIgUmBwTERERESkwOSYiIiIiUmByTERERESkwOSYiIiIiEiByTERERERkQKTYyIiIiIiBSbHREREREQKTI6JiIiIiBSYHBMRERERKTA5JiIiIiJSYHJMRERERKTA5JiIiIiISIHJMRERERGRApNjIiIiIiIFJsdERERERApMjomIiIiIFJgcExEREREpMDkmIiIiIlJgckxEREREpMDkmIiIiIhIgckxEREREZECk2MiIiIiIgUmx0RERERECkyOiYiIiIgUmBwTERERESnoajqAovL06VNER0fDwMAAnp6e0NfX13RIRERlyqlTp5CQkIC6deuiVq1amg6HiKhYlInkePPmzQgMDES9evWQlJSE1NRU7Nq1C/Xr19d0aERE770XL16ge/fuOHfuHOrXr4/jx49j2LBhmDdvnqZDIyIqcu/9tIonT55g0KBBmDFjBqKjo3Hx4kW4ubkhMDBQ06EREZUJ33//Pa5cuYILFy4gLCwMYWFh+O233xAaGqrp0IiIitx7nxxv3boVGRkZGDVqFABAS0sLEydOxKlTp3Dx4kUNR0dE9P5bvXo1PvnkE1SuXBkA4O7ujtatW2P16tUajoyIqOi999Mqzp07h5o1a6JixYpSmYuLi7TM2dlZaZ309HSkp6dL75OSkgAAycnJBdp2VsaLwoRMRB+AgvYnOfWFEMURTqE9ffoUd+7ckfrVHC4uLtizZ0+u6xVVP/siM6tA9Ynow1DQvuTNdfLr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",
      "text/plain": [
       "<Figure size 700x350 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "fig, axes = plt.subplots(1, 2, figsize=(7, 3.5), layout=\"constrained\")\n",
    "for ax, column, title, unit, color in zip(\n",
    "    axes,\n",
    "    [\"PRCP\", \"TAVG\"],\n",
    "    [\"Total precipitation\", \"Mean temperature\"],\n",
    "    [\"mm\", \"°C\"],\n",
    "    [\"#2563a6\", \"#b45631\"],\n",
    "    strict=True,\n",
    "):\n",
    "    bars = ax.bar(frame[\"DATE\"], frame[column], color=color, width=0.5)\n",
    "    ax.bar_label(bars, fmt=\"%.1f\", padding=3)\n",
    "    ax.set(title=title, ylabel=unit)\n",
    "    ax.margins(y=0.2)\n",
    "fig.suptitle(\"Will Rogers World Airport · monthly observations\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "monthly-verify-notes",
   "metadata": {},
   "source": [
    "## 4. Verify and reuse\n",
    "\n",
    "Verification checks the manifest and cached bytes against the lockfile. A repeat\n",
    "pull uses that lockfile and cache. In your own analysis repository, keep both the\n",
    "manifest and lockfile; preserve cached bytes for long-term reproducibility.\n",
    "The SDK checkout ignores generated example lockfiles.\n",
    "\n",
    "To explore another month, edit `dataset.yaml` and deliberately call\n",
    "`pull(manifest, force=True)` to replace the lockfile, then rerun the later cells.\n",
    "Without `force`, editing a locked manifest is reported as an input change."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "monthly-verify",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Verification passed: True\n",
      "Restored from lockfile: True\n",
      "All assets came from cache: True\n"
     ]
    }
   ],
   "source": [
    "drift = verify(manifest)\n",
    "assert not drift, drift\n",
    "again = pull(manifest)\n",
    "print(f\"Verification passed: {not drift}\")\n",
    "print(f\"Restored from lockfile: {again.from_lockfile}\")\n",
    "print(f\"All assets came from cache: {all(value.from_cache for value in again.fetched)}\")"
   ]
  }
 ],
 "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.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
