{ "cells": [ { "cell_type": "markdown", "id": "7cbf479179b1", "metadata": {}, "source": "# TimeDB Quickstart\n\nTimeDB is a thin ClickHouse client for **3-dimensional** time series. Every value carries a `valid_time` (the wall-clock timestamp it describes) and a `knowledge_time` (when the value was learned). That makes it trivial to store forecast revisions, audit corrections, and reconstruct what was known at any past instant.\n\nThis quickstart walks through the full 3-dimensional model:\n1. Setup\n2. Insert a forecast and read it back\n3. Insert a revised forecast — see the latest value win\n4. Read the full version history\n5. Visualize how forecast revisions evolved\n6. Correct an erroneous value (immutable storage; corrections are new rows)\n7. Audit the correction trail" }, { "cell_type": "markdown", "id": "a18121895700", "metadata": {}, "source": [ "## 1. Setup\n", "\n", "`TimeDBClient` reads connection settings from `TIMEDB_CH_URL`. Series identity is supplied externally — TimeDB itself stores no metadata, only events keyed by `series_id`." ] }, { "cell_type": "code", "execution_count": 1, "id": "64983fe6c944", "metadata": { "execution": { "iopub.execute_input": "2026-04-28T09:10:49.386357Z", "iopub.status.busy": "2026-04-28T09:10:49.385785Z", "iopub.status.idle": "2026-04-28T09:10:49.396494Z", "shell.execute_reply": "2026-04-28T09:10:49.394799Z" } }, "outputs": [], "source": [ "try:\n", " import urllib.request\n", " import google.colab # noqa: F401\n", "\n", " urllib.request.urlretrieve(\n", " \"https://raw.githubusercontent.com/rebase-energy/timedb/main/examples/colab_setup.py\", \"/tmp/colab_setup.py\"\n", " )\n", " exec(open(\"/tmp/colab_setup.py\").read())\n", "except ImportError:\n", " pass" ] }, { "cell_type": "code", "execution_count": 2, "id": "caacfda30ddc", "metadata": { "execution": { "iopub.execute_input": "2026-04-28T09:10:49.398950Z", "iopub.status.busy": "2026-04-28T09:10:49.398718Z", "iopub.status.idle": "2026-04-28T09:10:50.317486Z", "shell.execute_reply": "2026-04-28T09:10:50.312660Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "schema ready\n" ] } ], "source": [ "from datetime import UTC, datetime, timedelta\n", "\n", "import polars as pl\n", "from timedb import TimeDBClient\n", "\n", "td = TimeDBClient()\n", "td.delete()\n", "td.create()\n", "print(\"schema ready\")\n", "\n", "# Series identity is owned upstream (e.g. by energydb). For this demo we just\n", "# pick an integer.\n", "SERIES_ID = 1\n", "base_vt = datetime(2026, 1, 1, tzinfo=UTC)" ] }, { "cell_type": "markdown", "id": "5e1151fadb88", "metadata": {}, "source": [ "## 2. Insert a forecast\n", "\n", "The dataframe needs `series_id`, `valid_time`, and `value`. `retention` (`short` / `medium` / `long`) chooses the TTL tier and `knowledge_time` stamps when the forecast was issued." ] }, { "cell_type": "code", "execution_count": 3, "id": "be5bfa33c325", "metadata": { "execution": { "iopub.execute_input": "2026-04-28T09:10:50.320339Z", "iopub.status.busy": "2026-04-28T09:10:50.319960Z", "iopub.status.idle": "2026-04-28T09:10:50.382409Z", "shell.execute_reply": "2026-04-28T09:10:50.380683Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "wrote 24 rows knowledge_time=2025-12-31 12:00:00+00:00\n" ] } ], "source": [ "def make_forecast(kt: datetime, bias: float, n: int = 24) -> pl.DataFrame:\n", " return pl.DataFrame(\n", " {\n", " \"series_id\": [SERIES_ID] * n,\n", " \"valid_time\": [base_vt + timedelta(hours=i) for i in range(n)],\n", " \"value\": [50.0 + bias + 0.5 * i for i in range(n)],\n", " }\n", " )\n", "\n", "\n", "kt_run1 = base_vt - timedelta(hours=12)\n", "df_run1 = make_forecast(kt_run1, bias=0.0)\n", "\n", "td.write(df_run1, retention=\"medium\", knowledge_time=kt_run1)\n", "print(f\"wrote {df_run1.height} rows knowledge_time={kt_run1}\")" ] }, { "cell_type": "markdown", "id": "cd87636139b8", "metadata": {}, "source": [ "## 3. Insert a revised forecast\n", "\n", "Six hours later the producer issues a corrected forecast for the same `valid_time` window. TimeDB doesn't overwrite anything — both runs are kept." ] }, { "cell_type": "code", "execution_count": 4, "id": "6fcea9a0b7fc", "metadata": { "execution": { "iopub.execute_input": "2026-04-28T09:10:50.385542Z", "iopub.status.busy": "2026-04-28T09:10:50.385251Z", "iopub.status.idle": "2026-04-28T09:10:50.414154Z", "shell.execute_reply": "2026-04-28T09:10:50.413464Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "wrote 24 rows knowledge_time=2025-12-31 18:00:00+00:00\n" ] } ], "source": [ "kt_run2 = base_vt - timedelta(hours=6)\n", "df_run2 = make_forecast(kt_run2, bias=2.5)\n", "\n", "td.write(df_run2, retention=\"medium\", knowledge_time=kt_run2)\n", "print(f\"wrote {df_run2.height} rows knowledge_time={kt_run2}\")" ] }, { "cell_type": "markdown", "id": "e667581453b5", "metadata": {}, "source": [ "## 4. Read the latest forecast\n", "\n", "`read()` returns one row per `valid_time` — always the most recently issued forecast (highest `knowledge_time`). Run 2 wins for every hour." ] }, { "cell_type": "code", "execution_count": 5, "id": "964321b58e60", "metadata": { "execution": { "iopub.execute_input": "2026-04-28T09:10:50.417593Z", "iopub.status.busy": "2026-04-28T09:10:50.417216Z", "iopub.status.idle": "2026-04-28T09:10:50.437248Z", "shell.execute_reply": "2026-04-28T09:10:50.436145Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "24 rows (one per valid_time)\n", "shape: (24, 3)\n", "┌───────────┬─────────────────────────┬───────┐\n", "│ series_id ┆ valid_time ┆ value │\n", "│ --- ┆ --- ┆ --- │\n", "│ u64 ┆ datetime[μs, UTC] ┆ f64 │\n", "╞═══════════╪═════════════════════════╪═══════╡\n", "│ 1 ┆ 2026-01-01 00:00:00 UTC ┆ 52.5 │\n", "│ 1 ┆ 2026-01-01 01:00:00 UTC ┆ 53.0 │\n", "│ 1 ┆ 2026-01-01 02:00:00 UTC ┆ 53.5 │\n", "│ 1 ┆ 2026-01-01 03:00:00 UTC ┆ 54.0 │\n", "│ 1 ┆ 2026-01-01 04:00:00 UTC ┆ 54.5 │\n", "│ … ┆ … ┆ … │\n", "│ 1 ┆ 2026-01-01 19:00:00 UTC ┆ 62.0 │\n", "│ 1 ┆ 2026-01-01 20:00:00 UTC ┆ 62.5 │\n", "│ 1 ┆ 2026-01-01 21:00:00 UTC ┆ 63.0 │\n", "│ 1 ┆ 2026-01-01 22:00:00 UTC ┆ 63.5 │\n", "│ 1 ┆ 2026-01-01 23:00:00 UTC ┆ 64.0 │\n", "└───────────┴─────────────────────────┴───────┘\n" ] } ], "source": [ "latest = td.read(series_ids=[SERIES_ID])\n", "print(f\"{latest.height} rows (one per valid_time)\")\n", "print(latest)" ] }, { "cell_type": "markdown", "id": "874879820f93", "metadata": {}, "source": [ "## 5. Read the full revision history\n", "\n", "`include_knowledge_time=True` returns one row per `(series_id, knowledge_time, valid_time)` — every forecast run side-by-side." ] }, { "cell_type": "code", "execution_count": 6, "id": "20f4b3f6cda5", "metadata": { "execution": { "iopub.execute_input": "2026-04-28T09:10:50.439890Z", "iopub.status.busy": "2026-04-28T09:10:50.439444Z", "iopub.status.idle": "2026-04-28T09:10:50.463257Z", "shell.execute_reply": "2026-04-28T09:10:50.461608Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "48 rows across 2 runs\n", "shape: (48, 4)\n", "┌───────────┬─────────────────────────┬─────────────────────────┬───────┐\n", "│ series_id ┆ knowledge_time ┆ valid_time ┆ value │\n", "│ --- ┆ --- ┆ --- ┆ --- │\n", "│ u64 ┆ datetime[μs, UTC] ┆ datetime[μs, UTC] ┆ f64 │\n", "╞═══════════╪═════════════════════════╪═════════════════════════╪═══════╡\n", "│ 1 ┆ 2025-12-31 12:00:00 UTC ┆ 2026-01-01 00:00:00 UTC ┆ 50.0 │\n", "│ 1 ┆ 2025-12-31 18:00:00 UTC ┆ 2026-01-01 00:00:00 UTC ┆ 52.5 │\n", "│ 1 ┆ 2025-12-31 12:00:00 UTC ┆ 2026-01-01 01:00:00 UTC ┆ 50.5 │\n", "│ 1 ┆ 2025-12-31 18:00:00 UTC ┆ 2026-01-01 01:00:00 UTC ┆ 53.0 │\n", "│ 1 ┆ 2025-12-31 12:00:00 UTC ┆ 2026-01-01 02:00:00 UTC ┆ 51.0 │\n", "│ … ┆ … ┆ … ┆ … │\n", "│ 1 ┆ 2025-12-31 18:00:00 UTC ┆ 2026-01-01 21:00:00 UTC ┆ 63.0 │\n", "│ 1 ┆ 2025-12-31 12:00:00 UTC ┆ 2026-01-01 22:00:00 UTC ┆ 61.0 │\n", "│ 1 ┆ 2025-12-31 18:00:00 UTC ┆ 2026-01-01 22:00:00 UTC ┆ 63.5 │\n", "│ 1 ┆ 2025-12-31 12:00:00 UTC ┆ 2026-01-01 23:00:00 UTC ┆ 61.5 │\n", "│ 1 ┆ 2025-12-31 18:00:00 UTC ┆ 2026-01-01 23:00:00 UTC ┆ 64.0 │\n", "└───────────┴─────────────────────────┴─────────────────────────┴───────┘\n" ] } ], "source": [ "history = td.read(series_ids=[SERIES_ID], include_knowledge_time=True)\n", "print(f\"{history.height} rows across {history['knowledge_time'].n_unique()} runs\")\n", "print(history)" ] }, { "cell_type": "markdown", "id": "9d8cd14c3929", "metadata": {}, "source": "## 6. Visualize the 3-dimensional evolution\n\nEach line is one forecast run; runs issued closer to the valid window converge toward the truth. The thick black line is what `read()` returns — the latest available value per `valid_time`." }, { "cell_type": "code", "execution_count": 7, "id": "fb50d1357300", "metadata": { "execution": { "iopub.execute_input": "2026-04-28T09:10:50.468061Z", "iopub.status.busy": "2026-04-28T09:10:50.466523Z", "iopub.status.idle": "2026-04-28T09:10:51.442531Z", "shell.execute_reply": "2026-04-28T09:10:51.441731Z" } }, "outputs": [ { "data": { "image/png": "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RERERJ0CQxAiIiIiIiIi6hQYghARERERERFRp8AQhIiIiIiIiIg6BYYgRERERERERNQpMAQhIiIiIiIiok7By90VaG02mw3nzp2DWq2GRCJxd3WIiIiIiIiIOg0hBAwGAyIjIyGVur8fhseHIOfOnUN0dLS7q0FERERERETUaf3+++/o0qWLu6vh+SGIWq0GUPeC+/v7u7k2rrHZbCgqKoJGo2kXSRm1DLar52Lbeia2q2diu3omtqvnYtt6JrarZ2qqXfV6PaKjox3fzd3N40MQ+xAYf3//DhWC1NTUwN/fnx8KHoTt6rnYtp6J7eqZ2K6eie3qudi2nont6pku167tZXoKvuOIiIiIiIiIqFNgCEJEREREREREnQJDECIiIiIiIiLqFDx+ThBXWa1W1NbWursaAOrGUtXW1qKmpoZj5DxIR2pXuVze7utIRERERETUXJ0+BBFCID8/H+Xl5e6uioMQAjabDQaDod1MHkNXryO1q1QqRWxsLORyuburQkRERERE1GI6fQhiD0DCwsLg5+fXLr6cCiFgsVjg5eXVLupDLaOjtKvNZsO5c+eQl5eHrl27tuu6EhERERERNUenDkGsVqsjAAkJCXF3dRw6ypdlap6O1K4ajQbnzp2DxWKBt7e3u6tDRERERETUItw+6P/s2bP44x//iJCQEPj6+qJv377YsWNHo8c++uijkEgkWLhwYYs8t30OED8/vxY5H5GnsA+DsVqtbq4JERERERFRy3FrT5CysjKkpKQgPT0dK1euhEajQW5uLoKCghocu2zZMmzduhWRkZEtXo/2/ld5orbGe4KIiIiIqB2qLAEMeYA6AlC2n9EMHYlbQ5DXXnsN0dHRWLx4sWNbbGxsg+POnj2LadOm4ZdffsENN9zQllUkIiIiIiIicquysjJs+Po9ZH33L2RlF+OLRwag511zgbgMd1etw3FrCPLjjz9i/PjxuP3227Fu3TpERUXh8ccfx8MPP+w4xmaz4d5778WsWbPQu3fvy57TZDLBZDI5Huv1esd5bDab07E2mw1CCMdPe2KvT2P1Sk9PR//+/VtsWBC1nUu1a3tivycau2+oIftnCV8rz8J29UxsV8/EdvVcbFvPxHa9vPLycmzYsAFZWVlYl7kWe/btd/oOkXngdyStewMivC/g1z56hDTVru2tnd0aghw/fhwffPABZsyY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+23ceuutDECo1TEEoUatX78e48aNw4oVK7Bz506kp6djwoQJ2L17t+OYr776CjNmzMBLL72EXbt2oX///hg/fjwKCwsBAOfOncO5c+ewYMECHDhwAJ988gl+/vlnPPjggw2eb/HixcjLy3P8XC5YqKqqQvfu3fH3v/8dWq220WPWrVuHqVOnYuvWrVi1ahVqa2txzTXXoLKy8pLnTk9Px9dff42cnBx89913OHbsGP7whz849lutVvj6+mL69OkYO3bsJc9Vn9lsxsSJE/Hoo482ut9oNOLaa69F165dsW3bNmzcuBFqtRrjx49HbW3T/xO5XDsAwNNPP42ffvoJ33zzDdatW4dz587htttuc7nuRERERNS5XRx6BAYGID09HXPnzsW69RtgMpmbLNu3dy9MmzYN3333HYp++x57X0nDO7eG47YR8Qi94TlAyeCD2pDwcBUVFQKAqKioaLCvurpaHDp0SFRXV1/9ExmLhcjbX/ffq2Sz2YTZbBY2m63R/WlpaeLJJ590PF6+fLnw9/cXn3/+uXjppZcEAKefzMzMq66TEEL06tVLzJ071/F46NChYurUqY7HVqtVREZGivnz5zd5jq+//lrI5XJRW1vr2AZALFu27IrrFRMTI956663LHldYWCgAiHXr1jXr/D/88IOQSCTCbDY32Dd58mRx8803u3Qee7t+/PHHIiAgoMH+7du3CwDi9OnTjm379u0TAERubm6T571cO5SXlwtvb2/xzTffOI45fPiwACC2bNnS6Dlb9N7oBKxWq8jLyxNWq9XdVaEWxHb1TGxXz8R29VxsW/eprq4WWVlZYs6cOUKXNlr4+MgbfM9o6qdPr57iiSeeEN9++60oLCxscG6roVAUHcgSVkPDfdRxNXW/Xuo7uTtwTpD6hAAspuaXO74O2PgmYNIDPv7AqBlA97TmncPLB5BImv3US5YswaOPPoolS5bgxhtvhNFoxOHDh6HX67F48WIAcCwZ1bt3b5w6darJc6WmpmLlypWN7rPZbDAYDI5zmc1m7Ny5E7Nnz3YcI5VKMXbsWGzZsqXJ56ioqIC/vz+8vJzfelOnTsVDDz2E7t2749FHH8X9998PyRW8HpdiH4bTnCW0SktL8cUXX2DkyJHw9vZu0fpcLDExESEhIfj3v/+N5557DlarFf/+97/Rs2dPdOvWzXGcRCLB4sWL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u4wrSatXr9aFF16oiIgIZWRkaOHChS0a20qsluvHH3+syy+/XF26dFFkZKT69u2r+fPnt2hsq7FatpJUVVWlBx98UOnp6YqIiFCvXr304osvtmh8q7BirgsWLFB2drYiIyOVlZWlv/zlLy0a20qCLdd77rlHQ4YMUUREhAYNGtTo+dWrV2vChAnq1q2boqOjNWjQIC1atKhFY1uJ1XLds2ePbDZbo6/169e3aHwrsVq2kvT222/r0ksvVWxsrFwul66//nrt2bOnReNbRTDlumnTJk2cOFFpaWmKjIxUdna2fv/73zfYp63fL1bjr1zfeOMNXXHFFXK5XHI6ncrJydHbb7/9g+N+9dVXGj58uBwOh9LS0vS73/2u0T7Lly9X37595XA4NGDAAL355pstmvPpKEF+wKuvvqqZM2cqLy9PX375pS644ALl5ubqwIEDvn2OHz+uq666Sr/5zW9aPG5dXZ3GjRun6upqrV27Vn/+85+1cOFCPfzww759qqqq5HK59NBDD+mCCy5ot3F3796tcePGadSoUdq4caPuvfde3XbbbS36xrQKK+YaHR2tu+66S2vWrFFhYaEeeughPfTQQ3ruuedaPH8rsGK2knTjjTdq1apVeuGFF1RUVKQlS5YoKyurxfMPdlbM9Q9/+INmz56tOXPmaMuWLcrPz9edd96pv//97y2ef7ALtlzr/fKXv9RNN93U5HNr167VwIED9frrr+urr77S9OnTNXXqVP3jH/9o1TGCmRVzrffee++puLjY9zVkyJBWHSPYWTHb3bt3a8KECRo9erQ2btyot99+WwcPHtR1113XqmMEs2DLdcOGDUpKStIrr7yiLVu26MEHH9Ts2bP1zDPPnNW4VuPPXNesWaMrrrhCb775pjZs2KBRo0Zp/PjxKigoaHZct9utK6+8Uunp6dqwYYMef/xxzZkzp8HfMmvXrtXEiRN16623qqCgQNdee62uvfZabd68uXUfjsEZXXLJJebOO+/0Pa6rqzPdu3c3c+fObbTvBx98YCSZw4cP/+C4b775prHb7aakpMS37Q9/+INxOp2mqqqq0f4jRoww//Iv/9Iu4/7bv/2b6d+/f4PX3XTTTSY3N/cHx7cKK+balJ/97GdmypQpPzi+lVgx2//93/81cXFx5tChQz84nlVZMdecnBwza9asBq+bOXOmufzyy39w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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "fig, ax = plt.subplots(figsize=(11, 4))\n", "for kt, run_df in history.sort(\"valid_time\").group_by(\"knowledge_time\", maintain_order=True):\n", " ax.plot(\n", " run_df[\"valid_time\"].to_list(),\n", " run_df[\"value\"].to_list(),\n", " marker=\"o\",\n", " markersize=3,\n", " alpha=0.7,\n", " label=f\"kt={kt[0].strftime('%Y-%m-%d %H:%M')}\",\n", " )\n", "\n", "latest_sorted = latest.sort(\"valid_time\")\n", "ax.plot(\n", " latest_sorted[\"valid_time\"].to_list(),\n", " latest_sorted[\"value\"].to_list(),\n", " color=\"black\",\n", " linewidth=2.5,\n", " label=\"latest (read)\",\n", " zorder=10,\n", ")\n", "\n", "ax.set_xlabel(\"valid_time\")\n", "ax.set_ylabel(\"value\")\n", "ax.set_title(\"Forecast evolution — each run vs. latest read\")\n", "ax.legend(loc=\"upper left\")\n", "ax.grid(True, alpha=0.3)\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "29c00d91ab29", "metadata": {}, "source": [ "## 7. Correct an erroneous value\n", "\n", "ClickHouse is append-only, so corrections are just new rows with a later `knowledge_time`. Suppose hours 10–12 of run 2 had a sensor glitch. We re-write only those three rows with a fresh `knowledge_time` and the corrected values." ] }, { "cell_type": "code", "execution_count": 8, "id": "3314e6d4841b", "metadata": { "execution": { "iopub.execute_input": "2026-04-28T09:10:51.445547Z", "iopub.status.busy": "2026-04-28T09:10:51.445232Z", "iopub.status.idle": "2026-04-28T09:10:51.475221Z", "shell.execute_reply": "2026-04-28T09:10:51.473733Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "correction issued at kt=2026-01-01 00:00:00+00:00 (3 rows)\n" ] } ], "source": [ "correction_kt = base_vt\n", "hours_to_fix = [10, 11, 12]\n", "\n", "correction = pl.DataFrame(\n", " {\n", " \"series_id\": [SERIES_ID] * len(hours_to_fix),\n", " \"valid_time\": [base_vt + timedelta(hours=h) for h in hours_to_fix],\n", " # Replace the buggy values with something sensible\n", " \"value\": [60.0, 61.0, 62.0],\n", " }\n", ")\n", "td.write(correction, retention=\"medium\", knowledge_time=correction_kt)\n", "print(f\"correction issued at kt={correction_kt} ({correction.height} rows)\")" ] }, { "cell_type": "markdown", "id": "6a12c5c4aa76", "metadata": {}, "source": [ "## 8. Verify the correction won — and audit the trail\n", "\n", "`read()` shows the corrected values at hours 10–12. The full history still preserves every prior version." ] }, { "cell_type": "code", "execution_count": 9, "id": "395b827139ea", "metadata": { "execution": { "iopub.execute_input": "2026-04-28T09:10:51.478767Z", "iopub.status.busy": "2026-04-28T09:10:51.478513Z", "iopub.status.idle": "2026-04-28T09:10:51.501713Z", "shell.execute_reply": "2026-04-28T09:10:51.500826Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Latest values around the corrected window:\n", "shape: (5, 3)\n", "┌───────────┬─────────────────────────┬───────┐\n", "│ series_id ┆ valid_time ┆ value │\n", "│ --- ┆ --- ┆ --- │\n", "│ u64 ┆ datetime[μs, UTC] ┆ f64 │\n", "╞═══════════╪═════════════════════════╪═══════╡\n", "│ 1 ┆ 2026-01-01 09:00:00 UTC ┆ 57.0 │\n", "│ 1 ┆ 2026-01-01 10:00:00 UTC ┆ 60.0 │\n", "│ 1 ┆ 2026-01-01 11:00:00 UTC ┆ 61.0 │\n", "│ 1 ┆ 2026-01-01 12:00:00 UTC ┆ 62.0 │\n", "│ 1 ┆ 2026-01-01 13:00:00 UTC ┆ 59.0 │\n", "└───────────┴─────────────────────────┴───────┘\n" ] } ], "source": [ "latest = td.read(series_ids=[SERIES_ID]).sort(\"valid_time\")\n", "window = latest.filter(pl.col(\"valid_time\").is_between(base_vt + timedelta(hours=9), base_vt + timedelta(hours=13)))\n", "print(\"Latest values around the corrected window:\")\n", "print(window)" ] }, { "cell_type": "code", "execution_count": 10, "id": "c3b199a82a9d", "metadata": { "execution": { "iopub.execute_input": "2026-04-28T09:10:51.506446Z", "iopub.status.busy": "2026-04-28T09:10:51.506186Z", "iopub.status.idle": "2026-04-28T09:10:51.531753Z", "shell.execute_reply": "2026-04-28T09:10:51.528608Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Full audit — every (knowledge_time, valid_time) pair:\n", "shape: (13, 4)\n", "┌───────────┬─────────────────────────┬─────────────────────────┬───────┐\n", "│ series_id ┆ knowledge_time ┆ valid_time ┆ value │\n", "│ --- ┆ --- ┆ --- ┆ --- │\n", "│ u64 ┆ datetime[μs, UTC] ┆ datetime[μs, UTC] ┆ f64 │\n", "╞═══════════╪═════════════════════════╪═════════════════════════╪═══════╡\n", "│ 1 ┆ 2025-12-31 12:00:00 UTC ┆ 2026-01-01 09:00:00 UTC ┆ 54.5 │\n", "│ 1 ┆ 2025-12-31 18:00:00 UTC ┆ 2026-01-01 09:00:00 UTC ┆ 57.0 │\n", "│ 1 ┆ 2025-12-31 12:00:00 UTC ┆ 2026-01-01 10:00:00 UTC ┆ 55.0 │\n", "│ 1 ┆ 2025-12-31 18:00:00 UTC ┆ 2026-01-01 10:00:00 UTC ┆ 57.5 │\n", "│ 1 ┆ 2026-01-01 00:00:00 UTC ┆ 2026-01-01 10:00:00 UTC ┆ 60.0 │\n", "│ … ┆ … ┆ … ┆ … │\n", "│ 1 ┆ 2025-12-31 12:00:00 UTC ┆ 2026-01-01 12:00:00 UTC ┆ 56.0 │\n", "│ 1 ┆ 2025-12-31 18:00:00 UTC ┆ 2026-01-01 12:00:00 UTC ┆ 58.5 │\n", "│ 1 ┆ 2026-01-01 00:00:00 UTC ┆ 2026-01-01 12:00:00 UTC ┆ 62.0 │\n", "│ 1 ┆ 2025-12-31 12:00:00 UTC ┆ 2026-01-01 13:00:00 UTC ┆ 56.5 │\n", "│ 1 ┆ 2025-12-31 18:00:00 UTC ┆ 2026-01-01 13:00:00 UTC ┆ 59.0 │\n", "└───────────┴─────────────────────────┴─────────────────────────┴───────┘\n" ] } ], "source": [ "history = td.read(series_ids=[SERIES_ID], include_knowledge_time=True).sort([\"valid_time\", \"knowledge_time\"])\n", "audit = history.filter(pl.col(\"valid_time\").is_between(base_vt + timedelta(hours=9), base_vt + timedelta(hours=13)))\n", "print(\"Full audit — every (knowledge_time, valid_time) pair:\")\n", "print(audit)" ] }, { "cell_type": "markdown", "id": "d29807ac63bb", "metadata": {}, "source": [ "## Summary\n", "\n", "| Concept | Description |\n", "|---|---|\n", "| `valid_time` | The timestamp the value describes |\n", "| `knowledge_time` | When the value was learned |\n", "| `td.write(df, retention=, knowledge_time=)` | Append rows; corrections are just new rows with a later `knowledge_time` |\n", "| `td.read(series_ids=)` | Latest value per `valid_time` |\n", "| `td.read(series_ids=, include_knowledge_time=True)` | Every `(knowledge_time, valid_time)` pair — full audit |\n", "\n", "For richer hierarchies (sites, assets, edges, units, runs metadata) use [`energydb`](../../energydb/examples/quickstart.ipynb) on top." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.12" } }, "nbformat": 4, "nbformat_minor": 5 }