{ "cells": [ { "cell_type": "markdown", "id": "8004a1df", "metadata": {}, "source": [ "# Databases - Dense series" ] }, { "cell_type": "markdown", "id": "b1f39069", "metadata": {}, "source": [ "This tutorial covers `DenseFieldDB`, a field database for dense and regular series, such as hourly weather stations. It holds the same data as `FieldDB` and answers the same queries, but stores it in a wide layout: one row per station and time, with one column per spec, instead of one row per value.\n", "\n", "The long layout of the other databases keeps a station, a time, a spec, a flag and row bookkeeping next to every single value. That is what lets them hold replicates and irregular times, but for a station network that reports every variable every hour, the labels outweigh the data many times over. Sharing them across a whole row is what makes the wide layout small, and storing each station's rows together is what makes its series fast to read.\n", "\n", "```{seealso}\n", "Check out the {doc}`Databases - Spatial ` tutorial first, which introduces `SitesDB` and setup files.\n", "```" ] }, { "cell_type": "markdown", "id": "75a6a78a", "metadata": {}, "source": [ "## Notebook setup\n", "\n", "For users running this tutorial as a Jupyter Notebook, this cell must be executed first:" ] }, { "cell_type": "code", "execution_count": 1, "id": "be51e395", "metadata": { "execution": { "iopub.execute_input": "2026-11-09T18:16:51.704512Z", "iopub.status.busy": "2026-11-09T18:16:51.704157Z", "iopub.status.idle": "2026-11-09T18:16:52.518898Z", "shell.execute_reply": "2026-11-09T18:16:52.518474Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Outputs will be saved to: ./outputs\\databases\n" ] } ], "source": [ "import sys\n", "import json\n", "import warnings\n", "from pathlib import Path\n", "import numpy as np\n", "import pandas as pd\n", "import geopandas as gpd\n", "\n", "# Install `plans` in `google.colab`.\n", "# Use `pip install plans` for other environments.\n", "\n", "if \"google.colab\" in sys.modules:\n", " import os\n", " os.system(f\"{sys.executable} -m pip install -q plans\")\n", "\n", "from plans.databases import DenseFieldDB, FieldDB, HydrologyDenseDB\n", "from plans.datasets.core import TimeSeries\n", "\n", "# This avoids warnings related to uninstalled fonts\n", "import logging\n", "# Set the matplotlib font manager logger to only show errors (hides warnings)\n", "logging.getLogger('matplotlib.font_manager').setLevel(logging.ERROR)\n", "\n", "# define output folder\n", "OUTPUT_DIR = Path(\"outputs/databases\")\n", "OUTPUT_DIR.mkdir(parents=True, exist_ok=True)\n", "print(f\"Outputs will be saved to: ./{OUTPUT_DIR}\")" ] }, { "cell_type": "markdown", "id": "e3765e92", "metadata": {}, "source": [ "## The data\n", "\n", "Lets make two years of hourly data for six stations: air temperature with a daily and a yearly cycle, relative humidity that drops when it warms up, and rain in rare bursts. Gaps are common in station data, so a few weeks of one sensor go missing. The table is wide already, one row per station and hour, as most station files are:" ] }, { "cell_type": "code", "execution_count": 2, "id": "c3369dd4", "metadata": { "execution": { "iopub.execute_input": "2026-11-09T18:16:52.520588Z", "iopub.status.busy": "2026-11-09T18:16:52.520351Z", "iopub.status.idle": "2026-11-09T18:16:52.564984Z", "shell.execute_reply": "2026-11-09T18:16:52.564537Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "105264 station-hours, 315311 values\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
site_namedatetimeTAS_HOURLYHUR_HOURLYPPT_HOURLY
0S012023-01-01 00:00:0024.00.850.0
1S012023-01-01 01:00:0023.70.800.0
2S012023-01-01 02:00:0022.70.870.0
3S012023-01-01 03:00:0022.00.950.0
4S012023-01-01 04:00:0022.50.920.0
\n", "
" ], "text/plain": [ " site_name datetime TAS_HOURLY HUR_HOURLY PPT_HOURLY\n", "0 S01 2023-01-01 00:00:00 24.0 0.85 0.0\n", "1 S01 2023-01-01 01:00:00 23.7 0.80 0.0\n", "2 S01 2023-01-01 02:00:00 22.7 0.87 0.0\n", "3 S01 2023-01-01 03:00:00 22.0 0.95 0.0\n", "4 S01 2023-01-01 04:00:00 22.5 0.92 0.0" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng = np.random.default_rng(seed=7) # ensure reproducibility\n", "hours = pd.date_range(start=\"2023-01-01\", end=\"2024-12-31 23:00\", freq=\"h\")\n", "day = np.cos(2 * np.pi * (hours.hour - 15) / 24)\n", "year = np.cos(2 * np.pi * (hours.dayofyear - 15) / 365.25)\n", "\n", "stations = gpd.GeoDataFrame(\n", " data={\"name\": [\"S01\", \"S02\", \"S03\", \"S04\", \"S05\", \"S06\"], \"station_title\": [\"Coast\", \"Delta\", \"Valley\", \"Hills\", \"Plateau\", \"Ridge\"]},\n", " geometry=gpd.points_from_xy(x=[-50.2, -50.9, -51.6, -52.3, -53.0, -53.7], y=[-30.1, -29.8, -29.6, -29.3, -29.0, -28.8]),\n", " crs=\"EPSG:4674\",\n", ")\n", "frames = []\n", "for k, station in enumerate(stations[\"name\"]):\n", " tas = 22 - 1.2 * k + 5 * year + 4 * day + rng.normal(scale=1.0, size=len(hours))\n", " hur = np.clip(0.75 - 0.15 * day + rng.normal(scale=0.05, size=len(hours)), 0.05, 1.0)\n", " ppt = np.where(rng.random(len(hours)) < 0.04, rng.gamma(shape=0.8, scale=3, size=len(hours)), 0.0)\n", " frames.append(pd.DataFrame({\"site_name\": station, \"datetime\": hours, \"TAS_HOURLY\": tas.round(1), \"HUR_HOURLY\": hur.round(2), \"PPT_HOURLY\": ppt.round(1)}))\n", "hourly = pd.concat(frames, ignore_index=True)\n", "\n", "# a broken humidity sensor at S03 for three weeks\n", "broken = (hourly[\"site_name\"] == \"S03\") & hourly[\"datetime\"].between(\"2024-06-01\", \"2024-06-21\")\n", "hourly.loc[broken, \"HUR_HOURLY\"] = np.nan\n", "print(f\"{len(hourly)} station-hours, {int(hourly[['TAS_HOURLY', 'HUR_HOURLY', 'PPT_HOURLY']].notna().sum().sum())} values\")\n", "hourly.head()" ] }, { "cell_type": "markdown", "id": "6203fc39", "metadata": {}, "source": [ "## Creating the database\n", "\n", "The setup is the same as for any sites database. Spec names become the column names of `records`, and the specs must all share one timestep, since a wide row is one time step. A `scale` turns values with one decimal into whole numbers, which SQLite stores in fewer bytes:" ] }, { "cell_type": "code", "execution_count": 3, "id": "5915b9ea", "metadata": { "execution": { "iopub.execute_input": "2026-11-09T18:16:52.566602Z", "iopub.status.busy": "2026-11-09T18:16:52.566441Z", "iopub.status.idle": "2026-11-09T18:16:52.612688Z", "shell.execute_reply": "2026-11-09T18:16:52.612134Z" } }, "outputs": [], "source": [ "def make_spec(name, abstract, variable, statistic, scale):\n", " # one hourly spec\n", " return {\n", " \"name\": name,\n", " \"abstract\": abstract,\n", " \"method\": \"synthetic\",\n", " \"timestep\": \"1h\",\n", " \"extent\": \"station\",\n", " \"scale\": scale,\n", " \"offset\": 0,\n", " \"start\": \"2023-01-01\",\n", " \"end\": None,\n", " \"variable_name\": variable,\n", " \"statistic_name\": statistic,\n", " \"source_name\": \"INMET\",\n", " }\n", "\n", "\n", "specs = [\n", " make_spec(\"TAS_HOURLY\", \"Hourly air temperature\", \"surface air temperature\", \"instant\", 10),\n", " make_spec(\"HUR_HOURLY\", \"Hourly relative humidity\", \"surface air relative humidity\", \"instant\", 100),\n", " make_spec(\"PPT_HOURLY\", \"Hourly rainfall\", \"precipitation\", \"sum\", 10),\n", "]\n", "file_specs = OUTPUT_DIR / \"hourly_specs.json\"\n", "_ = file_specs.write_text(json.dumps(specs, indent=2), encoding=\"utf-8\")\n", "file_stations = OUTPUT_DIR / \"hourly_stations.gpkg\"\n", "stations.to_file(filename=file_stations, driver=\"GPKG\")" ] }, { "cell_type": "markdown", "id": "ee610807", "metadata": {}, "source": [ "As a file, the setup reads:\n", "\n", "`````{tab-set}\n", ":sync-group: setup\n", "\n", "````{tab-item} TOML\n", ":sync: toml\n", "\n", "```toml\n", "[database]\n", "path = \"outputs/databases/hourly_dense.gpkg\"\n", "\n", "[specs]\n", "path = \"outputs/databases/hourly_specs.json\"\n", "\n", "[spatial]\n", "file = \"outputs/databases/hourly_stations.gpkg\"\n", "```\n", "````\n", "\n", "````{tab-item} JSON\n", ":sync: json\n", "\n", "```json\n", "{\n", " \"database\": {\"path\": \"outputs/databases/hourly_dense.gpkg\"},\n", " \"specs\": {\"path\": \"outputs/databases/hourly_specs.json\"},\n", " \"spatial\": {\"file\": \"outputs/databases/hourly_stations.gpkg\"}\n", "}\n", "```\n", "````\n", "`````\n", "\n", "Here it is passed as a dict. The `records` table comes out with one column per spec, and a `record_flags` table next to it:" ] }, { "cell_type": "code", "execution_count": 4, "id": "cc288bfb", "metadata": { "execution": { "iopub.execute_input": "2026-11-09T18:16:52.614391Z", "iopub.status.busy": "2026-11-09T18:16:52.614173Z", "iopub.status.idle": "2026-11-09T18:16:52.697483Z", "shell.execute_reply": "2026-11-09T18:16:52.696990Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[Hourly]\n", " records (0 rows)\n", " site_id INTEGER\n", " datetime INTEGER\n", " tas_hourly REAL\n", " hur_hourly REAL\n", " ppt_hourly REAL\n", "\n" ] } ], "source": [ "config = {\n", " \"database\": {\"path\": str(OUTPUT_DIR / \"hourly_dense.gpkg\")},\n", " \"specs\": {\"path\": str(file_specs)},\n", " \"spatial\": {\"file\": str(file_stations), \"columns_map\": {\"station_title\": \"station_title\"}},\n", "}\n", "db = DenseFieldDB(name=\"Hourly\")\n", "db.new(config=config, overwrite=True)\n", "print(db.inspect_schema(table=\"records\", quiet=True))" ] }, { "cell_type": "markdown", "id": "787e5efc", "metadata": {}, "source": [ "## Loading\n", "\n", "The `.insert_wide()` method takes the wide table as it is: `datetime`, the station by `site_name` or `site_id`, and one column per spec, named after it. It is the fast path for bulk loads. Empty cells store nothing, so the broken sensor leaves no trace but the gap. Values outside the domain of their variable become `suspect`, as everywhere in `plans`:" ] }, { "cell_type": "code", "execution_count": 5, "id": "4c59e729", "metadata": { "execution": { "iopub.execute_input": "2026-11-09T18:16:52.699321Z", "iopub.status.busy": "2026-11-09T18:16:52.699139Z", "iopub.status.idle": "2026-11-09T18:16:52.957681Z", "shell.execute_reply": "2026-11-09T18:16:52.957273Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
rows
0105264
\n", "
" ], "text/plain": [ " rows\n", "0 105264" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "db.insert_wide(dataframe=hourly)\n", "db.query_sql(sql=\"SELECT COUNT(*) AS rows FROM records\")" ] }, { "cell_type": "markdown", "id": "ca861f86", "metadata": {}, "source": [ "Only flags other than `regular` take space, as rows of `record_flags`. A value is `regular` unless that table says otherwise, so this clean load added none. One spec at a time still goes through `.insert_records()`, as in the long databases. Here, two readings come late from a manual check at `S01`, one of them a humidity above 100%:" ] }, { "cell_type": "code", "execution_count": 6, "id": "19447377", "metadata": { "execution": { "iopub.execute_input": "2026-11-09T18:16:52.959255Z", "iopub.status.busy": "2026-11-09T18:16:52.959093Z", "iopub.status.idle": "2026-11-09T18:16:52.975607Z", "shell.execute_reply": "2026-11-09T18:16:52.975163Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 value(s) of HUR_HOURLY outside [0U1] flagged suspect\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
spec_idsite_iddatetimeflag_value
02117356932002
\n", "
" ], "text/plain": [ " spec_id site_id datetime flag_value\n", "0 2 1 1735693200 2" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "late = pd.DataFrame({\"site_name\": \"S01\", \"datetime\": [\"2025-01-01 00:00\", \"2025-01-01 01:00\"], \"value\": [0.82, 1.04]})\n", "with warnings.catch_warnings(record=True) as caught:\n", " warnings.simplefilter(\"always\")\n", " db.insert_records(dataframe=late, spec_name=\"HUR_HOURLY\", flag=1)\n", "print(*[w.message for w in caught], sep=\"\\n\")\n", "db.query_sql(sql=\"SELECT * FROM record_flags\")" ] }, { "cell_type": "markdown", "id": "2c17a7db", "metadata": {}, "source": [ "A replicate has nowhere to go in a wide row, so a second value for the same spec, station and time is refused, and the first one stays:" ] }, { "cell_type": "code", "execution_count": 7, "id": "5b4deb52", "metadata": { "execution": { "iopub.execute_input": "2026-11-09T18:16:52.977203Z", "iopub.status.busy": "2026-11-09T18:16:52.977048Z", "iopub.status.idle": "2026-11-09T18:16:52.985521Z", "shell.execute_reply": "2026-11-09T18:16:52.985062Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 replicated value(s) in hur_hourly; a value already exists for that site and time\n" ] } ], "source": [ "try:\n", " db.insert_records(dataframe=late.head(1).assign(value=0.5), spec_name=\"HUR_HOURLY\", flag=1)\n", "except ValueError as error:\n", " print(error)" ] }, { "cell_type": "markdown", "id": "079a0583", "metadata": {}, "source": [ "## Querying\n", "\n", "`.query_records()` takes the same keys and returns the same long table as in `FieldDB`, so code written for one works on the other. Rows are stored by station and then time, so a station's series is read straight from its block:" ] }, { "cell_type": "code", "execution_count": 8, "id": "10d918b0", "metadata": { "execution": { "iopub.execute_input": "2026-11-09T18:16:52.986989Z", "iopub.status.busy": "2026-11-09T18:16:52.986827Z", "iopub.status.idle": "2026-11-09T18:16:52.998926Z", "shell.execute_reply": "2026-11-09T18:16:52.998528Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
datetimespec_namevalueflag_valuesite_id
02024-05-31 22:00:00+00:00HUR_HOURLY0.7313
12024-05-31 23:00:00+00:00HUR_HOURLY0.8613
22024-06-21 01:00:00+00:00HUR_HOURLY0.9413
32024-06-21 02:00:00+00:00HUR_HOURLY0.8813
\n", "
" ], "text/plain": [ " datetime spec_name value flag_value site_id\n", "0 2024-05-31 22:00:00+00:00 HUR_HOURLY 0.73 1 3\n", "1 2024-05-31 23:00:00+00:00 HUR_HOURLY 0.86 1 3\n", "2 2024-06-21 01:00:00+00:00 HUR_HOURLY 0.94 1 3\n", "3 2024-06-21 02:00:00+00:00 HUR_HOURLY 0.88 1 3" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = db.query_records(query_dict={\"site_name\": \"S03\", \"spec_name\": \"HUR_HOURLY\", \"start\": \"2024-05-31 22:00\", \"end\": \"2024-06-21 02:00\"})\n", "df[[\"datetime\", \"spec_name\", \"value\", \"flag_value\", \"site_id\"]]" ] }, { "cell_type": "markdown", "id": "acd95409", "metadata": {}, "source": [ "Flags filter as usual, and `wide=True` returns one column per spec:" ] }, { "cell_type": "code", "execution_count": 9, "id": "424e1902", "metadata": { "execution": { "iopub.execute_input": "2026-11-09T18:16:53.000597Z", "iopub.status.busy": "2026-11-09T18:16:53.000425Z", "iopub.status.idle": "2026-11-09T18:16:53.472409Z", "shell.execute_reply": "2026-11-09T18:16:53.471911Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " datetime spec_name value flag_value\n", "0 2025-01-01 01:00:00+00:00 HUR_HOURLY 1.04 2\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
spec_nameTAS_HOURLYHUR_HOURLYPPT_HOURLY
site_id111
datetime
2024-07-01 00:00:00+00:0014.00.820.0
2024-07-01 01:00:00+00:0013.20.980.0
2024-07-01 02:00:00+00:0012.50.750.0
2024-07-01 03:00:00+00:0013.40.930.0
\n", "
" ], "text/plain": [ "spec_name TAS_HOURLY HUR_HOURLY PPT_HOURLY\n", "site_id 1 1 1\n", "datetime \n", "2024-07-01 00:00:00+00:00 14.0 0.82 0.0\n", "2024-07-01 01:00:00+00:00 13.2 0.98 0.0\n", "2024-07-01 02:00:00+00:00 12.5 0.75 0.0\n", "2024-07-01 03:00:00+00:00 13.4 0.93 0.0" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(db.query_records(query_dict={\"flag_value\": 2})[[\"datetime\", \"spec_name\", \"value\", \"flag_value\"]])\n", "db.query_records(query_dict={\"site_name\": \"S01\", \"start\": \"2024-07-01\", \"end\": \"2024-07-01 03:00\", \"wide\": True})" ] }, { "cell_type": "markdown", "id": "f130795f", "metadata": {}, "source": [ "A query returns a plain `DataFrame`, ready for the analysis classes of `plans`. `TimeSeries` takes timestamps without a time zone, while database times are UTC, so the zone is dropped first:" ] }, { "cell_type": "code", "execution_count": 10, "id": "9ce3956e", "metadata": { "execution": { "iopub.execute_input": "2026-11-09T18:16:53.474606Z", "iopub.status.busy": "2026-11-09T18:16:53.474328Z", "iopub.status.idle": "2026-11-09T18:16:53.936544Z", "shell.execute_reply": "2026-11-09T18:16:53.935961Z" } }, "outputs": [ { "data": { "image/png": "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9zh+8b5qmbb1XC2XvfcA0wmQ1R7TKHBsp06dWn3e6dOnVyNI9POkbb03+IxQxkWLFqmRJdrcfxwv6DXG94ezMoTkddiCMuD9wYgNTCexl6AQw8aRxbxcuXLBbsOxi1EvyPVw9OhR1WOfN29elSsC5wFyHCDngwajeKw/Y/3c+71798r333/vtOxERN4iAiJvowtBREThDwHjN998oy7kn/gZW0Kg9sMPP6jM8Rg2T65BtnE09iAHAIJ3I2F6BQL8ixcvutTQQ0TkDTinm4iIiIjswjrmGF1kb1m58ILRPEjq1717dwbcRORTGHQTERERkUODBw9W0xqQyM0o48aNU//269fPsDIQEYUGg24iogDVs2fPMM8LJu/Gz1hcmhNOziHfBnIZYE64UTAHfubMmcGW5iMi8nac001ERERERETkIezpJiIiIiIiIvIQBt1EREREREREHsKgm4iIiIiIiMhDGHQTEREREREReQiDbiIiIiIiIiIPYdBNRERERERE5CEMuomIiIiIiIg8hEE3ERERERERkYcw6CYiIiIiIiLyEAbdRERERERERB4SWQLA2bNnZcmSJQ7vExQUJCVLlpS///5bWrduLYkSJZLw9ubNG9m6daucOHFCIkWKJFmyZJHixYtL5Mhh/5iuXbtm6GsjIiIi90P95uHDh9KqVatgt924cUNmz54tdevWlfTp06tt48aNk9y5c0uxYsVcfo7r169LihQp3FpuovBiMplk+/btcvLkSYkSJYrkypVL8uXLF6wOPmLECPP1CBEiqPsmSZJEypUrp/619ueff8rLly9tPifOl6ZNm3rg1ZCvCoig+99//5ULFy6YryOw3bt3r3z00UfmbREjRpQXL16o+7169Srcy3j8+HGpX7++Kgd+CPEF8euvv8rbt2/lr7/+ksKFC4dp/0a+NiIiIvKMCRMmyJkzZ2wG3fjd//jjjyVTpkzmoPvy5cuSOnVql/c/aNAgWbFihaxdu9at5SYKD5s3b5b27durDix0ZKE+3KNHDylQoICqX2vBNOrHOFdwnyJFiqhtz549k9OnT6tz64cffpAvv/zSYt9ffPGFZM6cWcqWLWvIayPfEhBBN1p0hw0bZr6Ok2b//v0W2zS2toUHtIah5W3OnDmqdQ0QcNerV08aNGgg586dUy1uoYUfW6NeGxEREXmHH3/8MUT337Nn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55xzTmQCyy1Nz95PpjGP3wmeKUEudV022yNwpqR98eLFUfJMeXgp2ySoJrg+6aSTqjzPmvIPPvggnX322RFw8d661imvrerqBF9TaXke1QLz58+v9v1gTTcBdLkBN5UVBN15HTp0SAsXLoxrRbUFNwKovChnf8XHWco2VZ2ZbkmSJGkNockVzdQIlhi5RaaUgIYsdn2yNd0DBgyItdT1Icuaz4xffvnl0bmcAK2+bdIcbcGCBRFwU0aMbG062fsHH3wwypCfeeaZCLqa2tiwutBAjbXVO++8c5XnKcm+7777omSfGxV777136tq162qt6Z4+fXp6/fXXIwjORpX17t079erVK67PkUcemf7617/G82TBd9xxx3r3V9dxlrJNVWfQLUmSJDUSgmcajxUHv1lQ/fDDD0epLh555JH498wzz4zAm27lWeaUTPfWW29dZTsNWdOdR9fp4sxsbdt877334sYA63kzF1xwQfw9peas4Z4wYUI00qJ8vSkh05/N6a4JJdms2c83nwM3O1g+wLVlZnu+CVpD13SzzeKgN38DhLX4XC+2WdP3pqb91Xec9W1T1TX7llsYkiRJkiSp0bmmW5IkSZKkCjHoliRJkiSpQgy6JUmSJEmqEBupSZIkSY2EzuT/+c9/ogkaTcton8TIJZpr8fO/QAdqOqXT9Ky48RVjxeh8TcOsco6P86JL9yeffBIzv5krnqEB2zvvvBPbWxtnONPxnc7u2bxuGuflm5cxho1GdDRS4zOnIVkenzefEQ3samqmVi6uBftjPFxxE79sfxzTlltuWdL2mOVOl/3iZoD5bTf2OaztDLolSZKkRkIwwmiuww47LB1xxBFp3rx58fvhhx+e+vTps8aPZ8qUKWnixIkRABN4/+IXv0jdunWL11544YX0z3/+MzqnL1u2LLpWF8/krgmB+hVXXJFWrFgRQSWzm7Ogm2CNzt7NmzdPy5cvT6ecckphf2uLlStXpssuuyy1adMmAk/O+YwzzoiO31988UV0LudfgmE+n9/+9reFTua33XZbeu655yJIJ5D94x//WK3LeTkIkK+55pq4EcANHwLrgQMHpnXWWSeu04033hjXgZna3Bz5wx/+UO94tzfffDM9/vjjhd8J6OlYfuihh1bkHJoCPx1JkiSpEbVo0SKCbTz//PNVRjoR3BIEZVlQ5h5nmLfcsmXL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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df = db.query_records(query_dict={\"site_name\": \"S05\", \"spec_name\": \"TAS_HOURLY\"})\n", "df[\"datetime\"] = df[\"datetime\"].dt.tz_localize(None)\n", "\n", "ts = TimeSeries(name=\"S05 Plateau\", alias=\"S05\")\n", "ts.varname = \"Air temperature\"\n", "ts.units = \"degC\"\n", "ts.set_data(input_df=df, input_dtfield=\"datetime\", input_varfield=\"value\")\n", "ts.view_specs[\"ylabel\"] = f\"Air temperature ({ts.units})\"\n", "ts.view()" ] }, { "cell_type": "markdown", "id": "119becb3", "metadata": {}, "source": [ "## Catchments: `HydrologyDenseDB`\n", "\n", "For river gauges with their catchments, `HydrologyDenseDB` joins this layout with `HydrologyDB`: the setup takes the optional `catchments` section, and the catchment methods work as in the {doc}`Databases - Hydrology ` tutorial. Lets say three of the stations are also gauges, with drawn catchments, and hold daily streamflow and rain next to a monthly rain product from another source. Specs may mix timesteps:" ] }, { "cell_type": "code", "execution_count": 11, "id": "b1f08f90", "metadata": { "execution": { "iopub.execute_input": "2026-11-09T18:16:53.938389Z", "iopub.status.busy": "2026-11-09T18:16:53.938221Z", "iopub.status.idle": "2026-11-09T18:16:54.084360Z", "shell.execute_reply": "2026-11-09T18:16:54.083914Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Missing catchments: ['S04', 'S05', 'S06']\n", "[Gauges]\n", " records (0 rows)\n", " site_id INTEGER\n", " datetime INTEGER\n", " q_daily REAL\n", " ppt_daily REAL\n", " ppt_monthly_chirps REAL\n", "\n" ] } ], "source": [ "gauge_specs = [\n", " dict(make_spec(\"Q_DAILY\", \"Daily mean streamflow\", \"streamflow\", \"mean\", 100), timestep=\"1D\"),\n", " dict(make_spec(\"PPT_DAILY\", \"Daily rainfall\", \"precipitation\", \"sum\", 10), timestep=\"1D\"),\n", " dict(make_spec(\"PPT_MONTHLY_CHIRPS\", \"Monthly rainfall from CHIRPS\", \"precipitation\", \"sum\", 10), timestep=\"1M\", source_name=\"CHIRPS v2.0\"),\n", "]\n", "file_gauge_specs = OUTPUT_DIR / \"gauges_specs.json\"\n", "_ = file_gauge_specs.write_text(json.dumps(gauge_specs, indent=2), encoding=\"utf-8\")\n", "\n", "catchments = gpd.GeoDataFrame(\n", " data={\"name\": [\"S01\", \"S02\", \"S03\"], \"area_km2\": [420.0, 260.0, 130.0]},\n", " geometry=[point.buffer(0.15) for point in stations.geometry[:3]],\n", " crs=\"EPSG:4674\",\n", ")\n", "file_catchments = OUTPUT_DIR / \"gauges_catchments.gpkg\"\n", "catchments.to_file(filename=file_catchments, driver=\"GPKG\")\n", "\n", "hdb = HydrologyDenseDB(name=\"Gauges\")\n", "hdb.new(\n", " config={\n", " \"database\": {\"path\": str(OUTPUT_DIR / \"gauges_dense.gpkg\")},\n", " \"specs\": {\"path\": str(file_gauge_specs)},\n", " \"spatial\": {\"file\": str(file_stations), \"columns_map\": {\"station_title\": \"station_title\"}},\n", " \"catchments\": {\"file\": str(file_catchments), \"columns_map\": {\"area_km2\": \"area_km2\"}},\n", " },\n", " overwrite=True,\n", ")\n", "print(\"Missing catchments:\", hdb.missing_catchments())\n", "print(hdb.inspect_schema(table=\"records\", quiet=True))" ] }, { "cell_type": "markdown", "id": "d2f0827d", "metadata": {}, "source": [ "Each spec loads on its own, in any order. The daily series go in bulk with `.insert_wide()`. The monthly product arrives later and goes in with `.insert_records()`, stamped on the first day of each month at 00:00, so it fills a cell of the daily rows instead of adding rows of its own:" ] }, { "cell_type": "code", "execution_count": 12, "id": "6fd75d05", "metadata": { "execution": { "iopub.execute_input": "2026-11-09T18:16:54.086071Z", "iopub.status.busy": "2026-11-09T18:16:54.085803Z", "iopub.status.idle": "2026-11-09T18:16:54.145849Z", "shell.execute_reply": "2026-11-09T18:16:54.145447Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
spec_nameQ_DAILYPPT_DAILYPPT_MONTHLY_CHIRPS
site_id222
datetime
2024-01-30 00:00:00+00:002.805.1NaN
2024-01-31 00:00:00+00:002.510.5NaN
2024-02-01 00:00:00+00:003.256.778.6
2024-02-02 00:00:00+00:003.443.9NaN
\n", "
" ], "text/plain": [ "spec_name Q_DAILY PPT_DAILY PPT_MONTHLY_CHIRPS\n", "site_id 2 2 2\n", "datetime \n", "2024-01-30 00:00:00+00:00 2.80 5.1 NaN\n", "2024-01-31 00:00:00+00:00 2.51 0.5 NaN\n", "2024-02-01 00:00:00+00:00 3.25 6.7 78.6\n", "2024-02-02 00:00:00+00:00 3.44 3.9 NaN" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gauges = hourly[hourly[\"site_name\"].isin([\"S01\", \"S02\", \"S03\"])]\n", "daily = gauges.groupby([\"site_name\", gauges[\"datetime\"].dt.floor(\"D\")])[\"PPT_HOURLY\"].sum().reset_index(name=\"PPT_DAILY\")\n", "area = catchments.set_index(\"name\")[\"area_km2\"]\n", "# streamflow: rain over the catchment, released over about two weeks\n", "daily[\"Q_DAILY\"] = (\n", " daily.groupby(\"site_name\")[\"PPT_DAILY\"].transform(lambda p: p.ewm(span=14).mean())\n", " * daily[\"site_name\"].map(area) * 1e3 * 0.4 / 86400\n", ").round(2)\n", "hdb.insert_wide(dataframe=daily)\n", "\n", "monthly = daily.groupby([\"site_name\", daily[\"datetime\"].dt.to_period(\"M\").dt.start_time])[\"PPT_DAILY\"].sum() * 1.05\n", "monthly = monthly.round(1).reset_index().rename(columns={\"PPT_DAILY\": \"value\"})\n", "hdb.insert_records(dataframe=monthly, spec_name=\"PPT_MONTHLY_CHIRPS\", flag=1)\n", "hdb.query_records(query_dict={\"site_name\": \"S02\", \"start\": \"2024-01-30\", \"end\": \"2024-02-02\", \"wide\": True})" ] }, { "cell_type": "markdown", "id": "4ee0043b", "metadata": {}, "source": [ "The monthly column is empty on all but one row a month. Each empty cell costs about one byte, so a few monthly or yearly specs next to daily ones cost little, while a database made mostly of them is better kept in the long layout." ] }, { "cell_type": "code", "execution_count": 13, "id": "67ed9ce3", "metadata": { "execution": { "iopub.execute_input": "2026-11-09T18:16:54.147406Z", "iopub.status.busy": "2026-11-09T18:16:54.147251Z", "iopub.status.idle": "2026-11-09T18:16:54.149739Z", "shell.execute_reply": "2026-11-09T18:16:54.149323Z" } }, "outputs": [], "source": [ "hdb.close()" ] }, { "cell_type": "markdown", "id": "ec2fcdbb", "metadata": {}, "source": [ "## How much smaller\n", "\n", "Lets load the same table into a `FieldDB`, one spec at a time, and compare the two files after compacting them:" ] }, { "cell_type": "code", "execution_count": 14, "id": "e662c2b1", "metadata": { "execution": { "iopub.execute_input": "2026-11-09T18:16:54.151070Z", "iopub.status.busy": "2026-11-09T18:16:54.150918Z", "iopub.status.idle": "2026-11-09T18:16:56.000132Z", "shell.execute_reply": "2026-11-09T18:16:55.999648Z" } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
MBbytes per value
FieldDB (long)21.9369.55
DenseFieldDB (wide)2.046.47
\n", "
" ], "text/plain": [ " MB bytes per value\n", "FieldDB (long) 21.93 69.55\n", "DenseFieldDB (wide) 2.04 6.47" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "long_config = dict(config, database={\"path\": str(OUTPUT_DIR / \"hourly_long.gpkg\")})\n", "long_db = FieldDB(name=\"Hourly long\")\n", "long_db.new(config=long_config, overwrite=True)\n", "with long_db.transaction():\n", " for spec in [\"TAS_HOURLY\", \"HUR_HOURLY\", \"PPT_HOURLY\"]:\n", " part = hourly[[\"site_name\", \"datetime\", spec]].rename(columns={spec: \"value\"})\n", " long_db.insert_records(dataframe=part, spec_name=spec, flag=1)\n", "\n", "sizes = {}\n", "for label, base in [(\"FieldDB (long)\", long_db), (\"DenseFieldDB (wide)\", db)]:\n", " base.execute_sql(sql=\"VACUUM\")\n", " sizes[label] = Path(base.file_db).stat().st_size / 1e6\n", "values = long_db.query_sql(sql=\"SELECT COUNT(*) AS n FROM records\")[\"n\"].iloc[0]\n", "pd.DataFrame({\"MB\": sizes, \"bytes per value\": {k: v * 1e6 / values for k, v in sizes.items()}}).round(2)" ] }, { "cell_type": "markdown", "id": "e1eb6398", "metadata": {}, "source": [ "Much of the long file goes to its three indexes on `records`, and the rest to the labels repeated on every value. At this size, both answer queries quickly; the gap in speed grows with the file. On a real network of 600 hourly stations over 26 years, the wide layout took 3.9 GB against 33 GB for the long layout without any indexes, and read a station in a fraction of a second instead of over a minute.\n", "\n", "## Limits\n", "\n", "The wide layout pays for its size with the flexibility of the long one:\n", "\n", "- specs may mix timesteps, but a coarse value leaves empty cells on the rows between two values, about one byte each: a few yearly or monthly specs next to daily ones cost little, while many of them, or monthly next to hourly, are better kept in a separate database;\n", "- there are no replicates, so it does not suit lab results or repeated readings;\n", "- specs cannot be added after creation yet;\n", "- `records` is a `WITHOUT ROWID` table, which GDAL cannot open: QGIS shows the stations and the catalogs, but reads records only through SQL;\n", "- one variable over all stations and times reads the whole table, and is built in memory as a long table, so large files are best queried by station or time.\n", "\n", "Each spec loads on its own, in any order: `.insert_records()` fills its column on existing rows and adds rows where none exist. For sparse or irregular data, or anything with replicates, the long `FieldDB` remains the better fit." ] }, { "cell_type": "code", "execution_count": 15, "id": "81d34824", "metadata": { "execution": { "iopub.execute_input": "2026-11-09T18:16:56.001616Z", "iopub.status.busy": "2026-11-09T18:16:56.001454Z", "iopub.status.idle": "2026-11-09T18:16:56.004925Z", "shell.execute_reply": "2026-11-09T18:16:56.004437Z" } }, "outputs": [], "source": [ "long_db.close()\n", "db.close()" ] } ], "metadata": { "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.5" } }, "nbformat": 4, "nbformat_minor": 5 }