{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Data Quality and Coverage\n",
    "\n",
    "Real-world time series often have gaps — sensor outages, missing transmissions, or maintenance windows. TimeDataModel provides built-in tools to visualize coverage and validate data integrity."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-03-04T19:10:57.421180Z",
     "iopub.status.busy": "2026-03-04T19:10:57.420967Z",
     "iopub.status.idle": "2026-03-04T19:10:57.470119Z",
     "shell.execute_reply": "2026-03-04T19:10:57.469706Z"
    }
   },
   "outputs": [],
   "source": [
    "from datetime import datetime, timedelta, timezone\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "import timedatamodel as tdm\n",
    "\n",
    "base = datetime(2024, 1, 15, tzinfo=timezone.utc)\n",
    "week_hours = [base + timedelta(hours=i) for i in range(168)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Coverage bars on a TimeSeriesList\n",
    "\n",
    "Create a week of hourly data with a simulated outage (hours 50-70 missing)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-03-04T19:10:57.471882Z",
     "iopub.status.busy": "2026-03-04T19:10:57.471751Z",
     "iopub.status.idle": "2026-03-04T19:10:57.480704Z",
     "shell.execute_reply": "2026-03-04T19:10:57.480246Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Has missing: True\n",
      "Total points: 168, missing: 20\n"
     ]
    }
   ],
   "source": [
    "rng = np.random.default_rng(42)\n",
    "values_full = (100 + rng.normal(0, 15, 168)).tolist()\n",
    "\n",
    "values_with_gap = [\n",
    "    None if 50 <= i < 70 else v\n",
    "    for i, v in enumerate(values_full)\n",
    "]\n",
    "\n",
    "ts_sensor = tdm.TimeSeriesList(\n",
    "    tdm.Frequency.PT1H,\n",
    "    timestamps=week_hours,\n",
    "    values=values_with_gap,\n",
    "    name=\"sensor_A\",\n",
    "    unit=\"MW\",\n",
    "    data_type=tdm.DataType.OBSERVATION,\n",
    ")\n",
    "\n",
    "print(f\"Has missing: {ts_sensor.has_missing}\")\n",
    "print(f\"Total points: {len(ts_sensor)}, missing: {sum(1 for v in ts_sensor.values if v is None)}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-03-04T19:10:57.481941Z",
     "iopub.status.busy": "2026-03-04T19:10:57.481844Z",
     "iopub.status.idle": "2026-03-04T19:10:57.484924Z",
     "shell.execute_reply": "2026-03-04T19:10:57.484553Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 600 44\" width=\"100%\" style=\"max-width:600px;font-family:monospace;font-size:12px;\">\n",
       "<text x=\"114\" y=\"15\" text-anchor=\"end\" fill=\"#333\">sensor_A</text>\n",
       "<rect x=\"120.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"128.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"136.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"144.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"152.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"160.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"168.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"176.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"184.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"192.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"200.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"208.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"216.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"224.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"232.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"240.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"248.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"256.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"264.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"272.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"280.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"288.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"296.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"304.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"312.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"320.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"328.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"336.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"344.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"352.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"360.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"368.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"376.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"384.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"392.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"400.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"408.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"416.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"424.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"432.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"440.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"448.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"456.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"464.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"472.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"480.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"488.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"496.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"504.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"512.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"520.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"528.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"536.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"544.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"552.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"560.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"568.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"576.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"584.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"592.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<text x=\"120\" y=\"40\" text-anchor=\"start\" fill=\"#666\">2024-01-15 00:00</text>\n",
       "<text x=\"600\" y=\"40\" text-anchor=\"end\" fill=\"#666\">2024-01-21 23:00</text>\n",
       "</svg>"
      ],
      "text/plain": [
       "sensor_A  ██████████████████░░░░░░░███████████████████████████████████\n",
       "          2024-01-15 00:00                            2024-01-21 23:00"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts_sensor.coverage_bar()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Coverage bars on a TimeSeriesTable\n",
    "\n",
    "With multiple columns, each gets its own coverage row — making it easy to spot which signals have gaps."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-03-04T19:10:57.486126Z",
     "iopub.status.busy": "2026-03-04T19:10:57.486048Z",
     "iopub.status.idle": "2026-03-04T19:10:57.489416Z",
     "shell.execute_reply": "2026-03-04T19:10:57.489070Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 600 88\" width=\"100%\" style=\"max-width:600px;font-family:monospace;font-size:12px;\">\n",
       "<text x=\"114\" y=\"15\" text-anchor=\"end\" fill=\"#333\">sensor_A</text>\n",
       "<rect x=\"120.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"128.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"136.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"144.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"152.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"160.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"168.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"176.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"184.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"192.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"200.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"208.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"216.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"224.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"232.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"240.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"248.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"256.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"264.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"272.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"280.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"288.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"296.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"304.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"312.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"320.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"328.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"336.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"344.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"352.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"360.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"368.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"376.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"384.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"392.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"400.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"408.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"416.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"424.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"432.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"440.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"448.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"456.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"464.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"472.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"480.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"488.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"496.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"504.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"512.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"520.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"528.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"536.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"544.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"552.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"560.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"568.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"576.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"584.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"592.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<text x=\"114\" y=\"37\" text-anchor=\"end\" fill=\"#333\">sensor_B</text>\n",
       "<rect x=\"120.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"128.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"136.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"144.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"152.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"160.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"168.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"176.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"184.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"192.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"200.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"208.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"216.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"224.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"232.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"240.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"248.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"256.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"264.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"272.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"280.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"288.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"296.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"304.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"312.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"320.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"328.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"336.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"344.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"352.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"360.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"368.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"376.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"384.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"392.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"400.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"408.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"416.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"424.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"432.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"440.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"448.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"456.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"464.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"472.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"480.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"488.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"496.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"504.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"512.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"520.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"528.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"536.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"544.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"552.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"560.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"568.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"576.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"584.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"592.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<text x=\"114\" y=\"59\" text-anchor=\"end\" fill=\"#333\">sensor_C</text>\n",
       "<rect x=\"120.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"128.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"136.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"144.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"152.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"160.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"168.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"176.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"184.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"192.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"200.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"208.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"216.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"224.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"232.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"240.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"248.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"256.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"264.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"272.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"280.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"288.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"296.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"304.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"312.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"320.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"328.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"336.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"344.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"352.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"360.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"368.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"376.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"384.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"392.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"400.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"408.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"416.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"424.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"432.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"440.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"448.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"456.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"464.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"472.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"480.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"488.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"496.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"504.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"512.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"520.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"528.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"536.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"544.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"552.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"560.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"568.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"576.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"584.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"592.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<text x=\"120\" y=\"84\" text-anchor=\"start\" fill=\"#666\">2024-01-15 00:00</text>\n",
       "<text x=\"600\" y=\"84\" text-anchor=\"end\" fill=\"#666\">2024-01-21 23:00</text>\n",
       "</svg>"
      ],
      "text/plain": [
       "sensor_A  ██████████████████░░░░░░░███████████████████████████████████\n",
       "sensor_B  ████████████████████████████████████░░░░░░░░░░██████████████\n",
       "sensor_C  ████████░░░███████████████████████████████████████░░░░░█████\n",
       "          2024-01-15 00:00                            2024-01-21 23:00"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sensor_a = values_with_gap\n",
    "sensor_b = [\n",
    "    None if 100 <= i < 130 else v\n",
    "    for i, v in enumerate(values_full)\n",
    "]\n",
    "sensor_c = [\n",
    "    None if (20 <= i < 30 or 140 <= i < 155) else v\n",
    "    for i, v in enumerate(values_full)\n",
    "]\n",
    "\n",
    "vals = np.column_stack([\n",
    "    [v if v is not None else np.nan for v in sensor_a],\n",
    "    [v if v is not None else np.nan for v in sensor_b],\n",
    "    [v if v is not None else np.nan for v in sensor_c],\n",
    "])\n",
    "\n",
    "table = tdm.TimeSeriesTable(\n",
    "    tdm.Frequency.PT1H,\n",
    "    timestamps=week_hours,\n",
    "    values=vals,\n",
    "    names=[\"sensor_A\", \"sensor_B\", \"sensor_C\"],\n",
    "    units=[\"MW\", \"MW\", \"MW\"],\n",
    ")\n",
    "table.coverage_bar()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Coverage bars on a TimeSeriesArray\n",
    "\n",
    "Arrays show one bar per label in the non-time dimension."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-03-04T19:10:57.490469Z",
     "iopub.status.busy": "2026-03-04T19:10:57.490408Z",
     "iopub.status.idle": "2026-03-04T19:10:57.496122Z",
     "shell.execute_reply": "2026-03-04T19:10:57.495832Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 600 88\" width=\"100%\" style=\"max-width:600px;font-family:monospace;font-size:12px;\">\n",
       "<text x=\"114\" y=\"15\" text-anchor=\"end\" fill=\"#333\">A</text>\n",
       "<rect x=\"120.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"128.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"136.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"144.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"152.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"160.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"168.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"176.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"184.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"192.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"200.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"208.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"216.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"224.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"232.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"240.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"248.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"256.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"264.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"272.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"280.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"288.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"296.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"304.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"312.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"320.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"328.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"336.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"344.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"352.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"360.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"368.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"376.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"384.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"392.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"400.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"408.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"416.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"424.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"432.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"440.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"448.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"456.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"464.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"472.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"480.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"488.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"496.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"504.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"512.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"520.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"528.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"536.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"544.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"552.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"560.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"568.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"576.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"584.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"592.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<text x=\"114\" y=\"37\" text-anchor=\"end\" fill=\"#333\">B</text>\n",
       "<rect x=\"120.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"128.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"136.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"144.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"152.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"160.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"168.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"176.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"184.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"192.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"200.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"208.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"216.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"224.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"232.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"240.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"248.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"256.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"264.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"272.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"280.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"288.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"296.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"304.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"312.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"320.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"328.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"336.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"344.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"352.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"360.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"368.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"376.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"384.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"392.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"400.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"408.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"416.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"424.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"432.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"440.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"448.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"456.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"464.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"472.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"480.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"488.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"496.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"504.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"512.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"520.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"528.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"536.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"544.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"552.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"560.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"568.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"576.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"584.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"592.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<text x=\"114\" y=\"59\" text-anchor=\"end\" fill=\"#333\">C</text>\n",
       "<rect x=\"120.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"128.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"136.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"144.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"152.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"160.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"168.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"176.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"184.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"192.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"200.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"208.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"216.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"224.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"232.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"240.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"248.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"256.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"264.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"272.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"280.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"288.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"296.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"304.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"312.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"320.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"328.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"336.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"344.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"352.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"360.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"368.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"376.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"384.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"392.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"400.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"408.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"416.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"424.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"432.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"440.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"448.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"456.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"464.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"472.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"480.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"488.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"496.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"504.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"512.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"520.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"528.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"536.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"544.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"552.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"560.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"568.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"576.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"584.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"592.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<text x=\"120\" y=\"84\" text-anchor=\"start\" fill=\"#666\">2024-01-15 00:00</text>\n",
       "<text x=\"600\" y=\"84\" text-anchor=\"end\" fill=\"#666\">2024-01-21 23:00</text>\n",
       "</svg>"
      ],
      "text/plain": [
       "A  ██████████████████░░░░░░░███████████████████████████████████\n",
       "B  ████████████████████████████████████░░░░░░░░░░██████████████\n",
       "C  ████████░░░███████████████████████████████████████░░░░░█████\n",
       "   2024-01-15 00:00                            2024-01-21 23:00"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cube_data = np.array([\n",
    "    [v if v is not None else np.nan for v in sensor_a],\n",
    "    [v if v is not None else np.nan for v in sensor_b],\n",
    "    [v if v is not None else np.nan for v in sensor_c],\n",
    "])\n",
    "\n",
    "cube = tdm.TimeSeriesArray(\n",
    "    tdm.Frequency.PT1H,\n",
    "    dimensions=[\n",
    "        tdm.Dimension(\"sensor\", [\"A\", \"B\", \"C\"]),\n",
    "        tdm.Dimension(\"valid_time\", week_hours),\n",
    "    ],\n",
    "    values=cube_data,\n",
    "    name=\"sensor_grid\",\n",
    "    unit=\"MW\",\n",
    ")\n",
    "cube.coverage_bar()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Coverage bars on a TimeSeriesCollection\n",
    "\n",
    "Collections map all series onto a shared global time range, so you can compare coverage across heterogeneous data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-03-04T19:10:57.497072Z",
     "iopub.status.busy": "2026-03-04T19:10:57.497017Z",
     "iopub.status.idle": "2026-03-04T19:10:57.499246Z",
     "shell.execute_reply": "2026-03-04T19:10:57.498902Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 600 66\" width=\"100%\" style=\"max-width:600px;font-family:monospace;font-size:12px;\">\n",
       "<text x=\"114\" y=\"15\" text-anchor=\"end\" fill=\"#333\">sensor_A</text>\n",
       "<rect x=\"120.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"128.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"136.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"144.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"152.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"160.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"168.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"176.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"184.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"192.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"200.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"208.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"216.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"224.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"232.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"240.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"248.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"256.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"264.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"272.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"280.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"288.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"296.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"304.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"312.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"320.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"328.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"336.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"344.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"352.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"360.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"368.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"376.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"384.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"392.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"400.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"408.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"416.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"424.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"432.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"440.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"448.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"456.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"464.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"472.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"480.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"488.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"496.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"504.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"512.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"520.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"528.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"536.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"544.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"552.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"560.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"568.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"576.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"584.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"592.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<text x=\"114\" y=\"37\" text-anchor=\"end\" fill=\"#333\">short_range</text>\n",
       "<rect x=\"120.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"128.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"136.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"144.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"152.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"160.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"168.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"176.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"184.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"192.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"200.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"208.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"216.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"224.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"232.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"240.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"248.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"256.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"264.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"272.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"280.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"288.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"296.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"304.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"312.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"320.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"328.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"336.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"344.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"352.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"360.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"368.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"376.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"384.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"392.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"400.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"408.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"416.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"424.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"432.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"440.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"448.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"456.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"464.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"472.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"480.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"488.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"496.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"504.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"512.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"520.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"528.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"536.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"544.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"552.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"560.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"568.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"576.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"584.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"592.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<text x=\"120\" y=\"62\" text-anchor=\"start\" fill=\"#666\">2024-01-15 00:00</text>\n",
       "<text x=\"600\" y=\"62\" text-anchor=\"end\" fill=\"#666\">2024-01-21 23:00</text>\n",
       "</svg>"
      ],
      "text/plain": [
       "sensor_A     ██████████████████░░░░░░░███████████████████████████████████\n",
       "short_range  ██████████████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░\n",
       "             2024-01-15 00:00                            2024-01-21 23:00"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts_short = tdm.TimeSeriesList(\n",
    "    tdm.Frequency.PT1H,\n",
    "    timestamps=week_hours[:72],\n",
    "    values=values_full[:72],\n",
    "    name=\"short_range\",\n",
    "    unit=\"MW\",\n",
    ")\n",
    "\n",
    "collection = tdm.TimeSeriesCollection(\n",
    "    [ts_sensor, ts_short],\n",
    "    name=\"Sensor comparison\",\n",
    ")\n",
    "collection.coverage_bar()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Validation\n",
    "\n",
    "`validate()` checks that timestamps are strictly increasing and that the step between consecutive timestamps matches the declared frequency. It returns a list of warning strings — empty means everything is fine."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-03-04T19:10:57.500195Z",
     "iopub.status.busy": "2026-03-04T19:10:57.500135Z",
     "iopub.status.idle": "2026-03-04T19:10:57.501720Z",
     "shell.execute_reply": "2026-03-04T19:10:57.501441Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Warnings for ts_sensor: []\n"
     ]
    }
   ],
   "source": [
    "warnings = ts_sensor.validate()\n",
    "print(f\"Warnings for ts_sensor: {warnings}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Catching problems\n",
    "\n",
    "Let's create a series with intentionally bad timestamps to trigger validation warnings."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-03-04T19:10:57.502627Z",
     "iopub.status.busy": "2026-03-04T19:10:57.502565Z",
     "iopub.status.idle": "2026-03-04T19:10:57.504451Z",
     "shell.execute_reply": "2026-03-04T19:10:57.504211Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  WARNING: timestamps not strictly increasing at index 2: 2024-01-15 01:00:00+00:00 >= 2024-01-15 01:00:00+00:00\n",
      "  WARNING: inconsistent frequency at index 2: expected 1:00:00, got 0:00:00\n"
     ]
    }
   ],
   "source": [
    "bad_timestamps = [\n",
    "    datetime(2024, 1, 15, 0, tzinfo=timezone.utc),\n",
    "    datetime(2024, 1, 15, 1, tzinfo=timezone.utc),\n",
    "    datetime(2024, 1, 15, 1, tzinfo=timezone.utc),  # duplicate!\n",
    "    datetime(2024, 1, 15, 4, tzinfo=timezone.utc),  # gap: skipped hours 2-3\n",
    "    datetime(2024, 1, 15, 5, tzinfo=timezone.utc),\n",
    "]\n",
    "\n",
    "ts_bad = tdm.TimeSeriesList(\n",
    "    tdm.Frequency.PT1H,\n",
    "    timestamps=bad_timestamps,\n",
    "    values=[10.0, 20.0, 30.0, 40.0, 50.0],\n",
    "    name=\"bad_data\",\n",
    ")\n",
    "\n",
    "for w in ts_bad.validate():\n",
    "    print(f\"  WARNING: {w}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Practical example: multi-sensor data feed audit\n",
    "\n",
    "Imagine you receive data from 5 sensors. Quickly assess which ones are reliable."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-03-04T19:10:57.505526Z",
     "iopub.status.busy": "2026-03-04T19:10:57.505453Z",
     "iopub.status.idle": "2026-03-04T19:10:57.508231Z",
     "shell.execute_reply": "2026-03-04T19:10:57.507919Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 600 132\" width=\"100%\" style=\"max-width:600px;font-family:monospace;font-size:12px;\">\n",
       "<text x=\"114\" y=\"15\" text-anchor=\"end\" fill=\"#333\">turbine_1</text>\n",
       "<rect x=\"120.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"128.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"136.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"144.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"152.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"160.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"168.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"176.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"184.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"192.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"200.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"208.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"216.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"224.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"232.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"240.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"248.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"256.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"264.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"272.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"280.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"288.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"296.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"304.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"312.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"320.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"328.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"336.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"344.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"352.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"360.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"368.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"376.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"384.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"392.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"400.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"408.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"416.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"424.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"432.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"440.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"448.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"456.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"464.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"472.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"480.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"488.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"496.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"504.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"512.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"520.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"528.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"536.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"544.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"552.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"560.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"568.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"576.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"584.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"592.0\" y=\"2\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<text x=\"114\" y=\"37\" text-anchor=\"end\" fill=\"#333\">turbine_2</text>\n",
       "<rect x=\"120.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"128.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"136.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"144.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"152.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"160.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"168.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"176.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"184.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"192.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"200.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"208.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"216.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"224.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"232.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"240.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"248.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"256.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"264.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"272.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"280.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"288.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"296.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"304.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"312.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"320.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"328.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"336.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"344.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"352.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"360.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"368.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"376.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"384.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"392.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"400.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"408.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"416.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"424.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"432.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"440.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"448.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"456.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"464.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"472.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"480.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"488.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"496.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"504.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"512.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"520.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"528.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"536.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"544.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"552.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"560.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"568.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"576.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"584.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"592.0\" y=\"24\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<text x=\"114\" y=\"59\" text-anchor=\"end\" fill=\"#333\">turbine_3</text>\n",
       "<rect x=\"120.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"128.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"136.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"144.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"152.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"160.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"168.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"176.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"184.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"192.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"200.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"208.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"216.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"224.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"232.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"240.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"248.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"256.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"264.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"272.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"280.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"288.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"296.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"304.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"312.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"320.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"328.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"336.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"344.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"352.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"360.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"368.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"376.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"384.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"392.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"400.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"408.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"416.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"424.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"432.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"440.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"448.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"456.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"464.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"472.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"480.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"488.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"496.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"504.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"512.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"520.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"528.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"536.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"544.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"552.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"560.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"568.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"576.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"584.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"592.0\" y=\"46\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<text x=\"114\" y=\"81\" text-anchor=\"end\" fill=\"#333\">turbine_4</text>\n",
       "<rect x=\"120.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"128.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"136.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"144.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"152.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"160.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"168.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"176.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"184.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"192.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"200.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"208.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"216.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"224.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"232.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"240.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"248.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"256.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"264.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"272.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"280.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"288.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"296.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"304.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"312.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"320.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"328.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"336.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"344.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"352.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"360.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"368.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"376.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"384.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"392.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"400.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"408.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"416.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"424.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"432.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"440.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"448.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"456.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"464.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"472.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"480.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"488.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"496.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"504.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"512.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"520.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"528.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"536.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"544.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"552.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"560.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"568.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"576.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"584.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"592.0\" y=\"68\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<text x=\"114\" y=\"103\" text-anchor=\"end\" fill=\"#333\">turbine_5</text>\n",
       "<rect x=\"120.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"128.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"136.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"144.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"152.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"160.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"168.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"176.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"184.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"192.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"200.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"208.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"216.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"224.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"232.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"240.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"248.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"256.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"264.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"272.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"280.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"288.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"296.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"304.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"312.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"320.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"328.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"336.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"344.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"352.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"360.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"368.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"376.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"384.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"392.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"400.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"408.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"416.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"424.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"432.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"440.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"448.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"456.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"464.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"472.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"480.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"488.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"496.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"504.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"512.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"520.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"528.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"536.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"544.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"552.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"560.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"568.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#e0e0e0\" />\n",
       "<rect x=\"576.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"584.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<rect x=\"592.0\" y=\"90\" width=\"8.00\" height=\"18\" fill=\"#4CAF50\" />\n",
       "<text x=\"120\" y=\"128\" text-anchor=\"start\" fill=\"#666\">2024-01-15 00:00</text>\n",
       "<text x=\"600\" y=\"128\" text-anchor=\"end\" fill=\"#666\">2024-01-21 23:00</text>\n",
       "</svg>"
      ],
      "text/plain": [
       "turbine_1  ████████████████████████████████████████████████████████████\n",
       "turbine_2  ███████████░░░░░████████████████████████████████████████████\n",
       "turbine_3  ████░░░██████████████████████░░░░░░█████████████████████████\n",
       "turbine_4  ░░░░░░░░░░░░░░░░░███████████████████████████████████████████\n",
       "turbine_5  ██████████████████████░████████████████████░░░████████░░░███\n",
       "           2024-01-15 00:00                            2024-01-21 23:00"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gap_ranges = {\n",
    "    \"turbine_1\": [],\n",
    "    \"turbine_2\": [(30, 45)],\n",
    "    \"turbine_3\": [(10, 20), (80, 100)],\n",
    "    \"turbine_4\": [(0, 50)],\n",
    "    \"turbine_5\": [(60, 65), (120, 130), (150, 160)],\n",
    "}\n",
    "\n",
    "sensors = []\n",
    "for name, gaps in gap_ranges.items():\n",
    "    vals = values_full.copy()\n",
    "    for start, end in gaps:\n",
    "        for i in range(start, end):\n",
    "            vals[i] = None\n",
    "    sensors.append(\n",
    "        tdm.TimeSeriesList(\n",
    "            tdm.Frequency.PT1H,\n",
    "            timestamps=week_hours,\n",
    "            values=vals,\n",
    "            name=name,\n",
    "            unit=\"MW\",\n",
    "        )\n",
    "    )\n",
    "\n",
    "audit = tdm.TimeSeriesCollection(sensors, name=\"Turbine fleet audit\")\n",
    "audit.coverage_bar()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Summary\n",
    "\n",
    "- `coverage_bar()` is available on `TimeSeriesList`, `TimeSeriesTable`, `TimeSeriesArray`, and `TimeSeriesCollection`\n",
    "- It renders as a color-coded SVG in notebooks and Unicode blocks in terminals\n",
    "- `validate()` catches non-monotonic timestamps and frequency inconsistencies\n",
    "- `has_missing` is a quick boolean check for any gaps\n",
    "\n",
    "Next up: **nb_08** demonstrates I/O and interoperability with pandas, numpy, polars, JSON, and CSV."
   ]
  }
 ],
 "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.14.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
